From 9800e730a2ab7469002cf971ad9c8dd92d3cf372 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 4 Apr 2018 13:33:23 -0700 Subject: [PATCH] Fix animations home - To prevent surface thrashing, we no longer hide the home activity before starting the transition home. This prevents the launcher from being added to the remote animation target list, which means that we default to skipping the launcher animation. As a workaround, we special case the flow and force the animation to run when starting the recents animation. Bug: 74405472 Test: Go home from an app, ensure there is an animation. Change-Id: Ifd2b39444fdeab323ee79a368b580a6264c3e5b9 --- .../LauncherAppTransitionManagerImpl.java | 11 +++++++++- .../WindowTransformSwipeHandler.java | 6 ++++++ src/com/android/launcher3/BaseActivity.java | 20 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) 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 */