diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 307345a30a..dffe641d86 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -709,11 +709,20 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag AnimatorSet anim = new AnimatorSet(); anim.play(getClosingWindowAnimators(targetCompats)); - if (launcherIsATargetWithMode(targetCompats, MODE_OPENING)) { + // Normally, we run the launcher content animation when we are transitioning home, + // but if home is already visible, then we don't want to animate the contents of + // launcher unless we know that we are animating home as a result of the home button + // press with quickstep, which will result in launcher being started on touch down, + // prior to the animation home (and won't be in the targets list because it is + // already visible). In that case, we force invisibility on touch down, and only + // reset it after the animation to home is initialized. + if (launcherIsATargetWithMode(targetCompats, MODE_OPENING) + || mLauncher.isForceInvisible()) { // Only register the content animation for cancellation when state changes mLauncher.getStateManager().setCurrentAnimation(anim); createLauncherResumeAnimation(anim); } + mLauncher.setForceInvisible(false); return anim; } }; diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 975c62ba49..f6cf85a52d 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -340,6 +340,9 @@ public class WindowTransformSwipeHandler { } mWasLauncherAlreadyVisible = alreadyOnHome; mActivity = activity; + // Override the visibility of the activity until the gesture actually starts and we swipe + // up, or until we transition home and the home animation is composed + mActivity.setForceInvisible(true); mRecentsView = activity.getOverviewPanel(); mQuickScrubController = mRecentsView.getQuickScrubController(); @@ -613,6 +616,9 @@ public class WindowTransformSwipeHandler { private void notifyGestureStarted() { final T curActivity = mActivity; if (curActivity != null) { + // Once the gesture starts, we can no longer transition home through the button, so + // reset the force override of the activity visibility + mActivity.setForceInvisible(false); mActivityControlHelper.onQuickstepGestureStarted( curActivity, mWasLauncherAlreadyVisible); } diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index cf2d79faf2..ae631a4466 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -39,6 +39,9 @@ public abstract class BaseActivity extends Activity { protected SystemUiController mSystemUiController; private boolean mStarted; + // When the recents animation is running, the visibility of the Launcher is managed by the + // animation + private boolean mForceInvisible; private boolean mUserActive; public DeviceProfile getDeviceProfile() { @@ -100,6 +103,7 @@ public abstract class BaseActivity extends Activity { @Override protected void onStop() { mStarted = false; + mForceInvisible = false; super.onStop(); } @@ -125,6 +129,22 @@ public abstract class BaseActivity extends Activity { } } + /** + * Used to set the override visibility state, used only to handle the transition home with the + * recents animation. + * @see LauncherAppTransitionManagerImpl.getWallpaperOpenRunner() + */ + public void setForceInvisible(boolean invisible) { + mForceInvisible = invisible; + } + + /** + * @return Wether this activity should be considered invisible regardless of actual visibility. + */ + public boolean isForceInvisible() { + return mForceInvisible; + } + /** * Sets the device profile, adjusting it accordingly in case of multi-window */