VoiceDialerActivity.java revision 538879a6f24ff7305e66d719e751b5d612029bf3
1538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project/* 2538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * 4538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * you may not use this file except in compliance with the License. 6538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * You may obtain a copy of the License at 7538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * 8538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * 10538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * See the License for the specific language governing permissions and 14538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * limitations under the License. 15538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 16538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 17538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectpackage com.android.voicedialer; 18538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 19538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 20538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.app.Activity; 21538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.app.AlertDialog; 22538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.bluetooth.BluetoothHeadset; 23538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.content.Intent; 24538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.content.DialogInterface; 25538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.media.ToneGenerator; 26538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.media.AudioManager; 27538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.os.Bundle; 28538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.os.Handler; 29538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.os.SystemProperties; 30538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.os.Vibrator; 31538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.telephony.PhoneNumberUtils; 32538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.util.Config; 33538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.util.Log; 34538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.view.Gravity; 35538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.view.View; 36538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.widget.TextView; 37538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.widget.Toast; 38538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport com.android.voicedialer.RecognizerEngine; 39538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project//import com.android.voicedialer.VoiceDialerTester; 40538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport java.io.File; 41538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 42538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 43538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project/** 44538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * This class is the user interface of the VoiceDialer application. 45538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Its life cycle is as follows: 46538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <ul> 47538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The user presses the recognize key, and the VoiceDialerActivity starts. 48538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>A {@link RecognizerEngine} instance is created. 49538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The RecognizerEngine signals the user to speak with the Vibrator. 50538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The RecognizerEngine captures, processes, and recognizes speech 51538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * against the names in the contact list. 52538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The RecognizerEngine calls onRecognizerSuccess with a list of 53538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * sentences and corresponding Intents. 54538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>If the list is one element long, the corresponding Intent is dispatched. 55538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>Else an {@link AlertDialog} containing the list of sentences is 56538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * displayed. 57538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The user selects the desired sentence from the list, 58538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * and the corresponding Intent is dispatched. 59538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <ul> 60538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Notes: 61538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <ul> 62538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The RecognizerEngine is kept and reused for the next recognition cycle. 63538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * </ul> 64538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 65538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectpublic class VoiceDialerActivity extends Activity { 66538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 67538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String TAG = "VoiceDialerActivity"; 68538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 69538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String MICROPHONE_EXTRA = "microphone"; 70538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String CONTACTS_EXTRA = "contacts"; 71538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String CODEC_EXTRA = "codec"; 72538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String TONE_EXTRA = "tone"; 73538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 74538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final int FAIL_PAUSE_MSEC = 5000; 75538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 76538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private final static RecognizerEngine mEngine = new RecognizerEngine(); 77538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private VoiceDialerTester mVoiceDialerTester; 78538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private Handler mHandler; 79538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private Thread mRecognizerThread = null; 80538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private AudioManager mAudioManager; 81538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private int mSavedVolume; 82538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private ToneGenerator mToneGenerator; 83538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private BluetoothHeadset mBluetoothHeadset; 84538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 85538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project @Override 86538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project protected void onCreate(Bundle icicle) { 87538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project super.onCreate(icicle); 88538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 89538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onCreate"); 90538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 91538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler = new Handler(); 92538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 93538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // get AudioManager, save current music volume, set music volume to zero 94538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE); 95538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mSavedVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 96538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0); 97538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 98538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // set up ToneGenerator 99538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // currently disabled because it crashes audio input 100538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mToneGenerator = !"0".equals(getArg(TONE_EXTRA)) ? 101538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new ToneGenerator(AudioManager.STREAM_RING, ToneGenerator.MAX_VOLUME) : 102538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project null; 103538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 104538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // open main window 105538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project setTheme(android.R.style.Theme_Dialog); 106538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project setTitle(R.string.title); 107538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project setContentView(R.layout.voice_dialing); 108538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.microphone_view).setVisibility(View.INVISIBLE); 109538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.retry_view).setVisibility(View.INVISIBLE); 110538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.microphone_loading_view).setVisibility(View.VISIBLE); 111538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (RecognizerLogger.isEnabled(this)) { 112538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project ((TextView)findViewById(R.id.substate)).setText(R.string.logging_enabled); 113538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 114538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 115538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // throw up tooltip 116538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (false && !Intent.ACTION_VOICE_COMMAND.equals(getIntent().getAction())) { 117538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project View v = getLayoutInflater().inflate(R.layout.tool_tip, null); 118538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Toast toast = new Toast(this); 119538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project toast.setView(v); 120538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project toast.setDuration(Toast.LENGTH_LONG); 121538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project toast.setGravity(Gravity.BOTTOM, 0, 0); 122538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project toast.show(); 123538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 124538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 125538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // start the tester, if present 126538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester = null; 127538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project File micDir = newFile(getArg(MICROPHONE_EXTRA)); 128538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (micDir != null && micDir.isDirectory()) { 129538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester = new VoiceDialerTester(micDir); 130538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startNextTest(); 131538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 132538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 133538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 134538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // Get handle to BluetoothHeadset object if required 135538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Intent.ACTION_VOICE_COMMAND.equals(getIntent().getAction()) && 136538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // start work in the BluetoothHeadsetClient onServiceConnected() callback 137538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project getIntent().getIntExtra(Intent.EXTRA_AUDIO_ROUTE, -1) == 138538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project AudioManager.ROUTE_BLUETOOTH_SCO) { 139538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset = new BluetoothHeadset(this, mBluetoothHeadsetServiceListener); 140538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } else { 141538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startWork(); 142538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 143538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 144538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 145538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private BluetoothHeadset.ServiceListener mBluetoothHeadsetServiceListener = 146538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new BluetoothHeadset.ServiceListener() { 147538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onServiceConnected() { 148538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mBluetoothHeadset != null) { 149538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset.startVoiceRecognition(); 150538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startWork(); 151538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 152538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 153538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onServiceDisconnected() {} 154538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 155538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 156538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private void startWork() { 157538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // prompt the user with a beep 158538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project final int msec = playSound(ToneGenerator.TONE_PROP_PROMPT); 159538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 160538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // start the engine after the beep 161538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread = new Thread() { 162538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 163538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onCreate.Runnable.run"); 164538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project try { 165538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Thread.sleep(msec); 166538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } catch (InterruptedException e) { 167538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 168538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 169538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mToneGenerator != null) mToneGenerator.stopTone(); 170538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mEngine.recognize(VoiceDialerActivity.this, 171538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project newFile(getArg(MICROPHONE_EXTRA)), 172538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project newFile(getArg(CONTACTS_EXTRA)), 173538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project getArg(CODEC_EXTRA)); 174538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 175538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 176538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread.start(); 177538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 178538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 179538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 180538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Returns a Bundle with the result for a test run 181538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @return Bundle or null if the test is in progress 182538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 183538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public Bundle getRecognitionResult() { 184538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return null; 185538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 186538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 187538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private String getArg(String name) { 188538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (name == null) return null; 189538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String arg = getIntent().getStringExtra(name); 190538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (arg != null) return arg; 191538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project arg = SystemProperties.get("app.voicedialer." + name); 192538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return arg != null && arg.length() > 0 ? arg : null; 193538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 194538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 195538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static File newFile(String name) { 196538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return name != null ? new File(name) : null; 197538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 198538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 199538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private void startNextTest() { 200538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.postDelayed(new Runnable() { 201538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 202538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mVoiceDialerTester == null) { 203538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 204538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 205538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (!mVoiceDialerTester.stepToNextTest()) { 206538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester.report(); 207538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project notifyText("Test completed!"); 208538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 209538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 210538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 211538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project File microphone = mVoiceDialerTester.getWavFile(); 212538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project File contacts = newFile(getArg(CONTACTS_EXTRA)); 213538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String codec = getArg(CODEC_EXTRA); 214538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project notifyText("Testing\n" + microphone + "\n" + contacts); 215538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mEngine.recognize(VoiceDialerActivity.this, 216538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project microphone, contacts, codec); 217538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 218538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }, 2000); 219538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 220538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 221538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private int playSound(int toneType) { 222538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project int msecDelay = 1; 223538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 224538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // use the MediaPlayer to prompt the user 225538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mToneGenerator != null) { 226538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mToneGenerator.startTone(toneType); 227538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project msecDelay = StrictMath.max(msecDelay, 300); 228538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 229538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 230538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // use the Vibrator to prompt the user 231538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mAudioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER)) { 232538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project final int VIBRATOR_TIME = 150; 233538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project final int VIBRATOR_GUARD_TIME = 150; 234538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Vibrator vibrator = new Vibrator(); 235538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project vibrator.vibrate(VIBRATOR_TIME); 236538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project msecDelay = StrictMath.max(msecDelay, 237538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project VIBRATOR_TIME + VIBRATOR_GUARD_TIME); 238538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 239538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 240538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return msecDelay; 241538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 242538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 243538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project @Override 244538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project protected void onPause() { 245538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project super.onPause(); 246538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 247538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onPause"); 248538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 249538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // shut down bluetooth, if it exists 250538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mBluetoothHeadset != null) { 251538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset.stopVoiceRecognition(); 252538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset.close(); 253538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset = null; 254538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 255538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 256538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // restore volume, if changed 257538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mSavedVolume > 0) { 258538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mSavedVolume, 0); 259538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mSavedVolume = 0; 260538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 261538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 262538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // no more tester 263538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester = null; 264538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 265538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // shut down recognizer and wait for the thread to complete 266538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mRecognizerThread != null) { 267538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread.interrupt(); 268538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project try { 269538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread.join(); 270538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } catch (InterruptedException e) { 271538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onPause mRecognizerThread.join exception " + e); 272538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 273538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread = null; 274538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 275538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 276538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // clean up UI 277538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.removeCallbacks(mMicFlasher); 278538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.removeMessages(0); 279538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 280538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // clean up ToneGenerator 281538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mToneGenerator != null) { 282538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mToneGenerator.release(); 283538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mToneGenerator = null; 284538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 285538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 286538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // bye 287538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 288538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 289538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 290538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private void notifyText(final CharSequence msg) { 291538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Toast.makeText(VoiceDialerActivity.this, msg, Toast.LENGTH_SHORT).show(); 292538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 293538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 294538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private Runnable mMicFlasher = new Runnable() { 295538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project int visible = View.VISIBLE; 296538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 297538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 298538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.microphone_view).setVisibility(visible); 299538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.state).setVisibility(visible); 300538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project visible = visible == View.VISIBLE ? View.INVISIBLE : View.VISIBLE; 301538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.postDelayed(this, 750); 302538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 303538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 304538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 305538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 306538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Called by the {@link RecognizerEngine} when the microphone is started. 307538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 308538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onMicrophoneStart() { 309538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onMicrophoneStart"); 310538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 311538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mVoiceDialerTester != null) return; 312538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 313538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.post(new Runnable() { 314538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 315538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.microphone_loading_view).setVisibility(View.INVISIBLE); 316538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project ((TextView)findViewById(R.id.state)).setText(R.string.listening); 317538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.post(mMicFlasher); 318538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 319538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }); 320538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 321538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 322538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 323538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Called by the {@link RecognizerEngine} if the recognizer fails. 324538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 325538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onRecognitionFailure(final String msg) { 326538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onRecognitionFailure " + msg); 327538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 328538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // get work off UAPI thread 329538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.post(new Runnable() { 330538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 331538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // failure, so beep about it 332538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project playSound(ToneGenerator.TONE_PROP_NACK); 333538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 334538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.removeCallbacks(mMicFlasher); 335538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project ((TextView)findViewById(R.id.state)).setText(R.string.please_try_again); 336538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.state).setVisibility(View.VISIBLE); 337538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.microphone_view).setVisibility(View.INVISIBLE); 338538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.retry_view).setVisibility(View.VISIBLE); 339538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 340538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mVoiceDialerTester != null) { 341538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester.onRecognitionFailure(msg); 342538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startNextTest(); 343538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 344538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 345538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 346538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.postDelayed(new Runnable() { 347538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 348538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 349538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 350538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }, FAIL_PAUSE_MSEC); 351538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 352538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }); 353538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 354538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 355538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 356538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Called by the {@link RecognizerEngine} on an internal error. 357538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 358538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onRecognitionError(final String msg) { 359538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onRecognitionError " + msg); 360538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 361538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // get work off UAPI thread 362538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.post(new Runnable() { 363538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 364538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // error, so beep about it 365538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project playSound(ToneGenerator.TONE_PROP_NACK); 366538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 367538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.removeCallbacks(mMicFlasher); 368538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project ((TextView)findViewById(R.id.state)).setText(R.string.please_try_again); 369538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project ((TextView)findViewById(R.id.substate)).setText(R.string.recognition_error); 370538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.state).setVisibility(View.VISIBLE); 371538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.microphone_view).setVisibility(View.INVISIBLE); 372538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.retry_view).setVisibility(View.VISIBLE); 373538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 374538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mVoiceDialerTester != null) { 375538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester.onRecognitionError(msg); 376538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startNextTest(); 377538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 378538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 379538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 380538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.postDelayed(new Runnable() { 381538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 382538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 383538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 384538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }, FAIL_PAUSE_MSEC); 385538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 386538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }); 387538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 388538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 389538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 390538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Called by the {@link RecognizerEngine} when is succeeds. If there is 391538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * only one item, then the Intent is dispatched immediately. 392538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * If there are more, then an AlertDialog is displayed and the user is 393538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * prompted to select. 394538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param intents a list of Intents corresponding to the sentences. 395538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 396538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onRecognitionSuccess(final Intent[] intents) { 397538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onRecognitionSuccess " + intents.length); 398538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 399538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.post(new Runnable() { 400538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 401538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 402538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // success, so beep about it 403538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project playSound(ToneGenerator.TONE_PROP_ACK); 404538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 405538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.removeCallbacks(mMicFlasher); 406538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 407538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // only one item, so just launch 408538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /* 409538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (intents.length == 1 && mVoiceDialerTester == null) { 410538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // start the Intent 411538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startActivityHelp(intents[0]); 412538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 413538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 414538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 415538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 416538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 417538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project DialogInterface.OnClickListener clickListener = 418538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new DialogInterface.OnClickListener() { 419538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 420538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 421538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "clickListener.onClick " + which); 422538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startActivityHelp(intents[which]); 423538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project dialog.dismiss(); 424538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 425538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 426538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 427538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 428538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 429538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project DialogInterface.OnCancelListener cancelListener = 430538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new DialogInterface.OnCancelListener() { 431538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 432538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onCancel(DialogInterface dialog) { 433538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "cancelListener.onCancel"); 434538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project dialog.dismiss(); 435538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 436538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 437538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 438538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 439538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 440538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project DialogInterface.OnClickListener positiveListener = 441538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new DialogInterface.OnClickListener() { 442538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 443538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 444538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "positiveListener.onClick " + which); 445538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (intents.length == 1 && which == -1) which = 0; 446538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startActivityHelp(intents[which]); 447538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project dialog.dismiss(); 448538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 449538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 450538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 451538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 452538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 453538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project DialogInterface.OnClickListener negativeListener = 454538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new DialogInterface.OnClickListener() { 455538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 456538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 457538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "negativeListener.onClick " + which); 458538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project dialog.dismiss(); 459538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 460538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 461538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 462538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 463538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 464538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String[] sentences = new String[intents.length]; 465538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project for (int i = 0; i < intents.length; i++) { 466538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project sentences[i] = intents[i].getStringExtra( 467538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project RecognizerEngine.SENTENCE_EXTRA); 468538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 469538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 470538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project final AlertDialog alertDialog = intents.length > 1 ? 471538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new AlertDialog.Builder(VoiceDialerActivity.this) 472538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .setTitle(R.string.title) 473538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .setItems(sentences, clickListener) 474538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .setOnCancelListener(cancelListener) 475538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .setNegativeButton(android.R.string.cancel, negativeListener) 476538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .show() 477538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project : 478538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new AlertDialog.Builder(VoiceDialerActivity.this) 479538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .setTitle(R.string.title) 480538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .setItems(sentences, clickListener) 481538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .setOnCancelListener(cancelListener) 482538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .setPositiveButton(android.R.string.ok, positiveListener) 483538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .setNegativeButton(android.R.string.cancel, negativeListener) 484538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project .show(); 485538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 486538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // start the next test 487538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mVoiceDialerTester != null) { 488538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester.onRecognitionSuccess(intents); 489538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startNextTest(); 490538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.postDelayed(new Runnable() { 491538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 492538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project alertDialog.dismiss(); 493538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 494538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }, 2000); 495538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 496538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 497538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 498538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // post a Toast if not real contacts or microphone 499538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private void startActivityHelp(Intent intent) { 500538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (getArg(MICROPHONE_EXTRA) == null && 501538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project getArg(CONTACTS_EXTRA) == null) { 502538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startActivity(intent); 503538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } else { 504538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project notifyText(intent. 505538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project getStringExtra(RecognizerEngine.SENTENCE_EXTRA) + 506538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project "\n" + intent.toString()); 507538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 508538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 509538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 510538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 511538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }); 512538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 513538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 514538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 515538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project @Override 516538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project protected void onDestroy() { 517538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project super.onDestroy(); 518538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 519538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 520538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static class VoiceDialerTester { 521538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public VoiceDialerTester(File f) { 522538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 523538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 524538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public boolean stepToNextTest() { 525538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return false; 526538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 527538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 528538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void report() { 529538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 530538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 531538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public File getWavFile() { 532538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return null; 533538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 534538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 535538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onRecognitionFailure(String msg) { 536538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 537538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 538538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onRecognitionError(String err) { 539538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 540538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 541538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onRecognitionSuccess(Intent[] intents) { 542538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 543538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 544538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 545538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project} 546