1 /*
2  * Copyright (C) 2014 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 
17 package com.android.test.voiceinteraction;
18 
19 import android.app.Activity;
20 import android.app.VoiceInteractor;
21 import android.content.ComponentName;
22 import android.content.Intent;
23 import android.os.Bundle;
24 import android.provider.Settings;
25 import android.service.voice.VoiceInteractionService;
26 import android.util.Log;
27 import android.view.View;
28 import android.widget.Button;
29 import android.widget.TextView;
30 
31 public class TestInteractionActivity extends Activity implements View.OnClickListener {
32     static final String TAG = "TestInteractionActivity";
33 
34     static final String REQUEST_ABORT = "abort";
35     static final String REQUEST_COMPLETE = "complete";
36     static final String REQUEST_COMMAND = "command";
37     static final String REQUEST_PICK = "pick";
38     static final String REQUEST_CONFIRM = "confirm";
39 
40     VoiceInteractor mInteractor;
41     VoiceInteractor.Request mCurrentRequest = null;
42     TextView mLog;
43     Button mAirplaneButton;
44     Button mAbortButton;
45     Button mCompleteButton;
46     Button mCommandButton;
47     Button mPickButton;
48     Button mJumpOutButton;
49     Button mCancelButton;
50 
51     @Override
onCreate(Bundle savedInstanceState)52     public void onCreate(Bundle savedInstanceState) {
53         super.onCreate(savedInstanceState);
54 
55         if (!isVoiceInteraction()) {
56             Log.w(TAG, "Not running as a voice interaction!");
57             finish();
58             return;
59         }
60 
61         if (!VoiceInteractionService.isActiveService(this,
62                 new ComponentName(this, MainInteractionService.class))) {
63             Log.w(TAG, "Not current voice interactor!");
64             finish();
65             return;
66         }
67 
68         setContentView(R.layout.test_interaction);
69         mLog = (TextView)findViewById(R.id.log);
70         mAirplaneButton = (Button)findViewById(R.id.airplane);
71         mAirplaneButton.setOnClickListener(this);
72         mAbortButton = (Button)findViewById(R.id.abort);
73         mAbortButton.setOnClickListener(this);
74         mCompleteButton = (Button)findViewById(R.id.complete);
75         mCompleteButton.setOnClickListener(this);
76         mCommandButton = (Button)findViewById(R.id.command);
77         mCommandButton.setOnClickListener(this);
78         mPickButton = (Button)findViewById(R.id.pick);
79         mPickButton.setOnClickListener(this);
80         mJumpOutButton = (Button)findViewById(R.id.jump);
81         mJumpOutButton.setOnClickListener(this);
82         mCancelButton = (Button)findViewById(R.id.cancel);
83         mCancelButton.setOnClickListener(this);
84 
85         mInteractor = getVoiceInteractor();
86 
87         VoiceInteractor.Request[] active = mInteractor.getActiveRequests();
88         for (int i=0; i<active.length; i++) {
89             Log.i(TAG, "Active #" + i + " / " + active[i].getName() + ": " + active[i]);
90         }
91 
92         mCurrentRequest = mInteractor.getActiveRequest(REQUEST_CONFIRM);
93         if (mCurrentRequest == null) {
94             mCurrentRequest = new VoiceInteractor.ConfirmationRequest(
95                     new VoiceInteractor.Prompt("This is a confirmation"), null) {
96                 @Override
97                 public void onCancel() {
98                     Log.i(TAG, "Canceled!");
99                     getActivity().finish();
100                 }
101 
102                 @Override
103                 public void onConfirmationResult(boolean confirmed, Bundle result) {
104                     Log.i(TAG, "Confirmation result: confirmed=" + confirmed + " result=" + result);
105                     getActivity().finish();
106                 }
107             };
108             mInteractor.submitRequest(mCurrentRequest, REQUEST_CONFIRM);
109             String[] cmds = new String[] {
110                     "com.android.test.voiceinteraction.COMMAND",
111                     "com.example.foo.bar"
112             };
113             boolean sup[] = mInteractor.supportsCommands(cmds);
114             for (int i=0; i<cmds.length; i++) {
115                 mLog.append(cmds[i] + ": " + (sup[i] ? "SUPPORTED" : "NOT SUPPORTED") + "\n");
116             }
117         } else {
118             Log.i(TAG, "Restarting with active confirmation: " + mCurrentRequest);
119         }
120     }
121 
122     @Override
onResume()123     public void onResume() {
124         super.onResume();
125     }
126 
127     @Override
onClick(View v)128     public void onClick(View v) {
129         if (v == mAirplaneButton) {
130             Intent intent = new Intent(Settings.ACTION_VOICE_CONTROL_AIRPLANE_MODE);
131             intent.addCategory(Intent.CATEGORY_VOICE);
132             intent.putExtra(Settings.EXTRA_AIRPLANE_MODE_ENABLED, true);
133             startActivity(intent);
134         } else if (v == mAbortButton) {
135             VoiceInteractor.AbortVoiceRequest req = new TestAbortVoice();
136             mInteractor.submitRequest(req, REQUEST_ABORT);
137         } else if (v == mCompleteButton) {
138             VoiceInteractor.CompleteVoiceRequest req = new TestCompleteVoice();
139             mInteractor.submitRequest(req, REQUEST_COMPLETE);
140         } else if (v == mCommandButton) {
141             VoiceInteractor.CommandRequest req = new TestCommand("Some arg");
142             mInteractor.submitRequest(req, REQUEST_COMMAND);
143         } else if (v == mPickButton) {
144             VoiceInteractor.PickOptionRequest.Option[] options =
145                     new VoiceInteractor.PickOptionRequest.Option[5];
146             options[0] = new VoiceInteractor.PickOptionRequest.Option("One");
147             options[1] = new VoiceInteractor.PickOptionRequest.Option("Two");
148             options[2] = new VoiceInteractor.PickOptionRequest.Option("Three");
149             options[3] = new VoiceInteractor.PickOptionRequest.Option("Four");
150             options[4] = new VoiceInteractor.PickOptionRequest.Option("Five");
151             VoiceInteractor.PickOptionRequest req = new TestPickOption(options);
152             mInteractor.submitRequest(req, REQUEST_PICK);
153         } else if (v == mJumpOutButton) {
154             Log.i(TAG, "Jump out");
155             Intent intent = new Intent(Intent.ACTION_MAIN);
156             intent.addCategory(Intent.CATEGORY_LAUNCHER);
157             intent.setComponent(new ComponentName(this, VoiceInteractionMain.class));
158             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
159             startActivity(intent);
160         } else if (v == mCancelButton && mCurrentRequest != null) {
161             Log.i(TAG, "Cancel request");
162             mCurrentRequest.cancel();
163         }
164     }
165 
166     @Override
onDestroy()167     public void onDestroy() {
168         super.onDestroy();
169     }
170 
171     static class TestAbortVoice extends VoiceInteractor.AbortVoiceRequest {
TestAbortVoice()172         public TestAbortVoice() {
173             super(new VoiceInteractor.Prompt("Dammit, we suck :("), null);
174         }
onCancel()175         @Override public void onCancel() {
176             Log.i(TAG, "Canceled!");
177             ((TestInteractionActivity)getActivity()).mLog.append("Canceled abort\n");
178         }
onAbortResult(Bundle result)179         @Override public void onAbortResult(Bundle result) {
180             Log.i(TAG, "Abort result: result=" + result);
181             ((TestInteractionActivity)getActivity()).mLog.append("Abort: result=" + result + "\n");
182             getActivity().finish();
183         }
184     }
185 
186     static class TestCompleteVoice extends VoiceInteractor.CompleteVoiceRequest {
TestCompleteVoice()187         public TestCompleteVoice() {
188             super(new VoiceInteractor.Prompt("Woohoo, completed!"), null);
189         }
onCancel()190         @Override public void onCancel() {
191             Log.i(TAG, "Canceled!");
192             ((TestInteractionActivity)getActivity()).mLog.append("Canceled complete\n");
193         }
onCompleteResult(Bundle result)194         @Override public void onCompleteResult(Bundle result) {
195             Log.i(TAG, "Complete result: result=" + result);
196             ((TestInteractionActivity)getActivity()).mLog.append("Complete: result="
197                     + result + "\n");
198             getActivity().finish();
199         }
200     }
201 
202     static class TestCommand extends VoiceInteractor.CommandRequest {
TestCommand(String arg)203         public TestCommand(String arg) {
204             super("com.android.test.voiceinteraction.COMMAND", makeBundle(arg));
205         }
onCancel()206         @Override public void onCancel() {
207             Log.i(TAG, "Canceled!");
208             ((TestInteractionActivity)getActivity()).mLog.append("Canceled command\n");
209         }
210         @Override
onCommandResult(boolean finished, Bundle result)211         public void onCommandResult(boolean finished, Bundle result) {
212             Log.i(TAG, "Command result: finished=" + finished + " result=" + result);
213             StringBuilder sb = new StringBuilder();
214             if (finished) {
215                 sb.append("Command final result: ");
216             } else {
217                 sb.append("Command intermediate result: ");
218             }
219             if (result != null) {
220                 result.getString("key");
221             }
222             sb.append(result);
223             sb.append("\n");
224             ((TestInteractionActivity)getActivity()).mLog.append(sb.toString());
225         }
makeBundle(String arg)226         static Bundle makeBundle(String arg) {
227             Bundle b = new Bundle();
228             b.putString("key", arg);
229             return b;
230         }
231     }
232 
233     static class TestPickOption extends VoiceInteractor.PickOptionRequest {
TestPickOption(Option[] options)234         public TestPickOption(Option[] options) {
235             super(new VoiceInteractor.Prompt("Need to pick something"), options, null);
236         }
onCancel()237         @Override public void onCancel() {
238             Log.i(TAG, "Canceled!");
239             ((TestInteractionActivity)getActivity()).mLog.append("Canceled pick\n");
240         }
241         @Override
onPickOptionResult(boolean finished, Option[] selections, Bundle result)242         public void onPickOptionResult(boolean finished, Option[] selections, Bundle result) {
243             Log.i(TAG, "Pick result: finished=" + finished + " selections=" + selections
244                     + " result=" + result);
245             StringBuilder sb = new StringBuilder();
246             if (finished) {
247                 sb.append("Pick final result: ");
248             } else {
249                 sb.append("Pick intermediate result: ");
250             }
251             for (int i=0; i<selections.length; i++) {
252                 if (i >= 1) {
253                     sb.append(", ");
254                 }
255                 sb.append(selections[i].getLabel());
256             }
257             sb.append("\n");
258             ((TestInteractionActivity)getActivity()).mLog.append(sb.toString());
259         }
260     }
261 }
262