Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ec8620a authored by Jorge Gil's avatar Jorge Gil Committed by Android (Google) Code Review
Browse files

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

parents 0bdcf9b9 de49b9c6
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -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
+7 −1
Original line number Diff line number Diff line
@@ -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 {
+4 −0
Original line number Diff line number Diff line
@@ -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);
+6 −2
Original line number Diff line number Diff line
@@ -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
+3 −1
Original line number Diff line number Diff line
@@ -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