From 81c52293f84ce475ac6b1661f4a4b92703405247 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Sun, 7 Mar 2010 07:27:05 -0800 Subject: [PATCH] Retain voice input across orientation changes. Fixes 2428545 If an configuration change happens when voice is being captured or processed, it keeps the voice input state intact and reattaches the recognition view to the input method. --- res/layout/recognition_status.xml | 1 + .../android/inputmethod/latin/LatinIME.java | 80 +++++++++---------- .../inputmethod/voice/RecognitionView.java | 28 +++++-- .../android/inputmethod/voice/VoiceInput.java | 8 ++ 4 files changed, 67 insertions(+), 50 deletions(-) diff --git a/res/layout/recognition_status.xml b/res/layout/recognition_status.xml index ea23824a1..1ec06ba9a 100644 --- a/res/layout/recognition_status.xml +++ b/res/layout/recognition_status.xml @@ -67,6 +67,7 @@ android:layout_gravity="center_horizontal" android:visibility="gone" android:indeterminate="true" + android:indeterminateOnly="false" /> diff --git a/src/com/android/inputmethod/latin/LatinIME.java b/src/com/android/inputmethod/latin/LatinIME.java index cb3711cb5..43972d98b 100644 --- a/src/com/android/inputmethod/latin/LatinIME.java +++ b/src/com/android/inputmethod/latin/LatinIME.java @@ -50,6 +50,8 @@ import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewParent; +import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.CompletionInfo; @@ -221,6 +223,7 @@ public class LatinIME extends InputMethodService private VoiceInput mVoiceInput; private VoiceResults mVoiceResults = new VoiceResults(); private long mSwipeTriggerTimeMillis; + private boolean mConfigurationChanging; // For each word, a list of potential replacements, usually from voice. private Map> mWordToSuggestions = @@ -371,7 +374,12 @@ public class LatinIME extends InputMethodService mOrientation = conf.orientation; reloadKeyboards(); } + mConfigurationChanging = true; super.onConfigurationChanged(conf); + if (mRecognizing) { + switchToRecognitionStatusView(); + } + mConfigurationChanging = false; } @Override @@ -387,21 +395,6 @@ public class LatinIME extends InputMethodService return mInputView; } - @Override - public void onInitializeInterface() { - // Create a new view associated with voice input if the old - // view is stuck in another layout (e.g. if switching from - // portrait to landscape while speaking) - // NOTE: This must be done here because for some reason - // onCreateInputView isn't called after an orientation change while - // speech rec is in progress. - if (mVoiceInput != null && mVoiceInput.getView().getParent() != null) { - mVoiceInput.newView(); - } - - super.onInitializeInterface(); - } - @Override public View onCreateCandidatesView() { mKeyboardSwitcher.makeKeyboards(true); @@ -554,20 +547,16 @@ public class LatinIME extends InputMethodService public void onFinishInput() { super.onFinishInput(); - if (VOICE_INSTALLED && mAfterVoiceInput) { - mVoiceInput.logInputEnded(); - } - - if (VOICE_INSTALLED) { + if (VOICE_INSTALLED && !mConfigurationChanging) { + if (mAfterVoiceInput) { + mVoiceInput.logInputEnded(); + } mVoiceInput.flushLogs(); + mVoiceInput.cancel(); } - if (mInputView != null) { mInputView.closing(); } - if (VOICE_INSTALLED && mRecognizing) { - mVoiceInput.cancel(); - } } @Override @@ -654,23 +643,21 @@ public class LatinIME extends InputMethodService @Override public void hideWindow() { - if (mAfterVoiceInput) mVoiceInput.logInputEnded(); if (TRACE) Debug.stopMethodTracing(); if (mOptionsDialog != null && mOptionsDialog.isShowing()) { mOptionsDialog.dismiss(); mOptionsDialog = null; } - if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) { - mVoiceInput.logKeyboardWarningDialogDismissed(); - mVoiceWarningDialog.dismiss(); - mVoiceWarningDialog = null; - } - if (mTutorial != null) { - mTutorial.close(); - mTutorial = null; - } - if (VOICE_INSTALLED & mRecognizing) { - mVoiceInput.cancel(); + if (!mConfigurationChanging) { + if (mAfterVoiceInput) mVoiceInput.logInputEnded(); + if (mVoiceWarningDialog != null && mVoiceWarningDialog.isShowing()) { + mVoiceInput.logKeyboardWarningDialogDismissed(); + mVoiceWarningDialog.dismiss(); + mVoiceWarningDialog = null; + } + if (VOICE_INSTALLED & mRecognizing) { + mVoiceInput.cancel(); + } } super.hideWindow(); TextEntryState.endSession(); @@ -1211,12 +1198,21 @@ public class LatinIME extends InputMethodService } private void switchToRecognitionStatusView() { - mHandler.post(new Runnable() { - public void run() { - mRecognizing = true; - setInputView(mVoiceInput.getView()); - updateInputViewShown(); - }}); + final boolean configChanged = mConfigurationChanging; + mHandler.post(new Runnable() { + public void run() { + mRecognizing = true; + View v = mVoiceInput.getView(); + ViewParent p = v.getParent(); + if (p != null && p instanceof ViewGroup) { + ((ViewGroup)v.getParent()).removeView(v); + } + setInputView(v); + updateInputViewShown(); + if (configChanged) { + mVoiceInput.onConfigurationChanged(); + } + }}); } private void startListening(boolean swipe) { diff --git a/src/com/android/inputmethod/voice/RecognitionView.java b/src/com/android/inputmethod/voice/RecognitionView.java index 5d4a0e0e1..1e99c3cf7 100644 --- a/src/com/android/inputmethod/voice/RecognitionView.java +++ b/src/com/android/inputmethod/voice/RecognitionView.java @@ -16,7 +16,12 @@ package com.android.inputmethod.voice; -import com.android.inputmethod.latin.R; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.ShortBuffer; +import java.util.ArrayList; +import java.util.List; import android.content.ContentResolver; import android.content.Context; @@ -35,14 +40,10 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.MarginLayoutParams; import android.widget.ImageView; +import android.widget.ProgressBar; import android.widget.TextView; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.ShortBuffer; -import java.util.ArrayList; -import java.util.List; +import com.android.inputmethod.latin.R; /** * The user interface for the "Speak now" and "working" states. @@ -103,7 +104,6 @@ public class RecognitionView { LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE); mView = inflater.inflate(R.layout.recognition_status, null); - ContentResolver cr = context.getContentResolver(); mMinMicrophoneLevel = SettingsUtil.getSettingsFloat( cr, SettingsUtil.LATIN_IME_MIN_MICROPHONE_LEVEL, 15.f); @@ -139,6 +139,18 @@ public class RecognitionView { return mView; } + public void restoreState() { + mUiHandler.post(new Runnable() { + public void run() { + // Restart the spinner + if (mState == State.WORKING) { + ((ProgressBar)mProgress).setIndeterminate(false); + ((ProgressBar)mProgress).setIndeterminate(true); + } + } + }); + } + public void showInitializing() { mUiHandler.post(new Runnable() { public void run() { diff --git a/src/com/android/inputmethod/voice/VoiceInput.java b/src/com/android/inputmethod/voice/VoiceInput.java index a2e210536..e881856dd 100644 --- a/src/com/android/inputmethod/voice/VoiceInput.java +++ b/src/com/android/inputmethod/voice/VoiceInput.java @@ -161,6 +161,14 @@ public class VoiceInput implements OnClickListener { mBlacklist.addApp("com.android.setupwizard"); } + /** + * The configuration of the IME changed and may have caused the views to be layed out + * again. Restore the state of the recognition view. + */ + public void onConfigurationChanged() { + mRecognitionView.restoreState(); + } + /** * @return true if field is blacklisted for voice */