Merge "Do not allow uninstalling while an app is pinned" into rvc-qpr-dev

This commit is contained in:
TreeHugger Robot
2020-11-11 21:21:59 +00:00
committed by Android (Google) Code Review
5 changed files with 53 additions and 0 deletions

View File

@@ -1688,6 +1688,15 @@ public abstract class PackageManager {
* {@hide} */
public static final int DELETE_FAILED_USED_SHARED_LIBRARY = -6;
/**
* Deletion failed return code: this is passed to the
* {@link IPackageDeleteObserver} if the system failed to delete the package
* because there is an app pinned.
*
* @hide
*/
public static final int DELETE_FAILED_APP_PINNED = -7;
/**
* Return code that is passed to the {@link IPackageMoveObserver} when the
* package has been successfully moved by the system.
@@ -7545,6 +7554,7 @@ public abstract class PackageManager {
case DELETE_FAILED_OWNER_BLOCKED: return "DELETE_FAILED_OWNER_BLOCKED";
case DELETE_FAILED_ABORTED: return "DELETE_FAILED_ABORTED";
case DELETE_FAILED_USED_SHARED_LIBRARY: return "DELETE_FAILED_USED_SHARED_LIBRARY";
case DELETE_FAILED_APP_PINNED: return "DELETE_FAILED_APP_PINNED";
default: return Integer.toString(status);
}
}
@@ -7559,6 +7569,7 @@ public abstract class PackageManager {
case DELETE_FAILED_OWNER_BLOCKED: return PackageInstaller.STATUS_FAILURE_BLOCKED;
case DELETE_FAILED_ABORTED: return PackageInstaller.STATUS_FAILURE_ABORTED;
case DELETE_FAILED_USED_SHARED_LIBRARY: return PackageInstaller.STATUS_FAILURE_CONFLICT;
case DELETE_FAILED_APP_PINNED: return PackageInstaller.STATUS_FAILURE_BLOCKED;
default: return PackageInstaller.STATUS_FAILURE;
}
}

View File

@@ -18178,6 +18178,19 @@ public class PackageManagerService extends IPackageManager.Stub
final String packageName = versionedPackage.getPackageName();
final long versionCode = versionedPackage.getLongVersionCode();
final String internalPackageName;
try {
if (LocalServices.getService(ActivityTaskManagerInternal.class)
.isBaseOfLockedTask(packageName)) {
observer.onPackageDeleted(
packageName, PackageManager.DELETE_FAILED_APP_PINNED, null);
EventLog.writeEvent(0x534e4554, "127605586", -1, "");
return;
}
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
synchronized (mLock) {
// Normalize package name to handle renamed packages and static libs
internalPackageName = resolveInternalPackageNameLPr(packageName, versionCode);

View File

@@ -568,4 +568,10 @@ public abstract class ActivityTaskManagerInternal {
/** Set all associated companion app that belongs to an userId. */
public abstract void setCompanionAppPackages(int userId, Set<String> companionAppPackages);
/**
* @param packageName The package to check
* @return Whether the package is the base of any locked task
*/
public abstract boolean isBaseOfLockedTask(String packageName);
}

View File

@@ -7473,5 +7473,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
mCompanionAppUidsMap.put(userId, result);
}
}
@Override
public boolean isBaseOfLockedTask(String packageName) {
synchronized (mGlobalLock) {
return getLockTaskController().isBaseOfLockedTask(packageName);
}
}
}
}

View File

@@ -870,6 +870,21 @@ public class LockTaskController {
return new Pair<>(flags1, flags2);
}
/**
* @param packageName The package to check
* @return Whether the package is the base of any locked task
*/
boolean isBaseOfLockedTask(String packageName) {
for (int i = 0; i < mLockTaskModeTasks.size(); i++) {
final Intent bi = mLockTaskModeTasks.get(i).getBaseIntent();
if (bi != null && packageName.equals(bi.getComponent()
.getPackageName())) {
return true;
}
}
return false;
}
/**
* Gets the cached value of LockTask feature flags for a specific user.
*/