Merge "Account for OHM offset during PIP drag corner resize" into sc-dev
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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> 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
|
||||
|
||||
Reference in New Issue
Block a user