DO NOT MERGE Fix auto-grant of AR runtime permission if device is upgrading from pre-Q

Test: Manually install app apks targeting Q and verifying that AR permission is not auto-granted
Test: atest ActivityRecognitionPermissionTest
Bug: 210065877
Change-Id: I7004055c9573d17f31255c2b1adee1e0aeeb238f
This commit is contained in:
Ganesh Olekar
2022-06-30 00:20:15 +00:00
parent e813a20711
commit f11f26c012
3 changed files with 32 additions and 15 deletions

View File

@@ -998,4 +998,10 @@ public abstract class PackageManagerInternal {
* Returns {@code true} if the package is suspending any packages for the user. * Returns {@code true} if the package is suspending any packages for the user.
*/ */
public abstract boolean isSuspendingAnyPackages(String suspendingPackage, int userId); public abstract boolean isSuspendingAnyPackages(String suspendingPackage, int userId);
/**
* Get installed SDK version of the package
* @param pkg package for which to retrieve the installed sdk version
*/
public abstract int getInstalledSdkVersion(AndroidPackage pkg);
} }

View File

@@ -25158,6 +25158,11 @@ public class PackageManagerService extends IPackageManager.Stub
public boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { public boolean isSuspendingAnyPackages(String suspendingPackage, int userId) {
return PackageManagerService.this.isSuspendingAnyPackages(suspendingPackage, userId); return PackageManagerService.this.isSuspendingAnyPackages(suspendingPackage, userId);
} }
@Override
public int getInstalledSdkVersion(AndroidPackage pkg) {
return PackageManagerService.this.getSettingsVersionForPackage(pkg).sdkVersion;
}
} }
@GuardedBy("mLock") @GuardedBy("mLock")

View File

@@ -2755,7 +2755,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
// uids the original and new state are the same object // uids the original and new state are the same object
if (!origPermissions.hasRequestedPermission(permName) if (!origPermissions.hasRequestedPermission(permName)
&& (pkg.getImplicitPermissions().contains(permName) && (pkg.getImplicitPermissions().contains(permName)
|| (permName.equals(Manifest.permission.ACTIVITY_RECOGNITION)))) { || (permName.equals(Manifest.permission.ACTIVITY_RECOGNITION)))) {
if (pkg.getImplicitPermissions().contains(permName)) { if (pkg.getImplicitPermissions().contains(permName)) {
// If permName is an implicit permission, try to auto-grant // If permName is an implicit permission, try to auto-grant
newImplicitPermissions.add(permName); newImplicitPermissions.add(permName);
@@ -2771,22 +2771,28 @@ public class PermissionManagerService extends IPermissionManager.Stub {
// or has updated its target SDK and AR is no longer implicit to it. // or has updated its target SDK and AR is no longer implicit to it.
// This is a compatibility workaround for apps when AR permission was // This is a compatibility workaround for apps when AR permission was
// split in Q. // split in Q.
final List<SplitPermissionInfoParcelable> permissionList = // b/210065877: Check that the installed version is pre Q to auto-grant in
getSplitPermissions(); // case of OS update
int numSplitPerms = permissionList.size(); if (mPackageManagerInt.getInstalledSdkVersion(pkg)
for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) { < Build.VERSION_CODES.Q) {
SplitPermissionInfoParcelable sp = permissionList.get(splitPermNum); final List<SplitPermissionInfoParcelable> permissionList =
String splitPermName = sp.getSplitPermission(); getSplitPermissions();
if (sp.getNewPermissions().contains(permName) int numSplitPerms = permissionList.size();
&& origPermissions.hasInstallPermission(splitPermName)) { for (int splitPermNum = 0; splitPermNum < numSplitPerms;
upgradedActivityRecognitionPermission = splitPermName; splitPermNum++) {
newImplicitPermissions.add(permName); SplitPermissionInfoParcelable sp = permissionList.get(splitPermNum);
String splitPermName = sp.getSplitPermission();
if (sp.getNewPermissions().contains(permName)
&& origPermissions.hasInstallPermission(splitPermName)) {
upgradedActivityRecognitionPermission = splitPermName;
newImplicitPermissions.add(permName);
if (DEBUG_PERMISSIONS) { if (DEBUG_PERMISSIONS) {
Slog.i(TAG, permName + " is newly added for " Slog.i(TAG, permName + " is newly added for "
+ pkg.getPackageName()); + pkg.getPackageName());
}
break;
} }
break;
} }
} }
} }