diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 9e188a6ae7f01..d577b2b6952cb 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -430,6 +430,7 @@ public FakeWindow addFakeWindow(Looper looper, public void shutdown(boolean confirm); public void rebootSafeMode(boolean confirm); public void reboot(); + public boolean isShutdownSequenceStarted(); /** * Return the window manager lock needed to correctly call "Lw" methods. diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 76cfb13670ac6..33d0f4d57b615 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -1023,18 +1023,26 @@ else if (FactoryTest.isLongPressOnPowerOffEnabled()) { break; case LONG_PRESS_POWER_GLOBAL_ACTIONS: mPowerKeyHandled = true; - if (!performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false)) { - performAuditoryFeedbackForAccessibilityIfNeed(); + if (mWindowManagerFuncs.isShutdownSequenceStarted()) { + sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); + } else { + if (!performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false)) { + performAuditoryFeedbackForAccessibilityIfNeed(); + } + sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); + showGlobalActionsDialog(); } - sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); - showGlobalActionsDialog(); break; case LONG_PRESS_POWER_SHUT_OFF: case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM: mPowerKeyHandled = true; - performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false); - sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); - mWindowManagerFuncs.shutdown(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF); + if (mWindowManagerFuncs.isShutdownSequenceStarted()) { + sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); + } else { + performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false); + sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); + mWindowManagerFuncs.shutdown(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF); + } break; } } diff --git a/services/java/com/android/server/power/ShutdownThread.java b/services/java/com/android/server/power/ShutdownThread.java index dc1a163875f5d..e0d7ebee685f4 100644 --- a/services/java/com/android/server/power/ShutdownThread.java +++ b/services/java/com/android/server/power/ShutdownThread.java @@ -15,7 +15,6 @@ * limitations under the License. */ - package com.android.server.power; import java.util.concurrent.atomic.AtomicBoolean; @@ -65,11 +64,11 @@ public final class ShutdownThread extends Thread { // length of vibration before shutting down private static final int SHUTDOWN_VIBRATE_MS = 500; - + // state tracking private static Object sIsStartedGuard = new Object(); private static boolean sIsStarted = false; - + private static boolean mReboot; private static boolean mRebootSafeMode; private static String mRebootReason; @@ -94,10 +93,16 @@ public final class ShutdownThread extends Thread { private Handler mHandler; private static AlertDialog sConfirmDialog; - + private ShutdownThread() { } - + + public static boolean isStarted() { + synchronized (sIsStartedGuard) { + return sIsStarted; + } + } + /** * Request a clean shutdown, waiting for subsystems to clean up their * state etc. Must be called from a Looper thread in which its UI @@ -358,14 +363,13 @@ public void run() { // Shutdown radios. shutdownRadios(MAX_RADIO_WAIT_TIME); Log.i(TAG, "Sending shutdown broadcast..."); - + // First send the high-level shut down broadcast. Intent intent = new Intent(Intent.ACTION_SHUTDOWN); intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); mContext.sendBroadcastAsUser(intent, UserHandle.ALL); - Log.i(TAG, "Shutting down activity manager..."); - + final IActivityManager am = ActivityManagerNative.asInterface(ServiceManager.checkService("activity")); if (am != null) { diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index dcbcb22dd782f..049a952123a29 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -5346,6 +5346,12 @@ public void rebootSafeMode(boolean confirm) { ShutdownThread.rebootSafeMode(getUiContext(), confirm); } + // Called by window manager policy. Not exposed externally. + @Override + public boolean isShutdownSequenceStarted() { + return ShutdownThread.isStarted(); + } + @Override public void setInputFilter(IInputFilter filter) { if (!checkCallingPermission(android.Manifest.permission.FILTER_EVENTS, "setInputFilter()")) {