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

Commit 55d28fd1 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Cleanup InputMethodManagerCompatWrapper

Change-Id: Id3b84ee19bb504ed8fbb398e260cc663a5b5ae0d
parent feea31e9
Loading
Loading
Loading
Loading
+6 −40
Original line number Diff line number Diff line
@@ -18,14 +18,12 @@ package com.android.inputmethod.compat;

import android.content.Context;
import android.os.IBinder;
import android.util.Log;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;

import com.android.inputmethod.latin.ImfUtils;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

// TODO: Override this class with the concrete implementation if we need to take care of the
// performance.
@@ -44,41 +42,20 @@ public class InputMethodManagerCompatWrapper {
    }

    public static InputMethodManagerCompatWrapper getInstance() {
        if (sInstance.mImm == null)
            Log.w(TAG, "getInstance() is called before initialization");
        if (sInstance.mImm == null) {
            throw new RuntimeException(TAG + ".getInstance() is called before initialization");
        }
        return sInstance;
    }

    public static void init(Context context) {
        sInstance.mImm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
    }

    public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes) {
        mImm.setAdditionalInputMethodSubtypes(imiId, subtypes);
    }

    public InputMethodSubtype getCurrentInputMethodSubtype() {
        return mImm.getCurrentInputMethodSubtype();
        sInstance.mImm = ImfUtils.getInputMethodManager(context);
    }

    public InputMethodSubtype getLastInputMethodSubtype() {
        return mImm.getLastInputMethodSubtype();
    }

    public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(
            InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes) {
        return mImm.getEnabledInputMethodSubtypeList(imi, allowsImplicitlySelectedSubtypes);
    }

    public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes() {
        return mImm.getShortcutInputMethodsAndSubtypes();
    }

    // We don't call this method when we switch between subtypes within this IME.
    public void setInputMethodAndSubtype(IBinder token, String id, InputMethodSubtype subtype) {
        mImm.setInputMethodAndSubtype(token, id, subtype);
    }

    public boolean switchToLastInputMethod(IBinder token) {
        return mImm.switchToLastInputMethod(token);
    }
