VoiceDialerActivity.java revision 7a55150b308ed03d41091e4c3ac693d6eb0ab145
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/** 447a55150b308ed03d41091e4c3ac693d6eb0ab145mah * TODO: get rid of the anonymous classes 457a55150b308ed03d41091e4c3ac693d6eb0ab145mah * TODO: merge with BluetootchVoicedialerActivity 467a55150b308ed03d41091e4c3ac693d6eb0ab145mah * 47538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * This class is the user interface of the VoiceDialer application. 48538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Its life cycle is as follows: 49538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <ul> 50538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The user presses the recognize key, and the VoiceDialerActivity starts. 51538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>A {@link RecognizerEngine} instance is created. 52538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The RecognizerEngine signals the user to speak with the Vibrator. 53538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The RecognizerEngine captures, processes, and recognizes speech 54538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * against the names in the contact list. 55538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The RecognizerEngine calls onRecognizerSuccess with a list of 56538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * sentences and corresponding Intents. 57538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>If the list is one element long, the corresponding Intent is dispatched. 58538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>Else an {@link AlertDialog} containing the list of sentences is 59538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * displayed. 60538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The user selects the desired sentence from the list, 61538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * and the corresponding Intent is dispatched. 62538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <ul> 63538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Notes: 64538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <ul> 65538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * <li>The RecognizerEngine is kept and reused for the next recognition cycle. 66538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * </ul> 67538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 68538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectpublic class VoiceDialerActivity extends Activity { 69538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 70538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String TAG = "VoiceDialerActivity"; 71538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 72538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String MICROPHONE_EXTRA = "microphone"; 73538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String CONTACTS_EXTRA = "contacts"; 74538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String TONE_EXTRA = "tone"; 75632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 76538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final int FAIL_PAUSE_MSEC = 5000; 7764c64e7c25e6efe31fa53369ec49db442b68ff9amah private static final int SAMPLE_RATE = 11025; 78538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 7964c64e7c25e6efe31fa53369ec49db442b68ff9amah private final static CommandRecognizerEngine mCommandEngine = new CommandRecognizerEngine(); 8064c64e7c25e6efe31fa53369ec49db442b68ff9amah private CommandRecognizerClient mCommandClient; 81538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private VoiceDialerTester mVoiceDialerTester; 82538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private Handler mHandler; 83538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private Thread mRecognizerThread = null; 84538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private AudioManager mAudioManager; 85538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private ToneGenerator mToneGenerator; 86538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private BluetoothHeadset mBluetoothHeadset; 87538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 88538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project @Override 89538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project protected void onCreate(Bundle icicle) { 90538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project super.onCreate(icicle); 91538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 92538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onCreate"); 93538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler = new Handler(); 94538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE); 95be1584eb7e59c391a45aa21fb5e65ada1aedae9aDave Sparks 96be1584eb7e59c391a45aa21fb5e65ada1aedae9aDave Sparks // tell music player to shut up so we can hear 97be1584eb7e59c391a45aa21fb5e65ada1aedae9aDave Sparks Intent i = new Intent("com.android.music.musicservicecommand"); 98be1584eb7e59c391a45aa21fb5e65ada1aedae9aDave Sparks i.putExtra("command", "pause"); 99be1584eb7e59c391a45aa21fb5e65ada1aedae9aDave Sparks sendBroadcast(i); 100632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 101538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // set up ToneGenerator 102538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // currently disabled because it crashes audio input 103538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mToneGenerator = !"0".equals(getArg(TONE_EXTRA)) ? 104538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new ToneGenerator(AudioManager.STREAM_RING, ToneGenerator.MAX_VOLUME) : 105538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project null; 106538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 10764c64e7c25e6efe31fa53369ec49db442b68ff9amah mCommandEngine.setContactsFile(newFile(getArg(CONTACTS_EXTRA))); 10864c64e7c25e6efe31fa53369ec49db442b68ff9amah mCommandClient = new CommandRecognizerClient(); 10964c64e7c25e6efe31fa53369ec49db442b68ff9amah 110538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // open main window 111538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project setTheme(android.R.style.Theme_Dialog); 112538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project setTitle(R.string.title); 113538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project setContentView(R.layout.voice_dialing); 114538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.microphone_view).setVisibility(View.INVISIBLE); 115538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.retry_view).setVisibility(View.INVISIBLE); 116538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.microphone_loading_view).setVisibility(View.VISIBLE); 117538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (RecognizerLogger.isEnabled(this)) { 118538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project ((TextView)findViewById(R.id.substate)).setText(R.string.logging_enabled); 119538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 120632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 121538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // throw up tooltip 122538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (false && !Intent.ACTION_VOICE_COMMAND.equals(getIntent().getAction())) { 123538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project View v = getLayoutInflater().inflate(R.layout.tool_tip, null); 124538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Toast toast = new Toast(this); 125538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project toast.setView(v); 126538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project toast.setDuration(Toast.LENGTH_LONG); 127538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project toast.setGravity(Gravity.BOTTOM, 0, 0); 128538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project toast.show(); 129538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 130538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 131538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // start the tester, if present 132538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester = null; 133538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project File micDir = newFile(getArg(MICROPHONE_EXTRA)); 134538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (micDir != null && micDir.isDirectory()) { 135538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester = new VoiceDialerTester(micDir); 136538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startNextTest(); 137538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 138538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 139538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 140538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // Get handle to BluetoothHeadset object if required 141d54589686988883dc2b85e972cc3d2a565484aa5Nick Pelly if (!BluetoothHeadset.DISABLE_BT_VOICE_DIALING && 142d54589686988883dc2b85e972cc3d2a565484aa5Nick Pelly Intent.ACTION_VOICE_COMMAND.equals(getIntent().getAction())) { 143538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // start work in the BluetoothHeadsetClient onServiceConnected() callback 144538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset = new BluetoothHeadset(this, mBluetoothHeadsetServiceListener); 145538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } else { 146538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project startWork(); 147538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 148538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 149538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 150538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private BluetoothHeadset.ServiceListener mBluetoothHeadsetServiceListener = 151538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new BluetoothHeadset.ServiceListener() { 152538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onServiceConnected() { 153632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project if (mBluetoothHeadset != null && 154632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project mBluetoothHeadset.getState() == BluetoothHeadset.STATE_CONNECTED) { 155538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset.startVoiceRecognition(); 156538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 157632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project startWork(); 158538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 159538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onServiceDisconnected() {} 160538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 161538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 162538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private void startWork() { 163cd84f92b28c4d6fc55b76bce50434dd858f0d7d2Dave Sparks // start the engine 164538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread = new Thread() { 165538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 166538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onCreate.Runnable.run"); 16764c64e7c25e6efe31fa53369ec49db442b68ff9amah mCommandEngine.recognize(mCommandClient, VoiceDialerActivity.this, 168538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project newFile(getArg(MICROPHONE_EXTRA)), 16964c64e7c25e6efe31fa53369ec49db442b68ff9amah SAMPLE_RATE); 170538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 171538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 172538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread.start(); 173538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 174632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 175538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 176538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Returns a Bundle with the result for a test run 177538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @return Bundle or null if the test is in progress 178538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 179538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public Bundle getRecognitionResult() { 180538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return null; 181538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 182632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 183538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private String getArg(String name) { 184538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (name == null) return null; 185538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String arg = getIntent().getStringExtra(name); 186538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (arg != null) return arg; 187538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project arg = SystemProperties.get("app.voicedialer." + name); 188538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return arg != null && arg.length() > 0 ? arg : null; 189538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 190632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 191538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static File newFile(String name) { 192538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return name != null ? new File(name) : null; 193538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 194632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 195538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private void startNextTest() { 196538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.postDelayed(new Runnable() { 197538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 198538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mVoiceDialerTester == null) { 199538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 200538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 201538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (!mVoiceDialerTester.stepToNextTest()) { 202538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester.report(); 203538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project notifyText("Test completed!"); 204538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 205538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return; 206538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 207538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project File microphone = mVoiceDialerTester.getWavFile(); 208538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project File contacts = newFile(getArg(CONTACTS_EXTRA)); 209538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project notifyText("Testing\n" + microphone + "\n" + contacts); 21064c64e7c25e6efe31fa53369ec49db442b68ff9amah mCommandEngine.recognize(mCommandClient, VoiceDialerActivity.this, 21164c64e7c25e6efe31fa53369ec49db442b68ff9amah microphone, SAMPLE_RATE); 212538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 213538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }, 2000); 214538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 215632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 216538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private int playSound(int toneType) { 217538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project int msecDelay = 1; 218632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 219538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // use the MediaPlayer to prompt the user 220538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mToneGenerator != null) { 221538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mToneGenerator.startTone(toneType); 222538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project msecDelay = StrictMath.max(msecDelay, 300); 223538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 224538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 225538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // use the Vibrator to prompt the user 226be1584eb7e59c391a45aa21fb5e65ada1aedae9aDave Sparks if ((mAudioManager != null) && (mAudioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER))) { 227538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project final int VIBRATOR_TIME = 150; 228538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project final int VIBRATOR_GUARD_TIME = 150; 229538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Vibrator vibrator = new Vibrator(); 230538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project vibrator.vibrate(VIBRATOR_TIME); 231538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project msecDelay = StrictMath.max(msecDelay, 232538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project VIBRATOR_TIME + VIBRATOR_GUARD_TIME); 233538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 234632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 235538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return msecDelay; 236538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 237632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 238538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project @Override 239538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project protected void onPause() { 240538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project super.onPause(); 241538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 242538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onPause"); 243538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 244538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // shut down bluetooth, if it exists 245538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mBluetoothHeadset != null) { 246538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset.stopVoiceRecognition(); 247538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset.close(); 248538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mBluetoothHeadset = null; 249538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 250632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 251538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // no more tester 252538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mVoiceDialerTester = null; 253632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 254538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // shut down recognizer and wait for the thread to complete 255538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mRecognizerThread != null) { 256538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread.interrupt(); 257538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project try { 258538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread.join(); 259538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } catch (InterruptedException e) { 260538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (Config.LOGD) Log.d(TAG, "onPause mRecognizerThread.join exception " + e); 261538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 262538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mRecognizerThread = null; 263538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 264632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 265538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // clean up UI 266538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.removeCallbacks(mMicFlasher); 267538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.removeMessages(0); 268632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 269538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // clean up ToneGenerator 270538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (mToneGenerator != null) { 271538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mToneGenerator.release(); 272538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mToneGenerator = null; 273538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 274632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 275538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // bye 276538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 277538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 278632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 279538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private void notifyText(final CharSequence msg) { 280538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Toast.makeText(VoiceDialerActivity.this, msg, Toast.LENGTH_SHORT).show(); 281538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 282538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 283538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private Runnable mMicFlasher = new Runnable() { 284538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project int visible = View.VISIBLE; 285538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 286538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void run() { 287538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.microphone_view).setVisibility(visible); 288538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project findViewById(R.id.state).setVisibility(visible); 289538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project visible = visible == View.VISIBLE ? View.INVISIBLE : View.VISIBLE; 290538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHandler.postDelayed(this, 750); 291538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 292538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 293538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 29464c64e7c25e6efe31fa53369ec49db442b68ff9amah private class CommandRecognizerClient implements RecognizerClient { 29564c64e7c25e6efe31fa53369ec49db442b68ff9amah /** 29664c64e7c25e6efe31fa53369ec49db442b68ff9amah * Called by the {@link RecognizerEngine} when the microphone is started. 29764c64e7c25e6efe31fa53369ec49db442b68ff9amah */ 29864c64e7c25e6efe31fa53369ec49db442b68ff9amah public void onMicrophoneStart() { 29964c64e7c25e6efe31fa53369ec49db442b68ff9amah if (Config.LOGD) Log.d(TAG, "onMicrophoneStart"); 300632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 30164c64e7c25e6efe31fa53369ec49db442b68ff9amah if (mVoiceDialerTester != null) return; 302632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 30364c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.post(new Runnable() { 30464c64e7c25e6efe31fa53369ec49db442b68ff9amah public void run() { 30564c64e7c25e6efe31fa53369ec49db442b68ff9amah findViewById(R.id.microphone_loading_view).setVisibility(View.INVISIBLE); 30664c64e7c25e6efe31fa53369ec49db442b68ff9amah ((TextView)findViewById(R.id.state)).setText(R.string.listening); 30764c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.post(mMicFlasher); 30864c64e7c25e6efe31fa53369ec49db442b68ff9amah } 30964c64e7c25e6efe31fa53369ec49db442b68ff9amah }); 31064c64e7c25e6efe31fa53369ec49db442b68ff9amah } 311538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 31264c64e7c25e6efe31fa53369ec49db442b68ff9amah /** 31364c64e7c25e6efe31fa53369ec49db442b68ff9amah * Called by the {@link RecognizerEngine} if the recognizer fails. 31464c64e7c25e6efe31fa53369ec49db442b68ff9amah */ 31564c64e7c25e6efe31fa53369ec49db442b68ff9amah public void onRecognitionFailure(final String msg) { 31664c64e7c25e6efe31fa53369ec49db442b68ff9amah if (Config.LOGD) Log.d(TAG, "onRecognitionFailure " + msg); 31764c64e7c25e6efe31fa53369ec49db442b68ff9amah 31864c64e7c25e6efe31fa53369ec49db442b68ff9amah // get work off UAPI thread 31964c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.post(new Runnable() { 32064c64e7c25e6efe31fa53369ec49db442b68ff9amah public void run() { 32164c64e7c25e6efe31fa53369ec49db442b68ff9amah // failure, so beep about it 32264c64e7c25e6efe31fa53369ec49db442b68ff9amah playSound(ToneGenerator.TONE_PROP_NACK); 32364c64e7c25e6efe31fa53369ec49db442b68ff9amah 32464c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.removeCallbacks(mMicFlasher); 32564c64e7c25e6efe31fa53369ec49db442b68ff9amah ((TextView)findViewById(R.id.state)).setText(R.string.please_try_again); 32664c64e7c25e6efe31fa53369ec49db442b68ff9amah findViewById(R.id.state).setVisibility(View.VISIBLE); 32764c64e7c25e6efe31fa53369ec49db442b68ff9amah findViewById(R.id.microphone_view).setVisibility(View.INVISIBLE); 32864c64e7c25e6efe31fa53369ec49db442b68ff9amah findViewById(R.id.retry_view).setVisibility(View.VISIBLE); 32964c64e7c25e6efe31fa53369ec49db442b68ff9amah 33064c64e7c25e6efe31fa53369ec49db442b68ff9amah if (mVoiceDialerTester != null) { 33164c64e7c25e6efe31fa53369ec49db442b68ff9amah mVoiceDialerTester.onRecognitionFailure(msg); 33264c64e7c25e6efe31fa53369ec49db442b68ff9amah startNextTest(); 33364c64e7c25e6efe31fa53369ec49db442b68ff9amah return; 33464c64e7c25e6efe31fa53369ec49db442b68ff9amah } 335538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 33664c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.postDelayed(new Runnable() { 33764c64e7c25e6efe31fa53369ec49db442b68ff9amah public void run() { 33864c64e7c25e6efe31fa53369ec49db442b68ff9amah finish(); 33964c64e7c25e6efe31fa53369ec49db442b68ff9amah } 34064c64e7c25e6efe31fa53369ec49db442b68ff9amah }, FAIL_PAUSE_MSEC); 341538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 34264c64e7c25e6efe31fa53369ec49db442b68ff9amah }); 34364c64e7c25e6efe31fa53369ec49db442b68ff9amah } 344538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 34564c64e7c25e6efe31fa53369ec49db442b68ff9amah /** 34664c64e7c25e6efe31fa53369ec49db442b68ff9amah * Called by the {@link RecognizerEngine} on an internal error. 34764c64e7c25e6efe31fa53369ec49db442b68ff9amah */ 34864c64e7c25e6efe31fa53369ec49db442b68ff9amah public void onRecognitionError(final String msg) { 34964c64e7c25e6efe31fa53369ec49db442b68ff9amah if (Config.LOGD) Log.d(TAG, "onRecognitionError " + msg); 35064c64e7c25e6efe31fa53369ec49db442b68ff9amah 35164c64e7c25e6efe31fa53369ec49db442b68ff9amah // get work off UAPI thread 35264c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.post(new Runnable() { 35364c64e7c25e6efe31fa53369ec49db442b68ff9amah public void run() { 35464c64e7c25e6efe31fa53369ec49db442b68ff9amah // error, so beep about it 35564c64e7c25e6efe31fa53369ec49db442b68ff9amah playSound(ToneGenerator.TONE_PROP_NACK); 35664c64e7c25e6efe31fa53369ec49db442b68ff9amah 35764c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.removeCallbacks(mMicFlasher); 35864c64e7c25e6efe31fa53369ec49db442b68ff9amah ((TextView)findViewById(R.id.state)).setText(R.string.please_try_again); 35964c64e7c25e6efe31fa53369ec49db442b68ff9amah ((TextView)findViewById(R.id.substate)).setText(R.string.recognition_error); 36064c64e7c25e6efe31fa53369ec49db442b68ff9amah findViewById(R.id.state).setVisibility(View.VISIBLE); 36164c64e7c25e6efe31fa53369ec49db442b68ff9amah findViewById(R.id.microphone_view).setVisibility(View.INVISIBLE); 36264c64e7c25e6efe31fa53369ec49db442b68ff9amah findViewById(R.id.retry_view).setVisibility(View.VISIBLE); 36364c64e7c25e6efe31fa53369ec49db442b68ff9amah 36464c64e7c25e6efe31fa53369ec49db442b68ff9amah if (mVoiceDialerTester != null) { 36564c64e7c25e6efe31fa53369ec49db442b68ff9amah mVoiceDialerTester.onRecognitionError(msg); 36664c64e7c25e6efe31fa53369ec49db442b68ff9amah startNextTest(); 36764c64e7c25e6efe31fa53369ec49db442b68ff9amah return; 368538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 369632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 37064c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.postDelayed(new Runnable() { 37164c64e7c25e6efe31fa53369ec49db442b68ff9amah public void run() { 37264c64e7c25e6efe31fa53369ec49db442b68ff9amah finish(); 37364c64e7c25e6efe31fa53369ec49db442b68ff9amah } 37464c64e7c25e6efe31fa53369ec49db442b68ff9amah }, FAIL_PAUSE_MSEC); 375538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 37664c64e7c25e6efe31fa53369ec49db442b68ff9amah }); 37764c64e7c25e6efe31fa53369ec49db442b68ff9amah } 378538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 37964c64e7c25e6efe31fa53369ec49db442b68ff9amah /** 38064c64e7c25e6efe31fa53369ec49db442b68ff9amah * Called by the {@link RecognizerEngine} when is succeeds. If there is 38164c64e7c25e6efe31fa53369ec49db442b68ff9amah * only one item, then the Intent is dispatched immediately. 38264c64e7c25e6efe31fa53369ec49db442b68ff9amah * If there are more, then an AlertDialog is displayed and the user is 38364c64e7c25e6efe31fa53369ec49db442b68ff9amah * prompted to select. 38464c64e7c25e6efe31fa53369ec49db442b68ff9amah * @param intents a list of Intents corresponding to the sentences. 38564c64e7c25e6efe31fa53369ec49db442b68ff9amah */ 38664c64e7c25e6efe31fa53369ec49db442b68ff9amah public void onRecognitionSuccess(final Intent[] intents) { 38764c64e7c25e6efe31fa53369ec49db442b68ff9amah if (Config.LOGD) Log.d(TAG, "onRecognitionSuccess " + intents.length); 38864c64e7c25e6efe31fa53369ec49db442b68ff9amah 38964c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.post(new Runnable() { 39064c64e7c25e6efe31fa53369ec49db442b68ff9amah 39164c64e7c25e6efe31fa53369ec49db442b68ff9amah public void run() { 39264c64e7c25e6efe31fa53369ec49db442b68ff9amah // success, so beep about it 39364c64e7c25e6efe31fa53369ec49db442b68ff9amah playSound(ToneGenerator.TONE_PROP_ACK); 39464c64e7c25e6efe31fa53369ec49db442b68ff9amah 39564c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.removeCallbacks(mMicFlasher); 39664c64e7c25e6efe31fa53369ec49db442b68ff9amah 39764c64e7c25e6efe31fa53369ec49db442b68ff9amah // only one item, so just launch 39864c64e7c25e6efe31fa53369ec49db442b68ff9amah /* 39964c64e7c25e6efe31fa53369ec49db442b68ff9amah if (intents.length == 1 && mVoiceDialerTester == null) { 40064c64e7c25e6efe31fa53369ec49db442b68ff9amah // start the Intent 40164c64e7c25e6efe31fa53369ec49db442b68ff9amah startActivityHelp(intents[0]); 402538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finish(); 40364c64e7c25e6efe31fa53369ec49db442b68ff9amah return; 404538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 40564c64e7c25e6efe31fa53369ec49db442b68ff9amah */ 406632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 40764c64e7c25e6efe31fa53369ec49db442b68ff9amah DialogInterface.OnClickListener clickListener = 40864c64e7c25e6efe31fa53369ec49db442b68ff9amah new DialogInterface.OnClickListener() { 409632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 41064c64e7c25e6efe31fa53369ec49db442b68ff9amah public void onClick(DialogInterface dialog, int which) { 41164c64e7c25e6efe31fa53369ec49db442b68ff9amah if (Config.LOGD) Log.d(TAG, "clickListener.onClick " + which); 41264c64e7c25e6efe31fa53369ec49db442b68ff9amah startActivityHelp(intents[which]); 41364c64e7c25e6efe31fa53369ec49db442b68ff9amah dialog.dismiss(); 41464c64e7c25e6efe31fa53369ec49db442b68ff9amah finish(); 41564c64e7c25e6efe31fa53369ec49db442b68ff9amah } 416632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 41764c64e7c25e6efe31fa53369ec49db442b68ff9amah }; 418632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 41964c64e7c25e6efe31fa53369ec49db442b68ff9amah DialogInterface.OnCancelListener cancelListener = 42064c64e7c25e6efe31fa53369ec49db442b68ff9amah new DialogInterface.OnCancelListener() { 421632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 42264c64e7c25e6efe31fa53369ec49db442b68ff9amah public void onCancel(DialogInterface dialog) { 42364c64e7c25e6efe31fa53369ec49db442b68ff9amah if (Config.LOGD) Log.d(TAG, "cancelListener.onCancel"); 42464c64e7c25e6efe31fa53369ec49db442b68ff9amah dialog.dismiss(); 42564c64e7c25e6efe31fa53369ec49db442b68ff9amah finish(); 42664c64e7c25e6efe31fa53369ec49db442b68ff9amah } 427538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 42864c64e7c25e6efe31fa53369ec49db442b68ff9amah }; 429632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 43064c64e7c25e6efe31fa53369ec49db442b68ff9amah DialogInterface.OnClickListener positiveListener = 43164c64e7c25e6efe31fa53369ec49db442b68ff9amah new DialogInterface.OnClickListener() { 432632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 43364c64e7c25e6efe31fa53369ec49db442b68ff9amah public void onClick(DialogInterface dialog, int which) { 43464c64e7c25e6efe31fa53369ec49db442b68ff9amah if (Config.LOGD) Log.d(TAG, "positiveListener.onClick " + which); 43564c64e7c25e6efe31fa53369ec49db442b68ff9amah if (intents.length == 1 && which == -1) which = 0; 43664c64e7c25e6efe31fa53369ec49db442b68ff9amah startActivityHelp(intents[which]); 43764c64e7c25e6efe31fa53369ec49db442b68ff9amah dialog.dismiss(); 43864c64e7c25e6efe31fa53369ec49db442b68ff9amah finish(); 43964c64e7c25e6efe31fa53369ec49db442b68ff9amah } 440632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 44164c64e7c25e6efe31fa53369ec49db442b68ff9amah }; 442632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 44364c64e7c25e6efe31fa53369ec49db442b68ff9amah DialogInterface.OnClickListener negativeListener = 44464c64e7c25e6efe31fa53369ec49db442b68ff9amah new DialogInterface.OnClickListener() { 445632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 44664c64e7c25e6efe31fa53369ec49db442b68ff9amah public void onClick(DialogInterface dialog, int which) { 44764c64e7c25e6efe31fa53369ec49db442b68ff9amah if (Config.LOGD) Log.d(TAG, "negativeListener.onClick " + which); 44864c64e7c25e6efe31fa53369ec49db442b68ff9amah dialog.dismiss(); 44964c64e7c25e6efe31fa53369ec49db442b68ff9amah finish(); 45064c64e7c25e6efe31fa53369ec49db442b68ff9amah } 451538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 45264c64e7c25e6efe31fa53369ec49db442b68ff9amah }; 453632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 45464c64e7c25e6efe31fa53369ec49db442b68ff9amah String[] sentences = new String[intents.length]; 45564c64e7c25e6efe31fa53369ec49db442b68ff9amah for (int i = 0; i < intents.length; i++) { 45664c64e7c25e6efe31fa53369ec49db442b68ff9amah sentences[i] = intents[i].getStringExtra( 45764c64e7c25e6efe31fa53369ec49db442b68ff9amah RecognizerEngine.SENTENCE_EXTRA); 458538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 459632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 46064c64e7c25e6efe31fa53369ec49db442b68ff9amah final AlertDialog alertDialog = intents.length > 1 ? 46164c64e7c25e6efe31fa53369ec49db442b68ff9amah new AlertDialog.Builder(VoiceDialerActivity.this) 46264c64e7c25e6efe31fa53369ec49db442b68ff9amah .setTitle(R.string.title) 46364c64e7c25e6efe31fa53369ec49db442b68ff9amah .setItems(sentences, clickListener) 46464c64e7c25e6efe31fa53369ec49db442b68ff9amah .setOnCancelListener(cancelListener) 46564c64e7c25e6efe31fa53369ec49db442b68ff9amah .setNegativeButton(android.R.string.cancel, negativeListener) 46664c64e7c25e6efe31fa53369ec49db442b68ff9amah .show() 46764c64e7c25e6efe31fa53369ec49db442b68ff9amah : 46864c64e7c25e6efe31fa53369ec49db442b68ff9amah new AlertDialog.Builder(VoiceDialerActivity.this) 46964c64e7c25e6efe31fa53369ec49db442b68ff9amah .setTitle(R.string.title) 47064c64e7c25e6efe31fa53369ec49db442b68ff9amah .setItems(sentences, clickListener) 47164c64e7c25e6efe31fa53369ec49db442b68ff9amah .setOnCancelListener(cancelListener) 47264c64e7c25e6efe31fa53369ec49db442b68ff9amah .setPositiveButton(android.R.string.ok, positiveListener) 47364c64e7c25e6efe31fa53369ec49db442b68ff9amah .setNegativeButton(android.R.string.cancel, negativeListener) 47464c64e7c25e6efe31fa53369ec49db442b68ff9amah .show(); 47564c64e7c25e6efe31fa53369ec49db442b68ff9amah 47664c64e7c25e6efe31fa53369ec49db442b68ff9amah // start the next test 47764c64e7c25e6efe31fa53369ec49db442b68ff9amah if (mVoiceDialerTester != null) { 47864c64e7c25e6efe31fa53369ec49db442b68ff9amah mVoiceDialerTester.onRecognitionSuccess(intents); 47964c64e7c25e6efe31fa53369ec49db442b68ff9amah startNextTest(); 48064c64e7c25e6efe31fa53369ec49db442b68ff9amah mHandler.postDelayed(new Runnable() { 48164c64e7c25e6efe31fa53369ec49db442b68ff9amah public void run() { 48264c64e7c25e6efe31fa53369ec49db442b68ff9amah alertDialog.dismiss(); 48364c64e7c25e6efe31fa53369ec49db442b68ff9amah } 48464c64e7c25e6efe31fa53369ec49db442b68ff9amah }, 2000); 485538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 486538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 487538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 48864c64e7c25e6efe31fa53369ec49db442b68ff9amah // post a Toast if not real contacts or microphone 48964c64e7c25e6efe31fa53369ec49db442b68ff9amah private void startActivityHelp(Intent intent) { 49064c64e7c25e6efe31fa53369ec49db442b68ff9amah if (getArg(MICROPHONE_EXTRA) == null && 49164c64e7c25e6efe31fa53369ec49db442b68ff9amah getArg(CONTACTS_EXTRA) == null) { 49264c64e7c25e6efe31fa53369ec49db442b68ff9amah startActivity(intent); 49364c64e7c25e6efe31fa53369ec49db442b68ff9amah } else { 49464c64e7c25e6efe31fa53369ec49db442b68ff9amah notifyText(intent. 49564c64e7c25e6efe31fa53369ec49db442b68ff9amah getStringExtra(RecognizerEngine.SENTENCE_EXTRA) + 49664c64e7c25e6efe31fa53369ec49db442b68ff9amah "\n" + intent.toString()); 49764c64e7c25e6efe31fa53369ec49db442b68ff9amah } 498632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 499538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 500632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 50164c64e7c25e6efe31fa53369ec49db442b68ff9amah }); 50264c64e7c25e6efe31fa53369ec49db442b68ff9amah } 503538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 504632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 505538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project @Override 506538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project protected void onDestroy() { 507538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project super.onDestroy(); 508538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 509538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 510538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static class VoiceDialerTester { 511538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public VoiceDialerTester(File f) { 512538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 513632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 514538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public boolean stepToNextTest() { 515538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return false; 516538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 517632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 518538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void report() { 519538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 520632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 521538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public File getWavFile() { 522538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return null; 523538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 524632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 525538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onRecognitionFailure(String msg) { 526538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 527632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 528538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onRecognitionError(String err) { 529538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 530632bb9327078cbe2794ff24be8bb28e4f81309f1The Android Open Source Project 531538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public void onRecognitionSuccess(Intent[] intents) { 532538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 533538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 534538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 535538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project} 536