Search in sources :

Example 91 with InputMethodInfo

use of android.view.inputmethod.InputMethodInfo in project android_frameworks_base by crdroidandroid.

the class InputMethodManagerService method resetDefaultImeLocked.

private void resetDefaultImeLocked(Context context) {
    // Do not reset the default (current) IME when it is a 3rd-party IME
    if (mCurMethodId != null && !InputMethodUtils.isSystemIme(mMethodMap.get(mCurMethodId))) {
        return;
    }
    final List<InputMethodInfo> suitableImes = InputMethodUtils.getDefaultEnabledImes(context, mSystemReady, mSettings.getEnabledInputMethodListLocked());
    if (suitableImes.isEmpty()) {
        Slog.i(TAG, "No default found");
        return;
    }
    final InputMethodInfo defIm = suitableImes.get(0);
    Slog.i(TAG, "Default found, using " + defIm.getId());
    setSelectedInputMethodAndSubtypeLocked(defIm, NOT_A_SUBTYPE_ID, false);
}
Also used : InputMethodInfo(android.view.inputmethod.InputMethodInfo)

Example 92 with InputMethodInfo

use of android.view.inputmethod.InputMethodInfo in project android_frameworks_base by crdroidandroid.

the class InputMethodManagerService method getCurrentInputMethodSubtypeLocked.

private InputMethodSubtype getCurrentInputMethodSubtypeLocked() {
    if (mCurMethodId == null) {
        return null;
    }
    final boolean subtypeIsSelected = mSettings.isSubtypeSelected();
    final InputMethodInfo imi = mMethodMap.get(mCurMethodId);
    if (imi == null || imi.getSubtypeCount() == 0) {
        return null;
    }
    if (!subtypeIsSelected || mCurrentSubtype == null || !InputMethodUtils.isValidSubtypeId(imi, mCurrentSubtype.hashCode())) {
        int subtypeId = mSettings.getSelectedInputMethodSubtypeId(mCurMethodId);
        if (subtypeId == NOT_A_SUBTYPE_ID) {
            // If there are no selected subtypes, the framework will try to find
            // the most applicable subtype from explicitly or implicitly enabled
            // subtypes.
            List<InputMethodSubtype> explicitlyOrImplicitlyEnabledSubtypes = mSettings.getEnabledInputMethodSubtypeListLocked(mContext, imi, true);
            // just returns it.
            if (explicitlyOrImplicitlyEnabledSubtypes.size() == 1) {
                mCurrentSubtype = explicitlyOrImplicitlyEnabledSubtypes.get(0);
            } else if (explicitlyOrImplicitlyEnabledSubtypes.size() > 1) {
                mCurrentSubtype = InputMethodUtils.findLastResortApplicableSubtypeLocked(mRes, explicitlyOrImplicitlyEnabledSubtypes, InputMethodUtils.SUBTYPE_MODE_KEYBOARD, null, true);
                if (mCurrentSubtype == null) {
                    mCurrentSubtype = InputMethodUtils.findLastResortApplicableSubtypeLocked(mRes, explicitlyOrImplicitlyEnabledSubtypes, null, null, true);
                }
            }
        } else {
            mCurrentSubtype = InputMethodUtils.getSubtypes(imi).get(subtypeId);
        }
    }
    return mCurrentSubtype;
}
Also used : InputMethodSubtype(android.view.inputmethod.InputMethodSubtype) InputMethodInfo(android.view.inputmethod.InputMethodInfo)

Example 93 with InputMethodInfo

use of android.view.inputmethod.InputMethodInfo in project android_frameworks_base by crdroidandroid.

the class InputMethodManagerService method buildInputMethodListLocked.

