Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +25 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; /** Loading @@ -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(); Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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. Loading @@ -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); Loading Loading @@ -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 Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java +7 −1 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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(); Loading Loading @@ -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); Loading @@ -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 { Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java +4 −0 Original line number Diff line number Diff line Loading @@ -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); Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java +6 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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} */ Loading @@ -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 { Loading @@ -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; Loading Loading @@ -116,7 +120,7 @@ public class PipControllerTest extends ShellTestCase { mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState, mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper, mMockTaskStackListener, mMockExecutor)); mMockTaskStackListener, mMockOneHandedController, mMockExecutor)); } @Test Loading packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -123,11 +124,12 @@ public class WMShellModule { PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController, WindowManagerShellWrapper windowManagerShellWrapper, TaskStackListenerImpl taskStackListener, Optional<OneHandedController> 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 Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +25 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; /** Loading @@ -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(); Loading Loading @@ -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; Loading @@ -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; } Loading @@ -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. Loading @@ -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); Loading Loading @@ -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 Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java +7 −1 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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(); Loading Loading @@ -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); Loading @@ -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 { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java +4 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java +6 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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} */ Loading @@ -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 { Loading @@ -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; Loading Loading @@ -116,7 +120,7 @@ public class PipControllerTest extends ShellTestCase { mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState, mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper, mMockTaskStackListener, mMockExecutor)); mMockTaskStackListener, mMockOneHandedController, mMockExecutor)); } @Test Loading
packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -123,11 +124,12 @@ public class WMShellModule { PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController, WindowManagerShellWrapper windowManagerShellWrapper, TaskStackListenerImpl taskStackListener, Optional<OneHandedController> 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 Loading