ZenModeVoiceActivity.java revision c55ea15bc0d9297417a4f1d886b9c188b6bf19b5
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.VoiceSelectionAdapter;
24c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport com.android.settings.utils.VoiceSelection;
25c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport com.android.settings.utils.VoiceSelectionFragment;
26c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport com.android.settings.utils.VoiceSettingsActivity;
27c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
28c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.app.Fragment;
29c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.app.NotificationManager;
30c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.content.Context;
31c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.content.Intent;
32c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.content.res.Resources;
33c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.os.UserHandle;
34c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.provider.Settings.Global;
35c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.service.notification.Condition;
36c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.service.notification.ZenModeConfig;
37c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport android.text.format.DateFormat;
38c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
39c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport java.util.ArrayList;
40c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport java.util.List;
41c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamesimport java.util.Locale;
42c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
43c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James/**
44c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * Activity for modifying the Zen mode (Do not disturb) by voice
45c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James * using the Voice Interaction API.
46c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James */
47c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby Jamespublic class ZenModeVoiceActivity extends VoiceSettingsActivity {
48c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private static final String TAG = "ZenModeVoiceActivity";
49c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private static final int MINUTES_MS = 60 * 1000;
50c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
51c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    @Override
52c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    protected boolean onVoiceSettingInteraction(Intent intent) {
53c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        setContentView(R.layout.voice_interaction);
54c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        pickNotificationMode(intent);
55c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        return false;
56c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
57c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
58c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    /**
59c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     * Start a voice interaction to ask what kind of interruptions should
60c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     * be permitted. The intent can optionally include extra information about the type
61c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     * of interruptions desired or how long interruptions should be limited to that are
62c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     * used as hints.
63c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     */
64c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private void pickNotificationMode(final Intent intent) {
65c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        boolean enabled = intent.getBooleanExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED, false);
66c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        boolean specified = intent.hasExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED);
67c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
68c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        List<VoiceSelection> states = new ArrayList<VoiceSelection>();
69c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        if (!specified || enabled) {
70c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            states.add(new ModeSelection(this, Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
71c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    R.string.zen_mode_option_important_interruptions,
72c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    R.string.zen_mode_option_important_voice_synonyms));
73c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            states.add(new ModeSelection(this, Global.ZEN_MODE_ALARMS,
74c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    R.string.zen_mode_option_alarms,
75c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    R.string.zen_mode_option_alarms_voice_synonyms));
76c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            states.add(new ModeSelection(this, Global.ZEN_MODE_NO_INTERRUPTIONS,
77c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    R.string.zen_mode_option_no_interruptions,
78c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    R.string.zen_mode_option_no_interruptions_voice_synonyms));
79c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
80c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        if (!specified || !enabled) {
81c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            states.add(new ModeSelection(this, Global.ZEN_MODE_OFF,
82c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    R.string.zen_mode_option_off,
83c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    R.string.zen_mode_option_off_voice_synonyms));
84c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
85c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        VoiceSelectionFragment fragment = new VoiceSelectionFragment();
86c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        fragment.setArguments(VoiceSelectionFragment.createArguments(
87c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                getString(R.string.zen_mode_interruptions_voice_prompt)));
88c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        fragment.setListAdapter(
89c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                new VoiceSelectionAdapter(this, R.layout.voice_item_row, states));
90c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        fragment.setOnItemSelectedHandler(new VoiceSelection.OnItemSelectedListener() {
91c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            @Override
92c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            public void onItemSelected(int index, VoiceSelection selection) {
93c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                int mode = ((ModeSelection) selection).mMode;
94c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                ConditionSelection conditionSelection = getConditionSelection(
95c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                        intent.getIntExtra(EXTRA_DO_NOT_DISTURB_MODE_MINUTES, 0));
96c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                if (mode != Global.ZEN_MODE_OFF) {
97c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    if (conditionSelection == null) {
98c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                        pickDuration(selection.getLabel(), mode);
99c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                        return;
100c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    }
101c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                }
102c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                setZenModeConfig(mode, conditionSelection.mCondition);
103c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                notifySuccess(getChangeSummary(mode, conditionSelection));
104c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                finish();
105c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            }
106c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        });
107c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        showFragment(fragment, "pick_mode_fragment");
108c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
109c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
110c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    /**
111c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     * Start a voice interaction to ask for the zen mode duration.
112c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     */
113c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private void pickDuration(CharSequence label, final int mode) {
114c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        setTitle(label.toString());
115c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        List<VoiceSelection> states = new ArrayList<VoiceSelection>();
116c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        states.add(new ConditionSelection(null, -1,
117c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James              getString(R.string.zen_mode_duration_indefinte_voice_label),
118c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James              getString(R.string.zen_mode_duration_indefinite_voice_synonyms)));
119c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        for (int i = ZenModeConfig.MINUTE_BUCKETS.length - 1; i >= 0; --i) {
120c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            states.add(getConditionSelection(ZenModeConfig.MINUTE_BUCKETS[i]));
121c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
122c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
123c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        VoiceSelectionFragment fragment = new VoiceSelectionFragment();
124c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        fragment.setArguments(VoiceSelectionFragment.createArguments(
125c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                getString(R.string.zen_mode_duration_voice_prompt)));
126c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        fragment.setListAdapter(
127c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                new VoiceSelectionAdapter(this, R.layout.voice_item_row, states));
128c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        fragment.setOnItemSelectedHandler(new VoiceSelection.OnItemSelectedListener() {
129c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            @Override
130c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            public void onItemSelected(int index, VoiceSelection item) {
131c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                ConditionSelection selection = ((ConditionSelection) item);
132c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                setZenModeConfig(mode, selection.mCondition);
133c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                notifySuccess(getChangeSummary(mode, selection));
134c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                finish();
135c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            }
136c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        });
137c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        showFragment(fragment, "pick_duration_fragment");
138c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
139c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
140c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private void showFragment(Fragment fragment, String tag) {
141c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        getFragmentManager()
142c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                .beginTransaction()
143c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                .replace(R.id.fragment_root, fragment, tag)
144c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                .commit();
145c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
146c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
147c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private void setZenModeConfig(int mode, Condition condition) {
148c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        if (condition != null) {
149c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            NotificationManager.from(this).setZenMode(mode, condition.id, TAG);
150c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        } else {
151c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            NotificationManager.from(this).setZenMode(mode, null, TAG);
152c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
153c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
154c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
155c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    /**
156c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     * Produce a summary of the Zen mode change to be read aloud as TTS.
157c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James     */
158c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private CharSequence getChangeSummary(int mode, ConditionSelection duration) {
159c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int indefinite = -1;
160c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int byMinute = -1;
161c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int byHour = -1;
162c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
163c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        switch (mode) {
164c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            case Global.ZEN_MODE_ALARMS:
165c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                indefinite = R.string.zen_mode_summary_alarams_only_indefinite;
166c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byMinute = R.plurals.zen_mode_summary_alarms_only_by_minute;
167c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byHour = R.plurals.zen_mode_summary_alarms_only_by_hour;
168c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                break;
169c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            case Global.ZEN_MODE_NO_INTERRUPTIONS:
170c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                indefinite = R.string.zen_mode_summary_no_interruptions_indefinite;
171c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byMinute = R.plurals.zen_mode_summary_no_interruptions_by_minute;
172c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byHour = R.plurals.zen_mode_summary_no_interruptions_by_hour;
173c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                break;
174c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
175c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                indefinite = R.string.zen_mode_summary_priority_indefinitely;
176c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byMinute = R.plurals.zen_mode_summary_priority_by_minute;
177c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                byHour = R.plurals.zen_mode_summary_priority_by_hour;
178c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                break;
179c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            default:
180c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            case Global.ZEN_MODE_OFF:
181c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                indefinite = R.string.zen_mode_summary_always;
182c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                break;
183c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        };
184c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
185c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        if (duration == null || duration.mCondition == null) {
186c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            return getString(indefinite);
187c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
188c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
189c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        long time = System.currentTimeMillis() + duration.mMinutes * MINUTES_MS;
190c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        String skeleton = DateFormat.is24HourFormat(this, UserHandle.myUserId()) ? "Hm" : "hma";
191c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
192c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        CharSequence formattedTime = DateFormat.format(pattern, time);
193c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        Resources res = getResources();
194c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
195c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        if (duration.mMinutes < 60) {
196c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            return res.getQuantityString(byMinute,
197c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    duration.mMinutes, duration.mMinutes, formattedTime);
198c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        } else {
199c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            int hours = duration.mMinutes / 60;
200c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            return res.getQuantityString(byHour, hours, hours, formattedTime);
201c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
202c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
203c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
204c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private ConditionSelection getConditionSelection(int minutes) {
205c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        Condition condition = ZenModeConfig.toTimeCondition(this, minutes, UserHandle.myUserId());
206c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        Resources res = getResources();
207c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        if (minutes <= 0) {
208c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            return null;
209c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        } else if (minutes < 60) {
210c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            String label = res.getQuantityString(R.plurals.zen_mode_duration_minutes_voice_label,
211c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    minutes, minutes);
212c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            return new ConditionSelection(condition, minutes, label, Integer.toString(minutes));
213c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        } else {
214c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            int hours = minutes / 60;
215c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            String label = res.getQuantityString(R.plurals.zen_mode_duration_hours_voice_label,
216c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                    hours, hours);
217c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            return new ConditionSelection(condition, minutes, label, Integer.toString(hours));
218c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
219c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
220c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
221c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private static class ConditionSelection extends VoiceSelection {
222c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        Condition mCondition;
223c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int mMinutes;
224c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
225c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        public ConditionSelection(Condition condition, int minutes, CharSequence label,
226c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James                CharSequence synonyms) {
227c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            super(label, synonyms);
228c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            mMinutes = minutes;
229c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            mCondition = condition;
230c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
231c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
232c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
233c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    private static class ModeSelection extends VoiceSelection {
234c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        int mMode;
235c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James
236c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        public ModeSelection(Context context, int mode, int label, int synonyms) {
237c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            super(context.getString(label), context.getString(synonyms));
238c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James            mMode = mode;
239c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James        }
240c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James    }
241c55ea15bc0d9297417a4f1d886b9c188b6bf19b5Barnaby James}
242