Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35f1c6a7 authored by Luca Zanolin's avatar Luca Zanolin
Browse files

Fix resetting the status of VoiceIME when the user is switching from one...

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

Change-Id: Ibbbe3ed6c4e2e7e3c1266daddf109742bd8d97b6
parent bd0de0f1
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -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();
            }
        }
    }

+27 −15
Original line number Diff line number Diff line
@@ -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 {