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

Commit 6d8e2819 authored by Mina Granic's avatar Mina Granic
Browse files

Sandbox display rotation for camera compat using CompatInfo.

Display rotation is what the apps query to calculate
how to orient the camera preview. This sandboxing will only
affect the app that is in camera compat mode, not the
system or other processes.

Flag: com.android.window.flags.enable_camera_compat_for_desktop_windowing
Bug: 347851478
Test: atest WmTests:ActivityThreadTest
Change-Id: I5a403f8c7584abfb236f9037b2427fff0fdecffa
parent 3fa3f616
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -1372,7 +1372,8 @@ public final class ActivityThread extends ClientTransactionHandler
            data.startRequestedElapsedTime = startRequestedElapsedTime;
            data.startRequestedUptime = startRequestedUptime;
            updateCompatOverrideScale(compatInfo);
            CompatibilityInfo.applyOverrideScaleIfNeeded(config);
            updateCompatOverrideDisplayRotation(compatInfo);
            CompatibilityInfo.applyOverrideIfNeeded(config);
            sendMessage(H.BIND_APPLICATION, data);
        }

@@ -1386,6 +1387,15 @@ public final class ActivityThread extends ClientTransactionHandler
            }
        }

        private void updateCompatOverrideDisplayRotation(@NonNull CompatibilityInfo info) {
            if (info.isOverrideDisplayRotationRequired()) {
                CompatibilityInfo.setOverrideDisplayRotation(info.applicationDisplayRotation);
            } else {
                CompatibilityInfo.setOverrideDisplayRotation(
                        WindowConfiguration.ROTATION_UNDEFINED);
            }
        }

        public final void runIsolatedEntryPoint(String entryPoint, String[] entryPointArgs) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = entryPoint;
@@ -2036,6 +2046,7 @@ public final class ActivityThread extends ClientTransactionHandler
            ucd.pkg = pkg;
            ucd.info = info;
            updateCompatOverrideScale(info);
            updateCompatOverrideDisplayRotation(info);
            sendMessage(H.UPDATE_PACKAGE_COMPATIBILITY_INFO, ucd);
        }

+26 −0
Original line number Diff line number Diff line
@@ -16,11 +16,16 @@

package android.app;

import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.view.Surface.ROTATION_0;
import static android.view.Surface.ROTATION_90;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.Surface;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -153,6 +158,27 @@ public class CameraCompatTaskInfo implements Parcelable {
                + "}";
    }

    /**
     * Returns the sandboxed display rotation based on the given {@code cameraCompatMode}.
     *
     * <p>This will be what the app likely expects in its requested orientation while running on a
     * device with portrait natural orientation: `CAMERA_COMPAT_FREEFORM_PORTRAIT_*` is 0, and
     * `CAMERA_COMPAT_FREEFORM_LANDSCAPE_*` is 90.
     *
     * @return {@link WindowConfiguration#ROTATION_UNDEFINED} if not in camera compat mode.
     */
    @Surface.Rotation
    public static int getDisplayRotationFromCameraCompatMode(@FreeformCameraCompatMode int
            cameraCompatMode) {
        return switch (cameraCompatMode) {
            case CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_LANDSCAPE,
                 CAMERA_COMPAT_FREEFORM_PORTRAIT_DEVICE_IN_PORTRAIT -> ROTATION_0;
            case CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_LANDSCAPE,
                 CAMERA_COMPAT_FREEFORM_LANDSCAPE_DEVICE_IN_PORTRAIT -> ROTATION_90;
            default -> ROTATION_UNDEFINED;
        };
    }

    /** Human readable version of the freeform camera compat mode. */
    @NonNull
    public static String freeformCameraCompatModeToString(
+1 −3
Original line number Diff line number Diff line
@@ -1517,10 +1517,8 @@ public class ResourcesManager {
                int changes = mResConfiguration.updateFrom(config);
                if (compat != null && (mResCompatibilityInfo == null
                        || !mResCompatibilityInfo.equals(compat))) {
                    changes |= compat.getCompatibilityChangesForConfig(mResCompatibilityInfo);
                    mResCompatibilityInfo = compat;
                    changes |= ActivityInfo.CONFIG_SCREEN_LAYOUT
                            | ActivityInfo.CONFIG_SCREEN_SIZE
                            | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE;
                }

                // If a application info update was scheduled to occur in this process but has not
+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {

    @Override
    public void preExecute(@NonNull ClientTransactionHandler client) {
        CompatibilityInfo.applyOverrideScaleIfNeeded(mConfiguration);
        CompatibilityInfo.applyOverrideIfNeeded(mConfiguration);
        // Notify the client of an upcoming change in the token configuration. This ensures that
        // batches of config change items only process the newest configuration.
        client.updatePendingActivityConfiguration(getActivityToken(), mConfiguration);
+1 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
    public void preExecute(@NonNull ClientTransactionHandler client) {
        // The local config is already scaled so only apply if this item is from server side.
        if (!client.isExecutingLocalTransaction()) {
            CompatibilityInfo.applyOverrideScaleIfNeeded(mConfig);
            CompatibilityInfo.applyOverrideIfNeeded(mConfig);
        }
        mActivityClientRecord = client.prepareRelaunchActivity(getActivityToken(), mPendingResults,
                mPendingNewIntents, mConfigChanges, mConfig, mPreserveWindow, mActivityWindowInfo);
Loading