Loading quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +27 −45 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.quickstep.RecentsAnimationInterpolator; import com.android.quickstep.RecentsAnimationInterpolator.TaskWindowBounds; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; Loading Loading @@ -106,7 +107,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag private DeviceProfile mDeviceProfile; private View mFloatingView; private RemoteAnimationRunnerCompat mRemoteAnimationOverride; private RemoteAnimationProvider mRemoteAnimationProvider; private final AnimatorListenerAdapter mReapplyStateListener = new AnimatorListenerAdapter() { @Override Loading Loading @@ -179,8 +180,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag return getDefaultActivityLaunchOptions(launcher, v); } public void setRemoteAnimationOverride(RemoteAnimationRunnerCompat remoteAnimationOverride) { mRemoteAnimationOverride = remoteAnimationOverride; public void setRemoteAnimationProvider(RemoteAnimationProvider animationProvider) { mRemoteAnimationProvider = animationProvider; } /** Loading Loading @@ -683,52 +684,33 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag private RemoteAnimationRunnerCompat getWallpaperOpenRunner() { return new LauncherAnimationRunner(mHandler) { @Override public void onAnimationStart(RemoteAnimationTargetCompat[] targetCompats, Runnable runnable) { if (mLauncher.getStateManager().getState().overviewUi && mRemoteAnimationOverride != null) { // This transition is only used for the fallback activity and should not be // managed here (but necessary to implement here since the defined remote // animation currently takes precendence over the one defined in the activity // options). mRemoteAnimationOverride.onAnimationStart(targetCompats, runnable); return; } super.onAnimationStart(targetCompats, runnable); } @Override public void onAnimationCancelled() { if (mLauncher.getStateManager().getState().overviewUi && mRemoteAnimationOverride != null) { // This transition is only used for the fallback activity and should not be // managed here (but necessary to implement here since the defined remote // animation currently takes precendence over the one defined in the activity // options). mRemoteAnimationOverride.onAnimationCancelled(); return; } super.onAnimationCancelled(); public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { AnimatorSet anim = null; RemoteAnimationProvider provider = mRemoteAnimationProvider; if (provider != null) { anim = provider.createWindowAnimation(targetCompats); } @Override public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { AnimatorSet anim = new AnimatorSet(); if (anim == null) { anim = new AnimatorSet(); anim.play(getClosingWindowAnimators(targetCompats)); // 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. // 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; } Loading quickstep/src/com/android/launcher3/LauncherInitListener.java +38 −5 Original line number Diff line number Diff line Loading @@ -15,13 +15,16 @@ */ package com.android.launcher3; import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.Handler; import com.android.launcher3.states.InternalStateHandler; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; import com.android.quickstep.util.RemoteAnimationProvider; import java.util.function.BiPredicate; Loading @@ -30,15 +33,33 @@ public class LauncherInitListener extends InternalStateHandler implements Activi private final BiPredicate<Launcher, Boolean> mOnInitListener; private RemoteAnimationProvider mRemoteAnimationProvider; public LauncherInitListener(BiPredicate<Launcher, Boolean> onInitListener) { mOnInitListener = onInitListener; } @Override protected boolean init(Launcher launcher, boolean alreadyOnHome) { // For the duration of the gesture, lock the screen orientation to ensure that we do not // rotate mid-quickscrub launcher.getRotationHelper().setStateHandlerRequest(REQUEST_LOCK); if (mRemoteAnimationProvider != null) { LauncherAppTransitionManagerImpl appTransitionManager = (LauncherAppTransitionManagerImpl) launcher.getAppTransitionManager(); // Set a one-time animation provider. After the first call, this will get cleared. // TODO: Probably also check the intended target id. appTransitionManager.setRemoteAnimationProvider((targets) -> { // On the first call clear the reference. appTransitionManager.setRemoteAnimationProvider(null); RemoteAnimationProvider provider = mRemoteAnimationProvider; mRemoteAnimationProvider = null; if (provider != null && launcher.getStateManager().getState().overviewUi) { return provider.createWindowAnimation(targets); } return null; }); } return mOnInitListener.test(launcher, alreadyOnHome); } Loading @@ -49,6 +70,18 @@ public class LauncherInitListener extends InternalStateHandler implements Activi @Override public void unregister() { mRemoteAnimationProvider = null; clearReference(); } @Override public void registerAndStartActivity(Intent intent, RemoteAnimationProvider animProvider, Context context, Handler handler, long duration) { mRemoteAnimationProvider = animProvider; register(); Bundle options = animProvider.toActivityOptions(handler, duration).toBundle(); context.startActivity(addToIntent(new Intent((intent))), options); } } quickstep/src/com/android/quickstep/ActivityControlHelper.java +4 −38 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static com.android.launcher3.anim.Interpolators.LINEAR; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.ActivityOptions; import android.content.Context; import android.content.Intent; import android.graphics.Rect; Loading @@ -39,19 +38,17 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppTransitionManagerImpl; import com.android.launcher3.LauncherInitListener; import com.android.launcher3.LauncherState; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.util.ViewOnDrawExecutor; import com.android.quickstep.fallback.FallbackRecentsView; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.views.LauncherLayoutListener; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.AssistDataReceiver; import com.android.systemui.shared.system.RecentsAnimationListener; import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import java.util.function.BiPredicate; Loading Loading @@ -85,9 +82,6 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { void startRecentsFromSwipe(Intent intent, AssistDataReceiver assistDataReceiver, final RecentsAnimationListener remoteAnimationListener); void startRecentsFromButton(Context context, Intent intent, RecentsAnimationListener remoteAnimationListener); @UiThread @Nullable RecentsView getVisibleRecentsView(); Loading Loading @@ -214,24 +208,6 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { intent, assistDataReceiver, remoteAnimationListener, null, null); } @Override public void startRecentsFromButton(Context context, Intent intent, RecentsAnimationListener remoteAnimationListener) { // We should use the remove animation for the fallback activity recents button case, // it works better with PiP. In Launcher, we have already registered the remote // animation definition, which takes priority over explicitly defined remote // animations in the provided activity options when starting the activity, so we // just register a remote animation factory to get a callback to handle this. LauncherAppTransitionManagerImpl appTransitionManager = (LauncherAppTransitionManagerImpl) getLauncher().getAppTransitionManager(); appTransitionManager.setRemoteAnimationOverride(new RecentsAnimationActivityOptions( remoteAnimationListener, () -> { // Once the controller is finished, also reset the remote animation override appTransitionManager.setRemoteAnimationOverride(null); })); context.startActivity(intent); } @Nullable @UiThread private Launcher getLauncher() { Loading Loading @@ -360,19 +336,6 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { intent, assistDataReceiver, remoteAnimationListener, null, null); } @Override public void startRecentsFromButton(Context context, Intent intent, RecentsAnimationListener remoteAnimationListener) { // We should use the remove animation for the fallback activity recents button case, // it works better with PiP. For the fallback activity, we should not have registered // the launcher app transition manager, so we should just start the remote animation here. ActivityOptions options = ActivityOptionsCompat.makeRemoteAnimation( new RemoteAnimationAdapterCompat( new RecentsAnimationActivityOptions(remoteAnimationListener, null), 10000, 10000)); context.startActivity(intent, options.toBundle()); } @Nullable @Override public RecentsView getVisibleRecentsView() { Loading Loading @@ -403,5 +366,8 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { void register(); void unregister(); void registerAndStartActivity(Intent intent, RemoteAnimationProvider animProvider, Context context, Handler handler, long duration); } } quickstep/src/com/android/quickstep/OverviewCommandHelper.java +130 −228 File changed.Preview size limit exceeded, changes collapsed. Show changes quickstep/src/com/android/quickstep/RecentsActivityTracker.java +14 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,14 @@ package com.android.quickstep; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.Handler; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; import com.android.quickstep.util.RemoteAnimationProvider; import java.lang.ref.WeakReference; import java.util.function.BiPredicate; Loading Loading @@ -78,4 +83,13 @@ public class RecentsActivityTracker implements ActivityInitListener { return sCurrentActivity.get(); } } @Override public void registerAndStartActivity(Intent intent, RemoteAnimationProvider animProvider, Context context, Handler handler, long duration) { register(); Bundle options = animProvider.toActivityOptions(handler, duration).toBundle(); context.startActivity(intent, options); } } Loading
quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +27 −45 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.quickstep.RecentsAnimationInterpolator; import com.android.quickstep.RecentsAnimationInterpolator.TaskWindowBounds; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; Loading Loading @@ -106,7 +107,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag private DeviceProfile mDeviceProfile; private View mFloatingView; private RemoteAnimationRunnerCompat mRemoteAnimationOverride; private RemoteAnimationProvider mRemoteAnimationProvider; private final AnimatorListenerAdapter mReapplyStateListener = new AnimatorListenerAdapter() { @Override Loading Loading @@ -179,8 +180,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag return getDefaultActivityLaunchOptions(launcher, v); } public void setRemoteAnimationOverride(RemoteAnimationRunnerCompat remoteAnimationOverride) { mRemoteAnimationOverride = remoteAnimationOverride; public void setRemoteAnimationProvider(RemoteAnimationProvider animationProvider) { mRemoteAnimationProvider = animationProvider; } /** Loading Loading @@ -683,52 +684,33 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag private RemoteAnimationRunnerCompat getWallpaperOpenRunner() { return new LauncherAnimationRunner(mHandler) { @Override public void onAnimationStart(RemoteAnimationTargetCompat[] targetCompats, Runnable runnable) { if (mLauncher.getStateManager().getState().overviewUi && mRemoteAnimationOverride != null) { // This transition is only used for the fallback activity and should not be // managed here (but necessary to implement here since the defined remote // animation currently takes precendence over the one defined in the activity // options). mRemoteAnimationOverride.onAnimationStart(targetCompats, runnable); return; } super.onAnimationStart(targetCompats, runnable); } @Override public void onAnimationCancelled() { if (mLauncher.getStateManager().getState().overviewUi && mRemoteAnimationOverride != null) { // This transition is only used for the fallback activity and should not be // managed here (but necessary to implement here since the defined remote // animation currently takes precendence over the one defined in the activity // options). mRemoteAnimationOverride.onAnimationCancelled(); return; } super.onAnimationCancelled(); public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { AnimatorSet anim = null; RemoteAnimationProvider provider = mRemoteAnimationProvider; if (provider != null) { anim = provider.createWindowAnimation(targetCompats); } @Override public AnimatorSet getAnimator(RemoteAnimationTargetCompat[] targetCompats) { AnimatorSet anim = new AnimatorSet(); if (anim == null) { anim = new AnimatorSet(); anim.play(getClosingWindowAnimators(targetCompats)); // 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. // 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; } Loading
quickstep/src/com/android/launcher3/LauncherInitListener.java +38 −5 Original line number Diff line number Diff line Loading @@ -15,13 +15,16 @@ */ package com.android.launcher3; import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.Handler; import com.android.launcher3.states.InternalStateHandler; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; import com.android.quickstep.util.RemoteAnimationProvider; import java.util.function.BiPredicate; Loading @@ -30,15 +33,33 @@ public class LauncherInitListener extends InternalStateHandler implements Activi private final BiPredicate<Launcher, Boolean> mOnInitListener; private RemoteAnimationProvider mRemoteAnimationProvider; public LauncherInitListener(BiPredicate<Launcher, Boolean> onInitListener) { mOnInitListener = onInitListener; } @Override protected boolean init(Launcher launcher, boolean alreadyOnHome) { // For the duration of the gesture, lock the screen orientation to ensure that we do not // rotate mid-quickscrub launcher.getRotationHelper().setStateHandlerRequest(REQUEST_LOCK); if (mRemoteAnimationProvider != null) { LauncherAppTransitionManagerImpl appTransitionManager = (LauncherAppTransitionManagerImpl) launcher.getAppTransitionManager(); // Set a one-time animation provider. After the first call, this will get cleared. // TODO: Probably also check the intended target id. appTransitionManager.setRemoteAnimationProvider((targets) -> { // On the first call clear the reference. appTransitionManager.setRemoteAnimationProvider(null); RemoteAnimationProvider provider = mRemoteAnimationProvider; mRemoteAnimationProvider = null; if (provider != null && launcher.getStateManager().getState().overviewUi) { return provider.createWindowAnimation(targets); } return null; }); } return mOnInitListener.test(launcher, alreadyOnHome); } Loading @@ -49,6 +70,18 @@ public class LauncherInitListener extends InternalStateHandler implements Activi @Override public void unregister() { mRemoteAnimationProvider = null; clearReference(); } @Override public void registerAndStartActivity(Intent intent, RemoteAnimationProvider animProvider, Context context, Handler handler, long duration) { mRemoteAnimationProvider = animProvider; register(); Bundle options = animProvider.toActivityOptions(handler, duration).toBundle(); context.startActivity(addToIntent(new Intent((intent))), options); } }
quickstep/src/com/android/quickstep/ActivityControlHelper.java +4 −38 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static com.android.launcher3.anim.Interpolators.LINEAR; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.ActivityOptions; import android.content.Context; import android.content.Intent; import android.graphics.Rect; Loading @@ -39,19 +38,17 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppTransitionManagerImpl; import com.android.launcher3.LauncherInitListener; import com.android.launcher3.LauncherState; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.util.ViewOnDrawExecutor; import com.android.quickstep.fallback.FallbackRecentsView; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.views.LauncherLayoutListener; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.AssistDataReceiver; import com.android.systemui.shared.system.RecentsAnimationListener; import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import java.util.function.BiPredicate; Loading Loading @@ -85,9 +82,6 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { void startRecentsFromSwipe(Intent intent, AssistDataReceiver assistDataReceiver, final RecentsAnimationListener remoteAnimationListener); void startRecentsFromButton(Context context, Intent intent, RecentsAnimationListener remoteAnimationListener); @UiThread @Nullable RecentsView getVisibleRecentsView(); Loading Loading @@ -214,24 +208,6 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { intent, assistDataReceiver, remoteAnimationListener, null, null); } @Override public void startRecentsFromButton(Context context, Intent intent, RecentsAnimationListener remoteAnimationListener) { // We should use the remove animation for the fallback activity recents button case, // it works better with PiP. In Launcher, we have already registered the remote // animation definition, which takes priority over explicitly defined remote // animations in the provided activity options when starting the activity, so we // just register a remote animation factory to get a callback to handle this. LauncherAppTransitionManagerImpl appTransitionManager = (LauncherAppTransitionManagerImpl) getLauncher().getAppTransitionManager(); appTransitionManager.setRemoteAnimationOverride(new RecentsAnimationActivityOptions( remoteAnimationListener, () -> { // Once the controller is finished, also reset the remote animation override appTransitionManager.setRemoteAnimationOverride(null); })); context.startActivity(intent); } @Nullable @UiThread private Launcher getLauncher() { Loading Loading @@ -360,19 +336,6 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { intent, assistDataReceiver, remoteAnimationListener, null, null); } @Override public void startRecentsFromButton(Context context, Intent intent, RecentsAnimationListener remoteAnimationListener) { // We should use the remove animation for the fallback activity recents button case, // it works better with PiP. For the fallback activity, we should not have registered // the launcher app transition manager, so we should just start the remote animation here. ActivityOptions options = ActivityOptionsCompat.makeRemoteAnimation( new RemoteAnimationAdapterCompat( new RecentsAnimationActivityOptions(remoteAnimationListener, null), 10000, 10000)); context.startActivity(intent, options.toBundle()); } @Nullable @Override public RecentsView getVisibleRecentsView() { Loading Loading @@ -403,5 +366,8 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> { void register(); void unregister(); void registerAndStartActivity(Intent intent, RemoteAnimationProvider animProvider, Context context, Handler handler, long duration); } }
quickstep/src/com/android/quickstep/OverviewCommandHelper.java +130 −228 File changed.Preview size limit exceeded, changes collapsed. Show changes
quickstep/src/com/android/quickstep/RecentsActivityTracker.java +14 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,14 @@ package com.android.quickstep; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.Handler; import com.android.quickstep.ActivityControlHelper.ActivityInitListener; import com.android.quickstep.util.RemoteAnimationProvider; import java.lang.ref.WeakReference; import java.util.function.BiPredicate; Loading Loading @@ -78,4 +83,13 @@ public class RecentsActivityTracker implements ActivityInitListener { return sCurrentActivity.get(); } } @Override public void registerAndStartActivity(Intent intent, RemoteAnimationProvider animProvider, Context context, Handler handler, long duration) { register(); Bundle options = animProvider.toActivityOptions(handler, duration).toBundle(); context.startActivity(intent, options); } }