diff options
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | api/test-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/app/admin/DevicePolicyManager.java | 17 | ||||
| -rw-r--r-- | core/java/android/app/admin/IDevicePolicyManager.aidl | 1 | ||||
| -rw-r--r-- | core/java/android/os/PowerManager.java | 7 | ||||
| -rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java | 23 |
7 files changed, 46 insertions, 5 deletions
diff --git a/api/current.txt b/api/current.txt index 39a3b1ef1c6b..1d680387307d 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5804,6 +5804,7 @@ package android.app.admin { method public boolean isProvisioningAllowed(java.lang.String); method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String); method public void lockNow(); + method public void reboot(android.content.ComponentName); method public void removeActiveAdmin(android.content.ComponentName); method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); diff --git a/api/system-current.txt b/api/system-current.txt index 9240d4f9411d..e11fdda1da01 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5937,6 +5937,7 @@ package android.app.admin { method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String); method public void lockNow(); method public void notifyPendingSystemUpdate(long); + method public void reboot(android.content.ComponentName); method public void removeActiveAdmin(android.content.ComponentName); method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); diff --git a/api/test-current.txt b/api/test-current.txt index e8d8748755ee..0567838ebce4 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -5804,6 +5804,7 @@ package android.app.admin { method public boolean isProvisioningAllowed(java.lang.String); method public boolean isUninstallBlocked(android.content.ComponentName, java.lang.String); method public void lockNow(); + method public void reboot(android.content.ComponentName); method public void removeActiveAdmin(android.content.ComponentName); method public boolean removeCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String); method public boolean removeKeyPair(android.content.ComponentName, java.lang.String); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 08b7d62963a4..b3c7cc5dc841 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -40,8 +40,8 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; -import android.provider.Settings; import android.provider.ContactsContract.Directory; +import android.provider.Settings; import android.security.Credentials; import android.service.restrictions.RestrictionsReceiver; import android.util.Log; @@ -56,14 +56,14 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; -import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.InvalidKeySpecException; -import java.security.NoSuchAlgorithmException; +import java.security.spec.PKCS8EncodedKeySpec; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -4679,4 +4679,15 @@ public class DevicePolicyManager { return null; } } + + /** + * Called by device owner to reboot the device. + */ + public void reboot(@NonNull ComponentName admin) { + try { + mService.reboot(admin); + } catch (RemoteException re) { + Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re); + } + } } diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 1708ee3c73e3..282f3f0c6682 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -238,4 +238,5 @@ interface IDevicePolicyManager { boolean isManagedProfile(in ComponentName admin); boolean isSystemOnlyUser(in ComponentName admin); String getWifiMacAddress(); + void reboot(in ComponentName admin); } diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index a0a006044751..126824f2c46a 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -389,6 +389,13 @@ public final class PowerManager { public static final String REBOOT_RECOVERY = "recovery"; /** + * The value to pass as the 'reason' argument to reboot() when device owner requests a reboot on + * the device. + * @hide + */ + public static final String REBOOT_REQUESTED_BY_DEVICE_OWNER = "deviceowner"; + + /** * The value to pass as the 'reason' argument to android_reboot(). * @hide */ diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index bdaf0aba5981..a1499393c7c3 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -16,8 +16,6 @@ package com.android.server.devicepolicy; -import com.google.android.collect.Sets; - import static android.Manifest.permission.MANAGE_CA_CERTIFICATES; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; import static android.app.admin.DevicePolicyManager.WIPE_EXTERNAL_STORAGE; @@ -28,6 +26,8 @@ import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.END_TAG; import static org.xmlpull.v1.XmlPullParser.TEXT; +import com.google.android.collect.Sets; + import android.Manifest.permission; import android.accessibilityservice.AccessibilityServiceInfo; import android.accounts.AccountManager; @@ -1162,6 +1162,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mContext.getSystemService(PowerManager.class).goToSleep(time, reason, flags); } + void powerManagerReboot(String reason) { + mContext.getSystemService(PowerManager.class).reboot(reason); + } + boolean systemPropertiesGetBoolean(String key, boolean def) { return SystemProperties.getBoolean(key, def); } @@ -6973,4 +6977,19 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return UserManager.isSplitSystemUser() && callingUserId == UserHandle.USER_SYSTEM; } + @Override + public void reboot(ComponentName admin) { + Preconditions.checkNotNull(admin); + // Make sure caller has DO. + synchronized (this) { + getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER); + } + long ident = mInjector.binderClearCallingIdentity(); + try { + mInjector.powerManagerReboot(PowerManager.REBOOT_REQUESTED_BY_DEVICE_OWNER); + } finally { + mInjector.binderRestoreCallingIdentity(ident); + } + } + } |