Loading core/java/android/view/WindowManager.java +7 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.view; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; Loading Loading @@ -1389,15 +1390,14 @@ public interface WindowManager extends ViewManager { public static final int PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE = 0x00040000; /** * Flag to indicate that this window is used as a task snapshot window. A task snapshot * window is a starting window that gets shown with a screenshot from the previous state * that is active until the app has drawn its first frame. * * <p>If this flag is set, SystemUI flags are ignored such that the real window behind can * set the SystemUI flags. * Flag to indicate that any window added by an application process that if of type * {@link #TYPE_TOAST} or that requires * {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when * this window is visible. * @hide */ public static final int PRIVATE_FLAG_TASK_SNAPSHOT = 0x00080000; @RequiresPermission(android.Manifest.permission.INTERNAL_SYSTEM_WINDOW) public static final int PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS = 0x00080000; /** * Flag to indicate that this window should be ignored when determining what parts of the Loading services/core/java/com/android/server/wm/TaskSnapshotSurface.java +1 −3 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY; import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static com.android.internal.policy.DecorView.NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES; import static com.android.internal.policy.DecorView.STATUS_BAR_COLOR_VIEW_ATTRIBUTES; Loading Loading @@ -164,8 +163,7 @@ class TaskSnapshotSurface implements StartingSurface { layoutParams.flags = (windowFlags & ~FLAG_INHERIT_EXCLUDES) | FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCHABLE; layoutParams.privateFlags = PRIVATE_FLAG_TASK_SNAPSHOT | (windowPrivateFlags & PRIVATE_FLAG_INHERITS); layoutParams.privateFlags = windowPrivateFlags & PRIVATE_FLAG_INHERITS; layoutParams.token = token.token; layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = LayoutParams.MATCH_PARENT; Loading services/core/java/com/android/server/wm/WindowManagerService.java +44 −4 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import static android.content.Intent.EXTRA_USER_HANDLE; import static android.os.Process.ROOT_UID; import static android.os.Process.SHELL_UID; import static android.os.Process.SYSTEM_UID; import static android.os.Process.THREAD_PRIORITY_DISPLAY; import static android.os.Process.myPid; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.os.UserHandle.USER_NULL; Loading @@ -48,7 +47,6 @@ import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHA import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; Loading Loading @@ -231,7 +229,6 @@ import com.android.server.DisplayThread; import com.android.server.EventLogTags; import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.ThreadPriorityBooster; import com.android.server.UiThread; import com.android.server.Watchdog; import com.android.server.input.InputManagerService; Loading Loading @@ -496,12 +493,15 @@ public class WindowManagerService extends IWindowManager.Stub */ Runnable mWaitingForDrawnCallback; /** List of window currently causing non-system overlay windows to be hidden. */ private ArrayList<WindowState> mHidingNonSystemOverlayWindows = new ArrayList<>(); /** * Stores for each user whether screencapture is disabled * This array is essentially a cache for all userId for * {@link android.app.admin.DevicePolicyManager#getScreenCaptureDisabled} */ SparseArray<Boolean> mScreenCaptureDisabled = new SparseArray<>(); private SparseArray<Boolean> mScreenCaptureDisabled = new SparseArray<>(); IInputMethodManager mInputMethodManager; Loading Loading @@ -1716,6 +1716,7 @@ public class WindowManagerService extends IWindowManager.Stub } mPendingRemove.remove(win); mResizingWindows.remove(win); updateNonSystemOverlayWindowsVisibilityIfNeeded(win, false /* surfaceShown */); mWindowsChanged = true; if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Final remove of window: " + win); Loading Loading @@ -6474,6 +6475,21 @@ public class WindowManagerService extends IWindowManager.Stub ArrayList<WindowState> windows) { mRoot.dumpWindowsNoHeader(pw, dumpAll, windows); if (!mHidingNonSystemOverlayWindows.isEmpty()) { pw.println(); pw.println(" Hiding System Alert Windows:"); for (int i = mHidingNonSystemOverlayWindows.size() - 1; i >= 0; i--) { final WindowState w = mHidingNonSystemOverlayWindows.get(i); pw.print(" #"); pw.print(i); pw.print(' '); pw.print(w); if (dumpAll) { pw.println(":"); w.dump(pw, " ", true); } else { pw.println(); } } } if (mPendingRemove.size() > 0) { pw.println(); pw.println(" Remove pending for:"); Loading Loading @@ -7588,4 +7604,28 @@ public class WindowManagerService extends IWindowManager.Stub boolean hasWideColorGamutSupport() { return mHasWideColorGamutSupport; } void updateNonSystemOverlayWindowsVisibilityIfNeeded(WindowState win, boolean surfaceShown) { if (!win.hideNonSystemOverlayWindowsWhenVisible()) { return; } final boolean systemAlertWindowsHidden = !mHidingNonSystemOverlayWindows.isEmpty(); if (surfaceShown) { if (!mHidingNonSystemOverlayWindows.contains(win)) { mHidingNonSystemOverlayWindows.add(win); } } else { mHidingNonSystemOverlayWindows.remove(win); } final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty(); if (systemAlertWindowsHidden == hideSystemAlertWindows) { return; } mRoot.forAllWindows((w) -> { w.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows); }, false /* traverseTopToBottom */); } } services/core/java/com/android/server/wm/WindowState.java +40 −2 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import static android.view.WindowManager.LayoutParams.FORMAT_CHANGED; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH; Loading @@ -59,7 +60,9 @@ import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static android.view.WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType; import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_DOCKED; import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_FREEFORM; import static android.view.WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME; Loading Loading @@ -208,6 +211,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP boolean mPolicyVisibilityAfterAnim = true; private boolean mAppOpVisibility = true; boolean mPermanentlyHidden; // the window should never be shown again // This is a non-system overlay window that is currently force hidden. private boolean mForceHideNonSystemOverlayWindow; boolean mAppFreezing; boolean mHidden; // Used to determine if to show child windows. boolean mWallpaperVisible; // for wallpaper, what was last vis report? Loading Loading @@ -2371,6 +2376,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // to handle their windows being removed from under them. return false; } if (mForceHideNonSystemOverlayWindow) { // This is an alert window that is currently force hidden. return false; } if (mPolicyVisibility && mPolicyVisibilityAfterAnim) { // Already showing. return false; Loading Loading @@ -2447,6 +2456,22 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return true; } void setForceHideNonSystemOverlayWindowIfNeeded(boolean forceHide) { if (mOwnerCanAddInternalSystemWindow || (!isSystemAlertWindowType(mAttrs.type) && mAttrs.type != TYPE_TOAST)) { return; } if (mForceHideNonSystemOverlayWindow == forceHide) { return; } mForceHideNonSystemOverlayWindow = forceHide; if (forceHide) { hideLw(true, true); } else { showLw(true, true); } } public void setAppOpVisibilityLw(boolean state) { if (mAppOpVisibility != state) { mAppOpVisibility = state; Loading Loading @@ -3330,7 +3355,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP pw.println(Integer.toHexString(mSystemUiVisibility)); } if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || !mAppOpVisibility || isParentWindowHidden()|| mPermanentlyHidden) { || isParentWindowHidden()|| mPermanentlyHidden || mForceHideNonSystemOverlayWindow) { pw.print(prefix); pw.print("mPolicyVisibility="); pw.print(mPolicyVisibility); pw.print(" mPolicyVisibilityAfterAnim="); Loading @@ -3338,7 +3363,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP pw.print(" mAppOpVisibility="); pw.print(mAppOpVisibility); pw.print(" parentHidden="); pw.print(isParentWindowHidden()); pw.print(" mPermanentlyHidden="); pw.println(mPermanentlyHidden); pw.print(" mPermanentlyHidden="); pw.print(mPermanentlyHidden); pw.print(" mForceHideNonSystemOverlayWindow="); pw.println( mForceHideNonSystemOverlayWindow); } if (!mRelayoutCalled || mLayoutNeeded) { pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled); Loading Loading @@ -3593,6 +3620,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP && (mAttrs.privateFlags & PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME) != 0; } /** * Returns true if any window added by an application process that if of type * {@link android.view.WindowManager.LayoutParams#TYPE_TOAST} or that requires that requires * {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when * this window is visible. */ boolean hideNonSystemOverlayWindowsWhenVisible() { return (mAttrs.privateFlags & PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0 && mOwnerCanAddInternalSystemWindow; } /** Returns the parent window if this is a child of another window, else null. */ WindowState getParentWindow() { // NOTE: We are not calling getParent() directly as the WindowState might be a child of a Loading services/core/java/com/android/server/wm/WindowSurfaceController.java +2 −2 Original line number Diff line number Diff line Loading @@ -24,10 +24,8 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static android.view.Surface.SCALING_MODE_FREEZE; import static android.view.Surface.SCALING_MODE_SCALE_TO_WINDOW; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; Loading Loading @@ -514,6 +512,8 @@ class WindowSurfaceController { void setShown(boolean surfaceShown) { mSurfaceShown = surfaceShown; mService.updateNonSystemOverlayWindowsVisibilityIfNeeded(mAnimator.mWin, surfaceShown); if (mWindowSession != null) { mWindowSession.onWindowSurfaceVisibilityChanged(this, mSurfaceShown, mWindowType); } Loading Loading
core/java/android/view/WindowManager.java +7 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.view; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; Loading Loading @@ -1389,15 +1390,14 @@ public interface WindowManager extends ViewManager { public static final int PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE = 0x00040000; /** * Flag to indicate that this window is used as a task snapshot window. A task snapshot * window is a starting window that gets shown with a screenshot from the previous state * that is active until the app has drawn its first frame. * * <p>If this flag is set, SystemUI flags are ignored such that the real window behind can * set the SystemUI flags. * Flag to indicate that any window added by an application process that if of type * {@link #TYPE_TOAST} or that requires * {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when * this window is visible. * @hide */ public static final int PRIVATE_FLAG_TASK_SNAPSHOT = 0x00080000; @RequiresPermission(android.Manifest.permission.INTERNAL_SYSTEM_WINDOW) public static final int PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS = 0x00080000; /** * Flag to indicate that this window should be ignored when determining what parts of the Loading
services/core/java/com/android/server/wm/TaskSnapshotSurface.java +1 −3 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY; import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static com.android.internal.policy.DecorView.NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES; import static com.android.internal.policy.DecorView.STATUS_BAR_COLOR_VIEW_ATTRIBUTES; Loading Loading @@ -164,8 +163,7 @@ class TaskSnapshotSurface implements StartingSurface { layoutParams.flags = (windowFlags & ~FLAG_INHERIT_EXCLUDES) | FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCHABLE; layoutParams.privateFlags = PRIVATE_FLAG_TASK_SNAPSHOT | (windowPrivateFlags & PRIVATE_FLAG_INHERITS); layoutParams.privateFlags = windowPrivateFlags & PRIVATE_FLAG_INHERITS; layoutParams.token = token.token; layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = LayoutParams.MATCH_PARENT; Loading
services/core/java/com/android/server/wm/WindowManagerService.java +44 −4 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import static android.content.Intent.EXTRA_USER_HANDLE; import static android.os.Process.ROOT_UID; import static android.os.Process.SHELL_UID; import static android.os.Process.SYSTEM_UID; import static android.os.Process.THREAD_PRIORITY_DISPLAY; import static android.os.Process.myPid; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.os.UserHandle.USER_NULL; Loading @@ -48,7 +47,6 @@ import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHA import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; Loading Loading @@ -231,7 +229,6 @@ import com.android.server.DisplayThread; import com.android.server.EventLogTags; import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.ThreadPriorityBooster; import com.android.server.UiThread; import com.android.server.Watchdog; import com.android.server.input.InputManagerService; Loading Loading @@ -496,12 +493,15 @@ public class WindowManagerService extends IWindowManager.Stub */ Runnable mWaitingForDrawnCallback; /** List of window currently causing non-system overlay windows to be hidden. */ private ArrayList<WindowState> mHidingNonSystemOverlayWindows = new ArrayList<>(); /** * Stores for each user whether screencapture is disabled * This array is essentially a cache for all userId for * {@link android.app.admin.DevicePolicyManager#getScreenCaptureDisabled} */ SparseArray<Boolean> mScreenCaptureDisabled = new SparseArray<>(); private SparseArray<Boolean> mScreenCaptureDisabled = new SparseArray<>(); IInputMethodManager mInputMethodManager; Loading Loading @@ -1716,6 +1716,7 @@ public class WindowManagerService extends IWindowManager.Stub } mPendingRemove.remove(win); mResizingWindows.remove(win); updateNonSystemOverlayWindowsVisibilityIfNeeded(win, false /* surfaceShown */); mWindowsChanged = true; if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Final remove of window: " + win); Loading Loading @@ -6474,6 +6475,21 @@ public class WindowManagerService extends IWindowManager.Stub ArrayList<WindowState> windows) { mRoot.dumpWindowsNoHeader(pw, dumpAll, windows); if (!mHidingNonSystemOverlayWindows.isEmpty()) { pw.println(); pw.println(" Hiding System Alert Windows:"); for (int i = mHidingNonSystemOverlayWindows.size() - 1; i >= 0; i--) { final WindowState w = mHidingNonSystemOverlayWindows.get(i); pw.print(" #"); pw.print(i); pw.print(' '); pw.print(w); if (dumpAll) { pw.println(":"); w.dump(pw, " ", true); } else { pw.println(); } } } if (mPendingRemove.size() > 0) { pw.println(); pw.println(" Remove pending for:"); Loading Loading @@ -7588,4 +7604,28 @@ public class WindowManagerService extends IWindowManager.Stub boolean hasWideColorGamutSupport() { return mHasWideColorGamutSupport; } void updateNonSystemOverlayWindowsVisibilityIfNeeded(WindowState win, boolean surfaceShown) { if (!win.hideNonSystemOverlayWindowsWhenVisible()) { return; } final boolean systemAlertWindowsHidden = !mHidingNonSystemOverlayWindows.isEmpty(); if (surfaceShown) { if (!mHidingNonSystemOverlayWindows.contains(win)) { mHidingNonSystemOverlayWindows.add(win); } } else { mHidingNonSystemOverlayWindows.remove(win); } final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty(); if (systemAlertWindowsHidden == hideSystemAlertWindows) { return; } mRoot.forAllWindows((w) -> { w.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows); }, false /* traverseTopToBottom */); } }
services/core/java/com/android/server/wm/WindowState.java +40 −2 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import static android.view.WindowManager.LayoutParams.FORMAT_CHANGED; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH; Loading @@ -59,7 +60,9 @@ import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static android.view.WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType; import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_DOCKED; import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_FREEFORM; import static android.view.WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME; Loading Loading @@ -208,6 +211,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP boolean mPolicyVisibilityAfterAnim = true; private boolean mAppOpVisibility = true; boolean mPermanentlyHidden; // the window should never be shown again // This is a non-system overlay window that is currently force hidden. private boolean mForceHideNonSystemOverlayWindow; boolean mAppFreezing; boolean mHidden; // Used to determine if to show child windows. boolean mWallpaperVisible; // for wallpaper, what was last vis report? Loading Loading @@ -2371,6 +2376,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // to handle their windows being removed from under them. return false; } if (mForceHideNonSystemOverlayWindow) { // This is an alert window that is currently force hidden. return false; } if (mPolicyVisibility && mPolicyVisibilityAfterAnim) { // Already showing. return false; Loading Loading @@ -2447,6 +2456,22 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return true; } void setForceHideNonSystemOverlayWindowIfNeeded(boolean forceHide) { if (mOwnerCanAddInternalSystemWindow || (!isSystemAlertWindowType(mAttrs.type) && mAttrs.type != TYPE_TOAST)) { return; } if (mForceHideNonSystemOverlayWindow == forceHide) { return; } mForceHideNonSystemOverlayWindow = forceHide; if (forceHide) { hideLw(true, true); } else { showLw(true, true); } } public void setAppOpVisibilityLw(boolean state) { if (mAppOpVisibility != state) { mAppOpVisibility = state; Loading Loading @@ -3330,7 +3355,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP pw.println(Integer.toHexString(mSystemUiVisibility)); } if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || !mAppOpVisibility || isParentWindowHidden()|| mPermanentlyHidden) { || isParentWindowHidden()|| mPermanentlyHidden || mForceHideNonSystemOverlayWindow) { pw.print(prefix); pw.print("mPolicyVisibility="); pw.print(mPolicyVisibility); pw.print(" mPolicyVisibilityAfterAnim="); Loading @@ -3338,7 +3363,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP pw.print(" mAppOpVisibility="); pw.print(mAppOpVisibility); pw.print(" parentHidden="); pw.print(isParentWindowHidden()); pw.print(" mPermanentlyHidden="); pw.println(mPermanentlyHidden); pw.print(" mPermanentlyHidden="); pw.print(mPermanentlyHidden); pw.print(" mForceHideNonSystemOverlayWindow="); pw.println( mForceHideNonSystemOverlayWindow); } if (!mRelayoutCalled || mLayoutNeeded) { pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled); Loading Loading @@ -3593,6 +3620,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP && (mAttrs.privateFlags & PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME) != 0; } /** * Returns true if any window added by an application process that if of type * {@link android.view.WindowManager.LayoutParams#TYPE_TOAST} or that requires that requires * {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when * this window is visible. */ boolean hideNonSystemOverlayWindowsWhenVisible() { return (mAttrs.privateFlags & PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0 && mOwnerCanAddInternalSystemWindow; } /** Returns the parent window if this is a child of another window, else null. */ WindowState getParentWindow() { // NOTE: We are not calling getParent() directly as the WindowState might be a child of a Loading
services/core/java/com/android/server/wm/WindowSurfaceController.java +2 −2 Original line number Diff line number Diff line Loading @@ -24,10 +24,8 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static android.view.Surface.SCALING_MODE_FREEZE; import static android.view.Surface.SCALING_MODE_SCALE_TO_WINDOW; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; Loading Loading @@ -514,6 +512,8 @@ class WindowSurfaceController { void setShown(boolean surfaceShown) { mSurfaceShown = surfaceShown; mService.updateNonSystemOverlayWindowsVisibilityIfNeeded(mAnimator.mWin, surfaceShown); if (mWindowSession != null) { mWindowSession.onWindowSurfaceVisibilityChanged(this, mSurfaceShown, mWindowType); } Loading