Merge "Remove caption when keyguard is visible" into udc-qpr-dev am: 2e4f665635
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23924914 Change-Id: I88806207e02f04dd8bd6b6681058d992cbc4e7db Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user