Merge "Add accessibility action to open power long-press dialog"
diff --git a/api/current.txt b/api/current.txt
index a40f08d..d55cac6 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2603,6 +2603,7 @@
     field public static final int GLOBAL_ACTION_BACK = 1; // 0x1
     field public static final int GLOBAL_ACTION_HOME = 2; // 0x2
     field public static final int GLOBAL_ACTION_NOTIFICATIONS = 4; // 0x4
+    field public static final int GLOBAL_ACTION_POWER_DIALOG = 6; // 0x6
     field public static final int GLOBAL_ACTION_QUICK_SETTINGS = 5; // 0x5
     field public static final int GLOBAL_ACTION_RECENTS = 3; // 0x3
     field public static final java.lang.String SERVICE_INTERFACE = "android.accessibilityservice.AccessibilityService";
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index cbc8150..19a91a6 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -353,6 +353,11 @@
      */
     public static final int GLOBAL_ACTION_QUICK_SETTINGS = 5;
 
+    /**
+     * Action to open the power long-press dialog.
+     */
+    public static final int GLOBAL_ACTION_POWER_DIALOG = 6;
+
     private static final String LOG_TAG = "AccessibilityService";
 
     /**
diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java
index bf5c84e..38e3723 100644
--- a/core/java/android/view/WindowManagerInternal.java
+++ b/core/java/android/view/WindowManagerInternal.java
@@ -164,6 +164,11 @@
     public abstract void getWindowFrame(IBinder token, Rect outBounds);
 
     /**
+     * Opens the global actions dialog.
+     */
+    public abstract void showGlobalActions();
+
+    /**
      * Invalidate all visible windows. Then report back on the callback once all windows have
      * redrawn.
      */
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index ee542a1..5f0fa18 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1162,6 +1162,12 @@
     public void showRecentApps();
 
     /**
+     * Show the global actions dialog.
+     * @hide
+     */
+    public void showGlobalActions();
+
+    /**
      * @return The current height of the input method window.
      */
     public int getInputMethodWindowVisibleHeightLw();
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 0b1252e..28f7a0f 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -527,6 +527,7 @@
     private static final int MSG_WINDOW_MANAGER_DRAWN_COMPLETE = 7;
     private static final int MSG_WAKING_UP = 8;
     private static final int MSG_DISPATCH_SHOW_RECENTS = 9;
+    private static final int MSG_DISPATCH_SHOW_GLOBAL_ACTIONS = 10;
 
     private class PolicyHandler extends Handler {
         @Override
@@ -547,6 +548,9 @@
                 case MSG_DISPATCH_SHOW_RECENTS:
                     showRecentApps(false);
                     break;
+                case MSG_DISPATCH_SHOW_GLOBAL_ACTIONS:
+                    showGlobalActionsInternal();
+                    break;
                 case MSG_KEYGUARD_DRAWN_COMPLETE:
                     if (DEBUG_WAKEUP) Slog.w(TAG, "Setting mKeyguardDrawComplete");
                     mKeyguardDrawComplete = true;
@@ -859,8 +863,7 @@
                 if (!performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false)) {
                     performAuditoryFeedbackForAccessibilityIfNeed();
                 }
-                sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
-                showGlobalActionsDialog();
+                showGlobalActionsInternal();
                 break;
             case LONG_PRESS_POWER_SHUT_OFF:
             case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:
@@ -880,7 +883,14 @@
         }
     };
 
-    void showGlobalActionsDialog() {
+    @Override
+    public void showGlobalActions() {
+        mHandler.removeMessages(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);
+        mHandler.sendEmptyMessage(MSG_DISPATCH_SHOW_GLOBAL_ACTIONS);
+    }
+
+    void showGlobalActionsInternal() {
+        sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
         if (mGlobalActions == null) {
             mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs);
         }
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 1be1572..ee7eb9f 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -2443,6 +2443,9 @@
                     case AccessibilityService.GLOBAL_ACTION_QUICK_SETTINGS: {
                         expandQuickSettings();
                     } return true;
+                    case AccessibilityService.GLOBAL_ACTION_POWER_DIALOG: {
+                        showGlobalActions();
+                    } return true;
                 }
                 return false;
             } finally {
@@ -2781,6 +2784,10 @@
             Binder.restoreCallingIdentity(token);
         }
 
+        private void showGlobalActions() {
+            mWindowManagerService.showGlobalActions();
+        }
+
         private IAccessibilityInteractionConnection getConnectionLocked(int windowId) {
             if (DEBUG) {
                 Slog.i(LOG_TAG, "Trying to get interaction connection to windowId: " + windowId);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 771b53b..396ec8f 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -5171,6 +5171,10 @@
         }
     }
 
+    void showGlobalActions() {
+        mPolicy.showGlobalActions();
+    }
+
     @Override
     public void closeSystemDialogs(String reason) {
         synchronized(mWindowMap) {
@@ -11130,7 +11134,12 @@
 
         @Override
         public boolean isKeyguardLocked() {
-            return isKeyguardLocked();
+            return WindowManagerService.this.isKeyguardLocked();
+        }
+
+        @Override
+        public void showGlobalActions() {
+            WindowManagerService.this.showGlobalActions();
         }
 
         @Override