From de49b9c6b97a87f87514f7ce4386d151fcbadc5c Mon Sep 17 00:00:00 2001 From: "jorgegil@google.com" Date: Tue, 23 Mar 2021 14:17:16 -0700 Subject: [PATCH] Account for OHM offset during PIP drag corner resize The InputEventReceiver in PipResizeGestureHandler receives global coordinates in its events (i.e. screen coordinates) that need to be translated into the PIP's window position. Bug: 172839150 Test: enter PIP, enter OHM, drag resize Change-Id: If5aaa8940904046ffc2303574e272601589a1638 --- .../wm/shell/pip/phone/PipController.java | 29 ++++++++++++++++--- .../pip/phone/PipResizeGestureHandler.java | 8 ++++- .../wm/shell/pip/phone/PipTouchHandler.java | 4 +++ .../wm/shell/pip/phone/PipControllerTest.java | 8 +++-- .../systemui/wmshell/WMShellModule.java | 4 ++- 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index debdceb10b637..d75c1d65614dc 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -24,7 +24,6 @@ import static android.view.WindowManager.INPUT_CONSUMER_PIP; import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission; import static com.android.wm.shell.pip.PipAnimationController.isOutPipDirection; -import android.Manifest; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.app.PictureInPictureParams; @@ -55,11 +54,12 @@ import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayChangeController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayLayout; -import com.android.wm.shell.common.ExecutorUtils; import com.android.wm.shell.common.RemoteCallable; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerImpl; +import com.android.wm.shell.onehanded.OneHandedController; +import com.android.wm.shell.onehanded.OneHandedTransitionCallback; import com.android.wm.shell.pip.IPip; import com.android.wm.shell.pip.IPipAnimationListener; import com.android.wm.shell.pip.PinnedStackListenerForwarder; @@ -74,6 +74,7 @@ import com.android.wm.shell.pip.PipUtils; import java.io.PrintWriter; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; /** @@ -94,6 +95,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb private PipBoundsState mPipBoundsState; private PipTouchHandler mTouchHandler; private PipTransitionController mPipTransitionController; + private Optional mOneHandedController; protected final PipImpl mImpl; private final Rect mTmpInsetBounds = new Rect(); @@ -239,7 +241,9 @@ public class PipController implements PipTransitionController.PipTransitionCallb PhonePipMenuController phonePipMenuController, PipTaskOrganizer pipTaskOrganizer, PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController, WindowManagerShellWrapper windowManagerShellWrapper, - TaskStackListenerImpl taskStackListener, ShellExecutor mainExecutor) { + TaskStackListenerImpl taskStackListener, + Optional oneHandedController, + ShellExecutor mainExecutor) { if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) { Slog.w(TAG, "Device doesn't support Pip feature"); return null; @@ -248,7 +252,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb return new PipController(context, displayController, pipAppOpsListener, pipBoundsAlgorithm, pipBoundsState, pipMediaController, phonePipMenuController, pipTaskOrganizer, pipTouchHandler, pipTransitionController, windowManagerShellWrapper, - taskStackListener, mainExecutor) + taskStackListener, oneHandedController, mainExecutor) .mImpl; } @@ -264,6 +268,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb PipTransitionController pipTransitionController, WindowManagerShellWrapper windowManagerShellWrapper, TaskStackListenerImpl taskStackListener, + Optional oneHandedController, ShellExecutor mainExecutor ) { // Ensure that we are the primary user's SystemUI. @@ -284,6 +289,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb mMenuController = phonePipMenuController; mTouchHandler = pipTouchHandler; mAppOpsListener = pipAppOpsListener; + mOneHandedController = oneHandedController; mPipTransitionController = pipTransitionController; mPipInputConsumer = new PipInputConsumer(WindowManagerGlobal.getWindowManagerService(), INPUT_CONSUMER_PIP, mainExecutor); @@ -374,6 +380,21 @@ public class PipController implements PipTransitionController.PipTransitionCallb clearedTask /* skipAnimation */); } }); + + mOneHandedController.ifPresent(controller -> { + controller.asOneHanded().registerTransitionCallback( + new OneHandedTransitionCallback() { + @Override + public void onStartFinished(Rect bounds) { + mTouchHandler.setOhmOffset(bounds.top); + } + + @Override + public void onStopFinished(Rect bounds) { + mTouchHandler.setOhmOffset(bounds.top); + } + }); + }); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java index c726c012c6a0d..d3543b6556ab5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java @@ -117,6 +117,7 @@ public class PipResizeGestureHandler { private InputEventReceiver mInputEventReceiver; private int mCtrlType; + private int mOhmOffset; public PipResizeGestureHandler(Context context, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsState pipBoundsState, PipMotionHelper motionHelper, @@ -520,7 +521,7 @@ public class PipResizeGestureHandler { private void onDragCornerResize(MotionEvent ev) { int action = ev.getActionMasked(); float x = ev.getX(); - float y = ev.getY(); + float y = ev.getY() - mOhmOffset; if (action == MotionEvent.ACTION_DOWN) { final Rect currentPipBounds = mPipBoundsState.getBounds(); mLastResizeBounds.setEmpty(); @@ -637,6 +638,10 @@ public class PipResizeGestureHandler { mMinSize.set(minX, minY); } + void setOhmOffset(int offset) { + mOhmOffset = offset; + } + public void dump(PrintWriter pw, String prefix) { final String innerPrefix = prefix + " "; pw.println(prefix + TAG); @@ -645,6 +650,7 @@ public class PipResizeGestureHandler { pw.println(innerPrefix + "mIsEnabled=" + mIsEnabled); pw.println(innerPrefix + "mEnablePinchResize=" + mEnablePinchResize); pw.println(innerPrefix + "mThresholdCrossed=" + mThresholdCrossed); + pw.println(innerPrefix + "mOhmOffset=" + mOhmOffset); } class PipResizeInputEventReceiver extends BatchedInputEventReceiver { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java index b0a7319dece22..75166b64a7bf8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java @@ -1013,6 +1013,10 @@ public class PipTouchHandler { : mPipBoundsState.getBounds(); } + void setOhmOffset(int offset) { + mPipResizeGestureHandler.setOhmOffset(offset); + } + public void dump(PrintWriter pw, String prefix) { final String innerPrefix = prefix + " "; pw.println(prefix + TAG); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java index f2b4e9761226d..700bf7850604f 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java @@ -42,6 +42,7 @@ import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerImpl; +import com.android.wm.shell.onehanded.OneHandedController; import com.android.wm.shell.pip.PipBoundsAlgorithm; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMediaController; @@ -54,6 +55,8 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.Optional; + /** * Unit tests for {@link PipController} */ @@ -75,6 +78,7 @@ public class PipControllerTest extends ShellTestCase { @Mock private PipBoundsState mMockPipBoundsState; @Mock private TaskStackListenerImpl mMockTaskStackListener; @Mock private ShellExecutor mMockExecutor; + @Mock private Optional mMockOneHandedController; @Before public void setUp() throws RemoteException { @@ -83,7 +87,7 @@ public class PipControllerTest extends ShellTestCase { mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState, mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper, - mMockTaskStackListener, mMockExecutor); + mMockTaskStackListener, mMockOneHandedController, mMockExecutor); doAnswer(invocation -> { ((Runnable) invocation.getArgument(0)).run(); return null; @@ -116,7 +120,7 @@ public class PipControllerTest extends ShellTestCase { mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState, mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper, - mMockTaskStackListener, mMockExecutor)); + mMockTaskStackListener, mMockOneHandedController, mMockExecutor)); } @Test diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java index d5183f85ad135..af94876b1f8ca 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java @@ -37,6 +37,7 @@ import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.common.annotations.ChoreographerSfVsync; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; +import com.android.wm.shell.onehanded.OneHandedController; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipBoundsAlgorithm; @@ -123,11 +124,12 @@ public class WMShellModule { PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController, WindowManagerShellWrapper windowManagerShellWrapper, TaskStackListenerImpl taskStackListener, + Optional oneHandedController, @ShellMainThread ShellExecutor mainExecutor) { return Optional.ofNullable(PipController.create(context, displayController, pipAppOpsListener, pipBoundsAlgorithm, pipBoundsState, pipMediaController, phonePipMenuController, pipTaskOrganizer, pipTouchHandler, pipTransitionController, - windowManagerShellWrapper, taskStackListener, mainExecutor)); + windowManagerShellWrapper, taskStackListener, oneHandedController, mainExecutor)); } @WMSingleton