Loading quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +27 −21 Original line number Diff line number Diff line Loading @@ -214,8 +214,9 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener } }; // Pairs of window starting type and starting window background color for starting tasks // Will never be larger than MAX_NUM_TASKS private LinkedHashMap<Integer, Integer> mTypeForTaskId; private LinkedHashMap<Integer, Pair<Integer, Integer>> mTaskStartParams; public QuickstepTransitionManager(Context context) { mLauncher = Launcher.cast(Launcher.getLauncher(context)); Loading @@ -232,9 +233,9 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener mLauncher.addOnDeviceProfileChangeListener(this); if (supportsSSplashScreen()) { mTypeForTaskId = new LinkedHashMap<Integer, Integer>(MAX_NUM_TASKS) { mTaskStartParams = new LinkedHashMap<Integer, Pair<Integer, Integer>>(MAX_NUM_TASKS) { @Override protected boolean removeEldestEntry(Entry<Integer, Integer> entry) { protected boolean removeEldestEntry(Entry<Integer, Pair<Integer, Integer>> entry) { return size() > MAX_NUM_TASKS; } }; Loading Loading @@ -420,15 +421,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener return bounds; } private int getOpeningTaskId(RemoteAnimationTargetCompat[] appTargets) { for (RemoteAnimationTargetCompat target : appTargets) { if (target.mode == MODE_OPENING) { return target.taskId; } } return -1; } public void setRemoteAnimationProvider(final RemoteAnimationProvider animationProvider, CancellationSignal cancellationSignal) { mRemoteAnimationProvider = animationProvider; Loading Loading @@ -595,10 +587,12 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final boolean hasSplashScreen; if (supportsSSplashScreen()) { int taskId = getOpeningTaskId(appTargets); int type = mTypeForTaskId.getOrDefault(taskId, STARTING_WINDOW_TYPE_NONE); mTypeForTaskId.remove(taskId); hasSplashScreen = type == STARTING_WINDOW_TYPE_SPLASH_SCREEN; int taskId = openingTargets.getFirstAppTargetTaskId(); Pair<Integer, Integer> defaultParams = Pair.create(STARTING_WINDOW_TYPE_NONE, 0); Pair<Integer, Integer> taskParams = mTaskStartParams.getOrDefault(taskId, defaultParams); mTaskStartParams.remove(taskId); hasSplashScreen = taskParams.first == STARTING_WINDOW_TYPE_SPLASH_SCREEN; } else { hasSplashScreen = false; } Loading Loading @@ -799,18 +793,30 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final RectF widgetBackgroundBounds = new RectF(); final Rect appWindowCrop = new Rect(); final Matrix matrix = new Matrix(); RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets, wallpaperTargets, nonAppTargets, MODE_OPENING); RemoteAnimationTargetCompat openingTarget = openingTargets.getFirstAppTarget(); int fallbackBackgroundColor = 0; if (openingTarget != null && supportsSSplashScreen()) { fallbackBackgroundColor = mTaskStartParams.containsKey(openingTarget.taskId) ? mTaskStartParams.get(openingTarget.taskId).second : 0; mTaskStartParams.remove(openingTarget.taskId); } if (fallbackBackgroundColor == 0) { fallbackBackgroundColor = FloatingWidgetView.getDefaultBackgroundColor(mLauncher, openingTarget); } final float finalWindowRadius = mDeviceProfile.isMultiWindowMode ? 0 : getWindowCornerRadius(mLauncher.getResources()); final FloatingWidgetView floatingView = FloatingWidgetView.getFloatingWidgetView(mLauncher, v, widgetBackgroundBounds, new Size(windowTargetBounds.width(), windowTargetBounds.height()), finalWindowRadius, appTargetsAreTranslucent); finalWindowRadius, appTargetsAreTranslucent, fallbackBackgroundColor); final float initialWindowRadius = supportsRoundedCornersOnWindows(mLauncher.getResources()) ? floatingView.getInitialCornerRadius() : 0; RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets, wallpaperTargets, nonAppTargets, MODE_OPENING); SurfaceTransactionApplier surfaceApplier = new SurfaceTransactionApplier(floatingView); openingTargets.addReleaseCheck(surfaceApplier); Loading Loading @@ -1434,8 +1440,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener } @Override public void onTaskLaunching(int taskId, int supportedType) { mTransitionManager.mTypeForTaskId.put(taskId, supportedType); public void onTaskLaunching(int taskId, int supportedType, int color) { mTransitionManager.mTaskStartParams.put(taskId, Pair.create(supportedType, color)); } } } quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +3 −2 Original line number Diff line number Diff line Loading @@ -1071,7 +1071,8 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, } protected abstract HomeAnimationFactory createHomeAnimationFactory( ArrayList<IBinder> launchCookies, long duration, boolean isTargetTranslucent); ArrayList<IBinder> launchCookies, long duration, boolean isTargetTranslucent, RemoteAnimationTargetCompat runningTaskTarget); private final TaskStackChangeListener mActivityRestartListener = new TaskStackChangeListener() { @Override Loading Loading @@ -1117,7 +1118,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, : new ArrayList<>(); boolean isTranslucent = runningTaskTarget != null && runningTaskTarget.isTranslucent; HomeAnimationFactory homeAnimFactory = createHomeAnimationFactory(cookies, duration, isTranslucent); createHomeAnimationFactory(cookies, duration, isTranslucent, runningTaskTarget); mIsSwipingPipToHome = homeAnimFactory.supportSwipePipToHome() && runningTaskTarget != null && runningTaskTarget.taskInfo.pictureInPictureParams != null Loading quickstep/src/com/android/quickstep/FallbackSwipeHandler.java +2 −1 Original line number Diff line number Diff line Loading @@ -129,7 +129,8 @@ public class FallbackSwipeHandler extends @Override protected HomeAnimationFactory createHomeAnimationFactory(ArrayList<IBinder> launchCookies, long duration, boolean isTargetTranslucent) { long duration, boolean isTargetTranslucent, RemoteAnimationTargetCompat runningTaskTarget) { mActiveAnimationFactory = new FallbackHomeAnimationFactory(duration); ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext, 0, 0); Intent intent = new Intent(mGestureState.getHomeIntent()); Loading quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java +27 −10 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.Utilities.boundToRange; import static com.android.launcher3.Utilities.dpToPx; import static com.android.launcher3.Utilities.mapBoundToRange; import static com.android.launcher3.anim.Interpolators.EXAGGERATED_EASE; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.config.FeatureFlags.PROTOTYPE_APP_CLOSE; import static com.android.launcher3.model.data.ItemInfo.NO_MATCHING_ID; import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATION; Loading Loading @@ -65,6 +68,7 @@ import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.plugins.ResourceProvider; import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import java.util.ArrayList; Loading @@ -84,7 +88,8 @@ public class LauncherSwipeHandlerV2 extends @Override protected HomeAnimationFactory createHomeAnimationFactory(ArrayList<IBinder> launchCookies, long duration, boolean isTargetTranslucent) { long duration, boolean isTargetTranslucent, RemoteAnimationTargetCompat runningTaskTarget) { if (mActivity == null) { mStateCallback.addChangeListener(STATE_LAUNCHER_PRESENT | STATE_HANDLER_INVALIDATED, isPresent -> mRecentsView.startHome()); Loading @@ -108,7 +113,7 @@ public class LauncherSwipeHandlerV2 extends } if (workspaceView instanceof LauncherAppWidgetHostView) { return createWidgetHomeAnimationFactory((LauncherAppWidgetHostView) workspaceView, isTargetTranslucent); isTargetTranslucent, runningTaskTarget); } return createIconHomeAnimationFactory(workspaceView); } Loading Loading @@ -169,15 +174,19 @@ public class LauncherSwipeHandlerV2 extends } private HomeAnimationFactory createWidgetHomeAnimationFactory( LauncherAppWidgetHostView hostView, boolean isTargetTranslucent) { LauncherAppWidgetHostView hostView, boolean isTargetTranslucent, RemoteAnimationTargetCompat runningTaskTarget) { final float floatingWidgetAlpha = isTargetTranslucent ? 0 : 1; RectF backgroundLocation = new RectF(); Rect crop = new Rect(); mTaskViewSimulator.getCurrentCropRect().roundOut(crop); Size windowSize = new Size(crop.width(), crop.height()); int fallbackBackgroundColor = FloatingWidgetView.getDefaultBackgroundColor(mContext, runningTaskTarget); FloatingWidgetView floatingWidgetView = FloatingWidgetView.getFloatingWidgetView(mActivity, hostView, backgroundLocation, windowSize, mTaskViewSimulator.getCurrentCornerRadius(), isTargetTranslucent); mTaskViewSimulator.getCurrentCornerRadius(), isTargetTranslucent, fallbackBackgroundColor); return new FloatingViewHomeAnimationFactory(floatingWidgetView) { Loading Loading @@ -207,12 +216,20 @@ public class LauncherSwipeHandlerV2 extends } @Override public void update(@Nullable AppCloseConfig config, RectF currentRect, float progress, float radius) { public void update(@Nullable AppCloseConfig config, RectF currentRect, float progress, float radius) { super.update(config, currentRect, progress, radius); floatingWidgetView.update(currentRect, 1 /* floatingWidgetAlpha */, config != null ? config.getFgAlpha() : 1f /* foregroundAlpha */, 0 /* fallbackBackgroundAlpha */, 1 - progress); final float fallbackBackgroundAlpha = 1 - mapBoundToRange(progress, 0.8f, 1, 0, 1, EXAGGERATED_EASE); final float foregroundAlpha = mapBoundToRange(progress, 0.5f, 1, 0, 1, EXAGGERATED_EASE); floatingWidgetView.update(currentRect, floatingWidgetAlpha, foregroundAlpha, fallbackBackgroundAlpha, 1 - progress); } @Override protected float getWindowAlpha(float progress) { return 1 - mapBoundToRange(progress, 0, 0.5f, 0, 1, LINEAR); } }; } Loading quickstep/src/com/android/quickstep/RemoteAnimationTargets.java +11 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,17 @@ public class RemoteAnimationTargets { return null; } /** Returns the first opening app target. */ public RemoteAnimationTargetCompat getFirstAppTarget() { return apps.length > 0 ? apps[0] : null; } /** Returns the task id of the first opening app target, or -1 if none is found. */ public int getFirstAppTargetTaskId() { RemoteAnimationTargetCompat target = getFirstAppTarget(); return target == null ? -1 : target.taskId; } public boolean isAnimatingHome() { for (RemoteAnimationTargetCompat target : unfilteredApps) { if (target.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { Loading Loading
quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +27 −21 Original line number Diff line number Diff line Loading @@ -214,8 +214,9 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener } }; // Pairs of window starting type and starting window background color for starting tasks // Will never be larger than MAX_NUM_TASKS private LinkedHashMap<Integer, Integer> mTypeForTaskId; private LinkedHashMap<Integer, Pair<Integer, Integer>> mTaskStartParams; public QuickstepTransitionManager(Context context) { mLauncher = Launcher.cast(Launcher.getLauncher(context)); Loading @@ -232,9 +233,9 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener mLauncher.addOnDeviceProfileChangeListener(this); if (supportsSSplashScreen()) { mTypeForTaskId = new LinkedHashMap<Integer, Integer>(MAX_NUM_TASKS) { mTaskStartParams = new LinkedHashMap<Integer, Pair<Integer, Integer>>(MAX_NUM_TASKS) { @Override protected boolean removeEldestEntry(Entry<Integer, Integer> entry) { protected boolean removeEldestEntry(Entry<Integer, Pair<Integer, Integer>> entry) { return size() > MAX_NUM_TASKS; } }; Loading Loading @@ -420,15 +421,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener return bounds; } private int getOpeningTaskId(RemoteAnimationTargetCompat[] appTargets) { for (RemoteAnimationTargetCompat target : appTargets) { if (target.mode == MODE_OPENING) { return target.taskId; } } return -1; } public void setRemoteAnimationProvider(final RemoteAnimationProvider animationProvider, CancellationSignal cancellationSignal) { mRemoteAnimationProvider = animationProvider; Loading Loading @@ -595,10 +587,12 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final boolean hasSplashScreen; if (supportsSSplashScreen()) { int taskId = getOpeningTaskId(appTargets); int type = mTypeForTaskId.getOrDefault(taskId, STARTING_WINDOW_TYPE_NONE); mTypeForTaskId.remove(taskId); hasSplashScreen = type == STARTING_WINDOW_TYPE_SPLASH_SCREEN; int taskId = openingTargets.getFirstAppTargetTaskId(); Pair<Integer, Integer> defaultParams = Pair.create(STARTING_WINDOW_TYPE_NONE, 0); Pair<Integer, Integer> taskParams = mTaskStartParams.getOrDefault(taskId, defaultParams); mTaskStartParams.remove(taskId); hasSplashScreen = taskParams.first == STARTING_WINDOW_TYPE_SPLASH_SCREEN; } else { hasSplashScreen = false; } Loading Loading @@ -799,18 +793,30 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final RectF widgetBackgroundBounds = new RectF(); final Rect appWindowCrop = new Rect(); final Matrix matrix = new Matrix(); RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets, wallpaperTargets, nonAppTargets, MODE_OPENING); RemoteAnimationTargetCompat openingTarget = openingTargets.getFirstAppTarget(); int fallbackBackgroundColor = 0; if (openingTarget != null && supportsSSplashScreen()) { fallbackBackgroundColor = mTaskStartParams.containsKey(openingTarget.taskId) ? mTaskStartParams.get(openingTarget.taskId).second : 0; mTaskStartParams.remove(openingTarget.taskId); } if (fallbackBackgroundColor == 0) { fallbackBackgroundColor = FloatingWidgetView.getDefaultBackgroundColor(mLauncher, openingTarget); } final float finalWindowRadius = mDeviceProfile.isMultiWindowMode ? 0 : getWindowCornerRadius(mLauncher.getResources()); final FloatingWidgetView floatingView = FloatingWidgetView.getFloatingWidgetView(mLauncher, v, widgetBackgroundBounds, new Size(windowTargetBounds.width(), windowTargetBounds.height()), finalWindowRadius, appTargetsAreTranslucent); finalWindowRadius, appTargetsAreTranslucent, fallbackBackgroundColor); final float initialWindowRadius = supportsRoundedCornersOnWindows(mLauncher.getResources()) ? floatingView.getInitialCornerRadius() : 0; RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets, wallpaperTargets, nonAppTargets, MODE_OPENING); SurfaceTransactionApplier surfaceApplier = new SurfaceTransactionApplier(floatingView); openingTargets.addReleaseCheck(surfaceApplier); Loading Loading @@ -1434,8 +1440,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener } @Override public void onTaskLaunching(int taskId, int supportedType) { mTransitionManager.mTypeForTaskId.put(taskId, supportedType); public void onTaskLaunching(int taskId, int supportedType, int color) { mTransitionManager.mTaskStartParams.put(taskId, Pair.create(supportedType, color)); } } }
quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +3 −2 Original line number Diff line number Diff line Loading @@ -1071,7 +1071,8 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, } protected abstract HomeAnimationFactory createHomeAnimationFactory( ArrayList<IBinder> launchCookies, long duration, boolean isTargetTranslucent); ArrayList<IBinder> launchCookies, long duration, boolean isTargetTranslucent, RemoteAnimationTargetCompat runningTaskTarget); private final TaskStackChangeListener mActivityRestartListener = new TaskStackChangeListener() { @Override Loading Loading @@ -1117,7 +1118,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, : new ArrayList<>(); boolean isTranslucent = runningTaskTarget != null && runningTaskTarget.isTranslucent; HomeAnimationFactory homeAnimFactory = createHomeAnimationFactory(cookies, duration, isTranslucent); createHomeAnimationFactory(cookies, duration, isTranslucent, runningTaskTarget); mIsSwipingPipToHome = homeAnimFactory.supportSwipePipToHome() && runningTaskTarget != null && runningTaskTarget.taskInfo.pictureInPictureParams != null Loading
quickstep/src/com/android/quickstep/FallbackSwipeHandler.java +2 −1 Original line number Diff line number Diff line Loading @@ -129,7 +129,8 @@ public class FallbackSwipeHandler extends @Override protected HomeAnimationFactory createHomeAnimationFactory(ArrayList<IBinder> launchCookies, long duration, boolean isTargetTranslucent) { long duration, boolean isTargetTranslucent, RemoteAnimationTargetCompat runningTaskTarget) { mActiveAnimationFactory = new FallbackHomeAnimationFactory(duration); ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext, 0, 0); Intent intent = new Intent(mGestureState.getHomeIntent()); Loading
quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java +27 −10 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.Utilities.boundToRange; import static com.android.launcher3.Utilities.dpToPx; import static com.android.launcher3.Utilities.mapBoundToRange; import static com.android.launcher3.anim.Interpolators.EXAGGERATED_EASE; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.config.FeatureFlags.PROTOTYPE_APP_CLOSE; import static com.android.launcher3.model.data.ItemInfo.NO_MATCHING_ID; import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATION; Loading Loading @@ -65,6 +68,7 @@ import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.plugins.ResourceProvider; import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import java.util.ArrayList; Loading @@ -84,7 +88,8 @@ public class LauncherSwipeHandlerV2 extends @Override protected HomeAnimationFactory createHomeAnimationFactory(ArrayList<IBinder> launchCookies, long duration, boolean isTargetTranslucent) { long duration, boolean isTargetTranslucent, RemoteAnimationTargetCompat runningTaskTarget) { if (mActivity == null) { mStateCallback.addChangeListener(STATE_LAUNCHER_PRESENT | STATE_HANDLER_INVALIDATED, isPresent -> mRecentsView.startHome()); Loading @@ -108,7 +113,7 @@ public class LauncherSwipeHandlerV2 extends } if (workspaceView instanceof LauncherAppWidgetHostView) { return createWidgetHomeAnimationFactory((LauncherAppWidgetHostView) workspaceView, isTargetTranslucent); isTargetTranslucent, runningTaskTarget); } return createIconHomeAnimationFactory(workspaceView); } Loading Loading @@ -169,15 +174,19 @@ public class LauncherSwipeHandlerV2 extends } private HomeAnimationFactory createWidgetHomeAnimationFactory( LauncherAppWidgetHostView hostView, boolean isTargetTranslucent) { LauncherAppWidgetHostView hostView, boolean isTargetTranslucent, RemoteAnimationTargetCompat runningTaskTarget) { final float floatingWidgetAlpha = isTargetTranslucent ? 0 : 1; RectF backgroundLocation = new RectF(); Rect crop = new Rect(); mTaskViewSimulator.getCurrentCropRect().roundOut(crop); Size windowSize = new Size(crop.width(), crop.height()); int fallbackBackgroundColor = FloatingWidgetView.getDefaultBackgroundColor(mContext, runningTaskTarget); FloatingWidgetView floatingWidgetView = FloatingWidgetView.getFloatingWidgetView(mActivity, hostView, backgroundLocation, windowSize, mTaskViewSimulator.getCurrentCornerRadius(), isTargetTranslucent); mTaskViewSimulator.getCurrentCornerRadius(), isTargetTranslucent, fallbackBackgroundColor); return new FloatingViewHomeAnimationFactory(floatingWidgetView) { Loading Loading @@ -207,12 +216,20 @@ public class LauncherSwipeHandlerV2 extends } @Override public void update(@Nullable AppCloseConfig config, RectF currentRect, float progress, float radius) { public void update(@Nullable AppCloseConfig config, RectF currentRect, float progress, float radius) { super.update(config, currentRect, progress, radius); floatingWidgetView.update(currentRect, 1 /* floatingWidgetAlpha */, config != null ? config.getFgAlpha() : 1f /* foregroundAlpha */, 0 /* fallbackBackgroundAlpha */, 1 - progress); final float fallbackBackgroundAlpha = 1 - mapBoundToRange(progress, 0.8f, 1, 0, 1, EXAGGERATED_EASE); final float foregroundAlpha = mapBoundToRange(progress, 0.5f, 1, 0, 1, EXAGGERATED_EASE); floatingWidgetView.update(currentRect, floatingWidgetAlpha, foregroundAlpha, fallbackBackgroundAlpha, 1 - progress); } @Override protected float getWindowAlpha(float progress) { return 1 - mapBoundToRange(progress, 0, 0.5f, 0, 1, LINEAR); } }; } Loading
quickstep/src/com/android/quickstep/RemoteAnimationTargets.java +11 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,17 @@ public class RemoteAnimationTargets { return null; } /** Returns the first opening app target. */ public RemoteAnimationTargetCompat getFirstAppTarget() { return apps.length > 0 ? apps[0] : null; } /** Returns the task id of the first opening app target, or -1 if none is found. */ public int getFirstAppTargetTaskId() { RemoteAnimationTargetCompat target = getFirstAppTarget(); return target == null ? -1 : target.taskId; } public boolean isAnimatingHome() { for (RemoteAnimationTargetCompat target : unfilteredApps) { if (target.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { Loading