Bug 834414 - Stop holding on to a content resolver in Tab, which leaks the Activity instance it is associated with. r=bnicholson

This commit is contained in:
Kartikaya Gupta 2013-01-25 13:51:41 -05:00
parent bfdb4ce5ac
commit 54e8f992da
2 changed files with 33 additions and 17 deletions

View File

@ -12,7 +12,6 @@ import org.json.JSONException;
import org.json.JSONObject;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
@ -54,8 +53,6 @@ public class Tab {
private ZoomConstraints mZoomConstraints;
private ArrayList<View> mPluginViews;
private HashMap<Object, Layer> mPluginLayers;
private ContentResolver mContentResolver;
private ContentObserver mContentObserver;
private int mBackgroundColor = Color.WHITE;
private int mState;
private Bitmap mThumbnailBitmap;
@ -92,17 +89,13 @@ public class Tab {
mPluginViews = new ArrayList<View>();
mPluginLayers = new HashMap<Object, Layer>();
mState = GeckoApp.shouldShowProgress(url) ? STATE_SUCCESS : STATE_LOADING;
mContentResolver = Tabs.getInstance().getContentResolver();
mContentObserver = new ContentObserver(null) {
public void onChange(boolean selfChange) {
updateBookmark();
}
};
BrowserDB.registerBookmarkObserver(mContentResolver, mContentObserver);
}
private ContentResolver getContentResolver() {
return Tabs.getInstance().getContentResolver();
}
public void onDestroy() {
BrowserDB.unregisterContentObserver(mContentResolver, mContentObserver);
Tabs.getInstance().notifyListeners(this, Tabs.TabEvents.CLOSED);
}
@ -346,7 +339,7 @@ public class Tab {
Tabs.getInstance().notifyListeners(this, Tabs.TabEvents.MENU_UPDATED);
}
private void updateBookmark() {
void updateBookmark() {
GeckoAppShell.getHandler().post(new Runnable() {
public void run() {
final String url = getURL();
@ -354,8 +347,8 @@ public class Tab {
return;
if (url.equals(getURL())) {
mBookmark = BrowserDB.isBookmark(mContentResolver, url);
mReadingListItem = BrowserDB.isReadingListItem(mContentResolver, url);
mBookmark = BrowserDB.isBookmark(getContentResolver(), url);
mReadingListItem = BrowserDB.isReadingListItem(getContentResolver(), url);
}
Tabs.getInstance().notifyListeners(Tab.this, Tabs.TabEvents.MENU_UPDATED);
@ -370,7 +363,7 @@ public class Tab {
if (url == null)
return;
BrowserDB.addBookmark(mContentResolver, mTitle, url);
BrowserDB.addBookmark(getContentResolver(), mTitle, url);
}
});
}
@ -382,7 +375,7 @@ public class Tab {
if (url == null)
return;
BrowserDB.removeBookmarksWithURL(mContentResolver, url);
BrowserDB.removeBookmarksWithURL(getContentResolver(), url);
}
});
}
@ -516,7 +509,7 @@ public class Tab {
if (url == null)
return;
BrowserDB.updateThumbnailForUrl(mContentResolver, url, mThumbnail);
BrowserDB.updateThumbnailForUrl(getContentResolver(), url, mThumbnail);
} catch (Exception e) {
// ignore
}

View File

@ -16,6 +16,7 @@ import android.accounts.AccountManager;
import android.accounts.OnAccountsUpdateListener;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.ContentObserver;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;
@ -55,6 +56,7 @@ public class Tabs implements GeckoEventListener {
private static AtomicInteger sTabId = new AtomicInteger(0);
private GeckoApp mActivity;
private ContentObserver mContentObserver;
private Tabs() {
registerEventListener("SessionHistory:New");
@ -82,6 +84,9 @@ public class Tabs implements GeckoEventListener {
persistAllTabs();
}
}, GeckoAppShell.getHandler(), false);
if (mContentObserver != null) {
BrowserDB.registerBookmarkObserver(getContentResolver(), mContentObserver);
}
}
public void detachFromActivity(GeckoApp activity) {
@ -89,13 +94,31 @@ public class Tabs implements GeckoEventListener {
mAccountManager.removeOnAccountsUpdatedListener(mAccountListener);
mAccountListener = null;
}
if (mContentObserver != null) {
BrowserDB.unregisterContentObserver(getContentResolver(), mContentObserver);
}
}
public int getCount() {
return mTabs.size();
}
private void lazyRegisterBookmarkObserver() {
if (mContentObserver == null) {
mContentObserver = new ContentObserver(null) {
public void onChange(boolean selfChange) {
for (Tab tab : mTabs.values()) {
tab.updateBookmark();
}
}
};
BrowserDB.registerBookmarkObserver(getContentResolver(), mContentObserver);
}
}
private Tab addTab(int id, String url, boolean external, int parentId, String title, boolean isPrivate) {
lazyRegisterBookmarkObserver();
final Tab tab = isPrivate ? new PrivateTab(id, url, external, parentId, title) :
new Tab(id, url, external, parentId, title);
mTabs.put(id, tab);