Merge "Account for OHM offset during PIP drag corner resize" into sc-dev

This commit is contained in:
Jorge Gil
2021-03-30 23:07:58 +00:00
committed by Android (Google) Code Review
5 changed files with 45 additions and 8 deletions

View File

@@ -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.common.ExecutorUtils.executeRemoteCallWithTaskPermission;
import static com.android.wm.shell.pip.PipAnimationController.isOutPipDirection; import static com.android.wm.shell.pip.PipAnimationController.isOutPipDirection;
import android.Manifest;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.ActivityTaskManager; import android.app.ActivityTaskManager;
import android.app.PictureInPictureParams; 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.DisplayChangeController;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayLayout; 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.RemoteCallable;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerCallback;
import com.android.wm.shell.common.TaskStackListenerImpl; 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.IPip;
import com.android.wm.shell.pip.IPipAnimationListener; import com.android.wm.shell.pip.IPipAnimationListener;
import com.android.wm.shell.pip.PinnedStackListenerForwarder; import com.android.wm.shell.pip.PinnedStackListenerForwarder;
@@ -74,6 +74,7 @@ import com.android.wm.shell.pip.PipUtils;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
/** /**
@@ -94,6 +95,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
private PipBoundsState mPipBoundsState; private PipBoundsState mPipBoundsState;
private PipTouchHandler mTouchHandler; private PipTouchHandler mTouchHandler;
private PipTransitionController mPipTransitionController; private PipTransitionController mPipTransitionController;
private Optional<OneHandedController> mOneHandedController;
protected final PipImpl mImpl; protected final PipImpl mImpl;
private final Rect mTmpInsetBounds = new Rect(); private final Rect mTmpInsetBounds = new Rect();
@@ -239,7 +241,9 @@ public class PipController implements PipTransitionController.PipTransitionCallb
PhonePipMenuController phonePipMenuController, PipTaskOrganizer pipTaskOrganizer, PhonePipMenuController phonePipMenuController, PipTaskOrganizer pipTaskOrganizer,
PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController, PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController,
WindowManagerShellWrapper windowManagerShellWrapper, WindowManagerShellWrapper windowManagerShellWrapper,
TaskStackListenerImpl taskStackListener, ShellExecutor mainExecutor) { TaskStackListenerImpl taskStackListener,
Optional<OneHandedController> oneHandedController,
ShellExecutor mainExecutor) {
if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) { if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
Slog.w(TAG, "Device doesn't support Pip feature"); Slog.w(TAG, "Device doesn't support Pip feature");
return null; return null;
@@ -248,7 +252,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
return new PipController(context, displayController, pipAppOpsListener, pipBoundsAlgorithm, return new PipController(context, displayController, pipAppOpsListener, pipBoundsAlgorithm,
pipBoundsState, pipMediaController, phonePipMenuController, pipTaskOrganizer, pipBoundsState, pipMediaController, phonePipMenuController, pipTaskOrganizer,
pipTouchHandler, pipTransitionController, windowManagerShellWrapper, pipTouchHandler, pipTransitionController, windowManagerShellWrapper,
taskStackListener, mainExecutor) taskStackListener, oneHandedController, mainExecutor)
.mImpl; .mImpl;
} }
@@ -264,6 +268,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
PipTransitionController pipTransitionController, PipTransitionController pipTransitionController,
WindowManagerShellWrapper windowManagerShellWrapper, WindowManagerShellWrapper windowManagerShellWrapper,
TaskStackListenerImpl taskStackListener, TaskStackListenerImpl taskStackListener,
Optional<OneHandedController> oneHandedController,
ShellExecutor mainExecutor ShellExecutor mainExecutor
) { ) {
// Ensure that we are the primary user's SystemUI. // Ensure that we are the primary user's SystemUI.
@@ -284,6 +289,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
mMenuController = phonePipMenuController; mMenuController = phonePipMenuController;
mTouchHandler = pipTouchHandler; mTouchHandler = pipTouchHandler;
mAppOpsListener = pipAppOpsListener; mAppOpsListener = pipAppOpsListener;
mOneHandedController = oneHandedController;
mPipTransitionController = pipTransitionController; mPipTransitionController = pipTransitionController;
mPipInputConsumer = new PipInputConsumer(WindowManagerGlobal.getWindowManagerService(), mPipInputConsumer = new PipInputConsumer(WindowManagerGlobal.getWindowManagerService(),
INPUT_CONSUMER_PIP, mainExecutor); INPUT_CONSUMER_PIP, mainExecutor);
@@ -374,6 +380,21 @@ public class PipController implements PipTransitionController.PipTransitionCallb
clearedTask /* skipAnimation */); 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 @Override

View File

