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

Commit 121b85af authored by Mina Granic's avatar Mina Granic
Browse files

Throw exceptions in LetterboxConfiguration setters, when passed invalid values.

Bug: 198826715
Test: atest WmTests:LetterboxConfiguration
Change-Id: Ie7bbdb4c1d216738837808d09d16a80874529947
parent bb338d7a
Loading
Loading
Loading
Loading
+61 −52
Original line number Diff line number Diff line
@@ -327,14 +327,14 @@ final class LetterboxConfiguration {
                R.dimen.config_letterboxBackgroundWallpaperBlurRadius);
        mLetterboxBackgroundWallpaperDarkScrimAlpha = mContext.getResources().getFloat(
                R.dimen.config_letterboxBackgroundWallaperDarkScrimAlpha);
        mLetterboxHorizontalPositionMultiplier = mContext.getResources().getFloat(
                R.dimen.config_letterboxHorizontalPositionMultiplier);
        mLetterboxVerticalPositionMultiplier = mContext.getResources().getFloat(
                R.dimen.config_letterboxVerticalPositionMultiplier);
        mLetterboxBookModePositionMultiplier = mContext.getResources().getFloat(
                R.dimen.config_letterboxBookModePositionMultiplier);
        mLetterboxTabletopModePositionMultiplier = mContext.getResources().getFloat(
                R.dimen.config_letterboxTabletopModePositionMultiplier);
        setLetterboxHorizontalPositionMultiplier(mContext.getResources().getFloat(
                R.dimen.config_letterboxHorizontalPositionMultiplier));
        setLetterboxVerticalPositionMultiplier(mContext.getResources().getFloat(
                R.dimen.config_letterboxVerticalPositionMultiplier));
        setLetterboxBookModePositionMultiplier(mContext.getResources().getFloat(
                R.dimen.config_letterboxBookModePositionMultiplier));
        setLetterboxTabletopModePositionMultiplier(mContext.getResources()
                .getFloat(R.dimen.config_letterboxTabletopModePositionMultiplier));
        mIsHorizontalReachabilityEnabled = mContext.getResources().getBoolean(
                R.bool.config_letterboxIsHorizontalReachabilityEnabled);
        mIsVerticalReachabilityEnabled = mContext.getResources().getBoolean(
@@ -657,29 +657,8 @@ final class LetterboxConfiguration {
     * right side.
     */
    float getLetterboxHorizontalPositionMultiplier(boolean isInBookMode) {
        if (isInBookMode) {
            if (mLetterboxBookModePositionMultiplier < 0.0f
                    || mLetterboxBookModePositionMultiplier > 1.0f) {
                Slog.w(TAG,
                        "mLetterboxBookModePositionMultiplier out of bounds (isInBookMode=true): "
                        + mLetterboxBookModePositionMultiplier);
                // Default to left position if invalid value is provided.
                return 0.0f;
            } else {
                return mLetterboxBookModePositionMultiplier;
            }
        } else {
            if (mLetterboxHorizontalPositionMultiplier < 0.0f
                    || mLetterboxHorizontalPositionMultiplier > 1.0f) {
                Slog.w(TAG,
                        "mLetterboxBookModePositionMultiplier out of bounds (isInBookMode=false):"
                        + mLetterboxBookModePositionMultiplier);
                // Default to central position if invalid value is provided.
                return 0.5f;
            } else {
                return mLetterboxHorizontalPositionMultiplier;
            }
        }
        return isInBookMode ? mLetterboxBookModePositionMultiplier
                : mLetterboxHorizontalPositionMultiplier;
    }

    /*
@@ -689,37 +668,28 @@ final class LetterboxConfiguration {
     * bottom side.
     */
    float getLetterboxVerticalPositionMultiplier(boolean isInTabletopMode) {
        if (isInTabletopMode) {
            return (mLetterboxTabletopModePositionMultiplier < 0.0f
                    || mLetterboxTabletopModePositionMultiplier > 1.0f)
                    // Default to top position if invalid value is provided.
                    ? 0.0f : mLetterboxTabletopModePositionMultiplier;
        } else {
            return (mLetterboxVerticalPositionMultiplier < 0.0f
                    || mLetterboxVerticalPositionMultiplier > 1.0f)
                    // Default to central position if invalid value is provided.
                    ? 0.5f : mLetterboxVerticalPositionMultiplier;
        }
        return isInTabletopMode ? mLetterboxTabletopModePositionMultiplier
                : mLetterboxVerticalPositionMultiplier;
    }

    /**
     * Overrides horizontal position of a center of the letterboxed app window. If given value < 0
     * or > 1, then it and a value of {@link
     * com.android.internal.R.dimen.config_letterboxHorizontalPositionMultiplier} are ignored and
     * central position (0.5) is used.
     * Overrides horizontal position of a center of the letterboxed app window.
     *
     * @throws IllegalArgumentException If given value < 0 or > 1.
     */
    void setLetterboxHorizontalPositionMultiplier(float multiplier) {
        mLetterboxHorizontalPositionMultiplier = multiplier;
        mLetterboxHorizontalPositionMultiplier = assertValidMultiplier(multiplier,
                "mLetterboxHorizontalPositionMultiplier");
    }

    /**
     * Overrides vertical position of a center of the letterboxed app window. If given value < 0
     * or > 1, then it and a value of {@link
     * com.android.internal.R.dimen.config_letterboxVerticalPositionMultiplier} are ignored and
     * central position (0.5) is used.
     * Overrides vertical position of a center of the letterboxed app window.
     *
     * @throws IllegalArgumentException If given value < 0 or > 1.
     */
    void setLetterboxVerticalPositionMultiplier(float multiplier) {
        mLetterboxVerticalPositionMultiplier = multiplier;
        mLetterboxVerticalPositionMultiplier = assertValidMultiplier(multiplier,
                "mLetterboxVerticalPositionMultiplier");
    }

    /**
@@ -740,6 +710,28 @@ final class LetterboxConfiguration {
                com.android.internal.R.dimen.config_letterboxVerticalPositionMultiplier);
    }

    /**
     * Sets tabletop mode position multiplier.
     *
     * @throws IllegalArgumentException If given value < 0 or > 1.
     */
    @VisibleForTesting
    void setLetterboxTabletopModePositionMultiplier(float multiplier) {
        mLetterboxTabletopModePositionMultiplier = assertValidMultiplier(multiplier,
                "mLetterboxTabletopModePositionMultiplier");
    }

    /**
     * Sets tabletop mode position multiplier.
     *
     * @throws IllegalArgumentException If given value < 0 or > 1.
     */
    @VisibleForTesting
    void setLetterboxBookModePositionMultiplier(float multiplier) {
        mLetterboxBookModePositionMultiplier = assertValidMultiplier(multiplier,
                "mLetterboxBookModePositionMultiplier");
    }

    /*
     * Whether horizontal reachability repositioning is allowed for letterboxed fullscreen apps in
     * landscape device orientation.
@@ -1356,4 +1348,21 @@ final class LetterboxConfiguration {
    void resetUserAppAspectRatioFullscreenEnabled() {
        setUserAppAspectRatioFullscreenOverrideEnabled(false);
    }

    /**
     * Checks whether the multiplier is between [0,1].
     *
     * @param multiplierName sent in the exception if multiplier is invalid, for easier debugging.
     *
     * @return multiplier, if valid
     * @throws IllegalArgumentException if outside bounds.
     */
    private float assertValidMultiplier(float multiplier, String multiplierName)
            throws IllegalArgumentException {
        if (multiplier < 0.0f || multiplier > 1.0f) {
            throw new IllegalArgumentException("Trying to set " + multiplierName
                    + " out of bounds: " + multiplier);
        }
        return multiplier;
    }
}
+12 −2
Original line number Diff line number Diff line
@@ -842,7 +842,12 @@ public class WindowManagerShellCommand extends ShellCommand {
            return -1;
        }
        synchronized (mInternal.mGlobalLock) {
            try {
                mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier(multiplier);
            } catch (IllegalArgumentException  e) {
                getErrPrintWriter().println("Error: invalid multiplier value " + e);
                return -1;
            }
        }
        return 0;
    }
