Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a85c583 authored by Adam Cohen's avatar Adam Cohen
Browse files

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
parent 6d467e27
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -1134,7 +1134,9 @@ public class Launcher extends Activity
    @Override
    public Object onRetainNonConfigurationInstance() {
        // Flag the loader to stop early before switching
        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());

        // 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();
+4 −0
Original line number Diff line number Diff line
@@ -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);
    }