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

Commit a602747f authored by Mina Granic's avatar Mina Granic
Browse files

Fix a rare NPE onCameraClosed.

Handle when a camera activity is not tied to an app.

Flag: EXEMPT simple safe check.
Fixes: 418016294
Test: atest WmTests:CameraCompatFreeformPolicyTests
Change-Id: I4bc12205854b4a041da2299150c5c126e556e6eb
parent ff32aeb5
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.app.CameraCompatTaskInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.os.RemoteException;
import android.util.Slog;
import android.view.DisplayInfo;
import android.view.Surface;

@@ -196,6 +197,11 @@ final class CameraCompatFreeformPolicy implements CameraStateMonitorImpl.CameraC
    }

    private void updateCompatibilityInfo(@NonNull ActivityRecord activityRecord) {
        if (activityRecord.app == null) {
            Slog.w(TAG, "Activity exists, but the app does not. Cannot revert display rotation"
                    + "sandboxing.");
            return;
        }
        final CompatibilityInfo compatibilityInfo = activityRecord.mAtmService
                .compatibilityInfoForPackageLocked(activityRecord.info.applicationInfo);
        compatibilityInfo.applicationDisplayRotation =
+24 −0
Original line number Diff line number Diff line
@@ -588,6 +588,26 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase {
        });
    }


    @Test
    @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
    @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT})
    public void testCameraClosed_activityDetachedFromProcess_handlesGracefully() {
        runTestScenario((robot) -> {
            robot.configureActivity(SCREEN_ORIENTATION_PORTRAIT);
            robot.activity().rotateDisplayForTopActivity(ROTATION_270);
            robot.onCameraOpened(CAMERA_ID_1, TEST_PACKAGE_1);
            robot.callOnActivityConfigurationChanging(/* letterboxNew= */ true,
                    /* lastLetterbox= */ false);

            // This might happen at some point during teardown.
            robot.detachActivityFromProcess();

            // Make sure no errors are thrown here.
            robot.onCameraClosed(CAMERA_ID_1);
        });
    }

    /**
     * Runs a test scenario providing a Robot.
     */
@@ -724,6 +744,10 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase {
            mWindowTestsBase.waitHandlerIdle(activity().displayContent().mWmService.mH);
        }

        void detachActivityFromProcess() {
            activity().top().detachFromProcess();
        }

        void setInFreeformWindowingMode(boolean inFreeform) {
            doReturn(inFreeform).when(activity().top()).inFreeformWindowingMode();
        }