summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java8
-rw-r--r--services/core/java/com/android/server/wm/LetterboxUiController.java29
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java43
3 files changed, 75 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 056b144a90b9..8aca912999cc 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -8293,7 +8293,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
void recomputeConfiguration() {
- onRequestedOverrideConfigurationChanged(getRequestedOverrideConfiguration());
+ // We check if the current activity is transparent. In that case we need to
+ // recomputeConfiguration of the first opaque activity beneath, to allow a
+ // proper computation of the new bounds.
+ if (!mLetterboxUiController.applyOnOpaqueActivityBelow(
+ ActivityRecord::recomputeConfiguration)) {
+ onRequestedOverrideConfigurationChanged(getRequestedOverrideConfiguration());
+ }
}
boolean isInTransition() {
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java
index 1aa0ec3c1280..d2e8ad1f66b9 100644
--- a/services/core/java/com/android/server/wm/LetterboxUiController.java
+++ b/services/core/java/com/android/server/wm/LetterboxUiController.java
@@ -81,6 +81,7 @@ import static com.android.server.wm.LetterboxConfiguration.letterboxBackgroundTy
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager.TaskDescription;
import android.content.pm.ActivityInfo.ScreenOrientation;
@@ -104,7 +105,9 @@ import com.android.internal.statusbar.LetterboxDetails;
import com.android.server.wm.LetterboxConfiguration.LetterboxBackgroundType;
import java.io.PrintWriter;
+import java.util.Optional;
import java.util.function.BooleanSupplier;
+import java.util.function.Consumer;
import java.util.function.Predicate;
/** Controls behaviour of the letterbox UI for {@link mActivityRecord}. */
@@ -1471,6 +1474,32 @@ final class LetterboxUiController {
return mInheritedCompatDisplayInsets;
}
+ /**
+ * In case of translucent activities, it consumes the {@link ActivityRecord} of the first opaque
+ * activity beneath using the given consumer and returns {@code true}.
+ */
+ boolean applyOnOpaqueActivityBelow(@NonNull Consumer<ActivityRecord> consumer) {
+ return findOpaqueNotFinishingActivityBelow()
+ .map(activityRecord -> {
+ consumer.accept(activityRecord);
+ return true;
+ }).orElse(false);
+ }
+
+ /**
+ * @return The first not finishing opaque activity beneath the current translucent activity
+ * if it exists and the strategy is enabled.
+ */
+ private Optional<ActivityRecord> findOpaqueNotFinishingActivityBelow() {
+ if (!hasInheritedLetterboxBehavior() || mActivityRecord.getTask() == null) {
+ return Optional.empty();
+ }
+ return Optional.ofNullable(mActivityRecord.getTask().getActivity(
+ FIRST_OPAQUE_NOT_FINISHING_ACTIVITY_PREDICATE /* callback */,
+ mActivityRecord /* boundary */, false /* includeBoundary */,
+ true /* traverseTopToBottom */));
+ }
+
private void inheritConfiguration(ActivityRecord firstOpaque) {
// To avoid wrong behaviour, we're not forcing a specific aspet ratio to activities
// which are not already providing one (e.g. permission dialogs) and presumably also
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 2c4f1663153c..c4269137199e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -271,6 +271,35 @@ public class SizeCompatTests extends WindowTestsBase {
}
@Test
+ public void testTranslucentActivitiesWhenUnfolding() {
+ mWm.mLetterboxConfiguration.setTranslucentLetterboxingOverrideEnabled(true);
+ setUpDisplaySizeWithApp(2800, 1400);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+ mActivity.mWmService.mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier(
+ 1.0f /*letterboxVerticalPositionMultiplier*/);
+ prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT);
+ // We launch a transparent activity
+ final ActivityRecord translucentActivity = new ActivityBuilder(mAtm)
+ .setLaunchedFromUid(mActivity.getUid())
+ .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
+ .build();
+ doReturn(false).when(translucentActivity).fillsParent();
+ mTask.addChild(translucentActivity);
+
+ mTask.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ spyOn(mActivity);
+
+ // Halffold
+ setFoldablePosture(translucentActivity, true /* isHalfFolded */, false /* isTabletop */);
+ verify(mActivity).recomputeConfiguration();
+ clearInvocations(mActivity);
+
+ // Unfold
+ setFoldablePosture(translucentActivity, false /* isHalfFolded */, false /* isTabletop */);
+ verify(mActivity).recomputeConfiguration();
+ }
+
+ @Test
public void testRestartProcessIfVisible() {
setUpDisplaySizeWithApp(1000, 2500);
doNothing().when(mSupervisor).scheduleRestartTimeout(mActivity);
@@ -3339,14 +3368,20 @@ public class SizeCompatTests extends WindowTestsBase {
}
- private void setFoldablePosture(boolean isHalfFolded, boolean isTabletop) {
- final DisplayRotation r = mActivity.mDisplayContent.getDisplayRotation();
+ private void setFoldablePosture(ActivityRecord activity, boolean isHalfFolded,
+ boolean isTabletop) {
+ final DisplayRotation r = activity.mDisplayContent.getDisplayRotation();
doReturn(isHalfFolded).when(r).isDisplaySeparatingHinge();
doReturn(false).when(r).isDeviceInPosture(any(DeviceState.class), anyBoolean());
if (isHalfFolded) {
- doReturn(true).when(r).isDeviceInPosture(DeviceState.HALF_FOLDED, isTabletop);
+ doReturn(true).when(r)
+ .isDeviceInPosture(DeviceState.HALF_FOLDED, isTabletop);
}
- mActivity.recomputeConfiguration();
+ activity.recomputeConfiguration();
+ }
+
+ private void setFoldablePosture(boolean isHalfFolded, boolean isTabletop) {
+ setFoldablePosture(mActivity, isHalfFolded, isTabletop);
}
@Test