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