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

Commit 7042bef0 authored by Mina Granic's avatar Mina Granic
Browse files

Rename camera compat utility methods in AppCompatActivityRobot.

It also makes many `AppCompatCameraPolicy` methods static, to avoid several
null checks when accesing camera compat classes via `ActivityRecord`
(`DisplayContent` could be null, and if it's not, all classes in the
`AppCompatCameraPolicy` could be null).

Flag: com.android.window.flags.enable_camera_compat_for_desktop_windowing
Bug: 370916718
Test: atest WmTests:AppCompatOrientationPolicyTest
Test: atest WmTests:AppCompatCameraPolicyTest
Change-Id: I3794b96df4ce77fa17be46b30c05f6bb38ae280c
parent b3820ebb
Loading
Loading
Loading
Loading
+2 −10
Original line number Diff line number Diff line
@@ -6409,11 +6409,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            // and the token could be null.
            return;
        }
        final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy
                .getAppCompatCameraPolicy(r);
        if (cameraPolicy != null) {
            cameraPolicy.onActivityRefreshed(r);
        }
        AppCompatCameraPolicy.onActivityRefreshed(r);
    }

    static void splashScreenAttachedLocked(IBinder token) {
@@ -9456,11 +9452,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            return;
        }

        final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy.getAppCompatCameraPolicy(
                this);
        if (cameraPolicy != null) {
            cameraPolicy.onActivityConfigurationChanging(this, newConfig, lastReportedConfig);
        }
        AppCompatCameraPolicy.onActivityConfigurationChanging(this, newConfig, lastReportedConfig);
    }

    /** Get process configuration, or global config if the process is not set. */
