Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ad88c9f authored by Andrew Lee's avatar Andrew Lee
Browse files

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
parent fd392f43
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -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">

        <!-- This row only ever shows either 4 or 5 buttons. This may depend on whether the device
             supports "Hold" (i.e. 4 buttons on CDMA devices, 5 buttons on GSM devices.) or whether
@@ -81,7 +82,7 @@
        <!-- MIDDLE LEFT SLOT ================================================================== -->

        <!-- "Mute" -->
        <ImageButton android:id="@+id/muteButton"
        <com.android.incallui.CallToggleButton android:id="@+id/muteButton"
            style="@style/InCallCompoundButton"
            android:background="@drawable/btn_compound_mute"
            android:contentDescription="@string/onscreenMuteText" />
@@ -89,7 +90,7 @@
        <!-- CENTER SLOT ======================================================================= -->

        <!-- "Dialpad" -->
        <ImageButton android:id="@+id/dialpadButton"
        <com.android.incallui.CallToggleButton android:id="@+id/dialpadButton"
            style="@style/InCallCompoundButton"
            android:background="@drawable/btn_compound_dialpad"
            android:contentDescription="@string/onscreenShowDialpadText" />
@@ -100,7 +101,7 @@
             other of these must always be set to GONE. -->

        <!-- "Hold" -->
        <ImageButton android:id="@+id/holdButton"
        <com.android.incallui.CallToggleButton android:id="@+id/holdButton"
            style="@style/InCallCompoundButton"
            android:background="@drawable/btn_compound_hold"
            android:contentDescription="@string/onscreenHoldText" />
@@ -120,7 +121,7 @@
            android:visibility="gone" />

        <!-- "Switch camera" for video calls. -->
        <ImageButton android:id="@+id/switchCameraButton"
        <com.android.incallui.CallToggleButton android:id="@+id/switchCameraButton"
            style="@style/InCallCompoundButton"
            android:background="@drawable/btn_compound_video_switch"
            android:contentDescription="@string/onscreenSwitchCameraText"
@@ -148,7 +149,7 @@
            android:visibility="gone" />

        <!-- "Switch camera" for video calls. -->
        <ImageButton android:id="@+id/pauseVideoButton"
        <com.android.incallui.CallToggleButton android:id="@+id/pauseVideoButton"
            style="@style/InCallCompoundButton"
            android:background="@drawable/btn_compound_video_off"
            android:contentDescription="@string/onscreenPauseVideoText"
+16 −21
Original line number Diff line number Diff line
@@ -50,18 +50,18 @@ import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
public class CallButtonFragment
        extends BaseFragment<CallButtonPresenter, CallButtonPresenter.CallButtonUi>
        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);
        }
    }

+54 −0
Original line number Diff line number Diff line
/*
 * 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);
    }
}