diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java index e57e84184e..4718c81305 100644 --- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java +++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java @@ -23,7 +23,6 @@ import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.views.RecentsView; -import com.android.quickstep.views.TaskView; /** * State indicating that the Launcher is behind an app @@ -66,23 +65,7 @@ public class BackgroundAppState extends OverviewState { } private float getOverviewScale(Launcher launcher) { - // Initialize the recents view scale to what it would be when starting swipe up - RecentsView recentsView = launcher.getOverviewPanel(); - int taskCount = recentsView.getTaskViewCount(); - if (taskCount == 0) return 1; - - TaskView dummyTask; - if (recentsView.getCurrentPage() >= recentsView.getTaskViewStartIndex()) { - if (recentsView.getCurrentPage() <= taskCount - 1) { - dummyTask = recentsView.getCurrentPageTaskView(); - } else { - dummyTask = recentsView.getTaskViewAt(taskCount - 1); - } - } else { - dummyTask = recentsView.getTaskViewAt(0); - } - return recentsView.getTempAppWindowAnimationHelper() - .updateForFullscreenOverview(dummyTask).getSrcToTargetScale(); + return ((RecentsView) launcher.getOverviewPanel()).getMaxScaleForFullScreen(); } @Override diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java index d22e5afcc5..9540ccf791 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java @@ -26,7 +26,6 @@ import android.animation.Animator; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; -import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; @@ -265,8 +264,7 @@ public abstract class BaseSwipeUpHandler mTaskAnimationManager = taskAnimationManager; mTouchTimeMs = touchTimeMs; mContinuingLastGesture = continuingLastGesture; - mTaskViewSimulator = new TaskViewSimulator( - context, LayoutUtils::calculateLauncherTaskSize, true); + mTaskViewSimulator = new TaskViewSimulator(context, LAUNCHER_ACTIVITY_SIZE_STRATEGY); initAfterSubclassConstructor(); initStateCallbacks(); diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java index 52a25589a6..ff47f2c60e 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java @@ -121,7 +121,7 @@ public final class RecentsActivity extends BaseRecentsActivity { protected DeviceProfile createDeviceProfile() { DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(this).getDeviceProfile(this); return (mRecentsRootView != null) && isInMultiWindowMode() - ? dp.getMultiWindowProfile(this, mRecentsRootView.getLastKnownSize()) + ? dp.getMultiWindowProfile(this, getMultiWindowDisplaySize()) : super.createDeviceProfile(); } diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsView.java index 3cf9b2cf5b..559004c3e4 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -16,22 +16,19 @@ package com.android.quickstep.fallback; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; +import static com.android.quickstep.util.WindowSizeStrategy.FALLBACK_RECENTS_SIZE_STRATEGY; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.graphics.Canvas; -import android.graphics.Rect; import android.util.AttributeSet; import android.util.FloatProperty; import android.view.View; -import com.android.launcher3.DeviceProfile; import com.android.launcher3.Utilities; import com.android.quickstep.RecentsActivity; -import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.views.OverviewActionsView; import com.android.quickstep.views.RecentsView; -import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.Task.TaskKey; @@ -65,7 +62,7 @@ public class FallbackRecentsView extends RecentsView { } public FallbackRecentsView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr, false); + super(context, attrs, defStyleAttr, FALLBACK_RECENTS_SIZE_STRATEGY); } @Override @@ -104,11 +101,6 @@ public class FallbackRecentsView extends RecentsView { resetViewUI(); } - @Override - protected void getTaskSize(DeviceProfile dp, Rect outRect) { - LayoutUtils.calculateFallbackTaskSize(getContext(), dp, outRect); - } - @Override public boolean shouldUseMultiWindowTaskSizeStrategy() { // Just use the activity task size for multi-window as well. @@ -140,16 +132,7 @@ public class FallbackRecentsView extends RecentsView { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); - - if (getTaskViewCount() == 0) { - mZoomScale = 1f; - } else { - TaskView dummyTask = getTaskViewAt(0); - mZoomScale = getTempAppWindowAnimationHelper() - .updateForFullscreenOverview(dummyTask) - .getSrcToTargetScale(); - } - + mZoomScale = getMaxScaleForFullScreen(); setZoomProgress(mZoomInProgress); } diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java index 9781300117..17284b0e05 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java @@ -61,7 +61,7 @@ public class TaskViewSimulator { private final RecentsOrientedState mOrientationState; private final Context mContext; - private final TaskSizeProvider mSizeProvider; + private final WindowSizeStrategy mSizeStrategy; private final Rect mTaskRect = new Rect(); private final PointF mPivot = new PointF(); @@ -95,14 +95,12 @@ public class TaskViewSimulator { private boolean mLayoutValid = false; private boolean mScrollValid = false; - public TaskViewSimulator(Context context, TaskSizeProvider sizeProvider, - boolean rotationSupportedByActivity) { + public TaskViewSimulator(Context context, WindowSizeStrategy sizeStrategy) { mContext = context; - mSizeProvider = sizeProvider; + mSizeStrategy = sizeStrategy; mPositionHelper = new PreviewPositionHelper(context); - mOrientationState = new RecentsOrientedState(context, rotationSupportedByActivity, - i -> { }); + mOrientationState = new RecentsOrientedState(context, sizeStrategy, i -> { }); // We do not need to attach listeners as the simulator is created just for the gesture // duration, and any settings are unlikely to change during this mOrientationState.initWithoutListeners(); @@ -116,6 +114,7 @@ public class TaskViewSimulator { */ public void setDp(DeviceProfile dp, boolean isOpening) { mDp = dp; + mOrientationState.setMultiWindowMode(mDp.isMultiWindowMode); mBoostModeTargetLayers = isOpening ? MODE_OPENING : MODE_CLOSING; mLayoutValid = false; } @@ -143,7 +142,7 @@ public class TaskViewSimulator { if (mDp == null) { return 1; } - mSizeProvider.calculateTaskSize(mContext, mDp, mTaskRect); + mSizeStrategy.calculateTaskSize(mContext, mDp, mTaskRect); return mOrientationState.getFullScreenScaleAndPivot(mTaskRect, mDp, mPivot); } @@ -161,8 +160,7 @@ public class TaskViewSimulator { mThumbnailPosition.set(runningTarget.screenSpaceBounds); // TODO: Should sourceContainerBounds already have this offset? - mThumbnailPosition.offsetTo(mRunningTarget.position.x, mRunningTarget.position.y); - + mThumbnailPosition.offset(-mRunningTarget.position.x, -mRunningTarget.position.y); mLayoutValid = false; } @@ -198,7 +196,7 @@ public class TaskViewSimulator { ? mOrientationState.getDisplayRotation() : mPositionHelper.getCurrentRotation(); mPositionHelper.updateThumbnailMatrix(mThumbnailPosition, mThumbnailData, - mDp.isMultiWindowMode, mTaskRect.width(), mTaskRect.height()); + mTaskRect.width(), mTaskRect.height(), mDp); mPositionHelper.getMatrix().invert(mInversePositionMatrix); @@ -209,6 +207,7 @@ public class TaskViewSimulator { mScrollValid = false; } + if (!mScrollValid) { mScrollValid = true; int start = mOrientationState.getOrientationHandler() @@ -243,6 +242,8 @@ public class TaskViewSimulator { postDisplayRotation(deltaRotation( mOrientationState.getLauncherRotation(), mOrientationState.getDisplayRotation()), mDp.widthPx, mDp.heightPx, mMatrix); + mMatrix.postTranslate(mDp.windowX - mRunningTarget.position.x, + mDp.windowY - mRunningTarget.position.y); // Crop rect is the inverse of thumbnail matrix mTempRectF.set(-insets.left, -insets.top, @@ -298,16 +299,4 @@ public class TaskViewSimulator { // Ideally we should use square-root. This is an optimization as one of the dimension is 0. return Math.max(Math.abs(mTempPoint[0]), Math.abs(mTempPoint[1])); } - - /** - * Interface for calculating taskSize - */ - public interface TaskSizeProvider { - - /** - * Sets the outRect to the expected taskSize - */ - void calculateTaskSize(Context context, DeviceProfile dp, Rect outRect); - } - } diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java index 9005651fcf..aafad0c79e 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java @@ -25,6 +25,7 @@ import static com.android.launcher3.LauncherState.SPRING_LOADED; import static com.android.launcher3.QuickstepAppTransitionManagerImpl.ALL_APPS_PROGRESS_OFF_SCREEN; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE; +import static com.android.quickstep.util.WindowSizeStrategy.LAUNCHER_ACTIVITY_SIZE_STRATEGY; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; @@ -39,7 +40,6 @@ import android.view.View; import android.widget.FrameLayout; import com.android.launcher3.BaseQuickstepLauncher; -import com.android.launcher3.DeviceProfile; import com.android.launcher3.Hotseat; import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherStateManager.StateListener; @@ -53,7 +53,6 @@ import com.android.launcher3.views.ScrimView; import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.util.AppWindowAnimationHelper; import com.android.quickstep.util.AppWindowAnimationHelper.TransformParams; -import com.android.quickstep.util.LayoutUtils; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.RecentsExtraCard; @@ -96,7 +95,7 @@ public class LauncherRecentsView extends RecentsView } public LauncherRecentsView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr, true); + super(context, attrs, defStyleAttr, LAUNCHER_ACTIVITY_SIZE_STRATEGY); mActivity.getStateManager().addStateListener(this); } @@ -178,11 +177,6 @@ public class LauncherRecentsView extends RecentsView return anim; } - @Override - protected void getTaskSize(DeviceProfile dp, Rect outRect) { - LayoutUtils.calculateLauncherTaskSize(getContext(), dp, outRect); - } - @Override protected void onTaskLaunchAnimationUpdate(float progress, TaskView tv) { if (ENABLE_QUICKSTEP_LIVE_TILE.get()) { diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java index cd3abed042..411f057bc6 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java @@ -122,6 +122,7 @@ import com.android.quickstep.TaskUtils; import com.android.quickstep.ViewUtils; import com.android.quickstep.util.AppWindowAnimationHelper; import com.android.quickstep.util.RecentsOrientedState; +import com.android.quickstep.util.WindowSizeStrategy; import com.android.systemui.plugins.ResourceProvider; import com.android.systemui.shared.recents.IPinnedStackAnimationListener; import com.android.systemui.shared.recents.model.Task; @@ -202,6 +203,7 @@ public abstract class RecentsView extends PagedView impl }; protected final RecentsOrientedState mOrientationState; + protected final WindowSizeStrategy mSizeStrategy; protected RecentsAnimationController mRecentsAnimationController; protected RecentsAnimationTargets mRecentsAnimationTargets; protected AppWindowAnimationHelper mAppWindowAnimationHelper; @@ -225,7 +227,6 @@ public abstract class RecentsView extends PagedView impl private final ClearAllButton mClearAllButton; private final Rect mClearAllButtonDeadZoneRect = new Rect(); private final Rect mTaskViewDeadZoneRect = new Rect(); - protected final AppWindowAnimationHelper mTempAppWindowAnimationHelper; private final ScrollState mScrollState = new ScrollState(); // Keeps track of the previously known visible tasks for purposes of loading/unloading task data @@ -373,20 +374,19 @@ public abstract class RecentsView extends PagedView impl }; public RecentsView(Context context, AttributeSet attrs, int defStyleAttr, - boolean rotationSupportedByActivity) { + WindowSizeStrategy sizeStrategy) { super(context, attrs, defStyleAttr); setPageSpacing(getResources().getDimensionPixelSize(R.dimen.recents_page_spacing)); setEnableFreeScroll(true); + mSizeStrategy = sizeStrategy; mOrientationState = new RecentsOrientedState( - context, rotationSupportedByActivity, this::animateRecentsRotationInPlace); + context, mSizeStrategy, this::animateRecentsRotationInPlace); mFastFlingVelocity = getResources() .getDimensionPixelSize(R.dimen.recents_fast_fling_velocity); mActivity = BaseActivity.fromContext(context); mModel = RecentsModel.INSTANCE.get(context); mIdp = InvariantDeviceProfile.INSTANCE.get(context); - mTempAppWindowAnimationHelper = - new AppWindowAnimationHelper(getPagedViewOrientedState(), context); mClearAllButton = (ClearAllButton) LayoutInflater.from(context) .inflate(R.layout.overview_clear_all_button, this, false); @@ -712,7 +712,7 @@ public abstract class RecentsView extends PagedView impl final int pageIndex = requiredTaskCount - i - 1 + mTaskViewStartIndex; final Task task = tasks.get(i); final TaskView taskView = (TaskView) getChildAt(pageIndex); - taskView.bind(task, mOrientationState, mActivity.getDeviceProfile().isMultiWindowMode); + taskView.bind(task, mOrientationState); } if (mNextPage == INVALID_PAGE) { @@ -802,7 +802,8 @@ public abstract class RecentsView extends PagedView impl public void setInsets(Rect insets) { mInsets.set(insets); DeviceProfile dp = mActivity.getDeviceProfile(); - getTaskSize(dp, mTempRect); + mOrientationState.setMultiWindowMode(dp.isMultiWindowMode); + getTaskSize(mTempRect); mTaskWidth = mTempRect.width(); mTaskHeight = mTempRect.height(); @@ -812,10 +813,8 @@ public abstract class RecentsView extends PagedView impl dp.heightPx - mInsets.bottom - mTempRect.bottom); } - protected abstract void getTaskSize(DeviceProfile dp, Rect outRect); - public void getTaskSize(Rect outRect) { - getTaskSize(mActivity.getDeviceProfile(), outRect); + mSizeStrategy.calculateTaskSize(mActivity, mActivity.getDeviceProfile(), outRect); } @Override @@ -1068,8 +1067,7 @@ public abstract class RecentsView extends PagedView impl new ComponentName(getContext(), getClass()), 0, 0), null, null, "", "", 0, 0, false, true, false, false, new ActivityManager.TaskDescription(), 0, new ComponentName("", ""), false); - taskView.bind(mTmpRunningTask, mOrientationState, - mActivity.getDeviceProfile().isMultiWindowMode); + taskView.bind(mTmpRunningTask, mOrientationState); } boolean runningTaskTileHidden = mRunningTaskTileHidden; @@ -1764,7 +1762,7 @@ public abstract class RecentsView extends PagedView impl int centerTaskIndex = getCurrentPage(); boolean launchingCenterTask = taskIndex == centerTaskIndex; - float toScale = appWindowAnimationHelper.getSrcToTargetScale(); + float toScale = getMaxScaleForFullScreen(); if (launchingCenterTask) { RecentsView recentsView = tv.getRecentsView(); anim.play(ObjectAnimator.ofFloat(recentsView, SCALE_PROPERTY, toScale)); @@ -1786,6 +1784,15 @@ public abstract class RecentsView extends PagedView impl return anim; } + /** + * Returns the scale up required on the view, so that it coves the screen completely + */ + public float getMaxScaleForFullScreen() { + getTaskSize(mTempRect); + return getPagedViewOrientedState().getFullScreenScaleAndPivot( + mTempRect, mActivity.getDeviceProfile(), mTempPointF); + } + public PendingAnimation createTaskLaunchAnimation( TaskView tv, long duration, Interpolator interpolator) { if (FeatureFlags.IS_STUDIO_BUILD && mPendingAnimation != null) { @@ -2079,10 +2086,6 @@ public abstract class RecentsView extends PagedView impl return mAppWindowAnimationHelper; } - public AppWindowAnimationHelper getTempAppWindowAnimationHelper() { - return mTempAppWindowAnimationHelper; - } - public AppWindowAnimationHelper.TransformParams getLiveTileParams( boolean mightNeedToRefill) { return null; diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java index e525842db0..aa08e86f22 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java @@ -36,12 +36,12 @@ import android.graphics.RectF; import android.graphics.Shader; import android.util.AttributeSet; import android.util.FloatProperty; -import android.util.Log; import android.util.Property; import android.view.Surface; import android.view.View; import com.android.launcher3.BaseActivity; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper; @@ -104,7 +104,6 @@ public class TaskThumbnailView extends View implements PluginListener 0 || insets.right > 0 || insets.bottom > 0)) { - mConsumedInsets.left = insets.left; - mConsumedInsets.right = insets.right; - mConsumedInsets.bottom = insets.bottom; - insets.set(0, insets.top, 0, 0); - drawInsetBar = true; - } else if ((insets.right > 0 || insets.left > 0) && - getContext().getSystemService(ActivityManager.class).isLowRamDevice()) { + if ((insets.right > 0 || insets.left > 0) + && getContext().getSystemService(ActivityManager.class).isLowRamDevice()) { mConsumedInsets.left = insets.left; mConsumedInsets.right = insets.right; insets.set(0, insets.top, 0, insets.bottom); diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 7baee9509f..8e33406ed5 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -63,6 +63,8 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.animation.Interpolator; +import androidx.core.os.BuildCompat; + import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.FolderAdaptiveIcon; import com.android.launcher3.graphics.GridOptionsProvider; @@ -104,6 +106,8 @@ public final class Utilities { public static final String[] EMPTY_STRING_ARRAY = new String[0]; public static final Person[] EMPTY_PERSON_ARRAY = new Person[0]; + public static final boolean ATLEAST_R = BuildCompat.isAtLeastR(); + public static final boolean ATLEAST_Q = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q; public static final boolean ATLEAST_P =