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

Commit 4f5949f5 authored by atrost's avatar atrost
Browse files

Allow overriding disabled changes in final release.

Since disabled changes are disabled by default, our policy should allow
opting in to them in the final release.
Add toString to OverrideAllowedState for easier test debugging.

Test: atest com.android.server.compat.OverrideValidatorImplTest
Bug: 144552011
Change-Id: Iff01ee44d30d3e5703a980cddaf1b38435756c3c
parent c160f758
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ public final class OverrideAllowedState implements Parcelable {
    public static final int DISABLED_NOT_DEBUGGABLE = 1;
    /**
     * Change cannot be overridden, due to the build being non-debuggable and the change being
     * non-targetSdk.
     * enabled regardless of targetSdk.
     */
    public static final int DISABLED_NON_TARGET_SDK = 2;
    /**
@@ -159,4 +159,28 @@ public final class OverrideAllowedState implements Parcelable {
                && appTargetSdk == otherState.appTargetSdk
                && changeIdTargetSdk == otherState.changeIdTargetSdk;
    }

    private String stateName() {
        switch (state) {
            case ALLOWED:
                return "ALLOWED";
            case DISABLED_NOT_DEBUGGABLE:
                return "DISABLED_NOT_DEBUGGABLE";
            case DISABLED_NON_TARGET_SDK:
                return "DISABLED_NON_TARGET_SDK";
            case DISABLED_TARGET_SDK_TOO_HIGH:
                return "DISABLED_TARGET_SDK_TOO_HIGH";
            case PACKAGE_DOES_NOT_EXIST:
                return "PACKAGE_DOES_NOT_EXIST";
            case LOGGING_ONLY_CHANGE:
                return "LOGGING_ONLY_CHANGE";
        }
        return "UNKNOWN";
    }

    @Override
    public String toString() {
        return "OverrideAllowedState(state=" + stateName() + "; appTargetSdk=" + appTargetSdk
                + "; changeIdTargetSdk=" + changeIdTargetSdk + ")";
    }
}
+13 −0
Original line number Diff line number Diff line
@@ -218,6 +218,19 @@ final class CompatConfig {
        }
    }

    /**
     * Returns whether the change is marked as disabled.
     */
    boolean isDisabled(long changeId) {
        synchronized (mChanges) {
            CompatChange c = mChanges.get(changeId);
            if (c == null) {
                return false;
            }
            return c.getDisabled();
        }
    }

    /**
     * Removes an override previously added via {@link #addOverride(long, String, boolean)}. This
     * restores the default behaviour for the given change and app, once any app processes have been
+4 −3
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ public class OverrideValidatorImpl extends IOverrideValidator.Stub {
        boolean debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild();
        boolean finalBuild = mAndroidBuildClassifier.isFinalBuild();
        int minTargetSdk = mCompatConfig.minTargetSdkForChangeId(changeId);
        boolean disabled = mCompatConfig.isDisabled(changeId);

        // Allow any override for userdebug or eng builds.
        if (debuggableBuild) {
@@ -83,12 +84,12 @@ public class OverrideValidatorImpl extends IOverrideValidator.Stub {
        if (!finalBuild) {
            return new OverrideAllowedState(ALLOWED, appTargetSdk, minTargetSdk);
        }
        // Do not allow overriding non-target sdk gated changes on user builds
        if (minTargetSdk == -1) {
        // Do not allow overriding default enabled changes on user builds
        if (minTargetSdk == -1 && !disabled) {
            return new OverrideAllowedState(DISABLED_NON_TARGET_SDK, appTargetSdk, minTargetSdk);
        }
        // Only allow to opt-in for a targetSdk gated change.
        if (applicationInfo.targetSdkVersion < minTargetSdk) {
        if (disabled || applicationInfo.targetSdkVersion < minTargetSdk) {
            return new OverrideAllowedState(ALLOWED, appTargetSdk, minTargetSdk);
        }
        return new OverrideAllowedState(DISABLED_TARGET_SDK_TOO_HIGH, appTargetSdk, minTargetSdk);
+10 −4
Original line number Diff line number Diff line
@@ -176,7 +176,8 @@ public class OverrideValidatorImplTest {
        CompatConfig config = CompatConfigBuilder.create(betaBuild(), mContext)
                        .addTargetSdkChangeWithId(TARGET_SDK_BEFORE, 1)
                        .addTargetSdkChangeWithId(TARGET_SDK, 2)
                        .addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3).build();
                        .addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3)
                        .addDisabledChangeWithId(4).build();
        IOverrideValidator overrideValidator = config.getOverrideValidator();
        when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt()))
                .thenReturn(ApplicationInfoBuilder.create()
@@ -190,6 +191,8 @@ public class OverrideValidatorImplTest {
                overrideValidator.getOverrideAllowedState(2, PACKAGE_NAME);
        OverrideAllowedState stateTargetSdkAfterChange =
                overrideValidator.getOverrideAllowedState(3, PACKAGE_NAME);
        OverrideAllowedState stateDisabledChange =
                overrideValidator.getOverrideAllowedState(4, PACKAGE_NAME);

        assertThat(stateTargetSdkLessChange)
                .isEqualTo(new OverrideAllowedState(ALLOWED, TARGET_SDK, TARGET_SDK_BEFORE));
@@ -197,6 +200,8 @@ public class OverrideValidatorImplTest {
                .isEqualTo(new OverrideAllowedState(ALLOWED, TARGET_SDK, TARGET_SDK));
        assertThat(stateTargetSdkAfterChange)
                .isEqualTo(new OverrideAllowedState(ALLOWED, TARGET_SDK, TARGET_SDK_AFTER));
        assertThat(stateDisabledChange)
                .isEqualTo(new OverrideAllowedState(ALLOWED, TARGET_SDK, -1));
    }

    @Test
@@ -343,7 +348,7 @@ public class OverrideValidatorImplTest {
    }

    @Test
    public void getOverrideAllowedState_finalBuildDisabledChangeDebugApp_rejectOverride()
    public void getOverrideAllowedState_finalBuildDisabledChangeDebugApp_allowOverride()
            throws Exception {
        CompatConfig config = CompatConfigBuilder.create(finalBuild(), mContext)
                .addDisabledChangeWithId(1).build();
@@ -351,13 +356,14 @@ public class OverrideValidatorImplTest {
        when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt()))
                .thenReturn(ApplicationInfoBuilder.create()
                        .withPackageName(PACKAGE_NAME)
                        .withTargetSdk(TARGET_SDK)
                        .debuggable().build());

        OverrideAllowedState allowedState =
                overrideValidator.getOverrideAllowedState(1, PACKAGE_NAME);

        assertThat(allowedState)
                .isEqualTo(new OverrideAllowedState(DISABLED_NON_TARGET_SDK, -1, -1));
                .isEqualTo(new OverrideAllowedState(ALLOWED, TARGET_SDK, -1));
    }

    @Test