Merge "Add PackageInstaller#uninstallExistingPackage" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f424274d8e
@@ -51,6 +51,9 @@ interface IPackageInstaller {
|
|||||||
void uninstall(in VersionedPackage versionedPackage, String callerPackageName, int flags,
|
void uninstall(in VersionedPackage versionedPackage, String callerPackageName, int flags,
|
||||||
in IntentSender statusReceiver, int userId);
|
in IntentSender statusReceiver, int userId);
|
||||||
|
|
||||||
|
void uninstallExistingPackage(in VersionedPackage versionedPackage, String callerPackageName,
|
||||||
|
in IntentSender statusReceiver, int userId);
|
||||||
|
|
||||||
void installExistingPackage(String packageName, int installFlags, int installReason,
|
void installExistingPackage(String packageName, int installFlags, int installReason,
|
||||||
in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions);
|
in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions);
|
||||||
|
|
||||||
|
|||||||
@@ -235,6 +235,16 @@ interface IPackageManager {
|
|||||||
void deletePackageVersioned(in VersionedPackage versionedPackage,
|
void deletePackageVersioned(in VersionedPackage versionedPackage,
|
||||||
IPackageDeleteObserver2 observer, int userId, int flags);
|
IPackageDeleteObserver2 observer, int userId, int flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a package for a specific user.
|
||||||
|
*
|
||||||
|
* @param versionedPackage The package to delete.
|
||||||
|
* @param observer a callback to use to notify when the package deletion in finished.
|
||||||
|
* @param userId the id of the user for whom to delete the package
|
||||||
|
*/
|
||||||
|
void deleteExistingPackageAsUser(in VersionedPackage versionedPackage,
|
||||||
|
IPackageDeleteObserver2 observer, int userId);
|
||||||
|
|
||||||
@UnsupportedAppUsage
|
@UnsupportedAppUsage
|
||||||
String getInstallerPackageName(in String packageName);
|
String getInstallerPackageName(in String packageName);
|
||||||
|
|
||||||
|
|||||||
@@ -720,6 +720,27 @@ public class PackageInstaller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uninstall the given package for the user for which this installer was created if the package
|
||||||
|
* will still exist for other users on the device.
|
||||||
|
*
|
||||||
|
* @param packageName The package to install.
|
||||||
|
* @param statusReceiver Where to deliver the result.
|
||||||
|
*
|
||||||
|
* {@hide}
|
||||||
|
*/
|
||||||
|
@RequiresPermission(Manifest.permission.DELETE_PACKAGES)
|
||||||
|
public void uninstallExistingPackage(@NonNull String packageName,
|
||||||
|
@Nullable IntentSender statusReceiver) {
|
||||||
|
Objects.requireNonNull(packageName, "packageName cannot be null");
|
||||||
|
try {
|
||||||
|
mInstaller.uninstallExistingPackage(
|
||||||
|
new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST),
|
||||||
|
mInstallerPackageName, statusReceiver, mUserId);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
@SystemApi
|
@SystemApi
|
||||||
|
|||||||
@@ -933,6 +933,21 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uninstallExistingPackage(VersionedPackage versionedPackage,
|
||||||
|
String callerPackageName, IntentSender statusReceiver, int userId) {
|
||||||
|
final int callingUid = Binder.getCallingUid();
|
||||||
|
mContext.enforceCallingOrSelfPermission(Manifest.permission.DELETE_PACKAGES, null);
|
||||||
|
mPermissionManager.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
|
||||||
|
if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) {
|
||||||
|
mAppOps.checkPackage(callingUid, callerPackageName);
|
||||||
|
}
|
||||||
|
|
||||||
|
final PackageDeleteObserverAdapter adapter = new PackageDeleteObserverAdapter(mContext,
|
||||||
|
statusReceiver, versionedPackage.getPackageName(), false, userId);
|
||||||
|
mPm.deleteExistingPackageAsUser(versionedPackage, adapter.getBinder(), userId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void installExistingPackage(String packageName, int installFlags, int installReason,
|
public void installExistingPackage(String packageName, int installFlags, int installReason,
|
||||||
IntentSender statusReceiver, int userId, List<String> whiteListedPermissions) {
|
IntentSender statusReceiver, int userId, List<String> whiteListedPermissions) {
|
||||||
|
|||||||
@@ -17910,9 +17910,47 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
new LegacyPackageDeleteObserver(observer).getBinder(), userId, flags);
|
new LegacyPackageDeleteObserver(observer).getBinder(), userId, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteExistingPackageAsUser(VersionedPackage versionedPackage,
|
||||||
|
final IPackageDeleteObserver2 observer, final int userId) {
|
||||||
|
mContext.enforceCallingOrSelfPermission(
|
||||||
|
android.Manifest.permission.DELETE_PACKAGES, null);
|
||||||
|
Preconditions.checkNotNull(versionedPackage);
|
||||||
|
Preconditions.checkNotNull(observer);
|
||||||
|
final String packageName = versionedPackage.getPackageName();
|
||||||
|
final long versionCode = versionedPackage.getLongVersionCode();
|
||||||
|
|
||||||
|
int installedForUsersCount = 0;
|
||||||
|
synchronized (mLock) {
|
||||||
|
// Normalize package name to handle renamed packages and static libs
|
||||||
|
final String internalPkgName = resolveInternalPackageNameLPr(packageName, versionCode);
|
||||||
|
final PackageSetting ps = mSettings.getPackageLPr(internalPkgName);
|
||||||
|
if (ps != null) {
|
||||||
|
int[] installedUsers = ps.queryInstalledUsers(mUserManager.getUserIds(), true);
|
||||||
|
installedForUsersCount = installedUsers.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (installedForUsersCount > 1) {
|
||||||
|
deletePackageVersionedInternal(versionedPackage, observer, userId, 0, true);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
observer.onPackageDeleted(packageName, PackageManager.DELETE_FAILED_INTERNAL_ERROR,
|
||||||
|
null);
|
||||||
|
} catch (RemoteException re) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deletePackageVersioned(VersionedPackage versionedPackage,
|
public void deletePackageVersioned(VersionedPackage versionedPackage,
|
||||||
final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
|
final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
|
||||||
|
deletePackageVersionedInternal(versionedPackage, observer, userId, deleteFlags, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deletePackageVersionedInternal(VersionedPackage versionedPackage,
|
||||||
|
final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags,
|
||||||
|
final boolean allowSilentUninstall) {
|
||||||
final int callingUid = Binder.getCallingUid();
|
final int callingUid = Binder.getCallingUid();
|
||||||
mContext.enforceCallingOrSelfPermission(
|
mContext.enforceCallingOrSelfPermission(
|
||||||
android.Manifest.permission.DELETE_PACKAGES, null);
|
android.Manifest.permission.DELETE_PACKAGES, null);
|
||||||
@@ -17933,6 +17971,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
|
|
||||||
final int uid = Binder.getCallingUid();
|
final int uid = Binder.getCallingUid();
|
||||||
if (!isOrphaned(internalPackageName)
|
if (!isOrphaned(internalPackageName)
|
||||||
|
&& !allowSilentUninstall
|
||||||
&& !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) {
|
&& !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) {
|
||||||
mHandler.post(() -> {
|
mHandler.post(() -> {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user