@@ -117,6 +117,7 @@ public class PipResizeGestureHandler {
private InputEventReceiver mInputEventReceiver; private InputEventReceiver mInputEventReceiver;
private int mCtrlType; private int mCtrlType;
private int mOhmOffset;
public PipResizeGestureHandler(Context context, PipBoundsAlgorithm pipBoundsAlgorithm, public PipResizeGestureHandler(Context context, PipBoundsAlgorithm pipBoundsAlgorithm,
PipBoundsState pipBoundsState, PipMotionHelper motionHelper, PipBoundsState pipBoundsState, PipMotionHelper motionHelper,
@@ -520,7 +521,7 @@ public class PipResizeGestureHandler {
private void onDragCornerResize(MotionEvent ev) { private void onDragCornerResize(MotionEvent ev) {
int action = ev.getActionMasked(); int action = ev.getActionMasked();
float x = ev.getX(); float x = ev.getX();
float y = ev.getY(); float y = ev.getY() - mOhmOffset;
if (action == MotionEvent.ACTION_DOWN) { if (action == MotionEvent.ACTION_DOWN) {
final Rect currentPipBounds = mPipBoundsState.getBounds(); final Rect currentPipBounds = mPipBoundsState.getBounds();
mLastResizeBounds.setEmpty(); mLastResizeBounds.setEmpty();
@@ -637,6 +638,10 @@ public class PipResizeGestureHandler {
mMinSize.set(minX, minY); mMinSize.set(minX, minY);
} }
void setOhmOffset(int offset) {
mOhmOffset = offset;
}
public void dump(PrintWriter pw, String prefix) { public void dump(PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " "; final String innerPrefix = prefix + " ";
pw.println(prefix + TAG); pw.println(prefix + TAG);
@@ -645,6 +650,7 @@ public class PipResizeGestureHandler {
pw.println(innerPrefix + "mIsEnabled=" + mIsEnabled); pw.println(innerPrefix + "mIsEnabled=" + mIsEnabled);
pw.println(innerPrefix + "mEnablePinchResize=" + mEnablePinchResize); pw.println(innerPrefix + "mEnablePinchResize=" + mEnablePinchResize);
pw.println(innerPrefix + "mThresholdCrossed=" + mThresholdCrossed); pw.println(innerPrefix + "mThresholdCrossed=" + mThresholdCrossed);
pw.println(innerPrefix + "mOhmOffset=" + mOhmOffset);
} }
class PipResizeInputEventReceiver extends BatchedInputEventReceiver { class PipResizeInputEventReceiver extends BatchedInputEventReceiver {

View File

@@ -1013,6 +1013,10 @@ public class PipTouchHandler {
: mPipBoundsState.getBounds(); : mPipBoundsState.getBounds();
} }
void setOhmOffset(int offset) {
mPipResizeGestureHandler.setOhmOffset(offset);
}
public void dump(PrintWriter pw, String prefix) { public void dump(PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " "; final String innerPrefix = prefix + " ";
pw.println(prefix + TAG); pw.println(prefix + TAG);

View File

@@ -42,6 +42,7 @@ import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.TaskStackListenerImpl; 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.PipBoundsAlgorithm;
import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipBoundsState;
import com.android.wm.shell.pip.PipMediaController; import com.android.wm.shell.pip.PipMediaController;
@@ -54,6 +55,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.Optional;
/** /**
* Unit tests for {@link PipController} * Unit tests for {@link PipController}
*/ */
@@ -75,6 +78,7 @@ public class PipControllerTest extends ShellTestCase {
@Mock private PipBoundsState mMockPipBoundsState; @Mock private PipBoundsState mMockPipBoundsState;
@Mock private TaskStackListenerImpl mMockTaskStackListener; @Mock private TaskStackListenerImpl mMockTaskStackListener;
@Mock private ShellExecutor mMockExecutor; @Mock private ShellExecutor mMockExecutor;
@Mock private Optional<OneHandedController> mMockOneHandedController;
@Before @Before
public void setUp() throws RemoteException { public void setUp() throws RemoteException {
@@ -83,7 +87,7 @@ public class PipControllerTest extends ShellTestCase {
mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState, mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState,
mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer,
mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper, mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper,
mMockTaskStackListener, mMockExecutor); mMockTaskStackListener, mMockOneHandedController, mMockExecutor);
doAnswer(invocation -> { doAnswer(invocation -> {
((Runnable) invocation.getArgument(0)).run(); ((Runnable) invocation.getArgument(0)).run();
return null; return null;
@@ -116,7 +120,7 @@ public class PipControllerTest extends ShellTestCase {
mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState, mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState,
mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer, mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer,
mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper, mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper,
mMockTaskStackListener, mMockExecutor)); mMockTaskStackListener, mMockOneHandedController, mMockExecutor));
} }
@Test @Test

View File

@@ -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.ChoreographerSfVsync;
import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; 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.Pip;
import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipAnimationController;
import com.android.wm.shell.pip.PipBoundsAlgorithm; import com.android.wm.shell.pip.PipBoundsAlgorithm;
@@ -123,11 +124,12 @@ public class WMShellModule {
PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController, PipTouchHandler pipTouchHandler, PipTransitionController pipTransitionController,
WindowManagerShellWrapper windowManagerShellWrapper, WindowManagerShellWrapper windowManagerShellWrapper,
TaskStackListenerImpl taskStackListener, TaskStackListenerImpl taskStackListener,
Optional<OneHandedController> oneHandedController,
@ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor) {
return Optional.ofNullable(PipController.create(context, displayController, return Optional.ofNullable(PipController.create(context, displayController,
pipAppOpsListener, pipBoundsAlgorithm, pipBoundsState, pipMediaController, pipAppOpsListener, pipBoundsAlgorithm, pipBoundsState, pipMediaController,
phonePipMenuController, pipTaskOrganizer, pipTouchHandler, pipTransitionController, phonePipMenuController, pipTaskOrganizer, pipTouchHandler, pipTransitionController,
windowManagerShellWrapper, taskStackListener, mainExecutor)); windowManagerShellWrapper, taskStackListener, oneHandedController, mainExecutor));
} }
@WMSingleton @WMSingleton