Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 478bb4dd authored by wilsonshih's avatar wilsonshih Committed by Wei Sheng Shih
Browse files

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
parent 864e20b9
Loading
Loading
Loading
Loading
+2 −7
Original line number Original line Diff line number Diff line
@@ -2135,15 +2135,10 @@ public class DisplayPolicy {
    }
    }


    void updateSystemBarAttributes() {
    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
        // 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.
        // anyway, so just hang on in whatever state we're in until things settle down.
        WindowState winCandidate = mFocusedWindow != null ? mFocusedWindow
                : mTopFullscreenOpaqueWindowState;
        if (winCandidate == null) {
        if (winCandidate == null) {
            return;
            return;
        }
        }
+4 −1
Original line number Original line Diff line number Diff line
@@ -2090,7 +2090,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        } else {
        } else {
            final Task task = getTask();
            final Task task = getTask();
            final boolean canFromTask = task != null && task.canAffectSystemUiFlags();
            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));
        }
        }
    }
    }


+10 −0
Original line number Original line Diff line number Diff line
@@ -412,6 +412,16 @@ public class WindowStateTests extends WindowTestsBase {
        assertFalse(app.canAffectSystemUiFlags());
        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
    @Test
    public void testCanAffectSystemUiFlags_disallow() {
    public void testCanAffectSystemUiFlags_disallow() {
        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");