1 /* 2 * Copyright (C) 2015 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 android.voicesettings.service; 18 19 import static android.provider.Settings.ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE; 20 import static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_ENABLED; 21 import static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_MINUTES; 22 import static android.provider.Settings.ACTION_VOICE_CONTROL_AIRPLANE_MODE; 23 import static android.provider.Settings.EXTRA_AIRPLANE_MODE_ENABLED; 24 import static android.provider.Settings.ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE; 25 import static android.provider.Settings.EXTRA_BATTERY_SAVER_MODE_ENABLED; 26 27 import com.android.compatibility.common.util.BroadcastUtils; 28 import com.android.compatibility.common.util.BroadcastUtils.TestcaseType; 29 30 import android.app.VoiceInteractor; 31 import android.content.Context; 32 import android.content.Intent; 33 import android.os.AsyncTask; 34 import android.os.Bundle; 35 import android.service.voice.VoiceInteractionSession; 36 import android.util.Log; 37 38 import java.util.ArrayList; 39 import java.util.List; 40 41 public class MainInteractionSession extends VoiceInteractionSession { 42 static final String TAG = "MainInteractionSession"; 43 44 List<MyTask> mUsedTasks = new ArrayList<MyTask>(); 45 Context mContext; 46 TestcaseType mTestType; 47 48 MainInteractionSession(Context context) { 49 super(context); 50 mContext = context; 51 } 52 53 @Override 54 public void onCreate() { 55 super.onCreate(); 56 } 57 58 @Override 59 public void onDestroy() { 60 Log.i(TAG, "Canceling the Asynctasks in onDestroy()"); 61 for (MyTask t : mUsedTasks) { 62 t.cancel(true); 63 } 64 super.onDestroy(); 65 } 66 67 @Override 68 public void onShow(Bundle args, int showFlags) { 69 super.onShow(args, showFlags); 70 String testCaseType = args.getString(BroadcastUtils.TESTCASE_TYPE); 71 Log.i(TAG, "received_testcasetype = " + testCaseType); 72 try { 73 mTestType = TestcaseType.valueOf(testCaseType); 74 } catch (IllegalArgumentException e) { 75 Log.wtf(TAG, e); 76 return; 77 } catch (NullPointerException e) { 78 Log.wtf(TAG, e); 79 return; 80 } 81 Intent intent; 82 switch(mTestType) { 83 case ZEN_MODE_ON: 84 intent = new Intent(ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE); 85 intent.putExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED, true); 86 intent.putExtra(EXTRA_DO_NOT_DISTURB_MODE_MINUTES, 87 BroadcastUtils.NUM_MINUTES_FOR_ZENMODE); 88 break; 89 case ZEN_MODE_OFF: 90 intent = new Intent(ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE); 91 intent.putExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED, false); 92 break; 93 case AIRPLANE_MODE_ON: 94 intent = new Intent(ACTION_VOICE_CONTROL_AIRPLANE_MODE); 95 intent.putExtra(EXTRA_AIRPLANE_MODE_ENABLED, true); 96 break; 97 case AIRPLANE_MODE_OFF: 98 intent = new Intent(ACTION_VOICE_CONTROL_AIRPLANE_MODE); 99 intent.putExtra(EXTRA_AIRPLANE_MODE_ENABLED, false); 100 break; 101 case BATTERYSAVER_MODE_ON: 102 intent = new Intent(ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE); 103 intent.putExtra(EXTRA_BATTERY_SAVER_MODE_ENABLED, true); 104 break; 105 case BATTERYSAVER_MODE_OFF: 106 intent = new Intent(ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE); 107 intent.putExtra(EXTRA_BATTERY_SAVER_MODE_ENABLED, false); 108 break; 109 default: 110 Log.i(TAG, "Not implemented!"); 111 return; 112 } 113 Log.i(TAG, "starting_voiceactivity: " + intent.toString()); 114 startVoiceActivity(intent); 115 } 116 117 @Override 118 public void onTaskFinished(Intent intent, int taskId) { 119 // extras contain the info on what the activity started above did. 120 // we probably could verify this also. 121 Bundle extras = intent.getExtras(); 122 Log.i(TAG, "in onTaskFinished: testcasetype = " + mTestType + ", intent: " + 123 intent.toString() + BroadcastUtils.toBundleString(extras)); 124 Intent broadcastIntent = new Intent(BroadcastUtils.BROADCAST_INTENT + 125 mTestType.toString()); 126 if (extras == null) { 127 extras = new Bundle(); 128 } 129 extras.putString(BroadcastUtils.TESTCASE_TYPE, mTestType.toString()); 130 broadcastIntent.putExtras(extras); 131 Log.i(TAG, "sending_broadcast: Bundle = " + BroadcastUtils.toBundleString(extras) + 132 ", intent = " + broadcastIntent.toString()); 133 mContext.sendBroadcast(broadcastIntent); 134 } 135 136 synchronized MyTask newTask() { 137 MyTask t = new MyTask(); 138 mUsedTasks.add(t); 139 return t; 140 } 141 142 @Override 143 public void onRequestCompleteVoice(CompleteVoiceRequest request) { 144 VoiceInteractor.Prompt prompt = request.getVoicePrompt(); 145 CharSequence message = (prompt != null ? prompt.getVoicePromptAt(0) : "(none)"); 146 Log.i(TAG, "in Session testcasetype = " + mTestType + 147 ", onRequestCompleteVoice recvd. message = " + message); 148 AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setCompleteReq(true); 149 newTask().execute(asyncTaskArg); 150 } 151 152 @Override 153 public void onRequestAbortVoice(AbortVoiceRequest request) { 154 AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setCompleteReq(false); 155 Log.i(TAG, "in Session sending sendAbortResult. "); 156 newTask().execute(asyncTaskArg); 157 } 158 159 private class AsyncTaskArg { 160 CompleteVoiceRequest mCompReq; 161 AbortVoiceRequest mAbortReq; 162 boolean isCompleteRequest = true; 163 164 AsyncTaskArg setRequest(CompleteVoiceRequest r) { 165 mCompReq = r; 166 return this; 167 } 168 169 AsyncTaskArg setRequest(AbortVoiceRequest r) { 170 mAbortReq = r; 171 return this; 172 } 173 174 AsyncTaskArg setCompleteReq(boolean flag) { 175 isCompleteRequest = flag; 176 return this; 177 } 178 } 179 180 private class MyTask extends AsyncTask<AsyncTaskArg, Void, Void> { 181 @Override 182 protected Void doInBackground(AsyncTaskArg... params) { 183 AsyncTaskArg arg = params[0]; 184 Log.i(TAG, "in MyTask - doInBackground: testType = " + 185 MainInteractionSession.this.mTestType); 186 if (arg.isCompleteRequest) { 187 arg.mCompReq.sendCompleteResult(new Bundle()); 188 } else { 189 arg.mAbortReq.sendAbortResult(new Bundle()); 190 } 191 return null; 192 } 193 } 194 } 195