/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.voice; import java.io.IOException; import java.util.List; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.speech.RecognizerIntent; import android.speech.SpeechRecognizer; import android.support.v4.app.Fragment; import android.widget.EditText; import android.widget.ImageButton; import android.widget.Toast; import com.timsu.astrid.R; import com.todoroo.aacenc.ContextManager; import com.todoroo.aacenc.RecognizerApi; import com.todoroo.aacenc.RecognizerApi.RecognizerApiListener; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.utility.Constants; @TargetApi(8) public class VoiceRecognizer { protected RecognizerApi recognizerApi; protected VoiceInputAssistant voiceInputAssistant; public static boolean speechRecordingAvailable(Context context) { return ActFmPreferenceService.isPremiumUser() && AndroidUtilities.getSdkVersion() >= 8 && SpeechRecognizer.isRecognitionAvailable(context); } /** * Call this to see if your phone supports voiceinput in its current configuration. * If this method returns false, it could also mean that Google Voicesearch is simply * not installed. * If this method returns true, internal use of it enables the registered microphone-button. * * @return whether this phone supports voiceinput */ public static boolean voiceInputAvailable(Context context) { PackageManager pm = context.getPackageManager(); List<ResolveInfo> activities = pm.queryIntentActivities( new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); return (activities.size() != 0); } private VoiceRecognizer() { // } private static VoiceRecognizer instance = null; public static VoiceRecognizer instantiateVoiceRecognizer(Context context, RecognizerApiListener listener, ImageButton voiceAddButton) { synchronized(VoiceRecognizer.class) { if (instance == null) instance = new VoiceRecognizer(); } if (speechRecordingAvailable(context)) { if (instance.recognizerApi != null) instance.recognizerApi.destroy(); instance.recognizerApi = new RecognizerApi(context); instance.recognizerApi.setListener(listener); } else { instance.voiceInputAssistant = new VoiceInputAssistant(voiceAddButton); } return instance; } public void startVoiceRecognition(Context context, Fragment fragment, String currentVoiceFile) { if (speechRecordingAvailable(context) && recognizerApi != null) { recognizerApi.setTemporaryFile(currentVoiceFile); recognizerApi.start(Constants.PACKAGE, context.getString(R.string.audio_speak_now), context.getString(R.string.audio_encoding)); } else { int prompt = R.string.voice_edit_title_prompt; if (Preferences.getBoolean(R.string.p_voiceInputCreatesTask, false)) prompt = R.string.voice_create_prompt; voiceInputAssistant.startVoiceRecognitionActivity(fragment, prompt); } } public boolean handleActivityResult(int requestCode, int resultCode, Intent data, EditText textField) { if (instance != null && instance.voiceInputAssistant != null) return instance.voiceInputAssistant.handleActivityResult(requestCode, resultCode, data, textField); return false; } public void destroyRecognizerApi() { if (instance != null && instance.recognizerApi != null) { instance.recognizerApi.destroy(); instance.recognizerApi = null; } } public void cancel() { if (instance != null && instance.recognizerApi != null) instance.recognizerApi.cancel(); } public void convert(String filePath) { if (instance != null && instance.recognizerApi != null) { try { instance.recognizerApi.convert(filePath); } catch (IOException e) { Toast.makeText(ContextManager.getContext(), R.string.audio_err_encoding, Toast.LENGTH_LONG).show(); } } } }