// Reload enabledSubtypes from the framework.
 private void updateEnabledSubtypes() {
   final String currentMode = getCurrentSubtypeMode();
   boolean foundCurrentSubtypeBecameDisabled = true;
   mAllEnabledSubtypesOfCurrentInputMethod = mImm.getEnabledInputMethodSubtypeList(null, true);
   mEnabledLanguagesOfCurrentInputMethod.clear();
   mEnabledKeyboardSubtypesOfCurrentInputMethod.clear();
   for (InputMethodSubtypeCompatWrapper ims : mAllEnabledSubtypesOfCurrentInputMethod) {
     final String locale = getSubtypeLocale(ims);
     final String mode = ims.getMode();
     mLocaleSplitter.setString(locale);
     if (mLocaleSplitter.hasNext()) {
       mEnabledLanguagesOfCurrentInputMethod.add(mLocaleSplitter.next());
     }
     if (locale.equals(mInputLocaleStr) && mode.equals(currentMode)) {
       foundCurrentSubtypeBecameDisabled = false;
     }
     if (KEYBOARD_MODE.equals(ims.getMode())) {
       mEnabledKeyboardSubtypesOfCurrentInputMethod.add(ims);
     }
   }
   mNeedsToDisplayLanguage =
       !(getEnabledKeyboardLocaleCount() <= 1 && mIsSystemLanguageSameAsInputLanguage);
   if (foundCurrentSubtypeBecameDisabled) {
     if (DBG) {
       Log.w(TAG, "Current subtype: " + mInputLocaleStr + ", " + currentMode);
       Log.w(TAG, "Last subtype was disabled. Update to the current one.");
     }
     updateSubtype(mImm.getCurrentInputMethodSubtype());
   }
 }
  private void initialize(LatinIME service) {
    mService = service;
    mResources = service.getResources();
    mImm = InputMethodManagerCompatWrapper.getInstance();
    mConnectivityManager =
        (ConnectivityManager) service.getSystemService(Context.CONNECTIVITY_SERVICE);
    mEnabledKeyboardSubtypesOfCurrentInputMethod.clear();
    mEnabledLanguagesOfCurrentInputMethod.clear();
    mSystemLocale = null;
    mInputLocale = null;
    mInputLocaleStr = null;
    mCurrentSubtype = null;
    mAllEnabledSubtypesOfCurrentInputMethod = null;
    mVoiceInputWrapper = null;

    final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
    mIsNetworkConnected = (info != null && info.isConnected());
  }
 public boolean isShortcutImeEnabled() {
   if (mShortcutInputMethodInfo == null) {
     return false;
   }
   if (mShortcutSubtype == null) {
     return true;
   }
   // For compatibility, if the shortcut subtype is dummy, we assume the shortcut IME
   // (built-in voice dummy subtype) is available.
   if (!mShortcutSubtype.hasOriginalObject()) {
     return true;
   }
   final boolean allowsImplicitlySelectedSubtypes = true;
   for (final InputMethodSubtypeCompatWrapper enabledSubtype :
       mImm.getEnabledInputMethodSubtypeList(
           mShortcutInputMethodInfo, allowsImplicitlySelectedSubtypes)) {
     if (enabledSubtype.equals(mShortcutSubtype)) {
       return true;
     }
   }
   return false;
 }
 private void updateShortcutIME() {
   if (DBG) {
     Log.d(
         TAG,
         "Update shortcut IME from : "
             + (mShortcutInputMethodInfo == null ? "<null>" : mShortcutInputMethodInfo.getId())
             + ", "
             + (mShortcutSubtype == null
                 ? "<null>"
                 : (getSubtypeLocale(mShortcutSubtype) + ", " + mShortcutSubtype.getMode())));
   }
   // TODO: Update an icon for shortcut IME
   final Map<InputMethodInfoCompatWrapper, List<InputMethodSubtypeCompatWrapper>> shortcuts =
       mImm.getShortcutInputMethodsAndSubtypes();
   mShortcutInputMethodInfo = null;
   mShortcutSubtype = null;
   for (InputMethodInfoCompatWrapper imi : shortcuts.keySet()) {
     List<InputMethodSubtypeCompatWrapper> subtypes = shortcuts.get(imi);
     // TODO: Returns the first found IMI for now. Should handle all shortcuts as
     // appropriate.
     mShortcutInputMethodInfo = imi;
     // TODO: Pick up the first found subtype for now. Should handle all subtypes
     // as appropriate.
     mShortcutSubtype = subtypes.size() > 0 ? subtypes.get(0) : null;
     break;
   }
   if (DBG) {
     Log.d(
         TAG,
         "Update shortcut IME to : "
             + (mShortcutInputMethodInfo == null ? "<null>" : mShortcutInputMethodInfo.getId())
             + ", "
             + (mShortcutSubtype == null
                 ? "<null>"
                 : (getSubtypeLocale(mShortcutSubtype) + ", " + mShortcutSubtype.getMode())));
   }
 }
 // Update all parameters stored in SubtypeSwitcher.
 // Only configuration changed event is allowed to call this because this is heavy.
 private void updateAllParameters() {
   mSystemLocale = mResources.getConfiguration().locale;
   updateSubtype(mImm.getCurrentInputMethodSubtype());
   updateParametersOnStartInputView();
 }