From 0f70d8d690949fc497fabc406ad44bafe32a97e5 Mon Sep 17 00:00:00 2001 From: Zoey Chen Date: Mon, 31 Jul 2023 07:25:05 +0000 Subject: [PATCH] [Regional Preference] Add description for checked/not checked Bug: 288223637 Test: make RunSettingsRoboTests -j128 ROBOTEST_FILTER=LocaleListEditorTest Change-Id: I0d1a2de93ad2911c555acef2f4e00cd715c62f17 --- .../LocaleDragAndDropAdapter.java | 19 ++++++- .../localepicker/LocaleListEditorTest.java | 53 +++++++++++++++++-- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java index f703c83d8a7..6054c599411 100644 --- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java +++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java @@ -31,6 +31,7 @@ import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; +import androidx.annotation.VisibleForTesting; import androidx.core.view.MotionEventCompat; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -178,17 +179,33 @@ class LocaleDragAndDropAdapter // clear listener before setChecked() in case another item already bind to // current ViewHolder and checked event is triggered on stale listener mistakenly. checkbox.setOnCheckedChangeListener(null); - checkbox.setChecked(mRemoveMode ? feedItem.getChecked() : false); + boolean isChecked = mRemoveMode ? feedItem.getChecked() : false; + checkbox.setChecked(isChecked); + setCheckBoxDescription(dragCell, checkbox, isChecked); + checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { LocaleStore.LocaleInfo feedItem = (LocaleStore.LocaleInfo) dragCell.getTag(); feedItem.setChecked(isChecked); + setCheckBoxDescription(dragCell, checkbox, isChecked); } }); } + @VisibleForTesting + protected void setCheckBoxDescription(LocaleDragCell dragCell, CheckBox checkbox, + boolean isChecked) { + CharSequence checkedStatus = mContext.getText( + isChecked ? com.android.internal.R.string.checked + : com.android.internal.R.string.not_checked); + // Talkback + dragCell.setStateDescription(checkedStatus); + // Select to Speak + checkbox.setContentDescription(checkedStatus); + } + @Override public int getItemCount() { int itemCount = (null != mFeedItemList ? mFeedItemList.size() : 0); diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java index d3498651c86..fb7d41aab97 100644 --- a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java +++ b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java @@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -42,7 +43,11 @@ import android.os.LocaleList; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; import android.widget.Button; +import android.widget.CheckBox; +import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.TextView; import androidx.appcompat.app.AlertDialog; @@ -55,6 +60,7 @@ import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowActivityManager; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import org.junit.After; import org.junit.Before; @@ -67,7 +73,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; -import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import java.util.ArrayList; import java.util.List; @@ -84,11 +89,12 @@ public class LocaleListEditorTest { private static final int REQUEST_CONFIRM_SYSTEM_DEFAULT = 1; private LocaleListEditor mLocaleListEditor; - private Context mContext; private FragmentActivity mActivity; - private List mLocaleList; + private List mLocaleList; private Intent mIntent = new Intent(); + private LocaleDragCell mLocaleDragCell; + private LocaleDragAndDropAdapter.CustomViewHolder mCustomViewHolder; @Mock private LocaleDragAndDropAdapter mAdapter; @@ -108,6 +114,18 @@ public class LocaleListEditorTest { private IActivityManager mActivityService; @Mock private MetricsFeatureProvider mMetricsFeatureProvider; + @Mock + private TextView mLabel; + @Mock + private CheckBox mCheckbox; + @Mock + private TextView mMiniLabel; + @Mock + private TextView mLocalized; + @Mock + private TextView mCurrentDefault; + @Mock + private ImageView mDragHandle; @Before public void setUp() throws Exception { @@ -417,6 +435,35 @@ public class LocaleListEditorTest { when(mLocaleListEditor.getSupportedLocales()).thenReturn(supportedLocales); } + @Test + public void onBindViewHolder_shouldSetCheckedBoxText() { + ReflectionHelpers.setField(mLocaleListEditor, "mRemoveMode", true); + mLocaleList = new ArrayList<>(); + mLocaleList.add(mLocaleInfo); + when(mLocaleInfo.getFullNameNative()).thenReturn("English"); + when(mLocaleInfo.getLocale()).thenReturn(LocaleList.forLanguageTags("en-US").get(0)); + + mAdapter = spy(new LocaleDragAndDropAdapter(mLocaleListEditor, mLocaleList)); + ReflectionHelpers.setField(mAdapter, "mFeedItemList", mLocaleList); + ReflectionHelpers.setField(mAdapter, "mParent", mLocaleListEditor); + ReflectionHelpers.setField(mAdapter, "mCacheItemList", new ArrayList<>(mLocaleList)); + ReflectionHelpers.setField(mAdapter, "mContext", mContext); + ViewGroup view = new FrameLayout(mContext); + mCustomViewHolder = mAdapter.onCreateViewHolder(view, 0); + mLocaleDragCell = new LocaleDragCell(mContext, null); + ReflectionHelpers.setField(mCustomViewHolder, "mLocaleDragCell", mLocaleDragCell); + ReflectionHelpers.setField(mLocaleDragCell, "mLabel", mLabel); + ReflectionHelpers.setField(mLocaleDragCell, "mLocalized", mLocalized); + ReflectionHelpers.setField(mLocaleDragCell, "mCurrentDefault", mCurrentDefault); + ReflectionHelpers.setField(mLocaleDragCell, "mMiniLabel", mMiniLabel); + ReflectionHelpers.setField(mLocaleDragCell, "mDragHandle", mDragHandle); + ReflectionHelpers.setField(mLocaleDragCell, "mCheckbox", mCheckbox); + + mAdapter.onBindViewHolder(mCustomViewHolder, 0); + + verify(mAdapter).setCheckBoxDescription(any(LocaleDragCell.class), any(), anyBoolean()); + } + private void setUpLocaleConditions() { ShadowActivityManager.setService(mActivityService); mLocaleList = new ArrayList<>();