diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 5ec2f839cf2f3..4571cf3952870 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -27,7 +27,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVE import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL; -import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS; import static android.view.WindowManager.LayoutParams.TYPE_DISPLAY_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; @@ -189,14 +188,6 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { */ String getOwningPackage(); - /** - * Retrieve the current LayoutParams of the window. - * - * @return WindowManager.LayoutParams The window's internal LayoutParams - * instance. - */ - public WindowManager.LayoutParams getAttrs(); - /** * Retrieve the type of the top-level window. * @@ -657,26 +648,6 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { */ public boolean isKeyguardHostWindow(WindowManager.LayoutParams attrs); - /** - * @return whether {@param win} can be hidden by Keyguard - */ - default boolean canBeHiddenByKeyguardLw(WindowState win) { - // Keyguard visibility of window from activities are determined over activity visibility. - if (win.getBaseType() == TYPE_BASE_APPLICATION) { - return false; - } - switch (win.getAttrs().type) { - case TYPE_NOTIFICATION_SHADE: - case TYPE_STATUS_BAR: - case TYPE_NAVIGATION_BAR: - case TYPE_WALLPAPER: - return false; - default: - // Hide only windows below the keyguard host window. - return getWindowLayerLw(win) < getWindowLayerFromTypeLw(TYPE_NOTIFICATION_SHADE); - } - } - /** * Create and return an animation to re-display a window that was force hidden by Keyguard. */ diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 3d21afdf567ac..66f58046b72f7 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -4301,7 +4301,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp boolean subtle) { final WindowManagerPolicy policy = mWmService.mPolicy; forAllWindows(w -> { - if (w.mActivityRecord == null && policy.canBeHiddenByKeyguardLw(w) + if (w.mActivityRecord == null && w.canBeHiddenByKeyguard() && w.wouldBeVisibleIfPolicyIgnored() && !w.isVisible()) { w.startAnimation(policy.createHiddenByKeyguardExit( onWallpaper, goingToShade, subtle)); diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 09de6b3ca4fad..6d3e8d55a021b 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -1738,7 +1738,7 @@ public class DisplayPolicy { * @param imeTarget The current IME target window. */ private void applyKeyguardPolicy(WindowState win, WindowState imeTarget) { - if (mService.mPolicy.canBeHiddenByKeyguardLw(win)) { + if (win.canBeHiddenByKeyguard()) { if (shouldBeHiddenByKeyguard(win, imeTarget)) { win.hide(false /* doAnimation */, true /* requestAnim */); } else { @@ -1767,7 +1767,7 @@ public class DisplayPolicy { // Show IME over the keyguard if the target allows it. final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisible() && win.mIsImWindow && (imeTarget.canShowWhenLocked() - || !mService.mPolicy.canBeHiddenByKeyguardLw(imeTarget)); + || !imeTarget.canBeHiddenByKeyguard()); if (showImeOverKeyguard) { return false; } diff --git a/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java b/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java index 7c35a2163d6dc..49d30cd27c3e9 100644 --- a/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java @@ -108,7 +108,7 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { final WindowManagerPolicy policy = service.mPolicy; service.mRoot.forAllWindows(nonAppWindow -> { // Animation on the IME window is controlled via Insets. - if (nonAppWindow.mActivityRecord == null && policy.canBeHiddenByKeyguardLw(nonAppWindow) + if (nonAppWindow.mActivityRecord == null && nonAppWindow.canBeHiddenByKeyguard() && nonAppWindow.wouldBeVisibleIfPolicyIgnored() && !nonAppWindow.isVisible() && nonAppWindow != service.mRoot.getCurrentInputMethodWindow()) { final NonAppWindowAnimationAdapter nonAppAdapter = new NonAppWindowAnimationAdapter( diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 2ef1696ae1594..44edaa256283b 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1337,8 +1337,7 @@ class WindowState extends WindowContainer implements WindowManagerP outFrame.set(0, 0, mWindowFrames.mCompatFrame.width(), mWindowFrames.mCompatFrame.height()); } - @Override - public WindowManager.LayoutParams getAttrs() { + WindowManager.LayoutParams getAttrs() { return mAttrs; } @@ -3830,6 +3829,24 @@ class WindowState extends WindowContainer implements WindowManagerP return (mAttrs.insetsFlags.behavior & BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) != 0; } + boolean canBeHiddenByKeyguard() { + // Keyguard visibility of window from activities are determined over activity visibility. + if (mActivityRecord != null) { + return false; + } + switch (mAttrs.type) { + case TYPE_NOTIFICATION_SHADE: + case TYPE_STATUS_BAR: + case TYPE_NAVIGATION_BAR: + case TYPE_WALLPAPER: + return false; + default: + // Hide only windows below the keyguard host window. + return mPolicy.getWindowLayerLw(this) + < mPolicy.getWindowLayerFromTypeLw(TYPE_NOTIFICATION_SHADE); + } + } + private int getRootTaskId() { final Task rootTask = getRootTask(); if (rootTask == null) {