From 62e54c2e3a174c7c4b371f27694afd50424031cf Mon Sep 17 00:00:00 2001 From: Zhen Sun Date: Thu, 17 Aug 2017 15:56:20 -0700 Subject: [PATCH] ATV a11y shortcut (CL 1 of 3): Update key chord Changed accessibility shortcut key chord from [HOME + DPAD_CENTER] to [BACK + DPAD_DOWN]. (Followed logic in ag/1939791.) Specified AudioAttributes of TV dialog ringtone to USAGE_ASSISTANCE_ACCESSIBILITY since this dialog is meant to show up for accessibility shortcut feature and that will also enable Android TVs to play ringtone for the warning dialog. Bug: 64346294 Test: Manually use key chord to trigger accessibility shortcut. Change-Id: Iacb29400079551a3c3ded6f8391b7541bc1c9f29 --- .../AccessibilityShortcutController.java | 12 ++++++- .../server/policy/PhoneWindowManager.java | 33 ++++++++----------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/services/core/java/com/android/server/policy/AccessibilityShortcutController.java b/services/core/java/com/android/server/policy/AccessibilityShortcutController.java index 0a8635d7210f0..55c582ed47b4b 100644 --- a/services/core/java/com/android/server/policy/AccessibilityShortcutController.java +++ b/services/core/java/com/android/server/policy/AccessibilityShortcutController.java @@ -24,6 +24,7 @@ import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; +import android.content.pm.PackageManager; import android.database.ContentObserver; import android.media.AudioAttributes; import android.media.Ringtone; @@ -138,13 +139,18 @@ public class AccessibilityShortcutController { final int userId = ActivityManager.getCurrentUser(); final int dialogAlreadyShown = Settings.Secure.getIntForUser( cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 0, userId); + // Use USAGE_ASSISTANCE_ACCESSIBILITY for TVs to ensure that TVs play the ringtone as they + // have less ways of providing feedback like vibration. + final int audioAttributesUsage = hasFeatureLeanback() + ? AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY + : AudioAttributes.USAGE_NOTIFICATION_EVENT; // Play a notification tone final Ringtone tone = RingtoneManager.getRingtone(mContext, Settings.System.DEFAULT_NOTIFICATION_URI); if (tone != null) { tone.setAudioAttributes(new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_NOTIFICATION_EVENT) + .setUsage(audioAttributesUsage) .build()); tone.play(); } @@ -254,6 +260,10 @@ public class AccessibilityShortcutController { AccessibilityServiceInfo.FEEDBACK_ALL_MASK).contains(serviceInfo); } + private boolean hasFeatureLeanback() { + return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK); + } + // Class to allow mocking of static framework calls public static class FrameworkObjectProvider { public AccessibilityManager getAccessibilityManagerInstance(Context context) { diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 4c2e4692a34f0..638523a5b34d3 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3398,11 +3398,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (!down) { cancelPreloadRecentApps(); - if (mHasFeatureLeanback) { - // Clear flags - mAccessibilityTvKey2Pressed = down; - } - mHomePressed = false; if (mHomeConsumed) { mHomeConsumed = false; @@ -3457,13 +3452,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { preloadRecentApps(); } } else if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) { - if (mHasFeatureLeanback) { - mAccessibilityTvKey2Pressed = down; - if (interceptAccessibilityGestureTv()) { - return -1; - } - } - if (!keyguardOn) { handleLongPressOnHome(event.getDeviceId()); } @@ -3630,11 +3618,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { return 0; } else if (mHasFeatureLeanback && interceptBugreportGestureTv(keyCode, down)) { return -1; - } else if (mHasFeatureLeanback && keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { - mAccessibilityTvKey1Pressed = down; - if (interceptAccessibilityGestureTv()) { - return -1; - } + } else if (mHasFeatureLeanback && interceptAccessibilityGestureTv(keyCode, down)) { + return -1; } // Toggle Caps Lock on META-ALT. @@ -3855,20 +3840,28 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** * TV only: recognizes a remote control gesture as Accessibility shortcut. - * Shortcut: Long press (HOME + DPAD_CENTER) + * Shortcut: Long press (BACK + DPAD_DOWN) */ - private boolean interceptAccessibilityGestureTv() { + private boolean interceptAccessibilityGestureTv(int keyCode, boolean down) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + mAccessibilityTvKey1Pressed = down; + } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { + mAccessibilityTvKey2Pressed = down; + } + if (mAccessibilityTvKey1Pressed && mAccessibilityTvKey2Pressed) { if (!mAccessibilityTvScheduled) { mAccessibilityTvScheduled = true; Message msg = Message.obtain(mHandler, MSG_ACCESSIBILITY_TV); msg.setAsynchronous(true); - mHandler.sendMessage(msg); + mHandler.sendMessageDelayed(msg, + ViewConfiguration.get(mContext).getAccessibilityShortcutKeyTimeout()); } } else if (mAccessibilityTvScheduled) { mHandler.removeMessages(MSG_ACCESSIBILITY_TV); mAccessibilityTvScheduled = false; } + return mAccessibilityTvScheduled; }