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

Commit cf1202db authored by Jason Hsu's avatar Jason Hsu Committed by Android (Google) Code Review
Browse files

Merge "[HA Status] Show the connection status drawable for hearing device in...

Merge "[HA Status] Show the connection status drawable for hearing device in floating menu (2/n)" into main
parents 525bb766 78091f01
Loading
Loading
Loading
Loading
+50 −6
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.when;
import android.content.ComponentName;
import android.graphics.drawable.Drawable;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
import android.view.LayoutInflater;
import android.view.View;

@@ -51,34 +52,35 @@ import java.util.List;
/** Tests for {@link AccessibilityTargetAdapter}. */
@SmallTest
@RunWith(AndroidJUnit4.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
public class AccessibilityTargetAdapterTest extends SysuiTestCase {
    @Rule
    public final MockitoRule mMockitoRule = MockitoJUnit.rule();

    private static final ComponentName TEST_NAME = new ComponentName("test.pkg", "test.activitty");
    private static final int PAYLOAD_HEARING_STATUS_DRAWABLE = 1;

    @Mock
    private AccessibilityTarget mAccessibilityTarget;
    @Mock
    private Drawable mIcon;
    @Mock
    private Drawable.ConstantState mConstantState;
    private static final int PAYLOAD_HEARING_STATUS_DRAWABLE = 1;

    private ViewHolder mViewHolder;
    private AccessibilityTargetAdapter mAdapter;
    private final List<AccessibilityTarget> mTargets = new ArrayList<>();
    private static final ComponentName TEST_NAME = new ComponentName("test.pkg", "test.activitty");

    @Before
    public void setUp() {
        mTargets.add(mAccessibilityTarget);
        mAdapter = new AccessibilityTargetAdapter(mTargets);

        final View rootView = LayoutInflater.from(mContext).inflate(
                R.layout.accessibility_floating_menu_item, null);
        mViewHolder = new ViewHolder(rootView);
        when(mAccessibilityTarget.getIcon()).thenReturn(mIcon);
        when(mAccessibilityTarget.getId()).thenReturn(TEST_NAME.flattenToString());
        when(mIcon.getConstantState()).thenReturn(mConstantState);

        mTargets.add(mAccessibilityTarget);
        mAdapter = new AccessibilityTargetAdapter(mTargets);
    }

    @Test
@@ -145,4 +147,46 @@ public class AccessibilityTargetAdapterTest extends SysuiTestCase {
        assertThat(mViewHolder.itemView.getStateDescription().toString().contentEquals(
                "Disconnected")).isTrue();
    }

    @Test
    @EnableFlags(
            com.android.settingslib.flags.Flags.FLAG_HEARING_DEVICE_SET_CONNECTION_STATUS_REPORT)
    public void setBadgeOnLeftSide_false_rightBadgeVisibleAndLeftBadgeInvisible() {
        when(mAccessibilityTarget.getId()).thenReturn(
                ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());

        mAdapter.setBadgeOnLeftSide(false);
        mAdapter.onBindViewHolder(mViewHolder, 0);

        assertThat(mViewHolder.mRightBadgeView.getVisibility()).isEqualTo(View.VISIBLE);
        assertThat(mViewHolder.mLeftBadgeView.getVisibility()).isEqualTo(View.INVISIBLE);
    }

    @Test
    @EnableFlags(
            com.android.settingslib.flags.Flags.FLAG_HEARING_DEVICE_SET_CONNECTION_STATUS_REPORT)
    public void setBadgeOnLeftSide_rightBadgeInvisibleAndLeftBadgeVisible() {
        when(mAccessibilityTarget.getId()).thenReturn(
                ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());

        mAdapter.setBadgeOnLeftSide(true);
        mAdapter.onBindViewHolder(mViewHolder, 0);

        assertThat(mViewHolder.mRightBadgeView.getVisibility()).isEqualTo(View.INVISIBLE);
        assertThat(mViewHolder.mLeftBadgeView.getVisibility()).isEqualTo(View.VISIBLE);
    }

    @Test
    @EnableFlags(
            com.android.settingslib.flags.Flags.FLAG_HEARING_DEVICE_SET_CONNECTION_STATUS_REPORT)
    public void setBadgeOnLeftSide_bindViewHolderPayloads_rightBadgeInvisibleAndLeftBadgeVisible() {
        when(mAccessibilityTarget.getId()).thenReturn(
                ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());

        mAdapter.setBadgeOnLeftSide(true);
        mAdapter.onBindViewHolder(mViewHolder, 0, List.of(PAYLOAD_HEARING_STATUS_DRAWABLE));

        assertThat(mViewHolder.mRightBadgeView.getVisibility()).isEqualTo(View.INVISIBLE);
        assertThat(mViewHolder.mLeftBadgeView.getVisibility()).isEqualTo(View.VISIBLE);
    }
}
+47 −5
Original line number Diff line number Diff line
@@ -15,18 +15,60 @@
    limitations under the License.
-->

<LinearLayout
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingStart="@dimen/accessibility_floating_menu_small_padding"
    android:paddingEnd="@dimen/accessibility_floating_menu_small_padding"
    android:orientation="vertical"
    android:gravity="center">
    android:orientation="vertical">

    <View
        android:id="@+id/icon_view"
        android:layout_width="@dimen/accessibility_floating_menu_small_width_height"
        android:layout_height="@dimen/accessibility_floating_menu_small_width_height"/>
        android:layout_height="@dimen/accessibility_floating_menu_small_width_height"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/app_icon_constraint_right_badge_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="@dimen/accessibility_floating_menu_badge_position" />
    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/app_icon_constraint_badge_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="@dimen/accessibility_floating_menu_badge_position" />
    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/app_icon_constraint_left_badge_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="@dimen/accessibility_floating_menu_left_badge_x_position" />

    <View
        android:id="@+id/right_badge_view"
        android:layout_width="@dimen/accessibility_floating_menu_small_badge_width_height"
        android:layout_height="@dimen/accessibility_floating_menu_small_badge_width_height"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="@id/app_icon_constraint_right_badge_vertical"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@id/app_icon_constraint_badge_horizontal"
        android:visibility="invisible" />

    <View
        android:id="@+id/left_badge_view"
        android:layout_width="@dimen/accessibility_floating_menu_small_badge_width_height"
        android:layout_height="@dimen/accessibility_floating_menu_small_badge_width_height"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="@id/app_icon_constraint_left_badge_vertical"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@id/app_icon_constraint_badge_horizontal"
        android:visibility="invisible" />

</LinearLayout>
 No newline at end of file
</androidx.constraintlayout.widget.ConstraintLayout>
 No newline at end of file
+4 −0
Original line number Diff line number Diff line
@@ -1683,10 +1683,14 @@
    <dimen name="accessibility_floating_menu_margin">16dp</dimen>
    <dimen name="accessibility_floating_menu_small_padding">6dp</dimen>
    <dimen name="accessibility_floating_menu_small_width_height">36dp</dimen>
    <dimen name="accessibility_floating_menu_small_badge_width_height">12dp</dimen>
    <dimen name="accessibility_floating_menu_badge_position">0.67</dimen>
    <dimen name="accessibility_floating_menu_left_badge_x_position">-0.67</dimen>
    <dimen name="accessibility_floating_menu_small_single_radius">25dp</dimen>
    <dimen name="accessibility_floating_menu_small_multiple_radius">20dp</dimen>
    <dimen name="accessibility_floating_menu_large_padding">8dp</dimen>
    <dimen name="accessibility_floating_menu_large_width_height">56dp</dimen>
    <dimen name="accessibility_floating_menu_large_badge_width_height">18dp</dimen>
    <dimen name="accessibility_floating_menu_large_single_radius">35dp</dimen>
    <dimen name="accessibility_floating_menu_large_multiple_radius">35dp</dimen>
    <dimen name="accessibility_floating_menu_ime_shifting_space">48dp</dimen>
+53 −3
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.view.ViewGroup;

import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import androidx.recyclerview.widget.RecyclerView;
@@ -47,13 +48,16 @@ import java.util.List;
 * An adapter which shows the set of accessibility targets that can be performed.
 */
public class AccessibilityTargetAdapter extends Adapter<ViewHolder> {
    private static final int PAYLOAD_HEARING_STATUS_DRAWABLE = 1;
    @VisibleForTesting
    static final int PAYLOAD_HEARING_STATUS_DRAWABLE = 1;

    private int mIconWidthHeight;
    private int mBadgeWidthHeight;
    private int mItemPadding;
    private final List<AccessibilityTarget> mTargets;

    private int mHearingDeviceStatus;
    private boolean mBadgeOnLeftSide = false;

    @IntDef({
            ItemType.FIRST_ITEM,
@@ -93,7 +97,9 @@ public class AccessibilityTargetAdapter extends Adapter<ViewHolder> {
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final AccessibilityTarget target = mTargets.get(position);
        holder.mIconView.setBackground(target.getIcon());
        holder.updateIconWidthHeight(mIconWidthHeight);
        holder.mRightBadgeView.setBackground(null);
        holder.mLeftBadgeView.setBackground(null);
        holder.updateIconSize(mIconWidthHeight);
        holder.updateItemPadding(mItemPadding, getItemCount());
        holder.itemView.setOnClickListener((v) -> target.onSelected());
        holder.itemView.setStateDescription(target.getStateDescription());
@@ -159,10 +165,18 @@ public class AccessibilityTargetAdapter extends Adapter<ViewHolder> {
        mIconWidthHeight = iconWidthHeight;
    }

    public void setBadgeWidthHeight(int badgeWidthHeight) {
        mBadgeWidthHeight = badgeWidthHeight;
    }

    public void setItemPadding(int itemPadding) {
        mItemPadding = itemPadding;
    }

    public void setBadgeOnLeftSide(boolean leftSide) {
        mBadgeOnLeftSide = leftSide;
    }

    /**
     * Notifies to update the hearing device status drawable at the given target index.
     *
@@ -187,22 +201,40 @@ public class AccessibilityTargetAdapter extends Adapter<ViewHolder> {
                HearingDeviceStatusDrawableInfo.get(status);
        final int baseDrawableId = statusDrawableInfo.baseDrawableId();
        final int stateDescriptionId = statusDrawableInfo.stateDescriptionId();
        final int indicatorDrawableId = statusDrawableInfo.indicatorDrawableId();

        holder.mIconView.setBackground(
                (baseDrawableId != 0) ? context.getDrawable(baseDrawableId) : null);
        holder.mRightBadgeView.setBackground(
                (indicatorDrawableId != 0) ? context.getDrawable(indicatorDrawableId) : null);
        holder.mLeftBadgeView.setBackground(
                (indicatorDrawableId != 0) ? context.getDrawable(indicatorDrawableId) : null);
        holder.itemView.setStateDescription(
                (stateDescriptionId != 0) ? context.getString(stateDescriptionId) : null);
        holder.updateBadgeSize(mBadgeWidthHeight);

        if (mBadgeOnLeftSide) {
            holder.mRightBadgeView.setVisibility(View.INVISIBLE);
            holder.mLeftBadgeView.setVisibility(View.VISIBLE);
        } else {
            holder.mRightBadgeView.setVisibility(View.VISIBLE);
            holder.mLeftBadgeView.setVisibility(View.INVISIBLE);
        }
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        final View mIconView;
        final View mRightBadgeView;
        final View mLeftBadgeView;

        ViewHolder(View itemView) {
            super(itemView);
            mIconView = itemView.findViewById(R.id.icon_view);
            mRightBadgeView = itemView.findViewById(R.id.right_badge_view);
            mLeftBadgeView = itemView.findViewById(R.id.left_badge_view);
        }

        void updateIconWidthHeight(int newValue) {
        void updateIconSize(int newValue) {
            final ViewGroup.LayoutParams layoutParams = mIconView.getLayoutParams();
            if (layoutParams.width == newValue) {
                return;
@@ -212,6 +244,24 @@ public class AccessibilityTargetAdapter extends Adapter<ViewHolder> {
            mIconView.setLayoutParams(layoutParams);
        }

        void updateBadgeSize(int newValue) {
            final ViewGroup.LayoutParams rightLayoutParams = mRightBadgeView.getLayoutParams();
            if (rightLayoutParams.width == newValue) {
                return;
            }
            rightLayoutParams.width = newValue;
            rightLayoutParams.height = newValue;
            final ViewGroup.LayoutParams leftLayoutParams = mLeftBadgeView.getLayoutParams();
            if (leftLayoutParams.width == newValue) {
                return;
            }
            leftLayoutParams.width = newValue;
            leftLayoutParams.height = newValue;

            mRightBadgeView.setLayoutParams(rightLayoutParams);
            mLeftBadgeView.setLayoutParams(leftLayoutParams);
        }

        void updateItemPadding(int padding, int size) {
            itemView.setPaddingRelative(padding, padding, padding, 0);
        }
+12 −0
Original line number Diff line number Diff line
@@ -158,6 +158,14 @@ class MenuView extends FrameLayout implements
    private void onItemSizeChanged() {
        mAdapter.setItemPadding(mMenuViewAppearance.getMenuPadding());
        mAdapter.setIconWidthHeight(mMenuViewAppearance.getMenuIconSize());
        mAdapter.setBadgeWidthHeight(mMenuViewAppearance.getBadgeIconSize());
        mAdapter.notifyDataSetChanged();
    }

    @SuppressLint("NotifyDataSetChanged")
    void onSideChanged() {
        // Badge should be on different side of Menu view's side.
        mAdapter.setBadgeOnLeftSide(!mMenuViewAppearance.isMenuOnLeftSide());
        mAdapter.notifyDataSetChanged();
    }

@@ -206,6 +214,7 @@ class MenuView extends FrameLayout implements
        mMenuViewAppearance.setPercentagePosition(percentagePosition);

        onPositionChanged();
        onSideChanged();
    }

    void onPositionChanged() {
@@ -247,6 +256,8 @@ class MenuView extends FrameLayout implements

        mAdapter.setItemPadding(mMenuViewAppearance.getMenuPadding());
        mAdapter.setIconWidthHeight(mMenuViewAppearance.getMenuIconSize());
        mAdapter.setBadgeWidthHeight(mMenuViewAppearance.getBadgeIconSize());

        mAdapter.notifyDataSetChanged();

        onSizeChanged();
@@ -314,6 +325,7 @@ class MenuView extends FrameLayout implements
        mMenuViewAppearance.setPercentagePosition(percentagePosition);

        onEdgeChangedIfNeeded();
        onSideChanged();
    }

    boolean isMoveToTucked() {
Loading