Merge "Scale the leash for PIP User-started resizing." into rvc-dev
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
index 195050e..e64a919 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 @@
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 @@
}
break;
}
+ case MSG_RESIZE_USER: {
+ Rect startBounds = (Rect) args.arg2;
+ Rect toBounds = (Rect) args.arg3;
+ userResizePip(startBounds, toBounds);
+ break;
+ }
}
args.recycle();
return true;
@@ -324,6 +331,19 @@
}
/**
+ * 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<Rect> 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 @@
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 25acce6..014f3b5 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 @@
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 @@
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 @@
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: