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