From 478bb4ddb4747bed7daf93aa8fb8193117614740 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Tue, 6 Dec 2022 18:14:59 +0800 Subject: [PATCH] Do not let snapshot window control the bar But allow splash screen window to control the bar. Unlike snapshot starting window, all system bar corresponding attributes are read from app theme, so ideally the initial value should equals to the first activity main window. Even if the activity set another theme, it should only produce an one-time transition. (Ref: I3d7ba6b7d78c0508ddeccbf1d3408d723bd8e2c0) Bug: 261247891 Test: atest WindowStateTests Change-Id: I957e1eddcfa3f7b873f7a9b32eeaf69db5927b00 --- .../core/java/com/android/server/wm/DisplayPolicy.java | 9 ++------- .../core/java/com/android/server/wm/WindowState.java | 5 ++++- .../src/com/android/server/wm/WindowStateTests.java | 10 ++++++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 9ac1762c995e6..1e2598a03f2b0 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2135,15 +2135,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 73759d3a3362f..2dc0dc4658614 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 1b79dd35082ee..7b73c7b10aa70 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");