1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.test.voiceinteraction;
18
19import android.app.Activity;
20import android.app.VoiceInteractor;
21import android.os.Bundle;
22import android.util.Log;
23import android.view.View;
24import android.widget.Button;
25import android.widget.TextView;
26
27public class StartVoiceInteractionActivity extends Activity implements View.OnClickListener {
28    static final String TAG = "LocalVoiceInteractionActivity";
29
30    static final String REQUEST_ABORT = "abort";
31    static final String REQUEST_COMPLETE = "complete";
32    static final String REQUEST_COMMAND = "command";
33    static final String REQUEST_PICK = "pick";
34    static final String REQUEST_CONFIRM = "confirm";
35
36    VoiceInteractor mInteractor;
37    VoiceInteractor.Request mCurrentRequest = null;
38    TextView mLog;
39    Button mCommandButton;
40    Button mPickButton;
41    Button mCancelButton;
42    Button mStartButton;
43    Button mStopButton;
44
45    @Override
46    public void onCreate(Bundle savedInstanceState) {
47        super.onCreate(savedInstanceState);
48
49        setContentView(R.layout.local_interaction_app);
50
51        mLog = (TextView)findViewById(R.id.log);
52        mCommandButton = (Button)findViewById(R.id.command);
53        mCommandButton.setOnClickListener(this);
54        mPickButton = (Button)findViewById(R.id.pick);
55        mPickButton.setOnClickListener(this);
56        mCancelButton = (Button)findViewById(R.id.cancel);
57        mCancelButton.setOnClickListener(this);
58        mStartButton = (Button) findViewById(R.id.start);
59        mStartButton.setOnClickListener(this);
60        mStopButton = (Button) findViewById(R.id.stop);
61        mStopButton.setOnClickListener(this);
62
63        mLog.append("Local Voice Interaction Supported = " + isLocalVoiceInteractionSupported());
64    }
65
66    @Override
67    public void onResume() {
68        super.onResume();
69    }
70
71    @Override
72    public void onClick(View v) {
73        if (v == mCommandButton) {
74            VoiceInteractor.CommandRequest req = new TestCommand("Some arg");
75            mInteractor.submitRequest(req, REQUEST_COMMAND);
76        } else if (v == mPickButton) {
77            VoiceInteractor.PickOptionRequest.Option[] options =
78                    new VoiceInteractor.PickOptionRequest.Option[5];
79            options[0] = new VoiceInteractor.PickOptionRequest.Option("One");
80            options[1] = new VoiceInteractor.PickOptionRequest.Option("Two");
81            options[2] = new VoiceInteractor.PickOptionRequest.Option("Three");
82            options[3] = new VoiceInteractor.PickOptionRequest.Option("Four");
83            options[4] = new VoiceInteractor.PickOptionRequest.Option("Five");
84            VoiceInteractor.PickOptionRequest req = new TestPickOption(options);
85            mInteractor.submitRequest(req, REQUEST_PICK);
86        } else if (v == mCancelButton && mCurrentRequest != null) {
87            Log.i(TAG, "Cancel request");
88            mCurrentRequest.cancel();
89        } else if (v == mStartButton) {
90            Bundle args = new Bundle();
91            args.putString("Foo", "Bar");
92            startLocalVoiceInteraction(args);
93        } else if (v == mStopButton) {
94            stopLocalVoiceInteraction();
95        }
96    }
97
98    @Override
99    public void onLocalVoiceInteractionStarted() {
100        mInteractor = getVoiceInteractor();
101        mLog.append("\nLocalVoiceInteraction started!");
102        mStopButton.setEnabled(true);
103    }
104
105    @Override
106    public void onLocalVoiceInteractionStopped() {
107        mInteractor = getVoiceInteractor();
108        mLog.append("\nLocalVoiceInteraction stopped!");
109        mStopButton.setEnabled(false);
110    }
111
112    @Override
113    public void onDestroy() {
114        super.onDestroy();
115    }
116
117    static class TestAbortVoice extends VoiceInteractor.AbortVoiceRequest {
118        public TestAbortVoice() {
119            super(new VoiceInteractor.Prompt("Dammit, we suck :("), null);
120        }
121        @Override public void onCancel() {
122            Log.i(TAG, "Canceled!");
123            ((StartVoiceInteractionActivity)getActivity()).mLog.append("Canceled abort\n");
124        }
125        @Override public void onAbortResult(Bundle result) {
126            Log.i(TAG, "Abort result: result=" + result);
127            ((StartVoiceInteractionActivity)getActivity()).mLog.append(
128                    "Abort: result=" + result + "\n");
129            getActivity().finish();
130        }
131    }
132
133    static class TestCompleteVoice extends VoiceInteractor.CompleteVoiceRequest {
134        public TestCompleteVoice() {
135            super(new VoiceInteractor.Prompt("Woohoo, completed!"), null);
136        }
137        @Override public void onCancel() {
138            Log.i(TAG, "Canceled!");
139            ((StartVoiceInteractionActivity)getActivity()).mLog.append("Canceled complete\n");
140        }
141        @Override public void onCompleteResult(Bundle result) {
142            Log.i(TAG, "Complete result: result=" + result);
143            ((StartVoiceInteractionActivity)getActivity()).mLog.append("Complete: result="
144                    + result + "\n");
145            getActivity().finish();
146        }
147    }
148
149    static class TestCommand extends VoiceInteractor.CommandRequest {
150        public TestCommand(String arg) {
151            super("com.android.test.voiceinteraction.COMMAND", makeBundle(arg));
152        }
153        @Override public void onCancel() {
154            Log.i(TAG, "Canceled!");
155            ((StartVoiceInteractionActivity)getActivity()).mLog.append("Canceled command\n");
156        }
157        @Override
158        public void onCommandResult(boolean finished, Bundle result) {
159            Log.i(TAG, "Command result: finished=" + finished + " result=" + result);
160            StringBuilder sb = new StringBuilder();
161            if (finished) {
162                sb.append("Command final result: ");
163            } else {
164                sb.append("Command intermediate result: ");
165            }
166            if (result != null) {
167                result.getString("key");
168            }
169            sb.append(result);
170            sb.append("\n");
171            ((StartVoiceInteractionActivity)getActivity()).mLog.append(sb.toString());
172        }
173        static Bundle makeBundle(String arg) {
174            Bundle b = new Bundle();
175            b.putString("key", arg);
176            return b;
177        }
178    }
179
180    static class TestPickOption extends VoiceInteractor.PickOptionRequest {
181        public TestPickOption(Option[] options) {
182            super(new VoiceInteractor.Prompt("Need to pick something"), options, null);
183        }
184        @Override public void onCancel() {
185            Log.i(TAG, "Canceled!");
186            ((StartVoiceInteractionActivity)getActivity()).mLog.append("Canceled pick\n");
187        }
188        @Override
189        public void onPickOptionResult(boolean finished, Option[] selections, Bundle result) {
190            Log.i(TAG, "Pick result: finished=" + finished + " selections=" + selections
191                    + " result=" + result);
192            StringBuilder sb = new StringBuilder();
193            if (finished) {
194                sb.append("Pick final result: ");
195            } else {
196                sb.append("Pick intermediate result: ");
197            }
198            for (int i=0; i<selections.length; i++) {
199                if (i >= 1) {
200                    sb.append(", ");
201                }
202                sb.append(selections[i].getLabel());
203            }
204            sb.append("\n");
205            ((StartVoiceInteractionActivity)getActivity()).mLog.append(sb.toString());
206        }
207    }
208}
209