Loading core/java/android/content/pm/ActivityInfo.java +11 −0 Original line number Diff line number Diff line Loading @@ -1328,6 +1328,17 @@ public class ActivityInfo extends ComponentInfo implements Parcelable { @TestApi public static final long OVERRIDE_MIN_ASPECT_RATIO = 174042980L; // buganizer id /** * This change id restricts treatments that force a given min aspect ratio to * only when an app is connected to the camera * * @hide */ @ChangeId @Overridable @Disabled public static final long OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA = 325586858L; // buganizer id /** * This change id restricts treatments that force a given min aspect ratio to activities * whose orientation is fixed to portrait. Loading services/core/java/com/android/server/wm/ActivityRecord.java +12 −2 Original line number Diff line number Diff line Loading @@ -9766,10 +9766,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (mLetterboxUiController.shouldApplyUserMinAspectRatioOverride()) { return mLetterboxUiController.getUserMinAspectRatio(); } if (!mLetterboxUiController.shouldOverrideMinAspectRatio()) { if (!mLetterboxUiController.shouldOverrideMinAspectRatio() && !mLetterboxUiController.shouldOverrideMinAspectRatioForCamera()) { return info.getMinAspectRatio(); } if (info.isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY) && !ActivityInfo.isFixedOrientationPortrait( getOverrideOrientation())) { Loading Loading @@ -9890,6 +9890,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return updateReportedConfigurationAndSend(); } /** * @return {@code true} if the Camera is active for the current activity */ boolean isCameraActive() { return mDisplayContent != null && mDisplayContent.getDisplayRotationCompatPolicy() != null && mDisplayContent.getDisplayRotationCompatPolicy() .isCameraActive(this, /* mustBeFullscreen */ true); } boolean updateReportedConfigurationAndSend() { if (isConfigurationDispatchPaused()) { Slog.wtf(TAG, "trying to update reported(client) config while dispatch is paused"); Loading services/core/java/com/android/server/wm/DisplayContent.java +9 −0 Original line number Diff line number Diff line Loading @@ -1307,6 +1307,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } } /** * @return The {@link DisplayRotationCompatPolicy} for this DisplayContent */ // TODO(b/335387481) Allow access to DisplayRotationCompatPolicy only with getters @Nullable DisplayRotationCompatPolicy getDisplayRotationCompatPolicy() { return mDisplayRotationCompatPolicy; } @Override void migrateToNewSurfaceControl(Transaction t) { t.remove(mSurfaceControl); Loading services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java +11 −10 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ import java.util.Set; * R.bool.config_isWindowManagerCameraCompatTreatmentEnabled} is {@code true}. */ // TODO(b/261444714): Consider moving Camera-specific logic outside of the WM Core path final class DisplayRotationCompatPolicy { class DisplayRotationCompatPolicy { // Delay for updating display rotation after Camera connection is closed. Needed to avoid // rotation flickering when an app is flipping between front and rear cameras or when size Loading Loading @@ -342,7 +342,8 @@ final class DisplayRotationCompatPolicy { boolean isActivityEligibleForOrientationOverride(@NonNull ActivityRecord activity) { return isTreatmentEnabledForDisplay() && isCameraActive(activity, /* mustBeFullscreen */ true); && isCameraActive(activity, /* mustBeFullscreen */ true) && activity.mLetterboxUiController.shouldForceRotateForCameraCompat(); } Loading @@ -360,6 +361,13 @@ final class DisplayRotationCompatPolicy { return isTreatmentEnabledForActivity(activity, /* mustBeFullscreen */ true); } boolean isCameraActive(@NonNull ActivityRecord activity, boolean mustBeFullscreen) { // Checking windowing mode on activity level because we don't want to // apply treatment in case of activity embedding. return (!mustBeFullscreen || !activity.inMultiWindowMode()) && mCameraIdPackageBiMap.containsPackageName(activity.packageName); } private boolean isTreatmentEnabledForActivity(@Nullable ActivityRecord activity, boolean mustBeFullscreen) { return activity != null && isCameraActive(activity, mustBeFullscreen) Loading @@ -367,14 +375,7 @@ final class DisplayRotationCompatPolicy { // "locked" and "nosensor" values are often used by camera apps that can't // handle dynamic changes so we shouldn't force rotate them. && activity.getOverrideOrientation() != SCREEN_ORIENTATION_NOSENSOR && activity.getOverrideOrientation() != SCREEN_ORIENTATION_LOCKED; } private boolean isCameraActive(@NonNull ActivityRecord activity, boolean mustBeFullscreen) { // Checking windowing mode on activity level because we don't want to // apply treatment in case of activity embedding. return (!mustBeFullscreen || !activity.inMultiWindowMode()) && mCameraIdPackageBiMap.containsPackageName(activity.packageName) && activity.getOverrideOrientation() != SCREEN_ORIENTATION_LOCKED && activity.mLetterboxUiController.shouldForceRotateForCameraCompat(); } Loading services/core/java/com/android/server/wm/LetterboxUiController.java +23 −1 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_ORIE import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE; import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO; import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA; import static android.content.pm.ActivityInfo.OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA; import static android.content.pm.ActivityInfo.OVERRIDE_RESPECT_REQUESTED_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR; Loading Loading @@ -508,6 +509,26 @@ final class LetterboxUiController { isCompatChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO)); } /** * Whether we should apply the min aspect ratio per-app override only when an app is connected * to the camera. * When this override is applied the min aspect ratio given in the app's manifest will be * overridden to the largest enabled aspect ratio treatment unless the app's manifest value * is higher. The treatment will also apply if no value is provided in the manifest. * * <p>This method returns {@code true} when the following conditions are met: * <ul> * <li>Opt-out component property isn't enabled * <li>Per-app override is enabled * </ul> */ boolean shouldOverrideMinAspectRatioForCamera() { return mActivityRecord.isCameraActive() && mAllowMinAspectRatioOverrideOptProp .shouldEnableWithOptInOverrideAndOptOutProperty( isCompatChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA)); } /** * Whether we should apply the force resize per-app override. When this override is applied it * forces the packages it is applied to to be resizable. It won't change whether the app can be Loading Loading @@ -942,7 +963,8 @@ final class LetterboxUiController { void recomputeConfigurationForCameraCompatIfNeeded() { if (isOverrideOrientationOnlyForCameraEnabled() || isCameraCompatSplitScreenAspectRatioAllowed()) { || isCameraCompatSplitScreenAspectRatioAllowed() || shouldOverrideMinAspectRatioForCamera()) { mActivityRecord.recomputeConfiguration(); } } Loading Loading
core/java/android/content/pm/ActivityInfo.java +11 −0 Original line number Diff line number Diff line Loading @@ -1328,6 +1328,17 @@ public class ActivityInfo extends ComponentInfo implements Parcelable { @TestApi public static final long OVERRIDE_MIN_ASPECT_RATIO = 174042980L; // buganizer id /** * This change id restricts treatments that force a given min aspect ratio to * only when an app is connected to the camera * * @hide */ @ChangeId @Overridable @Disabled public static final long OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA = 325586858L; // buganizer id /** * This change id restricts treatments that force a given min aspect ratio to activities * whose orientation is fixed to portrait. Loading
services/core/java/com/android/server/wm/ActivityRecord.java +12 −2 Original line number Diff line number Diff line Loading @@ -9766,10 +9766,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (mLetterboxUiController.shouldApplyUserMinAspectRatioOverride()) { return mLetterboxUiController.getUserMinAspectRatio(); } if (!mLetterboxUiController.shouldOverrideMinAspectRatio()) { if (!mLetterboxUiController.shouldOverrideMinAspectRatio() && !mLetterboxUiController.shouldOverrideMinAspectRatioForCamera()) { return info.getMinAspectRatio(); } if (info.isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY) && !ActivityInfo.isFixedOrientationPortrait( getOverrideOrientation())) { Loading Loading @@ -9890,6 +9890,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return updateReportedConfigurationAndSend(); } /** * @return {@code true} if the Camera is active for the current activity */ boolean isCameraActive() { return mDisplayContent != null && mDisplayContent.getDisplayRotationCompatPolicy() != null && mDisplayContent.getDisplayRotationCompatPolicy() .isCameraActive(this, /* mustBeFullscreen */ true); } boolean updateReportedConfigurationAndSend() { if (isConfigurationDispatchPaused()) { Slog.wtf(TAG, "trying to update reported(client) config while dispatch is paused"); Loading
services/core/java/com/android/server/wm/DisplayContent.java +9 −0 Original line number Diff line number Diff line Loading @@ -1307,6 +1307,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } } /** * @return The {@link DisplayRotationCompatPolicy} for this DisplayContent */ // TODO(b/335387481) Allow access to DisplayRotationCompatPolicy only with getters @Nullable DisplayRotationCompatPolicy getDisplayRotationCompatPolicy() { return mDisplayRotationCompatPolicy; } @Override void migrateToNewSurfaceControl(Transaction t) { t.remove(mSurfaceControl); Loading
services/core/java/com/android/server/wm/DisplayRotationCompatPolicy.java +11 −10 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ import java.util.Set; * R.bool.config_isWindowManagerCameraCompatTreatmentEnabled} is {@code true}. */ // TODO(b/261444714): Consider moving Camera-specific logic outside of the WM Core path final class DisplayRotationCompatPolicy { class DisplayRotationCompatPolicy { // Delay for updating display rotation after Camera connection is closed. Needed to avoid // rotation flickering when an app is flipping between front and rear cameras or when size Loading Loading @@ -342,7 +342,8 @@ final class DisplayRotationCompatPolicy { boolean isActivityEligibleForOrientationOverride(@NonNull ActivityRecord activity) { return isTreatmentEnabledForDisplay() && isCameraActive(activity, /* mustBeFullscreen */ true); && isCameraActive(activity, /* mustBeFullscreen */ true) && activity.mLetterboxUiController.shouldForceRotateForCameraCompat(); } Loading @@ -360,6 +361,13 @@ final class DisplayRotationCompatPolicy { return isTreatmentEnabledForActivity(activity, /* mustBeFullscreen */ true); } boolean isCameraActive(@NonNull ActivityRecord activity, boolean mustBeFullscreen) { // Checking windowing mode on activity level because we don't want to // apply treatment in case of activity embedding. return (!mustBeFullscreen || !activity.inMultiWindowMode()) && mCameraIdPackageBiMap.containsPackageName(activity.packageName); } private boolean isTreatmentEnabledForActivity(@Nullable ActivityRecord activity, boolean mustBeFullscreen) { return activity != null && isCameraActive(activity, mustBeFullscreen) Loading @@ -367,14 +375,7 @@ final class DisplayRotationCompatPolicy { // "locked" and "nosensor" values are often used by camera apps that can't // handle dynamic changes so we shouldn't force rotate them. && activity.getOverrideOrientation() != SCREEN_ORIENTATION_NOSENSOR && activity.getOverrideOrientation() != SCREEN_ORIENTATION_LOCKED; } private boolean isCameraActive(@NonNull ActivityRecord activity, boolean mustBeFullscreen) { // Checking windowing mode on activity level because we don't want to // apply treatment in case of activity embedding. return (!mustBeFullscreen || !activity.inMultiWindowMode()) && mCameraIdPackageBiMap.containsPackageName(activity.packageName) && activity.getOverrideOrientation() != SCREEN_ORIENTATION_LOCKED && activity.mLetterboxUiController.shouldForceRotateForCameraCompat(); } Loading
services/core/java/com/android/server/wm/LetterboxUiController.java +23 −1 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_ORIE import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE; import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO; import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA; import static android.content.pm.ActivityInfo.OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA; import static android.content.pm.ActivityInfo.OVERRIDE_RESPECT_REQUESTED_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR; Loading Loading @@ -508,6 +509,26 @@ final class LetterboxUiController { isCompatChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO)); } /** * Whether we should apply the min aspect ratio per-app override only when an app is connected * to the camera. * When this override is applied the min aspect ratio given in the app's manifest will be * overridden to the largest enabled aspect ratio treatment unless the app's manifest value * is higher. The treatment will also apply if no value is provided in the manifest. * * <p>This method returns {@code true} when the following conditions are met: * <ul> * <li>Opt-out component property isn't enabled * <li>Per-app override is enabled * </ul> */ boolean shouldOverrideMinAspectRatioForCamera() { return mActivityRecord.isCameraActive() && mAllowMinAspectRatioOverrideOptProp .shouldEnableWithOptInOverrideAndOptOutProperty( isCompatChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA)); } /** * Whether we should apply the force resize per-app override. When this override is applied it * forces the packages it is applied to to be resizable. It won't change whether the app can be Loading Loading @@ -942,7 +963,8 @@ final class LetterboxUiController { void recomputeConfigurationForCameraCompatIfNeeded() { if (isOverrideOrientationOnlyForCameraEnabled() || isCameraCompatSplitScreenAspectRatioAllowed()) { || isCameraCompatSplitScreenAspectRatioAllowed() || shouldOverrideMinAspectRatioForCamera()) { mActivityRecord.recomputeConfiguration(); } } Loading