diff --git a/android-aac-enc/src/com/todoroo/aacenc/RecognizerApi.java b/android-aac-enc/src/com/todoroo/aacenc/RecognizerApi.java index 6f09c59e5..e0a41187b 100644 --- a/android-aac-enc/src/com/todoroo/aacenc/RecognizerApi.java +++ b/android-aac-enc/src/com/todoroo/aacenc/RecognizerApi.java @@ -30,6 +30,7 @@ public class RecognizerApi implements RecognitionListener { public static interface RecognizerApiListener { public void onSpeechResult(String result); + public void onSpeechError(int error); } private RecognizerApiListener mListener; @@ -79,7 +80,7 @@ public class RecognizerApi implements RecognitionListener { private ProgressDialog speakPd; private ProgressDialog processingPd; - public void write() { + public void start() { sr.setRecognitionListener(this); Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); @@ -119,6 +120,10 @@ public class RecognizerApi implements RecognitionListener { } } + public void cancel() { + sr.cancel(); + } + public void destroy() { sr.destroy(); } @@ -161,6 +166,7 @@ public class RecognizerApi implements RecognitionListener { sr.cancel(); } }); + processingPd.show(); long delta = System.currentTimeMillis() - speechStarted; @@ -181,6 +187,8 @@ public class RecognizerApi implements RecognitionListener { @Override public void onError(int error) { + if (mListener != null) + mListener.onSpeechError(error); Log.w("Speech Error", "Error code: " + error); } @@ -227,7 +235,7 @@ public class RecognizerApi implements RecognitionListener { findViewById(R.id.write).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - api.write(); + api.start(); } }); @@ -251,5 +259,10 @@ public class RecognizerApi implements RecognitionListener { ((TextView)findViewById(R.id.text)).setText(result); api.convert(M4A_FILE); } + + @Override + public void onSpeechError(int error) { + // TODO Auto-generated method stub + } } } \ No newline at end of file diff --git a/astrid/res/values/strings-premium.xml b/astrid/res/values/strings-premium.xml index 4ca9941e2..0a469d5da 100644 --- a/astrid/res/values/strings-premium.xml +++ b/astrid/res/values/strings-premium.xml @@ -2,4 +2,8 @@ + Network error! Speech recognition requires a network connection to work. + Sorry, I couldn\'t understand that! Please try again. + Sorry, speech recognition encountered an error. Please try again. + diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java index 9d4e8d416..a86ded7b1 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java @@ -575,11 +575,13 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, @Override public void onStart() { super.onStart(); + quickAddBar.setupRecognizerApi(); } @Override public void onStop() { super.onStop(); + quickAddBar.destroyRecognizerApi(); } @Override diff --git a/astrid/src/com/todoroo/astrid/ui/QuickAddBar.java b/astrid/src/com/todoroo/astrid/ui/QuickAddBar.java index 587bb6d15..cf4f9b6b4 100644 --- a/astrid/src/com/todoroo/astrid/ui/QuickAddBar.java +++ b/astrid/src/com/todoroo/astrid/ui/QuickAddBar.java @@ -8,6 +8,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; +import android.speech.SpeechRecognizer; import android.text.TextUtils; import android.util.AttributeSet; import android.view.KeyEvent; @@ -20,6 +21,7 @@ import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; +import android.widget.Toast; import com.timsu.astrid.R; import com.todoroo.aacenc.RecognizerApi; @@ -107,9 +109,6 @@ public class QuickAddBar extends LinearLayout implements RecognizerApiListener { activity = myActivity; fragment = myFragment; - recognizerApi = new RecognizerApi(activity); - recognizerApi.setListener(this); - DependencyInjectionService.getInstance().inject(this); LayoutInflater.from(activity).inflate(R.layout.quick_add_bar, this); @@ -170,7 +169,7 @@ public class QuickAddBar extends LinearLayout implements RecognizerApiListener { currentVoiceFile = Long.toString(DateUtilities.now()); recognizerApi.setTemporaryFile(currentVoiceFile); - recognizerApi.write(); + recognizerApi.start(); } }); @@ -450,11 +449,46 @@ public class QuickAddBar extends LinearLayout implements RecognizerApiListener { return false; } + public void setupRecognizerApi() { + if (recognizerApi != null) + recognizerApi.destroy(); + + recognizerApi = new RecognizerApi(activity); + recognizerApi.setListener(this); + } + + public void destroyRecognizerApi() { + recognizerApi.destroy(); + recognizerApi = null; + } + @Override public void onSpeechResult(String result) { quickAddBox.setText(result); } + @Override + public void onSpeechError(int error) { + recognizerApi.cancel(); + + int errorStr = 0; + switch(error) { + case SpeechRecognizer.ERROR_NETWORK: + case SpeechRecognizer.ERROR_NETWORK_TIMEOUT: + errorStr = R.string.speech_err_network; + break; + case SpeechRecognizer.ERROR_NO_MATCH: + Toast.makeText(activity, R.string.speech_err_no_match, Toast.LENGTH_LONG); + break; + default: + errorStr = R.string.speech_err_default; + break; + } + + if (errorStr > 0) + DialogUtilities.okDialog(activity, activity.getString(errorStr), null); + } + public void hideKeyboard() { InputMethodManager imm = (InputMethodManager) activity.getSystemService( Context.INPUT_METHOD_SERVICE);