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

Commit 3daa9f56 authored by Tarandeep Singh's avatar Tarandeep Singh
Browse files

Fix: Allow system IME to be disabled when another IME is available

In P, pre-installed system IME could be disabled if an ASCII non-aux IME
was available. With I1352bf42dcb9219a370a16a381ea39c43c57637a,
system-IMEs could no longer be disabled. This was unintentional as the
method name isValidSystemNonAuxAsciiCapableIme was incorrect and it
wasn't checking isSystem() earlier.

This change renames it to isValidNonAuxAsciiCapableIme and removes the
system check in order to revert to original P behavior.

Change-Id: If40de88ca0536a4446135047b6ccab64681675ec
Fix: 124536147
Test: atest InputMethodPreferenceTest
Test: atest InputMethodAndSubtypeUtilTest
Test: Manually verified using steps in bug.
parent dc868e04
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -419,8 +419,8 @@ public class InputMethodAndSubtypeUtil {
        return configurationLocale;
    }

    public static boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi) {
        if (imi.isAuxiliaryIme() || !imi.isSystem()) {
    public static boolean isValidNonAuxAsciiCapableIme(InputMethodInfo imi) {
        if (imi.isAuxiliaryIme()) {
            return false;
        }
        final int subtypeCount = imi.getSubtypeCount();
+1 −1
Original line number Diff line number Diff line
@@ -125,7 +125,7 @@ public class InputMethodPreference extends RestrictedSwitchPreference implements
        }
        mInputMethodSettingValues = InputMethodSettingValuesWrapper.getInstance(context);
        mHasPriorityInSorting = imi.isSystem()
                && InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(imi);
                && InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(imi);
        setOnPreferenceClickListener(this);
        setOnPreferenceChangeListener(this);
    }
+8 −8
Original line number Diff line number Diff line
@@ -77,25 +77,25 @@ public class InputMethodSettingValuesWrapper {
            return true;
        }

        final int enabledValidSystemNonAuxAsciiCapableImeCount =
                getEnabledValidSystemNonAuxAsciiCapableImeCount();
        final int enabledValidNonAuxAsciiCapableImeCount =
                getEnabledValidNonAuxAsciiCapableImeCount();

        return enabledValidSystemNonAuxAsciiCapableImeCount <= 1
                && !(enabledValidSystemNonAuxAsciiCapableImeCount == 1 && !isEnabled)
        return enabledValidNonAuxAsciiCapableImeCount <= 1
                && !(enabledValidNonAuxAsciiCapableImeCount == 1 && !isEnabled)
                && imi.isSystem()
                && InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(imi);
                && InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(imi);
    }

    private int getEnabledValidSystemNonAuxAsciiCapableImeCount() {
    private int getEnabledValidNonAuxAsciiCapableImeCount() {
        int count = 0;
        final List<InputMethodInfo> enabledImis = getEnabledInputMethodList();
        for (final InputMethodInfo imi : enabledImis) {
            if (InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(imi)) {
            if (InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(imi)) {
                ++count;
            }
        }
        if (count == 0) {
            Log.w(TAG, "No \"enabledValidSystemNonAuxAsciiCapableIme\"s found.");
            Log.w(TAG, "No \"enabledValidNonAuxAsciiCapableIme\"s found.");
        }
        return count;
    }
+20 −26
Original line number Diff line number Diff line
@@ -192,53 +192,47 @@ public class InputMethodAndSubtypeUtilTest {
    }

    @Test
    public void isValidSystemNonAuxAsciiCapableIme() {
        // System IME w/ no subtype
        assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
                createDummyIme(true, false)))
    public void isValidNonAuxAsciiCapableIme() {
        // IME w/ no subtype
        assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(
                createDummyIme(false)))
                .isFalse();

        // System IME w/ non-Aux and non-ASCII-capable "keyboard" subtype
        assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
                createDummyIme(true, false, createDummySubtype("keyboard", false, false))))
        // IME w/ non-Aux and non-ASCII-capable "keyboard" subtype
        assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(
                createDummyIme(false, createDummySubtype("keyboard", false, false))))
                .isFalse();

        // System IME w/ non-Aux and ASCII-capable "keyboard" subtype
        assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
                createDummyIme(true, false, createDummySubtype("keyboard", false, true))))
        // IME w/ non-Aux and ASCII-capable "keyboard" subtype
        assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(
                createDummyIme(false, createDummySubtype("keyboard", false, true))))
                .isTrue();

        // System IME w/ Aux and ASCII-capable "keyboard" subtype
        assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
                createDummyIme(true, true, createDummySubtype("keyboard", true, true))))
        // IME w/ Aux and ASCII-capable "keyboard" subtype
        assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(
                createDummyIme(true, createDummySubtype("keyboard", true, true))))
                .isFalse();

        // System IME w/ non-Aux and ASCII-capable "voice" subtype
        assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
                createDummyIme(true, false, createDummySubtype("voice", false, true))))
        // IME w/ non-Aux and ASCII-capable "voice" subtype
        assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(
                createDummyIme(false, createDummySubtype("voice", false, true))))
                .isFalse();

        // System IME w/ non-Aux and non-ASCII-capable subtype + Non-Aux and ASCII-capable subtype
        assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
                createDummyIme(true, false,
        // IME w/ non-Aux and non-ASCII-capable subtype + Non-Aux and ASCII-capable subtype
        assertThat(InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(
                createDummyIme(false,
                        createDummySubtype("keyboard", false, true),
                        createDummySubtype("keyboard", false, false))))
                .isTrue();

        // Non-system IME w/ non-Aux and ASCII-capable "keyboard" subtype
        assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
                createDummyIme(false, false, createDummySubtype("keyboard", false, true))))
                .isFalse();
   }

    private static InputMethodInfo createDummyIme(boolean isSystem, boolean isAuxIme,
    private static InputMethodInfo createDummyIme(boolean isAuxIme,
            InputMethodSubtype... subtypes) {
        final ResolveInfo ri = new ResolveInfo();
        final ServiceInfo si = new ServiceInfo();
        final ApplicationInfo ai = new ApplicationInfo();
        ai.packageName = "com.example.android.dummyime";
        ai.enabled = true;
        ai.flags |= (isSystem ? ApplicationInfo.FLAG_SYSTEM : 0);
        si.applicationInfo = ai;
        si.enabled = true;
        si.packageName = "com.example.android.dummyime";