blob: 869fa6b1824511896820efbd585ab02c8e3c796e [file] [log] [blame]
John Spurlock3c4076a2015-02-24 12:12:25 -05001/*
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
17package com.android.systemui.qs.tiles;
18
Jason Monkbe3235a2017-04-05 09:29:53 -040019import static android.provider.Settings.Global.ZEN_MODE_ALARMS;
20import static android.provider.Settings.Global.ZEN_MODE_OFF;
21
Beverly09da25f2018-02-26 09:17:07 -050022import android.app.ActivityManager;
Beverly312ad022018-01-24 15:07:48 -050023import android.app.Dialog;
John Spurlock3c4076a2015-02-24 12:12:25 -050024import android.content.BroadcastReceiver;
25import android.content.Context;
26import android.content.Intent;
27import android.content.IntentFilter;
28import android.content.SharedPreferences;
John Spurlockcd863ad2015-04-07 14:01:28 -040029import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
Jason Monkbe3235a2017-04-05 09:29:53 -040030import android.content.pm.ApplicationInfo;
31import android.content.pm.PackageManager;
Beverly09da25f2018-02-26 09:17:07 -050032import android.net.Uri;
Sudheer Shanka1c7cda82015-12-31 14:46:02 +000033import android.os.UserManager;
John Spurlock3c4076a2015-02-24 12:12:25 -050034import android.provider.Settings;
35import android.provider.Settings.Global;
Jason Monkbe3235a2017-04-05 09:29:53 -040036import android.service.notification.ZenModeConfig;
37import android.service.notification.ZenModeConfig.ZenRule;
Jason Monk32508852017-01-18 09:17:13 -050038import android.service.quicksettings.Tile;
Amin Shaikh3468e5a2018-04-18 11:39:07 -040039import android.text.TextUtils;
Jason Monkbe3235a2017-04-05 09:29:53 -040040import android.util.Slog;
John Spurlock3c4076a2015-02-24 12:12:25 -050041import android.view.LayoutInflater;
42import android.view.View;
43import android.view.View.OnAttachStateChangeListener;
44import android.view.ViewGroup;
Beverly312ad022018-01-24 15:07:48 -050045import android.view.WindowManager;
Julia Reynolds20aef8a2016-05-04 16:44:08 -040046import android.widget.Switch;
Sudheer Shankaa8fbbb32016-02-11 17:17:57 +000047import android.widget.Toast;
Chris Wrenf6e9228b2016-01-26 18:04:35 -050048
Chris Wren457a21c2015-05-06 17:50:34 -040049import com.android.internal.logging.MetricsLogger;
Tamas Berghammer383db5eb2016-06-22 15:21:38 +010050import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Beverly312ad022018-01-24 15:07:48 -050051import com.android.settingslib.notification.EnableZenModeDialog;
Andrew Flynn82862572015-04-01 14:22:37 -040052import com.android.systemui.Prefs;
John Spurlock3c4076a2015-02-24 12:12:25 -050053import com.android.systemui.R;
Sudheer Shankaa8fbbb32016-02-11 17:17:57 +000054import com.android.systemui.SysUIToast;
Jason Monkec34da82017-02-24 15:57:05 -050055import com.android.systemui.plugins.ActivityStarter;
Jason Monke5b770e2017-03-03 21:49:29 -050056import com.android.systemui.plugins.qs.DetailAdapter;
Jason Monk702e2eb2017-03-03 16:53:44 -050057import com.android.systemui.plugins.qs.QSTile.BooleanState;
Jason Monkbe3235a2017-04-05 09:29:53 -040058import com.android.systemui.qs.QSHost;
Jason Monk702e2eb2017-03-03 16:53:44 -050059import com.android.systemui.qs.tileimpl.QSTileImpl;
Beverly312ad022018-01-24 15:07:48 -050060import com.android.systemui.statusbar.phone.SystemUIDialog;
John Spurlock3c4076a2015-02-24 12:12:25 -050061import com.android.systemui.statusbar.policy.ZenModeController;
62import com.android.systemui.volume.ZenModePanel;
63
Jason Monk5d577202018-12-26 15:43:06 -050064import javax.inject.Inject;
65
John Spurlock3c4076a2015-02-24 12:12:25 -050066/** Quick settings tile: Do not disturb **/
Jason Monk702e2eb2017-03-03 16:53:44 -050067public class DndTile extends QSTileImpl<BooleanState> {
John Spurlock036e7cb2015-06-15 13:49:57 -040068
John Spurlockd9c75db2015-04-28 11:19:13 -040069 private static final Intent ZEN_SETTINGS =
70 new Intent(Settings.ACTION_ZEN_MODE_SETTINGS);
71
72 private static final Intent ZEN_PRIORITY_SETTINGS =
73 new Intent(Settings.ACTION_ZEN_MODE_PRIORITY_SETTINGS);
John Spurlock3c4076a2015-02-24 12:12:25 -050074
75 private static final String ACTION_SET_VISIBLE = "com.android.systemui.dndtile.SET_VISIBLE";
76 private static final String EXTRA_VISIBLE = "visible";
John Spurlock3c4076a2015-02-24 12:12:25 -050077
78 private final ZenModeController mController;
79 private final DndDetailAdapter mDetailAdapter;
Jason Monkc0e0e2b2018-12-26 16:47:41 -050080 private final ActivityStarter mActivityStarter;
John Spurlock3c4076a2015-02-24 12:12:25 -050081
82 private boolean mListening;
John Spurlock3c4076a2015-02-24 12:12:25 -050083 private boolean mShowingDetail;
Yuta Yamada99fd2772016-10-06 17:40:19 +090084 private boolean mReceiverRegistered;
John Spurlock3c4076a2015-02-24 12:12:25 -050085
Jason Monk5d577202018-12-26 15:43:06 -050086 @Inject
Jason Monkc0e0e2b2018-12-26 16:47:41 -050087 public DndTile(QSHost host, ZenModeController zenModeController,
88 ActivityStarter activityStarter) {
John Spurlock3c4076a2015-02-24 12:12:25 -050089 super(host);
Jason Monkc0e0e2b2018-12-26 16:47:41 -050090 mController = zenModeController;
91 mActivityStarter = activityStarter;
John Spurlock3c4076a2015-02-24 12:12:25 -050092 mDetailAdapter = new DndDetailAdapter();
John Spurlock3c4076a2015-02-24 12:12:25 -050093 mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE));
Yuta Yamada99fd2772016-10-06 17:40:19 +090094 mReceiverRegistered = true;
Jason Monkfa452ef2018-12-26 17:26:10 -050095 mController.observe(getLifecycle(), mZenCallback);
Yuta Yamada99fd2772016-10-06 17:40:19 +090096 }
97
98 @Override
99 protected void handleDestroy() {
100 super.handleDestroy();
101 if (mReceiverRegistered) {
102 mContext.unregisterReceiver(mReceiver);
103 mReceiverRegistered = false;
104 }
John Spurlock3c4076a2015-02-24 12:12:25 -0500105 }
106
107 public static void setVisible(Context context, boolean visible) {
Andrew Flynn82862572015-04-01 14:22:37 -0400108 Prefs.putBoolean(context, Prefs.Key.DND_TILE_VISIBLE, visible);
John Spurlock3c4076a2015-02-24 12:12:25 -0500109 }
110
111 public static boolean isVisible(Context context) {
Andrew Flynn82862572015-04-01 14:22:37 -0400112 return Prefs.getBoolean(context, Prefs.Key.DND_TILE_VISIBLE, false /* defaultValue */);
John Spurlock3c4076a2015-02-24 12:12:25 -0500113 }
114
John Spurlockf88d8082015-03-25 18:09:51 -0400115 public static void setCombinedIcon(Context context, boolean combined) {
Andrew Flynn82862572015-04-01 14:22:37 -0400116 Prefs.putBoolean(context, Prefs.Key.DND_TILE_COMBINED_ICON, combined);
John Spurlockf88d8082015-03-25 18:09:51 -0400117 }
118
119 public static boolean isCombinedIcon(Context context) {
Andrew Flynn82862572015-04-01 14:22:37 -0400120 return Prefs.getBoolean(context, Prefs.Key.DND_TILE_COMBINED_ICON,
121 false /* defaultValue */);
John Spurlockf88d8082015-03-25 18:09:51 -0400122 }
123
John Spurlock3c4076a2015-02-24 12:12:25 -0500124 @Override
125 public DetailAdapter getDetailAdapter() {
126 return mDetailAdapter;
127 }
128
129 @Override
Jason Monk62b63a02016-02-02 15:15:31 -0500130 public BooleanState newTileState() {
John Spurlock3c4076a2015-02-24 12:12:25 -0500131 return new BooleanState();
132 }
133
134 @Override
Jason Monk76c67aa2016-02-19 14:49:42 -0500135 public Intent getLongClickIntent() {
136 return ZEN_SETTINGS;
137 }
138
139 @Override
Jason Monk32508852017-01-18 09:17:13 -0500140 protected void handleClick() {
Beverly312ad022018-01-24 15:07:48 -0500141 // Zen is currently on
Jason Monk32508852017-01-18 09:17:13 -0500142 if (mState.value) {
Jason Monkbe3235a2017-04-05 09:29:53 -0400143 mController.setZen(ZEN_MODE_OFF, null, TAG);
Jason Monk32508852017-01-18 09:17:13 -0500144 } else {
Beverly312ad022018-01-24 15:07:48 -0500145 showDetail(true);
Jason Monk32508852017-01-18 09:17:13 -0500146 }
147 }
148
149 @Override
Beverly312ad022018-01-24 15:07:48 -0500150 public void showDetail(boolean show) {
Beverly91d0a632018-07-02 16:45:00 -0400151 int zenDuration = Settings.Secure.getInt(mContext.getContentResolver(),
152 Settings.Secure.ZEN_DURATION, 0);
153 boolean showOnboarding = Settings.Secure.getInt(mContext.getContentResolver(),
Beverly6c60b902018-08-17 10:10:46 -0400154 Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0) != 0
155 && Settings.Secure.getInt(mContext.getContentResolver(),
156 Settings.Secure.ZEN_SETTINGS_UPDATED, 0) != 1;
Julia Reynoldsc4e5ecf2018-04-11 11:33:32 -0400157 if (showOnboarding) {
158 // don't show on-boarding again or notification ever
Beverly91d0a632018-07-02 16:45:00 -0400159 Settings.Secure.putInt(mContext.getContentResolver(),
160 Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0);
Julia Reynoldsc4e5ecf2018-04-11 11:33:32 -0400161 // turn on DND
162 mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
163 // show on-boarding screen
164 Intent intent = new Intent(Settings.ZEN_MODE_ONBOARDING);
165 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Jason Monkc0e0e2b2018-12-26 16:47:41 -0500166 mActivityStarter.postStartActivityDismissingKeyguard(intent, 0);
Julia Reynoldsc4e5ecf2018-04-11 11:33:32 -0400167 } else {
168 switch (zenDuration) {
Beverly91d0a632018-07-02 16:45:00 -0400169 case Settings.Secure.ZEN_DURATION_PROMPT:
Julia Reynoldsc4e5ecf2018-04-11 11:33:32 -0400170 mUiHandler.post(() -> {
171 Dialog mDialog = new EnableZenModeDialog(mContext).createDialog();
172 mDialog.getWindow().setType(
173 WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
174 SystemUIDialog.setShowForAllUsers(mDialog, true);
175 SystemUIDialog.registerDismissListener(mDialog);
176 SystemUIDialog.setWindowOnTop(mDialog);
177 mUiHandler.post(() -> mDialog.show());
178 mHost.collapsePanels();
179 });
180 break;
Beverly91d0a632018-07-02 16:45:00 -0400181 case Settings.Secure.ZEN_DURATION_FOREVER:
Julia Reynoldsc4e5ecf2018-04-11 11:33:32 -0400182 mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
183 break;
184 default:
185 Uri conditionId = ZenModeConfig.toTimeCondition(mContext, zenDuration,
186 ActivityManager.getCurrentUser(), true).id;
187 mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
188 conditionId, TAG);
189 }
Beverly09da25f2018-02-26 09:17:07 -0500190 }
Beverly312ad022018-01-24 15:07:48 -0500191 }
192
193 @Override
Jason Monk32508852017-01-18 09:17:13 -0500194 protected void handleSecondaryClick() {
Sudheer Shankaa8fbbb32016-02-11 17:17:57 +0000195 if (mController.isVolumeRestricted()) {
196 // Collapse the panels, so the user can see the toast.
197 mHost.collapsePanels();
198 SysUIToast.makeText(mContext, mContext.getString(
199 com.android.internal.R.string.error_message_change_not_allowed),
200 Toast.LENGTH_LONG).show();
201 return;
202 }
Jason Monk3c3b6502017-07-27 15:41:26 -0400203 if (!mState.value) {
204 // Because of the complexity of the zen panel, it needs to be shown after
205 // we turn on zen below.
206 mController.addCallback(new ZenModeController.Callback() {
207 @Override
208 public void onZenChanged(int zen) {
209 mController.removeCallback(this);
210 showDetail(true);
211 }
212 });
Beverly3e906c52018-01-22 10:49:43 -0500213 mController.setZen(Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
Jason Monk3c3b6502017-07-27 15:41:26 -0400214 } else {
215 showDetail(true);
216 }
John Spurlock3c4076a2015-02-24 12:12:25 -0500217 }
218
219 @Override
Jason Monk39c98e62016-03-16 09:18:35 -0400220 public CharSequence getTileLabel() {
221 return mContext.getString(R.string.quick_settings_dnd_label);
222 }
223
224 @Override
John Spurlock3c4076a2015-02-24 12:12:25 -0500225 protected void handleUpdateState(BooleanState state, Object arg) {
Bruno Martinsc154e192018-03-17 13:55:42 +0000226 if (mController == null) return;
John Spurlock3c4076a2015-02-24 12:12:25 -0500227 final int zen = arg instanceof Integer ? (Integer) arg : mController.getZen();
Jason Monkbe3235a2017-04-05 09:29:53 -0400228 final boolean newValue = zen != ZEN_MODE_OFF;
John Spurlockb1688f62015-05-12 15:52:38 -0400229 final boolean valueChanged = state.value != newValue;
Jason Monk395617f2017-05-05 14:07:58 -0400230 if (state.slash == null) state.slash = new SlashState();
Jason Monk2db46192017-02-01 17:18:22 -0500231 state.dualTarget = true;
John Spurlockb1688f62015-05-12 15:52:38 -0400232 state.value = newValue;
Jason Monk32508852017-01-18 09:17:13 -0500233 state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
Jason Monk395617f2017-05-05 14:07:58 -0400234 state.slash.isSlashed = !state.value;
Beverly7999ba92018-01-24 10:07:06 -0500235 state.label = getTileLabel();
Amin Shaikh3468e5a2018-04-18 11:39:07 -0400236 state.secondaryLabel = TextUtils.emptyIfNull(ZenModeConfig.getDescription(mContext,
237 zen != Global.ZEN_MODE_OFF, mController.getConfig(), false));
Amin Shaikh551ff202019-03-28 09:29:15 -0400238 state.icon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_dnd);
Sudheer Shankaa8fbbb32016-02-11 17:17:57 +0000239 checkIfRestrictionEnforcedByAdminOnly(state, UserManager.DISALLOW_ADJUST_VOLUME);
John Spurlock3c4076a2015-02-24 12:12:25 -0500240 switch (zen) {
241 case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
Amin Shaikh3468e5a2018-04-18 11:39:07 -0400242 state.contentDescription =
243 mContext.getString(R.string.accessibility_quick_settings_dnd) + ", "
Beverly92ed74f2018-03-15 14:50:40 -0400244 + state.secondaryLabel;
John Spurlock3c4076a2015-02-24 12:12:25 -0500245 break;
246 case Global.ZEN_MODE_NO_INTERRUPTIONS:
Amin Shaikh3468e5a2018-04-18 11:39:07 -0400247 state.contentDescription =
248 mContext.getString(R.string.accessibility_quick_settings_dnd) + ", " +
249 mContext.getString(R.string.accessibility_quick_settings_dnd_none_on)
250 + ", " + state.secondaryLabel;
John Spurlock3c4076a2015-02-24 12:12:25 -0500251 break;
Jason Monkbe3235a2017-04-05 09:29:53 -0400252 case ZEN_MODE_ALARMS:
Amin Shaikh3468e5a2018-04-18 11:39:07 -0400253 state.contentDescription =
254 mContext.getString(R.string.accessibility_quick_settings_dnd) + ", " +
255 mContext.getString(R.string.accessibility_quick_settings_dnd_alarms_on)
256 + ", " + state.secondaryLabel;
John Spurlock4f1163c2015-04-02 17:41:21 -0400257 break;
John Spurlock3c4076a2015-02-24 12:12:25 -0500258 default:
Jason Monkbe3235a2017-04-05 09:29:53 -0400259 state.contentDescription = mContext.getString(
Julia Reynolds20aef8a2016-05-04 16:44:08 -0400260 R.string.accessibility_quick_settings_dnd);
John Spurlock3c4076a2015-02-24 12:12:25 -0500261 break;
262 }
John Spurlockb1688f62015-05-12 15:52:38 -0400263 if (valueChanged) {
264 fireToggleStateChanged(state.value);
265 }
Jason Monk28df4ed2017-03-23 10:25:37 -0400266 state.dualLabelContentDescription = mContext.getResources().getString(
267 R.string.accessibility_quick_settings_open_settings, getTileLabel());
Jason Monk702e2eb2017-03-03 16:53:44 -0500268 state.expandedAccessibilityClassName = Switch.class.getName();
John Spurlock3c4076a2015-02-24 12:12:25 -0500269 }
270
271 @Override
Chris Wren457a21c2015-05-06 17:50:34 -0400272 public int getMetricsCategory() {
Chris Wrenf6e9228b2016-01-26 18:04:35 -0500273 return MetricsEvent.QS_DND;
Chris Wren457a21c2015-05-06 17:50:34 -0400274 }
275
276 @Override
John Spurlock3c4076a2015-02-24 12:12:25 -0500277 protected String composeChangeAnnouncement() {
278 if (mState.value) {
279 return mContext.getString(R.string.accessibility_quick_settings_dnd_changed_on);
280 } else {
281 return mContext.getString(R.string.accessibility_quick_settings_dnd_changed_off);
282 }
283 }
284
285 @Override
Jason Monk1c6116c2017-09-06 17:33:01 -0400286 public void handleSetListening(boolean listening) {
John Spurlock3c4076a2015-02-24 12:12:25 -0500287 if (mListening == listening) return;
288 mListening = listening;
289 if (mListening) {
Andrew Flynn82862572015-04-01 14:22:37 -0400290 Prefs.registerListener(mContext, mPrefListener);
John Spurlock3c4076a2015-02-24 12:12:25 -0500291 } else {
Andrew Flynn82862572015-04-01 14:22:37 -0400292 Prefs.unregisterListener(mContext, mPrefListener);
John Spurlock3c4076a2015-02-24 12:12:25 -0500293 }
294 }
295
Jason Monkc3f42c12016-02-05 12:33:13 -0500296 @Override
297 public boolean isAvailable() {
298 return isVisible(mContext);
299 }
300
John Spurlockcd863ad2015-04-07 14:01:28 -0400301 private final OnSharedPreferenceChangeListener mPrefListener
302 = new OnSharedPreferenceChangeListener() {
303 @Override
Andrew Flynn82862572015-04-01 14:22:37 -0400304 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
305 @Prefs.Key String key) {
306 if (Prefs.Key.DND_TILE_COMBINED_ICON.equals(key) ||
307 Prefs.Key.DND_TILE_VISIBLE.equals(key)) {
John Spurlockcd863ad2015-04-07 14:01:28 -0400308 refreshState();
309 }
310 }
311 };
312
John Spurlock3c4076a2015-02-24 12:12:25 -0500313 private final ZenModeController.Callback mZenCallback = new ZenModeController.Callback() {
314 public void onZenChanged(int zen) {
315 refreshState(zen);
Jason Monkbe3235a2017-04-05 09:29:53 -0400316 if (isShowingDetail()) {
317 mDetailAdapter.updatePanel();
318 }
319 }
320
321 @Override
322 public void onConfigChanged(ZenModeConfig config) {
323 if (isShowingDetail()) {
324 mDetailAdapter.updatePanel();
325 }
John Spurlock3c4076a2015-02-24 12:12:25 -0500326 }
327 };
328
John Spurlock3c4076a2015-02-24 12:12:25 -0500329 private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
330 @Override
331 public void onReceive(Context context, Intent intent) {
John Spurlockcd863ad2015-04-07 14:01:28 -0400332 final boolean visible = intent.getBooleanExtra(EXTRA_VISIBLE, false);
333 setVisible(mContext, visible);
John Spurlock3c4076a2015-02-24 12:12:25 -0500334 refreshState();
335 }
336 };
337
338 private final class DndDetailAdapter implements DetailAdapter, OnAttachStateChangeListener {
339
Jason Monkbe3235a2017-04-05 09:29:53 -0400340 private ZenModePanel mZenPanel;
341 private boolean mAuto;
342
John Spurlock3c4076a2015-02-24 12:12:25 -0500343 @Override
Jason Monkc06fbb12016-01-08 14:12:18 -0500344 public CharSequence getTitle() {
345 return mContext.getString(R.string.quick_settings_dnd_label);
John Spurlock3c4076a2015-02-24 12:12:25 -0500346 }
347
348 @Override
349 public Boolean getToggleState() {
350 return mState.value;
351 }
352
353 @Override
354 public Intent getSettingsIntent() {
355 return ZEN_SETTINGS;
356 }
357
358 @Override
359 public void setToggleState(boolean state) {
Chris Wrenf6e9228b2016-01-26 18:04:35 -0500360 MetricsLogger.action(mContext, MetricsEvent.QS_DND_TOGGLE, state);
John Spurlock3c4076a2015-02-24 12:12:25 -0500361 if (!state) {
Jason Monkbe3235a2017-04-05 09:29:53 -0400362 mController.setZen(ZEN_MODE_OFF, null, TAG);
363 mAuto = false;
364 } else {
Beverly3e906c52018-01-22 10:49:43 -0500365 mController.setZen(Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
John Spurlock3c4076a2015-02-24 12:12:25 -0500366 }
367 }
368
369 @Override
Chris Wren457a21c2015-05-06 17:50:34 -0400370 public int getMetricsCategory() {
Chris Wrenf6e9228b2016-01-26 18:04:35 -0500371 return MetricsEvent.QS_DND_DETAILS;
Chris Wren457a21c2015-05-06 17:50:34 -0400372 }
373
374 @Override
John Spurlock3c4076a2015-02-24 12:12:25 -0500375 public View createDetailView(Context context, View convertView, ViewGroup parent) {
Jason Monkbe3235a2017-04-05 09:29:53 -0400376 mZenPanel = convertView != null ? (ZenModePanel) convertView
John Spurlock3c4076a2015-02-24 12:12:25 -0500377 : (ZenModePanel) LayoutInflater.from(context).inflate(
378 R.layout.zen_mode_panel, parent, false);
379 if (convertView == null) {
Jason Monkbe3235a2017-04-05 09:29:53 -0400380 mZenPanel.init(mController);
381 mZenPanel.addOnAttachStateChangeListener(this);
382 mZenPanel.setCallback(mZenModePanelCallback);
Evan Lairdbcdd0462017-05-15 12:51:34 -0400383 mZenPanel.setEmptyState(R.drawable.ic_qs_dnd_detail_empty, R.string.dnd_is_off);
John Spurlock3c4076a2015-02-24 12:12:25 -0500384 }
Jason Monkbe3235a2017-04-05 09:29:53 -0400385 updatePanel();
386 return mZenPanel;
387 }
388
389 private void updatePanel() {
390 if (mZenPanel == null) return;
391 mAuto = false;
392 if (mController.getZen() == ZEN_MODE_OFF) {
393 mZenPanel.setState(ZenModePanel.STATE_OFF);
394 } else {
395 ZenModeConfig config = mController.getConfig();
396 String summary = "";
397 if (config.manualRule != null && config.manualRule.enabler != null) {
398 summary = getOwnerCaption(config.manualRule.enabler);
399 }
400 for (ZenRule automaticRule : config.automaticRules.values()) {
401 if (automaticRule.isAutomaticActive()) {
402 if (summary.isEmpty()) {
403 summary = mContext.getString(R.string.qs_dnd_prompt_auto_rule,
404 automaticRule.name);
405 } else {
406 summary = mContext.getString(R.string.qs_dnd_prompt_auto_rule_app);
407 }
408 }
409 }
410 if (summary.isEmpty()) {
411 mZenPanel.setState(ZenModePanel.STATE_MODIFY);
412 } else {
413 mAuto = true;
414 mZenPanel.setState(ZenModePanel.STATE_AUTO_RULE);
415 mZenPanel.setAutoText(summary);
416 }
417 }
418 }
419
420 private String getOwnerCaption(String owner) {
421 final PackageManager pm = mContext.getPackageManager();
422 try {
423 final ApplicationInfo info = pm.getApplicationInfo(owner, 0);
424 if (info != null) {
425 final CharSequence seq = info.loadLabel(pm);
426 if (seq != null) {
427 final String str = seq.toString().trim();
428 return mContext.getString(R.string.qs_dnd_prompt_app, str);
429 }
430 }
431 } catch (Throwable e) {
432 Slog.w(TAG, "Error loading owner caption", e);
433 }
434 return "";
John Spurlock3c4076a2015-02-24 12:12:25 -0500435 }
436
437 @Override
438 public void onViewAttachedToWindow(View v) {
439 mShowingDetail = true;
440 }
441
442 @Override
443 public void onViewDetachedFromWindow(View v) {
444 mShowingDetail = false;
Jason Monkbe3235a2017-04-05 09:29:53 -0400445 mZenPanel = null;
John Spurlock3c4076a2015-02-24 12:12:25 -0500446 }
447 }
John Spurlockd9c75db2015-04-28 11:19:13 -0400448
449 private final ZenModePanel.Callback mZenModePanelCallback = new ZenModePanel.Callback() {
450 @Override
451 public void onPrioritySettings() {
Jason Monkc0e0e2b2018-12-26 16:47:41 -0500452 mActivityStarter.postStartActivityDismissingKeyguard(
Jason Monk9c7844c2017-01-18 15:21:53 -0500453 ZEN_PRIORITY_SETTINGS, 0);
John Spurlockd9c75db2015-04-28 11:19:13 -0400454 }
455
456 @Override
457 public void onInteraction() {
458 // noop
459 }
460
461 @Override
462 public void onExpanded(boolean expanded) {
463 // noop
464 }
465 };
466
John Spurlock3c4076a2015-02-24 12:12:25 -0500467}