Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f1f39cf1 authored by Mihai Nita's avatar Mihai Nita
Browse files

Show locale in region list even if suggested in language list

Even if English US is suggested, when choosing English I should
still see US in the country list.
Because now the same LocaleInfo object (from cache) can be present
in both lists (language & region), it means that the label should
depend on the context.
We also need to explicitely disable suggestions in the region list.

Bug: 26590073
Bug: 26939203
Change-Id: Ib1cbad9d26a8b183bf462505335bef04193e82f4
parent b878a99f
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -180,14 +180,16 @@ public class LocaleHelper {
     */
    public static final class LocaleInfoComparator implements Comparator<LocaleStore.LocaleInfo> {
        private final Collator mCollator;
        private final boolean mCountryMode;

        /**
         * Constructor.
         *
         * @param sortLocale the locale to be used for sorting.
         */
        public LocaleInfoComparator(Locale sortLocale) {
        public LocaleInfoComparator(Locale sortLocale, boolean countryMode) {
            mCollator = Collator.getInstance(sortLocale);
            mCountryMode = countryMode;
        }

        /**
@@ -202,9 +204,9 @@ public class LocaleHelper {
        public int compare(LocaleStore.LocaleInfo lhs, LocaleStore.LocaleInfo rhs) {
            // We don't care about the various suggestion types, just "suggested" (!= 0)
            // and "all others" (== 0)
            if (lhs.isSuggested() == rhs.isSuggested()) {
            if (mCountryMode || (lhs.isSuggested() == rhs.isSuggested())) {
                // They are in the same "bucket" (suggested / others), so we compare the text
                return mCollator.compare(lhs.getLabel(), rhs.getLabel());
                return mCollator.compare(lhs.getLabel(mCountryMode), rhs.getLabel(mCountryMode));
            } else {
                // One locale is suggested and one is not, so we put them in different "buckets"
                return lhs.isSuggested() ? -1 : 1;
+12 −27
Original line number Diff line number Diff line
@@ -50,7 +50,6 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
    private Set<LocaleStore.LocaleInfo> mLocaleList;
    private LocaleStore.LocaleInfo mParentLocale;
    private boolean mTranslatedOnly = false;
    private boolean mCountryMode = false;

    /**
     * Other classes can register to be notified when a locale was selected.
@@ -70,15 +69,14 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
            boolean translatedOnly) {
        LocalePickerWithRegion localePicker = new LocalePickerWithRegion();
        boolean shouldShowTheList = localePicker.setListener(context, listener, parent,
                true /* country mode */, translatedOnly);
                translatedOnly);
        return shouldShowTheList ? localePicker : null;
    }

    public static LocalePickerWithRegion createLanguagePicker(Context context,
            LocaleSelectedListener listener, boolean translatedOnly) {
        LocalePickerWithRegion localePicker = new LocalePickerWithRegion();
        localePicker.setListener(context, listener, null,
                false /* language mode */, translatedOnly);
        localePicker.setListener(context, listener, /* parent */ null, translatedOnly);
        return localePicker;
    }

@@ -96,14 +94,7 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
     * "pretending" it was selected, and return false.</p>
     */
    private boolean setListener(Context context, LocaleSelectedListener listener,
            LocaleStore.LocaleInfo parent, boolean countryMode, boolean translatedOnly) {
        if (countryMode && (parent == null || parent.getLocale() == null)) {
            // The list of countries is determined as all the countries where the parent language
            // is used.
            throw new IllegalArgumentException("The country selection list needs a parent.");
        }

        this.mCountryMode = countryMode;
            LocaleStore.LocaleInfo parent, boolean translatedOnly) {
        this.mParentLocale = parent;
        this.mListener = listener;
        this.mTranslatedOnly = translatedOnly;
@@ -116,7 +107,7 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
            Collections.addAll(langTagsToIgnore, langTags);
        }

        if (countryMode) {
        if (parent != null) {
            mLocaleList = LocaleStore.getLevelLocales(context,
                    langTagsToIgnore, parent, translatedOnly);
            if (mLocaleList.size() <= 1) {
@@ -138,13 +129,11 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

        final Locale sortingLocale = (mCountryMode && mParentLocale != null)
                ? mParentLocale.getLocale()
                : Locale.getDefault();

        mAdapter = new SuggestedLocaleAdapter(mLocaleList, mCountryMode);
        final boolean countryMode = mParentLocale != null;
        final Locale sortingLocale = countryMode ? mParentLocale.getLocale() : Locale.getDefault();
        mAdapter = new SuggestedLocaleAdapter(mLocaleList, countryMode);
        final LocaleHelper.LocaleInfoComparator comp =
                new LocaleHelper.LocaleInfoComparator(sortingLocale);
                new LocaleHelper.LocaleInfoComparator(sortingLocale, countryMode);
        mAdapter.sort(comp);
        setListAdapter(mAdapter);
    }
@@ -164,12 +153,8 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
    public void onResume() {
        super.onResume();

        if (mCountryMode) {
            if (mParentLocale == null) {
                this.getActivity().setTitle(R.string.country_selection_title);
            } else {
        if (mParentLocale != null) {
            this.getActivity().setTitle(mParentLocale.getFullNameNative());
            }
        } else {
            this.getActivity().setTitle(R.string.language_selection_title);
        }
@@ -182,7 +167,7 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
        final LocaleStore.LocaleInfo locale =
                (LocaleStore.LocaleInfo) getListAdapter().getItem(position);

        if (mCountryMode || locale.getParent() != null) {
        if (locale.getParent() != null) {
            if (mListener != null) {
                mListener.onLocaleSelected(locale);
            }
@@ -205,7 +190,7 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        if (!mCountryMode) {
        if (mParentLocale == null) {
            inflater.inflate(R.menu.language_selection_list, menu);

            MenuItem mSearchMenuItem = menu.findItem(R.id.locale_search_menu);
+5 −7
Original line number Diff line number Diff line
@@ -145,11 +145,11 @@ public class LocaleStore {
            return mLangScriptKey;
        }

        String getLabel() {
            if (getParent() == null || this.isSuggestionOfType(SUGGESTION_TYPE_SIM)) {
                return getFullNameNative();
            } else {
        String getLabel(boolean countryMode) {
            if (countryMode) {
                return getFullCountryNameNative();
            } else {
                return getFullNameNative();
            }
        }

@@ -311,10 +311,8 @@ public class LocaleStore {
            if (level == 2) {
                if (parent != null) { // region selection
                    if (parentId.equals(li.getParent().toLanguageTag())) {
                        if (!li.isSuggestionOfType(LocaleInfo.SUGGESTION_TYPE_SIM)) {
                        result.add(li);
                    }
                    }
                } else { // language selection
                    if (li.isSuggestionOfType(LocaleInfo.SUGGESTION_TYPE_SIM)) {
                        result.add(li);
+4 −1
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable {

                TextView text = (TextView) convertView.findViewById(R.id.locale);
                LocaleStore.LocaleInfo item = (LocaleStore.LocaleInfo) getItem(position);
                text.setText(item.getLabel());
                text.setText(item.getLabel(mCountryMode));
                text.setTextLocale(item.getLocale());
                if (mCountryMode) {
                    int layoutDir = TextUtils.getLayoutDirectionFromLocale(item.getParent());
@@ -171,6 +171,9 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable {
    }

    private boolean showHeaders() {
        if (mCountryMode) { // never show suggestions in country mode
            return false;
        }
        return mSuggestionCount != 0 && mSuggestionCount != mLocaleOptions.size();
    }