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

Commit 65404d6c authored by Hai Zhang's avatar Hai Zhang
Browse files

Move permission methods in PackageManager to PermissionManager.

A number of permission-related methods were implemented in
ApplicationPackageManager by calling the IPermissionManager AIDL
interface. However since we are moving permission into module, the
AIDL inteface can't be an API and the implementions must be moved.

This change moves these methods into PermissionManager, with the
javadoc and interface from PackageManager and the implementation from
AppliationManager. The javadoc remains mostly the same except for
style and typo fixes. The API interface also remains the same except
for inclusive language changes since we are defining new one and have
a chance to fix them now.

We have to lazily get the PermissionManager instance because the
context passed in may be null for an instrumentation use case.

Bug: 158736025
Test: presubmit
Change-Id: I1c28433ca6200679a41e3518354fe03b866621b5
parent e7d707ce
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -6681,8 +6681,7 @@ public final class ActivityThread extends ClientTransactionHandler {
    private InstrumentationInfo prepareInstrumentation(AppBindData data) {
        final InstrumentationInfo ii;
        try {
            ii = new ApplicationPackageManager(
                    null, getPackageManager(), getPermissionManager())
            ii = new ApplicationPackageManager(null, getPackageManager())
                    .getInstrumentationInfo(data.instrumentationName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            throw new RuntimeException(
+48 −236
Original line number Diff line number Diff line
@@ -59,8 +59,6 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager.Property;
import android.content.pm.ParceledListSlice;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
@@ -95,8 +93,6 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
import android.permission.IOnPermissionsChangeListener;
import android.permission.IPermissionManager;
import android.permission.PermissionManager;
import android.provider.Settings;
import android.system.ErrnoException;
@@ -106,7 +102,6 @@ import android.system.StructStat;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.DebugUtils;
import android.util.LauncherIcons;
import android.util.Log;

@@ -129,7 +124,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

@@ -137,14 +131,6 @@ import java.util.Set;
public class ApplicationPackageManager extends PackageManager {
    private static final String TAG = "ApplicationPackageManager";
    private static final boolean DEBUG_ICONS = false;
    /**
     * Note: Changing this won't do anything on it's own - you should also change the filtering in
     * {@link #shouldTraceGrant}
     *
     * @hide
     */
    public static final boolean DEBUG_TRACE_GRANTS = false;
    public static final boolean DEBUG_TRACE_PERMISSION_UPDATES = false;

    private static final int DEFAULT_EPHEMERAL_COOKIE_MAX_SIZE_BYTES = 16384; // 16KB

@@ -171,6 +157,8 @@ public class ApplicationPackageManager extends PackageManager {
    @GuardedBy("mLock")
    private UserManager mUserManager;
    @GuardedBy("mLock")
    private PermissionManager mPermissionManager;
    @GuardedBy("mLock")
    private PackageInstaller mInstaller;
    @GuardedBy("mLock")
    private ArtManager mArtManager;
@@ -190,6 +178,15 @@ public class ApplicationPackageManager extends PackageManager {
        }
    }

    private PermissionManager getPermissionManager() {
        synchronized (mLock) {
            if (mPermissionManager == null) {
                mPermissionManager = mContext.getSystemService(PermissionManager.class);
            }
            return mPermissionManager;
        }
    }

    @Override
    public int getUserId() {
        return mContext.getUserId();
@@ -355,67 +352,42 @@ public class ApplicationPackageManager extends PackageManager {
    @Override
    @SuppressWarnings("unchecked")
    public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
        try {
            final ParceledListSlice<PermissionGroupInfo> parceledList =
                    mPermissionManager.getAllPermissionGroups(flags);
            if (parceledList == null) {
                return Collections.emptyList();
            }
            return parceledList.getList();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().getAllPermissionGroups(flags);
    }

    @Override
    public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags)
            throws NameNotFoundException {
        try {
            final PermissionGroupInfo pgi =
                    mPermissionManager.getPermissionGroupInfo(groupName, flags);
            if (pgi != null) {
                return pgi;
            }
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        final PermissionGroupInfo permissionGroupInfo = getPermissionManager()
                .getPermissionGroupInfo(groupName, flags);
        if (permissionGroupInfo == null) {
            throw new NameNotFoundException(groupName);
        }
        return permissionGroupInfo;
    }

    @Override
    public PermissionInfo getPermissionInfo(String permName, int flags)
            throws NameNotFoundException {
        try {
            final String packageName = mContext.getOpPackageName();
            final PermissionInfo pi =
                    mPermissionManager.getPermissionInfo(permName, packageName, flags);
            if (pi != null) {
                return pi;
            }
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        final PermissionInfo permissionInfo = getPermissionManager().getPermissionInfo(permName,
                flags);
        if (permissionInfo == null) {
            throw new NameNotFoundException(permName);
        }
        return permissionInfo;
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<PermissionInfo> queryPermissionsByGroup(String groupName, int flags)
            throws NameNotFoundException {
        try {
            final ParceledListSlice<PermissionInfo> parceledList =
                    mPermissionManager.queryPermissionsByGroup(groupName, flags);
            if (parceledList != null) {
                final List<PermissionInfo> pi = parceledList.getList();
                if (pi != null) {
                    return pi;
                }
            }
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        final List<PermissionInfo> permissionInfos = getPermissionManager().queryPermissionsByGroup(
                groupName, flags);
        if (permissionInfos == null) {
            throw new NameNotFoundException(groupName);
        }
        return permissionInfos;
    }

    @Override
    public boolean arePermissionsIndividuallyControlled() {
@@ -724,11 +696,7 @@ public class ApplicationPackageManager extends PackageManager {

    @Override
    public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
        try {
            return mPermissionManager.isPermissionRevokedByPolicy(permName, pkgName, getUserId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().isPermissionRevokedByPolicy(pkgName, permName);
    }

    /**
@@ -750,50 +718,23 @@ public class ApplicationPackageManager extends PackageManager {

    @Override
    public boolean addPermission(PermissionInfo info) {
        try {
            return mPermissionManager.addPermission(info, false);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().addPermission(info, false);
    }

    @Override
    public boolean addPermissionAsync(PermissionInfo info) {
        try {
            return mPermissionManager.addPermission(info, true);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().addPermission(info, true);
    }

    @Override
    public void removePermission(String name) {
        try {
            mPermissionManager.removePermission(name);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        getPermissionManager().removePermission(name);
    }

    @Override
    public void grantRuntimePermission(String packageName, String permissionName,
            UserHandle user) {
        if (DEBUG_TRACE_GRANTS
                && shouldTraceGrant(packageName, permissionName, user.getIdentifier())) {
            Log.i(TAG, "App " + mContext.getPackageName() + " is granting " + packageName + " "
                    + permissionName + " for user " + user.getIdentifier(), new RuntimeException());
        }
        try {
            mPM.grantRuntimePermission(packageName, permissionName, user.getIdentifier());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /** @hide */
    public static boolean shouldTraceGrant(String packageName, String permissionName, int userId) {
        // To be modified when debugging
        return false;
        getPermissionManager().grantRuntimePermission(packageName, permissionName, user);
    }

    @Override
@@ -804,124 +745,55 @@ public class ApplicationPackageManager extends PackageManager {
    @Override
    public void revokeRuntimePermission(String packageName, String permName, UserHandle user,
            String reason) {
        if (DEBUG_TRACE_PERMISSION_UPDATES
                && shouldTraceGrant(packageName, permName, user.getIdentifier())) {
            Log.i(TAG, "App " + mContext.getPackageName() + " is revoking " + packageName + " "
                    + permName + " for user " + user.getIdentifier() + " with reason " + reason,
                    new RuntimeException());
        }
        try {
            mPermissionManager
                    .revokeRuntimePermission(packageName, permName, user.getIdentifier(), reason);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        getPermissionManager().revokeRuntimePermission(packageName, permName, user, reason);
    }

    @Override
    public int getPermissionFlags(String permName, String packageName, UserHandle user) {
        try {
            return mPermissionManager
                    .getPermissionFlags(permName, packageName, user.getIdentifier());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().getPermissionFlags(packageName, permName, user);
    }

    @Override
    public void updatePermissionFlags(String permName, String packageName,
            int flagMask, int flagValues, UserHandle user) {
        if (DEBUG_TRACE_PERMISSION_UPDATES
                && shouldTraceGrant(packageName, permName, user.getIdentifier())) {
            Log.i(TAG, "App " + mContext.getPackageName() + " is updating flags for "
                    + packageName + " "
                    + permName + " for user " + user.getIdentifier() + ": "
                    + DebugUtils.flagsToString(PackageManager.class, "FLAG_PERMISSION_", flagMask)
                    + " := " + DebugUtils.flagsToString(
                            PackageManager.class, "FLAG_PERMISSION_", flagValues),
                    new RuntimeException());
        }
        try {
            final boolean checkAdjustPolicyFlagPermission =
                    mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q;
            mPermissionManager.updatePermissionFlags(permName, packageName, flagMask,
                    flagValues, checkAdjustPolicyFlagPermission, user.getIdentifier());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        getPermissionManager().updatePermissionFlags(packageName, permName, flagMask, flagValues,
                user);
    }

    @Override
    public @NonNull Set<String> getWhitelistedRestrictedPermissions(
            @NonNull String packageName, @PermissionWhitelistFlags int flags) {
        try {
            final int userId = getUserId();
            final List<String> whitelist = mPermissionManager
                    .getWhitelistedRestrictedPermissions(packageName, flags, userId);
            if (whitelist != null) {
                return new ArraySet<>(whitelist);
            }
            return Collections.emptySet();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().getAllowlistedRestrictedPermissions(packageName, flags);
    }

    @Override
    public boolean addWhitelistedRestrictedPermission(@NonNull String packageName,
            @NonNull String permName, @PermissionWhitelistFlags int flags) {
        try {
            final int userId = getUserId();
            return mPermissionManager
                    .addWhitelistedRestrictedPermission(packageName, permName, flags, userId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().addAllowlistedRestrictedPermission(packageName, permName,
                flags);
    }

    @Override
    public boolean setAutoRevokeWhitelisted(
            @NonNull String packageName, boolean whitelisted) {
        try {
            final int userId = getUserId();
            return mPermissionManager.setAutoRevokeWhitelisted(packageName, whitelisted, userId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    public boolean setAutoRevokeWhitelisted(@NonNull String packageName, boolean whitelisted) {
        return getPermissionManager().setAutoRevokeExempted(packageName, whitelisted);
    }

    @Override
    public boolean isAutoRevokeWhitelisted(@NonNull String packageName) {
        try {
            final int userId = getUserId();
            return mPermissionManager.isAutoRevokeWhitelisted(packageName, userId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().isAutoRevokeExempted(packageName);
    }

    @Override
    public boolean removeWhitelistedRestrictedPermission(@NonNull String packageName,
            @NonNull String permName, @PermissionWhitelistFlags int flags) {
        try {
            final int userId = getUserId();
            return mPermissionManager
                    .removeWhitelistedRestrictedPermission(packageName, permName, flags, userId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().removeAllowlistedRestrictedPermission(packageName, permName,
                flags);
    }

    @Override
    @UnsupportedAppUsage
    public boolean shouldShowRequestPermissionRationale(String permName) {
        try {
            final String packageName = mContext.getPackageName();
            return mPermissionManager
                    .shouldShowRequestPermissionRationale(permName, packageName, getUserId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return getPermissionManager().shouldShowRequestPermissionRationale(permName);
    }

    @Override
@@ -1880,34 +1752,12 @@ public class ApplicationPackageManager extends PackageManager {

    @Override
    public void addOnPermissionsChangeListener(OnPermissionsChangedListener listener) {
        synchronized (mPermissionListeners) {
            if (mPermissionListeners.get(listener) != null) {
                return;
            }
            OnPermissionsChangeListenerDelegate delegate =
                    new OnPermissionsChangeListenerDelegate(listener, Looper.getMainLooper());
            try {
                mPermissionManager.addOnPermissionsChangeListener(delegate);
                mPermissionListeners.put(listener, delegate);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
        getPermissionManager().addOnPermissionsChangeListener(listener);
    }

    @Override
    public void removeOnPermissionsChangeListener(OnPermissionsChangedListener listener) {
        synchronized (mPermissionListeners) {
            IOnPermissionsChangeListener delegate = mPermissionListeners.get(listener);
            if (delegate != null) {
                try {
                    mPermissionManager.removeOnPermissionsChangeListener(delegate);
                    mPermissionListeners.remove(listener);
                } catch (RemoteException e) {
                    throw e.rethrowFromSystemServer();
                }
            }
        }
        getPermissionManager().removeOnPermissionsChangeListener(listener);
    }

    @UnsupportedAppUsage
@@ -1918,11 +1768,9 @@ public class ApplicationPackageManager extends PackageManager {
        }
    }

    protected ApplicationPackageManager(ContextImpl context, IPackageManager pm,
            IPermissionManager permissionManager) {
    protected ApplicationPackageManager(ContextImpl context, IPackageManager pm) {
        mContext = context;
        mPM = pm;
        mPermissionManager = permissionManager;
    }

    /**
@@ -3234,7 +3082,6 @@ public class ApplicationPackageManager extends PackageManager {
    private final ContextImpl mContext;
    @UnsupportedAppUsage
    private final IPackageManager mPM;
    private final IPermissionManager mPermissionManager;

    /** Assume locked until we hear otherwise */
    private volatile boolean mUserUnlocked = false;
@@ -3245,41 +3092,6 @@ public class ApplicationPackageManager extends PackageManager {
    private static ArrayMap<ResourceName, WeakReference<CharSequence>> sStringCache
            = new ArrayMap<ResourceName, WeakReference<CharSequence>>();

    private final Map<OnPermissionsChangedListener, IOnPermissionsChangeListener>
            mPermissionListeners = new ArrayMap<>();

    public class OnPermissionsChangeListenerDelegate extends IOnPermissionsChangeListener.Stub
            implements Handler.Callback{
        private static final int MSG_PERMISSIONS_CHANGED = 1;

        private final OnPermissionsChangedListener mListener;
        private final Handler mHandler;


        public OnPermissionsChangeListenerDelegate(OnPermissionsChangedListener listener,
                Looper looper) {
            mListener = listener;
            mHandler = new Handler(looper, this);
        }

        @Override
        public void onPermissionsChanged(int uid) {
            mHandler.obtainMessage(MSG_PERMISSIONS_CHANGED, uid, 0).sendToTarget();
        }

        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_PERMISSIONS_CHANGED: {
                    final int uid = msg.arg1;
                    mListener.onPermissionsChanged(uid);
                    return true;
                }
            }
            return false;
        }
    }

    @Override
    public boolean canRequestPackageInstalls() {
        try {
+2 −4
Original line number Diff line number Diff line
@@ -72,7 +72,6 @@ import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
import android.permission.IPermissionManager;
import android.permission.PermissionManager;
import android.system.ErrnoException;
import android.system.Os;
@@ -370,10 +369,9 @@ class ContextImpl extends Context {
        }

        final IPackageManager pm = ActivityThread.getPackageManager();
        final IPermissionManager permissionManager = ActivityThread.getPermissionManager();
        if (pm != null && permissionManager != null) {
        if (pm != null) {
            // Doesn't matter if we make more than one instance.
            return (mPackageManager = new ApplicationPackageManager(this, pm, permissionManager));
            return (mPackageManager = new ApplicationPackageManager(this, pm));
        }

        return null;
+24 −3
Original line number Diff line number Diff line
@@ -4438,6 +4438,7 @@ public abstract class PackageManager {
     * @throws NameNotFoundException if a package with the given name cannot be
     *             found on the system.
     */
    //@Deprecated
    public abstract PermissionInfo getPermissionInfo(@NonNull String permName,
            @PermissionInfoFlags int flags) throws NameNotFoundException;

@@ -4450,9 +4451,10 @@ public abstract class PackageManager {
     * @param flags Additional option flags to modify the data returned.
     * @return Returns a list of {@link PermissionInfo} containing information
     *         about all of the permissions in the given group.
     * @throws NameNotFoundException if a package with the given name cannot be
     * @throws NameNotFoundException if a group with the given name cannot be
     *             found on the system.
     */
    //@Deprecated
    @NonNull
    public abstract List<PermissionInfo> queryPermissionsByGroup(@NonNull String permissionGroup,
            @PermissionInfoFlags int flags) throws NameNotFoundException;
@@ -4481,7 +4483,7 @@ public abstract class PackageManager {
     * Retrieve all of the information we know about a particular group of
     * permissions.
     *
     * @param permName The fully qualified name (i.e.
     * @param groupName The fully qualified name (i.e.
     *            com.google.permission_group.APPS) of the permission you are
     *            interested in.
     * @param flags Additional option flags to modify the data returned.
@@ -4490,8 +4492,9 @@ public abstract class PackageManager {
     * @throws NameNotFoundException if a package with the given name cannot be
     *             found on the system.
     */
    //@Deprecated
    @NonNull
    public abstract PermissionGroupInfo getPermissionGroupInfo(@NonNull String permName,
    public abstract PermissionGroupInfo getPermissionGroupInfo(@NonNull String groupName,
            @PermissionGroupInfoFlags int flags) throws NameNotFoundException;

    /**
@@ -4501,6 +4504,7 @@ public abstract class PackageManager {
     * @return Returns a list of {@link PermissionGroupInfo} containing
     *         information about all of the known permission groups.
     */
    //@Deprecated
    @NonNull
    public abstract List<PermissionGroupInfo> getAllPermissionGroups(
            @PermissionGroupInfoFlags int flags);
@@ -4757,6 +4761,7 @@ public abstract class PackageManager {
     * @return Whether the permission is restricted by policy.
     */
    @CheckResult
    //@Deprecated
    public abstract boolean isPermissionRevokedByPolicy(@NonNull String permName,
            @NonNull String packageName);

@@ -4805,6 +4810,7 @@ public abstract class PackageManager {
     *
     * @see #removePermission(String)
     */
    //@Deprecated
    public abstract boolean addPermission(@NonNull PermissionInfo info);

    /**
@@ -4814,6 +4820,7 @@ public abstract class PackageManager {
     * expense of no guarantee the added permission will be retained if
     * the device is rebooted before it is written.
     */
    //@Deprecated
    public abstract boolean addPermissionAsync(@NonNull PermissionInfo info);

    /**
@@ -4829,6 +4836,7 @@ public abstract class PackageManager {
     *
     * @see #addPermission(PermissionInfo)
     */
    //@Deprecated
    public abstract void removePermission(@NonNull String permName);

    /**
@@ -4881,6 +4889,7 @@ public abstract class PackageManager {
     *
     * @hide
     */
    //@Deprecated
    @SuppressWarnings("HiddenAbstractMethod")
    @SystemApi
    @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS)
@@ -4908,6 +4917,7 @@ public abstract class PackageManager {
     *
     * @hide
     */
    //@Deprecated
    @SuppressWarnings("HiddenAbstractMethod")
    @SystemApi
    @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
@@ -4936,6 +4946,7 @@ public abstract class PackageManager {
     *
     * @hide
     */
    //@Deprecated
    @SystemApi
    @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
    public void revokeRuntimePermission(@NonNull String packageName,
@@ -4953,6 +4964,7 @@ public abstract class PackageManager {
     *
     * @hide
     */
    //@Deprecated
    @SuppressWarnings("HiddenAbstractMethod")
    @SystemApi
    @RequiresPermission(anyOf = {
@@ -4976,6 +4988,7 @@ public abstract class PackageManager {
     *
     * @hide
     */
    //@Deprecated
    @SuppressWarnings("HiddenAbstractMethod")
    @SystemApi
    @RequiresPermission(anyOf = {
@@ -5040,6 +5053,7 @@ public abstract class PackageManager {
     *
     * @throws SecurityException if you try to access a whitelist that you have no access to.
     */
    //@Deprecated
    @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS,
            conditional = true)
    public @NonNull Set<String> getWhitelistedRestrictedPermissions(
@@ -5106,6 +5120,7 @@ public abstract class PackageManager {
     *
     * @throws SecurityException if you try to modify a whitelist that you have no access to.
     */
    //@Deprecated
    @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS,
            conditional = true)
    public boolean addWhitelistedRestrictedPermission(@NonNull String packageName,
@@ -5175,6 +5190,7 @@ public abstract class PackageManager {
     *
     * @throws SecurityException if you try to modify a whitelist that you have no access to.
     */
    //@Deprecated
    @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS,
        conditional = true)
    public boolean removeWhitelistedRestrictedPermission(@NonNull String packageName,
@@ -5207,6 +5223,7 @@ public abstract class PackageManager {
     *
     * @throws SecurityException if you you have no access to modify this.
     */
    //@Deprecated
    @RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS,
            conditional = true)
    public boolean setAutoRevokeWhitelisted(@NonNull String packageName, boolean whitelisted) {
@@ -5234,6 +5251,7 @@ public abstract class PackageManager {
     *
     * @throws SecurityException if you you have no access to this.
     */
    //@Deprecated
    @RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS,
            conditional = true)
    public boolean isAutoRevokeWhitelisted(@NonNull String packageName) {
@@ -5252,6 +5270,7 @@ public abstract class PackageManager {
     *
     * @hide
     */
    //@Deprecated
    @SuppressWarnings("HiddenAbstractMethod")
    @UnsupportedAppUsage
    public abstract boolean shouldShowRequestPermissionRationale(@NonNull String permName);
@@ -7554,6 +7573,7 @@ public abstract class PackageManager {
     *
     * @hide
     */
    //@Deprecated
    @SuppressWarnings("HiddenAbstractMethod")
    @SystemApi
    @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
@@ -7567,6 +7587,7 @@ public abstract class PackageManager {
     *
     * @hide
     */
    //@Deprecated
    @SuppressWarnings("HiddenAbstractMethod")
    @SystemApi
    @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
+706 −4

File changed.

Preview size limit exceeded, changes collapsed.

Loading