Merge "Revert "Guard unused voice functions""
This commit is contained in:
commit
d85bc7221c
3 changed files with 79 additions and 82 deletions
|
@ -17,11 +17,11 @@
|
|||
package com.android.inputmethod.deprecated;
|
||||
|
||||
import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
|
||||
import com.android.inputmethod.compat.InputMethodServiceCompatWrapper;
|
||||
import com.android.inputmethod.deprecated.voice.FieldContext;
|
||||
import com.android.inputmethod.deprecated.voice.Hints;
|
||||
import com.android.inputmethod.deprecated.voice.SettingsUtil;
|
||||
import com.android.inputmethod.deprecated.voice.VoiceInput;
|
||||
import com.android.inputmethod.deprecated.voice.VoiceInputLogger;
|
||||
import com.android.inputmethod.keyboard.KeyboardSwitcher;
|
||||
import com.android.inputmethod.latin.EditingUtils;
|
||||
import com.android.inputmethod.latin.LatinIME;
|
||||
|
@ -71,8 +71,7 @@ import java.util.Map;
|
|||
public class VoiceProxy implements VoiceInput.UiListener {
|
||||
private static final VoiceProxy sInstance = new VoiceProxy();
|
||||
|
||||
public static final boolean VOICE_INSTALLED =
|
||||
!InputMethodServiceCompatWrapper.CAN_HANDLE_ON_CURRENT_INPUT_METHOD_SUBTYPE_CHANGED;
|
||||
public static final boolean VOICE_INSTALLED = true;
|
||||
private static final boolean ENABLE_VOICE_BUTTON = true;
|
||||
private static final String PREF_VOICE_MODE = "voice_mode";
|
||||
// Whether or not the user has used voice input before (and thus, whether to show the
|
||||
|
@ -126,23 +125,24 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
private void initInternal(LatinIME service, SharedPreferences prefs, UIHandler h) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
mService = service;
|
||||
mHandler = h;
|
||||
mMinimumVoiceRecognitionViewHeightPixel = Utils.dipToPixel(
|
||||
Utils.getDipScale(service), RECOGNITIONVIEW_MINIMUM_HEIGHT_DIP);
|
||||
mImm = InputMethodManagerCompatWrapper.getInstance();
|
||||
mSubtypeSwitcher = SubtypeSwitcher.getInstance();
|
||||
mVoiceInput = new VoiceInput(service, this);
|
||||
mHints = new Hints(service, prefs, new Hints.Display() {
|
||||
@Override
|
||||
public void showHint(int viewResource) {
|
||||
View view = LayoutInflater.from(mService).inflate(viewResource, null);
|
||||
mIsShowingHint = true;
|
||||
}
|
||||
});
|
||||
if (VOICE_INSTALLED) {
|
||||
mVoiceInput = new VoiceInput(service, this);
|
||||
mHints = new Hints(service, prefs, new Hints.Display() {
|
||||
@Override
|
||||
public void showHint(int viewResource) {
|
||||
View view = LayoutInflater.from(mService).inflate(viewResource, null);
|
||||
// mService.setCandidatesView(view);
|
||||
// mService.setCandidatesViewShown(true);
|
||||
mIsShowingHint = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private VoiceProxy() {
|
||||
|
@ -170,9 +170,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
|
||||
public void flushAndLogAllTextModificationCounters(int index, CharSequence suggestion,
|
||||
String wordSeparators) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
if (mAfterVoiceInput && mShowingVoiceSuggestions) {
|
||||
mVoiceInput.flushAllTextModificationCounters();
|
||||
// send this intent AFTER logging any prior aggregated edits.
|
||||
|
@ -311,9 +308,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
public void hideVoiceWindow(boolean configurationChanging) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
if (!configurationChanging) {
|
||||
if (mAfterVoiceInput)
|
||||
mVoiceInput.logInputEnded();
|
||||
|
@ -330,9 +324,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
public void setCursorAndSelection(int newSelEnd, int newSelStart) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
if (mAfterVoiceInput) {
|
||||
mVoiceInput.setCursorPos(newSelEnd);
|
||||
mVoiceInput.setSelectionSpan(newSelEnd - newSelStart);
|
||||
|
@ -375,9 +366,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
private void revertVoiceInput() {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
InputConnection ic = mService.getCurrentInputConnection();
|
||||
if (ic != null) ic.commitText("", 1);
|
||||
mService.updateSuggestions();
|
||||
|
@ -405,9 +393,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
public void rememberReplacedWord(CharSequence suggestion,String wordSeparators) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
if (mShowingVoiceSuggestions) {
|
||||
// Retain the replaced word in the alternatives array.
|
||||
String wordToBeReplaced = EditingUtils.getWordAtCursor(
|
||||
|
@ -434,9 +419,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
* @return true if an alternative was found, false otherwise.
|
||||
*/
|
||||
public boolean applyVoiceAlternatives(EditingUtils.SelectedWord touching) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return false;
|
||||
}
|
||||
// Search for result in spoken word alternatives
|
||||
String selectedWord = touching.mWord.toString().trim();
|
||||
if (!mWordToSuggestions.containsKey(selectedWord)) {
|
||||
|
@ -466,9 +448,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
public void handleBackspace() {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
if (mAfterVoiceInput) {
|
||||
// Don't log delete if the user is pressing delete at
|
||||
// the beginning of the text box (hence not deleting anything)
|
||||
|
@ -483,9 +462,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
public void handleCharacter() {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
commitVoiceInput();
|
||||
if (mAfterVoiceInput) {
|
||||
// Assume input length is 1. This assumption fails for smiley face insertions.
|
||||
|
@ -494,9 +470,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
public void handleSeparator() {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
commitVoiceInput();
|
||||
if (mAfterVoiceInput){
|
||||
// Assume input length is 1. This assumption fails for smiley face insertions.
|
||||
|
@ -512,9 +485,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
|
||||
|
||||
public void handleVoiceResults(boolean capitalizeFirstWord) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
mAfterVoiceInput = true;
|
||||
mImmediatelyAfterVoiceInput = true;
|
||||
|
||||
|
@ -690,9 +660,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
public void loadSettings(EditorInfo attribute, SharedPreferences sp) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false);
|
||||
mHasUsedVoiceInputUnsupportedLocale =
|
||||
sp.getBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, false);
|
||||
|
@ -716,9 +683,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
public void onStartInputView(IBinder keyboardViewToken) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
// If keyboardViewToken is null, keyboardView is not attached but voiceView is attached.
|
||||
IBinder windowToken = keyboardViewToken != null ? keyboardViewToken
|
||||
: mVoiceInput.getView().getWindowToken();
|
||||
|
@ -735,18 +699,12 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
}
|
||||
|
||||
public void onAttachedToWindow() {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
// After onAttachedToWindow, we can show the voice warning dialog. See startListening()
|
||||
// above.
|
||||
VoiceInputWrapper.getInstance().setVoiceInput(mVoiceInput, mSubtypeSwitcher);
|
||||
}
|
||||
|
||||
public void onConfigurationChanged(Configuration configuration) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
if (mRecognizing) {
|
||||
switchToRecognitionStatusView(configuration);
|
||||
}
|
||||
|
@ -754,9 +712,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
|
||||
@Override
|
||||
public void onCancelVoice() {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
if (mRecognizing) {
|
||||
if (mSubtypeSwitcher.isVoiceMode()) {
|
||||
// If voice mode is being canceled within LatinIME (i.e. time-out or user
|
||||
|
@ -778,9 +733,6 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
@Override
|
||||
public void onVoiceResults(List<String> candidates,
|
||||
Map<String, List<CharSequence>> alternatives) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
if (!mRecognizing) {
|
||||
return;
|
||||
}
|
||||
|
@ -796,22 +748,59 @@ public class VoiceProxy implements VoiceInput.UiListener {
|
|||
switcher.getEnabledLanguages());
|
||||
}
|
||||
|
||||
// TODO: make this private (proguard issue)
|
||||
public static class VoiceResults {
|
||||
private class VoiceResults {
|
||||
List<String> candidates;
|
||||
Map<String, List<CharSequence>> alternatives;
|
||||
}
|
||||
|
||||
public static class VoiceLoggerWrapper {
|
||||
private static final VoiceLoggerWrapper sLoggerWrapperInstance = new VoiceLoggerWrapper();
|
||||
private VoiceInputLogger mLogger;
|
||||
|
||||
public static VoiceLoggerWrapper getInstance(Context context) {
|
||||
if (sLoggerWrapperInstance.mLogger == null) {
|
||||
// Not thread safe, but it's ok.
|
||||
sLoggerWrapperInstance.mLogger = VoiceInputLogger.getLogger(context);
|
||||
}
|
||||
return sLoggerWrapperInstance;
|
||||
}
|
||||
|
||||
// private for the singleton
|
||||
private VoiceLoggerWrapper() {
|
||||
}
|
||||
|
||||
public void settingsWarningDialogCancel() {
|
||||
mLogger.settingsWarningDialogCancel();
|
||||
}
|
||||
|
||||
public void settingsWarningDialogOk() {
|
||||
mLogger.settingsWarningDialogOk();
|
||||
}
|
||||
|
||||
public void settingsWarningDialogShown() {
|
||||
mLogger.settingsWarningDialogShown();
|
||||
}
|
||||
|
||||
public void settingsWarningDialogDismissed() {
|
||||
mLogger.settingsWarningDialogDismissed();
|
||||
}
|
||||
|
||||
public void voiceInputSettingEnabled(boolean enabled) {
|
||||
if (enabled) {
|
||||
mLogger.voiceInputSettingEnabled();
|
||||
} else {
|
||||
mLogger.voiceInputSettingDisabled();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class VoiceInputWrapper {
|
||||
private static final VoiceInputWrapper sInputWrapperInstance = new VoiceInputWrapper();
|
||||
private VoiceInput mVoiceInput;
|
||||
public static VoiceInputWrapper getInstance() {
|
||||
return sInputWrapperInstance;
|
||||
}
|
||||
private void setVoiceInput(VoiceInput voiceInput, SubtypeSwitcher switcher) {
|
||||
if (!VOICE_INSTALLED) {
|
||||
return;
|
||||
}
|
||||
public void setVoiceInput(VoiceInput voiceInput, SubtypeSwitcher switcher) {
|
||||
if (mVoiceInput == null && voiceInput != null) {
|
||||
mVoiceInput = voiceInput;
|
||||
}
|
||||
|
|
|
@ -542,15 +542,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
|
||||
TextEntryState.reset();
|
||||
|
||||
if (attribute != null) {
|
||||
// Most such things we decide below in initializeInputAttributesAndGetMode, but we need
|
||||
// to know now whether this is a password text field, because we need to know now
|
||||
// whether we want to enable the voice button.
|
||||
mVoiceProxy.resetVoiceStates(
|
||||
InputTypeCompatUtils.isPasswordInputType(attribute.inputType)
|
||||
|| InputTypeCompatUtils.isVisiblePasswordInputType(
|
||||
attribute.inputType));
|
||||
}
|
||||
// Most such things we decide below in initializeInputAttributesAndGetMode, but we need to
|
||||
// know now whether this is a password text field, because we need to know now whether we
|
||||
// want to enable the voice button.
|
||||
final VoiceProxy voiceIme = mVoiceProxy;
|
||||
voiceIme.resetVoiceStates(InputTypeCompatUtils.isPasswordInputType(attribute.inputType)
|
||||
|| InputTypeCompatUtils.isVisiblePasswordInputType(attribute.inputType));
|
||||
|
||||
initializeInputAttributes(attribute);
|
||||
|
||||
|
@ -576,8 +573,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
|
||||
if (mSubtypeSwitcher.isKeyboardMode()) {
|
||||
switcher.loadKeyboard(attribute,
|
||||
mSubtypeSwitcher.isShortcutImeEnabled() && mVoiceProxy.isVoiceButtonEnabled(),
|
||||
mVoiceProxy.isVoiceButtonOnPrimary());
|
||||
mSubtypeSwitcher.isShortcutImeEnabled() && voiceIme.isVoiceButtonEnabled(),
|
||||
voiceIme.isVoiceButtonOnPrimary());
|
||||
switcher.updateShiftState();
|
||||
}
|
||||
|
||||
|
@ -595,7 +592,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
// If we just entered a text field, maybe it has some old text that requires correction
|
||||
mRecorrection.checkRecorrectionOnStart();
|
||||
|
||||
mVoiceProxy.onStartInputView(inputView.getWindowToken());
|
||||
voiceIme.onStartInputView(inputView.getWindowToken());
|
||||
|
||||
if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
|
||||
}
|
||||
|
|
|
@ -304,6 +304,8 @@ public class Settings extends InputMethodSettingsActivity
|
|||
|
||||
private AlertDialog mDialog;
|
||||
|
||||
private VoiceProxy.VoiceLoggerWrapper mVoiceLogger;
|
||||
|
||||
private boolean mOkClicked = false;
|
||||
private String mVoiceModeOff;
|
||||
|
||||
|
@ -347,6 +349,7 @@ public class Settings extends InputMethodSettingsActivity
|
|||
mVoiceModeOff = getString(R.string.voice_mode_off);
|
||||
mVoiceOn = !(prefs.getString(PREF_VOICE_SETTINGS_KEY, mVoiceModeOff)
|
||||
.equals(mVoiceModeOff));
|
||||
mVoiceLogger = VoiceProxy.VoiceLoggerWrapper.getInstance(context);
|
||||
|
||||
mAutoCorrectionThreshold = (ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD);
|
||||
mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTIONS);
|
||||
|
@ -444,7 +447,6 @@ public class Settings extends InputMethodSettingsActivity
|
|||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
@ -539,7 +541,6 @@ public class Settings extends InputMethodSettingsActivity
|
|||
[mVoicePreference.findIndexOfValue(mVoicePreference.getValue())]);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Dialog onCreateDialog(int id) {
|
||||
switch (id) {
|
||||
case VOICE_INPUT_CONFIRM_DIALOG:
|
||||
|
@ -548,9 +549,12 @@ public class Settings extends InputMethodSettingsActivity
|
|||
public void onClick(DialogInterface dialog, int whichButton) {
|
||||
if (whichButton == DialogInterface.BUTTON_NEGATIVE) {
|
||||
mVoicePreference.setValue(mVoiceModeOff);
|
||||
mVoiceLogger.settingsWarningDialogCancel();
|
||||
} else if (whichButton == DialogInterface.BUTTON_POSITIVE) {
|
||||
mOkClicked = true;
|
||||
mVoiceLogger.settingsWarningDialogOk();
|
||||
}
|
||||
updateVoicePreference();
|
||||
}
|
||||
};
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivityInternal())
|
||||
|
@ -579,6 +583,7 @@ public class Settings extends InputMethodSettingsActivity
|
|||
AlertDialog dialog = builder.create();
|
||||
mDialog = dialog;
|
||||
dialog.setOnDismissListener(this);
|
||||
mVoiceLogger.settingsWarningDialogShown();
|
||||
return dialog;
|
||||
default:
|
||||
Log.e(TAG, "unknown dialog " + id);
|
||||
|
@ -588,10 +593,16 @@ public class Settings extends InputMethodSettingsActivity
|
|||
|
||||
@Override
|
||||
public void onDismiss(DialogInterface dialog) {
|
||||
mVoiceLogger.settingsWarningDialogDismissed();
|
||||
if (!mOkClicked) {
|
||||
// This assumes that onPreferenceClick gets called first, and this if the user
|
||||
// agreed after the warning, we set the mOkClicked value to true.
|
||||
mVoicePreference.setValue(mVoiceModeOff);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateVoicePreference() {
|
||||
boolean isChecked = !mVoicePreference.getValue().equals(mVoiceModeOff);
|
||||
mVoiceLogger.voiceInputSettingEnabled(isChecked);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue