Don't check height if activity bounds empty
LetterboxUiController#isHorizontalReachabilityEnabled returns false when ActivityRecord#resolveOverrideConfiguration is called multiple times during inital loading of apps. This causes brief flicker to center if letterboxed app position was persisted to left/right since it uses letterbox horizontal position multiplier instead of correct persister config. Fix: 273542824 Test: Manual && atest WmTests:SizeCompatTests Change-Id: Iaae337bef6ba36b5f3f8cd2edc325d95a2b662fe
This commit is contained in:
@@ -8386,6 +8386,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull Rect getScreenResolvedBounds() {
|
||||
final Configuration resolvedConfig = getResolvedOverrideConfiguration();
|
||||
final Rect resolvedBounds = resolvedConfig.windowConfiguration.getBounds();
|
||||
return mSizeCompatBounds != null ? mSizeCompatBounds : resolvedBounds;
|
||||
}
|
||||
|
||||
void recomputeConfiguration() {
|
||||
// We check if the current activity is transparent. In that case we need to
|
||||
// recomputeConfiguration of the first opaque activity beneath, to allow a
|
||||
|
||||
@@ -965,6 +965,8 @@ final class LetterboxUiController {
|
||||
* </ul>
|
||||
*/
|
||||
private boolean isHorizontalReachabilityEnabled(Configuration parentConfiguration) {
|
||||
// Use screen resolved bounds which uses resolved bounds or size compat bounds
|
||||
// as activity bounds can sometimes be empty
|
||||
return mLetterboxConfiguration.getIsHorizontalReachabilityEnabled()
|
||||
&& parentConfiguration.windowConfiguration.getWindowingMode()
|
||||
== WINDOWING_MODE_FULLSCREEN
|
||||
@@ -972,7 +974,7 @@ final class LetterboxUiController {
|
||||
&& mActivityRecord.getOrientationForReachability() == ORIENTATION_PORTRAIT)
|
||||
// Check whether the activity fills the parent vertically.
|
||||
&& parentConfiguration.windowConfiguration.getAppBounds().height()
|
||||
<= mActivityRecord.getBounds().height();
|
||||
<= mActivityRecord.getScreenResolvedBounds().height();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -992,6 +994,8 @@ final class LetterboxUiController {
|
||||
* </ul>
|
||||
*/
|
||||
private boolean isVerticalReachabilityEnabled(Configuration parentConfiguration) {
|
||||
// Use screen resolved bounds which uses resolved bounds or size compat bounds
|
||||
// as activity bounds can sometimes be empty
|
||||
return mLetterboxConfiguration.getIsVerticalReachabilityEnabled()
|
||||
&& parentConfiguration.windowConfiguration.getWindowingMode()
|
||||
== WINDOWING_MODE_FULLSCREEN
|
||||
@@ -999,7 +1003,7 @@ final class LetterboxUiController {
|
||||
&& mActivityRecord.getOrientationForReachability() == ORIENTATION_LANDSCAPE)
|
||||
// Check whether the activity fills the parent horizontally.
|
||||
&& parentConfiguration.windowConfiguration.getBounds().width()
|
||||
== mActivityRecord.getBounds().width();
|
||||
== mActivityRecord.getScreenResolvedBounds().width();
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
|
||||
@@ -3049,11 +3049,43 @@ public class SizeCompatTests extends WindowTestsBase {
|
||||
assertTrue(mActivity.inSizeCompatMode());
|
||||
|
||||
// Vertical reachability is disabled because the app does not match parent width
|
||||
assertNotEquals(mActivity.getBounds().width(), mActivity.mDisplayContent.getBounds()
|
||||
.width());
|
||||
assertNotEquals(mActivity.getScreenResolvedBounds().width(),
|
||||
mActivity.mDisplayContent.getBounds().width());
|
||||
assertFalse(mActivity.mLetterboxUiController.isVerticalReachabilityEnabled());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsVerticalReachabilityEnabled_emptyBounds_true() {
|
||||
setUpDisplaySizeWithApp(/* dw */ 1000, /* dh */ 2800);
|
||||
mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
|
||||
mWm.mLetterboxConfiguration.setIsVerticalReachabilityEnabled(true);
|
||||
|
||||
prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE);
|
||||
|
||||
// Set up activity with empty bounds to mock loading of app
|
||||
mActivity.getWindowConfiguration().setBounds(null);
|
||||
assertEquals(new Rect(0, 0, 0, 0), mActivity.getBounds());
|
||||
|
||||
// Vertical reachability is still enabled as resolved bounds is not empty
|
||||
assertTrue(mActivity.mLetterboxUiController.isVerticalReachabilityEnabled());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsHorizontalReachabilityEnabled_emptyBounds_true() {
|
||||
setUpDisplaySizeWithApp(/* dw */ 2800, /* dh */ 1000);
|
||||
mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
|
||||
mWm.mLetterboxConfiguration.setIsHorizontalReachabilityEnabled(true);
|
||||
|
||||
prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
|
||||
|
||||
// Set up activity with empty bounds to mock loading of app
|
||||
mActivity.getWindowConfiguration().setBounds(null);
|
||||
assertEquals(new Rect(0, 0, 0, 0), mActivity.getBounds());
|
||||
|
||||
// Horizontal reachability is still enabled as resolved bounds is not empty
|
||||
assertTrue(mActivity.mLetterboxUiController.isHorizontalReachabilityEnabled());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsHorizontalReachabilityEnabled_doesNotMatchParentHeight_false() {
|
||||
setUpDisplaySizeWithApp(2800, 1000);
|
||||
@@ -3070,8 +3102,8 @@ public class SizeCompatTests extends WindowTestsBase {
|
||||
assertTrue(mActivity.inSizeCompatMode());
|
||||
|
||||
// Horizontal reachability is disabled because the app does not match parent height
|
||||
assertNotEquals(mActivity.getBounds().height(), mActivity.mDisplayContent.getBounds()
|
||||
.height());
|
||||
assertNotEquals(mActivity.getScreenResolvedBounds().height(),
|
||||
mActivity.mDisplayContent.getBounds().height());
|
||||
assertFalse(mActivity.mLetterboxUiController.isHorizontalReachabilityEnabled());
|
||||
}
|
||||
|
||||
@@ -3091,8 +3123,8 @@ public class SizeCompatTests extends WindowTestsBase {
|
||||
assertTrue(mActivity.inSizeCompatMode());
|
||||
|
||||
// Horizontal reachability is enabled because the app matches parent height
|
||||
assertEquals(mActivity.getBounds().height(), mActivity.mDisplayContent.getBounds()
|
||||
.height());
|
||||
assertEquals(mActivity.getScreenResolvedBounds().height(),
|
||||
mActivity.mDisplayContent.getBounds().height());
|
||||
assertTrue(mActivity.mLetterboxUiController.isHorizontalReachabilityEnabled());
|
||||
}
|
||||
|
||||
@@ -3112,7 +3144,8 @@ public class SizeCompatTests extends WindowTestsBase {
|
||||
assertTrue(mActivity.inSizeCompatMode());
|
||||
|
||||
// Vertical reachability is enabled because the app matches parent width
|
||||
assertEquals(mActivity.getBounds().width(), mActivity.mDisplayContent.getBounds().width());
|
||||
assertEquals(mActivity.getScreenResolvedBounds().width(),
|
||||
mActivity.mDisplayContent.getBounds().width());
|
||||
assertTrue(mActivity.mLetterboxUiController.isVerticalReachabilityEnabled());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user