Loading core/java/com/android/internal/compat/OverrideAllowedState.java +25 −1 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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 + ")"; } } services/core/java/com/android/server/compat/CompatConfig.java +13 −0 Original line number Diff line number Diff line Loading @@ -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 Loading services/core/java/com/android/server/compat/OverrideValidatorImpl.java +4 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); Loading services/tests/servicestests/src/com/android/server/compat/OverrideValidatorImplTest.java +10 −4 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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)); Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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 Loading Loading
core/java/com/android/internal/compat/OverrideAllowedState.java +25 −1 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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 + ")"; } }
services/core/java/com/android/server/compat/CompatConfig.java +13 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
services/core/java/com/android/server/compat/OverrideValidatorImpl.java +4 −3 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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); Loading
services/tests/servicestests/src/com/android/server/compat/OverrideValidatorImplTest.java +10 −4 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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)); Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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 Loading