Fixing double state changes when using an InternalStateHandler
> Removing duplicate state handling on onCreate and onNewInetnt when InternalStateHandler is active
> Changing PinItemDragListener to use IntenalStateHandler
Change-Id: I42dcf82d1180c49430c6cf0b85d47072c4498ecc
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 2e93066..17eb55e 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -107,7 +107,6 @@
import com.android.launcher3.dragndrop.DragLayer;
import com.android.launcher3.dragndrop.DragOptions;
import com.android.launcher3.dragndrop.DragView;
-import com.android.launcher3.dragndrop.PinItemDragListener;
import com.android.launcher3.dynamicui.WallpaperColorInfo;
import com.android.launcher3.folder.Folder;
import com.android.launcher3.folder.FolderIcon;
@@ -359,9 +358,27 @@
mPopupDataProvider = new PopupDataProvider(this);
- restoreState(savedInstanceState);
+ mRotationEnabled = getResources().getBoolean(R.bool.allow_rotation);
+ // In case we are on a device with locked rotation, we should look at preferences to check
+ // if the user has specifically allowed rotation.
+ if (!mRotationEnabled) {
+ mRotationEnabled = Utilities.isAllowRotationPrefEnabled(getApplicationContext());
+ mRotationPrefChangeHandler = new RotationPrefChangeHandler();
+ mSharedPrefs.registerOnSharedPreferenceChangeListener(mRotationPrefChangeHandler);
+ }
- InternalStateHandler.handleCreate(this, getIntent());
+ boolean internalStateHandled = InternalStateHandler.handleCreate(this, getIntent());
+ if (internalStateHandled) {
+ // Temporarily enable the rotation
+ mRotationEnabled = true;
+
+ if (savedInstanceState != null) {
+ // InternalStateHandler has already set the appropriate state.
+ // We dont need to do anything.
+ savedInstanceState.remove(RUNTIME_STATE);
+ }
+ }
+ restoreState(savedInstanceState);
// We only load the page synchronously if the user rotates (or triggers a
// configuration change) while launcher is in the foreground
@@ -369,10 +386,13 @@
if (savedInstanceState != null) {
currentScreen = savedInstanceState.getInt(RUNTIME_STATE_CURRENT_SCREEN, currentScreen);
}
+
if (!mModel.startLoader(currentScreen)) {
- // If we are not binding synchronously, show a fade in animation when
- // the first page bind completes.
- mDragLayer.setAlpha(0);
+ if (!internalStateHandled) {
+ // If we are not binding synchronously, show a fade in animation when
+ // the first page bind completes.
+ mDragLayer.setAlpha(0);
+ }
} else {
// Pages bound synchronously.
mWorkspace.setCurrentPage(currentScreen);
@@ -384,20 +404,6 @@
mDefaultKeySsb = new SpannableStringBuilder();
Selection.setSelection(mDefaultKeySsb, 0);
- mRotationEnabled = getResources().getBoolean(R.bool.allow_rotation);
- // In case we are on a device with locked rotation, we should look at preferences to check
- // if the user has specifically allowed rotation.
- if (!mRotationEnabled) {
- mRotationEnabled = Utilities.isAllowRotationPrefEnabled(getApplicationContext());
- mRotationPrefChangeHandler = new RotationPrefChangeHandler();
- mSharedPrefs.registerOnSharedPreferenceChangeListener(mRotationPrefChangeHandler);
- }
-
- if (PinItemDragListener.handleDragRequest(this, getIntent())) {
- // Temporarily enable the rotation
- mRotationEnabled = true;
- }
-
// On large interfaces, or on devices that a user has specifically enabled screen rotation,
// we want the screen to auto-rotate based on the current orientation
setRequestedOrientation(mRotationEnabled
@@ -1348,65 +1354,47 @@
boolean shouldMoveToDefaultScreen = alreadyOnHome && isInState(NORMAL)
&& AbstractFloatingView.getTopOpenView(this) == null;
boolean isActionMain = Intent.ACTION_MAIN.equals(intent.getAction());
+ boolean internalStateHandled = InternalStateHandler
+ .handleNewIntent(this, intent, alreadyOnHome);
+
if (isActionMain) {
- if (mWorkspace == null) {
- // Can be cases where mWorkspace is null, this prevents a NPE
- return;
- }
+ if (!internalStateHandled) {
+ // Note: There should be at most one log per method call. This is enforced
+ // implicitly by using if-else statements.
+ UserEventDispatcher ued = getUserEventDispatcher();
+ AbstractFloatingView topOpenView = AbstractFloatingView.getTopOpenView(this);
+ if (topOpenView != null) {
+ topOpenView.logActionCommand(Action.Command.HOME_INTENT);
+ } else if (alreadyOnHome) {
+ Target target = newContainerTarget(mStateManager.getState().containerType);
+ target.pageIndex = mWorkspace.getCurrentPage();
+ ued.logActionCommand(Action.Command.HOME_INTENT, target);
+ }
- // Note: There should be at most one log per method call. This is enforced implicitly
- // by using if-else statements.
- UserEventDispatcher ued = getUserEventDispatcher();
- AbstractFloatingView topOpenView = AbstractFloatingView.getTopOpenView(this);
- if (topOpenView != null) {
- topOpenView.logActionCommand(Action.Command.HOME_INTENT);
- } else if (alreadyOnHome) {
- Target target = newContainerTarget(mStateManager.getState().containerType);
- target.pageIndex = mWorkspace.getCurrentPage();
- ued.logActionCommand(Action.Command.HOME_INTENT, target);
- }
+ // In all these cases, only animate if we're already on home
+ AbstractFloatingView.closeAllOpenViews(this, alreadyOnHome);
- // In all these cases, only animate if we're already on home
- AbstractFloatingView.closeAllOpenViews(this, alreadyOnHome);
- mStateManager.goToState(NORMAL, alreadyOnHome /* animated */);
+ mStateManager.goToState(NORMAL, alreadyOnHome /* animated */);
+
+ // Reset the apps view
+ if (!alreadyOnHome && mAppsView != null) {
+ mAppsView.reset();
+ }
+
+ if (shouldMoveToDefaultScreen && !mWorkspace.isTouchActive()) {
+ mWorkspace.post(mWorkspace::moveToDefaultScreen);
+ }
+ }
final View v = getWindow().peekDecorView();
if (v != null && v.getWindowToken() != null) {
UiThreadHelper.hideKeyboardAsync(this, v.getWindowToken());
}
- // Reset the apps view
- if (!alreadyOnHome && mAppsView != null) {
- mAppsView.reset();
- }
-
if (mLauncherCallbacks != null) {
mLauncherCallbacks.onHomeIntent();
}
}
- PinItemDragListener.handleDragRequest(this, intent);
-
- if (mLauncherCallbacks != null) {
- mLauncherCallbacks.onNewIntent(intent);
- }
-
- // Defer moving to the default screen until after we callback to the LauncherCallbacks
- // as slow logic in the callbacks eat into the time the scroller expects for the snapToPage
- // animation.
- if (isActionMain) {
- if (shouldMoveToDefaultScreen && !mWorkspace.isTouchActive()) {
-
- mWorkspace.post(new Runnable() {
- @Override
- public void run() {
- if (mWorkspace != null) {
- mWorkspace.moveToDefaultScreen();
- }
- }
- });
- }
- }
- InternalStateHandler.handleNewIntent(this, intent, alreadyOnHome);
TraceHelper.endSection("NEW_INTENT");
}