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

Commit 2e4f6656 authored by Maryam Dehaini's avatar Maryam Dehaini Committed by Android (Google) Code Review
Browse files

Merge "Remove caption when keyguard is visible" into udc-qpr-dev

parents bd019a86 b2e2789f
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -203,8 +203,10 @@ public abstract class WMShellModule {
            Context context,
            Context context,
            @ShellMainThread Handler mainHandler,
            @ShellMainThread Handler mainHandler,
            @ShellMainThread Choreographer mainChoreographer,
            @ShellMainThread Choreographer mainChoreographer,
            ShellInit shellInit,
            ShellTaskOrganizer taskOrganizer,
            ShellTaskOrganizer taskOrganizer,
            DisplayController displayController,
            DisplayController displayController,
            ShellController shellController,
            SyncTransactionQueue syncQueue,
            SyncTransactionQueue syncQueue,
            Transitions transitions,
            Transitions transitions,
            Optional<DesktopModeController> desktopModeController,
            Optional<DesktopModeController> desktopModeController,
@@ -214,8 +216,10 @@ public abstract class WMShellModule {
                    context,
                    context,
                    mainHandler,
                    mainHandler,
                    mainChoreographer,
                    mainChoreographer,
                    shellInit,
                    taskOrganizer,
                    taskOrganizer,
                    displayController,
                    displayController,
                    shellController,
                    syncQueue,
                    syncQueue,
                    transitions,
                    transitions,
                    desktopModeController,
                    desktopModeController,
+45 −3
Original line number Original line Diff line number Diff line
@@ -72,6 +72,9 @@ import com.android.wm.shell.desktopmode.DesktopModeStatus;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.freeform.FreeformTaskTransitionStarter;
import com.android.wm.shell.freeform.FreeformTaskTransitionStarter;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.sysui.KeyguardChangeListener;
import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration.TaskCornersListener;
import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration.TaskCornersListener;


@@ -89,6 +92,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
    private final DesktopModeWindowDecoration.Factory mDesktopModeWindowDecorFactory;
    private final DesktopModeWindowDecoration.Factory mDesktopModeWindowDecorFactory;
    private final ActivityTaskManager mActivityTaskManager;
    private final ActivityTaskManager mActivityTaskManager;
    private final ShellTaskOrganizer mTaskOrganizer;
    private final ShellTaskOrganizer mTaskOrganizer;
    private final ShellController mShellController;
    private final Context mContext;
    private final Context mContext;
    private final Handler mMainHandler;
    private final Handler mMainHandler;
    private final Choreographer mMainChoreographer;
    private final Choreographer mMainChoreographer;
@@ -114,30 +118,37 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {


    private MoveToDesktopAnimator mMoveToDesktopAnimator;
    private MoveToDesktopAnimator mMoveToDesktopAnimator;
    private final Rect mDragToDesktopAnimationStartBounds = new Rect();
    private final Rect mDragToDesktopAnimationStartBounds = new Rect();
    private final DesktopModeKeyguardChangeListener mDesktopModeKeyguardChangeListener;


    public DesktopModeWindowDecorViewModel(
    public DesktopModeWindowDecorViewModel(
            Context context,
            Context context,
            Handler mainHandler,
            Handler mainHandler,
            Choreographer mainChoreographer,
            Choreographer mainChoreographer,
            ShellInit shellInit,
            ShellTaskOrganizer taskOrganizer,
            ShellTaskOrganizer taskOrganizer,
            DisplayController displayController,
            DisplayController displayController,
            ShellController shellController,
            SyncTransactionQueue syncQueue,
            SyncTransactionQueue syncQueue,
            Transitions transitions,
            Transitions transitions,
            Optional<DesktopModeController> desktopModeController,
            Optional<DesktopModeController> desktopModeController,
            Optional<DesktopTasksController> desktopTasksController) {
            Optional<DesktopTasksController> desktopTasksController
    ) {
        this(
        this(
                context,
                context,
                mainHandler,
                mainHandler,
                mainChoreographer,
                mainChoreographer,
                shellInit,
                taskOrganizer,
                taskOrganizer,
                displayController,
                displayController,
                shellController,
                syncQueue,
                syncQueue,
                transitions,
                transitions,
                desktopModeController,
                desktopModeController,
                desktopTasksController,
                desktopTasksController,
                new DesktopModeWindowDecoration.Factory(),
                new DesktopModeWindowDecoration.Factory(),
                new InputMonitorFactory(),
                new InputMonitorFactory(),
                SurfaceControl.Transaction::new);
                SurfaceControl.Transaction::new,
                new DesktopModeKeyguardChangeListener());
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -145,20 +156,24 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
            Context context,
            Context context,
            Handler mainHandler,
            Handler mainHandler,
            Choreographer mainChoreographer,
            Choreographer mainChoreographer,
            ShellInit shellInit,
            ShellTaskOrganizer taskOrganizer,
            ShellTaskOrganizer taskOrganizer,
            DisplayController displayController,
            DisplayController displayController,
            ShellController shellController,
            SyncTransactionQueue syncQueue,
            SyncTransactionQueue syncQueue,
            Transitions transitions,
            Transitions transitions,
            Optional<DesktopModeController> desktopModeController,
            Optional<DesktopModeController> desktopModeController,
            Optional<DesktopTasksController> desktopTasksController,
            Optional<DesktopTasksController> desktopTasksController,
            DesktopModeWindowDecoration.Factory desktopModeWindowDecorFactory,
            DesktopModeWindowDecoration.Factory desktopModeWindowDecorFactory,
            InputMonitorFactory inputMonitorFactory,
            InputMonitorFactory inputMonitorFactory,
            Supplier<SurfaceControl.Transaction> transactionFactory) {
            Supplier<SurfaceControl.Transaction> transactionFactory,
            DesktopModeKeyguardChangeListener desktopModeKeyguardChangeListener) {
        mContext = context;
        mContext = context;
        mMainHandler = mainHandler;
        mMainHandler = mainHandler;
        mMainChoreographer = mainChoreographer;
        mMainChoreographer = mainChoreographer;
        mActivityTaskManager = mContext.getSystemService(ActivityTaskManager.class);
        mActivityTaskManager = mContext.getSystemService(ActivityTaskManager.class);
        mTaskOrganizer = taskOrganizer;
        mTaskOrganizer = taskOrganizer;
        mShellController = shellController;
        mDisplayController = displayController;
        mDisplayController = displayController;
        mSyncQueue = syncQueue;
        mSyncQueue = syncQueue;
        mTransitions = transitions;
        mTransitions = transitions;
@@ -168,6 +183,13 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
        mDesktopModeWindowDecorFactory = desktopModeWindowDecorFactory;
        mDesktopModeWindowDecorFactory = desktopModeWindowDecorFactory;
        mInputMonitorFactory = inputMonitorFactory;
        mInputMonitorFactory = inputMonitorFactory;
        mTransactionFactory = transactionFactory;
        mTransactionFactory = transactionFactory;
        mDesktopModeKeyguardChangeListener = desktopModeKeyguardChangeListener;

        shellInit.addInitCallback(this::onInit, this);
    }

    private void onInit() {
        mShellController.addKeyguardChangeListener(mDesktopModeKeyguardChangeListener);
    }
    }


    @Override
    @Override
@@ -796,6 +818,10 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
                && mSplitScreenController.isTaskRootOrStageRoot(taskInfo.taskId)) {
                && mSplitScreenController.isTaskRootOrStageRoot(taskInfo.taskId)) {
            return false;
            return false;
        }
        }
        if (mDesktopModeKeyguardChangeListener.isKeyguardVisibleAndOccluded()
                && taskInfo.isFocused) {
            return false;
        }
        return DesktopModeStatus.isProto2Enabled()
        return DesktopModeStatus.isProto2Enabled()
                && taskInfo.getWindowingMode() != WINDOWING_MODE_PINNED
                && taskInfo.getWindowingMode() != WINDOWING_MODE_PINNED
                && taskInfo.getActivityType() == ACTIVITY_TYPE_STANDARD
                && taskInfo.getActivityType() == ACTIVITY_TYPE_STANDARD
@@ -884,6 +910,22 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel {
            mDesktopTasksController.ifPresent(d -> d.removeCornersForTask(taskId));
            mDesktopTasksController.ifPresent(d -> d.removeCornersForTask(taskId));
        }
        }
    }
    }

    static class DesktopModeKeyguardChangeListener implements KeyguardChangeListener {
        private boolean mIsKeyguardVisible;
        private boolean mIsKeyguardOccluded;

        @Override
        public void onKeyguardVisibilityChanged(boolean visible, boolean occluded,
                boolean animatingDismiss) {
            mIsKeyguardVisible = visible;
            mIsKeyguardOccluded = occluded;
        }

        public boolean isKeyguardVisibleAndOccluded() {
            return mIsKeyguardVisible && mIsKeyguardOccluded;
        }
    }
}
}


