diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index 9b67d8020c320..dfd5d2fecd384 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -413,6 +413,8 @@ public class PipTouchHandler { break; } case MotionEvent.ACTION_HOVER_ENTER: + mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), + mMovementBounds, false /* allowMenuTimeout */, false /* willResizeMenu */); case MotionEvent.ACTION_HOVER_MOVE: { if (!shouldDeliverToMenu && !mSendingHoverAccessibilityEvents) { sendAccessibilityHoverEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER); @@ -421,6 +423,7 @@ public class PipTouchHandler { break; } case MotionEvent.ACTION_HOVER_EXIT: { + mMenuController.hideMenu(); if (!shouldDeliverToMenu && mSendingHoverAccessibilityEvents) { sendAccessibilityHoverEvent(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); mSendingHoverAccessibilityEvents = false; @@ -538,9 +541,6 @@ public class PipTouchHandler { mSavedSnapFraction = -1f; } } else { - // If resizing is not allowed, then the PiP should be frozen until the transition - // ends as well - setTouchEnabled(false); mSavedSnapFraction = -1f; } } @@ -714,6 +714,8 @@ public class PipTouchHandler { } } else if (mTouchState.isDoubleTap()) { // Expand to fullscreen if this is a double tap + // the PiP should be frozen until the transition ends + setTouchEnabled(false); mMotionHelper.expandPip(); } else if (mMenuState != MENU_STATE_FULL) { if (!mTouchState.isWaitingForDoubleTap()) { diff --git a/services/core/java/com/android/server/wm/InputConsumerImpl.java b/services/core/java/com/android/server/wm/InputConsumerImpl.java index c6183de38c29c..a9a9df8458e26 100644 --- a/services/core/java/com/android/server/wm/InputConsumerImpl.java +++ b/services/core/java/com/android/server/wm/InputConsumerImpl.java @@ -149,6 +149,10 @@ class InputConsumerImpl implements IBinder.DeathRecipient { t.setLayer(mInputSurface, layer); } + void reparent(SurfaceControl.Transaction t, WindowContainer wc) { + t.reparent(mInputSurface, wc.getSurfaceControl()); + } + void disposeChannelsLw() { mService.mInputManager.unregisterInputChannel(mServerChannel); mClientChannel.dispose(); diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index b638e4937b34a..e2c7d52fa6732 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -511,14 +511,13 @@ final class InputMonitor { if (w.inPinnedWindowingMode()) { if (mAddPipInputConsumerHandle) { - // Update the bounds of the Pip input consumer to match the window bounds. - w.getBounds(mTmpRect); - mPipInputConsumer.layout(mInputTransaction, mTmpRect); - // The touchable region is relative to the surface top-left - mTmpRect.offsetTo(0, 0); - mPipInputConsumer.mWindowHandle.touchableRegion.set(mTmpRect); - mPipInputConsumer.show(mInputTransaction, w); + final Task rootTask = w.getTask().getRootTask(); + mPipInputConsumer.mWindowHandle.replaceTouchableRegionWithCrop( + rootTask.getSurfaceControl()); + // We set the layer to z=MAX-1 so that it's always on top. + mPipInputConsumer.reparent(mInputTransaction, rootTask); + mPipInputConsumer.show(mInputTransaction, Integer.MAX_VALUE - 1); mAddPipInputConsumerHandle = false; } }