void buildInputMethodListLocked(boolean resetDefaultEnabledIme) {
    if (DEBUG) {
        Slog.d(TAG, "--- re-buildInputMethodList reset = " + resetDefaultEnabledIme + " \n ------ caller=" + Debug.getCallers(10));
    }
    mMethodList.clear();
    mMethodMap.clear();
    // Use for queryIntentServicesAsUser
    final PackageManager pm = mContext.getPackageManager();
    // Note: We do not specify PackageManager.MATCH_ENCRYPTION_* flags here because the default
    // behavior of PackageManager is exactly what we want.  It by default picks up appropriate
    // services depending on the unlock state for the specified user.
    final List<ResolveInfo> services = pm.queryIntentServicesAsUser(new Intent(InputMethod.SERVICE_INTERFACE), PackageManager.GET_META_DATA | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, mSettings.getCurrentUserId());
    final HashMap<String, List<InputMethodSubtype>> additionalSubtypes = mFileManager.getAllAdditionalInputMethodSubtypes();
    for (int i = 0; i < services.size(); ++i) {
        ResolveInfo ri = services.get(i);
        ServiceInfo si = ri.serviceInfo;
        ComponentName compName = new ComponentName(si.packageName, si.name);
        if (!android.Manifest.permission.BIND_INPUT_METHOD.equals(si.permission)) {
            Slog.w(TAG, "Skipping input method " + compName + ": it does not require the permission " + android.Manifest.permission.BIND_INPUT_METHOD);
            continue;
        }
        if (DEBUG)
            Slog.d(TAG, "Checking " + compName);
        try {
            InputMethodInfo p = new InputMethodInfo(mContext, ri, additionalSubtypes);
            mMethodList.add(p);
            final String id = p.getId();
            mMethodMap.put(id, p);
            if (DEBUG) {
                Slog.d(TAG, "Found an input method " + p);
            }
        } catch (Exception e) {
            Slog.wtf(TAG, "Unable to load input method " + compName, e);
        }
    }
    // TODO: The following code should find better place to live.
    if (!resetDefaultEnabledIme) {
        boolean enabledImeFound = false;
        final List<InputMethodInfo> enabledImes = mSettings.getEnabledInputMethodListLocked();
        final int N = enabledImes.size();
        for (int i = 0; i < N; ++i) {
            final InputMethodInfo imi = enabledImes.get(i);
            if (mMethodList.contains(imi)) {
                enabledImeFound = true;
                break;
            }
        }
        if (!enabledImeFound) {
            Slog.i(TAG, "All the enabled IMEs are gone. Reset default enabled IMEs.");
            resetDefaultEnabledIme = true;
            resetSelectedInputMethodAndSubtypeLocked("");
        }
    }
    if (resetDefaultEnabledIme) {
        final ArrayList<InputMethodInfo> defaultEnabledIme = InputMethodUtils.getDefaultEnabledImes(mContext, mSystemReady, mMethodList);
        final int N = defaultEnabledIme.size();
        for (int i = 0; i < N; ++i) {
            final InputMethodInfo imi = defaultEnabledIme.get(i);
            if (DEBUG) {
                Slog.d(TAG, "--- enable ime = " + imi);
            }
            setInputMethodEnabledLocked(imi.getId(), true);
        }
    }
    final String defaultImiId = mSettings.getSelectedInputMethod();
    if (!TextUtils.isEmpty(defaultImiId)) {
        if (!mMethodMap.containsKey(defaultImiId)) {
            Slog.w(TAG, "Default IME is uninstalled. Choose new default IME.");
            if (chooseNewDefaultIMELocked()) {
                updateInputMethodsFromSettingsLocked(true);
            }
        } else {
            // Double check that the default IME is certainly enabled.
            setInputMethodEnabledLocked(defaultImiId, true);
        }
    }
    // Here is not the perfect place to reset the switching controller. Ideally
    // mSwitchingController and mSettings should be able to share the same state.
    // TODO: Make sure that mSwitchingController and mSettings are sharing the
    // the same enabled IMEs list.
    mSwitchingController.resetCircularListLocked(mContext);
}
Also used : PendingIntent(android.app.PendingIntent) Intent(android.content.Intent) InputMethodInfo(android.view.inputmethod.InputMethodInfo) SettingNotFoundException(android.provider.Settings.SettingNotFoundException) InvalidParameterException(java.security.InvalidParameterException) RemoteException(android.os.RemoteException) IOException(java.io.IOException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) ResolveInfo(android.content.pm.ResolveInfo) ServiceInfo(android.content.pm.ServiceInfo) PackageManager(android.content.pm.PackageManager) IPackageManager(android.content.pm.IPackageManager) ArrayList(java.util.ArrayList) List(java.util.List) LocaleList(android.os.LocaleList) ComponentName(android.content.ComponentName)

