diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2016-05-17 13:38:54 -0700 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2016-05-17 14:42:10 -0700 |
commit | aaf7d1d13bd88bdeac5c56a9ab1d293fdaea3c11 (patch) | |
tree | 3bff1ac0313c3c17a936340206b2dfc8a3cf0b91 | |
parent | 5b83d6ce8f7391aab67b7c53d972380fe0762ced (diff) | |
download | android_packages_apps_Trebuchet-aaf7d1d13bd88bdeac5c56a9ab1d293fdaea3c11.tar.gz android_packages_apps_Trebuchet-aaf7d1d13bd88bdeac5c56a9ab1d293fdaea3c11.tar.bz2 android_packages_apps_Trebuchet-aaf7d1d13bd88bdeac5c56a9ab1d293fdaea3c11.zip |
instead of unbinding items from the loader, unregistering listeners
in activity.onDestroy()
Bug: 28740269
Change-Id: I6bf2ad6aca43970fd10cfbcc113e609c227e07bf
-rw-r--r-- | src/com/android/launcher3/FolderInfo.java | 12 | ||||
-rw-r--r-- | src/com/android/launcher3/ItemInfo.java | 9 | ||||
-rw-r--r-- | src/com/android/launcher3/Launcher.java | 4 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherModel.java | 45 | ||||
-rw-r--r-- | src/com/android/launcher3/Workspace.java | 15 | ||||
-rw-r--r-- | src/com/android/launcher3/folder/FolderIcon.java | 5 |
6 files changed, 31 insertions, 59 deletions
diff --git a/src/com/android/launcher3/FolderInfo.java b/src/com/android/launcher3/FolderInfo.java index 6c9d969a3..9a9985211 100644 --- a/src/com/android/launcher3/FolderInfo.java +++ b/src/com/android/launcher3/FolderInfo.java @@ -109,10 +109,8 @@ public class FolderInfo extends ItemInfo { listeners.add(listener); } - void removeListener(FolderListener listener) { - if (listeners.contains(listener)) { - listeners.remove(listener); - } + public void removeListener(FolderListener listener) { + listeners.remove(listener); } public void itemsChanged(boolean animate) { @@ -121,12 +119,6 @@ public class FolderInfo extends ItemInfo { } } - @Override - void unbind() { - super.unbind(); - listeners.clear(); - } - public interface FolderListener { public void onAdd(ShortcutInfo item); public void onRemove(ShortcutInfo item); diff --git a/src/com/android/launcher3/ItemInfo.java b/src/com/android/launcher3/ItemInfo.java index 1ba09e1eb..286a7f104 100644 --- a/src/com/android/launcher3/ItemInfo.java +++ b/src/com/android/launcher3/ItemInfo.java @@ -183,15 +183,6 @@ public class ItemInfo { } } - /** - * It is very important that sub-classes implement this if they contain any references - * to the activity (anything in the view hierarchy etc.). If not, leaks can result since - * ItemInfo objects persist across rotation and can hence leak by holding stale references - * to the old view hierarchy / activity. - */ - void unbind() { - } - @Override public String toString() { return "Item(id=" + this.id + " type=" + this.itemType + " container=" + this.container diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3ce07e3ea..0a8e1e65f 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1967,6 +1967,7 @@ public class Launcher extends Activity mHandler.removeMessages(ADVANCE_MSG); mHandler.removeMessages(0); mWorkspace.removeCallbacks(mBuildLayersRunnable); + mWorkspace.removeFolderListeners(); // Stop callbacks from LauncherModel // It's possible to receive onDestroy after a new Launcher activity has @@ -2365,6 +2366,9 @@ public class Launcher extends Activity } } else if (itemInfo instanceof FolderInfo) { final FolderInfo folderInfo = (FolderInfo) itemInfo; + if (v instanceof FolderIcon) { + ((FolderIcon) v).removeListeners(); + } mWorkspace.removeWorkspaceItem(v); if (deleteFromDb) { LauncherModel.deleteFolderAndContentsFromDatabase(this, folderInfo); diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index eaeb1acae..3d31b4eb2 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -65,6 +65,7 @@ import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.LongArrayMap; import com.android.launcher3.util.ManagedProfileHeuristic; import com.android.launcher3.util.PackageManagerHelper; +import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.StringFilter; import com.android.launcher3.util.Thunk; import com.android.launcher3.util.ViewOnDrawExecutor; @@ -578,38 +579,6 @@ public class LauncherModel extends BroadcastReceiver runOnWorkerThread(r); } - private void unbindItemInfosAndClearQueuedBindRunnables() { - if (sWorkerThread.getThreadId() == Process.myTid()) { - throw new RuntimeException("Expected unbindLauncherItemInfos() to be called from the " + - "main thread"); - } - - // Remove any queued UI runnables - mHandler.cancelAll(); - // Unbind all the workspace items - unbindWorkspaceItemsOnMainThread(); - } - - /** Unbinds all the sBgWorkspaceItems and sBgAppWidgets on the main thread */ - void unbindWorkspaceItemsOnMainThread() { - // Ensure that we don't use the same workspace items data structure on the main thread - // by making a copy of workspace items first. - final ArrayList<ItemInfo> tmpItems = new ArrayList<ItemInfo>(); - synchronized (sBgLock) { - tmpItems.addAll(sBgWorkspaceItems); - tmpItems.addAll(sBgAppWidgets); - } - Runnable r = new Runnable() { - @Override - public void run() { - for (ItemInfo item : tmpItems) { - item.unbind(); - } - } - }; - runOnMainThread(r); - } - /** * Adds an item to the DB if it was not created previously, or move it to a new * <container, screen, cellX, cellY> @@ -1137,10 +1106,10 @@ public class LauncherModel extends BroadcastReceiver */ public void initialize(Callbacks callbacks) { synchronized (mLock) { - // Disconnect any of the callbacks and drawables associated with ItemInfos on the - // workspace to prevent leaking Launcher activities on orientation change. - unbindItemInfosAndClearQueuedBindRunnables(); - mCallbacks = new WeakReference<Callbacks>(callbacks); + Preconditions.assertUIThread(); + // Remove any queued UI runnables + mHandler.cancelAll(); + mCallbacks = new WeakReference<>(callbacks); } } @@ -2482,10 +2451,6 @@ public class LauncherModel extends BroadcastReceiver final long currentScreenId = currentScreen < 0 ? INVALID_SCREEN_ID : orderedScreenIds.get(currentScreen); - // Load all the items that are on the current page first (and in the process, unbind - // all the existing workspace items before we call startBinding() below. - unbindWorkspaceItemsOnMainThread(); - // Separate the items that are on the current screen, and all the other remaining items ArrayList<ItemInfo> currentWorkspaceItems = new ArrayList<>(); ArrayList<ItemInfo> otherWorkspaceItems = new ArrayList<>(); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index e1f0faf5c..616c3560e 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -3669,6 +3669,21 @@ public class Workspace extends PagedView } } + /** + * Removes all folder listeners + */ + public void removeFolderListeners() { + mapOverItems(false, new ItemOperator() { + @Override + public boolean evaluate(ItemInfo info, View view) { + if (view instanceof FolderIcon) { + ((FolderIcon) view).removeListeners(); + } + return false; + } + }); + } + @Override public void deferCompleteDropAfterUninstallActivity() { mDeferDropAfterUninstall = true; diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 1e4eb7f27..157a97096 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -1000,6 +1000,11 @@ public class FolderIcon extends FrameLayout implements FolderListener { mLongPressHelper.cancelLongPress(); } + public void removeListeners() { + mInfo.removeListener(this); + mInfo.removeListener(mFolder); + } + public interface PreviewLayoutRule { public PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems, PreviewItemDrawingParams params); |