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
This commit is contained in:
parent
de8ea692b1
commit
4d859f35bc
@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.server.compat;
|
package com.android.server.compat;
|
||||||
|
|
||||||
|
import static android.content.pm.PackageManager.MATCH_ANY_USER;
|
||||||
|
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.app.compat.ChangeIdStateCache;
|
import android.app.compat.ChangeIdStateCache;
|
||||||
import android.app.compat.PackageOverride;
|
import android.app.compat.PackageOverride;
|
||||||
@ -693,7 +695,7 @@ final class CompatConfig {
|
|||||||
private Long getVersionCodeOrNull(String packageName) {
|
private Long getVersionCodeOrNull(String packageName) {
|
||||||
try {
|
try {
|
||||||
ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(
|
ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(
|
||||||
packageName, 0);
|
packageName, MATCH_ANY_USER);
|
||||||
return applicationInfo.longVersionCode;
|
return applicationInfo.longVersionCode;
|
||||||
} catch (PackageManager.NameNotFoundException e) {
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
package com.android.server.compat;
|
package com.android.server.compat;
|
||||||
|
|
||||||
import static android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD;
|
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 android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||||
|
|
||||||
import static com.android.internal.compat.OverrideAllowedState.ALLOWED;
|
import static com.android.internal.compat.OverrideAllowedState.ALLOWED;
|
||||||
@ -116,7 +117,7 @@ public class OverrideValidatorImpl extends IOverrideValidator.Stub {
|
|||||||
}
|
}
|
||||||
ApplicationInfo applicationInfo;
|
ApplicationInfo applicationInfo;
|
||||||
try {
|
try {
|
||||||
applicationInfo = packageManager.getApplicationInfo(packageName, 0);
|
applicationInfo = packageManager.getApplicationInfo(packageName, MATCH_ANY_USER);
|
||||||
} catch (NameNotFoundException e) {
|
} catch (NameNotFoundException e) {
|
||||||
return new OverrideAllowedState(DEFERRED_VERIFICATION, -1, -1);
|
return new OverrideAllowedState(DEFERRED_VERIFICATION, -1, -1);
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ public class PlatformCompat extends IPlatformCompat.Stub {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
PlatformCompat(Context context, CompatConfig compatConfig,
|
PlatformCompat(Context context, CompatConfig compatConfig,
|
||||||
AndroidBuildClassifier buildClassifier) {
|
AndroidBuildClassifier buildClassifier) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mChangeReporter = new ChangeReporter(ChangeReporter.SOURCE_SYSTEM_SERVER);
|
mChangeReporter = new ChangeReporter(ChangeReporter.SOURCE_SYSTEM_SERVER);
|
||||||
mCompatConfig = compatConfig;
|
mCompatConfig = compatConfig;
|
||||||
@ -178,8 +178,8 @@ public class PlatformCompat extends IPlatformCompat.Stub {
|
|||||||
*
|
*
|
||||||
* <p>Does not perform costly permission check.
|
* <p>Does not perform costly permission check.
|
||||||
*
|
*
|
||||||
* @param changeId the ID of the change in question
|
* @param changeId the ID of the change in question
|
||||||
* @param packageName package name to check for
|
* @param packageName package name to check for
|
||||||
* @param targetSdkVersion target sdk version to check for
|
* @param targetSdkVersion target sdk version to check for
|
||||||
* @return {@code true} if the change would be enabled for this package name.
|
* @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) {
|
if (change.getEnableSinceTargetSdk() > 0) {
|
||||||
return change.getEnableSinceTargetSdk() >= Build.VERSION_CODES.Q
|
return change.getEnableSinceTargetSdk() >= Build.VERSION_CODES.Q
|
||||||
&& change.getEnableSinceTargetSdk() <= mBuildClassifier.platformTargetSdk();
|
&& change.getEnableSinceTargetSdk() <= mBuildClassifier.platformTargetSdk();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -508,7 +508,8 @@ public class PlatformCompat extends IPlatformCompat.Stub {
|
|||||||
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
|
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
|
||||||
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
|
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
|
||||||
filter.addDataScheme("package");
|
filter.addDataScheme("package");
|
||||||
context.registerReceiver(receiver, filter);
|
context.registerReceiverForAllUsers(receiver, filter, /* broadcastPermission= */
|
||||||
|
null, /* scheduler= */ null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.tests.gating;
|
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.LOG_COMPAT_CHANGE;
|
||||||
import static android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG;
|
import static android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG;
|
||||||
import static android.Manifest.permission.READ_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()
|
public void clearOverrides_noOverridesPermission_throwsSecurityException()
|
||||||
throws Throwable {
|
throws Throwable {
|
||||||
thrown.expect(SecurityException.class);
|
thrown.expect(SecurityException.class);
|
||||||
|
mUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL);
|
||||||
|
|
||||||
mPlatformCompat.clearOverrides("foo.bar");
|
mPlatformCompat.clearOverrides("foo.bar");
|
||||||
}
|
}
|
||||||
@Test
|
@Test
|
||||||
public void clearOverrides_overridesPermission_noThrow()
|
public void clearOverrides_overridesPermission_noThrow()
|
||||||
throws Throwable {
|
throws Throwable {
|
||||||
mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG);
|
mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG,
|
||||||
|
INTERACT_ACROSS_USERS_FULL);
|
||||||
|
|
||||||
mPlatformCompat.clearOverrides("foo.bar");
|
mPlatformCompat.clearOverrides("foo.bar");
|
||||||
}
|
}
|
||||||
@ -276,13 +279,15 @@ public final class PlatformCompatPermissionsTest {
|
|||||||
public void clearOverridesForTest_noOverridesPermission_throwsSecurityException()
|
public void clearOverridesForTest_noOverridesPermission_throwsSecurityException()
|
||||||
throws Throwable {
|
throws Throwable {
|
||||||
thrown.expect(SecurityException.class);
|
thrown.expect(SecurityException.class);
|
||||||
|
mUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL);
|
||||||
|
|
||||||
mPlatformCompat.clearOverridesForTest("foo.bar");
|
mPlatformCompat.clearOverridesForTest("foo.bar");
|
||||||
}
|
}
|
||||||
@Test
|
@Test
|
||||||
public void clearOverridesForTest_overridesPermission_noThrow()
|
public void clearOverridesForTest_overridesPermission_noThrow()
|
||||||
throws Throwable {
|
throws Throwable {
|
||||||
mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG);
|
mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG,
|
||||||
|
INTERACT_ACROSS_USERS_FULL);
|
||||||
|
|
||||||
mPlatformCompat.clearOverridesForTest("foo.bar");
|
mPlatformCompat.clearOverridesForTest("foo.bar");
|
||||||
}
|
}
|
||||||
@ -291,13 +296,15 @@ public final class PlatformCompatPermissionsTest {
|
|||||||
public void clearOverride_noOverridesPermission_throwsSecurityException()
|
public void clearOverride_noOverridesPermission_throwsSecurityException()
|
||||||
throws Throwable {
|
throws Throwable {
|
||||||
thrown.expect(SecurityException.class);
|
thrown.expect(SecurityException.class);
|
||||||
|
mUiAutomation.adoptShellPermissionIdentity(INTERACT_ACROSS_USERS_FULL);
|
||||||
|
|
||||||
mPlatformCompat.clearOverride(1, "foo.bar");
|
mPlatformCompat.clearOverride(1, "foo.bar");
|
||||||
}
|
}
|
||||||
@Test
|
@Test
|
||||||
public void clearOverride_overridesPermission_noThrow()
|
public void clearOverride_overridesPermission_noThrow()
|
||||||
throws Throwable {
|
throws Throwable {
|
||||||
mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG);
|
mUiAutomation.adoptShellPermissionIdentity(OVERRIDE_COMPAT_CHANGE_CONFIG,
|
||||||
|
INTERACT_ACROSS_USERS_FULL);
|
||||||
|
|
||||||
mPlatformCompat.clearOverride(1, "foo.bar");
|
mPlatformCompat.clearOverride(1, "foo.bar");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user