diff options
5 files changed, 48 insertions, 2 deletions
diff --git a/core/java/android/hardware/input/KeyGestureEvent.java b/core/java/android/hardware/input/KeyGestureEvent.java index af756b9217d3..47ef461dd53d 100644 --- a/core/java/android/hardware/input/KeyGestureEvent.java +++ b/core/java/android/hardware/input/KeyGestureEvent.java @@ -124,6 +124,7 @@ public final class KeyGestureEvent { public static final int KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION = 74; public static final int KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK = 75; public static final int KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW = 76; + public static final int KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB = 77; public static final int FLAG_CANCELLED = 1; @@ -215,7 +216,8 @@ public final class KeyGestureEvent { KEY_GESTURE_TYPE_MAGNIFIER_ZOOM_OUT, KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION, KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK, - KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW + KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW, + KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB }) @Retention(RetentionPolicy.SOURCE) public @interface KeyGestureType { @@ -788,6 +790,8 @@ public final class KeyGestureEvent { return "KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK"; case KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW: return "KEY_GESTURE_TYPE_MAXIMIZE_FREEFORM_WINDOW"; + case KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB: + return "KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB"; default: return Integer.toHexString(value); } diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java index 99c01ce5c15a..5f7ad2797368 100644 --- a/services/core/java/com/android/server/input/KeyGestureController.java +++ b/services/core/java/com/android/server/input/KeyGestureController.java @@ -801,7 +801,15 @@ final class KeyGestureController { + " interceptKeyBeforeQueueing"); return true; case KeyEvent.KEYCODE_DO_NOT_DISTURB: - // TODO(b/365920375): Implement 25Q2 keycode implementation in system + if (enableNew25q2Keycodes()) { + if (firstDown) { + handleKeyGesture(deviceId, new int[]{KeyEvent.KEYCODE_DO_NOT_DISTURB}, + /* modifierState = */0, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB, + KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId, focusedToken, + /* flags = */0, /* appLaunchData = */null); + } + } return true; } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a883f1ebc6fe..889b02d4afc6 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -4106,6 +4106,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyGestureEvent.KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT: case KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS: case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_APPLICATION: + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB: return true; case KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD: case KeyGestureEvent.KEY_GESTURE_TYPE_RINGER_TOGGLE_CHORD: @@ -4356,6 +4357,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { dismissKeyboardShortcutsMenu(); } return true; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB: + NotificationManager nm = getNotificationService(); + if (nm != null) { + boolean isEnabled = nm.getZenMode() != Settings.Global.ZEN_MODE_OFF; + nm.setZenMode(isEnabled ? Settings.Global.ZEN_MODE_OFF + : Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, + "Key gesture DND", true); + } + return true; } return false; } diff --git a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java index 864572331977..f322ee8f2b20 100644 --- a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java @@ -31,6 +31,7 @@ import android.os.RemoteException; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; +import android.provider.Settings; import android.view.KeyEvent; import androidx.test.filters.MediumTest; @@ -755,4 +756,19 @@ public class KeyGestureEventTests extends ShortcutKeyTestBase { sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK)); mPhoneWindowManager.assertTalkBack(false); } + + @Test + public void testKeyGestureToggleDoNotDisturb() { + mPhoneWindowManager.overrideZenMode(Settings.Global.ZEN_MODE_OFF); + Assert.assertTrue( + sendKeyGestureEventComplete( + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB)); + mPhoneWindowManager.assertZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); + + mPhoneWindowManager.overrideZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); + Assert.assertTrue( + sendKeyGestureEventComplete( + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_DO_NOT_DISTURB)); + mPhoneWindowManager.assertZenMode(Settings.Global.ZEN_MODE_OFF); + } } diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index 9db76d47fed7..5d30c76ec9f1 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -447,6 +447,14 @@ class TestPhoneWindowManager { mTestLooper.dispatchAll(); } + void overrideZenMode(int mode) { + doReturn(mode).when(mNotificationManager).getZenMode(); + } + + void assertZenMode(int mode) { + verify(mNotificationManager).setZenMode(eq(mode), any(), anyString(), eq(true)); + } + /** * Below functions will override the setting or the policy behavior. */ |