Fix resetting the status of VoiceIME when the user is switching from one VoiceIME to another Voice IME

Change-Id: Ibbbe3ed6c4e2e7e3c1266daddf109742bd8d97b6
main
Luca Zanolin 2011-01-24 15:45:20 +00:00
parent bd0de0f151
commit 35f1c6a73c
2 changed files with 40 additions and 19 deletions

View File

@ -223,6 +223,9 @@ public class SubtypeSwitcher {
}
mMode = newMode;
}
// If the old mode is voice input, we need to reset or cancel its status.
// We cancel its status when we change mode, while we reset otherwise.
if (isKeyboardMode()) {
if (modeChanged) {
if (VOICE_MODE.equals(oldMode) && mVoiceInput != null) {
@ -233,17 +236,23 @@ public class SubtypeSwitcher {
updateShortcutIME();
mService.onRefreshKeyboard();
}
} else if (isVoiceMode()) {
} else if (isVoiceMode() && mVoiceInput != null) {
if (VOICE_MODE.equals(oldMode)) {
mVoiceInput.reset();
}
// If needsToShowWarningDialog is true, voice input need to show warning before
// show recognition view.
if (languageChanged || modeChanged
|| VoiceIMEConnector.getInstance().needsToShowWarningDialog()) {
if (mVoiceInput != null) {
triggerVoiceIME();
}
}
} else {
Log.w(TAG, "Unknown subtype mode: " + mMode);
if (VOICE_MODE.equals(oldMode) && mVoiceInput != null) {
// We need to reset the voice input to release the resources and to reset its status
// as it is not the current input mode.
mVoiceInput.reset();
}
}
}

View File

@ -130,19 +130,14 @@ public class VoiceInput implements OnClickListener {
private int mState = DEFAULT;
private final static int MSG_CLOSE_ERROR_DIALOG = 1;
private final static int MSG_RESET = 2;
private final static int MSG_RESET = 1;
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_RESET || msg.what == MSG_CLOSE_ERROR_DIALOG) {
if (msg.what == MSG_RESET) {
mState = DEFAULT;
mRecognitionView.finish();
}
if (msg.what == MSG_CLOSE_ERROR_DIALOG) {
mUiListener.onCancelVoice();
}
}
@ -318,7 +313,14 @@ public class VoiceInput implements OnClickListener {
if (DBG) {
Log.d(TAG, "startListening: " + context);
}
mState = DEFAULT;
if (mState != DEFAULT) {
Log.w(TAG, "startListening in the wrong status " + mState);
}
// If everything works ok, the voice input should be already in the correct state. As this
// class can be called by third-party, we call reset just to be on the safe side.
reset();
Locale locale = Locale.getDefault();
String localeString = locale.getLanguage() + "-" + locale.getCountry();
@ -503,6 +505,21 @@ public class VoiceInput implements OnClickListener {
return intent;
}
/**
* Reset the current voice recognition.
*/
public void reset() {
if (mState != DEFAULT) {
mState = DEFAULT;
// Remove all pending tasks (e.g., timers to cancel voice input)
mHandler.removeMessages(MSG_RESET);
mSpeechRecognizer.cancel();
mRecognitionView.finish();
}
}
/**
* Cancel in-progress speech recognition.
*/
@ -518,14 +535,9 @@ public class VoiceInput implements OnClickListener {
mLogger.cancelDuringError();
break;
}
mState = DEFAULT;
// Remove all pending tasks (e.g., timers to cancel voice input)
mHandler.removeMessages(MSG_RESET);
mSpeechRecognizer.cancel();
reset();
mUiListener.onCancelVoice();
mRecognitionView.finish();
}
private int getErrorStringId(int errorType, boolean endpointed) {
@ -560,7 +572,7 @@ public class VoiceInput implements OnClickListener {
mState = ERROR;
mRecognitionView.showError(error);
// Wait a couple seconds and then automatically dismiss message.
mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_CLOSE_ERROR_DIALOG), 2000);
mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_RESET), 2000);
}
private class ImeRecognitionListener implements RecognitionListener {