diff options
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; |