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 android.app.NotificationManager;
20c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.content.Context;
21c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.content.Intent;
22c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.content.res.Resources;
230474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby Jamesimport android.media.AudioManager;
2439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.os.UserHandle;
25c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.provider.Settings.Global;
26c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.service.notification.Condition;
27c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.service.notification.ZenModeConfig;
28c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.text.format.DateFormat;
290474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby Jamesimport android.util.Log;
30c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
3139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.settings.R;
3239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.settings.utils.VoiceSettingsActivity;
3339b467482d1bf256a111c757e9b7621c6f523271Jason Monk
34c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport java.util.Locale;
35c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
3639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_ENABLED;
3739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_MINUTES;
3839b467482d1bf256a111c757e9b7621c6f523271Jason Monk
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
620474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
630474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            if (audioManager != null) {
640474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                // Show the current Zen Mode setting.
650474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                audioManager.adjustStreamVolume(AudioManager.STREAM_NOTIFICATION,
660474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                         AudioManager.ADJUST_SAME,
670474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James                         AudioManager.FLAG_SHOW_UI);
68c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            }
69c54782071ad7d595162040c3471e5ed416fb52a3Barnaby James            notifySuccess(getChangeSummary(mode, minutes));
700474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        } else {
710474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            Log.v(TAG, "Missing extra android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_ENABLED");
72c54782071ad7d595162040c3471e5ed416fb52a3Barnaby James            finish();
730474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        }
74c54782071ad7d595162040c3471e5ed416fb52a3Barnaby James        return false;
75c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
76c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
77c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private void setZenModeConfig(int mode, Condition condition) {
78c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        if (condition != null) {
79c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            NotificationManager.from(this).setZenMode(mode, condition.id, TAG);
80c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        } else {
81c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            NotificationManager.from(this).setZenMode(mode, null, TAG);
82c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
830474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James     }
84c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
85c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    /**
86c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     * Produce a summary of the Zen mode change to be read aloud as TTS.
87c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     */
880474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James    private CharSequence getChangeSummary(int mode, int minutes) {
89c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int indefinite = -1;
90c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int byMinute = -1;
91c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int byHour = -1;
92c54782071ad7d595162040c3471e5ed416fb52a3Barnaby James        int byTime = -1;
93c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
94c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        switch (mode) {
95c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            case Global.ZEN_MODE_ALARMS:
96c54782071ad7d595162040c3471e5ed416fb52a3Barnaby James                indefinite = R.string.zen_mode_summary_alarms_only_indefinite;
97c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byMinute = R.plurals.zen_mode_summary_alarms_only_by_minute;
98c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byHour = R.plurals.zen_mode_summary_alarms_only_by_hour;
99c54782071ad7d595162040c3471e5ed416fb52a3Barnaby James                byTime = R.string.zen_mode_summary_alarms_only_by_time;
100c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                break;
101c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            case Global.ZEN_MODE_OFF:
102c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                indefinite = R.string.zen_mode_summary_always;
103c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                break;
104c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        };
105c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
1060474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        if (minutes < 0 || mode == Global.ZEN_MODE_OFF) {
107c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            return getString(indefinite);
108c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
109c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
1100474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        long time = System.currentTimeMillis() + minutes * MINUTES_MS;
111c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        String skeleton = DateFormat.is24HourFormat(this, UserHandle.myUserId()) ? "Hm" : "hma";
112c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
113c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        CharSequence formattedTime = DateFormat.format(pattern, time);
114c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        Resources res = getResources();
115c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
1160474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James        if (minutes < 60) {
1170474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            return res.getQuantityString(byMinute, minutes, minutes, formattedTime);
118c54782071ad7d595162040c3471e5ed416fb52a3Barnaby James        } else if (minutes % 60 != 0) {
119c54782071ad7d595162040c3471e5ed416fb52a3Barnaby James            return res.getString(byTime, formattedTime);
120c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        } else {
121c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            int hours = minutes / 60;
1220474b723e1118fe99a26cd1d1452f181a4d74ba7Barnaby James            return res.getQuantityString(byHour, hours, hours, formattedTime);
123c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
124c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
125c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James}
126