diff options
author | Dianne Hackborn <hackbod@google.com> | 2012-04-20 17:49:10 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2012-04-20 17:50:26 -0700 |
commit | 19caadc08f09cc9f6665fbbb0d61e02861ce8562 (patch) | |
tree | e614ceb22d936fb11c155511ed7419efd516442e /core | |
parent | e1a996e99dc68b48efad989876c01ce05a7a58ac (diff) | |
download | frameworks_base-19caadc08f09cc9f6665fbbb0d61e02861ce8562.zip frameworks_base-19caadc08f09cc9f6665fbbb0d61e02861ce8562.tar.gz frameworks_base-19caadc08f09cc9f6665fbbb0d61e02861ce8562.tar.bz2 |
You can now long press on the power off menu to reboot to safe mode.
Change-Id: I3aa575285058cf5a3d89486d6b944f6ea13d645c
Diffstat (limited to 'core')
-rw-r--r-- | core/java/com/android/internal/app/ShutdownThread.java | 47 | ||||
-rw-r--r-- | core/res/res/values/public.xml | 2 | ||||
-rwxr-xr-x | core/res/res/values/strings.xml | 9 |
3 files changed, 53 insertions, 5 deletions
diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/core/java/com/android/internal/app/ShutdownThread.java index c03694f..d867ff9 100644 --- a/core/java/com/android/internal/app/ShutdownThread.java +++ b/core/java/com/android/internal/app/ShutdownThread.java @@ -64,11 +64,15 @@ public final class ShutdownThread extends Thread { private static boolean sIsStarted = false; private static boolean mReboot; + private static boolean mRebootSafeMode; private static String mRebootReason; // Provides shutdown assurance in case the system_server is killed public static final String SHUTDOWN_ACTION_PROPERTY = "sys.shutdown.requested"; + // Indicates whether we are rebooting into safe mode + public static final String REBOOT_SAFEMODE_PROPERTY = "persist.sys.safemode"; + // static instance of this thread private static final ShutdownThread sInstance = new ShutdownThread(); @@ -92,6 +96,12 @@ public final class ShutdownThread extends Thread { * @param confirm true if user confirmation is needed before shutting down. */ public static void shutdown(final Context context, boolean confirm) { + mReboot = false; + mRebootSafeMode = false; + shutdownInner(context, confirm); + } + + static void shutdownInner(final Context context, boolean confirm) { // ensure that only one thread is trying to power down. // any additional calls are just returned synchronized (sIsStartedGuard) { @@ -103,16 +113,20 @@ public final class ShutdownThread extends Thread { final int longPressBehavior = context.getResources().getInteger( com.android.internal.R.integer.config_longPressOnPowerBehavior); - final int resourceId = longPressBehavior == 2 - ? com.android.internal.R.string.shutdown_confirm_question - : com.android.internal.R.string.shutdown_confirm; + final int resourceId = mRebootSafeMode + ? com.android.internal.R.string.reboot_safemode_confirm + : (longPressBehavior == 2 + ? com.android.internal.R.string.shutdown_confirm_question + : com.android.internal.R.string.shutdown_confirm); Log.d(TAG, "Notifying thread to start shutdown longPressBehavior=" + longPressBehavior); if (confirm) { final CloseDialogReceiver closer = new CloseDialogReceiver(context); final AlertDialog dialog = new AlertDialog.Builder(context) - .setTitle(com.android.internal.R.string.power_off) + .setTitle(mRebootSafeMode + ? com.android.internal.R.string.reboot_safemode_title + : com.android.internal.R.string.power_off) .setMessage(resourceId) .setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { @@ -162,8 +176,23 @@ public final class ShutdownThread extends Thread { */ public static void reboot(final Context context, String reason, boolean confirm) { mReboot = true; + mRebootSafeMode = false; mRebootReason = reason; - shutdown(context, confirm); + shutdownInner(context, confirm); + } + + /** + * Request a reboot into safe mode. Must be called from a Looper thread in which its UI + * is shown. + * + * @param context Context used to display the shutdown progress dialog. + * @param confirm true if user confirmation is needed before shutting down. + */ + public static void rebootSafeMode(final Context context, boolean confirm) { + mReboot = true; + mRebootSafeMode = true; + mRebootReason = null; + shutdownInner(context, confirm); } private static void beginShutdownSequence(Context context) { @@ -254,6 +283,14 @@ public final class ShutdownThread extends Thread { SystemProperties.set(SHUTDOWN_ACTION_PROPERTY, reason); } + /* + * If we are rebooting into safe mode, write a system property + * indicating so. + */ + if (mRebootSafeMode) { + SystemProperties.set(REBOOT_SAFEMODE_PROPERTY, "1"); + } + Log.i(TAG, "Sending shutdown broadcast..."); // First send the high-level shut down broadcast. diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 57a4b29..505c3f9 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -708,6 +708,8 @@ <java-symbol type="string" name="preposition_for_time" /> <java-symbol type="string" name="progress_erasing" /> <java-symbol type="string" name="progress_unmounting" /> + <java-symbol type="string" name="reboot_safemode_confirm" /> + <java-symbol type="string" name="reboot_safemode_title" /> <java-symbol type="string" name="relationTypeAssistant" /> <java-symbol type="string" name="relationTypeBrother" /> <java-symbol type="string" name="relationTypeChild" /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 149a78c..f5cea9c 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -315,6 +315,15 @@ power off dialog instead of the global actions menu. --> <string name="shutdown_confirm_question">Do you want to shut down?</string> + <!-- Title of dialog to confirm rebooting into safe mode. [CHAR LIMIT=50] --> + <string name="reboot_safemode_title">Reboot to safe mode</string> + + <!-- Shutdown Confirmation Dialog. Message in the confirmation dialog + when the user asks to reboot into safe mode. [CHAR LIMIT=NONE] --> + <string name="reboot_safemode_confirm">Do you want to reboot into safe mode? + This will disable all third party applications you have installed. + They will be restored when you reboot again.</string> + <!-- Recent Tasks dialog: title TODO: this should move to SystemUI.apk, but the code for the old recent dialog is still in the framework |