Example 94 with InputMethodInfo

use of android.view.inputmethod.InputMethodInfo in project android_frameworks_base by crdroidandroid.

the class InputMethodManagerService method setAdditionalInputMethodSubtypes.

@Override
public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes) {
    if (!calledFromValidUser()) {
        return;
    }
    // additional input method subtypes to the IME.
    if (TextUtils.isEmpty(imiId) || subtypes == null)
        return;
    synchronized (mMethodMap) {
        final InputMethodInfo imi = mMethodMap.get(imiId);
        if (imi == null)
            return;
        final String[] packageInfos;
        try {
            packageInfos = mIPackageManager.getPackagesForUid(Binder.getCallingUid());
        } catch (RemoteException e) {
            Slog.e(TAG, "Failed to get package infos");
            return;
        }
        if (packageInfos != null) {
            final int packageNum = packageInfos.length;
            for (int i = 0; i < packageNum; ++i) {
                if (packageInfos[i].equals(imi.getPackageName())) {
                    mFileManager.addInputMethodSubtypes(imi, subtypes);
                    final long ident = Binder.clearCallingIdentity();
                    try {
                        buildInputMethodListLocked(false);
                    } finally {
                        Binder.restoreCallingIdentity(ident);
                    }
                    return;
                }
            }
        }
    }
    return;
}
Also used : RemoteException(android.os.RemoteException) InputMethodInfo(android.view.inputmethod.InputMethodInfo)

Example 95 with InputMethodInfo

use of android.view.inputmethod.InputMethodInfo in project android_frameworks_base by crdroidandroid.

the class InputMethodManagerService method setCurrentInputMethodSubtype.

@Override
public boolean setCurrentInputMethodSubtype(InputMethodSubtype subtype) {
    // TODO: Make this work even for non-current users?
    if (!calledFromValidUser()) {
        return false;
    }
    synchronized (mMethodMap) {
        if (subtype != null && mCurMethodId != null) {
            InputMethodInfo imi = mMethodMap.get(mCurMethodId);
            int subtypeId = InputMethodUtils.getSubtypeIdFromHashCode(imi, subtype.hashCode());
            if (subtypeId != NOT_A_SUBTYPE_ID) {
                setInputMethodLocked(mCurMethodId, subtypeId);
                return true;
            }
        }
        return false;
    }
}
Also used : InputMethodInfo(android.view.inputmethod.InputMethodInfo)

Aggregations

InputMethodInfo (android.view.inputmethod.InputMethodInfo)309 InputMethodSubtype (android.view.inputmethod.InputMethodSubtype)113 ArrayList (java.util.ArrayList)80 RemoteException (android.os.RemoteException)53 ServiceInfo (android.content.pm.ServiceInfo)34 ComponentName (android.content.ComponentName)33 Intent (android.content.Intent)33 Context (android.content.Context)32 InputMethodManager (android.view.inputmethod.InputMethodManager)29 ApplicationInfo (android.content.pm.ApplicationInfo)27 PendingIntent (android.app.PendingIntent)24 Test (org.junit.Test)24 ResolveInfo (android.content.pm.ResolveInfo)19 ImeSubtypeListItem (com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem)15 InputMethodPreference (com.android.settingslib.inputmethod.InputMethodPreference)14 List (java.util.List)14 PackageManager (android.content.pm.PackageManager)13 Drawable (android.graphics.drawable.Drawable)13 SmallTest (android.test.suitebuilder.annotation.SmallTest)12 Printer (android.util.Printer)12