diff options
6 files changed, 178 insertions, 14 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java index a3c5a382c53a..e00f6a6d6418 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java @@ -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); + } } diff --git a/packages/SystemUI/res/layout/accessibility_floating_menu_item.xml b/packages/SystemUI/res/layout/accessibility_floating_menu_item.xml index 2067f85249a2..b1e4272c4004 100644 --- a/packages/SystemUI/res/layout/accessibility_floating_menu_item.xml +++ b/packages/SystemUI/res/layout/accessibility_floating_menu_item.xml @@ -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"/> -</LinearLayout>
\ No newline at end of file + <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" /> + +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 11327b648ddc..570197edf876 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -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> diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapter.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapter.java index fe80f540d5d3..697d16b3336c 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapter.java @@ -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); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java index 4b6ab6f508ad..3f49010aaaab 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java @@ -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() { diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewAppearance.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewAppearance.java index 760e1c374e31..a700cbef2e16 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewAppearance.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewAppearance.java @@ -57,6 +57,8 @@ class MenuViewAppearance { private int mLargePadding; private int mSmallIconSize; private int mLargeIconSize; + private int mSmallBadgeSize; + private int mLargeBadgeSize; private int mSmallSingleRadius; private int mSmallMultipleRadius; private int mLargeSingleRadius; @@ -97,6 +99,12 @@ class MenuViewAppearance { mRes.getDimensionPixelSize(R.dimen.accessibility_floating_menu_small_width_height); mLargeIconSize = mRes.getDimensionPixelSize(R.dimen.accessibility_floating_menu_large_width_height); + mSmallBadgeSize = + mRes.getDimensionPixelSize( + R.dimen.accessibility_floating_menu_small_badge_width_height); + mLargeBadgeSize = + mRes.getDimensionPixelSize( + R.dimen.accessibility_floating_menu_large_badge_width_height); mSmallSingleRadius = mRes.getDimensionPixelSize(R.dimen.accessibility_floating_menu_small_single_radius); mSmallMultipleRadius = mRes.getDimensionPixelSize( @@ -211,6 +219,10 @@ class MenuViewAppearance { return mSizeType == SMALL ? mSmallIconSize : mLargeIconSize; } + int getBadgeIconSize() { + return mSizeType == SMALL ? mSmallBadgeSize : mLargeBadgeSize; + } + private int getMenuMargin() { return mMargin; } |