diff options
5 files changed, 40 insertions, 25 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java index d277eef761e9..d31476c63890 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java @@ -925,8 +925,19 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { if (toHome) wct.reorder(mRecentsTask, true /* toTop */); else wct.restoreTransientOrder(mRecentsTask); } - if (!toHome && !mWillFinishToHome && mPausingTasks != null && mState == STATE_NORMAL) { - ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, " returning to app"); + if (!toHome + // If a recents gesture starts on the 3p launcher, then the 3p launcher is the + // live tile (pausing app). If the gesture is "cancelled" we need to return to + // 3p launcher instead of "task-switching" away from it. + && (!mWillFinishToHome || mPausingSeparateHome) + && mPausingTasks != null && mState == STATE_NORMAL) { + if (mPausingSeparateHome) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, + " returning to 3p home"); + } else { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, + " returning to app"); + } // The gesture is returning to the pausing-task(s) rather than continuing with // recents, so end the transition by moving the app back to the top (and also // re-showing it's task). @@ -958,15 +969,6 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { wct.restoreTransientOrder(mRecentsTask); } } else { - if (mPausingSeparateHome) { - if (mOpeningTasks.isEmpty()) { - ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, - " recents occluded 3p home"); - } else { - ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, - " switch task by recents on 3p home"); - } - } ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, " normal finish"); // The general case: committing to recents, going home, or switching tasks. for (int i = 0; i < mOpeningTasks.size(); ++i) { diff --git a/services/core/java/com/android/server/wm/InputConsumerImpl.java b/services/core/java/com/android/server/wm/InputConsumerImpl.java index c21930dab5eb..1fa7d2a2aa13 100644 --- a/services/core/java/com/android/server/wm/InputConsumerImpl.java +++ b/services/core/java/com/android/server/wm/InputConsumerImpl.java @@ -51,7 +51,8 @@ class InputConsumerImpl implements IBinder.DeathRecipient { private final Rect mOldWindowCrop = new Rect(); InputConsumerImpl(WindowManagerService service, IBinder token, String name, - InputChannel inputChannel, int clientPid, UserHandle clientUser, int displayId) { + InputChannel inputChannel, int clientPid, UserHandle clientUser, int displayId, + SurfaceControl.Transaction t) { mService = service; mToken = token; mName = name; @@ -82,6 +83,7 @@ class InputConsumerImpl implements IBinder.DeathRecipient { .setName("Input Consumer " + name) .setCallsite("InputConsumerImpl") .build(); + mWindowHandle.setTrustedOverlay(t, mInputSurface, true); } void linkToDeathRecipient() { @@ -129,14 +131,12 @@ class InputConsumerImpl implements IBinder.DeathRecipient { void show(SurfaceControl.Transaction t, WindowContainer w) { t.show(mInputSurface); - mWindowHandle.setTrustedOverlay(t, mInputSurface, true); t.setInputWindowInfo(mInputSurface, mWindowHandle); t.setRelativeLayer(mInputSurface, w.getSurfaceControl(), 1); } void show(SurfaceControl.Transaction t, int layer) { t.show(mInputSurface); - mWindowHandle.setTrustedOverlay(t, mInputSurface, true); t.setInputWindowInfo(mInputSurface, mWindowHandle); t.setLayer(mInputSurface, layer); } diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index af307ec3c2a9..5c0bc28779a8 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -224,7 +224,7 @@ final class InputMonitor { } final InputConsumerImpl consumer = new InputConsumerImpl(mService, token, name, - inputChannel, clientPid, clientUser, mDisplayId); + inputChannel, clientPid, clientUser, mDisplayId, mInputTransaction); switch (name) { case INPUT_CONSUMER_WALLPAPER: consumer.mWindowHandle.inputConfig |= InputConfig.DUPLICATE_TOUCH_TO_WALLPAPER; @@ -675,11 +675,6 @@ final class InputMonitor { w.getKeyInterceptionInfo()); if (w.mWinAnimator.hasSurface()) { - // Update trusted overlay changes here because they are tied to input info. Input - // changes can be updated even if surfaces aren't. - inputWindowHandle.setTrustedOverlay(mInputTransaction, - w.mWinAnimator.mSurfaceController.mSurfaceControl, - w.isWindowTrustedOverlay()); populateInputWindowHandle(inputWindowHandle, w); setInputWindowInfoIfNeeded(mInputTransaction, w.mWinAnimator.mSurfaceController.mSurfaceControl, inputWindowHandle); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index f339d249e272..9663f3aba7f1 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2261,6 +2261,7 @@ public class WindowManagerService extends IWindowManager.Stub } } + final boolean wasTrustedOverlay = win.isWindowTrustedOverlay(); flagChanges = win.mAttrs.flags ^ attrs.flags; privateFlagChanges = win.mAttrs.privateFlags ^ attrs.privateFlags; attrChanges = win.mAttrs.copyFrom(attrs); @@ -2273,6 +2274,9 @@ public class WindowManagerService extends IWindowManager.Stub if (layoutChanged && win.providesDisplayDecorInsets()) { configChanged = displayPolicy.updateDecorInsetsInfo(); } + if (wasTrustedOverlay != win.isWindowTrustedOverlay()) { + win.updateTrustedOverlay(); + } if (win.mActivityRecord != null && ((flagChanges & FLAG_SHOW_WHEN_LOCKED) != 0 || (flagChanges & FLAG_DISMISS_KEYGUARD) != 0)) { win.mActivityRecord.checkKeyguardFlagsChanged(); @@ -5299,7 +5303,11 @@ public class WindowManagerService extends IWindowManager.Stub public void displayReady() { synchronized (mGlobalLock) { if (mMaxUiWidth > 0) { - mRoot.forAllDisplays(displayContent -> displayContent.setMaxUiWidth(mMaxUiWidth)); + mRoot.forAllDisplays(dc -> { + if (dc.mDisplay.getType() == Display.TYPE_INTERNAL) { + dc.setMaxUiWidth(mMaxUiWidth); + } + }); } applyForcedPropertiesForDefaultDisplay(); mAnimator.ready(); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 726d4d7c34e7..87312a37743d 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1189,7 +1189,20 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } - public boolean isWindowTrustedOverlay() { + @Override + void setInitialSurfaceControlProperties(SurfaceControl.Builder b) { + super.setInitialSurfaceControlProperties(b); + if (surfaceTrustedOverlay() && isWindowTrustedOverlay()) { + getPendingTransaction().setTrustedOverlay(mSurfaceControl, true); + } + } + + void updateTrustedOverlay() { + mInputWindowHandle.setTrustedOverlay(getPendingTransaction(), mSurfaceControl, + isWindowTrustedOverlay()); + } + + boolean isWindowTrustedOverlay() { return InputMonitor.isTrustedOverlay(mAttrs.type) || ((mAttrs.privateFlags & PRIVATE_FLAG_TRUSTED_OVERLAY) != 0 && mSession.mCanAddInternalSystemWindow) @@ -5205,9 +5218,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP updateFrameRateSelectionPriorityIfNeeded(); updateScaleIfNeeded(); mWinAnimator.prepareSurfaceLocked(getSyncTransaction()); - if (surfaceTrustedOverlay()) { - getSyncTransaction().setTrustedOverlay(mSurfaceControl, isWindowTrustedOverlay()); - } } super.prepareSurfaces(); } |