diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 17d306eb88570..b52e4b019f8fe 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -484,6 +484,7 @@ public interface WindowManagerPolicy {
public void switchInputMethod(boolean forwardDirection);
public void shutdown(boolean confirm);
+ public void reboot(boolean confirm);
public void rebootSafeMode(boolean confirm);
/**
diff --git a/core/res/res/drawable/ic_lock_power_off.xml b/core/res/res/drawable/ic_lock_power_off.xml
index 718f17ed0c196..babd1be220cb0 100644
--- a/core/res/res/drawable/ic_lock_power_off.xml
+++ b/core/res/res/drawable/ic_lock_power_off.xml
@@ -1,19 +1,25 @@
-
-
-
-
+
+
+
diff --git a/core/res/res/drawable/ic_restart.xml b/core/res/res/drawable/ic_restart.xml
new file mode 100644
index 0000000000000..47ac483fa3115
--- /dev/null
+++ b/core/res/res/drawable/ic_restart.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 2835c6f5fa0ad..1e9e51e79ce0d 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2071,9 +2071,11 @@
"bugreport" = Take bug report, if available
"silent" = silent mode
"users" = list of users
+ "restart" = restart device
-->
- power
+ - restart
- bugreport
- users
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 8d3cd487e644e..6c26165d4a3a8 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -482,6 +482,10 @@
Power off
+
+
+ @string/sim_restart_button
+
Bug report
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 2a40c0836ae55..63d2713c5df1a 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1589,6 +1589,7 @@
+
@@ -2680,4 +2681,7 @@
+
+
+
diff --git a/services/core/java/com/android/server/policy/GlobalActions.java b/services/core/java/com/android/server/policy/GlobalActions.java
index 6fc15f0216e4b..bb91f76ecf30a 100644
--- a/services/core/java/com/android/server/policy/GlobalActions.java
+++ b/services/core/java/com/android/server/policy/GlobalActions.java
@@ -103,6 +103,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac
private static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown";
private static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist";
private static final String GLOBAL_ACTION_KEY_ASSIST = "assist";
+ private static final String GLOBAL_ACTION_KEY_RESTART = "restart";
private final Context mContext;
private final WindowManagerFuncs mWindowManagerFuncs;
@@ -298,6 +299,8 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac
mItems.add(getVoiceAssistAction());
} else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) {
mItems.add(getAssistAction());
+ } else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) {
+ mItems.add(new RestartAction());
} else {
Log.e(TAG, "Invalid global action key " + actionKey);
}
@@ -369,6 +372,38 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac
}
}
+ private final class RestartAction extends SinglePressAction implements LongPressAction {
+ private RestartAction() {
+ super(R.drawable.ic_restart, R.string.global_action_restart);
+ }
+
+ @Override
+ public boolean onLongPress() {
+ UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ if (!um.hasUserRestriction(UserManager.DISALLOW_SAFE_BOOT)) {
+ mWindowManagerFuncs.rebootSafeMode(true);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return true;
+ }
+
+ @Override
+ public void onPress() {
+ mWindowManagerFuncs.reboot(false /* confirm */);
+ }
+ }
+
+
private class BugReportAction extends SinglePressAction implements LongPressAction {
public BugReportAction() {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index c66f09cd792e2..6fdfaa25e14e1 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -5721,6 +5721,12 @@ public class WindowManagerService extends IWindowManager.Stub
ShutdownThread.shutdown(mContext, PowerManager.SHUTDOWN_USER_REQUESTED, confirm);
}
+ // Called by window manager policy. Not exposed externally.
+ @Override
+ public void reboot(boolean confirm) {
+ ShutdownThread.reboot(mContext, PowerManager.SHUTDOWN_USER_REQUESTED, confirm);
+ }
+
// Called by window manager policy. Not exposed externally.
@Override
public void rebootSafeMode(boolean confirm) {