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

Commit 3bb71c1c authored by Varun Shah's avatar Varun Shah
Browse files

Update exception thrown for consistency.

The PackageManagerInternal APIs for checking if the app is in a stopped
state or is quarantined throw an IllegalArgumentException when the
package is not found - however, this was not documented anywhere.

Instead, to be consistent with other PackageManager APIs, start throwing
a NameNotFoundException from the internal APIs and ensure the new
exception is caught from the public APIs and rethrown as
IllegalArgumentException.

This change updates the documentation as well, fixes a typo in a method
name, and also updates the logging level for when these exceptions occur.

Bug: 314863695
Test: builds/flashes/boots (mostly documentation changes)
Change-Id: Ia7b30ce4e16b5e40bd767cd15dbf2cd2728567dd
parent f045351b
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.os.SystemClock;
import android.os.UserHandle;
@@ -319,8 +320,8 @@ public final class BackgroundJobsController extends StateController {
            final boolean isStopped = mPackageManagerInternal.isPackageStopped(packageName, uid);
            mPackageStoppedState.add(uid, packageName, isStopped);
            return isStopped;
        } catch (IllegalArgumentException e) {
            Slog.d(TAG, "Couldn't determine stopped state for unknown package: " + packageName);
        } catch (PackageManager.NameNotFoundException e) {
            Slog.e(TAG, "Couldn't determine stopped state for unknown package: " + packageName);
            return false;
        }
    }
+8 −3
Original line number Diff line number Diff line
@@ -1418,14 +1418,19 @@ public abstract class PackageManagerInternal {

    /**
     * Checks if package is quarantined for a specific user.
     *
     * @throws PackageManager.NameNotFoundException if the package is not found
     */
    public abstract boolean isPackageQuarantined(@NonNull String packageName,
            @UserIdInt int userId);
    public abstract boolean isPackageQuarantined(@NonNull String packageName, @UserIdInt int userId)
            throws PackageManager.NameNotFoundException;

    /**
     * Checks if package is stopped for a specific user.
     *
     * @throws PackageManager.NameNotFoundException if the package is not found
     */
    public abstract boolean isPackageStopped(@NonNull String packageName, @UserIdInt int userId);
    public abstract boolean isPackageStopped(@NonNull String packageName, @UserIdInt int userId)
            throws PackageManager.NameNotFoundException;

    /**
     * Sends the PACKAGE_RESTARTED broadcast.
+2 −2
Original line number Diff line number Diff line
@@ -1294,8 +1294,8 @@ public class SyncManager {
        if (android.content.pm.Flags.stayStopped()) {
            try {
                return mPackageManagerInternal.isPackageStopped(packageName, userId);
            } catch (IllegalArgumentException e) {
                Log.d(TAG, "Couldn't determine stopped state for unknown package: " + packageName);
            } catch (NameNotFoundException e) {
                Log.e(TAG, "Couldn't determine stopped state for unknown package: " + packageName);
            }
        }
        return false;
+6 −3
Original line number Diff line number Diff line
@@ -508,12 +508,15 @@ public interface Computer extends PackageDataSnapshot {

    boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, @UserIdInt int userId);

    boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId);
    boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId)
            throws PackageManager.NameNotFoundException;

    boolean isPackageQuarantinedForUser(@NonNull String packageName, @UserIdInt int userId);
    boolean isPackageQuarantinedForUser(@NonNull String packageName, @UserIdInt int userId)
            throws PackageManager.NameNotFoundException;

    /** Check if the package is in a stopped state for a given user. */
    boolean isPackageStoppedForUser(@NonNull String packageName, @UserIdInt int userId);
    boolean isPackageStoppedForUser(@NonNull String packageName, @UserIdInt int userId)
            throws PackageManager.NameNotFoundException;

    boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, @UserIdInt int userId);

+12 −9
Original line number Diff line number Diff line
@@ -4978,31 +4978,34 @@ public class ComputerEngine implements Computer {
        }
    }

    private PackageUserStateInternal getUserStageOrDefaultForUser(@NonNull String packageName,
            int userId) {
    private PackageUserStateInternal getUserStateOrDefaultForUser(@NonNull String packageName,
            int userId) throws PackageManager.NameNotFoundException {
        final int callingUid = Binder.getCallingUid();
        enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
                false /* checkShell */, "when asking about packages for user " + userId);
        final PackageStateInternal ps = mSettings.getPackage(packageName);
        if (ps == null || shouldFilterApplicationIncludingUninstalled(ps, callingUid, userId)) {
            throw new IllegalArgumentException("Unknown target package: " + packageName);
            throw new PackageManager.NameNotFoundException(packageName);
        }
        return ps.getUserStateOrDefault(userId);
    }

    @Override
    public boolean isPackageSuspendedForUser(@NonNull String packageName, int userId) {
        return getUserStageOrDefaultForUser(packageName, userId).isSuspended();
    public boolean isPackageSuspendedForUser(@NonNull String packageName, int userId)
            throws PackageManager.NameNotFoundException {
        return getUserStateOrDefaultForUser(packageName, userId).isSuspended();
    }

    @Override
    public boolean isPackageQuarantinedForUser(@NonNull String packageName, @UserIdInt int userId) {
        return getUserStageOrDefaultForUser(packageName, userId).isQuarantined();
    public boolean isPackageQuarantinedForUser(@NonNull String packageName, @UserIdInt int userId)
            throws PackageManager.NameNotFoundException {
        return getUserStateOrDefaultForUser(packageName, userId).isQuarantined();
    }

    @Override
    public boolean isPackageStoppedForUser(@NonNull String packageName, @UserIdInt int userId) {
        return getUserStageOrDefaultForUser(packageName, userId).isStopped();
    public boolean isPackageStoppedForUser(@NonNull String packageName, @UserIdInt int userId)
            throws PackageManager.NameNotFoundException {
        return getUserStateOrDefaultForUser(packageName, userId).isStopped();
    }

    @Override
Loading