+1 −4
Original line number Diff line number Diff line
@@ -255,13 +255,10 @@ class AppCompatAspectRatioOverrides {
                mActivityRecord.getOverrideOrientation());
        final AppCompatCameraOverrides cameraOverrides =
                mActivityRecord.mAppCompatController.getAppCompatCameraOverrides();
        final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy.getAppCompatCameraPolicy(
                mActivityRecord);
        // Don't resize to split screen size when in book mode if letterbox position is centered
        return (isBookMode && isNotCenteredHorizontally || isTabletopMode && isLandscape)
                || cameraOverrides.isCameraCompatSplitScreenAspectRatioAllowed()
                && (cameraPolicy != null
                    && cameraPolicy.isTreatmentEnabledForActivity(mActivityRecord));
                && AppCompatCameraPolicy.isTreatmentEnabledForActivity(mActivityRecord);
    }

    /**
+3 −9
Original line number Diff line number Diff line
@@ -74,11 +74,9 @@ class AppCompatAspectRatioPolicy {
            @NonNull Rect parentBounds) {
        // If in camera compat mode, aspect ratio from the camera compat policy has priority over
        // default letterbox aspect ratio.
        final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy.getAppCompatCameraPolicy(
                mActivityRecord);
        if (cameraPolicy != null && cameraPolicy.shouldCameraCompatControlAspectRatio(
        if (AppCompatCameraPolicy.shouldCameraCompatControlAspectRatio(
                mActivityRecord)) {
            return cameraPolicy.getCameraCompatAspectRatio(mActivityRecord);
            return AppCompatCameraPolicy.getCameraCompatAspectRatio(mActivityRecord);
        }

        final float letterboxAspectRatioOverride =
@@ -128,12 +126,8 @@ class AppCompatAspectRatioPolicy {
        if (aspectRatioOverrides.shouldApplyUserMinAspectRatioOverride()) {
            return aspectRatioOverrides.getUserMinAspectRatio();
        }
        final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy.getAppCompatCameraPolicy(
                mActivityRecord);
        final boolean shouldOverrideMinAspectRatioForCamera = cameraPolicy != null
                && cameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord);
        if (!aspectRatioOverrides.shouldOverrideMinAspectRatio()
                && !shouldOverrideMinAspectRatioForCamera) {
                && !AppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord)) {
            if (mActivityRecord.isUniversalResizeable()) {
                return 0;
            }
+69 −47
Original line number Diff line number Diff line
@@ -70,9 +70,10 @@ class AppCompatCameraPolicy {
        }
    }

    void onActivityRefreshed(@NonNull ActivityRecord activity) {
        if (mActivityRefresher != null) {
            mActivityRefresher.onActivityRefreshed(activity);
    static void onActivityRefreshed(@NonNull ActivityRecord activity) {
        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
        if (cameraPolicy != null && cameraPolicy.mActivityRefresher != null) {
            cameraPolicy.mActivityRefresher.onActivityRefreshed(activity);
        }
    }

@@ -88,10 +89,11 @@ class AppCompatCameraPolicy {
     * camera preview and can lead to sideways or stretching issues persisting even after force
     * rotation.
     */
    void onActivityConfigurationChanging(@NonNull ActivityRecord activity,
    static void onActivityConfigurationChanging(@NonNull ActivityRecord activity,
            @NonNull Configuration newConfig, @NonNull Configuration lastReportedConfig) {
        if (mActivityRefresher != null) {
            mActivityRefresher.onActivityConfigurationChanging(activity, newConfig,
        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
        if (cameraPolicy != null && cameraPolicy.mActivityRefresher != null) {
            cameraPolicy.mActivityRefresher.onActivityConfigurationChanging(activity, newConfig,
                    lastReportedConfig);
        }
    }
@@ -108,11 +110,11 @@ class AppCompatCameraPolicy {
        }
    }

    boolean isActivityEligibleForOrientationOverride(@NonNull ActivityRecord activity) {
        if (mDisplayRotationCompatPolicy != null) {
            return mDisplayRotationCompatPolicy.isActivityEligibleForOrientationOverride(activity);
        }
        return false;
    static boolean isActivityEligibleForOrientationOverride(@NonNull ActivityRecord activity) {
        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
        return cameraPolicy != null && cameraPolicy.mDisplayRotationCompatPolicy != null
                && cameraPolicy.mDisplayRotationCompatPolicy
                        .isActivityEligibleForOrientationOverride(activity);
    }

    /**
@@ -125,11 +127,11 @@ class AppCompatCameraPolicy {
     *     <li>The activity has fixed orientation but not "locked" or "nosensor" one.
     * </ul>
     */
    boolean isTreatmentEnabledForActivity(@Nullable ActivityRecord activity) {
        if (mDisplayRotationCompatPolicy != null) {
            return mDisplayRotationCompatPolicy.isTreatmentEnabledForActivity(activity);
        }
        return false;
    static boolean isTreatmentEnabledForActivity(@NonNull ActivityRecord activity) {
        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
        return cameraPolicy != null && cameraPolicy.mDisplayRotationCompatPolicy != null
                && cameraPolicy.mDisplayRotationCompatPolicy
                        .isTreatmentEnabledForActivity(activity);
    }

    void start() {
@@ -176,23 +178,31 @@ class AppCompatCameraPolicy {
    }

    // TODO(b/369070416): have policies implement the same interface.
    boolean shouldCameraCompatControlOrientation(@NonNull ActivityRecord activity) {
        return (mDisplayRotationCompatPolicy != null
                        && mDisplayRotationCompatPolicy.shouldCameraCompatControlOrientation(
                                activity))
                || (mCameraCompatFreeformPolicy != null
                        && mCameraCompatFreeformPolicy.shouldCameraCompatControlOrientation(
                                activity));
    static boolean shouldCameraCompatControlOrientation(@NonNull ActivityRecord activity) {
        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
        if (cameraPolicy == null) {
            return false;
        }
        return (cameraPolicy.mDisplayRotationCompatPolicy != null
                        && cameraPolicy.mDisplayRotationCompatPolicy
                                .shouldCameraCompatControlOrientation(activity))
                || (cameraPolicy.mCameraCompatFreeformPolicy != null
                        && cameraPolicy.mCameraCompatFreeformPolicy
                                .shouldCameraCompatControlOrientation(activity));
    }

    // TODO(b/369070416): have policies implement the same interface.
    boolean shouldCameraCompatControlAspectRatio(@NonNull ActivityRecord activity) {
        return (mDisplayRotationCompatPolicy != null
                        && mDisplayRotationCompatPolicy.shouldCameraCompatControlAspectRatio(
                                activity))
                || (mCameraCompatFreeformPolicy != null
                        && mCameraCompatFreeformPolicy.shouldCameraCompatControlAspectRatio(
                                activity));
    static boolean shouldCameraCompatControlAspectRatio(@NonNull ActivityRecord activity) {
        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
        if (cameraPolicy == null) {
            return false;
        }
        return (cameraPolicy.mDisplayRotationCompatPolicy != null
                        && cameraPolicy.mDisplayRotationCompatPolicy
                                .shouldCameraCompatControlAspectRatio(activity))
                || (cameraPolicy.mCameraCompatFreeformPolicy != null
                        && cameraPolicy.mCameraCompatFreeformPolicy
                                .shouldCameraCompatControlAspectRatio(activity));
    }

    // TODO(b/369070416): have policies implement the same interface.
@@ -200,29 +210,41 @@ class AppCompatCameraPolicy {
     * @return {@code true} if the Camera is active for the provided {@link ActivityRecord} and
     * any camera compat treatment could be triggered for the current windowing mode.
     */
    private boolean isCameraRunningAndWindowingModeEligible(@NonNull ActivityRecord activity) {
        return (mDisplayRotationCompatPolicy != null
                && mDisplayRotationCompatPolicy.isCameraRunningAndWindowingModeEligible(activity,
    private static boolean isCameraRunningAndWindowingModeEligible(
            @NonNull ActivityRecord activity) {
        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
        if (cameraPolicy == null) {
            return false;
        }
        return (cameraPolicy.mDisplayRotationCompatPolicy != null
                && cameraPolicy.mDisplayRotationCompatPolicy
                        .isCameraRunningAndWindowingModeEligible(activity,
                                /* mustBeFullscreen */ true))
                || (mCameraCompatFreeformPolicy != null && mCameraCompatFreeformPolicy
                || (cameraPolicy.mCameraCompatFreeformPolicy != null
                        && cameraPolicy.mCameraCompatFreeformPolicy
                                .isCameraRunningAndWindowingModeEligible(activity));
    }

    @Nullable
    String getSummaryForDisplayRotationHistoryRecord() {
        if (mDisplayRotationCompatPolicy != null) {
            return mDisplayRotationCompatPolicy.getSummaryForDisplayRotationHistoryRecord();
        }
        return null;
        return mDisplayRotationCompatPolicy != null
                ? mDisplayRotationCompatPolicy.getSummaryForDisplayRotationHistoryRecord()
                : null;
    }

    // TODO(b/369070416): have policies implement the same interface.
    float getCameraCompatAspectRatio(@NonNull ActivityRecord activity) {
        float displayRotationCompatPolicyAspectRatio = mDisplayRotationCompatPolicy != null
                ? mDisplayRotationCompatPolicy.getCameraCompatAspectRatio(activity)
    static float getCameraCompatAspectRatio(@NonNull ActivityRecord activity) {
        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
        if (cameraPolicy == null) {
            return 1.0f;
        }
        float displayRotationCompatPolicyAspectRatio =
                cameraPolicy.mDisplayRotationCompatPolicy != null
                ? cameraPolicy.mDisplayRotationCompatPolicy.getCameraCompatAspectRatio(activity)
                : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
        float cameraCompatFreeformPolicyAspectRatio = mCameraCompatFreeformPolicy != null
                ? mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(activity)
        float cameraCompatFreeformPolicyAspectRatio =
                cameraPolicy.mCameraCompatFreeformPolicy != null
                ? cameraPolicy.mCameraCompatFreeformPolicy.getCameraCompatAspectRatio(activity)
                : MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
        return Math.max(displayRotationCompatPolicyAspectRatio,
                cameraCompatFreeformPolicyAspectRatio);
@@ -232,8 +254,8 @@ class AppCompatCameraPolicy {
     * Whether we should apply the min aspect ratio per-app override only when an app is connected
     * to the camera.
     */
    boolean shouldOverrideMinAspectRatioForCamera(@NonNull ActivityRecord activityRecord) {
        return isCameraRunningAndWindowingModeEligible(activityRecord)
    static boolean shouldOverrideMinAspectRatioForCamera(@NonNull ActivityRecord activityRecord) {
        return AppCompatCameraPolicy.isCameraRunningAndWindowingModeEligible(activityRecord)
                && activityRecord.mAppCompatController.getAppCompatCameraOverrides()
                        .isOverrideMinAspectRatioForCameraEnabled();
    }
+3 −6
Original line number Diff line number Diff line
@@ -58,10 +58,8 @@ class AppCompatOrientationPolicy {
                && displayContent.getIgnoreOrientationRequest();
        final boolean shouldApplyUserFullscreenOverride = mAppCompatOverrides
                .getAppCompatAspectRatioOverrides().shouldApplyUserFullscreenOverride();
        final AppCompatCameraPolicy cameraPolicy = AppCompatCameraPolicy
                .getAppCompatCameraPolicy(mActivityRecord);
        final boolean shouldCameraCompatControlOrientation = cameraPolicy != null
                && cameraPolicy.shouldCameraCompatControlOrientation(mActivityRecord);
        final boolean shouldCameraCompatControlOrientation =
                AppCompatCameraPolicy.shouldCameraCompatControlOrientation(mActivityRecord);
        if (shouldApplyUserFullscreenOverride && isIgnoreOrientationRequestEnabled
                // Do not override orientation to fullscreen for camera activities.
                // Fixed-orientation activities are rarely tested in other orientations, and it
@@ -98,7 +96,7 @@ class AppCompatOrientationPolicy {
        if (displayContent != null
                && mAppCompatOverrides.getAppCompatCameraOverrides()
                    .isOverrideOrientationOnlyForCameraEnabled()
                && !displayContent.mAppCompatCameraPolicy
                && !AppCompatCameraPolicy
                    .isActivityEligibleForOrientationOverride(mActivityRecord)) {
            return candidate;
        }
@@ -213,5 +211,4 @@ class AppCompatOrientationPolicy {
        }
        return false;
    }

}
Loading