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));