Create PackageInstalledParams for onPackageInstalled().

So that the API is extensible, and we will only need to add new
methods instead of modifying existing ones when a new parameter needs
to be introduced.

Bug: 158736025
Test: presubmit
Change-Id: Iac14af78a7d8dc611800d8f78b7a496f07f74a09
This commit is contained in:
Hai Zhang
2020-11-30 18:12:33 -08:00
parent 1cd2eb673a
commit dbf572969d
3 changed files with 166 additions and 35 deletions

View File

@@ -2203,22 +2203,27 @@ public class PackageManagerService extends IPackageManager.Stub
res.removedInfo.sendPackageRemovedBroadcasts(killApp, false /*removedBySystem*/);
}
final PermissionManagerServiceInternal.PackageInstalledParams.Builder
permissionParamsBuilder =
new PermissionManagerServiceInternal.PackageInstalledParams.Builder();
final List<String> grantedPermissionsList;
if (grantPermissions) {
if (grantedPermissions != null) {
grantedPermissionsList = Arrays.asList(grantedPermissions);
permissionParamsBuilder.setGrantedPermissions(Arrays.asList(
grantedPermissions));
} else {
grantedPermissionsList = res.pkg.getRequestedPermissions();
permissionParamsBuilder.setGrantedPermissions(
res.pkg.getRequestedPermissions());
}
} else {
grantedPermissionsList = Collections.emptyList();
}
if (allowlistedRestrictedPermissions == null) {
allowlistedRestrictedPermissions = Collections.emptyList();
if (allowlistedRestrictedPermissions != null) {
permissionParamsBuilder.setAllowlistedRestrictedPermissions(
allowlistedRestrictedPermissions);
}
permissionParamsBuilder.setAutoRevokePermissionsMode(autoRevokePermissionsMode);
for (final int userId : res.newUsers) {
mPermissionManager.onPackageInstalled(res.pkg, grantedPermissionsList,
allowlistedRestrictedPermissions, autoRevokePermissionsMode, userId);
mPermissionManager.onPackageInstalled(res.pkg, permissionParamsBuilder.build(),
userId);
}
final String installerPackageName =
@@ -3918,8 +3923,9 @@ public class PackageManagerService extends IPackageManager.Stub
}
final int[] userIds = mUserManager.getUserIds();
for (final int userId : userIds) {
mPermissionManager.onPackageInstalled(pkg, Collections.emptyList(),
Collections.emptyList(), MODE_DEFAULT, userId);
mPermissionManager.onPackageInstalled(pkg,
PermissionManagerServiceInternal.PackageInstalledParams.DEFAULT,
userId);
}
writeSettingsLPrTEMP();
}
@@ -13664,14 +13670,16 @@ public class PackageManagerService extends IPackageManager.Stub
if (installed) {
if (pkgSetting.pkg != null) {
final PermissionManagerServiceInternal.PackageInstalledParams.Builder
permissionParamsBuilder =
new PermissionManagerServiceInternal.PackageInstalledParams.Builder();
if ((installFlags & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS)
!= 0) {
allowlistedRestrictedPermissions = pkgSetting.pkg.getRequestedPermissions();
} else if (allowlistedRestrictedPermissions == null) {
allowlistedRestrictedPermissions = Collections.emptyList();
permissionParamsBuilder.setAllowlistedRestrictedPermissions(
pkgSetting.pkg.getRequestedPermissions());
}
mPermissionManager.onPackageInstalled(pkgSetting.pkg, Collections.emptyList(),
allowlistedRestrictedPermissions, MODE_DEFAULT, userId);
mPermissionManager.onPackageInstalled(pkgSetting.pkg,
permissionParamsBuilder.build(), userId);
}
if (pkgSetting.pkg != null) {
@@ -19724,8 +19732,8 @@ public class PackageManagerService extends IPackageManager.Stub
for (final int userId : allUserHandles) {
// The method below will take care of removing obsolete permissions and granting
// install permissions.
mPermissionManager.onPackageInstalled(pkg, Collections.emptyList(),
Collections.emptyList(), MODE_DEFAULT, userId);
mPermissionManager.onPackageInstalled(pkg,
PermissionManagerServiceInternal.PackageInstalledParams.DEFAULT, userId);
if (applyUserRestrictions) {
mSettings.writeRuntimePermissionsForUserLPr(userId, false);
}

View File

@@ -4895,18 +4895,19 @@ public class PermissionManagerService extends IPermissionManager.Stub {
}
private void onPackageInstalledInternal(@NonNull AndroidPackage pkg,
@NonNull List<String> grantedPermissions,
@NonNull List<String> allowlistedRestrictedPermissions, int autoRevokePermissionsMode,
@NonNull PermissionManagerServiceInternal.PackageInstalledParams params,
@UserIdInt int userId) {
updatePermissions(pkg.getPackageName(), pkg);
addAllowlistedRestrictedPermissionsInternal(pkg, allowlistedRestrictedPermissions,
addAllowlistedRestrictedPermissionsInternal(pkg,
params.getAllowlistedRestrictedPermissions(),
FLAG_PERMISSION_WHITELIST_INSTALLER, userId);
final int autoRevokePermissionsMode = params.getAutoRevokePermissionsMode();
if (autoRevokePermissionsMode == AppOpsManager.MODE_ALLOWED
|| autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED) {
setAutoRevokeExemptedInternal(pkg,
autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED, userId);
}
grantRequestedRuntimePermissionsInternal(pkg, grantedPermissions, userId);
grantRequestedRuntimePermissionsInternal(pkg, params.getGrantedPermissions(), userId);
}
private void addAllowlistedRestrictedPermissionsInternal(@NonNull AndroidPackage pkg,
@@ -5364,16 +5365,11 @@ public class PermissionManagerService extends IPermissionManager.Stub {
@Override
public void onPackageInstalled(@NonNull AndroidPackage pkg,
@NonNull List<String> grantedPermissions,
@NonNull List<String> allowlistedRestrictedPermissions,
int autoRevokePermissionsMode, @UserIdInt int userId) {
@NonNull PackageInstalledParams params, @UserIdInt int userId) {
Objects.requireNonNull(pkg, "pkg");
Objects.requireNonNull(grantedPermissions, "grantedPermissions");
Objects.requireNonNull(allowlistedRestrictedPermissions,
"allowlistedRestrictedPermissions");
Objects.requireNonNull(params, "params");
Preconditions.checkArgumentNonNegative(userId, "userId");
onPackageInstalledInternal(pkg, grantedPermissions, allowlistedRestrictedPermissions,
autoRevokePermissionsMode, userId);
onPackageInstalledInternal(pkg, params, userId);
}
@Override

View File

@@ -20,13 +20,16 @@ import android.annotation.AppIdInt;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.AppOpsManager;
import android.content.pm.PermissionInfo;
import android.permission.PermissionManagerInternal;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;
@@ -476,16 +479,12 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager
* Callback when a package has been installed for a user.
*
* @param pkg the installed package
* @param grantedPermissions the permissions to be granted
* @param allowlistedRestrictedPermissions the restricted permissions to be allowlisted
* @param autoRevokePermissionsMode the auto revoke permissions mode for this package
* @param params the parameters passed in for package installation
* @param userId the user ID this package is installed for
*/
//@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
public abstract void onPackageInstalled(@NonNull AndroidPackage pkg,
@NonNull List<String> grantedPermissions,
@NonNull List<String> allowlistedRestrictedPermissions,
int autoRevokePermissionsMode, @UserIdInt int userId);
@NonNull PackageInstalledParams params, @UserIdInt int userId);
/**
* Callback when a package has been removed.
@@ -521,4 +520,132 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager
* @return whether the permission can be propagated
*/
public abstract boolean canPropagatePermissionToInstantApp(@NonNull String permissionName);
/**
* The permission-related parameters passed in for package installation.
*
* @see android.content.pm.PackageInstaller.SessionParams
*/
//@SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
public static final class PackageInstalledParams {
/**
* A static instance whose parameters are all in their default state.
*/
public static final PackageInstalledParams DEFAULT = new Builder().build();
@NonNull
private final List<String> mGrantedPermissions;
@NonNull
private final List<String> mAllowlistedRestrictedPermissions;
@NonNull
private final int mAutoRevokePermissionsMode;
private PackageInstalledParams(@NonNull List<String> grantedPermissions,
@NonNull List<String> allowlistedRestrictedPermissions,
int autoRevokePermissionsMode) {
mGrantedPermissions = grantedPermissions;
mAllowlistedRestrictedPermissions = allowlistedRestrictedPermissions;
mAutoRevokePermissionsMode = autoRevokePermissionsMode;
}
/**
* Get the permissions to be granted.
*
* @return the permissions to be granted
*/
@NonNull
public List<String> getGrantedPermissions() {
return mGrantedPermissions;
}
/**
* Get the restricted permissions to be allowlisted.
*
* @return the restricted permissions to be allowlisted
*/
@NonNull
public List<String> getAllowlistedRestrictedPermissions() {
return mAllowlistedRestrictedPermissions;
}
/**
* Get the mode for auto revoking permissions.
*
* @return the mode for auto revoking permissions
*/
public int getAutoRevokePermissionsMode() {
return mAutoRevokePermissionsMode;
}
/**
* Builder class for {@link PackageInstalledParams}.
*/
public static final class Builder {
@NonNull
private List<String> mGrantedPermissions = Collections.emptyList();
@NonNull
private List<String> mAllowlistedRestrictedPermissions = Collections.emptyList();
@NonNull
private int mAutoRevokePermissionsMode = AppOpsManager.MODE_DEFAULT;
/**
* Set the permissions to be granted.
*
* @param grantedPermissions the permissions to be granted
*
* @see android.content.pm.PackageInstaller.SessionParams#setGrantedRuntimePermissions(
* java.lang.String[])
*/
public void setGrantedPermissions(@NonNull List<String> grantedPermissions) {
Objects.requireNonNull(grantedPermissions);
mGrantedPermissions = new ArrayList<>(grantedPermissions);
}
/**
* Set the restricted permissions to be allowlisted.
* <p>
* Permissions that are not restricted are ignored, so one can just pass in all
* requested permissions of a package to get all its restricted permissions allowlisted.
*
* @param allowlistedRestrictedPermissions the restricted permissions to be allowlisted
*
* @see android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)
*/
public void setAllowlistedRestrictedPermissions(
@NonNull List<String> allowlistedRestrictedPermissions) {
Objects.requireNonNull(mGrantedPermissions);
mAllowlistedRestrictedPermissions = new ArrayList<>(
allowlistedRestrictedPermissions);
}
/**
* Set the mode for auto revoking permissions.
* <p>
* {@link AppOpsManager#MODE_ALLOWED} means the system is allowed to auto revoke
* permissions from this package, and {@link AppOpsManager#MODE_IGNORED} means this
* package should be ignored when auto revoking permissions.
* {@link AppOpsManager#MODE_DEFAULT} means no changes will be made to the auto revoke
* mode of this package.
*
* @param autoRevokePermissionsMode the mode for auto revoking permissions
*
* @see android.content.pm.PackageInstaller.SessionParams#setAutoRevokePermissionsMode(
* boolean)
*/
public void setAutoRevokePermissionsMode(int autoRevokePermissionsMode) {
mAutoRevokePermissionsMode = autoRevokePermissionsMode;
}
/**
* Build a new instance of {@link PackageInstalledParams}.
*
* @return the {@link PackageInstalledParams} built
*/
@NonNull
public PackageInstalledParams build() {
return new PackageInstalledParams(mGrantedPermissions,
mAllowlistedRestrictedPermissions, mAutoRevokePermissionsMode);
}
}
}
}