diff options
-rw-r--r-- | res/values-sw600dp/config.xml | 1 | ||||
-rw-r--r-- | res/values-sw720dp/config.xml | 1 | ||||
-rw-r--r-- | src/com/android/launcher2/Launcher.java | 44 | ||||
-rw-r--r-- | src/com/android/launcher2/LauncherModel.java | 14 |
4 files changed, 51 insertions, 9 deletions
diff --git a/res/values-sw600dp/config.xml b/res/values-sw600dp/config.xml index 02789deb8..d07391eeb 100644 --- a/res/values-sw600dp/config.xml +++ b/res/values-sw600dp/config.xml @@ -3,6 +3,7 @@ <integer name="cell_count_y">6</integer> <integer name="hotseat_cell_count">7</integer> <integer name="hotseat_all_apps_index">3</integer> + <bool name="allow_rotation">true</bool> <!-- DragController --> <integer name="config_flingToDeleteMinVelocity">-1000</integer> diff --git a/res/values-sw720dp/config.xml b/res/values-sw720dp/config.xml index 97a6e9f68..cdca8050e 100644 --- a/res/values-sw720dp/config.xml +++ b/res/values-sw720dp/config.xml @@ -1,7 +1,6 @@ <resources> <bool name="config_largeHeap">true</bool> <bool name="is_large_screen">true</bool> - <bool name="allow_rotation">true</bool> <!-- AllApps/Customize/AppsCustomize --> <!-- Out of 100, the percent to shrink the workspace during spring loaded mode. --> diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 9784f572b..f31f82e2b 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -183,7 +183,7 @@ public final class Launcher extends Activity "com.android.launcher.toolbar_voice_search_icon"; /** The different states that Launcher can be in. */ - private enum State { WORKSPACE, APPS_CUSTOMIZE, APPS_CUSTOMIZE_SPRING_LOADED }; + private enum State { NONE, WORKSPACE, APPS_CUSTOMIZE, APPS_CUSTOMIZE_SPRING_LOADED }; private State mState = State.WORKSPACE; private AnimatorSet mStateAnimation; private AnimatorSet mDividerAnimator; @@ -231,6 +231,10 @@ public final class Launcher extends Activity private boolean mAutoAdvanceRunning = false; private Bundle mSavedState; + // We set the state in both onCreate and then onNewIntent in some cases, which causes both + // scroll issues (because the workspace may not have been measured yet) and extra work. + // Instead, just save the state that we need to restore Launcher to, and commit it in onResume. + private State mOnResumeState = State.NONE; private SpannableStringBuilder mDefaultKeySsb = null; @@ -241,6 +245,9 @@ public final class Launcher extends Activity private boolean mWaitingForResult; private boolean mOnResumeNeedsLoad; + // Keep track of whether the user has left launcher + private static boolean sPausedFromUserAction = false; + private Bundle mSavedInstanceState; private LauncherModel mModel; @@ -386,7 +393,15 @@ public final class Launcher extends Activity } if (!mRestoring) { - mModel.startLoader(true, mWorkspace.getCurrentPage()); + if (sPausedFromUserAction) { + // If the user leaves launcher, then we should just load items asynchronously when + // they return. + mModel.startLoader(true, -1); + } else { + // We only load the page synchronously if the user rotates (or triggers a + // configuration change) while launcher is in the foreground + mModel.startLoader(true, mWorkspace.getCurrentPage()); + } } if (!mModel.isAllAppsLoaded()) { @@ -407,6 +422,11 @@ public final class Launcher extends Activity unlockScreenOrientation(true); } + protected void onUserLeaveHint() { + super.onUserLeaveHint(); + sPausedFromUserAction = true; + } + private void updateGlobalIcons() { boolean searchVisible = false; boolean voiceVisible = false; @@ -692,10 +712,19 @@ public final class Launcher extends Activity protected void onResume() { super.onResume(); + // Restore the previous launcher state + if (mOnResumeState == State.WORKSPACE) { + showWorkspace(false); + } else if (mOnResumeState == State.APPS_CUSTOMIZE) { + showAllApps(false); + } + mOnResumeState = State.NONE; + // Process any items that were added while Launcher was away InstallShortcutReceiver.flushInstallQueue(this); mPaused = false; + sPausedFromUserAction = false; if (mRestoring || mOnResumeNeedsLoad) { mWorkspaceLoading = true; mModel.startLoader(true, -1); @@ -839,7 +868,7 @@ public final class Launcher extends Activity State state = intToState(savedState.getInt(RUNTIME_STATE, State.WORKSPACE.ordinal())); if (state == State.APPS_CUSTOMIZE) { - showAllApps(false); + mOnResumeState = State.APPS_CUSTOMIZE; } int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN, -1); @@ -1375,7 +1404,14 @@ public final class Launcher extends Activity closeFolder(); exitSpringLoadedDragMode(); - showWorkspace(alreadyOnHome); + + // If we are already on home, then just animate back to the workspace, otherwise, just + // wait until onResume to set the state back to Workspace + if (alreadyOnHome) { + showWorkspace(true); + } else { + mOnResumeState = State.WORKSPACE; + } final View v = getWindow().peekDecorView(); if (v != null && v.getWindowToken() != null) { diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java index 40ec7ca98..1b79c9b15 100644 --- a/src/com/android/launcher2/LauncherModel.java +++ b/src/com/android/launcher2/LauncherModel.java @@ -1653,7 +1653,8 @@ public class LauncherModel extends BroadcastReceiver { return; } - final int currentScreen = (synchronizeBindPage > -1) ? synchronizeBindPage : + final boolean isLoadingSynchronously = (synchronizeBindPage > -1); + final int currentScreen = isLoadingSynchronously ? synchronizeBindPage : oldCallbacks.getCurrentWorkspaceScreen(); // Load all the items that are on the current page first (and in the process, unbind @@ -1705,10 +1706,11 @@ public class LauncherModel extends BroadcastReceiver { bindWorkspaceItems(oldCallbacks, currentWorkspaceItems, currentAppWidgets, currentFolders, null); - // Load all the remaining pages + // Load all the remaining pages (if we are loading synchronously, we want to defer this + // work until after the first render) mDeferredBindRunnables.clear(); bindWorkspaceItems(oldCallbacks, otherWorkspaceItems, otherAppWidgets, otherFolders, - mDeferredBindRunnables); + (isLoadingSynchronously ? mDeferredBindRunnables : null)); // Tell the workspace that we're done binding items r = new Runnable() { @@ -1727,7 +1729,11 @@ public class LauncherModel extends BroadcastReceiver { mIsLoadingAndBindingWorkspace = false; } }; - mDeferredBindRunnables.add(r); + if (isLoadingSynchronously) { + mDeferredBindRunnables.add(r); + } else { + runOnMainThread(r); + } } private void loadAndBindAllApps() { |