Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7ff735d authored by Massimo Carli's avatar Massimo Carli
Browse files

[3/n] Define OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA

Introduces the OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA
per app override to intentionally letterbox activities
while camera connection is open, to a more traditional
phone form factors (16:9 or split-screen) aspect ratio
depending on existing OVERRIDE_MIN_ASPECT_RATIO_*
overrides.

The existing PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE
can be used to allow to opt-out from this override.

Fix: 325586858
Test: atest WmTests:LetterboxUiControllerTest
Test: atest WmTests:ActivityRecordTests
Test: atest WmTests:DisplayRotationCompatPolicyTests
Test: atest WmTests:SizeCompatTests

Change-Id: Ib0f9a854372e35621345fbad60578c4238f54349
Merged-In: Ib0f9a854372e35621345fbad60578c4238f54349
parent ff603f83
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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.
+12 −2
Original line number Diff line number Diff line
@@ -9759,10 +9759,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())) {
@@ -9883,6 +9883,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");
+9 −0
Original line number Diff line number Diff line
@@ -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);
+11 −10
Original line number Diff line number Diff line
@@ -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
@@ -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();
    }


@@ -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)
@@ -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();
    }

+23 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -946,7 +967,8 @@ final class LetterboxUiController {

    void recomputeConfigurationForCameraCompatIfNeeded() {
        if (isOverrideOrientationOnlyForCameraEnabled()
                || isCameraCompatSplitScreenAspectRatioAllowed()) {
                || isCameraCompatSplitScreenAspectRatioAllowed()
                || shouldOverrideMinAspectRatioForCamera()) {
            mActivityRecord.recomputeConfiguration();
        }
    }
Loading