diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index b419f36e45a3f..300deca1d09a6 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2128,15 +2128,10 @@ public class DisplayPolicy { } void updateSystemBarAttributes() { - WindowState winCandidate = mFocusedWindow; - if (winCandidate == null && mTopFullscreenOpaqueWindowState != null - && (mTopFullscreenOpaqueWindowState.mAttrs.flags - & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0) { - // Only focusable window can take system bar control. - winCandidate = mTopFullscreenOpaqueWindowState; - } // If there is no window focused, there will be nobody to handle the events // anyway, so just hang on in whatever state we're in until things settle down. + WindowState winCandidate = mFocusedWindow != null ? mFocusedWindow + : mTopFullscreenOpaqueWindowState; if (winCandidate == null) { return; } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index c6578ef19c725..1b7bd9e1f36fb 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2090,7 +2090,10 @@ class WindowState extends WindowContainer implements WindowManagerP } else { final Task task = getTask(); final boolean canFromTask = task != null && task.canAffectSystemUiFlags(); - return canFromTask && mActivityRecord.isVisible(); + return canFromTask && mActivityRecord.isVisible() + // Do not let snapshot window control the bar + && (mAttrs.type != TYPE_APPLICATION_STARTING + || !(mStartingData instanceof SnapshotStartingData)); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 435c39c94dc83..69e3244af1b6c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -412,6 +412,16 @@ public class WindowStateTests extends WindowTestsBase { assertFalse(app.canAffectSystemUiFlags()); } + @Test + public void testCanAffectSystemUiFlags_starting() { + final WindowState app = createWindow(null, TYPE_APPLICATION_STARTING, "app"); + app.mActivityRecord.setVisible(true); + app.mStartingData = new SnapshotStartingData(mWm, null, 0); + assertFalse(app.canAffectSystemUiFlags()); + app.mStartingData = new SplashScreenStartingData(mWm, 0, 0); + assertTrue(app.canAffectSystemUiFlags()); + } + @Test public void testCanAffectSystemUiFlags_disallow() { final WindowState app = createWindow(null, TYPE_APPLICATION, "app");