summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSvet Ganov <svetoslavganov@google.com>2015-07-10 00:32:11 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-07-10 00:32:12 +0000
commit171fe6ac0aa5b0d2dd64ac1cdda25cdcb5f183f3 (patch)
tree281e5fe4812eb30a91a1f5c6b1f754aaa66548fe
parent4ee9b23a6f1856bfe7fa810b585b4ced02745d65 (diff)
parentad3b2975574f916c14382628d50c710a78064746 (diff)
downloadframeworks_base-171fe6ac0aa5b0d2dd64ac1cdda25cdcb5f183f3.zip
frameworks_base-171fe6ac0aa5b0d2dd64ac1cdda25cdcb5f183f3.tar.gz
frameworks_base-171fe6ac0aa5b0d2dd64ac1cdda25cdcb5f183f3.tar.bz2
Merge "Add an API for apps to query if a permisison is denied by policy." into mnc-dev
-rw-r--r--api/current.txt2
-rw-r--r--api/system-current.txt2
-rw-r--r--core/java/android/app/ApplicationPackageManager.java9
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl2
-rw-r--r--core/java/android/content/pm/PackageManager.java17
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java22
-rw-r--r--test-runner/src/android/test/mock/MockPackageManager.java5
7 files changed, 58 insertions, 1 deletions
diff --git a/api/current.txt b/api/current.txt
index 0eeb68a..fe67aad 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -9256,6 +9256,7 @@ package android.content.pm {
method public abstract java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
method public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
method public abstract boolean hasSystemFeature(java.lang.String);
+ method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public abstract boolean isSafeMode();
method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
method public abstract java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
@@ -31806,6 +31807,7 @@ package android.test.mock {
method public java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
method public boolean hasSystemFeature(java.lang.String);
+ method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public boolean isSafeMode();
method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
method public java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
diff --git a/api/system-current.txt b/api/system-current.txt
index ef03bad..3570d42 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -9540,6 +9540,7 @@ package android.content.pm {
method public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
method public abstract boolean hasSystemFeature(java.lang.String);
+ method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public abstract boolean isSafeMode();
method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
method public abstract java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
@@ -34092,6 +34093,7 @@ package android.test.mock {
method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
method public void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
method public boolean hasSystemFeature(java.lang.String);
+ method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public boolean isSafeMode();
method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
method public java.util.List<android.content.pm.ProviderInfo> queryContentProviders(java.lang.String, int, int);
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index cb1e7aa..1fb0b2a 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -421,6 +421,15 @@ final class ApplicationPackageManager extends PackageManager {
}
@Override
+ public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
+ try {
+ return mPM.isPermissionRevokedByPolicy(permName, pkgName, mContext.getUserId());
+ } catch (RemoteException e) {
+ throw new RuntimeException("Package manager has died", e);
+ }
+ }
+
+ @Override
public boolean addPermission(PermissionInfo info) {
try {
return mPM.addPermission(info);
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 2b83d86..103ee29 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -506,4 +506,6 @@ interface IPackageManager {
int getMountExternalMode(int uid);
void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId);
+
+ boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId);
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 62c2e8c..6533bbc 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -2398,7 +2398,7 @@ public abstract class PackageManager {
* Check whether a particular package has been granted a particular
* permission.
*
- * @param permName The name of the permission you are checking for,
+ * @param permName The name of the permission you are checking for.
* @param pkgName The name of the package you are checking against.
*
* @return If the package has the permission, PERMISSION_GRANTED is
@@ -2412,6 +2412,21 @@ public abstract class PackageManager {
public abstract int checkPermission(String permName, String pkgName);
/**
+ * Checks whether a particular permissions has been revoked for a
+ * package by policy. Typically the device owner or the profile owner
+ * may apply such a policy. The user cannot grant policy revoked
+ * permissions, hence the only way for an app to get such a permission
+ * is by a policy change.
+ *
+ * @param permName The name of the permission you are checking for.
+ * @param pkgName The name of the package you are checking against.
+ *
+ * @return Whether the permission is restricted by policy.
+ */
+ @CheckResult
+ public abstract boolean isPermissionRevokedByPolicy(String permName, String pkgName);
+
+ /**
* Add a new dynamic permission to the system. For this to work, your
* package must have defined a permission tree through the
* {@link android.R.styleable#AndroidManifestPermissionTree
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f4bde25..5e37df3 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3154,6 +3154,28 @@ public class PackageManagerService extends IPackageManager.Stub {
return PackageManager.PERMISSION_DENIED;
}
+ @Override
+ public boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId) {
+ if (UserHandle.getCallingUserId() != userId) {
+ mContext.enforceCallingPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+ "isPermissionRevokedByPolicy for user " + userId);
+ }
+
+ if (checkPermission(permission, packageName, userId)
+ == PackageManager.PERMISSION_GRANTED) {
+ return false;
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ final int flags = getPermissionFlags(permission, packageName, userId);
+ return (flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
/**
* Checks if the request is from the system or an app that has INTERACT_ACROSS_USERS
* or INTERACT_ACROSS_USERS_FULL permissions, if the userid is not for the caller.
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index ac92dc0..3df7bbc 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -177,6 +177,11 @@ public class MockPackageManager extends PackageManager {
}
@Override
+ public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public boolean addPermission(PermissionInfo info) {
throw new UnsupportedOperationException();
}