Allow ProfileOwner apps to manage app restrictions
Simple wrapper around the UserManager.{get|set}ApplicationRestrictions
APIs. Also added a new Intent to signal to running apps that the set
of restrictions has changed since startup.
Change-Id: Ifd108108a73f87325b499d9de2e1b2aacc59b264
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 725f808..db08a41 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -26,6 +26,7 @@
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Process;
import android.os.RemoteCallback;
@@ -1880,4 +1881,59 @@
}
}
}
+
+ /**
+ * Called by a profile or device owner to set the application restrictions for a given target
+ * application running in the managed profile.
+ *
+ * <p>The provided {@link Bundle} consists of key-value pairs, where the types of values may be
+ * {@link Boolean}, {@link String}, or {@link String}[]. The recommended format for key strings
+ * is "com.example.packagename/example-setting" to avoid naming conflicts with library
+ * components such as {@link android.webkit.WebView}.
+ *
+ * <p>The application restrictions are only made visible to the target application and the
+ * profile or device owner.
+ *
+ * <p>The calling device admin must be a profile or device owner; if it is not, a security
+ * exception will be thrown.
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @param packageName The name of the package to update restricted settings for.
+ * @param settings A {@link Bundle} to be parsed by the receiving application, conveying a new
+ * set of active restrictions.
+ */
+ public void setApplicationRestrictions(ComponentName admin, String packageName,
+ Bundle settings) {
+ if (mService != null) {
+ try {
+ mService.setApplicationRestrictions(admin, packageName, settings);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed talking with device policy service", e);
+ }
+ }
+ }
+
+ /**
+ * Called by a profile or device owner to get the application restrictions for a given target
+ * application running in the managed profile.
+ *
+ * <p>The calling device admin must be a profile or device owner; if it is not, a security
+ * exception will be thrown.
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @param packageName The name of the package to fetch restricted settings of.
+ * @return {@link Bundle} of settings corresponding to what was set last time
+ * {@link DevicePolicyManager#setApplicationRestrictions} was called, or an empty {@link Bundle}
+ * if no restrictions have been set.
+ */
+ public Bundle getApplicationRestrictions(ComponentName admin, String packageName) {
+ if (mService != null) {
+ try {
+ return mService.getApplicationRestrictions(admin, packageName);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed talking with device policy service", e);
+ }
+ }
+ return null;
+ }
}
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index e4b2adc..4ed85e9 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -19,6 +19,7 @@
import android.content.ComponentName;
import android.content.IntentFilter;
+import android.os.Bundle;
import android.os.RemoteCallback;
/**
@@ -114,4 +115,7 @@
void addPersistentPreferredActivity(in ComponentName admin, in IntentFilter filter, in ComponentName activity);
void clearPackagePersistentPreferredActivities(in ComponentName admin, String packageName);
+
+ void setApplicationRestrictions(in ComponentName who, in String packageName, in Bundle settings);
+ Bundle getApplicationRestrictions(in ComponentName who, in String packageName);
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index a7d5606..421956b 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2306,6 +2306,16 @@
= "android.intent.action.ADVANCED_SETTINGS";
/**
+ * Broadcast Action: Sent after application restrictions are changed.
+ *
+ * <p class="note">This is a protected intent that can only be sent
+ * by the system.</p>
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_APPLICATION_RESTRICTIONS_CHANGED =
+ "android.intent.action.APPLICATION_RESTRICTIONS_CHANGED";
+
+ /**
* Broadcast Action: An outgoing call is about to be placed.
*
* <p>The Intent will have the following extra value:</p>
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 606a4b1..b8fe0ff 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -239,6 +239,7 @@
<protected-broadcast android:name="android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE" />
<protected-broadcast android:name="android.intent.action.AIRPLANE_MODE" />
<protected-broadcast android:name="android.intent.action.ADVANCED_SETTINGS" />
+ <protected-broadcast android:name="android.intent.action.APPLICATION_RESTRICTIONS_CHANGED" />
<protected-broadcast android:name="android.intent.action.BUGREPORT_FINISHED" />
<protected-broadcast android:name="android.intent.action.ACTION_IDLE_MAINTENANCE_START" />