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

Commit ae70ee49 authored by satok's avatar satok
Browse files

Sort subtypes in subtype enabler settings

Bug: 3377334
Change-Id: Ie8dab8f6fb52610e783803cb902b032508d2b250
parent a849f9f7
Loading
Loading
Loading
Loading
+63 −3
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

@@ -52,12 +54,13 @@ public class InputMethodAndSubtypeEnabler extends SettingsPreferenceFragment {
    private List<InputMethodInfo> mInputMethodProperties;
    private String mInputMethodId;
    private String mTitle;
    private String mSystemLocale = "";

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        Configuration config = getResources().getConfiguration();
        final Configuration config = getResources().getConfiguration();
        mHaveHardKeyboard = (config.keyboard == Configuration.KEYBOARD_QWERTY);

        final Bundle arguments = getArguments();
@@ -82,6 +85,7 @@ public class InputMethodAndSubtypeEnabler extends SettingsPreferenceFragment {
            }
        }

        mSystemLocale = config.locale.toString();
        onCreateIMM();
        setPreferenceScreen(createPreferenceHierarchy());
    }
@@ -255,13 +259,17 @@ public class InputMethodAndSubtypeEnabler extends SettingsPreferenceFragment {
                            autoSubtypeLabel = subtypeLabel;
                        }
                    } else {
                        final CheckBoxPreference chkbxPref = new CheckBoxPreference(context);
                        final CheckBoxPreference chkbxPref = new SubtypeCheckBoxPreference(
                                context, subtype.getLocale(), mSystemLocale);
                        chkbxPref.setKey(imiId + subtype.hashCode());
                        chkbxPref.setTitle(subtypeLabel);
                        activeInputMethodsCategory.addPreference(chkbxPref);
                        subtypePreferences.add(chkbxPref);
                    }
                }
                Collections.sort(subtypePreferences);
                for (int j = 0; j < subtypePreferences.size(); ++j) {
                    activeInputMethodsCategory.addPreference(subtypePreferences.get(j));
                }
                mInputMethodAndSubtypePrefsMap.put(imiId, subtypePreferences);
            }
            if (isAutoSubtype) {
@@ -359,4 +367,56 @@ public class InputMethodAndSubtypeEnabler extends SettingsPreferenceFragment {
        }
        setCheckedImplicitlyEnabledSubtypes(null);
    }

    private static class SubtypeCheckBoxPreference extends CheckBoxPreference {
        private final boolean mIsSystemLocale;
        private final boolean mIsSystemLanguage;

        public SubtypeCheckBoxPreference(
                Context context, String subtypeLocale, String systemLocale) {
            super(context);
            if (TextUtils.isEmpty(subtypeLocale)) {
                mIsSystemLocale = false;
                mIsSystemLanguage = false;
            } else {
                mIsSystemLocale = subtypeLocale.equals(systemLocale);
                mIsSystemLanguage = mIsSystemLocale
                        || subtypeLocale.startsWith(systemLocale.substring(0, 2));
            }
        }

        @Override
        public int compareTo(Preference p) {
            if (p instanceof SubtypeCheckBoxPreference) {
                final SubtypeCheckBoxPreference pref = ((SubtypeCheckBoxPreference)p);
                final CharSequence t0 = getTitle();
                final CharSequence t1 = pref.getTitle();
                if (TextUtils.equals(t0, t1)) {
                    return 0;
                }
                if (mIsSystemLocale) {
                    return -1;
                }
                if (pref.mIsSystemLocale) {
                    return 1;
                }
                if (mIsSystemLanguage) {
                    return -1;
                }
                if (pref.mIsSystemLanguage) {
                    return 1;
                }
                if (TextUtils.isEmpty(t0)) {
                    return 1;
                }
                if (TextUtils.isEmpty(t1)) {
                    return -1;
                }
                return t0.toString().compareTo(t1.toString());
            } else {
                Log.w(TAG, "Illegal preference type.");
                return -1;
            }
        }
    }
}