diff options
3 files changed, 64 insertions, 70 deletions
diff --git a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java index d59046f44129..f1dd41e7d74a 100644 --- a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java +++ b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java @@ -39,6 +39,7 @@ import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION import static com.android.server.wm.AppCompatUtils.isChangeEnabled; import android.annotation.NonNull; +import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; @@ -126,18 +127,18 @@ class AppCompatAspectRatioOverrides { return false; } - mUserAspectRatioState.mUserAspectRatio = getUserMinAspectRatioOverrideCode(); + final int aspectRatio = getUserMinAspectRatioOverrideCode(); - return mUserAspectRatioState.mUserAspectRatio != USER_MIN_ASPECT_RATIO_UNSET - && mUserAspectRatioState.mUserAspectRatio != USER_MIN_ASPECT_RATIO_APP_DEFAULT - && mUserAspectRatioState.mUserAspectRatio != USER_MIN_ASPECT_RATIO_FULLSCREEN; + return aspectRatio != USER_MIN_ASPECT_RATIO_UNSET + && aspectRatio != USER_MIN_ASPECT_RATIO_APP_DEFAULT + && aspectRatio != USER_MIN_ASPECT_RATIO_FULLSCREEN; } boolean shouldApplyUserFullscreenOverride() { if (isUserFullscreenOverrideEnabled()) { - mUserAspectRatioState.mUserAspectRatio = getUserMinAspectRatioOverrideCode(); + final int aspectRatio = getUserMinAspectRatioOverrideCode(); - return mUserAspectRatioState.mUserAspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN; + return aspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN; } return false; @@ -153,10 +154,12 @@ class AppCompatAspectRatioOverrides { } boolean isSystemOverrideToFullscreenEnabled() { + final int aspectRatio = getUserMinAspectRatioOverrideCode(); + return isChangeEnabled(mActivityRecord, OVERRIDE_ANY_ORIENTATION_TO_USER) && !mAllowOrientationOverrideOptProp.isFalse() - && (mUserAspectRatioState.mUserAspectRatio == USER_MIN_ASPECT_RATIO_UNSET - || mUserAspectRatioState.mUserAspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN); + && (aspectRatio == USER_MIN_ASPECT_RATIO_UNSET + || aspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN); } /** @@ -173,12 +176,11 @@ class AppCompatAspectRatioOverrides { } boolean hasFullscreenOverride() { - // `mUserAspectRatio` is always initialized first in `shouldApplyUserFullscreenOverride()`. return shouldApplyUserFullscreenOverride() || isSystemOverrideToFullscreenEnabled(); } float getUserMinAspectRatio() { - switch (mUserAspectRatioState.mUserAspectRatio) { + switch (getUserMinAspectRatioOverrideCode()) { case USER_MIN_ASPECT_RATIO_DISPLAY_SIZE: return getDisplaySizeMinAspectRatio(); case USER_MIN_ASPECT_RATIO_SPLIT_SCREEN: @@ -269,13 +271,7 @@ class AppCompatAspectRatioOverrides { } int getUserMinAspectRatioOverrideCode() { - try { - return mActivityRecord.mAtmService.getPackageManager() - .getUserMinAspectRatio(mActivityRecord.packageName, mActivityRecord.mUserId); - } catch (RemoteException e) { - Slog.w(TAG, "Exception thrown retrieving aspect ratio user override " + this, e); - } - return mUserAspectRatioState.mUserAspectRatio; + return mUserAspectRatioState.getUserAspectRatio(mActivityRecord); } private float getDefaultMinAspectRatioForUnresizableApps() { @@ -300,10 +296,30 @@ class AppCompatAspectRatioOverrides { } private static class UserAspectRatioState { - // TODO(b/315140179): Make mUserAspectRatio final - // The min aspect ratio override set by user + // The min aspect ratio override set by the user. @PackageManager.UserMinAspectRatio private int mUserAspectRatio = USER_MIN_ASPECT_RATIO_UNSET; + private boolean mHasBeenSet = false; + + @PackageManager.UserMinAspectRatio + private int getUserAspectRatio(@NonNull ActivityRecord activityRecord) { + // Package manager can be null at construction time, so access should be on demand. + if (!mHasBeenSet) { + try { + final IPackageManager pm = activityRecord.mAtmService.getPackageManager(); + if (pm != null) { + mUserAspectRatio = pm.getUserMinAspectRatio(activityRecord.packageName, + activityRecord.mUserId); + mHasBeenSet = true; + } + } catch (RemoteException e) { + Slog.w(TAG, "Exception thrown retrieving aspect ratio user override " + + this, e); + } + } + + return mUserAspectRatio; + } } private Resources getResources() { diff --git a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java index f5d58eac1113..e3a9d672c17f 100644 --- a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java @@ -56,11 +56,11 @@ class AppCompatOrientationPolicy { final DisplayContent displayContent = mActivityRecord.mDisplayContent; final boolean isIgnoreOrientationRequestEnabled = displayContent != null && displayContent.getIgnoreOrientationRequest(); - final boolean shouldApplyUserFullscreenOverride = mAppCompatOverrides - .getAppCompatAspectRatioOverrides().shouldApplyUserFullscreenOverride(); + final boolean hasFullscreenOverride = mAppCompatOverrides + .getAppCompatAspectRatioOverrides().hasFullscreenOverride(); final boolean shouldCameraCompatControlOrientation = AppCompatCameraPolicy.shouldCameraCompatControlOrientation(mActivityRecord); - if (shouldApplyUserFullscreenOverride && isIgnoreOrientationRequestEnabled + if (hasFullscreenOverride && isIgnoreOrientationRequestEnabled // Do not override orientation to fullscreen for camera activities. // Fixed-orientation activities are rarely tested in other orientations, and it // often results in sideways or stretched previews. As the camera compat treatment @@ -69,8 +69,7 @@ class AppCompatOrientationPolicy { && !shouldCameraCompatControlOrientation) { Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate) + " for " + mActivityRecord + " is overridden to " - + screenOrientationToString(SCREEN_ORIENTATION_USER) - + " by user aspect ratio settings."); + + screenOrientationToString(SCREEN_ORIENTATION_USER)); return SCREEN_ORIENTATION_USER; } @@ -101,24 +100,6 @@ class AppCompatOrientationPolicy { return candidate; } - // mUserAspectRatio is always initialized first in shouldApplyUserFullscreenOverride(), - // which will always come first before this check as user override > device - // manufacturer override. - final boolean isSystemOverrideToFullscreenEnabled = mAppCompatOverrides - .getAppCompatAspectRatioOverrides().isSystemOverrideToFullscreenEnabled(); - if (isSystemOverrideToFullscreenEnabled && isIgnoreOrientationRequestEnabled - // Do not override orientation to fullscreen for camera activities. - // Fixed-orientation activities are rarely tested in other orientations, and it - // often results in sideways or stretched previews. As the camera compat treatment - // targets fixed-orientation activities, overriding the orientation disables the - // treatment. - && !shouldCameraCompatControlOrientation) { - Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate) - + " for " + mActivityRecord + " is overridden to " - + screenOrientationToString(SCREEN_ORIENTATION_USER)); - return SCREEN_ORIENTATION_USER; - } - final AppCompatOrientationOverrides.OrientationOverridesState capabilityState = mAppCompatOverrides.getAppCompatOrientationOverrides() .mOrientationOverridesState; 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 c30f70ee2903..e956e225f811 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -63,9 +63,9 @@ import static com.android.server.wm.ActivityRecord.State.PAUSED; import static com.android.server.wm.ActivityRecord.State.RESTARTING_PROCESS; import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityRecord.State.STOPPED; +import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_POSITION_MULTIPLIER_CENTER; import static com.android.server.wm.AppCompatUtils.computeAspectRatio; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; -import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_POSITION_MULTIPLIER_CENTER; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.google.common.truth.Truth.assertThat; @@ -95,13 +95,11 @@ import android.compat.testing.PlatformCompatChangeRule; import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo.ScreenOrientation; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Insets; import android.graphics.Rect; import android.os.Binder; -import android.os.RemoteException; import android.os.UserHandle; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; @@ -1570,7 +1568,7 @@ public class SizeCompatTests extends WindowTestsBase { new TestSplitOrganizer(mAtm, activity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, 1000, 1400); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, activity.getWindowingMode()); @@ -1957,7 +1955,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to multi-window which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -1993,7 +1991,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to multi-window which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2126,7 +2124,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(screenWidth, screenHeight); mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); mActivity.mWmService.mAppCompatConfiguration - .setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true); + .setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true); mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(1.1f); @@ -2147,7 +2145,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, getExpectedSplitSize(screenWidth), screenHeight); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2392,13 +2390,11 @@ public class SizeCompatTests extends WindowTestsBase { spyOn(activity.mWmService.mAppCompatConfiguration); doReturn(enabled).when(activity.mWmService.mAppCompatConfiguration) .isUserAppAspectRatioSettingsEnabled(); - // Set user aspect ratio override - final IPackageManager pm = mAtm.getPackageManager(); - try { - doReturn(aspectRatio).when(pm) - .getUserMinAspectRatio(activity.packageName, activity.mUserId); - } catch (RemoteException ignored) { - } + final AppCompatAspectRatioOverrides aspectRatioOverrides = + activity.mAppCompatController.getAppCompatAspectRatioOverrides(); + spyOn(aspectRatioOverrides); + // Set user aspect ratio override. + doReturn(aspectRatio).when(aspectRatioOverrides).getUserMinAspectRatioOverrideCode(); prepareLimitedBounds(activity, screenOrientation, isUnresizable); @@ -2507,7 +2503,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, activity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, getExpectedSplitSize(screenWidth), screenHeight); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, activity.getWindowingMode()); @@ -2542,7 +2538,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, activity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, activity.getWindowingMode()); @@ -2663,7 +2659,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(screenWidth, screenHeight); mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); mActivity.mWmService.mAppCompatConfiguration - .setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true); + .setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true); mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(1.1f); @@ -2684,7 +2680,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2712,7 +2708,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, displayWidth, getExpectedSplitSize(displayHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2748,7 +2744,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, getExpectedSplitSize(displayWidth), displayHeight); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2879,7 +2875,7 @@ public class SizeCompatTests extends WindowTestsBase { // App bounds should be 700x1400 with the ratio as the display. assertEquals(rotatedDisplayBounds.height(), rotatedActivityBounds.height()); assertEquals(rotatedDisplayBounds.height() * rotatedDisplayBounds.height() - / rotatedDisplayBounds.width(), rotatedActivityBounds.width()); + / rotatedDisplayBounds.width(), rotatedActivityBounds.width()); } @Test @@ -3328,7 +3324,7 @@ public class SizeCompatTests extends WindowTestsBase { final Rect originalBounds = new Rect(mActivity.getBounds()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, 1000, 1400); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -3444,7 +3440,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, 1.1f, SCREEN_ORIENTATION_PORTRAIT); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, 1400, 1000); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -3468,7 +3464,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, 1.1f, SCREEN_ORIENTATION_LANDSCAPE); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, 1000, 1400); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -3909,7 +3905,7 @@ public class SizeCompatTests extends WindowTestsBase { final DisplayPolicy policy = display.getDisplayPolicy(); DisplayPolicy.DecorInsets.Info decorInfo = policy.getDecorInsetsInfo(ROTATION_90, display.mBaseDisplayHeight, display.mBaseDisplayWidth); - decorInfo.mNonDecorInsets.set(130, 0, 60, 0); + decorInfo.mNonDecorInsets.set(130, 0, 60, 0); spyOn(policy); doReturn(decorInfo).when(policy).getDecorInsetsInfo(ROTATION_90, display.mBaseDisplayHeight, display.mBaseDisplayWidth); @@ -4145,6 +4141,7 @@ public class SizeCompatTests extends WindowTestsBase { // can be aligned inside parentAppBounds assertEquals(activity.getBounds(), new Rect(175, 0, 2275, 1000)); } + @Test @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED}) public void testApplyAspectRatio_activityCannotAlignWithParentAppHorizontal() { @@ -4198,7 +4195,7 @@ public class SizeCompatTests extends WindowTestsBase { final DisplayPolicy policy = display.getDisplayPolicy(); DisplayPolicy.DecorInsets.Info decorInfo = policy.getDecorInsetsInfo(ROTATION_90, display.mBaseDisplayHeight, display.mBaseDisplayWidth); - decorInfo.mNonDecorInsets.set(0, 130, 0, 60); + decorInfo.mNonDecorInsets.set(0, 130, 0, 60); spyOn(policy); doReturn(decorInfo).when(policy).getDecorInsetsInfo(ROTATION_90, display.mBaseDisplayHeight, display.mBaseDisplayWidth); @@ -4451,7 +4448,7 @@ public class SizeCompatTests extends WindowTestsBase { mActivity.mResolveConfigHint.mUseOverrideInsetsForConfig = true; // Set task as freeform mTask.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM); - prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); + prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); Rect bounds = new Rect(mActivity.getWindowConfiguration().getBounds()); Rect appBounds = new Rect(mActivity.getWindowConfiguration().getAppBounds()); |