diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 96934e82e9..b361ab5c15 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -195,6 +195,7 @@ public final class Launcher extends Activity private boolean mPaused = true; private boolean mRestoring; private boolean mWaitingForResult; + private boolean mOnResumeNeedsLoad; private Bundle mSavedInstanceState; @@ -585,19 +586,19 @@ public final class Launcher extends Activity @Override protected void onResume() { super.onResume(); - mPaused = false; - - if (mRestoring) { + if (mRestoring || mOnResumeNeedsLoad) { mWorkspaceLoading = true; mModel.startLoader(this, true); mRestoring = false; + mOnResumeNeedsLoad = false; } } @Override protected void onPause() { super.onPause(); + mPaused = true; dismissPreview(mPreviousView); dismissPreview(mNextView); mDragController.cancelDrag(); @@ -2126,6 +2127,30 @@ public final class Launcher extends Activity } } + /** + * If the activity is currently paused, signal that we need to re-run the loader + * in onResume. + * + * This needs to be called from incoming places where resources might have been loaded + * while we are paused. That is becaues the Configuration might be wrong + * when we're not running, and if it comes back to what it was when we + * were paused, we are not restarted. + * + * Implementation of the method from LauncherModel.Callbacks. + * + * @return true if we are currently paused. The caller might be able to + * skip some work in that case since we will come back again. + */ + public boolean setLoadOnResume() { + if (mPaused) { + Log.i(TAG, "setLoadOnResume"); + mOnResumeNeedsLoad = true; + return true; + } else { + return false; + } + } + /** * Implementation of the method from LauncherModel.Callbacks. */ @@ -2170,6 +2195,8 @@ public final class Launcher extends Activity */ public void bindItems(ArrayList shortcuts, int start, int end) { + setLoadOnResume(); + final Workspace workspace = mWorkspace; for (int i=start; i folders) { + setLoadOnResume(); sFolders.clear(); sFolders.putAll(folders); } @@ -2217,6 +2245,8 @@ public final class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ public void bindAppWidget(LauncherAppWidgetInfo item) { + setLoadOnResume(); + final long start = DEBUG_WIDGETS ? SystemClock.uptimeMillis() : 0; if (DEBUG_WIDGETS) { Log.d(TAG, "bindAppWidget: " + item); @@ -2253,6 +2283,8 @@ public final class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ public void finishBindingItems() { + setLoadOnResume(); + if (mSavedState != null) { if (!mWorkspace.hasFocus()) { mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus(); @@ -2298,6 +2330,7 @@ public final class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ public void bindAppsAdded(ArrayList apps) { + setLoadOnResume(); removeDialog(DIALOG_CREATE_SHORTCUT); mAllAppsGrid.addApps(apps); } @@ -2308,6 +2341,7 @@ public final class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ public void bindAppsUpdated(ArrayList apps) { + setLoadOnResume(); removeDialog(DIALOG_CREATE_SHORTCUT); mWorkspace.updateShortcuts(apps); mAllAppsGrid.updateApps(apps); diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java index cb19fe37f9..b819510afe 100644 --- a/src/com/android/launcher2/LauncherModel.java +++ b/src/com/android/launcher2/LauncherModel.java @@ -96,6 +96,7 @@ public class LauncherModel extends BroadcastReceiver { private Bitmap mDefaultIcon; public interface Callbacks { + public boolean setLoadOnResume(); public int getCurrentWorkspaceScreen(); public void startBinding(); public void bindItems(ArrayList shortcuts, int start, int end); @@ -349,7 +350,19 @@ public class LauncherModel extends BroadcastReceiver { String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); enqueuePackageUpdated(new PackageUpdatedTask(PackageUpdatedTask.OP_ADD, packages)); // Then, rebind everything. - startLoader(mApp, false); + boolean runLoader = true; + if (mCallbacks != null) { + Callbacks callbacks = mCallbacks.get(); + if (callbacks != null) { + // If they're paused, we can skip loading, because they'll do it again anyway + if (callbacks.setLoadOnResume()) { + runLoader = false; + } + } + } + if (runLoader) { + startLoader(mApp, false); + } } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);