From 75ba9c300c8e5e96e751e52903cb274a67eb638a Mon Sep 17 00:00:00 2001 From: Ben Lin Date: Thu, 19 Mar 2020 17:55:12 -0700 Subject: [PATCH] Scale the leash for PIP User-started resizing. Bug: 147361175 Test: Manual Change-Id: I387f8a0f0c8bad8c3c65f8df08e886c1246d636a --- .../systemui/pip/PipTaskOrganizer.java | 35 +++++++++++++++++++ .../pip/phone/PipResizeGestureHandler.java | 5 ++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index dc1b5d70089be..118049d3b9124 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -72,6 +72,7 @@ public class PipTaskOrganizer extends ITaskOrganizer.Stub { private static final int MSG_RESIZE_ANIMATE = 2; private static final int MSG_OFFSET_ANIMATE = 3; private static final int MSG_FINISH_RESIZE = 4; + private static final int MSG_RESIZE_USER = 5; private final Handler mMainHandler; private final Handler mUpdateHandler; @@ -164,6 +165,12 @@ public class PipTaskOrganizer extends ITaskOrganizer.Stub { } break; } + case MSG_RESIZE_USER: { + Rect startBounds = (Rect) args.arg2; + Rect toBounds = (Rect) args.arg3; + userResizePip(startBounds, toBounds); + break; + } } args.recycle(); return true; @@ -323,6 +330,19 @@ public class PipTaskOrganizer extends ITaskOrganizer.Stub { mUpdateHandler.sendMessage(mUpdateHandler.obtainMessage(MSG_RESIZE_IMMEDIATE, args)); } + /** + * Directly perform a scaled matrix transformation on the leash. This will not perform any + * {@link WindowContainerTransaction} until {@link #scheduleFinishResizePip} is called. + */ + public void scheduleUserResizePip(Rect startBounds, Rect toBounds, + Consumer updateBoundsCallback) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = updateBoundsCallback; + args.arg2 = startBounds; + args.arg3 = toBounds; + mUpdateHandler.sendMessage(mUpdateHandler.obtainMessage(MSG_RESIZE_USER, args)); + } + /** * Finish an intermediate resize operation. This is expected to be called after * {@link #scheduleResizePip}. @@ -395,6 +415,21 @@ public class PipTaskOrganizer extends ITaskOrganizer.Stub { tx.apply(); } + private void userResizePip(Rect startBounds, Rect destinationBounds) { + if (Looper.myLooper() != mUpdateHandler.getLooper()) { + throw new RuntimeException("Callers should call scheduleUserResizePip() instead of " + + "this directly"); + } + // Could happen when dismissPip + if (mToken == null || mLeash == null) { + Log.w(TAG, "Abort animation, invalid leash"); + return; + } + final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); + mSurfaceTransactionHelper.scale(tx, mLeash, startBounds, destinationBounds); + tx.apply(); + } + private void finishResize(SurfaceControl.Transaction tx, Rect destinationBounds, @PipAnimationController.TransitionDirection int direction) { if (Looper.myLooper() != mUpdateHandler.getLooper()) { diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java index 25acce678594c..014f3b51b4dca 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipResizeGestureHandler.java @@ -66,6 +66,7 @@ public class PipResizeGestureHandler { private final Point mMaxSize = new Point(); private final Point mMinSize = new Point(); private final Rect mLastResizeBounds = new Rect(); + private final Rect mLastDownBounds = new Rect(); private final Rect mTmpBounds = new Rect(); private final int mDelta; @@ -192,6 +193,7 @@ public class PipResizeGestureHandler { mAllowGesture = isWithinTouchRegion((int) ev.getX(), (int) ev.getY()); if (mAllowGesture) { mDownPoint.set(ev.getX(), ev.getY()); + mLastDownBounds.set(mMotionHelper.getBounds()); } } else if (mAllowGesture) { @@ -208,7 +210,8 @@ public class PipResizeGestureHandler { mDownPoint.x, mDownPoint.y, currentPipBounds, mCtrlType, mMinSize.x, mMinSize.y, mMaxSize, true, true)); mPipBoundsHandler.transformBoundsToAspectRatio(mLastResizeBounds); - mPipTaskOrganizer.scheduleResizePip(mLastResizeBounds, null); + mPipTaskOrganizer.scheduleUserResizePip(mLastDownBounds, mLastResizeBounds, + null); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: