diff options
4 files changed, 43 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/compat/CompatChange.java b/services/core/java/com/android/server/compat/CompatChange.java index ff3193182501..a8aa9aada607 100644 --- a/services/core/java/com/android/server/compat/CompatChange.java +++ b/services/core/java/com/android/server/compat/CompatChange.java @@ -143,6 +143,9 @@ public final class CompatChange extends CompatibilityChangeInfo {       * @return {@code true} if the change should be enabled for the package.       */      boolean isEnabled(ApplicationInfo app) { +        if (app == null) { +            return defaultValue(); +        }          if (mPackageOverrides != null && mPackageOverrides.containsKey(app.packageName)) {              return mPackageOverrides.get(app.packageName);          } @@ -156,6 +159,15 @@ public final class CompatChange extends CompatibilityChangeInfo {      }      /** +     * Returns the default value for the change id, assuming there are no overrides. +     * +     * @return {@code false} if it's a default disabled change, {@code true} otherwise. +     */ +    boolean defaultValue() { +        return !getDisabled(); +    } + +    /**       * Checks whether a change has an override for a package.       * @param packageName name of the package       * @return true if there is such override diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java index d80c58b39768..8511118cc840 100644 --- a/services/core/java/com/android/server/compat/CompatConfig.java +++ b/services/core/java/com/android/server/compat/CompatConfig.java @@ -392,6 +392,14 @@ final class CompatConfig {          return alreadyKnown;      } +    boolean defaultChangeIdValue(long changeId) { +        CompatChange c = mChanges.get(changeId); +        if (c == null) { +            return true; +        } +        return c.defaultValue(); +    } +      @VisibleForTesting      void clearChanges() {          synchronized (mChanges) { diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java index 77d5411f5f7f..4bd01d465e62 100644 --- a/services/core/java/com/android/server/compat/PlatformCompat.java +++ b/services/core/java/com/android/server/compat/PlatformCompat.java @@ -120,10 +120,12 @@ public class PlatformCompat extends IPlatformCompat.Stub {       * permission check.       */      public boolean isChangeEnabledInternal(long changeId, ApplicationInfo appInfo) { -        boolean value = isChangeEnabledInternalNoLogging(changeId, appInfo); -        reportChange(changeId, appInfo.uid, -                value ? ChangeReporter.STATE_ENABLED : ChangeReporter.STATE_DISABLED); -        return value; +        boolean enabled = isChangeEnabledInternalNoLogging(changeId, appInfo); +        if (appInfo != null) { +            reportChange(changeId, appInfo.uid, +                    enabled ? ChangeReporter.STATE_ENABLED : ChangeReporter.STATE_DISABLED); +        } +        return enabled;      }      @Override @@ -131,9 +133,6 @@ public class PlatformCompat extends IPlatformCompat.Stub {              @UserIdInt int userId) {          checkCompatChangeReadAndLogPermission();          ApplicationInfo appInfo = getApplicationInfo(packageName, userId); -        if (appInfo == null) { -            return true; -        }          return isChangeEnabled(changeId, appInfo);      } @@ -142,7 +141,7 @@ public class PlatformCompat extends IPlatformCompat.Stub {          checkCompatChangeReadAndLogPermission();          String[] packages = mContext.getPackageManager().getPackagesForUid(uid);          if (packages == null || packages.length == 0) { -            return true; +            return mCompatConfig.defaultChangeIdValue(changeId);          }          boolean enabled = true;          for (String packageName : packages) { diff --git a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java index e5883708e921..8c63bfcf1407 100644 --- a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java @@ -190,6 +190,22 @@ public class CompatConfigTest {      }      @Test +    public void testIsChangeEnabledForInvalidApp() throws Exception { +        final long disabledChangeId = 1234L; +        final long enabledChangeId = 1235L; +        final long targetSdkChangeId = 1236L; +        CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) +                .addEnabledChangeWithId(enabledChangeId) +                .addDisabledChangeWithId(disabledChangeId) +                .addEnableSinceSdkChangeWithId(42, targetSdkChangeId) +                .build(); + +        assertThat(compatConfig.isChangeEnabled(enabledChangeId, null)).isTrue(); +        assertThat(compatConfig.isChangeEnabled(disabledChangeId, null)).isFalse(); +        assertThat(compatConfig.isChangeEnabled(targetSdkChangeId, null)).isTrue(); +    } + +    @Test      public void testPreventAddOverride() throws Exception {          final long changeId = 1234L;          CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext)  |