Disabling synchronous binding when returning home from another app while orientation has changed. (Bug 6792288)

- Fixing issue where we were reverting to the first page of the workspace after launching an application from all apps, rotating, and returning home
- Enabling rotation in master.

Change-Id: I291b9d76b20244e9028b6f62164430bc3606644c
This commit is contained in:
Winson Chung
2012-07-19 14:53:05 -07:00
committed by Adam Cohen
parent d7d37b134b
commit 36e6c5bb23
3 changed files with 50 additions and 9 deletions

View File

@@ -5,7 +5,6 @@
<integer name="cell_count_y">6</integer>
<integer name="hotseat_cell_count">7</integer>
<integer name="hotseat_all_apps_index">3</integer>
<!-- DragController -->
<integer name="config_flingToDeleteMinVelocity">-1000</integer>

View File

@@ -181,7 +181,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;
@@ -229,6 +229,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;
@@ -239,6 +243,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;
@@ -370,7 +377,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()) {
@@ -391,6 +406,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;
@@ -676,10 +696,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);
@@ -823,7 +852,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);
@@ -1360,7 +1389,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) {

View File

@@ -1557,7 +1557,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
@@ -1609,10 +1610,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() {
@@ -1631,7 +1633,11 @@ public class LauncherModel extends BroadcastReceiver {
mIsLoadingAndBindingWorkspace = false;
}
};
mDeferredBindRunnables.add(r);
if (isLoadingSynchronously) {
mDeferredBindRunnables.add(r);
} else {
runOnMainThread(r);
}
}
private void loadAndBindAllApps() {