Fixed language screen so that locale preferences that do not go to
sublocale preference screens do not show carets.
Bug: 148619657
Change-Id: Ia4beae6848305aff99fe9ef8f28ae78ae70bf2f7
Test: robolectric tests pass.
Merged-In: Ia4beae6848305aff99fe9ef8f28ae78ae70bf2f7
diff --git a/src/com/android/car/settings/language/LanguageBasePreferenceController.java b/src/com/android/car/settings/language/LanguageBasePreferenceController.java
index 6e626b8..8f833a3 100644
--- a/src/com/android/car/settings/language/LanguageBasePreferenceController.java
+++ b/src/com/android/car/settings/language/LanguageBasePreferenceController.java
@@ -72,7 +72,7 @@
protected void updateState(PreferenceGroup preferenceGroup) {
// Only populate if the preference group is empty.
if (preferenceGroup.getPreferenceCount() == 0) {
- defineLocaleProvider().populateBasePreference(preferenceGroup, this);
+ defineLocaleProvider().populateBasePreference(preferenceGroup, getExclusionSet(), this);
}
}
diff --git a/src/com/android/car/settings/language/LocalePreferenceProvider.java b/src/com/android/car/settings/language/LocalePreferenceProvider.java
index dc32d39..9bb87fa 100644
--- a/src/com/android/car/settings/language/LocalePreferenceProvider.java
+++ b/src/com/android/car/settings/language/LocalePreferenceProvider.java
@@ -79,7 +79,7 @@
* @param listener the click listener registered to the language/locale preferences contained in
* the base preference group
*/
- public void populateBasePreference(PreferenceGroup base,
+ public void populateBasePreference(PreferenceGroup base, Set<String> ignorables,
Preference.OnPreferenceClickListener listener) {
/*
* LocalePreferenceProvider can give elements to be represented in 2 ways. In the first
@@ -94,7 +94,7 @@
*/
PreferenceCategory category = null;
for (int position = 0; position < mSuggestedLocaleAdapter.getCount(); position++) {
- Preference preference = getPreference(position);
+ Preference preference = getPreference(position, ignorables);
if (PreferenceUtil.checkPreferenceType(preference, PreferenceCategory.class)) {
category = (PreferenceCategory) preference;
base.addPreference(category);
@@ -113,7 +113,7 @@
* Constructs a PreferenceCategory or Preference with locale arguments based on the type of item
* provided.
*/
- private Preference getPreference(int position) {
+ private Preference getPreference(int position, Set<String> ignorables) {
int type = mSuggestedLocaleAdapter.getItemViewType(position);
switch (type) {
case TYPE_HEADER_SUGGESTED:
@@ -128,6 +128,14 @@
(LocaleStore.LocaleInfo) mSuggestedLocaleAdapter.getItem(position);
CarUiPreference preference = new CarUiPreference(mContext);
preference.setTitle(info.getFullNameNative());
+ // Only locales with multiple sublocales needs to show the chevron, since in those
+ // cases, the user needs to navigate to the child fragment to select the sublocale.
+ Set<LocaleStore.LocaleInfo> subLocales = LocaleStore.getLevelLocales(
+ mContext,
+ ignorables,
+ info,
+ /* translatedOnly */ true);
+ preference.setShowChevron(subLocales.size() > 1);
LocaleUtil.setLocaleArgument(preference, info);
return preference;
default:
diff --git a/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java b/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java
index 5847603..226dee2 100644
--- a/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java
+++ b/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java
@@ -31,22 +31,27 @@
import com.android.car.settings.CarSettingsRobolectricTestRunner;
import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.testutils.ShadowLocaleStore;
import com.android.car.settingslib.R;
import com.android.internal.app.LocaleStore;
import com.android.internal.app.SuggestedLocaleAdapter;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
import java.util.Locale;
@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowLocaleStore.class})
public class LocalePreferenceProviderTest {
private static class Pair {
@@ -62,6 +67,7 @@
private Context mContext;
private LocalePreferenceProvider mLocalePreferenceProvider;
private LogicalPreferenceGroup mPreferenceGroup;
+ private HashSet mIgnorables = new HashSet();
// This list includes the expected values that should be returned by the SuggestedLocaleAdapter.
// The index i in this list represents position, the itemType represents the return value for
// getItemViewType given the index i, and mLocaleInfo represents the return value for getItem
@@ -84,6 +90,11 @@
screen.addPreference(mPreferenceGroup);
}
+ @After
+ public void tearDown() {
+ ShadowLocaleStore.reset();
+ }
+
@Test
public void testPopulateBasePreference_noSubSections() {
mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
@@ -94,7 +105,7 @@
LocaleStore.getLocaleInfo(Locale.CANADA)));
prepareSuggestedLocaleAdapterMock();
- mLocalePreferenceProvider.populateBasePreference(mPreferenceGroup, mock(
+ mLocalePreferenceProvider.populateBasePreference(mPreferenceGroup, mIgnorables, mock(
Preference.OnPreferenceClickListener.class));
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
}
@@ -119,7 +130,7 @@
LocaleStore.getLocaleInfo(Locale.CHINA)));
prepareSuggestedLocaleAdapterMock();
- mLocalePreferenceProvider.populateBasePreference(mPreferenceGroup, mock(
+ mLocalePreferenceProvider.populateBasePreference(mPreferenceGroup, mIgnorables, mock(
Preference.OnPreferenceClickListener.class));
assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
@@ -146,7 +157,7 @@
Preference.OnPreferenceClickListener listener = mock(
Preference.OnPreferenceClickListener.class);
- mLocalePreferenceProvider.populateBasePreference(mPreferenceGroup, listener);
+ mLocalePreferenceProvider.populateBasePreference(mPreferenceGroup, mIgnorables, listener);
mPreferenceGroup.getPreference(0).performClick();
verify(listener).onPreferenceClick(mPreferenceGroup.getPreference(0));