Merge "Move shorcut IME related code from SubtypeSwitcher to RichInputMethodManager"
This commit is contained in:
commit
7286667754
6 changed files with 121 additions and 133 deletions
|
@ -163,7 +163,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
currentSettingsValues.mKeyPreviewDismissEndXScale,
|
||||
currentSettingsValues.mKeyPreviewDismissEndYScale,
|
||||
currentSettingsValues.mKeyPreviewDismissDuration);
|
||||
keyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
|
||||
keyboardView.updateShortcutKey(RichInputMethodManager.getInstance().isShortcutImeReady());
|
||||
final boolean subtypeChanged = (oldKeyboard == null)
|
||||
|| !keyboard.mId.mSubtype.equals(oldKeyboard.mId.mSubtype);
|
||||
final int languageOnSpacebarFormatType = mSubtypeSwitcher.getLanguageOnSpacebarFormatType(
|
||||
|
@ -414,9 +414,10 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
|
|||
}
|
||||
|
||||
public void onNetworkStateChanged() {
|
||||
if (mKeyboardView != null) {
|
||||
mKeyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
|
||||
if (mKeyboardView == null) {
|
||||
return;
|
||||
}
|
||||
mKeyboardView.updateShortcutKey(RichInputMethodManager.getInstance().isShortcutImeReady());
|
||||
}
|
||||
|
||||
public int getKeyboardShiftMode() {
|
||||
|
|
|
@ -1424,7 +1424,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
// completely replace #onCodeInput.
|
||||
public void onEvent(@Nonnull final Event event) {
|
||||
if (Constants.CODE_SHORTCUT == event.mKeyCode) {
|
||||
mSubtypeSwitcher.switchToShortcutIME(this);
|
||||
mRichImm.switchToShortcutIME(this);
|
||||
}
|
||||
final InputTransaction completeInputTransaction =
|
||||
mInputLogic.onCodeInput(mSettings.getCurrent(), event,
|
||||
|
@ -1811,7 +1811,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
public void onReceive(final Context context, final Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
|
||||
mSubtypeSwitcher.onNetworkStateChanged(intent);
|
||||
mRichImm.onNetworkStateChanged(intent);
|
||||
} else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
|
||||
AudioAndHapticFeedbackManager.getInstance().onRingerModeChanged();
|
||||
}
|
||||
|
|
|
@ -17,9 +17,15 @@
|
|||
package com.android.inputmethod.latin;
|
||||
|
||||
import static com.android.inputmethod.latin.common.Constants.Subtype.KEYBOARD_MODE;
|
||||
import static com.android.inputmethod.latin.common.Constants.Subtype.ExtraValue.REQ_NETWORK_CONNECTIVITY;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.NetworkInfo;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.IBinder;
|
||||
import android.preference.PreferenceManager;
|
||||
|
@ -29,8 +35,7 @@ import android.view.inputmethod.InputMethodManager;
|
|||
import android.view.inputmethod.InputMethodSubtype;
|
||||
|
||||
import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
|
||||
import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils;
|
||||
import com.android.inputmethod.latin.common.Constants;
|
||||
import com.android.inputmethod.keyboard.KeyboardSwitcher;
|
||||
import com.android.inputmethod.latin.settings.AdditionalFeaturesSettingUtils;
|
||||
import com.android.inputmethod.latin.settings.Settings;
|
||||
import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils;
|
||||
|
@ -41,6 +46,7 @@ import java.util.HashMap;
|
|||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
@ -51,6 +57,7 @@ import javax.annotation.Nonnull;
|
|||
// non final for easy mocking.
|
||||
public class RichInputMethodManager {
|
||||
private static final String TAG = RichInputMethodManager.class.getSimpleName();
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
private RichInputMethodManager() {
|
||||
// This utility class is not publicly instantiable.
|
||||
|
@ -61,6 +68,9 @@ public class RichInputMethodManager {
|
|||
private Context mContext;
|
||||
private InputMethodManagerCompatWrapper mImmWrapper;
|
||||
private InputMethodInfoCache mInputMethodInfoCache;
|
||||
private InputMethodInfo mShortcutInputMethodInfo;
|
||||
private InputMethodSubtype mShortcutSubtype;
|
||||
private boolean mIsNetworkConnected;
|
||||
final HashMap<InputMethodInfo, List<InputMethodSubtype>>
|
||||
mSubtypeListCacheWithImplicitlySelectedSubtypes = new HashMap<>();
|
||||
final HashMap<InputMethodInfo, List<InputMethodSubtype>>
|
||||
|
@ -100,6 +110,11 @@ public class RichInputMethodManager {
|
|||
SubtypeLocaleUtils.init(context);
|
||||
final InputMethodSubtype[] additionalSubtypes = getAdditionalSubtypes(context);
|
||||
setAdditionalInputMethodSubtypes(additionalSubtypes);
|
||||
|
||||
final ConnectivityManager connectivityManager =
|
||||
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
final NetworkInfo info = connectivityManager.getActiveNetworkInfo();
|
||||
mIsNetworkConnected = (info != null && info.isConnected());
|
||||
}
|
||||
|
||||
public InputMethodSubtype[] getAdditionalSubtypes(final Context context) {
|
||||
|
@ -462,4 +477,96 @@ public class RichInputMethodManager {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO: Make this private
|
||||
void updateShortcutIME() {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "Update shortcut IME from : "
|
||||
+ (mShortcutInputMethodInfo == null
|
||||
? "<null>" : mShortcutInputMethodInfo.getId()) + ", "
|
||||
+ (mShortcutSubtype == null ? "<null>" : (
|
||||
mShortcutSubtype.getLocale() + ", " + mShortcutSubtype.getMode())));
|
||||
}
|
||||
// TODO: Update an icon for shortcut IME
|
||||
final Map<InputMethodInfo, List<InputMethodSubtype>> shortcuts =
|
||||
getInputMethodManager().getShortcutInputMethodsAndSubtypes();
|
||||
mShortcutInputMethodInfo = null;
|
||||
mShortcutSubtype = null;
|
||||
for (final InputMethodInfo imi : shortcuts.keySet()) {
|
||||
final List<InputMethodSubtype> 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 (DEBUG) {
|
||||
Log.d(TAG, "Update shortcut IME to : "
|
||||
+ (mShortcutInputMethodInfo == null
|
||||
? "<null>" : mShortcutInputMethodInfo.getId()) + ", "
|
||||
+ (mShortcutSubtype == null ? "<null>" : (
|
||||
mShortcutSubtype.getLocale() + ", " + mShortcutSubtype.getMode())));
|
||||
}
|
||||
}
|
||||
|
||||
public void switchToShortcutIME(final InputMethodService context) {
|
||||
if (mShortcutInputMethodInfo == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String imiId = mShortcutInputMethodInfo.getId();
|
||||
switchToTargetIME(imiId, mShortcutSubtype, context);
|
||||
}
|
||||
|
||||
private void switchToTargetIME(final String imiId, final InputMethodSubtype subtype,
|
||||
final InputMethodService context) {
|
||||
final IBinder token = context.getWindow().getWindow().getAttributes().token;
|
||||
if (token == null) {
|
||||
return;
|
||||
}
|
||||
final InputMethodManager imm = getInputMethodManager();
|
||||
new AsyncTask<Void, Void, Void>() {
|
||||
@Override
|
||||
protected Void doInBackground(Void... params) {
|
||||
imm.setInputMethodAndSubtype(token, imiId, subtype);
|
||||
return null;
|
||||
}
|
||||
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
}
|
||||
|
||||
public boolean isShortcutImeEnabled() {
|
||||
updateShortcutIME();
|
||||
if (mShortcutInputMethodInfo == null) {
|
||||
return false;
|
||||
}
|
||||
if (mShortcutSubtype == null) {
|
||||
return true;
|
||||
}
|
||||
return checkIfSubtypeBelongsToImeAndEnabled(
|
||||
mShortcutInputMethodInfo, mShortcutSubtype);
|
||||
}
|
||||
|
||||
public boolean isShortcutImeReady() {
|
||||
updateShortcutIME();
|
||||
if (mShortcutInputMethodInfo == null) {
|
||||
return false;
|
||||
}
|
||||
if (mShortcutSubtype == null) {
|
||||
return true;
|
||||
}
|
||||
if (mShortcutSubtype.containsExtraValueKey(REQ_NETWORK_CONNECTIVITY)) {
|
||||
return mIsNetworkConnected;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void onNetworkStateChanged(final Intent intent) {
|
||||
final boolean noConnection = intent.getBooleanExtra(
|
||||
ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
|
||||
mIsNetworkConnected = !noConnection;
|
||||
|
||||
KeyboardSwitcher.getInstance().onNetworkStateChanged();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,30 +16,18 @@
|
|||
|
||||
package com.android.inputmethod.latin;
|
||||
|
||||
import static com.android.inputmethod.latin.common.Constants.Subtype.ExtraValue.REQ_NETWORK_CONNECTIVITY;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.NetworkInfo;
|
||||
import android.os.AsyncTask;
|
||||
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.annotations.UsedForTesting;
|
||||
import com.android.inputmethod.keyboard.KeyboardSwitcher;
|
||||
import com.android.inputmethod.keyboard.internal.LanguageOnSpacebarHelper;
|
||||
import com.android.inputmethod.latin.define.DebugFlags;
|
||||
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
@ -54,10 +42,7 @@ public final class SubtypeSwitcher {
|
|||
|
||||
private final LanguageOnSpacebarHelper mLanguageOnSpacebarHelper =
|
||||
new LanguageOnSpacebarHelper();
|
||||
private InputMethodInfo mShortcutInputMethodInfo;
|
||||
private InputMethodSubtype mShortcutSubtype;
|
||||
private RichInputMethodSubtype mCurrentRichInputMethodSubtype;
|
||||
private boolean mIsNetworkConnected;
|
||||
|
||||
public static SubtypeSwitcher getInstance() {
|
||||
return sInstance;
|
||||
|
@ -79,11 +64,6 @@ public final class SubtypeSwitcher {
|
|||
}
|
||||
mResources = context.getResources();
|
||||
mRichImm = RichInputMethodManager.getInstance();
|
||||
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(
|
||||
Context.CONNECTIVITY_SERVICE);
|
||||
|
||||
final NetworkInfo info = connectivityManager.getActiveNetworkInfo();
|
||||
mIsNetworkConnected = (info != null && info.isConnected());
|
||||
|
||||
onSubtypeChanged(mRichImm.getCurrentRawSubtype());
|
||||
updateParametersOnStartInputView();
|
||||
|
@ -97,39 +77,7 @@ public final class SubtypeSwitcher {
|
|||
final List<InputMethodSubtype> enabledSubtypesOfThisIme =
|
||||
mRichImm.getMyEnabledInputMethodSubtypeList(true);
|
||||
mLanguageOnSpacebarHelper.updateEnabledSubtypes(enabledSubtypesOfThisIme);
|
||||
updateShortcutIME();
|
||||
}
|
||||
|
||||
private void updateShortcutIME() {
|
||||
if (DBG) {
|
||||
Log.d(TAG, "Update shortcut IME from : "
|
||||
+ (mShortcutInputMethodInfo == null
|
||||
? "<null>" : mShortcutInputMethodInfo.getId()) + ", "
|
||||
+ (mShortcutSubtype == null ? "<null>" : (
|
||||
mShortcutSubtype.getLocale() + ", " + mShortcutSubtype.getMode())));
|
||||
}
|
||||
// TODO: Update an icon for shortcut IME
|
||||
final Map<InputMethodInfo, List<InputMethodSubtype>> shortcuts =
|
||||
mRichImm.getInputMethodManager().getShortcutInputMethodsAndSubtypes();
|
||||
mShortcutInputMethodInfo = null;
|
||||
mShortcutSubtype = null;
|
||||
for (final InputMethodInfo imi : shortcuts.keySet()) {
|
||||
final List<InputMethodSubtype> 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>" : (
|
||||
mShortcutSubtype.getLocale() + ", " + mShortcutSubtype.getMode())));
|
||||
}
|
||||
mRichImm.updateShortcutIME();
|
||||
}
|
||||
|
||||
// Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function.
|
||||
|
@ -155,76 +103,9 @@ public final class SubtypeSwitcher {
|
|||
mLanguageOnSpacebarHelper.updateIsSystemLanguageSameAsInputLanguage(
|
||||
sameLocale || (sameLanguage && implicitlyEnabled));
|
||||
}
|
||||
updateShortcutIME();
|
||||
mRichImm.updateShortcutIME();
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
// Shortcut IME functions //
|
||||
////////////////////////////
|
||||
|
||||
public void switchToShortcutIME(final InputMethodService context) {
|
||||
if (mShortcutInputMethodInfo == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String imiId = mShortcutInputMethodInfo.getId();
|
||||
switchToTargetIME(imiId, mShortcutSubtype, context);
|
||||
}
|
||||
|
||||
private void switchToTargetIME(final String imiId, final InputMethodSubtype subtype,
|
||||
final InputMethodService context) {
|
||||
final IBinder token = context.getWindow().getWindow().getAttributes().token;
|
||||
if (token == null) {
|
||||
return;
|
||||
}
|
||||
final InputMethodManager imm = mRichImm.getInputMethodManager();
|
||||
new AsyncTask<Void, Void, Void>() {
|
||||
@Override
|
||||
protected Void doInBackground(Void... params) {
|
||||
imm.setInputMethodAndSubtype(token, imiId, subtype);
|
||||
return null;
|
||||
}
|
||||
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
}
|
||||
|
||||
public boolean isShortcutImeEnabled() {
|
||||
updateShortcutIME();
|
||||
if (mShortcutInputMethodInfo == null) {
|
||||
return false;
|
||||
}
|
||||
if (mShortcutSubtype == null) {
|
||||
return true;
|
||||
}
|
||||
return mRichImm.checkIfSubtypeBelongsToImeAndEnabled(
|
||||
mShortcutInputMethodInfo, mShortcutSubtype);
|
||||
}
|
||||
|
||||
public boolean isShortcutImeReady() {
|
||||
updateShortcutIME();
|
||||
if (mShortcutInputMethodInfo == null) {
|
||||
return false;
|
||||
}
|
||||
if (mShortcutSubtype == null) {
|
||||
return true;
|
||||
}
|
||||
if (mShortcutSubtype.containsExtraValueKey(REQ_NETWORK_CONNECTIVITY)) {
|
||||
return mIsNetworkConnected;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void onNetworkStateChanged(final Intent intent) {
|
||||
final boolean noConnection = intent.getBooleanExtra(
|
||||
ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
|
||||
mIsNetworkConnected = !noConnection;
|
||||
|
||||
KeyboardSwitcher.getInstance().onNetworkStateChanged();
|
||||
}
|
||||
|
||||
//////////////////////////////////
|
||||
// Subtype Switching functions //
|
||||
//////////////////////////////////
|
||||
|
||||
public int getLanguageOnSpacebarFormatType(final RichInputMethodSubtype subtype) {
|
||||
return mLanguageOnSpacebarHelper.getLanguageOnSpacebarFormatType(subtype);
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ import android.preference.Preference;
|
|||
|
||||
import com.android.inputmethod.latin.AudioAndHapticFeedbackManager;
|
||||
import com.android.inputmethod.latin.R;
|
||||
import com.android.inputmethod.latin.SubtypeSwitcher;
|
||||
import com.android.inputmethod.latin.RichInputMethodManager;
|
||||
|
||||
/**
|
||||
* "Preferences" settings sub screen.
|
||||
|
@ -49,7 +49,7 @@ public final class PreferencesSettingsFragment extends SubScreenFragment {
|
|||
// When we are called from the Settings application but we are not already running, some
|
||||
// singleton and utility classes may not have been initialized. We have to call
|
||||
// initialization method of these classes here. See {@link LatinIME#onCreate()}.
|
||||
SubtypeSwitcher.init(context);
|
||||
RichInputMethodManager.init(context);
|
||||
|
||||
final boolean showVoiceKeyOption = res.getBoolean(
|
||||
R.bool.config_enable_show_voice_key_option);
|
||||
|
@ -71,7 +71,7 @@ public final class PreferencesSettingsFragment extends SubScreenFragment {
|
|||
super.onResume();
|
||||
final Preference voiceInputKeyOption = findPreference(Settings.PREF_VOICE_INPUT_KEY);
|
||||
if (voiceInputKeyOption != null) {
|
||||
final boolean isShortcutImeEnabled = SubtypeSwitcher.getInstance()
|
||||
final boolean isShortcutImeEnabled = RichInputMethodManager.getInstance()
|
||||
.isShortcutImeEnabled();
|
||||
voiceInputKeyOption.setEnabled(isShortcutImeEnabled);
|
||||
voiceInputKeyOption.setSummary(
|
||||
|
|
|
@ -28,7 +28,6 @@ import com.android.inputmethod.compat.AppWorkaroundsUtils;
|
|||
import com.android.inputmethod.latin.InputAttributes;
|
||||
import com.android.inputmethod.latin.R;
|
||||
import com.android.inputmethod.latin.RichInputMethodManager;
|
||||
import com.android.inputmethod.latin.SubtypeSwitcher;
|
||||
import com.android.inputmethod.latin.utils.AsyncResultHolder;
|
||||
import com.android.inputmethod.latin.utils.ResourceUtils;
|
||||
import com.android.inputmethod.latin.utils.TargetPackageInfoGetterTask;
|
||||
|
@ -140,7 +139,7 @@ public class SettingsValues {
|
|||
DebugSettings.PREF_SLIDING_KEY_INPUT_PREVIEW, true);
|
||||
mShowsVoiceInputKey = needsToShowVoiceInputKey(prefs, res)
|
||||
&& mInputAttributes.mShouldShowVoiceInputKey
|
||||
&& SubtypeSwitcher.getInstance().isShortcutImeEnabled();
|
||||
&& RichInputMethodManager.getInstance().isShortcutImeEnabled();
|
||||
final String autoCorrectionThresholdRawValue = prefs.getString(
|
||||
Settings.PREF_AUTO_CORRECTION_THRESHOLD,
|
||||
res.getString(R.string.auto_correction_threshold_mode_index_modest));
|
||||
|
|
Loading…
Reference in a new issue