From 1090a9bfc3ca6cdb3cdf716c1994eb4c62cca8e4 Mon Sep 17 00:00:00 2001 From: Linus Tufvesson Date: Tue, 19 Jan 2021 15:31:13 +0000 Subject: [PATCH] Update system application overlay api Convert the SYSTEM_FLAG into a PRIVATE_FLAG and expose a method for setting it. This API is easier to use since it makes it possible to setup the LayoutParams before having access to the Window. Bug: 171177581 Test: atest CtsWindowManagerDeviceTestCases:HideOverlayWindowsTest Change-Id: I0bf3857e3dbf67f8833b3b3847b2253d31b9d4a5 --- core/api/system-current.txt | 5 ++- core/java/android/view/WindowManager.java | 43 ++++++++++++++++--- .../com/android/server/wm/WindowState.java | 5 +-- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 728affae2a3bc..f4535fd4f9480 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -13378,15 +13378,16 @@ package android.view { public static class WindowManager.LayoutParams extends android.view.ViewGroup.LayoutParams implements android.os.Parcelable { method public final long getUserActivityTimeout(); + method public boolean isSystemApplicationOverlay(); + method @RequiresPermission(android.Manifest.permission.SYSTEM_APPLICATION_OVERLAY) public void setSystemApplicationOverlay(boolean); method public final void setUserActivityTimeout(long); field @RequiresPermission(android.Manifest.permission.USE_BACKGROUND_BLUR) public static final int FLAG_BLUR_BEHIND = 4; // 0x4 field @RequiresPermission(android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS) public static final int SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS = 524288; // 0x80000 field @RequiresPermission(android.Manifest.permission.INTERNAL_SYSTEM_WINDOW) public static final int SYSTEM_FLAG_SHOW_FOR_ALL_USERS = 16; // 0x10 - field @RequiresPermission(android.Manifest.permission.SYSTEM_APPLICATION_OVERLAY) public static final int SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY = 8; // 0x8 field @RequiresPermission(android.Manifest.permission.USE_BACKGROUND_BLUR) public int backgroundBlurRadius; } - @IntDef(flag=true, prefix={"SYSTEM_FLAG_"}, value={android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS, android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS, android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowManager.LayoutParams.SystemFlags { + @IntDef(flag=true, prefix={"SYSTEM_FLAG_"}, value={android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS, android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowManager.LayoutParams.SystemFlags { } } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index c2d990a40fe42..8b8645cf6c4f1 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -2151,9 +2151,8 @@ public interface WindowManager extends ViewManager { * visible window. * @hide */ - @SystemApi @RequiresPermission(permission.SYSTEM_APPLICATION_OVERLAY) - public static final int SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY = 0x00000008; + public static final int PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY = 0x00000008; /** In a multiuser system if this flag is set and the owner is a system process then this * window will appear on all user screens. This overrides the default behavior of window @@ -2352,7 +2351,6 @@ public interface WindowManager extends ViewManager { @IntDef(flag = true, prefix = { "SYSTEM_FLAG_" }, value = { SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS, SYSTEM_FLAG_SHOW_FOR_ALL_USERS, - SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY, }) public @interface SystemFlags {} @@ -2386,7 +2384,7 @@ public interface WindowManager extends ViewManager { PRIVATE_FLAG_TRUSTED_OVERLAY, PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME, PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG_AND_DROP, - SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY, + PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY, }) public @interface PrivateFlags {} @@ -2501,9 +2499,9 @@ public interface WindowManager extends ViewManager { equals = PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG_AND_DROP, name = "INTERCEPT_GLOBAL_DRAG_AND_DROP"), @ViewDebug.FlagToString( - mask = SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY, - equals = SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY, - name = "SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY") + mask = PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY, + equals = PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY, + name = "PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY") }) @PrivateFlags @TestApi @@ -3374,6 +3372,37 @@ public interface WindowManager extends ViewManager { privateFlags |= PRIVATE_FLAG_TRUSTED_OVERLAY; } + /** + * When set on {@link LayoutParams#TYPE_APPLICATION_OVERLAY} windows they stay visible, + * even if {@link LayoutParams#SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS} is set for + * another visible window. + * @hide + */ + @SystemApi + @RequiresPermission(permission.SYSTEM_APPLICATION_OVERLAY) + public void setSystemApplicationOverlay(boolean isSystemApplicationOverlay) { + if (isSystemApplicationOverlay) { + privateFlags |= PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY; + } else { + privateFlags &= ~PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY; + } + } + + /** + * Returns if this window is marked as being a system application overlay. + * @see LayoutParams#setSystemApplicationOverlay(boolean) + * + *

Note: the owner of the window must hold + * {@link android.Manifest.permission.SYSTEM_APPLICATION_OVERLAY} for this to have any + * effect. + * @hide + */ + @SystemApi + public boolean isSystemApplicationOverlay() { + return (privateFlags & PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY) + == PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY; + } + /** * @return the insets types that this window is avoiding overlapping. */ diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index b7602fec73df4..514bd4a01719f 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -68,7 +68,6 @@ import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS; -import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; @@ -3049,8 +3048,8 @@ class WindowState extends WindowContainer implements WindowManagerP return; } - if (mAttrs.type == TYPE_APPLICATION_OVERLAY && mSession.mCanCreateSystemApplicationOverlay - && (mAttrs.privateFlags & SYSTEM_FLAG_SYSTEM_APPLICATION_OVERLAY) != 0) { + if (mAttrs.type == TYPE_APPLICATION_OVERLAY && mAttrs.isSystemApplicationOverlay() + && mSession.mCanCreateSystemApplicationOverlay) { return; }