@@ -861,7 +866,12 @@ public class WindowManagerShellCommand extends ShellCommand {
            return -1;
        }
        synchronized (mInternal.mGlobalLock) {
            try {
                mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier(multiplier);
            } catch (IllegalArgumentException  e) {
                getErrPrintWriter().println("Error: invalid multiplier value " + e);
                return -1;
            }
        }
        return 0;
    }
+56 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_RE
import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER;
import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_TOP;

import static com.android.server.wm.testing.Assert.assertThrows;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
@@ -37,6 +39,8 @@ import android.platform.test.annotations.Presubmit;

import androidx.test.filters.SmallTest;

import com.android.server.wm.testing.Assert;

import org.junit.Before;
import org.junit.Test;

@@ -288,4 +292,56 @@ public class LetterboxConfigurationTest {
                false /* forTabletopMode */,
                LETTERBOX_VERTICAL_REACHABILITY_POSITION_TOP);
    }

    @Test
    public void test_setLetterboxHorizontalPositionMultiplier_validValues() {
        assertThrows(IllegalArgumentException.class,
                () -> mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier(-1));
        assertThrows(IllegalArgumentException.class,
                () -> mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier(2));

        // Does not throw an exception for values [0,1].
        mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier(0);
        mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier(0.5f);
        mLetterboxConfiguration.setLetterboxHorizontalPositionMultiplier(1);
    }

    @Test
    public void test_setLetterboxVerticalPositionMultiplier_validValues() {
        assertThrows(IllegalArgumentException.class,
                () -> mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier(-1));
        assertThrows(IllegalArgumentException.class,
                () -> mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier(2));

        // Does not throw an exception for values [0,1].
        mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier(0);
        mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier(0.5f);
        mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier(1);
    }

    @Test
    public void test_setLetterboxBookModePositionMultiplier_validValues() {
        assertThrows(IllegalArgumentException.class,
                () -> mLetterboxConfiguration.setLetterboxBookModePositionMultiplier(-1));
        assertThrows(IllegalArgumentException.class,
                () -> mLetterboxConfiguration.setLetterboxBookModePositionMultiplier(2));

        // Does not throw an exception for values [0,1].
        mLetterboxConfiguration.setLetterboxBookModePositionMultiplier(0);
        mLetterboxConfiguration.setLetterboxBookModePositionMultiplier(0.5f);
        mLetterboxConfiguration.setLetterboxBookModePositionMultiplier(1);
    }

    @Test
    public void test_setLetterboxTabletopModePositionMultiplier_validValues() {
        assertThrows(IllegalArgumentException.class,
                () -> mLetterboxConfiguration.setLetterboxTabletopModePositionMultiplier(-1));
        assertThrows(IllegalArgumentException.class,
                () -> mLetterboxConfiguration.setLetterboxTabletopModePositionMultiplier(2));

        // Does not throw an exception for values [0,1].
        mLetterboxConfiguration.setLetterboxTabletopModePositionMultiplier(0);
        mLetterboxConfiguration.setLetterboxTabletopModePositionMultiplier(0.5f);
        mLetterboxConfiguration.setLetterboxTabletopModePositionMultiplier(1);
    }
}
+0 −50
Original line number Diff line number Diff line
@@ -4100,31 +4100,6 @@ public class SizeCompatTests extends WindowTestsBase {
                /* sizeCompatScaled */ new Rect(525, 0, 875, 700));
    }

    @Test
    public void testUpdateResolvedBoundsHorizontalPosition_invalidMultiplier_defaultToCenter() {
        // Display configured as (2800, 1400).

        // Below 0.0.
        assertHorizontalPositionForDifferentDisplayConfigsForPortraitActivity(
                /* letterboxHorizontalPositionMultiplier */ -1.0f,
                // At launch.
                /* fixedOrientationLetterbox */ new Rect(1050, 0, 1750, 1400),
                // After 90 degree rotation.
                /* sizeCompatUnscaled */ new Rect(350, 0, 1050, 1400),
                // After the display is resized to (700, 1400).
                /* sizeCompatScaled */ new Rect(525, 0, 875, 700));

        // Above 1.0
        assertHorizontalPositionForDifferentDisplayConfigsForPortraitActivity(
                /* letterboxHorizontalPositionMultiplier */ 2.0f,
                // At launch.
                /* fixedOrientationLetterbox */ new Rect(1050, 0, 1750, 1400),
                // After 90 degree rotation.
                /* sizeCompatUnscaled */ new Rect(350, 0, 1050, 1400),
                // After the display is resized to (700, 1400).
                /* sizeCompatScaled */ new Rect(525, 0, 875, 700));
    }

    @Test
    public void testUpdateResolvedBoundsHorizontalPosition_right() {
        // Display configured as (2800, 1400).
@@ -4330,31 +4305,6 @@ public class SizeCompatTests extends WindowTestsBase {
                /* sizeCompatScaled */ new Rect(0, 525, 700, 875));
    }

    @Test
    public void testUpdateResolvedBoundsVerticalPosition_invalidMultiplier_defaultToCenter() {
        // Display configured as (1400, 2800).

        // Below 0.0.
        assertVerticalPositionForDifferentDisplayConfigsForLandscapeActivity(
                /* letterboxVerticalPositionMultiplier */ -1.0f,
                // At launch.
                /* fixedOrientationLetterbox */ new Rect(0, 1050, 1400, 1750),
                // After 90 degree rotation.
                /* sizeCompatUnscaled */ new Rect(700, 350, 2100, 1050),
                // After the display is resized to (1400, 700).
                /* sizeCompatScaled */ new Rect(0, 525, 700, 875));

        // Above 1.0
        assertVerticalPositionForDifferentDisplayConfigsForLandscapeActivity(
                /* letterboxVerticalPositionMultiplier */ 2.0f,
                // At launch.
                /* fixedOrientationLetterbox */ new Rect(0, 1050, 1400, 1750),
                // After 90 degree rotation.
                /* sizeCompatUnscaled */ new Rect(700, 350, 2100, 1050),
                // After the display is resized to (1400, 700).
                /* sizeCompatScaled */ new Rect(0, 525, 700, 875));
    }

    @Test
    public void testUpdateResolvedBoundsVerticalPosition_bottom() {
        // Display configured as (1400, 2800).