summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/system-current.txt1
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java23
-rw-r--r--core/java/android/app/admin/IDevicePolicyManager.aidl1
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java28
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java17
5 files changed, 61 insertions, 9 deletions
diff --git a/api/system-current.txt b/api/system-current.txt
index dc2143b2bcac..20051489cf3a 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5689,6 +5689,7 @@ package android.app.admin {
method public java.util.List<java.lang.String> getCrossProfileWidgetProviders(android.content.ComponentName);
method public int getCurrentFailedPasswordAttempts();
method public java.lang.String getDeviceInitializerApp();
+ method public android.content.ComponentName getDeviceInitializerComponent();
method public java.lang.String getDeviceOwner();
method public java.util.List<byte[]> getInstalledCaCerts(android.content.ComponentName);
method public int getKeyguardDisabledFeatures(android.content.ComponentName);
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index cbb0f51b68a3..e9175228bf5a 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -2639,8 +2639,8 @@ public class DevicePolicyManager {
* called by the device owner.
* @param initializer Which {@link DeviceAdminReceiver} to make device initializer.
* @param initializerName The user-visible name of the device initializer.
- * @return whether the package was successfully registered as the device initializer.
- * @throws IllegalArgumentException if the package name is null or invalid
+ * @return whether the component was successfully registered as the device initializer.
+ * @throws IllegalArgumentException if the componentname is null or invalid
* @throws IllegalStateException if the caller is not device owner or the device has
* already been provisioned or a device initializer already exists.
*/
@@ -2710,6 +2710,25 @@ public class DevicePolicyManager {
}
/**
+ * @hide
+ * Gets the device initializer component of the system.
+ *
+ * @return the component name of the device initializer.
+ */
+ @SystemApi
+ public ComponentName getDeviceInitializerComponent() {
+ if (mService != null) {
+ try {
+ return mService.getDeviceInitializerComponent();
+ } catch (RemoteException re) {
+ Log.w(TAG, "Failed to get device initializer");
+ }
+ }
+ return null;
+ }
+
+
+ /**
* Sets the enabled state of the user. A user should be enabled only once it is ready to
* be used.
*
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 73b06846ba60..c68311ea5359 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -210,6 +210,7 @@ interface IDevicePolicyManager {
void clearDeviceInitializer(in ComponentName who);
boolean setDeviceInitializer(in ComponentName who, in ComponentName initializer, String initializerName);
String getDeviceInitializer();
+ ComponentName getDeviceInitializerComponent();
void setUserIcon(in ComponentName admin, in Bitmap icon);
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java b/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java
index ea59d4b5a9d0..c7661838d8a9 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java
@@ -110,9 +110,9 @@ class DeviceOwner {
/**
* Creates an instance of the device owner object with the device initializer set.
*/
- static DeviceOwner createWithDeviceInitializer(String packageName, String ownerName) {
+ static DeviceOwner createWithDeviceInitializer(ComponentName admin, String ownerName) {
DeviceOwner owner = new DeviceOwner();
- owner.mDeviceInitializer = new OwnerInfo(ownerName, packageName);
+ owner.mDeviceInitializer = new OwnerInfo(ownerName, admin);
return owner;
}
@@ -141,6 +141,10 @@ class DeviceOwner {
mDeviceOwner = null;
}
+ ComponentName getDeviceInitializerComponent() {
+ return mDeviceInitializer.admin;
+ }
+
String getDeviceInitializerPackageName() {
return mDeviceInitializer != null ? mDeviceInitializer.packageName : null;
}
@@ -149,8 +153,8 @@ class DeviceOwner {
return mDeviceInitializer != null ? mDeviceInitializer.name : null;
}
- void setDeviceInitializer(String packageName, String ownerName) {
- mDeviceInitializer = new OwnerInfo(ownerName, packageName);
+ void setDeviceInitializer(ComponentName admin, String ownerName) {
+ mDeviceInitializer = new OwnerInfo(ownerName, admin);
}
void clearDeviceInitializer() {
@@ -235,7 +239,17 @@ class DeviceOwner {
} else if (tag.equals(TAG_DEVICE_INITIALIZER)) {
String name = parser.getAttributeValue(null, ATTR_NAME);
String packageName = parser.getAttributeValue(null, ATTR_PACKAGE);
- mDeviceInitializer = new OwnerInfo(name, packageName);
+ String initializerComponentStr =
+ parser.getAttributeValue(null, ATTR_COMPONENT_NAME);
+ ComponentName admin =
+ ComponentName.unflattenFromString(initializerComponentStr);
+ if (admin != null) {
+ mDeviceInitializer = new OwnerInfo(name, admin);
+ } else {
+ mDeviceInitializer = new OwnerInfo(name, packageName);
+ Slog.e(TAG, "Error parsing device-owner file. Bad component name " +
+ initializerComponentStr);
+ }
} else if (tag.equals(TAG_PROFILE_OWNER)) {
String profileOwnerPackageName = parser.getAttributeValue(null, ATTR_PACKAGE);
String profileOwnerName = parser.getAttributeValue(null, ATTR_NAME);
@@ -303,6 +317,10 @@ class DeviceOwner {
if (mDeviceInitializer.name != null) {
out.attribute(null, ATTR_NAME, mDeviceInitializer.name);
}
+ if (mDeviceInitializer.admin != null) {
+ out.attribute(
+ null, ATTR_COMPONENT_NAME, mDeviceInitializer.admin.flattenToString());
+ }
out.endTag(null, TAG_DEVICE_INITIALIZER);
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 0c58aefe499e..13f53c83fa5a 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -4007,12 +4007,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
if (mDeviceOwner == null) {
// Device owner state does not exist, create it.
mDeviceOwner = DeviceOwner.createWithDeviceInitializer(
- initializer.getPackageName(), ownerName);
+ initializer, ownerName);
mDeviceOwner.writeOwnerFile();
return true;
} else {
// Device owner already exists, update it.
- mDeviceOwner.setDeviceInitializer(initializer.getPackageName(), ownerName);
+ mDeviceOwner.setDeviceInitializer(initializer, ownerName);
mDeviceOwner.writeOwnerFile();
return true;
}
@@ -4058,6 +4058,19 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
}
@Override
+ public ComponentName getDeviceInitializerComponent() {
+ if (!mHasFeature) {
+ return null;
+ }
+ synchronized (this) {
+ if (mDeviceOwner != null && mDeviceOwner.hasDeviceInitializer()) {
+ return mDeviceOwner.getDeviceInitializerComponent();
+ }
+ }
+ return null;
+ }
+
+ @Override
public void clearDeviceInitializer(ComponentName who) {
if (!mHasFeature) {
return;