+40 −1
Original line number Original line Diff line number Diff line
@@ -18,12 +18,15 @@ package com.android.wm.shell.windowdecor;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;


import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;
@@ -53,6 +56,8 @@ import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.desktopmode.DesktopModeController;
import com.android.wm.shell.desktopmode.DesktopModeController;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.desktopmode.DesktopTasksController;
import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.transition.Transitions;


import org.junit.Before;
import org.junit.Before;
@@ -91,6 +96,10 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
    @Mock private Supplier<SurfaceControl.Transaction> mTransactionFactory;
    @Mock private Supplier<SurfaceControl.Transaction> mTransactionFactory;
    @Mock private SurfaceControl.Transaction mTransaction;
    @Mock private SurfaceControl.Transaction mTransaction;
    @Mock private Display mDisplay;
    @Mock private Display mDisplay;
    @Mock private ShellController mShellController;
    @Mock private ShellInit mShellInit;
    @Mock private DesktopModeWindowDecorViewModel.DesktopModeKeyguardChangeListener
            mDesktopModeKeyguardChangeListener;
    private final List<InputManager> mMockInputManagers = new ArrayList<>();
    private final List<InputManager> mMockInputManagers = new ArrayList<>();


    private DesktopModeWindowDecorViewModel mDesktopModeWindowDecorViewModel;
    private DesktopModeWindowDecorViewModel mDesktopModeWindowDecorViewModel;
