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

This commit is contained in:
Mariia Sandrikova
2021-06-09 10:44:35 +00:00
committed by Android (Google) Code Review
2 changed files with 19 additions and 9 deletions

View File

@@ -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()) {

View File

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