summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Cohen <adamcohen@google.com>2014-09-30 09:48:49 -0700
committerAdam Cohen <adamcohen@google.com>2014-09-30 10:23:18 -0700
commit1a85c5839c91942b3c7dd0da5992db4d98defdc3 (patch)
treeefee77c775675a0990933f569aaa8a876d3828d3
parent6d467e27b7e16442d3fb56af2aa3d94e657dff25 (diff)
downloadandroid_packages_apps_Trebuchet-1a85c5839c91942b3c7dd0da5992db4d98defdc3.tar.gz
android_packages_apps_Trebuchet-1a85c5839c91942b3c7dd0da5992db4d98defdc3.tar.bz2
android_packages_apps_Trebuchet-1a85c5839c91942b3c7dd0da5992db4d98defdc3.zip
Don't let old Launcher activity interfere with new one
-> Launcher uses a static instance of it's loader (across multiple activities) since activities can come and go (configuration change, eg.) but the data model and loading is static. -> Currently, this is not robust to a sequence of events that looks like onCreate(instance A), onCreate(instance B), onDestroy(instance B) -- depending on the timing of those calls. -> This CL addresses a symptom of the above scenario by not allowing an older Launcher Activity cancel the loader / clear the callbacks for a newer Activity. Bug 17679693 Change-Id: I8ece93e288464b0d578b9669c165b67132d997ed
-rw-r--r--src/com/android/launcher3/Launcher.java13
-rw-r--r--src/com/android/launcher3/LauncherModel.java4
2 files changed, 14 insertions, 3 deletions
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 37a7f5cc8..678081286 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -1134,7 +1134,9 @@ public class Launcher extends Activity
@Override
public Object onRetainNonConfigurationInstance() {
// Flag the loader to stop early before switching
- mModel.stopLoader();
+ if (mModel.isCurrentCallbacks(this)) {
+ mModel.stopLoader();
+ }
if (mAppsCustomizeContent != null) {
mAppsCustomizeContent.surrender();
}
@@ -1997,8 +1999,13 @@ public class Launcher extends Activity
// Stop callbacks from LauncherModel
LauncherAppState app = (LauncherAppState.getInstance());
- mModel.stopLoader();
- app.setLauncher(null);
+
+ // It's possible to receive onDestroy after a new Launcher activity has
+ // been created. In this case, don't interfere with the new Launcher.
+ if (mModel.isCurrentCallbacks(this)) {
+ mModel.stopLoader();
+ app.setLauncher(null);
+ }
try {
mAppWidgetHost.stopListening();
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index dd948916b..60eb15f9c 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -1385,6 +1385,10 @@ public class LauncherModel extends BroadcastReceiver
return isLaunching;
}
+ public boolean isCurrentCallbacks(Callbacks callbacks) {
+ return (mCallbacks != null && mCallbacks.get() == callbacks);
+ }
+
public void startLoader(boolean isLaunching, int synchronousBindPage) {
startLoader(isLaunching, synchronousBindPage, LOADER_FLAG_NONE);
}