From 2759ccbab2a37043123171425e211372ec452465 Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Mon, 5 Jan 2015 16:50:47 -0800 Subject: Read enabled/disabled state for InCall buttons. + Add CallToggleButton which ignores the content description so that we can substitue our own strings to be read by Talkback when the user clicks on buttons. + Convert ImageButtons with two states into ToggleButtons, so that when focused Talkback automatically reads out their states. For example, now it will read "Mute switch is (not) checked". This required updating some casts and references in the fragment. + Set baselineAligned property for call buttons to false. Because ToggleButtons could have text, it was attempting to align by text baselines which messed with the layout. - Remove a compound button listener which is not used. Bug: 18783204 Change-Id: I0b23f5f63a2bf7c34a34077a75a23ea92dc45bbc --- res/layout/call_button_fragment.xml | 13 +++--- src/com/android/incallui/CallButtonFragment.java | 37 +++++++--------- src/com/android/incallui/CallToggleButton.java | 54 ++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 27 deletions(-) create mode 100644 src/com/android/incallui/CallToggleButton.java diff --git a/res/layout/call_button_fragment.xml b/res/layout/call_button_fragment.xml index 56d65b07..2ca64036 100644 --- a/res/layout/call_button_fragment.xml +++ b/res/layout/call_button_fragment.xml @@ -47,7 +47,8 @@ android:layout_height="wrap_content" android:paddingStart="@dimen/button_cluster_horizontal_padding" android:paddingEnd="@dimen/button_cluster_horizontal_padding" - android:gravity="bottom|center_horizontal"> + android:gravity="bottom|center_horizontal" + android:baselineAligned="false"> - @@ -89,7 +90,7 @@ - @@ -100,7 +101,7 @@ other of these must always be set to GONE. --> - @@ -120,7 +121,7 @@ android:visibility="gone" /> - - implements CallButtonPresenter.CallButtonUi, OnMenuItemClickListener, OnDismissListener, - View.OnClickListener, CompoundButton.OnCheckedChangeListener { + View.OnClickListener { private ImageButton mAudioButton; private ImageButton mChangeToVoiceButton; - private ImageButton mMuteButton; - private ImageButton mShowDialpadButton; - private ImageButton mHoldButton; + private CompoundButton mMuteButton; + private CompoundButton mShowDialpadButton; + private CompoundButton mHoldButton; private ImageButton mSwapButton; private ImageButton mChangeToVideoButton; - private ImageButton mSwitchCameraButton; + private CompoundButton mSwitchCameraButton; private ImageButton mAddCallButton; private ImageButton mMergeButton; - private ImageButton mPauseVideoButton; + private CompoundButton mPauseVideoButton; private ImageButton mOverflowButton; private PopupMenu mAudioModePopup; @@ -102,23 +102,23 @@ public class CallButtonFragment mAudioButton.setOnClickListener(this); mChangeToVoiceButton = (ImageButton) parent.findViewById(R.id.changeToVoiceButton); mChangeToVoiceButton. setOnClickListener(this); - mMuteButton = (ImageButton) parent.findViewById(R.id.muteButton); + mMuteButton = (CompoundButton) parent.findViewById(R.id.muteButton); mMuteButton.setOnClickListener(this); - mShowDialpadButton = (ImageButton) parent.findViewById(R.id.dialpadButton); + mShowDialpadButton = (CompoundButton) parent.findViewById(R.id.dialpadButton); mShowDialpadButton.setOnClickListener(this); - mHoldButton = (ImageButton) parent.findViewById(R.id.holdButton); + mHoldButton = (CompoundButton) parent.findViewById(R.id.holdButton); mHoldButton.setOnClickListener(this); mSwapButton = (ImageButton) parent.findViewById(R.id.swapButton); mSwapButton.setOnClickListener(this); mChangeToVideoButton = (ImageButton) parent.findViewById(R.id.changeToVideoButton); mChangeToVideoButton.setOnClickListener(this); - mSwitchCameraButton = (ImageButton) parent.findViewById(R.id.switchCameraButton); + mSwitchCameraButton = (CompoundButton) parent.findViewById(R.id.switchCameraButton); mSwitchCameraButton.setOnClickListener(this); mAddCallButton = (ImageButton) parent.findViewById(R.id.addButton); mAddCallButton.setOnClickListener(this); mMergeButton = (ImageButton) parent.findViewById(R.id.mergeButton); mMergeButton.setOnClickListener(this); - mPauseVideoButton = (ImageButton) parent.findViewById(R.id.pauseVideoButton); + mPauseVideoButton = (CompoundButton) parent.findViewById(R.id.pauseVideoButton); mPauseVideoButton.setOnClickListener(this); mOverflowButton = (ImageButton) parent.findViewById(R.id.overflowButton); mOverflowButton.setOnClickListener(this); @@ -144,10 +144,6 @@ public class CallButtonFragment updateColors(); } - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - } - @Override public void onClick(View view) { int id = view.getId(); @@ -165,8 +161,7 @@ public class CallButtonFragment getPresenter().changeToVoiceClicked(); break; case R.id.muteButton: { - final ImageButton button = (ImageButton) view; - getPresenter().muteClicked(!button.isSelected()); + getPresenter().muteClicked(!mMuteButton.isSelected()); break; } case R.id.mergeButton: @@ -174,8 +169,7 @@ public class CallButtonFragment mMergeButton.setEnabled(false); break; case R.id.holdButton: { - final ImageButton button = (ImageButton) view; - getPresenter().holdClicked(!button.isSelected()); + getPresenter().holdClicked(!mHoldButton.isSelected()); break; } case R.id.swapButton: @@ -219,7 +213,7 @@ public class CallButtonFragment } Resources res = getActivity().getResources(); - ImageButton[] compoundButtons = { + View[] compoundButtons = { mAudioButton, mMuteButton, mShowDialpadButton, @@ -228,7 +222,7 @@ public class CallButtonFragment mPauseVideoButton }; - for (ImageButton button : compoundButtons) { + for (View button : compoundButtons) { final LayerDrawable layers = (LayerDrawable) button.getBackground(); final RippleDrawable btnCompoundDrawable = compoundBackgroundDrawable(themeColors); layers.setDrawableByLayerId(R.id.compoundBackgroundItem, btnCompoundDrawable); @@ -770,6 +764,7 @@ public class CallButtonFragment mShowDialpadButton.setSelected(value); if (getActivity() != null && getActivity() instanceof InCallActivity) { ((InCallActivity) getActivity()).displayDialpad(value, animate); + maybeSendAccessibilityEvent(mShowDialpadButton, R.string.onscreenShowDialpadText); } } diff --git a/src/com/android/incallui/CallToggleButton.java b/src/com/android/incallui/CallToggleButton.java new file mode 100644 index 00000000..72c1d593 --- /dev/null +++ b/src/com/android/incallui/CallToggleButton.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.incallui; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.accessibility.AccessibilityEvent; +import android.widget.ToggleButton; + +public class CallToggleButton extends ToggleButton { + private static final String EMPTY_STRING = ""; + + public CallToggleButton(Context context) { + this(context, null); + } + + public CallToggleButton(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CallToggleButton(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public CallToggleButton(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + /** + * Ignore the content description so it is not read by Talkback. When clicked, we expect + * {@link CallButtonFragment#maybeSendAccessibilityEvent} to dispatch an accessibility event + * with the text for Talkback to read. + */ + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setContentDescription(EMPTY_STRING); + } +} -- cgit v1.2.3