Use setInputMethodAndSubtype and shortcutIME API instead of changing only view to Voice Input
Bug: 3201828 Change-Id: If452f0b2d19eeb1f8f6e7e40539ba4bac6759fcdmain
parent
3f7eac0d2c
commit
20cdb37bd0
|
@ -1120,9 +1120,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
case Keyboard.CODE_CAPSLOCK:
|
||||
switcher.toggleCapsLock();
|
||||
break;
|
||||
case Keyboard.CODE_VOICE: /* was a button press, was not a swipe */
|
||||
mVoiceConnector.startListening(false,
|
||||
mKeyboardSwitcher.getInputView().getWindowToken(), mConfigurationChanging);
|
||||
case Keyboard.CODE_VOICE:
|
||||
mSubtypeSwitcher.switchToShortcutIME();
|
||||
break;
|
||||
case Keyboard.CODE_TAB:
|
||||
handleTab();
|
||||
|
|
|
@ -17,16 +17,21 @@
|
|||
package com.android.inputmethod.latin;
|
||||
|
||||
import com.android.inputmethod.keyboard.Keyboard;
|
||||
import com.android.inputmethod.keyboard.KeyboardSwitcher;
|
||||
import com.android.inputmethod.voice.SettingsUtil;
|
||||
import com.android.inputmethod.voice.VoiceIMEConnector;
|
||||
import com.android.inputmethod.voice.VoiceInput;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.IBinder;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.inputmethod.InputMethodInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.view.inputmethod.InputMethodSubtype;
|
||||
|
||||
|
@ -34,6 +39,7 @@ import java.util.ArrayList;
|
|||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
public class SubtypeSwitcher {
|
||||
// This flag indicates if we support language switching by swipe on space bar.
|
||||
|
@ -59,14 +65,16 @@ public class SubtypeSwitcher {
|
|||
|
||||
/*-----------------------------------------------------------*/
|
||||
// Variants which should be changed only by reload functions.
|
||||
private boolean mNeedsToDisplayLanguage;
|
||||
private boolean mIsSystemLanguageSameAsInputLanguage;
|
||||
private InputMethodInfo mShortcutInfo;
|
||||
private InputMethodSubtype mShortcutSubtype;
|
||||
private List<InputMethodSubtype> mAllEnabledSubtypesOfCurrentInputMethod;
|
||||
private Locale mSystemLocale;
|
||||
private Locale mInputLocale;
|
||||
private String mInputLocaleStr;
|
||||
private String mMode;
|
||||
private List<InputMethodSubtype> mAllEnabledSubtypesOfCurrentInputMethod;
|
||||
private VoiceInput mVoiceInput;
|
||||
private boolean mNeedsToDisplayLanguage;
|
||||
private boolean mIsSystemLanguageSameAsInputLanguage;
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
public static SubtypeSwitcher getInstance() {
|
||||
|
@ -117,6 +125,7 @@ public class SubtypeSwitcher {
|
|||
} else {
|
||||
updateEnabledSubtypes();
|
||||
}
|
||||
updateShortcutIME();
|
||||
}
|
||||
|
||||
// Reload enabledSubtypes from the framework.
|
||||
|
@ -149,6 +158,22 @@ public class SubtypeSwitcher {
|
|||
}
|
||||
}
|
||||
|
||||
private void updateShortcutIME() {
|
||||
// TODO: Update an icon for shortcut IME
|
||||
Map<InputMethodInfo, List<InputMethodSubtype>> shortcuts =
|
||||
mImm.getShortcutInputMethodsAndSubtypes();
|
||||
for (InputMethodInfo imi: shortcuts.keySet()) {
|
||||
List<InputMethodSubtype> subtypes = shortcuts.get(imi);
|
||||
// TODO: Returns the first found IMI for now. Should handle all shortcuts as
|
||||
// appropriate.
|
||||
mShortcutInfo = 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;
|
||||
}
|
||||
}
|
||||
|
||||
// Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function.
|
||||
public void updateSubtype(InputMethodSubtype newSubtype) {
|
||||
final String newLocale;
|
||||
|
@ -197,8 +222,7 @@ public class SubtypeSwitcher {
|
|||
if (languageChanged || modeChanged
|
||||
|| VoiceIMEConnector.getInstance().needsToShowWarningDialog()) {
|
||||
if (mVoiceInput != null) {
|
||||
// TODO: Call proper function to trigger VoiceIME
|
||||
mService.onKey(Keyboard.CODE_VOICE, null, 0, 0);
|
||||
triggerVoiceIME();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -233,6 +257,48 @@ public class SubtypeSwitcher {
|
|||
&& mIsSystemLanguageSameAsInputLanguage);
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
// Shortcut IME functions //
|
||||
////////////////////////////
|
||||
|
||||
public void switchToShortcutIME() {
|
||||
IBinder token = mService.getWindow().getWindow().getAttributes().token;
|
||||
if (token == null || mShortcutInfo == null) {
|
||||
return;
|
||||
}
|
||||
mImm.setInputMethodAndSubtype(token, mShortcutInfo.getId(), mShortcutSubtype);
|
||||
}
|
||||
|
||||
public Drawable getShortcutIcon() {
|
||||
return getSubtypeIcon(mShortcutInfo, mShortcutSubtype);
|
||||
}
|
||||
|
||||
private Drawable getSubtypeIcon(InputMethodInfo imi, InputMethodSubtype subtype) {
|
||||
final PackageManager pm = mService.getPackageManager();
|
||||
if (imi != null) {
|
||||
final String imiPackageName = imi.getPackageName();
|
||||
if (DBG) {
|
||||
Log.d(TAG, "Update icons of IME: " + imiPackageName + ","
|
||||
+ subtype.getLocale() + "," + subtype.getMode());
|
||||
}
|
||||
if (subtype != null) {
|
||||
return pm.getDrawable(imiPackageName, subtype.getIconResId(),
|
||||
imi.getServiceInfo().applicationInfo);
|
||||
} else if (imi.getSubtypes().size() > 0 && imi.getSubtypes().get(0) != null) {
|
||||
return pm.getDrawable(imiPackageName,
|
||||
imi.getSubtypes().get(0).getIconResId(),
|
||||
imi.getServiceInfo().applicationInfo);
|
||||
} else {
|
||||
try {
|
||||
return pm.getApplicationInfo(imiPackageName, 0).loadIcon(pm);
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
Log.w(TAG, "IME can't be found: " + imiPackageName);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
//////////////////////////////////
|
||||
// Language Switching functions //
|
||||
//////////////////////////////////
|
||||
|
@ -351,7 +417,7 @@ public class SubtypeSwitcher {
|
|||
if (DBG) {
|
||||
Log.d(TAG, "Set and call voice input.");
|
||||
}
|
||||
mService.onKey(Keyboard.CODE_VOICE, null, 0, 0);
|
||||
triggerVoiceIME();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -362,6 +428,11 @@ public class SubtypeSwitcher {
|
|||
return VOICE_MODE.equals(mMode);
|
||||
}
|
||||
|
||||
private void triggerVoiceIME() {
|
||||
VoiceIMEConnector.getInstance().startListening(false,
|
||||
KeyboardSwitcher.getInstance().getInputView().getWindowToken(), false);
|
||||
}
|
||||
|
||||
//////////////////////////////////////
|
||||
// SpaceBar Language Switch support //
|
||||
//////////////////////////////////////
|
||||
|
|
Loading…
Reference in New Issue