add reboot() method to PowerManager
In order to unbundle System Update, we need some to expose in the SDK
some way to reboot the device into recovery. Add a reboot() method to
PowerManager, protected by the android.permission.REBOOT permission.
diff --git a/api/current.xml b/api/current.xml
index 3d4c492..bf6d64f 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -106250,6 +106250,19 @@
<parameter name="tag" type="java.lang.String">
</parameter>
</method>
+<method name="reboot"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="reason" type="java.lang.String">
+</parameter>
+</method>
<method name="userActivity"
return="void"
abstract="false"
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index b9dc860..0229864 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -32,6 +32,7 @@
void preventScreenOn(boolean prevent);
void setScreenBrightnessOverride(int brightness);
boolean isScreenOn();
+ void reboot(String reason);
// sets the brightness of the backlights (screen, keyboard, button) 0-255
void setBacklightBrightness(int brightness);
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 4b3b6f6..ffdb27c 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -465,6 +465,22 @@
}
}
+ /**
+ * Reboot the device. Will not return if the reboot is
+ * successful. Requires the {@link android.Manifest#REBOOT}
+ * permission.
+ *
+ * @param reason code to pass to the kernel (e.g., "recovery") to
+ * request special boot modes, or null.
+ */
+ public void reboot(String reason)
+ {
+ try {
+ mService.reboot(reason);
+ } catch (RemoteException e) {
+ }
+ }
+
private PowerManager()
{
}
@@ -488,4 +504,3 @@
IPowerManager mService;
Handler mHandler;
}
-
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 22716b8..8047436 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -943,7 +943,7 @@
<permission android:name="android.permission.DELETE_CACHE_FILES"
android:label="@string/permlab_deleteCacheFiles"
android:description="@string/permdesc_deleteCacheFiles"
- android:protectionLevel="signature" />
+ android:protectionLevel="signatureOrSystem" />
<!-- Allows an application to delete packages. -->
<permission android:name="android.permission.DELETE_PACKAGES"
@@ -981,7 +981,7 @@
<permission android:name="android.permission.REBOOT"
android:label="@string/permlab_reboot"
android:description="@string/permdesc_reboot"
- android:protectionLevel="signature" />
+ android:protectionLevel="signatureOrSystem" />
<!-- Allows low-level access to power management -->
<permission android:name="android.permission.DEVICE_POWER"
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 444c8de..0e22f86 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -59,6 +59,7 @@
import static android.provider.Settings.System.STAY_ON_WHILE_PLUGGED_IN;
import java.io.FileDescriptor;
+import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -2091,6 +2092,20 @@
}
/**
+ * Reboot the device immediately, passing 'reason' (may be null)
+ * to the underlying __reboot system call. Should not return.
+ */
+ public void reboot(String reason)
+ {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);
+ try {
+ Power.reboot(reason);
+ } catch (IOException e) {
+ Log.e(TAG, "reboot failed", e);
+ }
+ }
+
+ /**
* Returns the time the screen has been on since boot, in millis.
* @return screen on time
*/