Home | History | Annotate | Download | only in service
      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