Loading quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +4 −3 Original line number Diff line number Diff line Loading @@ -45,6 +45,8 @@ import static com.android.quickstep.GestureState.STATE_END_TARGET_SET; import static com.android.quickstep.GestureState.STATE_RECENTS_SCROLLING_FINISHED; import static com.android.quickstep.MultiStateCallback.DEBUG_STATES; import static com.android.quickstep.util.NavigationModeFeatureFlag.LIVE_TILE; import static com.android.quickstep.util.SwipePipToHomeAnimator.FRACTION_END; import static com.android.quickstep.util.SwipePipToHomeAnimator.FRACTION_START; import static com.android.quickstep.views.RecentsView.RECENTS_GRID_PROGRESS; import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; Loading Loading @@ -1073,7 +1075,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, homeAnimFactory, runningTaskTarget, start); mSwipePipToHomeAnimator.setDuration(SWIPE_PIP_TO_HOME_DURATION); mSwipePipToHomeAnimator.setInterpolator(interpolator); mSwipePipToHomeAnimator.setFloatValues(0f, 1f); mSwipePipToHomeAnimator.setFloatValues(FRACTION_START, FRACTION_END); mSwipePipToHomeAnimator.start(); mRunningWindowAnim = RunningWindowAnim.wrap(mSwipePipToHomeAnimator); } else { Loading Loading @@ -1483,8 +1485,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, mRecentsAnimationController.setFinishTaskBounds( mSwipePipToHomeAnimator.getTaskId(), mSwipePipToHomeAnimator.getDestinationBounds(), mSwipePipToHomeAnimator.getFinishWindowCrop(), mSwipePipToHomeAnimator.getFinishTransform()); mSwipePipToHomeAnimator.getFinishTransaction()); mIsSwipingPipToHome = false; } } Loading quickstep/src/com/android/quickstep/RecentsAnimationController.java +6 −6 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static com.android.launcher3.util.Executors.THREAD_POOL_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import android.graphics.Rect; import android.window.PictureInPictureSurfaceTransaction; import androidx.annotation.NonNull; import androidx.annotation.UiThread; Loading Loading @@ -149,14 +150,13 @@ public class RecentsAnimationController { * accordingly. This should be called before `finish` * @param taskId for which the leash should be updated * @param destinationBounds bounds of the final PiP window * @param windowCrop bounds to crop as part of final transform. * @param float9 An array of 9 floats to be used as matrix transform. * @param finishTransaction leash operations for the final transform. */ public void setFinishTaskBounds(int taskId, Rect destinationBounds, Rect windowCrop, float[] float9) { public void setFinishTaskBounds(int taskId, Rect destinationBounds, PictureInPictureSurfaceTransaction finishTransaction) { UI_HELPER_EXECUTOR.execute( () -> mController.setFinishTaskBounds(taskId, destinationBounds, windowCrop, float9)); () -> mController.setFinishTaskBounds(taskId, destinationBounds, finishTransaction)); } /** Loading quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java +32 −46 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.util.Log; import android.view.Surface; import android.view.SurfaceControl; import android.view.View; import android.window.PictureInPictureSurfaceTransaction; import androidx.annotation.NonNull; import androidx.annotation.Nullable; Loading @@ -46,10 +47,12 @@ import com.android.systemui.shared.system.InteractionJankMonitorWrapper; * Launcher and SysUI. Also, there should be one source of truth for the corner radius of the * PiP window, which would ideally be on SysUI side as well. */ public class SwipePipToHomeAnimator extends ValueAnimator implements ValueAnimator.AnimatorUpdateListener { public class SwipePipToHomeAnimator extends ValueAnimator { private static final String TAG = SwipePipToHomeAnimator.class.getSimpleName(); public static final float FRACTION_START = 0f; public static final float FRACTION_END = 1f; private final int mTaskId; private final ComponentName mComponentName; private final SurfaceControl mLeash; Loading Loading @@ -139,7 +142,7 @@ public class SwipePipToHomeAnimator extends ValueAnimator implements mHasAnimationEnded = true; } }); addUpdateListener(this); addUpdateListener(this::onAnimationUpdate); } /** sets the from rotation if it's different from the target rotation. */ Loading Loading @@ -167,48 +170,53 @@ public class SwipePipToHomeAnimator extends ValueAnimator implements mAppBounds.top + mDestinationBounds.height()); } @Override public void onAnimationUpdate(ValueAnimator animator) { private void onAnimationUpdate(ValueAnimator animator) { if (mHasAnimationEnded) return; final SurfaceControl.Transaction tx = PipSurfaceTransactionHelper.newSurfaceControlTransaction(); onAnimationUpdate(tx, animator.getAnimatedFraction()); tx.apply(); } final float fraction = animator.getAnimatedFraction(); private PictureInPictureSurfaceTransaction onAnimationUpdate(SurfaceControl.Transaction tx, float fraction) { final Rect bounds = mRectEvaluator.evaluate(fraction, mStartBounds, mDestinationBoundsAnimation); final SurfaceControl.Transaction tx = PipSurfaceTransactionHelper.newSurfaceControlTransaction(); final PictureInPictureSurfaceTransaction op; if (mSourceHintRectInsets == null) { // no source rect hint been set, directly scale the window down onAnimationScale(fraction, tx, bounds); op = onAnimationScale(fraction, tx, bounds); } else { // scale and crop according to the source rect hint onAnimationScaleAndCrop(fraction, tx, bounds); op = onAnimationScaleAndCrop(fraction, tx, bounds); } mSurfaceTransactionHelper.resetCornerRadius(tx, mLeash); tx.apply(); return op; } /** scale the window directly with no source rect hint being set */ private void onAnimationScale(float fraction, SurfaceControl.Transaction tx, Rect bounds) { private PictureInPictureSurfaceTransaction onAnimationScale( float fraction, SurfaceControl.Transaction tx, Rect bounds) { if (mFromRotation == Surface.ROTATION_90 || mFromRotation == Surface.ROTATION_270) { final RotatedPosition rotatedPosition = getRotatedPosition(fraction); mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds, return mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds, rotatedPosition.degree, rotatedPosition.positionX, rotatedPosition.positionY); } else { mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds); return mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds); } } /** scale and crop the window with source rect hint */ private void onAnimationScaleAndCrop(float fraction, SurfaceControl.Transaction tx, private PictureInPictureSurfaceTransaction onAnimationScaleAndCrop( float fraction, SurfaceControl.Transaction tx, Rect bounds) { final Rect insets = mInsetsEvaluator.evaluate(fraction, mSourceInsets, mSourceHintRectInsets); if (mFromRotation == Surface.ROTATION_90 || mFromRotation == Surface.ROTATION_270) { final RotatedPosition rotatedPosition = getRotatedPosition(fraction); mSurfaceTransactionHelper.scaleAndRotate(tx, mLeash, mAppBounds, bounds, insets, return mSurfaceTransactionHelper.scaleAndRotate(tx, mLeash, mAppBounds, bounds, insets, rotatedPosition.degree, rotatedPosition.positionX, rotatedPosition.positionY); } else { mSurfaceTransactionHelper.scaleAndCrop(tx, mLeash, mAppBounds, bounds, insets); return mSurfaceTransactionHelper.scaleAndCrop(tx, mLeash, mAppBounds, bounds, insets); } } Loading @@ -224,34 +232,12 @@ public class SwipePipToHomeAnimator extends ValueAnimator implements return mDestinationBounds; } /** * @return {@link Rect} of the final window crop in destination orientation. */ public Rect getFinishWindowCrop() { final Rect windowCrop = new Rect(mAppBounds); if (mSourceHintRectInsets != null) { windowCrop.inset(mSourceHintRectInsets); } return windowCrop; } /** * @return Array of 9 floats represents the final transform in destination orientation. */ public float[] getFinishTransform() { final Matrix transform = new Matrix(); final float[] float9 = new float[9]; if (mSourceHintRectInsets == null) { transform.setRectToRect(new RectF(mAppBounds), new RectF(mDestinationBounds), Matrix.ScaleToFit.FILL); } else { final float scale = mAppBounds.width() <= mAppBounds.height() ? (float) mDestinationBounds.width() / mAppBounds.width() : (float) mDestinationBounds.height() / mAppBounds.height(); transform.setScale(scale, scale); } transform.getValues(float9); return float9; /** @return {@link PictureInPictureSurfaceTransaction} for the final leash transaction. */ public PictureInPictureSurfaceTransaction getFinishTransaction() { // get the final leash operations but do not apply to the leash. final SurfaceControl.Transaction tx = PipSurfaceTransactionHelper.newSurfaceControlTransaction(); return onAnimationUpdate(tx, FRACTION_END); } private RotatedPosition getRotatedPosition(float fraction) { Loading Loading
quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +4 −3 Original line number Diff line number Diff line Loading @@ -45,6 +45,8 @@ import static com.android.quickstep.GestureState.STATE_END_TARGET_SET; import static com.android.quickstep.GestureState.STATE_RECENTS_SCROLLING_FINISHED; import static com.android.quickstep.MultiStateCallback.DEBUG_STATES; import static com.android.quickstep.util.NavigationModeFeatureFlag.LIVE_TILE; import static com.android.quickstep.util.SwipePipToHomeAnimator.FRACTION_END; import static com.android.quickstep.util.SwipePipToHomeAnimator.FRACTION_START; import static com.android.quickstep.views.RecentsView.RECENTS_GRID_PROGRESS; import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; Loading Loading @@ -1073,7 +1075,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, homeAnimFactory, runningTaskTarget, start); mSwipePipToHomeAnimator.setDuration(SWIPE_PIP_TO_HOME_DURATION); mSwipePipToHomeAnimator.setInterpolator(interpolator); mSwipePipToHomeAnimator.setFloatValues(0f, 1f); mSwipePipToHomeAnimator.setFloatValues(FRACTION_START, FRACTION_END); mSwipePipToHomeAnimator.start(); mRunningWindowAnim = RunningWindowAnim.wrap(mSwipePipToHomeAnimator); } else { Loading Loading @@ -1483,8 +1485,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, mRecentsAnimationController.setFinishTaskBounds( mSwipePipToHomeAnimator.getTaskId(), mSwipePipToHomeAnimator.getDestinationBounds(), mSwipePipToHomeAnimator.getFinishWindowCrop(), mSwipePipToHomeAnimator.getFinishTransform()); mSwipePipToHomeAnimator.getFinishTransaction()); mIsSwipingPipToHome = false; } } Loading
quickstep/src/com/android/quickstep/RecentsAnimationController.java +6 −6 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static com.android.launcher3.util.Executors.THREAD_POOL_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import android.graphics.Rect; import android.window.PictureInPictureSurfaceTransaction; import androidx.annotation.NonNull; import androidx.annotation.UiThread; Loading Loading @@ -149,14 +150,13 @@ public class RecentsAnimationController { * accordingly. This should be called before `finish` * @param taskId for which the leash should be updated * @param destinationBounds bounds of the final PiP window * @param windowCrop bounds to crop as part of final transform. * @param float9 An array of 9 floats to be used as matrix transform. * @param finishTransaction leash operations for the final transform. */ public void setFinishTaskBounds(int taskId, Rect destinationBounds, Rect windowCrop, float[] float9) { public void setFinishTaskBounds(int taskId, Rect destinationBounds, PictureInPictureSurfaceTransaction finishTransaction) { UI_HELPER_EXECUTOR.execute( () -> mController.setFinishTaskBounds(taskId, destinationBounds, windowCrop, float9)); () -> mController.setFinishTaskBounds(taskId, destinationBounds, finishTransaction)); } /** Loading
quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java +32 −46 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.util.Log; import android.view.Surface; import android.view.SurfaceControl; import android.view.View; import android.window.PictureInPictureSurfaceTransaction; import androidx.annotation.NonNull; import androidx.annotation.Nullable; Loading @@ -46,10 +47,12 @@ import com.android.systemui.shared.system.InteractionJankMonitorWrapper; * Launcher and SysUI. Also, there should be one source of truth for the corner radius of the * PiP window, which would ideally be on SysUI side as well. */ public class SwipePipToHomeAnimator extends ValueAnimator implements ValueAnimator.AnimatorUpdateListener { public class SwipePipToHomeAnimator extends ValueAnimator { private static final String TAG = SwipePipToHomeAnimator.class.getSimpleName(); public static final float FRACTION_START = 0f; public static final float FRACTION_END = 1f; private final int mTaskId; private final ComponentName mComponentName; private final SurfaceControl mLeash; Loading Loading @@ -139,7 +142,7 @@ public class SwipePipToHomeAnimator extends ValueAnimator implements mHasAnimationEnded = true; } }); addUpdateListener(this); addUpdateListener(this::onAnimationUpdate); } /** sets the from rotation if it's different from the target rotation. */ Loading Loading @@ -167,48 +170,53 @@ public class SwipePipToHomeAnimator extends ValueAnimator implements mAppBounds.top + mDestinationBounds.height()); } @Override public void onAnimationUpdate(ValueAnimator animator) { private void onAnimationUpdate(ValueAnimator animator) { if (mHasAnimationEnded) return; final SurfaceControl.Transaction tx = PipSurfaceTransactionHelper.newSurfaceControlTransaction(); onAnimationUpdate(tx, animator.getAnimatedFraction()); tx.apply(); } final float fraction = animator.getAnimatedFraction(); private PictureInPictureSurfaceTransaction onAnimationUpdate(SurfaceControl.Transaction tx, float fraction) { final Rect bounds = mRectEvaluator.evaluate(fraction, mStartBounds, mDestinationBoundsAnimation); final SurfaceControl.Transaction tx = PipSurfaceTransactionHelper.newSurfaceControlTransaction(); final PictureInPictureSurfaceTransaction op; if (mSourceHintRectInsets == null) { // no source rect hint been set, directly scale the window down onAnimationScale(fraction, tx, bounds); op = onAnimationScale(fraction, tx, bounds); } else { // scale and crop according to the source rect hint onAnimationScaleAndCrop(fraction, tx, bounds); op = onAnimationScaleAndCrop(fraction, tx, bounds); } mSurfaceTransactionHelper.resetCornerRadius(tx, mLeash); tx.apply(); return op; } /** scale the window directly with no source rect hint being set */ private void onAnimationScale(float fraction, SurfaceControl.Transaction tx, Rect bounds) { private PictureInPictureSurfaceTransaction onAnimationScale( float fraction, SurfaceControl.Transaction tx, Rect bounds) { if (mFromRotation == Surface.ROTATION_90 || mFromRotation == Surface.ROTATION_270) { final RotatedPosition rotatedPosition = getRotatedPosition(fraction); mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds, return mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds, rotatedPosition.degree, rotatedPosition.positionX, rotatedPosition.positionY); } else { mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds); return mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds); } } /** scale and crop the window with source rect hint */ private void onAnimationScaleAndCrop(float fraction, SurfaceControl.Transaction tx, private PictureInPictureSurfaceTransaction onAnimationScaleAndCrop( float fraction, SurfaceControl.Transaction tx, Rect bounds) { final Rect insets = mInsetsEvaluator.evaluate(fraction, mSourceInsets, mSourceHintRectInsets); if (mFromRotation == Surface.ROTATION_90 || mFromRotation == Surface.ROTATION_270) { final RotatedPosition rotatedPosition = getRotatedPosition(fraction); mSurfaceTransactionHelper.scaleAndRotate(tx, mLeash, mAppBounds, bounds, insets, return mSurfaceTransactionHelper.scaleAndRotate(tx, mLeash, mAppBounds, bounds, insets, rotatedPosition.degree, rotatedPosition.positionX, rotatedPosition.positionY); } else { mSurfaceTransactionHelper.scaleAndCrop(tx, mLeash, mAppBounds, bounds, insets); return mSurfaceTransactionHelper.scaleAndCrop(tx, mLeash, mAppBounds, bounds, insets); } } Loading @@ -224,34 +232,12 @@ public class SwipePipToHomeAnimator extends ValueAnimator implements return mDestinationBounds; } /** * @return {@link Rect} of the final window crop in destination orientation. */ public Rect getFinishWindowCrop() { final Rect windowCrop = new Rect(mAppBounds); if (mSourceHintRectInsets != null) { windowCrop.inset(mSourceHintRectInsets); } return windowCrop; } /** * @return Array of 9 floats represents the final transform in destination orientation. */ public float[] getFinishTransform() { final Matrix transform = new Matrix(); final float[] float9 = new float[9]; if (mSourceHintRectInsets == null) { transform.setRectToRect(new RectF(mAppBounds), new RectF(mDestinationBounds), Matrix.ScaleToFit.FILL); } else { final float scale = mAppBounds.width() <= mAppBounds.height() ? (float) mDestinationBounds.width() / mAppBounds.width() : (float) mDestinationBounds.height() / mAppBounds.height(); transform.setScale(scale, scale); } transform.getValues(float9); return float9; /** @return {@link PictureInPictureSurfaceTransaction} for the final leash transaction. */ public PictureInPictureSurfaceTransaction getFinishTransaction() { // get the final leash operations but do not apply to the leash. final SurfaceControl.Transaction tx = PipSurfaceTransactionHelper.newSurfaceControlTransaction(); return onAnimationUpdate(tx, FRACTION_END); } private RotatedPosition getRotatedPosition(float fraction) { Loading