diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index 1febc88292..f54070e3f3 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -70,6 +70,8 @@ 0.97 115dp + 100dp + 16sp 16dp diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index bda2b77bb3..357d407d7a 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -212,6 +212,8 @@ public abstract class AbsSwipeUpHandler, public static final long RECENTS_ATTACH_DURATION = 300; + private static final float MAX_QUICK_SWITCH_RECENTS_SCALE_PROGRESS = 0.07f; + /** * Used as the page index for logging when we return to the last task at the end of the gesture. */ @@ -252,6 +254,9 @@ public abstract class AbsSwipeUpHandler, private SwipePipToHomeAnimator mSwipePipToHomeAnimator; protected boolean mIsSwipingPipToHome; + // Interpolate RecentsView scale from start of quick switch scroll until this scroll threshold + private final float mQuickSwitchScaleScrollThreshold; + public AbsSwipeUpHandler(Context context, RecentsAnimationDeviceState deviceState, TaskAnimationManager taskAnimationManager, GestureState gestureState, long touchTimeMs, boolean continuingLastGesture, @@ -267,6 +272,8 @@ public abstract class AbsSwipeUpHandler, mTaskAnimationManager = taskAnimationManager; mTouchTimeMs = touchTimeMs; mContinuingLastGesture = continuingLastGesture; + mQuickSwitchScaleScrollThreshold = context.getResources().getDimension( + R.dimen.quick_switch_scaling_scroll_threshold); initAfterSubclassConstructor(); initStateCallbacks(); @@ -681,7 +688,8 @@ public abstract class AbsSwipeUpHandler, || !canCreateNewOrUpdateExistingLauncherTransitionController()) { return; } - mLauncherTransitionController.setProgress(mCurrentShift.value, mDragLengthFactor); + mLauncherTransitionController.setProgress( + Math.max(mCurrentShift.value, getScaleProgressDueToScroll()), mDragLengthFactor); } /** @@ -1796,7 +1804,9 @@ public abstract class AbsSwipeUpHandler, */ protected void applyWindowTransform() { if (mWindowTransitionController != null) { - mWindowTransitionController.setProgress(mCurrentShift.value, mDragLengthFactor); + mWindowTransitionController.setProgress( + Math.max(mCurrentShift.value, getScaleProgressDueToScroll()), + mDragLengthFactor); } // No need to apply any transform if there is ongoing swipe-pip-to-home animator since // that animator handles the leash solely. @@ -1809,6 +1819,35 @@ public abstract class AbsSwipeUpHandler, ProtoTracer.INSTANCE.get(mContext).scheduleFrameUpdate(); } + // Scaling of RecentsView during quick switch based on amount of recents scroll + private float getScaleProgressDueToScroll() { + if (!mActivity.getDeviceProfile().isTablet || mRecentsView == null + || !mRecentsViewScrollLinked) { + return 0; + } + + float scrollOffset = Math.abs(mRecentsView.getScrollOffset(mRecentsView.getCurrentPage())); + int maxScrollOffset = mRecentsView.getPagedOrientationHandler().getPrimaryValue( + mRecentsView.getLastComputedTaskSize().width(), + mRecentsView.getLastComputedTaskSize().height()); + maxScrollOffset += mRecentsView.getPageSpacing(); + + float maxScaleProgress = + MAX_QUICK_SWITCH_RECENTS_SCALE_PROGRESS * mRecentsView.getMaxScaleForFullScreen(); + float scaleProgress = maxScaleProgress; + + if (scrollOffset < mQuickSwitchScaleScrollThreshold) { + scaleProgress = Utilities.mapToRange(scrollOffset, 0, mQuickSwitchScaleScrollThreshold, + 0, maxScaleProgress, ACCEL_DEACCEL); + } else if (scrollOffset > (maxScrollOffset - mQuickSwitchScaleScrollThreshold)) { + scaleProgress = Utilities.mapToRange(scrollOffset, + (maxScrollOffset - mQuickSwitchScaleScrollThreshold), maxScrollOffset, + maxScaleProgress, 0, ACCEL_DEACCEL); + } + + return scaleProgress; + } + /** * Used for winscope tracing, see launcher_trace.proto * @see com.android.systemui.shared.tracing.ProtoTraceable#writeToProto