@@ -104,15 +113,18 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
                mContext,
                mContext,
                mMainHandler,
                mMainHandler,
                mMainChoreographer,
                mMainChoreographer,
                mShellInit,
                mTaskOrganizer,
                mTaskOrganizer,
                mDisplayController,
                mDisplayController,
                mShellController,
                mSyncQueue,
                mSyncQueue,
                mTransitions,
                mTransitions,
                Optional.of(mDesktopModeController),
                Optional.of(mDesktopModeController),
                Optional.of(mDesktopTasksController),
                Optional.of(mDesktopTasksController),
                mDesktopModeWindowDecorFactory,
                mDesktopModeWindowDecorFactory,
                mMockInputMonitorFactory,
                mMockInputMonitorFactory,
                mTransactionFactory
                mTransactionFactory,
                mDesktopModeKeyguardChangeListener
            );
            );


        doReturn(mDesktopModeWindowDecoration)
        doReturn(mDesktopModeWindowDecoration)
@@ -121,6 +133,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
        doReturn(mTransaction).when(mTransactionFactory).get();
        doReturn(mTransaction).when(mTransactionFactory).get();
        doReturn(mDisplayLayout).when(mDisplayController).getDisplayLayout(anyInt());
        doReturn(mDisplayLayout).when(mDisplayController).getDisplayLayout(anyInt());
        doReturn(STABLE_INSETS).when(mDisplayLayout).stableInsets();
        doReturn(STABLE_INSETS).when(mDisplayLayout).stableInsets();
        doNothing().when(mShellController).addKeyguardChangeListener(any());


        when(mMockInputMonitorFactory.create(any(), any())).thenReturn(mInputMonitor);
        when(mMockInputMonitorFactory.create(any(), any())).thenReturn(mInputMonitor);
        // InputChannel cannot be mocked because it passes to InputEventReceiver.
        // InputChannel cannot be mocked because it passes to InputEventReceiver.
@@ -255,6 +268,32 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
        verify(mInputMonitor, times(1)).dispose();
        verify(mInputMonitor, times(1)).dispose();
    }
    }


    @Test
    public void testCaptionIsNotCreatedWhenKeyguardIsVisible() throws Exception {
        doReturn(true).when(
                mDesktopModeKeyguardChangeListener).isKeyguardVisibleAndOccluded();

        final int taskId = 1;
        final ActivityManager.RunningTaskInfo taskInfo =
                createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_FULLSCREEN);
        taskInfo.isFocused = true;
        SurfaceControl surfaceControl = mock(SurfaceControl.class);
        runOnMainThread(() -> {
            final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
            final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);

            mDesktopModeWindowDecorViewModel.onTaskOpening(
                    taskInfo, surfaceControl, startT, finishT);

            taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_UNDEFINED);
            taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED);
            mDesktopModeWindowDecorViewModel.onTaskChanging(
                    taskInfo, surfaceControl, startT, finishT);
        });
        verify(mDesktopModeWindowDecorFactory, never())
                .create(any(), any(), any(), any(), any(), any(), any(), any());
    }

    private void runOnMainThread(Runnable r) throws Exception {
    private void runOnMainThread(Runnable r) throws Exception {
        final Handler mainHandler = new Handler(Looper.getMainLooper());
        final Handler mainHandler = new Handler(Looper.getMainLooper());
        final CountDownLatch latch = new CountDownLatch(1);
        final CountDownLatch latch = new CountDownLatch(1);