From f9a651d64c687297c0739982bedc7a8a34c778cf Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Wed, 11 Oct 2017 12:06:27 -0700 Subject: Global a11y action to lock screen Fixes: 25567237 Test: ensure API works using TestBack Change-Id: I335fd6b44d2c67b53a2c1f6224d16bd798276c8b --- api/current.txt | 1 + api/system-current.txt | 1 + api/test-current.txt | 1 + .../android/accessibilityservice/AccessibilityService.java | 5 +++++ core/java/android/os/PowerManager.java | 6 ++++++ core/java/android/view/WindowManagerInternal.java | 5 +++++ .../server/accessibility/GlobalActionPerformer.java | 14 ++++++++++++++ .../java/com/android/server/power/PowerManagerService.java | 4 ++++ .../java/com/android/server/wm/WindowManagerService.java | 5 +++++ 9 files changed, 42 insertions(+) diff --git a/api/current.txt b/api/current.txt index 06163ccee9d6..050076912fb8 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2777,6 +2777,7 @@ package android.accessibilityservice { field public static final int GESTURE_SWIPE_UP_AND_RIGHT = 14; // 0xe 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_LOCK_SCREEN = 8; // 0x8 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 diff --git a/api/system-current.txt b/api/system-current.txt index 808f222b62b7..4c322b2c665a 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -2919,6 +2919,7 @@ package android.accessibilityservice { field public static final int GESTURE_SWIPE_UP_AND_RIGHT = 14; // 0xe 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_LOCK_SCREEN = 8; // 0x8 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 diff --git a/api/test-current.txt b/api/test-current.txt index da59056d50ec..dd2d886446f1 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2777,6 +2777,7 @@ package android.accessibilityservice { field public static final int GESTURE_SWIPE_UP_AND_RIGHT = 14; // 0xe 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_LOCK_SCREEN = 8; // 0x8 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 diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index a558d6850af1..8824643db447 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -358,6 +358,11 @@ public abstract class AccessibilityService extends Service { */ public static final int GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN = 7; + /** + * Action to lock the screen + */ + public static final int GLOBAL_ACTION_LOCK_SCREEN = 8; + private static final String LOG_TAG = "AccessibilityService"; /** diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 0fce7a454717..5dd8d05cfb98 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -386,6 +386,12 @@ public final class PowerManager { */ public static final int GO_TO_SLEEP_REASON_SLEEP_BUTTON = 6; + /** + * Go to sleep reason code: Going to sleep by request of an accessibility service + * @hide + */ + public static final int GO_TO_SLEEP_REASON_ACCESSIBILITY = 7; + /** * Go to sleep flag: Skip dozing state and directly go to full sleep. * @hide diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java index cd1b1908e4d8..d07b2ac980eb 100644 --- a/core/java/android/view/WindowManagerInternal.java +++ b/core/java/android/view/WindowManagerInternal.java @@ -381,4 +381,9 @@ public abstract class WindowManagerInternal { * Sets callback to DragDropController. */ public abstract void registerDragDropControllerCallback(IDragDropCallback callback); + + /** + * @see android.view.IWindowManager#lockNow + */ + public abstract void lockNow(); } diff --git a/services/accessibility/java/com/android/server/accessibility/GlobalActionPerformer.java b/services/accessibility/java/com/android/server/accessibility/GlobalActionPerformer.java index 5db6f7da8102..5867006d6c18 100644 --- a/services/accessibility/java/com/android/server/accessibility/GlobalActionPerformer.java +++ b/services/accessibility/java/com/android/server/accessibility/GlobalActionPerformer.java @@ -21,7 +21,11 @@ import android.app.StatusBarManager; import android.content.Context; import android.hardware.input.InputManager; import android.os.Binder; +import android.os.PowerManager; +import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemClock; +import android.view.IWindowManager; import android.view.InputDevice; import android.view.KeyCharacterMap; import android.view.KeyEvent; @@ -72,6 +76,9 @@ public class GlobalActionPerformer { case AccessibilityService.GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN: { return toggleSplitScreen(); } + case AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN: { + return lockScreen(); + } } return false; } finally { @@ -153,4 +160,11 @@ public class GlobalActionPerformer { } return true; } + + private boolean lockScreen() { + mContext.getSystemService(PowerManager.class).goToSleep(SystemClock.uptimeMillis(), + PowerManager.GO_TO_SLEEP_REASON_ACCESSIBILITY, 0); + mWindowManagerService.lockNow(); + return true; + } } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index a47b8095dae7..8898dab4cdfa 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -1457,6 +1457,10 @@ public final class PowerManagerService extends SystemService case PowerManager.GO_TO_SLEEP_REASON_HDMI: Slog.i(TAG, "Going to sleep due to HDMI standby (uid " + uid +")..."); break; + case PowerManager.GO_TO_SLEEP_REASON_ACCESSIBILITY: + Slog.i(TAG, "Going to sleep by an accessibility service request (uid " + + uid +")..."); + break; default: Slog.i(TAG, "Going to sleep by application request (uid " + uid +")..."); reason = PowerManager.GO_TO_SLEEP_REASON_APPLICATION; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ce3430615df6..2d81f7e0ffac 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7456,6 +7456,11 @@ public class WindowManagerService extends IWindowManager.Stub public void registerDragDropControllerCallback(IDragDropCallback callback) { mDragDropController.registerCallback(callback); } + + @Override + public void lockNow() { + WindowManagerService.this.lockNow(null); + } } void registerAppFreezeListener(AppFreezeListener listener) { -- cgit v1.2.3-59-g8ed1b