diff options
author | tomnatan <tomnatan@google.com> | 2021-07-01 14:47:17 +0000 |
---|---|---|
committer | Tom Natan <tomnatan@google.com> | 2021-07-02 12:25:59 +0000 |
commit | 4d859f35bc67da7f8a1baecca51c2f32d46885e3 (patch) | |
tree | c5b93b604347eaf49f9c6909fdc8d96b170df511 | |
parent | de8ea692b1c58cb19c7fb94ce1aa5bf9299187b3 (diff) |
Handle multiple users when adding and rechecking overrides.
This is important for multi-user devices that have different
applications or versions installed for each user.
Bug: 190483583
Test: atest FrameworksServicesTests:CompatConfigTest
Test: atest FrameworksServicesTests:OverrideValidatorImplTest
Test: atest FrameworksServicesTests:PlatformCompatTest
Test: atest PlatformCompatGating:PlatformCompatPermissionsTest
Change-Id: I74c061001efbbd9699087e603a580cb2538891ec
4 files changed, 21 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java index de6e494a5581..a0a1b8033263 100644 --- a/services/core/java/com/android/server/compat/CompatConfig.java +++ b/services/core/java/com/android/server/compat/CompatConfig.java @@ -16,6 +16,8 @@ package com.android.server.compat; +import static android.content.pm.PackageManager.MATCH_ANY_USER; + import android.annotation.Nullable; import android.app.compat.ChangeIdStateCache; import android.app.compat.PackageOverride; @@ -693,7 +695,7 @@ final class CompatConfig { private Long getVersionCodeOrNull(String packageName) { try { ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo( - packageName, 0); + packageName, MATCH_ANY_USER); return applicationInfo.longVersionCode; } catch (PackageManager.NameNotFoundException e) { return null; diff --git a/services/core/java/com/android/server/compat/OverrideValidatorImpl.java b/services/core/java/com/android/server/compat/OverrideValidatorImpl.java index b5006913af35..e3b6d032b7f0 100644 --- a/services/core/java/com/android/server/compat/OverrideValidatorImpl.java +++ b/services/core/java/com/android/server/compat/OverrideValidatorImpl.java @@ -17,6 +17,7 @@ package com.android.server.compat; import static android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD; +import static android.content.pm.PackageManager.MATCH_ANY_USER; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static com.android.internal.compat.OverrideAllowedState.ALLOWED; @@ -116,7 +117,7 @@ public class OverrideValidatorImpl extends IOverrideValidator.Stub { } ApplicationInfo applicationInfo; try { - applicationInfo = packageManager.getApplicationInfo(packageName, 0); + applicationInfo = packageManager.getApplicationInfo(packageName, MATCH_ANY_USER); } catch (NameNotFoundException e) { return new OverrideAllowedState(DEFERRED_VERIFICATION, -1, -1); } diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java index 0d317f4ba164..b32d1d749680 100644 --- a/services/core/java/com/android/server/compat/PlatformCompat.java +++ b/services/core/java/com/android/server/compat/PlatformCompat.java @@ -81,7 +81,7 @@ public class PlatformCompat extends IPlatformCompat.Stub { @VisibleForTesting PlatformCompat(Context context, CompatConfig compatConfig, - AndroidBuildClassifier buildClassifier) { + AndroidBuildClassifier buildClassifier) { mContext = context; mChangeReporter = new ChangeReporter(ChangeReporter.SOURCE_SYSTEM_SERVER); mCompatConfig = compatConfig; @@ -178,8 +178,8 @@ public class PlatformCompat extends IPlatformCompat.Stub { * * <p>Does not perform costly permission check. * - * @param changeId the ID of the change in question - * @param packageName package name to check for + * @param changeId the ID of the change in question + * @param packageName package name to check for * @param targetSdkVersion target sdk version to check for * @return {@code true} if the change would be enabled for this package name. */ @@ -456,7 +456,7 @@ public class PlatformCompat extends IPlatformCompat.Stub { } if (change.getEnableSinceTargetSdk() > 0) { return change.getEnableSinceTargetSdk() >= Build.VERSION_CODES.Q - && change.getEnableSinceTargetSdk() <= mBuildClassifier.platformTargetSdk(); + && change.getEnableSinceTargetSdk() <= mBuildClassifier.platformTargetSdk(); } return true; } @@ -508,7 +508,8 @@ public class PlatformCompat extends IPlatformCompat.Stub { filter.addAction(Intent.ACTION_PACKAGE_REPLACED); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); filter.addDataScheme("package"); - context.registerReceiver(receiver, filter); + context.registerReceiverForAllUsers(receiver, filter, /* broadcastPermission= */ + null, /* scheduler= */ null); } /** diff --git a/tests/PlatformCompatGating/src/com/android/tests/gating/PlatformCompatPermissionsTest.java b/tests/PlatformCompatGating/src/com/android/tests/gating/PlatformCompatPermissionsTest.java index 9b9e5815a588..060133df0a40 100644 --- a/tests/PlatformCompatGating/src/com/android/tests/gating/PlatformCompatPermissionsTest.java +++ b/tests/PlatformCompatGating/src/com/android/tests/gating/PlatformCompatPermissionsTest.java @@ -16,6 +16,7 @@ package com.android.tests.gating; +import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.LOG_COMPAT_CHANGE; import static android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG; import static android.Manifest.permission.READ_COMPAT_CHANGE_CONFIG; @@ -261,13 +262,15 @@ public final class PlatformCompatPermissionsTest { public void clearOverrides_noOverridesPermission_throwsSecurityException() throws Throwable { thrown.expect(SecurityException.class); + mUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL); mPlatformCompat.clearOverrides("foo.bar"); } @Test public void clearOverrides_overridesPermission_noThrow() throws Throwable { - mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG); + mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG, + INTERACT_ACROSS_USERS_FULL); mPlatformCompat.clearOverrides("foo.bar"); } @@ -276,13 +279,15 @@ public final class PlatformCompatPermissionsTest { public void clearOverridesForTest_noOverridesPermission_throwsSecurityException() throws Throwable { thrown.expect(SecurityException.class); + mUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL); mPlatformCompat.clearOverridesForTest("foo.bar"); } @Test public void clearOverridesForTest_overridesPermission_noThrow() throws Throwable { - mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG); + mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG, + INTERACT_ACROSS_USERS_FULL); mPlatformCompat.clearOverridesForTest("foo.bar"); } @@ -291,13 +296,15 @@ public final class PlatformCompatPermissionsTest { public void clearOverride_noOverridesPermission_throwsSecurityException() throws Throwable { thrown.expect(SecurityException.class); + mUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL); mPlatformCompat.clearOverride(1, "foo.bar"); } @Test public void clearOverride_overridesPermission_noThrow() throws Throwable { - mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG); + mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG, + INTERACT_ACROSS_USERS_FULL); mPlatformCompat.clearOverride(1, "foo.bar"); } |