summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-05-19 07:03:18 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-05-19 07:03:18 +0000
commit5a784587704948d11a6bc9cf01d242df3af865a0 (patch)
tree4550c7075a68564848064b5bdb3e44fe3e04c0ba
parent58f36f04691784e1c9bdc05d9bd888bc15e66d36 (diff)
parentdeed239d112fd5c286f2d7b8029aa709ae4bae97 (diff)
downloadbase-android13-qpr3-c-s2-release.tar.gz
Merge cherrypicks of ['googleplex-android-review.googlesource.com/23240883'] into sparse-10133821-L55900000960787963.android-13.0.0_r59android-13.0.0_r58android13-qpr3-c-s2-releaseandroid13-qpr3-c-s1-release
SPARSE_CHANGE: Iaf798cbf95d750c199470a7dbdfa53c490119ea3 Change-Id: I7f63403f5df85cfda476a5874b5ecf9f7448abe3
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java2
-rw-r--r--services/core/java/com/android/server/wm/LetterboxUiController.java81
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java142
3 files changed, 78 insertions, 147 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index c91b84ea8265..f3d7448f19ab 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -1612,7 +1612,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
newParent.setResumedActivity(this, "onParentChanged");
mImeInsetsFrozenUntilStartInput = false;
}
- mLetterboxUiController.updateInheritedLetterbox();
+ mLetterboxUiController.onActivityParentChanged(newParent);
}
if (rootTask != null && rootTask.topRunningActivity() == this) {
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java
index d69542c42548..86bc6eeecf1f 100644
--- a/services/core/java/com/android/server/wm/LetterboxUiController.java
+++ b/services/core/java/com/android/server/wm/LetterboxUiController.java
@@ -112,8 +112,6 @@ import com.android.internal.statusbar.LetterboxDetails;
import com.android.server.wm.LetterboxConfiguration.LetterboxBackgroundType;
import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Optional;
import java.util.function.BooleanSupplier;
import java.util.function.Consumer;
@@ -128,7 +126,8 @@ import java.util.function.Predicate;
final class LetterboxUiController {
private static final Predicate<ActivityRecord> FIRST_OPAQUE_NOT_FINISHING_ACTIVITY_PREDICATE =
- activityRecord -> activityRecord.fillsParent() && !activityRecord.isFinishing();
+ activityRecord -> activityRecord.fillsParent() && !activityRecord.isFinishing()
+ && activityRecord.nowVisible;
private static final String TAG = TAG_WITH_CLASS_NAME ? "LetterboxUiController" : TAG_ATM;
@@ -186,10 +185,6 @@ final class LetterboxUiController {
// Corresponds to OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
private final boolean mIsOverrideEnableCompatFakeFocusEnabled;
- // The list of observers for the destroy event of candidate opaque activities
- // when dealing with translucent activities.
- private final List<LetterboxUiController> mDestroyListeners = new ArrayList<>();
-
@Nullable
private final Boolean mBooleanPropertyAllowOrientationOverride;
@Nullable
@@ -203,10 +198,6 @@ final class LetterboxUiController {
@Nullable
private WindowContainerListener mLetterboxConfigListener;
- @Nullable
- @VisibleForTesting
- ActivityRecord mFirstOpaqueActivityBeneath;
-
private boolean mShowWallpaperForLetterboxBackground;
// In case of transparent activities we might need to access the aspectRatio of the
@@ -370,10 +361,6 @@ final class LetterboxUiController {
mLetterbox.destroy();
mLetterbox = null;
}
- for (int i = mDestroyListeners.size() - 1; i >= 0; i--) {
- mDestroyListeners.get(i).updateInheritedLetterbox();
- }
- mDestroyListeners.clear();
if (mLetterboxConfigListener != null) {
mLetterboxConfigListener.onRemoved();
mLetterboxConfigListener = null;
@@ -1590,11 +1577,7 @@ final class LetterboxUiController {
* first opaque activity beneath.
* @param parent The parent container.
*/
- void updateInheritedLetterbox() {
- final WindowContainer<?> parent = mActivityRecord.getParent();
- if (parent == null) {
- return;
- }
+ void onActivityParentChanged(WindowContainer<?> parent) {
if (!mLetterboxConfiguration.isTranslucentLetterboxingEnabled()) {
return;
}
@@ -1604,28 +1587,27 @@ final class LetterboxUiController {
}
// In case mActivityRecord.hasCompatDisplayInsetsWithoutOverride() we don't apply the
// opaque activity constraints because we're expecting the activity is already letterboxed.
- mFirstOpaqueActivityBeneath = mActivityRecord.getTask().getActivity(
+ if (mActivityRecord.getTask() == null || mActivityRecord.fillsParent()
+ || mActivityRecord.hasCompatDisplayInsetsWithoutInheritance()) {
+ return;
+ }
+ final ActivityRecord firstOpaqueActivityBeneath = mActivityRecord.getTask().getActivity(
FIRST_OPAQUE_NOT_FINISHING_ACTIVITY_PREDICATE /* callback */,
mActivityRecord /* boundary */, false /* includeBoundary */,
true /* traverseTopToBottom */);
- if (mFirstOpaqueActivityBeneath == null || mFirstOpaqueActivityBeneath.isEmbedded()) {
+ if (firstOpaqueActivityBeneath == null || firstOpaqueActivityBeneath.isEmbedded()) {
// We skip letterboxing if the translucent activity doesn't have any opaque
// activities beneath or the activity below is embedded which never has letterbox.
- mActivityRecord.recomputeConfiguration();
return;
}
- if (mActivityRecord.getTask() == null || mActivityRecord.fillsParent()
- || mActivityRecord.hasCompatDisplayInsetsWithoutInheritance()) {
- return;
- }
- mFirstOpaqueActivityBeneath.mLetterboxUiController.mDestroyListeners.add(this);
- inheritConfiguration(mFirstOpaqueActivityBeneath);
+ inheritConfiguration(firstOpaqueActivityBeneath);
mLetterboxConfigListener = WindowContainer.overrideConfigurationPropagation(
- mActivityRecord, mFirstOpaqueActivityBeneath,
- (opaqueConfig, transparentOverrideConfig) -> {
- resetTranslucentOverrideConfig(transparentOverrideConfig);
+ mActivityRecord, firstOpaqueActivityBeneath,
+ (opaqueConfig, transparentConfig) -> {
+ final Configuration mutatedConfiguration =
+ fromOriginalTranslucentConfig(transparentConfig);
final Rect parentBounds = parent.getWindowConfiguration().getBounds();
- final Rect bounds = transparentOverrideConfig.windowConfiguration.getBounds();
+ final Rect bounds = mutatedConfiguration.windowConfiguration.getBounds();
final Rect letterboxBounds = opaqueConfig.windowConfiguration.getBounds();
// We cannot use letterboxBounds directly here because the position relies on
// letterboxing. Using letterboxBounds directly, would produce a double offset.
@@ -1634,9 +1616,9 @@ final class LetterboxUiController {
parentBounds.top + letterboxBounds.height());
// We need to initialize appBounds to avoid NPE. The actual value will
// be set ahead when resolving the Configuration for the activity.
- transparentOverrideConfig.windowConfiguration.setAppBounds(new Rect());
- inheritConfiguration(mFirstOpaqueActivityBeneath);
- return transparentOverrideConfig;
+ mutatedConfiguration.windowConfiguration.setAppBounds(new Rect());
+ inheritConfiguration(firstOpaqueActivityBeneath);
+ return mutatedConfiguration;
});
}
@@ -1709,19 +1691,26 @@ final class LetterboxUiController {
if (!hasInheritedLetterboxBehavior() || mActivityRecord.getTask() == null) {
return Optional.empty();
}
- return Optional.ofNullable(mFirstOpaqueActivityBeneath);
+ return Optional.ofNullable(mActivityRecord.getTask().getActivity(
+ FIRST_OPAQUE_NOT_FINISHING_ACTIVITY_PREDICATE /* callback */,
+ mActivityRecord /* boundary */, false /* includeBoundary */,
+ true /* traverseTopToBottom */));
}
- /** Resets the screen size related fields so they can be resolved by requested bounds later. */
- private static void resetTranslucentOverrideConfig(Configuration config) {
+ // When overriding translucent activities configuration we need to keep some of the
+ // original properties
+ private Configuration fromOriginalTranslucentConfig(Configuration translucentConfig) {
+ final Configuration configuration = new Configuration(translucentConfig);
// The values for the following properties will be defined during the configuration
// resolution in {@link ActivityRecord#resolveOverrideConfiguration} using the
// properties inherited from the first not finishing opaque activity beneath.
- config.orientation = ORIENTATION_UNDEFINED;
- config.screenWidthDp = config.compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED;
- config.screenHeightDp = config.compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED;
- config.smallestScreenWidthDp = config.compatSmallestScreenWidthDp =
- SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
+ configuration.orientation = ORIENTATION_UNDEFINED;
+ configuration.screenWidthDp = configuration.compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED;
+ configuration.screenHeightDp =
+ configuration.compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED;
+ configuration.smallestScreenWidthDp =
+ configuration.compatSmallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
+ return configuration;
}
private void inheritConfiguration(ActivityRecord firstOpaque) {
@@ -1740,10 +1729,6 @@ final class LetterboxUiController {
}
private void clearInheritedConfig() {
- if (mFirstOpaqueActivityBeneath != null) {
- mFirstOpaqueActivityBeneath.mLetterboxUiController.mDestroyListeners.remove(this);
- }
- mFirstOpaqueActivityBeneath = null;
mLetterboxConfigListener = null;
mInheritedMinAspectRatio = UNDEFINED_ASPECT_RATIO;
mInheritedMaxAspectRatio = UNDEFINED_ASPECT_RATIO;
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index 637ec7e92a7d..e5ad01a5b70c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -175,6 +175,44 @@ public class SizeCompatTests extends WindowTestsBase {
}
@Test
+ public void testActivityInHistoryAndNotVisibleIsNotUsedAsOpaqueForTranslucentActivities() {
+ mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
+ setUpDisplaySizeWithApp(2000, 1000);
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.nowVisible = false;
+ // Translucent Activity
+ final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
+ .setLaunchedFromUid(mActivity.getUid())
+ .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
+ .build();
+ doReturn(false).when(translucentActivity).fillsParent();
+
+ mTask.addChild(translucentActivity);
+
+ assertFalse(translucentActivity.mLetterboxUiController.hasInheritedLetterboxBehavior());
+ }
+
+ @Test
+ public void testActivityInHistoryAndVisibleIsUsedAsOpaqueForTranslucentActivities() {
+ mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
+ setUpDisplaySizeWithApp(2000, 1000);
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.nowVisible = true;
+ // Translucent Activity
+ final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
+ .setLaunchedFromUid(mActivity.getUid())
+ .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
+ .build();
+ doReturn(false).when(translucentActivity).fillsParent();
+
+ mTask.addChild(translucentActivity);
+
+ assertTrue(translucentActivity.mLetterboxUiController.hasInheritedLetterboxBehavior());
+ }
+
+ @Test
public void testCleanLetterboxConfigListenerWhenTranslucentIsDestroyed() {
mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
setUpDisplaySizeWithApp(2000, 1000);
@@ -198,6 +236,7 @@ public class SizeCompatTests extends WindowTestsBase {
public void testHorizontalReachabilityEnabledForTranslucentActivities() {
setUpDisplaySizeWithApp(2500, 1000);
mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.nowVisible = true;
final LetterboxConfiguration config = mWm.mLetterboxConfiguration;
config.setTranslucentLetterboxingOverrideEnabled(true);
config.setLetterboxHorizontalPositionMultiplier(0.5f);
@@ -273,6 +312,7 @@ public class SizeCompatTests extends WindowTestsBase {
public void testVerticalReachabilityEnabledForTranslucentActivities() {
setUpDisplaySizeWithApp(1000, 2500);
mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.nowVisible = true;
final LetterboxConfiguration config = mWm.mLetterboxConfiguration;
config.setTranslucentLetterboxingOverrideEnabled(true);
config.setLetterboxVerticalPositionMultiplier(0.5f);
@@ -345,110 +385,13 @@ public class SizeCompatTests extends WindowTestsBase {
}
@Test
- public void testApplyStrategyAgainWhenOpaqueIsDestroyed() {
- mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
- setUpDisplaySizeWithApp(2000, 1000);
- prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
- // Launch another opaque activity
- final ActivityRecord opaqueActivity = new ActivityBuilder(mAtm)
- .setLaunchedFromUid(mActivity.getUid())
- .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
- .build();
- mTask.addChild(opaqueActivity);
- // Transparent activity strategy not applied
- assertFalse(opaqueActivity.mLetterboxUiController.hasInheritedLetterboxBehavior());
-
- // Launch translucent Activity
- final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
- .setLaunchedFromUid(mActivity.getUid())
- .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
- .build();
- doReturn(false).when(translucentActivity).fillsParent();
- mTask.addChild(translucentActivity);
- // Transparent strategy applied
- assertTrue(translucentActivity.mLetterboxUiController.hasInheritedLetterboxBehavior());
-
- spyOn(translucentActivity.mLetterboxUiController);
- clearInvocations(translucentActivity.mLetterboxUiController);
-
- // We destroy the first opaque activity
- opaqueActivity.setState(DESTROYED, "testing");
- opaqueActivity.removeImmediately();
-
- // Check that updateInheritedLetterbox() is invoked again
- verify(translucentActivity.mLetterboxUiController).updateInheritedLetterbox();
- }
-
- @Test
- public void testResetOpaqueReferenceWhenOpaqueIsDestroyed() {
- mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
- setUpDisplaySizeWithApp(2000, 1000);
- prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
-
- // Launch translucent Activity
- final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
- .setLaunchedFromUid(mActivity.getUid())
- .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
- .build();
- doReturn(false).when(translucentActivity).fillsParent();
- mTask.addChild(translucentActivity);
- // Transparent strategy applied
- assertTrue(translucentActivity.mLetterboxUiController.hasInheritedLetterboxBehavior());
- assertNotNull(translucentActivity.mLetterboxUiController.mFirstOpaqueActivityBeneath);
-
- spyOn(translucentActivity.mLetterboxUiController);
- clearInvocations(translucentActivity.mLetterboxUiController);
-
- // We destroy the first opaque activity
- mActivity.setState(DESTROYED, "testing");
- mActivity.removeImmediately();
-
- // Check that updateInheritedLetterbox() is invoked again
- verify(translucentActivity.mLetterboxUiController).updateInheritedLetterbox();
- assertNull(translucentActivity.mLetterboxUiController.mFirstOpaqueActivityBeneath);
- }
-
- @Test
- public void testNotApplyStrategyAgainWhenOpaqueIsNotDestroyed() {
- mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
- setUpDisplaySizeWithApp(2000, 1000);
- prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
- mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
- // Launch another opaque activity
- final ActivityRecord opaqueActivity = new ActivityBuilder(mAtm)
- .setLaunchedFromUid(mActivity.getUid())
- .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
- .build();
- mTask.addChild(opaqueActivity);
- // Transparent activity strategy not applied
- assertFalse(opaqueActivity.mLetterboxUiController.hasInheritedLetterboxBehavior());
-
- // Launch translucent Activity
- final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
- .setLaunchedFromUid(mActivity.getUid())
- .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
- .build();
- doReturn(false).when(translucentActivity).fillsParent();
- mTask.addChild(translucentActivity);
- // Transparent strategy applied
- assertTrue(translucentActivity.mLetterboxUiController.hasInheritedLetterboxBehavior());
-
- spyOn(translucentActivity.mLetterboxUiController);
- clearInvocations(translucentActivity.mLetterboxUiController);
-
- // Check that updateInheritedLetterbox() is invoked again
- verify(translucentActivity.mLetterboxUiController, never()).updateInheritedLetterbox();
- }
-
- @Test
public void testApplyStrategyToTranslucentActivities() {
mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
setUpDisplaySizeWithApp(2000, 1000);
prepareUnresizable(mActivity, 1.5f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
mActivity.info.setMinAspectRatio(1.2f);
mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.nowVisible = true;
// Translucent Activity
final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
.setLaunchedFromUid(mActivity.getUid())
@@ -505,6 +448,7 @@ public class SizeCompatTests extends WindowTestsBase {
prepareUnresizable(mActivity, 1.5f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
mActivity.info.setMinAspectRatio(1.2f);
mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.nowVisible = true;
// Translucent Activity
final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
.setLaunchedFromUid(mActivity.getUid())
@@ -598,6 +542,7 @@ public class SizeCompatTests extends WindowTestsBase {
true /* ignoreOrientationRequest */);
mActivity.mWmService.mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier(
1.0f /*letterboxVerticalPositionMultiplier*/);
+ mActivity.nowVisible = true;
prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
// We launch a transparent activity
final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
@@ -630,6 +575,7 @@ public class SizeCompatTests extends WindowTestsBase {
mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
setUpDisplaySizeWithApp(2800, 1400);
mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.nowVisible = true;
prepareUnresizable(mActivity, -1f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT);
// Rotate to put activity in size compat mode.
rotateDisplay(mActivity.mDisplayContent, ROTATION_90);