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

Commit fba9851a authored by jainrachit's avatar jainrachit
Browse files

[5/n] Integrate AppCompatSafeRegionPolicy in LaunchParams

- Set whether an activity needs to be within a safe region letterbox can
  be set through LaunchParams.

Bug: 380132497
Flag: com.android.window.flags.safe_region_letterboxing
Test: atest LaunchParamsControllerTests
Change-Id: I3b40db42f5ec523c5bcc8036e1005e64e315acd0
parent a9adefbb
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2203,6 +2203,9 @@ class ActivityStarter {
                ? mLaunchParams.mPreferredTaskDisplayArea
                : mRootWindowContainer.getDefaultTaskDisplayArea();
        mPreferredWindowingMode = mLaunchParams.mWindowingMode;
        if (mLaunchParams.mNeedsSafeRegionBounds != null) {
            r.setNeedsSafeRegionBounds(mLaunchParams.mNeedsSafeRegionBounds);
        }
    }

    private TaskDisplayArea computeSuggestedLaunchDisplayArea(
+30 −6
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * {@link LaunchParamsController} calculates the {@link LaunchParams} by coordinating between
@@ -104,11 +105,11 @@ class LaunchParamsController {
                    continue;
                case RESULT_DONE:
                    // Set result and return immediately.
                    result.set(mTmpResult);
                    result.merge(mTmpResult);
                    return;
                case RESULT_CONTINUE:
                    // Set result and continue
                    result.set(mTmpResult);
                    result.merge(mTmpResult);
                    break;
            }
        }