@@ -88,18 +65,7 @@ public class InputMethodManagerCompatWrapper {
                onlyCurrentIme);
    }

    public List<InputMethodInfo> getInputMethodList() {
        if (mImm == null) return null;
        return mImm.getInputMethodList();
    }

    public List<InputMethodInfo> getEnabledInputMethodList() {
        if (mImm == null) return null;
        return mImm.getEnabledInputMethodList();
    }

    public void showInputMethodPicker() {
        if (mImm == null) return;
        mImm.showInputMethodPicker();
    }
}
+5 −4
Original line number Diff line number Diff line
@@ -42,13 +42,13 @@ import com.android.inputmethod.accessibility.AccessibilityUtils;
import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
import com.android.inputmethod.keyboard.PointerTracker.DrawingProxy;
import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
import com.android.inputmethod.latin.ImfUtils;
import com.android.inputmethod.latin.LatinIME;
import com.android.inputmethod.latin.LatinImeLogger;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.ResearchLogger;
import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
import com.android.inputmethod.latin.SubtypeLocale;
import com.android.inputmethod.latin.SubtypeUtils;
import com.android.inputmethod.latin.Utils;
import com.android.inputmethod.latin.Utils.UsabilityStudyLogUtils;
import com.android.inputmethod.latin.define.ProductionFlag;
@@ -877,13 +877,14 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke

            // Whether space key needs to show the "..." popup hint for special purposes
            if (mIsSpacebarTriggeringPopupByLongPress
                    && SubtypeUtils.hasMultipleEnabledIMEsOrSubtypes(
                            true /* include aux subtypes */)) {
                    && ImfUtils.hasMultipleEnabledIMEsOrSubtypes(
                            getContext(), true /* include aux subtypes */)) {
                drawKeyPopupHint(key, canvas, paint, params);
            }
        } else if (key.mCode == Keyboard.CODE_LANGUAGE_SWITCH) {
            super.onDrawKeyTopVisuals(key, canvas, paint, params);
            if (SubtypeUtils.hasMultipleEnabledIMEsOrSubtypes(true /* include aux subtypes */)) {
            if (ImfUtils.hasMultipleEnabledIMEsOrSubtypes(
                    getContext(), true /* include aux subtypes */)) {
                drawKeyPopupHint(key, canvas, paint, params);
            }
        } else {
+48 −43
Original line number Diff line number Diff line
@@ -18,24 +18,52 @@ package com.android.inputmethod.latin;

import android.content.Context;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;

import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;

import java.util.Collections;
import java.util.List;

public class SubtypeUtils {
    private SubtypeUtils() {
/**
 * Utility class for Input Method Framework
 */
public class ImfUtils {
    private ImfUtils() {
        // This utility class is not publicly instantiable.
    }

    // TODO: Cache my InputMethodInfo and/or InputMethodSubtype list.
    public static boolean checkIfSubtypeBelongsToThisIme(Context context, InputMethodSubtype ims) {
        final InputMethodManagerCompatWrapper imm = InputMethodManagerCompatWrapper.getInstance();
        if (imm == null) return false;
    private static InputMethodManager sInputMethodManager;

    public static InputMethodManager getInputMethodManager(Context context) {
        if (sInputMethodManager == null) {
            sInputMethodManager = (InputMethodManager)context.getSystemService(
                    Context.INPUT_METHOD_SERVICE);
        }
        return sInputMethodManager;
    }

    private static InputMethodInfo sInputMethodInfoOfThisIme;

    public static InputMethodInfo getInputMethodInfoOfThisIme(Context context) {
        if (sInputMethodInfoOfThisIme == null) {
            final InputMethodManager imm = getInputMethodManager(context);
            final String packageName = context.getPackageName();
            for (final InputMethodInfo imi : imm.getInputMethodList()) {
                if (imi.getPackageName().equals(packageName))
                    return imi;
            }
            throw new RuntimeException("Can not find input method id for " + packageName);
        }
        return sInputMethodInfoOfThisIme;
    }

        final InputMethodInfo myImi = getInputMethodInfo(context.getPackageName());
    public static String getInputMethodIdOfThisIme(Context context) {
        return getInputMethodInfoOfThisIme(context).getId();
    }

    public static boolean checkIfSubtypeBelongsToThisIme(Context context, InputMethodSubtype ims) {
        final InputMethodInfo myImi = getInputMethodInfoOfThisIme(context);
        final InputMethodManager imm = getInputMethodManager(context);
        final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(myImi, true);
        for (final InputMethodSubtype subtype : subtypes) {
            if (subtype.equals(ims)) {
@@ -45,26 +73,23 @@ public class SubtypeUtils {
        return false;
    }

    public static boolean hasMultipleEnabledIMEsOrSubtypes(
    public static boolean hasMultipleEnabledIMEsOrSubtypes(Context context,
            final boolean shouldIncludeAuxiliarySubtypes) {
        final InputMethodManagerCompatWrapper imm = InputMethodManagerCompatWrapper.getInstance();
        if (imm == null) return false;

        final InputMethodManager imm = getInputMethodManager(context);
        final List<InputMethodInfo> enabledImis = imm.getEnabledInputMethodList();
        return hasMultipleEnabledSubtypes(shouldIncludeAuxiliarySubtypes, enabledImis);
        return hasMultipleEnabledSubtypes(context, shouldIncludeAuxiliarySubtypes, enabledImis);
    }

    public static boolean hasMultipleEnabledSubtypesInThisIme(Context context,
            final boolean shouldIncludeAuxiliarySubtypes) {
        final InputMethodInfo myImi = getInputMethodInfo(context.getPackageName());
        final InputMethodInfo myImi = getInputMethodInfoOfThisIme(context);
        final List<InputMethodInfo> imiList = Collections.singletonList(myImi);
        return hasMultipleEnabledSubtypes(shouldIncludeAuxiliarySubtypes, imiList);
        return hasMultipleEnabledSubtypes(context, shouldIncludeAuxiliarySubtypes, imiList);
    }

    private static boolean hasMultipleEnabledSubtypes(final boolean shouldIncludeAuxiliarySubtypes,
            List<InputMethodInfo> imiList) {
        final InputMethodManagerCompatWrapper imm = InputMethodManagerCompatWrapper.getInstance();
        if (imm == null) return false;
    private static boolean hasMultipleEnabledSubtypes(Context context,
            final boolean shouldIncludeAuxiliarySubtypes, List<InputMethodInfo> imiList) {
        final InputMethodManager imm = getInputMethodManager(context);

        // Number of the filtered IMEs
        int filteredImisCount = 0;
@@ -113,26 +138,9 @@ public class SubtypeUtils {
        return keyboardCount > 1;
    }

    public static String getInputMethodId(String packageName) {
        return getInputMethodInfo(packageName).getId();
    }

    public static InputMethodInfo getInputMethodInfo(String packageName) {
        final InputMethodManagerCompatWrapper imm = InputMethodManagerCompatWrapper.getInstance();
        if (imm == null) {
            throw new RuntimeException("Input method manager not found");
        }

        for (final InputMethodInfo imi : imm.getInputMethodList()) {
            if (imi.getPackageName().equals(packageName))
                return imi;
        }
        throw new RuntimeException("Can not find input method id for " + packageName);
    }

    public static InputMethodSubtype findSubtypeByLocaleAndKeyboardLayoutSet(
            Context context, String localeString, String keyboardLayoutSetName) {
        final InputMethodInfo imi = getInputMethodInfo(context.getPackageName());
        final InputMethodInfo imi = getInputMethodInfoOfThisIme(context);
        final int count = imi.getSubtypeCount();
        for (int i = 0; i < count; i++) {
            final InputMethodSubtype subtype = imi.getSubtypeAt(i);
@@ -148,11 +156,8 @@ public class SubtypeUtils {

    public static void setAdditionalInputMethodSubtypes(Context context,
            InputMethodSubtype[] subtypes) {
        final InputMethodManagerCompatWrapper imm = InputMethodManagerCompatWrapper.getInstance();
        if (imm == null) {
            throw new RuntimeException("Input method manager not found");
        }
        final String imiId = getInputMethodId(context.getPackageName());
        final InputMethodManager imm = getInputMethodManager(context);
        final String imiId = getInputMethodIdOfThisIme(context);
        imm.setAdditionalInputMethodSubtypes(imiId, subtypes);
    }
}
+6 −4
Original line number Diff line number Diff line
@@ -441,7 +441,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen

        loadSettings();

        SubtypeUtils.setAdditionalInputMethodSubtypes(
        ImfUtils.setAdditionalInputMethodSubtypes(
                this, mSettingsValues.getPrefefinedAdditionalSubtypes());

        // TODO: remove the following when it's not needed by updateCorrectionMode() any more
@@ -1134,7 +1134,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        if (isShowingOptionDialog()) return false;
        switch (requestCode) {
        case CODE_SHOW_INPUT_METHOD_PICKER:
            if (SubtypeUtils.hasMultipleEnabledIMEsOrSubtypes(true /* include aux subtypes */)) {
            if (ImfUtils.hasMultipleEnabledIMEsOrSubtypes(
                    this, true /* include aux subtypes */)) {
                mImm.showInputMethodPicker();
                return true;
            }
@@ -1169,7 +1170,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        final IBinder token = getWindow().getWindow().getAttributes().token;
        if (mShouldSwitchToLastSubtype) {
            final InputMethodSubtype lastSubtype = mImm.getLastInputMethodSubtype();
            final boolean lastSubtypeBelongsToThisIme = SubtypeUtils.checkIfSubtypeBelongsToThisIme(
            final boolean lastSubtypeBelongsToThisIme = ImfUtils.checkIfSubtypeBelongsToThisIme(
                    this, lastSubtype);
            if ((includesOtherImes || lastSubtypeBelongsToThisIme)
                    && mImm.switchToLastInputMethod(token)) {
@@ -2299,6 +2300,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
                getString(R.string.language_selection_title),
                getString(R.string.english_ime_settings),
        };
        final Context context = this;
        final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface di, int position) {
@@ -2306,7 +2308,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
                switch (position) {
                case 0:
                    Intent intent = CompatUtils.getInputLanguageSelectionIntent(
                            SubtypeUtils.getInputMethodId(getPackageName()),
                            ImfUtils.getInputMethodIdOfThisIme(context),
                            Intent.FLAG_ACTIVITY_NEW_TASK
                            | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
                            | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+3 −2
Original line number Diff line number Diff line
@@ -306,9 +306,10 @@ public class SettingsValues {
            return false;
        }
        if (mIncludesOtherImesInLanguageSwitchList) {
            return SubtypeUtils.hasMultipleEnabledIMEsOrSubtypes(/* include aux subtypes */false);
            return ImfUtils.hasMultipleEnabledIMEsOrSubtypes(
                    context, /* include aux subtypes */false);
        } else {
            return SubtypeUtils.hasMultipleEnabledSubtypesInThisIme(
            return ImfUtils.hasMultipleEnabledSubtypesInThisIme(
                    context, /* include aux subtypes */false);
        }
    }
Loading