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

This commit is contained in:
Maryam Dehaini
2023-07-20 17:44:58 +00:00
committed by Android (Google) Code Review
3 changed files with 89 additions and 4 deletions

View File

@@ -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,

View File

@@ -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;
}
}
} }

View File

@@ -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);