@@ -173,6 +174,7 @@ class LaunchParamsController {
     */
    static class LaunchParams {
        /** The bounds within the parent container. */
        @NonNull
        final Rect mBounds = new Rect();
        /** The bounds within the parent container respecting insets. Usually empty. */
        @NonNull
@@ -186,12 +188,17 @@ class LaunchParamsController {
        @WindowingMode
        int mWindowingMode;

        /** Whether the Activity needs the safe region bounds. A {@code null} value means unset. */
        @Nullable
        Boolean mNeedsSafeRegionBounds = null;

        /** Sets values back to default. {@link #isEmpty} will return {@code true} once called. */
        void reset() {
            mBounds.setEmpty();
            mAppBounds.setEmpty();
            mPreferredTaskDisplayArea = null;
            mWindowingMode = WINDOWING_MODE_UNDEFINED;
            mNeedsSafeRegionBounds = null;
        }

        /** Copies the values set on the passed in {@link LaunchParams}. */
@@ -200,12 +207,26 @@ class LaunchParamsController {
            mAppBounds.set(params.mAppBounds);
            mPreferredTaskDisplayArea = params.mPreferredTaskDisplayArea;
            mWindowingMode = params.mWindowingMode;
            mNeedsSafeRegionBounds = params.mNeedsSafeRegionBounds;
        }

        /** Merges the values set on the passed in {@link LaunchParams}. */
        void merge(LaunchParams params) {
            mBounds.set(params.mBounds);
            mAppBounds.set(params.mAppBounds);
            mPreferredTaskDisplayArea = params.mPreferredTaskDisplayArea;
            mWindowingMode = params.mWindowingMode;
            // Only update mNeedsSafeRegionBounds if a modifier updates it by setting a non null
            // value. Otherwise, carry over from previous modifiers
            if (params.mNeedsSafeRegionBounds != null) {
                mNeedsSafeRegionBounds = params.mNeedsSafeRegionBounds;
            }
        }

        /** Returns {@code true} if no values have been explicitly set. */
        boolean isEmpty() {
            return mBounds.isEmpty() && mAppBounds.isEmpty() && mPreferredTaskDisplayArea == null
                    && mWindowingMode == WINDOWING_MODE_UNDEFINED;
                    && mWindowingMode == WINDOWING_MODE_UNDEFINED && mNeedsSafeRegionBounds == null;
        }

        boolean hasWindowingMode() {
@@ -226,16 +247,19 @@ class LaunchParamsController {
            if (mPreferredTaskDisplayArea != that.mPreferredTaskDisplayArea) return false;
            if (mWindowingMode != that.mWindowingMode) return false;
            if (!mAppBounds.equals(that.mAppBounds)) return false;
            return mBounds != null ? mBounds.equals(that.mBounds) : that.mBounds == null;
            if (!Objects.equals(mNeedsSafeRegionBounds, that.mNeedsSafeRegionBounds)) return false;
            return !mBounds.isEmpty() ? mBounds.equals(that.mBounds) : that.mBounds.isEmpty();
        }

        @Override
        public int hashCode() {
            int result = mBounds != null ? mBounds.hashCode() : 0;
            int result = !mBounds.isEmpty() ? mBounds.hashCode() : 0;
            result = 31 * result + mAppBounds.hashCode();
            result = 31 * result + (mPreferredTaskDisplayArea != null
                    ? mPreferredTaskDisplayArea.hashCode() : 0);
            result = 31 * result + mWindowingMode;
            result = 31 * result + (mNeedsSafeRegionBounds != null
                    ? Boolean.hashCode(mNeedsSafeRegionBounds) : 0);
            return result;
        }
    }
+154 −0
Original line number Diff line number Diff line
@@ -117,6 +117,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase {
        expected.mPreferredTaskDisplayArea = mock(TaskDisplayArea.class);
        expected.mWindowingMode = WINDOWING_MODE_PINNED;
        expected.mBounds.set(200, 300, 400, 500);
        expected.mNeedsSafeRegionBounds = true;

        mPersister.putLaunchParams(userId, name, expected);

@@ -189,6 +190,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase {
        params.mWindowingMode = WINDOWING_MODE_FREEFORM;
        params.mBounds.set(0, 0, 30, 20);
        params.mPreferredTaskDisplayArea = mock(TaskDisplayArea.class);
        params.mNeedsSafeRegionBounds = true;

        final InstrumentedPositioner positioner2 = new InstrumentedPositioner(RESULT_CONTINUE,
                params);
@@ -228,6 +230,158 @@ public class LaunchParamsControllerTests extends WindowTestsBase {
        assertEquals(result, positioner2.getLaunchParams());
    }

    /**
     * Tests only needs safe region bounds are not propagated if results are skipped.
     */
    @Test
    public void testSkip_needsSafeRegionBoundsNotModified() {
        final LaunchParams params1 = new LaunchParams();
        params1.mNeedsSafeRegionBounds = true;
        final InstrumentedPositioner positioner1 = new InstrumentedPositioner(RESULT_SKIP, params1);

        final LaunchParams params2 = new LaunchParams();
        params2.mNeedsSafeRegionBounds = false;
        final InstrumentedPositioner positioner2 =
                new InstrumentedPositioner(RESULT_CONTINUE, params2);

        mController.registerModifier(positioner1);
        mController.registerModifier(positioner2);

        final LaunchParams result = new LaunchParams();

        mController.calculate(null /*task*/, null /*layout*/, null /*activity*/, null /*source*/,
                null /*options*/, null /*request*/, PHASE_BOUNDS, result);

        assertEquals(result, positioner2.getLaunchParams());
    }

    /**
     * Tests only needs safe region bounds are propagated even if results are continued.
     */
    @Test
    public void testContinue_needsSafeRegionBoundsCarriedOver() {
        final LaunchParams params1 = new LaunchParams();
        final InstrumentedPositioner positioner1 =
                new InstrumentedPositioner(RESULT_CONTINUE, params1);

        final LaunchParams params2 = new LaunchParams();
        params2.mNeedsSafeRegionBounds = true;
        final InstrumentedPositioner positioner2 =
                new InstrumentedPositioner(RESULT_CONTINUE, params2);

        mController.registerModifier(positioner1);
        mController.registerModifier(positioner2);

        final LaunchParams result = new LaunchParams();

        mController.calculate(null /*task*/, null /*layout*/, null /*activity*/, null /*source*/,
                null /*options*/, null /*request*/, PHASE_BOUNDS, result);

        // Safe region is propagated from positioner1
        assertEquals(result.mNeedsSafeRegionBounds,
                positioner2.getLaunchParams().mNeedsSafeRegionBounds);
        assertEquals(result.mWindowingMode, positioner1.getLaunchParams().mWindowingMode);
        assertEquals(result.mBounds, positioner1.getLaunchParams().mBounds);
        assertEquals(result.mPreferredTaskDisplayArea,
                positioner1.getLaunchParams().mPreferredTaskDisplayArea);
    }

    /**
     * Tests needs safe region bounds are modified if results from the next continue have been set.
     */
    @Test
    public void testContinue_needsSafeRegionBoundsModifiedFromLaterContinue() {
        final LaunchParams params1 = new LaunchParams();
        params1.mNeedsSafeRegionBounds = false;
        final InstrumentedPositioner positioner1 =
                new InstrumentedPositioner(RESULT_CONTINUE, params1);

        final LaunchParams params2 = new LaunchParams();
        params2.mNeedsSafeRegionBounds = true;
        final InstrumentedPositioner positioner2 =
                new InstrumentedPositioner(RESULT_CONTINUE, params2);

        mController.registerModifier(positioner1);
        mController.registerModifier(positioner2);

        final LaunchParams result = new LaunchParams();

        mController.calculate(null /*task*/, null /*layout*/, null /*activity*/, null /*source*/,
                null /*options*/, null /*request*/, PHASE_BOUNDS, result);

        // Safe region is propagated from positioner1
        assertEquals(result.mNeedsSafeRegionBounds,
                positioner1.getLaunchParams().mNeedsSafeRegionBounds);
        assertEquals(result.mWindowingMode, positioner2.getLaunchParams().mWindowingMode);
        assertEquals(result.mBounds, positioner2.getLaunchParams().mBounds);
        assertEquals(result.mPreferredTaskDisplayArea,
                positioner2.getLaunchParams().mPreferredTaskDisplayArea);
    }

    /**
     * Tests only needs safe region bounds are propagated to result done even if there are skipped
     * and continued results and continue sets true for needs safe region bounds.
     */
    @Test
    public void testDone_ContinueSetsNeedsSafeRegionBounds() {
        final LaunchParams params1 = new LaunchParams();
        final InstrumentedPositioner positioner1 = new InstrumentedPositioner(RESULT_DONE, params1);

        final LaunchParams params2 = new LaunchParams();
        final InstrumentedPositioner positioner2 =
                new InstrumentedPositioner(RESULT_CONTINUE, params2);

        final LaunchParams params3 = new LaunchParams();
        final InstrumentedPositioner positioner3 = new InstrumentedPositioner(RESULT_SKIP, params3);

        final LaunchParams params4 = new LaunchParams();
        params4.mNeedsSafeRegionBounds = true;
        final InstrumentedPositioner positioner4 =
                new InstrumentedPositioner(RESULT_CONTINUE, params4);

        final LaunchParams params5 = new LaunchParams();
        params5.mNeedsSafeRegionBounds = false;
        final InstrumentedPositioner positioner5 = new InstrumentedPositioner(RESULT_SKIP, params5);

        mController.registerModifier(positioner1);
        mController.registerModifier(positioner2);
        mController.registerModifier(positioner3);
        mController.registerModifier(positioner4);
        mController.registerModifier(positioner5);

        final LaunchParams result = new LaunchParams();

        mController.calculate(null /*task*/, null /*layout*/, null /*activity*/, null /*source*/,
                null /*options*/, null /*request*/, PHASE_BOUNDS, result);

        // Safe region is propagated from positioner4
        assertEquals(result.mNeedsSafeRegionBounds,
                positioner4.getLaunchParams().mNeedsSafeRegionBounds);
        assertEquals(result.mWindowingMode, positioner1.getLaunchParams().mWindowingMode);
        assertEquals(result.mBounds, positioner1.getLaunchParams().mBounds);
        assertEquals(result.mPreferredTaskDisplayArea,
                positioner1.getLaunchParams().mPreferredTaskDisplayArea);
    }

    /**
     * Tests only needs safe region bounds are set if results are done.
     */
    @Test
    public void testDone_needsSafeRegionBoundsModified() {
        final LaunchParams params = new LaunchParams();
        params.mNeedsSafeRegionBounds = true;
        final InstrumentedPositioner positioner = new InstrumentedPositioner(RESULT_DONE, params);

        mController.registerModifier(positioner);

        final LaunchParams result = new LaunchParams();

        mController.calculate(null /*task*/, null /*layout*/, null /*activity*/, null /*source*/,
                null /*options*/, null /*request*/, PHASE_BOUNDS, result);

        assertEquals(result, positioner.getLaunchParams());
    }

    /**
     * Tests preferred display id calculation for VR.
     */