ZenModeVoiceActivity.java revision 0474b723e1118fe99a26cd1d1452f181a4d74ba7
1c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James/*
2c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * Copyright (C) 2015 The Android Open Source Project
3c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James *
4c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * Licensed under the Apache License, Version 2.0 (the "License");
5c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * you may not use this file except in compliance with the License.
6c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * You may obtain a copy of the License at
7c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James *
8c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James *      http://www.apache.org/licenses/LICENSE-2.0
9c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James *
10c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * Unless required by applicable law or agreed to in writing, software
11c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * distributed under the License is distributed on an "AS IS" BASIS,
12c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * See the License for the specific language governing permissions and
14c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * limitations under the License.
15c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James */
16c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
17c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamespackage com.android.settings.notification;
18c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
19c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_MINUTES;
20c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_ENABLED;
21c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
22c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport com.android.settings.R;
23c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport com.android.settings.utils.VoiceSettingsActivity;
24c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
25c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.app.NotificationManager;
26c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.content.Context;
27c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.content.Intent;
28c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.content.res.Resources;
29c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.os.UserHandle;
300474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby Jamesimport android.media.AudioManager;
31c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.provider.Settings.Global;
32c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.service.notification.Condition;
33c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.service.notification.ZenModeConfig;
34c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.text.format.DateFormat;
350474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby Jamesimport android.util.Log;
36c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
37c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport java.util.Locale;
38c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
39c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James/**
40c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * Activity for modifying the Zen mode (Do not disturb) by voice
41c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * using the Voice Interaction API.
42c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James */
43c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamespublic class ZenModeVoiceActivity extends VoiceSettingsActivity {
44c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private static final String TAG = "ZenModeVoiceActivity";
45c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private static final int MINUTES_MS = 60 * 1000;
46c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
47c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    @Override
48c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    protected boolean onVoiceSettingInteraction(Intent intent) {
490474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        if (intent.hasExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED)) {
500474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            int minutes = intent.getIntExtra(EXTRA_DO_NOT_DISTURB_MODE_MINUTES, -1);
510474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            Condition condition = null;
520474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            int mode = Global.ZEN_MODE_OFF;
530474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James
540474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            if (intent.getBooleanExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED, false)) {
550474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                if (minutes > 0) {
560474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                    condition = ZenModeConfig.toTimeCondition(this, minutes, UserHandle.myUserId());
57c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                }
580474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                mode = Global.ZEN_MODE_ALARMS;
59c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            }
600474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            setZenModeConfig(mode, condition);
610474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            notifySuccess(getChangeSummary(mode, minutes));
620474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James
630474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
640474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            if (audioManager != null) {
650474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                // Show the current Zen Mode setting.
660474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                audioManager.adjustStreamVolume(AudioManager.STREAM_NOTIFICATION,
670474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                         AudioManager.ADJUST_SAME,
680474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                         AudioManager.FLAG_SHOW_UI);
69c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            }
700474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        } else {
710474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            Log.v(TAG, "Missing extra android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_ENABLED");
720474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        }
730474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        return true;
74c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
75c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
76c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private void setZenModeConfig(int mode, Condition condition) {
77c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        if (condition != null) {
78c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            NotificationManager.from(this).setZenMode(mode, condition.id, TAG);
79c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        } else {
80c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            NotificationManager.from(this).setZenMode(mode, null, TAG);
81c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
820474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James     }
83c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
84c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    /**
85c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     * Produce a summary of the Zen mode change to be read aloud as TTS.
86c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     */
870474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James    private CharSequence getChangeSummary(int mode, int minutes) {
88c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int indefinite = -1;
89c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int byMinute = -1;
90c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int byHour = -1;
91c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
92c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        switch (mode) {
93c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            case Global.ZEN_MODE_ALARMS:
94c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                indefinite = R.string.zen_mode_summary_alarams_only_indefinite;
95c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byMinute = R.plurals.zen_mode_summary_alarms_only_by_minute;
96c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byHour = R.plurals.zen_mode_summary_alarms_only_by_hour;
97c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                break;
98c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            case Global.ZEN_MODE_OFF:
99c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                indefinite = R.string.zen_mode_summary_always;
100c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                break;
101c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        };
102c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
1030474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        if (minutes < 0 || mode == Global.ZEN_MODE_OFF) {
104c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            return getString(indefinite);
105c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
106c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
1070474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        long time = System.currentTimeMillis() + minutes * MINUTES_MS;
108c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        String skeleton = DateFormat.is24HourFormat(this, UserHandle.myUserId()) ? "Hm" : "hma";
109c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
110c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        CharSequence formattedTime = DateFormat.format(pattern, time);
111c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        Resources res = getResources();
112c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
1130474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        if (minutes < 60) {
1140474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            return res.getQuantityString(byMinute, minutes, minutes, formattedTime);
115c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        } else {
116c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            int hours = minutes / 60;
1170474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            return res.getQuantityString(byHour, hours, hours, formattedTime);
118c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
119c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
120c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James}
121