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.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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user