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