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