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
This commit is contained in:
wilsonshih
2022-12-06 18:14:59 +08:00
committed by Wei Sheng Shih
parent 864e20b981
commit 478bb4ddb4
3 changed files with 16 additions and 8 deletions

View File

@@ -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;
}

View File

@@ -2090,7 +2090,10 @@ class WindowState extends WindowContainer<WindowState> 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));
}
}

View File

@@ -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");