summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java56
-rw-r--r--packages/SystemUI/res/layout/accessibility_floating_menu_item.xml52
-rw-r--r--packages/SystemUI/res/values/dimens.xml4
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapter.java56
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewAppearance.java12
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;
}