Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b41548eb authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Do not allow uninstalling while an app is pinned"

parents 5135242f 585e5c46
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1711,6 +1711,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.
@@ -7739,6 +7748,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);
        }
    }
@@ -7753,6 +7763,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;
        }
    }
+13 −0
Original line number Diff line number Diff line
@@ -18713,6 +18713,19 @@ public class PackageManagerService extends IPackageManager.Stub
        final String packageName = versionedPackage.getPackageName();
        final long versionCode = versionedPackage.getLongVersionCode();
        final String internalPackageName;
        try {
            if (mInjector.getLocalService(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);
+6 −0
Original line number Diff line number Diff line
@@ -565,4 +565,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);
}
+8 −0
Original line number Diff line number Diff line
@@ -7432,5 +7432,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
                mCompanionAppUidsMap.put(userId, result);
            }
        }


        @Override
        public boolean isBaseOfLockedTask(String packageName) {
            synchronized (mGlobalLock) {
                return getLockTaskController().isBaseOfLockedTask(packageName);
            }
        }
    }
}
+15 −0
Original line number Diff line number Diff line
@@ -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.
     */