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

Commit f163159b authored by Mariia Sandrikova's avatar Mariia Sandrikova Committed by Automerger Merge Worker
Browse files

Merge "Don't shown letterbox surfaces unless activity is visible." into sc-dev am: b3a96f3c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14881379

Change-Id: If3737bfe4c00754ffbbac68d4e492e0a842977b3
parents ec2ba7a0 b3a96f3c
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -128,12 +128,9 @@ final class LetterboxUiController {
        if (w == null || winHint != null && w != winHint) {
            return;
        }
        final boolean surfaceReady = w.isDrawn()  // Regular case
                || w.isDragResizeChanged();  // Waiting for relayoutWindow to call preserveSurface.
        final boolean needsLetterbox = surfaceReady && shouldShowLetterboxUi(w);
        updateRoundedCorners(w);
        updateWallpaperForLetterbox(w);
        if (needsLetterbox) {
        if (shouldShowLetterboxUi(w)) {
            if (mLetterbox == null) {
                mLetterbox = new Letterbox(() -> mActivityRecord.makeChildSurface(null),
                        mActivityRecord.mWmService.mTransactionFactory,
@@ -161,19 +158,26 @@ final class LetterboxUiController {
        }
    }

    /**
     * @return {@code true} when the main window is letterboxed, this activity isn't transparent
     * and doesn't show a wallpaper.
     */
    @VisibleForTesting
    boolean shouldShowLetterboxUi(WindowState mainWindow) {
        return mainWindow.areAppWindowBoundsLetterboxed() && mActivityRecord.fillsParent()
        return isSurfaceReadyAndVisible(mainWindow) && mainWindow.areAppWindowBoundsLetterboxed()
                // Check that an activity isn't transparent.
                && mActivityRecord.fillsParent()
                // Check for FLAG_SHOW_WALLPAPER explicitly instead of using
                // WindowContainer#showWallpaper because the later will return true when this
                // activity is using blurred wallpaper for letterbox backgroud.
                && (mainWindow.mAttrs.flags & FLAG_SHOW_WALLPAPER) == 0;
    }

    @VisibleForTesting
    boolean isSurfaceReadyAndVisible(WindowState mainWindow) {
        boolean surfaceReady = mainWindow.isDrawn() // Regular case
                // Waiting for relayoutWindow to call preserveSurface
                || mainWindow.isDragResizeChanged();
        return surfaceReady && (mActivityRecord.isVisible()
                || mActivityRecord.isVisibleRequested());
    }

    private Color getLetterboxBackgroundColor() {
        final WindowState w = mActivityRecord.findMainWindow();
        if (w == null || w.isLetterboxedForDisplayCutout()) {
+6 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.same;
@@ -357,6 +358,11 @@ public class SizeCompatTests extends WindowTestsBase {
        final WindowState window = createWindow(null, TYPE_BASE_APPLICATION, mActivity, "window");

        assertEquals(window, mActivity.findMainWindow());

        spyOn(mActivity.mLetterboxUiController);
        doReturn(true).when(mActivity.mLetterboxUiController)
                .isSurfaceReadyAndVisible(any());

        assertTrue(mActivity.mLetterboxUiController.shouldShowLetterboxUi(
                mActivity.findMainWindow()));