diff options
author | Yorke Lee <yorkelee@google.com> | 2014-08-20 14:38:59 -0700 |
---|---|---|
committer | Yorke Lee <yorkelee@google.com> | 2014-08-20 16:49:54 -0700 |
commit | 3fb6af5fe7b4b287fe381f53a7d3c5225fb75c44 (patch) | |
tree | 2442584f48a813df8b769a527c1ad2351ffa133e | |
parent | a72a9116ae170239c5cc34dc1f46a4a165c1974b (diff) |
Add accessibility announcements for call state changes
* Add new accessibility-related strings
* Create and send accessibility events as necessary when a button's
state changes
Bug: 17147682
Bug: 17144849
Bug: 17161247
Change-Id: Ib1637993c644c4f159e850bdb9d54e0f00d3a68e
-rw-r--r-- | InCallUI/res/values/strings.xml | 24 | ||||
-rw-r--r-- | InCallUI/src/com/android/incallui/CallButtonFragment.java | 58 |
2 files changed, 76 insertions, 6 deletions
diff --git a/InCallUI/res/values/strings.xml b/InCallUI/res/values/strings.xml index 964286aa0..fc2ee20c8 100644 --- a/InCallUI/res/values/strings.xml +++ b/InCallUI/res/values/strings.xml @@ -486,12 +486,30 @@ --> <string name="description_delete_button">backspace</string> - <!-- Content description of the speakerphone enabled notification icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> - <string name="accessibility_speakerphone_enabled">Speakerphone enabled.</string> + <!-- String used by AccessibilityService to announce that the speakerphone has been selected for audio output [CHAR LIMIT=NONE]--> + <string name="accessibility_speakerphone_selected">Speakerphone selected</string> - <!-- Content description of the call muted notification icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> + <!-- String used by AccessibilityService to announce that the phone's earpiece has been selected for audio output [CHAR LIMIT=NONE]--> + <string name="accessibility_earpiece_selected">Earpiece selected</string> + + <!-- String used by AccessibilityService to announce that the wired headset has been selected for audio output [CHAR LIMIT=NONE]--> + <string name="accessibility_wired_headset_selected">Wired headset selected</string> + + <!-- String used by AccessibilityService to announce that the bluetooth headset has been selected for audio output [CHAR LIMIT=NONE]--> + <string name="accessibility_bluetooth_headset_selected">Bluetooth headset selected</string> + + <!-- String used by AccessibilityService to announce that the call has been muted [CHAR LIMIT=NONE]--> <string name="accessibility_call_muted">Call muted.</string> + <!-- String used by AccessibilityService to announce that the call has been unmuted [CHAR LIMIT=NONE]--> + <string name="accessibility_call_unmuted">Call unmuted.</string> + + <!-- String used by AccessibilityService to announce that the call has been put on hold [CHAR LIMIT=NONE]--> + <string name="accessibility_call_put_on_hold">Call put on hold.</string> + + <!-- String used by AccessibilityService to announce that the call has been removed from hold [CHAR LIMIT=NONE]--> + <string name="accessibility_call_removed_from_hold">Call removed from hold.</string> + <!-- Description of the answer target in the Slide unlock screen of Phone. [CHAR LIMIT=NONE] --> <string name="description_target_answer">Answer</string> <!-- Description of the send_sms target in the Slide unlock screen of Phone. [CHAR LIMIT=NONE] --> diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java index 9b141dac1..09a3bc292 100644 --- a/InCallUI/src/com/android/incallui/CallButtonFragment.java +++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java @@ -16,9 +16,9 @@ package com.android.incallui; +import android.content.Context; import android.graphics.drawable.LayerDrawable; import android.os.Bundle; - import android.telecomm.AudioState; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; @@ -26,6 +26,8 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; import android.widget.CompoundButton; import android.widget.ImageButton; import android.widget.PopupMenu; @@ -60,6 +62,8 @@ public class CallButtonFragment private View mManageConferenceButton; private View mGenericMergeButton; + private int mPrevAudioMode = 0; + // Constants for Drawable.setAlpha() private static final int HIDDEN = 0; private static final int VISIBLE = 255; @@ -224,7 +228,11 @@ public class CallButtonFragment @Override public void setMute(boolean value) { - mMuteButton.setSelected(value); + if (mMuteButton.isSelected() != value) { + mMuteButton.setSelected(value); + maybeSendAccessibilityEvent(mMuteButton, value ? R.string.accessibility_call_muted + : R.string.accessibility_call_unmuted); + } } @Override @@ -249,7 +257,12 @@ public class CallButtonFragment @Override public void setHold(boolean value) { - mHoldButton.setSelected(value); + if (mHoldButton.isSelected() != value) { + mHoldButton.setSelected(value); + maybeSendAccessibilityEvent(mHoldButton, + value ? R.string.accessibility_call_put_on_hold : + R.string.accessibility_call_removed_from_hold); + } } @Override @@ -372,6 +385,30 @@ public class CallButtonFragment public void setAudio(int mode) { updateAudioButtons(getPresenter().getSupportedAudio()); refreshAudioModePopup(); + + if (mPrevAudioMode != mode) { + if (mPrevAudioMode != 0) { + int stringId = 0; + switch (mode) { + case AudioState.ROUTE_EARPIECE: + stringId = R.string.accessibility_earpiece_selected; + break; + case AudioState.ROUTE_BLUETOOTH: + stringId = R.string.accessibility_bluetooth_headset_selected; + break; + case AudioState.ROUTE_WIRED_HEADSET: + stringId = R.string.accessibility_wired_headset_selected; + break; + case AudioState.ROUTE_SPEAKER: + stringId = R.string.accessibility_speakerphone_selected; + break; + } + if (stringId != 0) { + maybeSendAccessibilityEvent(mAudioButton, stringId); + } + } + mPrevAudioMode = mode; + } } @Override @@ -651,4 +688,19 @@ public class CallButtonFragment public void hideExtraRow() { mExtraRowButton.setVisibility(View.GONE); } + + private void maybeSendAccessibilityEvent(View view, int stringId) { + final Context context = getActivity(); + AccessibilityManager manager = + (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE); + if (manager != null && manager.isEnabled()) { + AccessibilityEvent e = AccessibilityEvent.obtain(); + e.setSource(view); + e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT); + e.setClassName(getClass().getName()); + e.setPackageName(context.getPackageName()); + e.getText().add(context.getResources().getString(stringId)); + manager.sendAccessibilityEvent(e); + } + } } |