diff options
| author | Hai Zhang <zhanghai@google.com> | 2020-12-06 22:51:23 -0800 |
|---|---|---|
| committer | Hai Zhang <zhanghai@google.com> | 2020-12-10 16:19:05 -0800 |
| commit | 65404d6c66a744dbf1e3bdd92396e28cdceb7eef (patch) | |
| tree | 182a07881888d2e13578b12496d0f390111ceebd /core/java/android/app/ApplicationPackageManager.java | |
| parent | e7d707ceb0eb3d4c6bceed184580c1ab2406110a (diff) | |
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
Diffstat (limited to 'core/java/android/app/ApplicationPackageManager.java')
| -rw-r--r-- | core/java/android/app/ApplicationPackageManager.java | 284 |
1 files changed, 48 insertions, 236 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 3642d318e820..186d1fede5e0 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -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,66 +352,41 @@ 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); } - 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); } - 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); } - throw new NameNotFoundException(groupName); + return permissionInfos; } @Override @@ -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 { |
