diff options
| author | 2021-03-23 14:17:16 -0700 | |
|---|---|---|
| committer | 2021-03-24 11:09:52 -0700 | |
| commit | de49b9c6b97a87f87514f7ce4386d151fcbadc5c (patch) | |
| tree | 482a901976243fd30053de2713ccc0e13045c8dd /libs | |
| parent | e463f4c1513683bd648459608013587df7794895 (diff) | |
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
Diffstat (limited to 'libs')
4 files changed, 42 insertions, 7 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 debdceb10b63..d75c1d65614d 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<OneHandedController> 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> 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> 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 c726c012c6a0..d3543b6556ab 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 b0a7319dece2..75166b64a7bf 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 f2b4e9761226..700bf7850604 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<OneHandedController> 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 |