blob: 2ef8f8e60db399b029297b87493bdb3f6be5fb00 [file] [log] [blame]
Julia Reynolds0842fe82015-10-01 14:34:22 -04001/**
John Spurlock86005342014-05-23 11:58:00 -04002 * Copyright (C) 2014 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.volume;
18
John Spurlock3e077012014-11-29 13:22:21 -050019import android.animation.LayoutTransition;
John Spurlock530052a2014-11-30 16:26:19 -050020import android.animation.LayoutTransition.TransitionListener;
Selim Cinek9c4a7072014-11-21 17:44:34 +010021import android.app.ActivityManager;
John Spurlock86005342014-05-23 11:58:00 -040022import android.content.Context;
23import android.content.Intent;
John Spurlock856edeb2014-06-01 20:36:47 -040024import android.content.SharedPreferences;
25import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
John Spurlock814ee6ab2015-05-18 11:16:38 -040026import android.content.res.Configuration;
John Spurlock86005342014-05-23 11:58:00 -040027import android.net.Uri;
John Spurlock530052a2014-11-30 16:26:19 -050028import android.os.AsyncTask;
John Spurlock86005342014-05-23 11:58:00 -040029import android.os.Handler;
30import android.os.Looper;
31import android.os.Message;
32import android.provider.Settings;
John Spurlockae641c92014-06-30 18:11:40 -040033import android.provider.Settings.Global;
John Spurlock86005342014-05-23 11:58:00 -040034import android.service.notification.Condition;
John Spurlock856edeb2014-06-01 20:36:47 -040035import android.service.notification.ZenModeConfig;
John Spurlockb2278d62015-04-07 12:47:12 -040036import android.service.notification.ZenModeConfig.ZenRule;
John Spurlockc90e6fe2014-10-28 11:21:42 -040037import android.text.TextUtils;
John Spurlock8be53ea2015-05-29 12:04:21 -040038import android.text.format.DateFormat;
John Spurlock530052a2014-11-30 16:26:19 -050039import android.util.ArraySet;
John Spurlock86005342014-05-23 11:58:00 -040040import android.util.AttributeSet;
John Spurlock856edeb2014-06-01 20:36:47 -040041import android.util.Log;
John Spurlock8f8ecd62014-08-27 17:46:03 -040042import android.util.MathUtils;
John Spurlock86005342014-05-23 11:58:00 -040043import android.view.LayoutInflater;
44import android.view.View;
John Spurlock3e077012014-11-29 13:22:21 -050045import android.view.ViewGroup;
John Spurlock86005342014-05-23 11:58:00 -040046import android.widget.CompoundButton;
47import android.widget.CompoundButton.OnCheckedChangeListener;
48import android.widget.ImageView;
49import android.widget.LinearLayout;
50import android.widget.RadioButton;
Julia Reynolds656f9862016-06-01 11:37:29 -040051import android.widget.RadioGroup;
John Spurlock86005342014-05-23 11:58:00 -040052import android.widget.TextView;
53
Chris Wren9e7283f2015-05-08 17:23:47 -040054import com.android.internal.logging.MetricsLogger;
Chris Wrenf6e9228b2016-01-26 18:04:35 -050055import com.android.internal.logging.MetricsProto.MetricsEvent;
John Spurlockf55b7f22015-04-13 19:21:26 -040056import com.android.systemui.Prefs;
John Spurlock86005342014-05-23 11:58:00 -040057import com.android.systemui.R;
58import com.android.systemui.statusbar.policy.ZenModeController;
59
John Spurlock530052a2014-11-30 16:26:19 -050060import java.io.FileDescriptor;
61import java.io.PrintWriter;
John Spurlock86005342014-05-23 11:58:00 -040062import java.util.Arrays;
Julia Reynolds0842fe82015-10-01 14:34:22 -040063import java.util.Calendar;
64import java.util.GregorianCalendar;
John Spurlock8be53ea2015-05-29 12:04:21 -040065import java.util.Locale;
John Spurlock856edeb2014-06-01 20:36:47 -040066import java.util.Objects;
John Spurlock86005342014-05-23 11:58:00 -040067
68public class ZenModePanel extends LinearLayout {
John Spurlockae641c92014-06-30 18:11:40 -040069 private static final String TAG = "ZenModePanel";
70 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
John Spurlock856edeb2014-06-01 20:36:47 -040071
John Spurlock50806fc2014-07-15 10:22:02 -040072 private static final int SECONDS_MS = 1000;
73 private static final int MINUTES_MS = 60 * SECONDS_MS;
74
Julia Reynolds0ca82fe2015-11-05 11:08:02 -050075 private static final int[] MINUTE_BUCKETS = ZenModeConfig.MINUTE_BUCKETS;
John Spurlock856edeb2014-06-01 20:36:47 -040076 private static final int MIN_BUCKET_MINUTES = MINUTE_BUCKETS[0];
77 private static final int MAX_BUCKET_MINUTES = MINUTE_BUCKETS[MINUTE_BUCKETS.length - 1];
78 private static final int DEFAULT_BUCKET_INDEX = Arrays.binarySearch(MINUTE_BUCKETS, 60);
John Spurlockae641c92014-06-30 18:11:40 -040079 private static final int FOREVER_CONDITION_INDEX = 0;
John Spurlock530052a2014-11-30 16:26:19 -050080 private static final int COUNTDOWN_CONDITION_INDEX = 1;
Julia Reynolds0842fe82015-10-01 14:34:22 -040081 private static final int COUNTDOWN_ALARM_CONDITION_INDEX = 2;
Julia Reynolds8e2d2bb2015-10-01 14:34:22 -040082 private static final int COUNTDOWN_CONDITION_COUNT = 2;
John Spurlock856edeb2014-06-01 20:36:47 -040083
John Spurlockf55b7f22015-04-13 19:21:26 -040084 public static final Intent ZEN_SETTINGS
85 = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS);
86 public static final Intent ZEN_PRIORITY_SETTINGS
87 = new Intent(Settings.ACTION_ZEN_MODE_PRIORITY_SETTINGS);
John Spurlock86005342014-05-23 11:58:00 -040088
John Spurlock7f1df5e2014-05-31 19:11:40 -040089 private final Context mContext;
Muyuan Li94fa1df2016-03-23 12:09:38 -070090 protected final LayoutInflater mInflater;
John Spurlock86005342014-05-23 11:58:00 -040091 private final H mHandler = new H();
John Spurlockf55b7f22015-04-13 19:21:26 -040092 private final ZenPrefs mPrefs;
John Spurlock530052a2014-11-30 16:26:19 -050093 private final TransitionHelper mTransitionHelper = new TransitionHelper();
John Spurlock0b688502014-12-22 15:13:30 -050094 private final Uri mForeverId;
John Spurlockd8963232015-06-08 16:26:12 -040095 private final SpTexts mSpTexts;
John Spurlock856edeb2014-06-01 20:36:47 -040096
John Spurlockeb2727b2014-07-19 23:11:36 -040097 private String mTag = TAG + "/" + Integer.toHexString(System.identityHashCode(this));
John Spurlockae641c92014-06-30 18:11:40 -040098
Muyuan Li8303bd22016-03-23 20:08:26 -070099 protected SegmentedButtons mZenButtons;
John Spurlockf55b7f22015-04-13 19:21:26 -0400100 private View mZenIntroduction;
John Spurlockd9c75db2015-04-28 11:19:13 -0400101 private TextView mZenIntroductionMessage;
John Spurlockf55b7f22015-04-13 19:21:26 -0400102 private View mZenIntroductionConfirm;
John Spurlockd8963232015-06-08 16:26:12 -0400103 private TextView mZenIntroductionCustomize;
Muyuan Li94fa1df2016-03-23 12:09:38 -0700104 protected LinearLayout mZenConditions;
John Spurlock8be53ea2015-05-29 12:04:21 -0400105 private TextView mZenAlarmWarning;
Julia Reynolds656f9862016-06-01 11:37:29 -0400106 private RadioGroup mZenRadioGroup;
107 private LinearLayout mZenRadioGroupContent;
John Spurlockae641c92014-06-30 18:11:40 -0400108
John Spurlock86005342014-05-23 11:58:00 -0400109 private Callback mCallback;
110 private ZenModeController mController;
John Spurlockad680d42015-01-30 15:48:15 -0500111 private boolean mCountdownConditionSupported;
John Spurlock86005342014-05-23 11:58:00 -0400112 private boolean mRequestingConditions;
John Spurlock4db0d982014-08-13 09:19:03 -0400113 private Condition mExitCondition;
John Spurlock856edeb2014-06-01 20:36:47 -0400114 private int mBucketIndex = -1;
John Spurlockae641c92014-06-30 18:11:40 -0400115 private boolean mExpanded;
John Spurlock530052a2014-11-30 16:26:19 -0500116 private boolean mHidden;
John Spurlockfbb3d6f2014-07-17 11:17:11 -0400117 private int mSessionZen;
John Spurlock8f8ecd62014-08-27 17:46:03 -0400118 private int mAttachedZen;
John Spurlock3e077012014-11-29 13:22:21 -0500119 private boolean mAttached;
John Spurlock4db0d982014-08-13 09:19:03 -0400120 private Condition mSessionExitCondition;
John Spurlock4db0d982014-08-13 09:19:03 -0400121 private Condition[] mConditions;
122 private Condition mTimeCondition;
John Spurlockcbd7a312015-06-21 10:46:28 -0400123 private boolean mVoiceCapable;
John Spurlock86005342014-05-23 11:58:00 -0400124
125 public ZenModePanel(Context context, AttributeSet attrs) {
126 super(context, attrs);
John Spurlock7f1df5e2014-05-31 19:11:40 -0400127 mContext = context;
John Spurlockf55b7f22015-04-13 19:21:26 -0400128 mPrefs = new ZenPrefs();
John Spurlockf7d22132014-07-10 19:03:00 -0400129 mInflater = LayoutInflater.from(mContext.getApplicationContext());
John Spurlock0b688502014-12-22 15:13:30 -0500130 mForeverId = Condition.newId(mContext).appendPath("forever").build();
John Spurlockd8963232015-06-08 16:26:12 -0400131 mSpTexts = new SpTexts(mContext);
John Spurlockcbd7a312015-06-21 10:46:28 -0400132 mVoiceCapable = Util.isVoiceCapable(mContext);
John Spurlock856edeb2014-06-01 20:36:47 -0400133 if (DEBUG) Log.d(mTag, "new ZenModePanel");
134 }
135
John Spurlock530052a2014-11-30 16:26:19 -0500136 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
137 pw.println("ZenModePanel state:");
138 pw.print(" mCountdownConditionSupported="); pw.println(mCountdownConditionSupported);
John Spurlock530052a2014-11-30 16:26:19 -0500139 pw.print(" mRequestingConditions="); pw.println(mRequestingConditions);
140 pw.print(" mAttached="); pw.println(mAttached);
141 pw.print(" mHidden="); pw.println(mHidden);
142 pw.print(" mExpanded="); pw.println(mExpanded);
143 pw.print(" mSessionZen="); pw.println(mSessionZen);
144 pw.print(" mAttachedZen="); pw.println(mAttachedZen);
John Spurlockd9c75db2015-04-28 11:19:13 -0400145 pw.print(" mConfirmedPriorityIntroduction=");
146 pw.println(mPrefs.mConfirmedPriorityIntroduction);
147 pw.print(" mConfirmedSilenceIntroduction=");
148 pw.println(mPrefs.mConfirmedSilenceIntroduction);
John Spurlockcbd7a312015-06-21 10:46:28 -0400149 pw.print(" mVoiceCapable="); pw.println(mVoiceCapable);
John Spurlock530052a2014-11-30 16:26:19 -0500150 mTransitionHelper.dump(fd, pw, args);
151 }
152
Muyuan Li8303bd22016-03-23 20:08:26 -0700153 protected void createZenButtons() {
John Spurlockae641c92014-06-30 18:11:40 -0400154 mZenButtons = (SegmentedButtons) findViewById(R.id.zen_buttons);
John Spurlock4f1163c2015-04-02 17:41:21 -0400155 mZenButtons.addButton(R.string.interruption_level_none_twoline,
John Spurlockbd1abe62015-06-10 17:18:38 -0400156 R.string.interruption_level_none_with_warning,
John Spurlock4f1163c2015-04-02 17:41:21 -0400157 Global.ZEN_MODE_NO_INTERRUPTIONS);
158 mZenButtons.addButton(R.string.interruption_level_alarms_twoline,
John Spurlocka1c7ffe2015-06-08 15:34:05 -0400159 R.string.interruption_level_alarms,
John Spurlock4f1163c2015-04-02 17:41:21 -0400160 Global.ZEN_MODE_ALARMS);
161 mZenButtons.addButton(R.string.interruption_level_priority_twoline,
John Spurlocka1c7ffe2015-06-08 15:34:05 -0400162 R.string.interruption_level_priority,
John Spurlock4291fb72014-09-16 17:02:23 -0400163 Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
John Spurlockae641c92014-06-30 18:11:40 -0400164 mZenButtons.setCallback(mZenButtonsCallback);
Muyuan Li8303bd22016-03-23 20:08:26 -0700165 }
John Spurlockae641c92014-06-30 18:11:40 -0400166
Muyuan Li8303bd22016-03-23 20:08:26 -0700167 @Override
168 protected void onFinishInflate() {
169 super.onFinishInflate();
170 createZenButtons();
John Spurlockf55b7f22015-04-13 19:21:26 -0400171 mZenIntroduction = findViewById(R.id.zen_introduction);
John Spurlockd9c75db2015-04-28 11:19:13 -0400172 mZenIntroductionMessage = (TextView) findViewById(R.id.zen_introduction_message);
John Spurlockd8963232015-06-08 16:26:12 -0400173 mSpTexts.add(mZenIntroductionMessage);
John Spurlockf55b7f22015-04-13 19:21:26 -0400174 mZenIntroductionConfirm = findViewById(R.id.zen_introduction_confirm);
175 mZenIntroductionConfirm.setOnClickListener(new OnClickListener() {
176 @Override
177 public void onClick(View v) {
178 confirmZenIntroduction();
179 }
180 });
John Spurlockd8963232015-06-08 16:26:12 -0400181 mZenIntroductionCustomize = (TextView) findViewById(R.id.zen_introduction_customize);
John Spurlockf55b7f22015-04-13 19:21:26 -0400182 mZenIntroductionCustomize.setOnClickListener(new OnClickListener() {
183 @Override
184 public void onClick(View v) {
185 confirmZenIntroduction();
186 if (mCallback != null) {
187 mCallback.onPrioritySettings();
188 }
189 }
190 });
John Spurlockd8963232015-06-08 16:26:12 -0400191 mSpTexts.add(mZenIntroductionCustomize);
John Spurlockf55b7f22015-04-13 19:21:26 -0400192
John Spurlockae641c92014-06-30 18:11:40 -0400193 mZenConditions = (LinearLayout) findViewById(R.id.zen_conditions);
John Spurlock8be53ea2015-05-29 12:04:21 -0400194 mZenAlarmWarning = (TextView) findViewById(R.id.zen_alarm_warning);
Julia Reynolds656f9862016-06-01 11:37:29 -0400195 mZenRadioGroup = (RadioGroup) findViewById(R.id.zen_radio_buttons);
196 mZenRadioGroupContent = (LinearLayout) findViewById(R.id.zen_radio_buttons_content);
John Spurlock814ee6ab2015-05-18 11:16:38 -0400197 }
John Spurlock530052a2014-11-30 16:26:19 -0500198
John Spurlock814ee6ab2015-05-18 11:16:38 -0400199 @Override
200 protected void onConfigurationChanged(Configuration newConfig) {
201 super.onConfigurationChanged(newConfig);
202 if (mZenButtons != null) {
203 mZenButtons.updateLocale();
204 }
Yongjiang Wucf3984192016-02-20 18:28:10 +0800205 if (mZenIntroductionCustomize != null) {
206 mZenIntroductionCustomize.setText(R.string.zen_priority_customize_button);
207 }
John Spurlock3e077012014-11-29 13:22:21 -0500208 }
209
John Spurlockf55b7f22015-04-13 19:21:26 -0400210 private void confirmZenIntroduction() {
John Spurlockd9c75db2015-04-28 11:19:13 -0400211 final String prefKey = prefKeyForConfirmation(getSelectedZen(Global.ZEN_MODE_OFF));
212 if (prefKey == null) return;
213 if (DEBUG) Log.d(TAG, "confirmZenIntroduction " + prefKey);
214 Prefs.putBoolean(mContext, prefKey, true);
John Spurlockf55b7f22015-04-13 19:21:26 -0400215 mHandler.sendEmptyMessage(H.UPDATE_WIDGETS);
216 }
217
John Spurlockd9c75db2015-04-28 11:19:13 -0400218 private static String prefKeyForConfirmation(int zen) {
219 switch (zen) {
220 case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
221 return Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION;
222 case Global.ZEN_MODE_NO_INTERRUPTIONS:
223 return Prefs.Key.DND_CONFIRMED_SILENCE_INTRODUCTION;
224 default:
225 return null;
John Spurlock530052a2014-11-30 16:26:19 -0500226 }
John Spurlock86005342014-05-23 11:58:00 -0400227 }
228
229 @Override
John Spurlock856edeb2014-06-01 20:36:47 -0400230 protected void onAttachedToWindow() {
231 super.onAttachedToWindow();
232 if (DEBUG) Log.d(mTag, "onAttachedToWindow");
John Spurlock3e077012014-11-29 13:22:21 -0500233 mAttached = true;
John Spurlock8f8ecd62014-08-27 17:46:03 -0400234 mAttachedZen = getSelectedZen(-1);
235 mSessionZen = mAttachedZen;
John Spurlock530052a2014-11-30 16:26:19 -0500236 mTransitionHelper.clear();
Julia Reynoldsb44ef7e2016-06-02 15:29:16 -0400237 mController.addCallback(mZenCallback);
John Spurlock530052a2014-11-30 16:26:19 -0500238 setSessionExitCondition(copy(mExitCondition));
John Spurlock50806fc2014-07-15 10:22:02 -0400239 updateWidgets();
John Spurlock3e077012014-11-29 13:22:21 -0500240 setRequestingConditions(!mHidden);
John Spurlock856edeb2014-06-01 20:36:47 -0400241 }
242
243 @Override
244 protected void onDetachedFromWindow() {
245 super.onDetachedFromWindow();
246 if (DEBUG) Log.d(mTag, "onDetachedFromWindow");
John Spurlock8f8ecd62014-08-27 17:46:03 -0400247 checkForAttachedZenChange();
John Spurlock3e077012014-11-29 13:22:21 -0500248 mAttached = false;
John Spurlock8f8ecd62014-08-27 17:46:03 -0400249 mAttachedZen = -1;
John Spurlockfbb3d6f2014-07-17 11:17:11 -0400250 mSessionZen = -1;
Julia Reynoldsb44ef7e2016-06-02 15:29:16 -0400251 mController.removeCallback(mZenCallback);
John Spurlock530052a2014-11-30 16:26:19 -0500252 setSessionExitCondition(null);
John Spurlock3e077012014-11-29 13:22:21 -0500253 setRequestingConditions(false);
John Spurlock530052a2014-11-30 16:26:19 -0500254 mTransitionHelper.clear();
255 }
256
257 private void setSessionExitCondition(Condition condition) {
258 if (Objects.equals(condition, mSessionExitCondition)) return;
259 if (DEBUG) Log.d(mTag, "mSessionExitCondition=" + getConditionId(condition));
260 mSessionExitCondition = condition;
John Spurlock856edeb2014-06-01 20:36:47 -0400261 }
262
John Spurlockeb2727b2014-07-19 23:11:36 -0400263 public void setHidden(boolean hidden) {
264 if (mHidden == hidden) return;
John Spurlock3e077012014-11-29 13:22:21 -0500265 if (DEBUG) Log.d(mTag, "hidden=" + hidden);
John Spurlockeb2727b2014-07-19 23:11:36 -0400266 mHidden = hidden;
John Spurlock3e077012014-11-29 13:22:21 -0500267 setRequestingConditions(mAttached && !mHidden);
John Spurlockeb2727b2014-07-19 23:11:36 -0400268 updateWidgets();
269 }
270
John Spurlock8f8ecd62014-08-27 17:46:03 -0400271 private void checkForAttachedZenChange() {
272 final int selectedZen = getSelectedZen(-1);
273 if (DEBUG) Log.d(mTag, "selectedZen=" + selectedZen);
274 if (selectedZen != mAttachedZen) {
275 if (DEBUG) Log.d(mTag, "attachedZen: " + mAttachedZen + " -> " + selectedZen);
276 if (selectedZen == Global.ZEN_MODE_NO_INTERRUPTIONS) {
277 mPrefs.trackNoneSelected();
278 }
279 }
280 }
281
John Spurlockae641c92014-06-30 18:11:40 -0400282 private void setExpanded(boolean expanded) {
283 if (expanded == mExpanded) return;
John Spurlockf88d8082015-03-25 18:09:51 -0400284 if (DEBUG) Log.d(mTag, "setExpanded " + expanded);
John Spurlockae641c92014-06-30 18:11:40 -0400285 mExpanded = expanded;
John Spurlockb2278d62015-04-07 12:47:12 -0400286 if (mExpanded && isShown()) {
John Spurlock3e077012014-11-29 13:22:21 -0500287 ensureSelection();
288 }
John Spurlockae641c92014-06-30 18:11:40 -0400289 updateWidgets();
John Spurlockae641c92014-06-30 18:11:40 -0400290 fireExpanded();
John Spurlock86005342014-05-23 11:58:00 -0400291 }
292
293 /** Start or stop requesting relevant zen mode exit conditions */
John Spurlock530052a2014-11-30 16:26:19 -0500294 private void setRequestingConditions(final boolean requesting) {
John Spurlock86005342014-05-23 11:58:00 -0400295 if (mRequestingConditions == requesting) return;
John Spurlock856edeb2014-06-01 20:36:47 -0400296 if (DEBUG) Log.d(mTag, "setRequestingConditions " + requesting);
John Spurlock86005342014-05-23 11:58:00 -0400297 mRequestingConditions = requesting;
John Spurlock856edeb2014-06-01 20:36:47 -0400298 if (mRequestingConditions) {
John Spurlockb2278d62015-04-07 12:47:12 -0400299 mTimeCondition = parseExistingTimeCondition(mContext, mExitCondition);
John Spurlock4db0d982014-08-13 09:19:03 -0400300 if (mTimeCondition != null) {
John Spurlock856edeb2014-06-01 20:36:47 -0400301 mBucketIndex = -1;
302 } else {
303 mBucketIndex = DEFAULT_BUCKET_INDEX;
John Spurlockc90e6fe2014-10-28 11:21:42 -0400304 mTimeCondition = ZenModeConfig.toTimeCondition(mContext,
Selim Cinek9c4a7072014-11-21 17:44:34 +0100305 MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
John Spurlock856edeb2014-06-01 20:36:47 -0400306 }
307 if (DEBUG) Log.d(mTag, "Initial bucket index: " + mBucketIndex);
Julia Reynolds0842fe82015-10-01 14:34:22 -0400308
John Spurlock4db0d982014-08-13 09:19:03 -0400309 mConditions = null; // reset conditions
310 handleUpdateConditions();
John Spurlock856edeb2014-06-01 20:36:47 -0400311 } else {
John Spurlock530052a2014-11-30 16:26:19 -0500312 hideAllConditions();
John Spurlock856edeb2014-06-01 20:36:47 -0400313 }
John Spurlock86005342014-05-23 11:58:00 -0400314 }
315
Muyuan Li94fa1df2016-03-23 12:09:38 -0700316 protected void addZenConditions(int count) {
317 for (int i = 0; i < count; i++) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400318 final View rb = mInflater.inflate(R.layout.zen_mode_button, this, false);
319 rb.setId(i);
320 mZenRadioGroup.addView(rb);
321 final View rbc = mInflater.inflate(R.layout.zen_mode_condition, this, false);
322 rbc.setId(i + count);
323 mZenRadioGroupContent.addView(rbc);
Muyuan Li94fa1df2016-03-23 12:09:38 -0700324 }
325 }
326
John Spurlockeb2727b2014-07-19 23:11:36 -0400327 public void init(ZenModeController controller) {
John Spurlock86005342014-05-23 11:58:00 -0400328 mController = controller;
John Spurlockad680d42015-01-30 15:48:15 -0500329 mCountdownConditionSupported = mController.isCountdownConditionSupported();
Julia Reynolds8e2d2bb2015-10-01 14:34:22 -0400330 final int countdownDelta = mCountdownConditionSupported ? COUNTDOWN_CONDITION_COUNT : 0;
John Spurlockad680d42015-01-30 15:48:15 -0500331 final int minConditions = 1 /*forever*/ + countdownDelta;
Muyuan Li94fa1df2016-03-23 12:09:38 -0700332 addZenConditions(minConditions);
John Spurlockfbb3d6f2014-07-17 11:17:11 -0400333 mSessionZen = getSelectedZen(-1);
John Spurlockb2278d62015-04-07 12:47:12 -0400334 handleUpdateManualRule(mController.getManualRule());
John Spurlock4db0d982014-08-13 09:19:03 -0400335 if (DEBUG) Log.d(mTag, "init mExitCondition=" + mExitCondition);
John Spurlock530052a2014-11-30 16:26:19 -0500336 hideAllConditions();
John Spurlockae641c92014-06-30 18:11:40 -0400337 }
338
Jason Monke2f47712014-09-09 09:35:55 -0400339 public void updateLocale() {
John Spurlock4291fb72014-09-16 17:02:23 -0400340 mZenButtons.updateLocale();
Jason Monke2f47712014-09-09 09:35:55 -0400341 }
342
John Spurlock4db0d982014-08-13 09:19:03 -0400343 private void setExitCondition(Condition exitCondition) {
John Spurlock25c34212014-11-12 09:16:49 -0500344 if (Objects.equals(mExitCondition, exitCondition)) return;
John Spurlock4db0d982014-08-13 09:19:03 -0400345 mExitCondition = exitCondition;
John Spurlock530052a2014-11-30 16:26:19 -0500346 if (DEBUG) Log.d(mTag, "mExitCondition=" + getConditionId(mExitCondition));
John Spurlock89f060a2014-07-16 21:03:15 -0400347 updateWidgets();
John Spurlockae641c92014-06-30 18:11:40 -0400348 }
349
John Spurlock4db0d982014-08-13 09:19:03 -0400350 private static Uri getConditionId(Condition condition) {
351 return condition != null ? condition.id : null;
352 }
353
John Spurlockb2278d62015-04-07 12:47:12 -0400354 private Uri getRealConditionId(Condition condition) {
355 return isForever(condition) ? null : getConditionId(condition);
356 }
357
John Spurlock4db0d982014-08-13 09:19:03 -0400358 private static boolean sameConditionId(Condition lhs, Condition rhs) {
359 return lhs == null ? rhs == null : rhs != null && lhs.id.equals(rhs.id);
360 }
361
362 private static Condition copy(Condition condition) {
363 return condition == null ? null : condition.copy();
364 }
365
John Spurlock86005342014-05-23 11:58:00 -0400366 public void setCallback(Callback callback) {
367 mCallback = callback;
368 }
369
John Spurlockb2278d62015-04-07 12:47:12 -0400370 private void handleUpdateManualRule(ZenRule rule) {
371 final int zen = rule != null ? rule.zenMode : Global.ZEN_MODE_OFF;
372 handleUpdateZen(zen);
373 final Condition c = rule != null ? rule.condition : null;
374 handleExitConditionChanged(c);
375 }
376
John Spurlockae641c92014-06-30 18:11:40 -0400377 private void handleUpdateZen(int zen) {
John Spurlockfbb3d6f2014-07-17 11:17:11 -0400378 if (mSessionZen != -1 && mSessionZen != zen) {
John Spurlockd9c75db2015-04-28 11:19:13 -0400379 setExpanded(isShown());
John Spurlockfbb3d6f2014-07-17 11:17:11 -0400380 mSessionZen = zen;
John Spurlockae641c92014-06-30 18:11:40 -0400381 }
Chris Wren4572cbc2015-06-29 11:27:18 -0400382 mZenButtons.setSelectedValue(zen, false /* fromClick */);
John Spurlockae641c92014-06-30 18:11:40 -0400383 updateWidgets();
John Spurlock530052a2014-11-30 16:26:19 -0500384 handleUpdateConditions();
385 if (mExpanded) {
386 final Condition selected = getSelectedCondition();
387 if (!Objects.equals(mExitCondition, selected)) {
388 select(selected);
389 }
390 }
391 }
392
John Spurlockb2278d62015-04-07 12:47:12 -0400393 private void handleExitConditionChanged(Condition exitCondition) {
394 setExitCondition(exitCondition);
395 if (DEBUG) Log.d(mTag, "handleExitConditionChanged " + mExitCondition);
396 final int N = getVisibleConditions();
397 for (int i = 0; i < N; i++) {
398 final ConditionTag tag = getConditionTagAt(i);
399 if (tag != null) {
400 if (sameConditionId(tag.condition, mExitCondition)) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400401 bind(exitCondition, mZenRadioGroupContent.getChildAt(i), i);
John Spurlockb2278d62015-04-07 12:47:12 -0400402 }
403 }
404 }
405 }
406
John Spurlock530052a2014-11-30 16:26:19 -0500407 private Condition getSelectedCondition() {
408 final int N = getVisibleConditions();
409 for (int i = 0; i < N; i++) {
410 final ConditionTag tag = getConditionTagAt(i);
411 if (tag != null && tag.rb.isChecked()) {
412 return tag.condition;
413 }
414 }
415 return null;
John Spurlockae641c92014-06-30 18:11:40 -0400416 }
417
418 private int getSelectedZen(int defValue) {
419 final Object zen = mZenButtons.getSelectedValue();
420 return zen != null ? (Integer) zen : defValue;
421 }
422
423 private void updateWidgets() {
John Spurlock530052a2014-11-30 16:26:19 -0500424 if (mTransitionHelper.isTransitioning()) {
425 mTransitionHelper.pendingUpdateWidgets();
426 return;
427 }
John Spurlockae641c92014-06-30 18:11:40 -0400428 final int zen = getSelectedZen(Global.ZEN_MODE_OFF);
John Spurlockae641c92014-06-30 18:11:40 -0400429 final boolean zenImportant = zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
430 final boolean zenNone = zen == Global.ZEN_MODE_NO_INTERRUPTIONS;
John Spurlockd9c75db2015-04-28 11:19:13 -0400431 final boolean introduction = (zenImportant && !mPrefs.mConfirmedPriorityIntroduction
432 || zenNone && !mPrefs.mConfirmedSilenceIntroduction);
John Spurlockae641c92014-06-30 18:11:40 -0400433
John Spurlockeb2727b2014-07-19 23:11:36 -0400434 mZenButtons.setVisibility(mHidden ? GONE : VISIBLE);
John Spurlockf55b7f22015-04-13 19:21:26 -0400435 mZenIntroduction.setVisibility(introduction ? VISIBLE : GONE);
John Spurlockd9c75db2015-04-28 11:19:13 -0400436 if (introduction) {
437 mZenIntroductionMessage.setText(zenImportant ? R.string.zen_priority_introduction
John Spurlockcbd7a312015-06-21 10:46:28 -0400438 : mVoiceCapable ? R.string.zen_silence_introduction_voice
John Spurlockd9c75db2015-04-28 11:19:13 -0400439 : R.string.zen_silence_introduction);
440 mZenIntroductionCustomize.setVisibility(zenImportant ? VISIBLE : GONE);
441 }
John Spurlock8be53ea2015-05-29 12:04:21 -0400442 final String warning = computeAlarmWarningText(zenNone);
443 mZenAlarmWarning.setVisibility(warning != null ? VISIBLE : GONE);
444 mZenAlarmWarning.setText(warning);
445 }
446
447 private String computeAlarmWarningText(boolean zenNone) {
448 if (!zenNone) {
449 return null;
450 }
451 final long now = System.currentTimeMillis();
452 final long nextAlarm = mController.getNextAlarm();
453 if (nextAlarm < now) {
454 return null;
455 }
456 int warningRes = 0;
457 if (mSessionExitCondition == null || isForever(mSessionExitCondition)) {
458 warningRes = R.string.zen_alarm_warning_indef;
459 } else {
460 final long time = ZenModeConfig.tryParseCountdownConditionId(mSessionExitCondition.id);
461 if (time > now && nextAlarm < time) {
462 warningRes = R.string.zen_alarm_warning;
463 }
464 }
465 if (warningRes == 0) {
466 return null;
467 }
468 final boolean soon = (nextAlarm - now) < 24 * 60 * 60 * 1000;
469 final boolean is24 = DateFormat.is24HourFormat(mContext, ActivityManager.getCurrentUser());
470 final String skeleton = soon ? (is24 ? "Hm" : "hma") : (is24 ? "EEEHm" : "EEEhma");
471 final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
472 final CharSequence formattedTime = DateFormat.format(pattern, nextAlarm);
473 final int templateRes = soon ? R.string.alarm_template : R.string.alarm_template_far;
474 final String template = getResources().getString(templateRes, formattedTime);
475 return getResources().getString(warningRes, template);
John Spurlock89f060a2014-07-16 21:03:15 -0400476 }
477
John Spurlockb2278d62015-04-07 12:47:12 -0400478 private static Condition parseExistingTimeCondition(Context context, Condition condition) {
John Spurlock4db0d982014-08-13 09:19:03 -0400479 if (condition == null) return null;
480 final long time = ZenModeConfig.tryParseCountdownConditionId(condition.id);
John Spurlock856edeb2014-06-01 20:36:47 -0400481 if (time == 0) return null;
John Spurlockc90e6fe2014-10-28 11:21:42 -0400482 final long now = System.currentTimeMillis();
483 final long span = time - now;
John Spurlock856edeb2014-06-01 20:36:47 -0400484 if (span <= 0 || span > MAX_BUCKET_MINUTES * MINUTES_MS) return null;
John Spurlockb2278d62015-04-07 12:47:12 -0400485 return ZenModeConfig.toTimeCondition(context,
Julia Reynolds0842fe82015-10-01 14:34:22 -0400486 time, Math.round(span / (float) MINUTES_MS), ActivityManager.getCurrentUser(),
John Spurlockbbde2672015-05-13 15:42:04 -0400487 false /*shortVersion*/);
John Spurlock86005342014-05-23 11:58:00 -0400488 }
489
John Spurlock4db0d982014-08-13 09:19:03 -0400490 private void handleUpdateConditions() {
John Spurlock530052a2014-11-30 16:26:19 -0500491 if (mTransitionHelper.isTransitioning()) {
John Spurlock530052a2014-11-30 16:26:19 -0500492 return;
493 }
John Spurlock4db0d982014-08-13 09:19:03 -0400494 final int conditionCount = mConditions == null ? 0 : mConditions.length;
495 if (DEBUG) Log.d(mTag, "handleUpdateConditions conditionCount=" + conditionCount);
John Spurlock4db0d982014-08-13 09:19:03 -0400496 // forever
Julia Reynolds656f9862016-06-01 11:37:29 -0400497 bind(forever(), mZenRadioGroupContent.getChildAt(FOREVER_CONDITION_INDEX),
Julia Reynolds0842fe82015-10-01 14:34:22 -0400498 FOREVER_CONDITION_INDEX);
John Spurlock4db0d982014-08-13 09:19:03 -0400499 // countdown
John Spurlock0b688502014-12-22 15:13:30 -0500500 if (mCountdownConditionSupported && mTimeCondition != null) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400501 bind(mTimeCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
Julia Reynolds0842fe82015-10-01 14:34:22 -0400502 COUNTDOWN_CONDITION_INDEX);
John Spurlock86005342014-05-23 11:58:00 -0400503 }
Julia Reynolds0842fe82015-10-01 14:34:22 -0400504 // countdown until alarm
Julia Reynolds8e2d2bb2015-10-01 14:34:22 -0400505 if (mCountdownConditionSupported) {
506 Condition nextAlarmCondition = getTimeUntilNextAlarmCondition();
507 if (nextAlarmCondition != null) {
Julia Reynoldsc3960f62016-06-02 14:04:31 -0400508 mZenRadioGroup.getChildAt(
509 COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.VISIBLE);
510 mZenRadioGroupContent.getChildAt(
511 COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.VISIBLE);
Julia Reynolds8e2d2bb2015-10-01 14:34:22 -0400512 bind(nextAlarmCondition,
Julia Reynolds656f9862016-06-01 11:37:29 -0400513 mZenRadioGroupContent.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX),
Julia Reynolds8e2d2bb2015-10-01 14:34:22 -0400514 COUNTDOWN_ALARM_CONDITION_INDEX);
Julia Reynoldsc3960f62016-06-02 14:04:31 -0400515 } else {
516 mZenRadioGroup.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.GONE);
517 mZenRadioGroupContent.getChildAt(
518 COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.GONE);
Julia Reynolds8e2d2bb2015-10-01 14:34:22 -0400519 }
John Spurlock4db0d982014-08-13 09:19:03 -0400520 }
John Spurlock3e077012014-11-29 13:22:21 -0500521 // ensure something is selected
John Spurlockb2278d62015-04-07 12:47:12 -0400522 if (mExpanded && isShown()) {
John Spurlock3e077012014-11-29 13:22:21 -0500523 ensureSelection();
524 }
Jason Monke138f552016-01-18 09:21:45 -0500525 mZenConditions.setVisibility(mSessionZen != Global.ZEN_MODE_OFF ? View.VISIBLE : View.GONE);
John Spurlock4db0d982014-08-13 09:19:03 -0400526 }
527
John Spurlock0b688502014-12-22 15:13:30 -0500528 private Condition forever() {
John Spurlockb2278d62015-04-07 12:47:12 -0400529 return new Condition(mForeverId, foreverSummary(mContext), "", "", 0 /*icon*/,
530 Condition.STATE_TRUE, 0 /*flags*/);
John Spurlock0b688502014-12-22 15:13:30 -0500531 }
532
John Spurlockb2278d62015-04-07 12:47:12 -0400533 private static String foreverSummary(Context context) {
534 return context.getString(com.android.internal.R.string.zen_mode_forever);
John Spurlock0b688502014-12-22 15:13:30 -0500535 }
536
Julia Reynolds0842fe82015-10-01 14:34:22 -0400537 // Returns a time condition if the next alarm is within the next week.
538 private Condition getTimeUntilNextAlarmCondition() {
539 GregorianCalendar weekRange = new GregorianCalendar();
540 final long now = weekRange.getTimeInMillis();
541 setToMidnight(weekRange);
Dan Sandler12d33932015-12-29 15:45:39 -0500542 weekRange.add(Calendar.DATE, 6);
Julia Reynolds0842fe82015-10-01 14:34:22 -0400543 final long nextAlarmMs = mController.getNextAlarm();
544 if (nextAlarmMs > 0) {
545 GregorianCalendar nextAlarm = new GregorianCalendar();
546 nextAlarm.setTimeInMillis(nextAlarmMs);
547 setToMidnight(nextAlarm);
548
549 if (weekRange.compareTo(nextAlarm) >= 0) {
Julia Reynolds5edde5f2016-11-11 14:30:51 -0500550 return ZenModeConfig.toTimeCondition(mContext, nextAlarmMs,
551 Math.round((nextAlarmMs - now) / (float) MINUTES_MS),
552 ActivityManager.getCurrentUser(), true);
Julia Reynolds0842fe82015-10-01 14:34:22 -0400553 }
554 }
555 return null;
556 }
557
558 private void setToMidnight(Calendar calendar) {
559 calendar.set(Calendar.HOUR_OF_DAY, 0);
560 calendar.set(Calendar.MINUTE, 0);
561 calendar.set(Calendar.SECOND, 0);
562 calendar.set(Calendar.MILLISECOND, 0);
563 }
564
John Spurlock856edeb2014-06-01 20:36:47 -0400565 private ConditionTag getConditionTagAt(int index) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400566 return (ConditionTag) mZenRadioGroupContent.getChildAt(index).getTag();
John Spurlock856edeb2014-06-01 20:36:47 -0400567 }
568
John Spurlock530052a2014-11-30 16:26:19 -0500569 private int getVisibleConditions() {
570 int rt = 0;
Julia Reynolds656f9862016-06-01 11:37:29 -0400571 final int N = mZenRadioGroupContent.getChildCount();
John Spurlock530052a2014-11-30 16:26:19 -0500572 for (int i = 0; i < N; i++) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400573 rt += mZenRadioGroupContent.getChildAt(i).getVisibility() == VISIBLE ? 1 : 0;
John Spurlock530052a2014-11-30 16:26:19 -0500574 }
575 return rt;
576 }
577
578 private void hideAllConditions() {
Julia Reynolds656f9862016-06-01 11:37:29 -0400579 final int N = mZenRadioGroupContent.getChildCount();
John Spurlock530052a2014-11-30 16:26:19 -0500580 for (int i = 0; i < N; i++) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400581 mZenRadioGroupContent.getChildAt(i).setVisibility(GONE);
John Spurlock530052a2014-11-30 16:26:19 -0500582 }
583 }
584
John Spurlock3e077012014-11-29 13:22:21 -0500585 private void ensureSelection() {
John Spurlock856edeb2014-06-01 20:36:47 -0400586 // are we left without anything selected? if so, set a default
John Spurlock530052a2014-11-30 16:26:19 -0500587 final int visibleConditions = getVisibleConditions();
588 if (visibleConditions == 0) return;
589 for (int i = 0; i < visibleConditions; i++) {
590 final ConditionTag tag = getConditionTagAt(i);
591 if (tag != null && tag.rb.isChecked()) {
592 if (DEBUG) Log.d(mTag, "Not selecting a default, checked=" + tag.condition);
John Spurlock856edeb2014-06-01 20:36:47 -0400593 return;
594 }
595 }
John Spurlock530052a2014-11-30 16:26:19 -0500596 final ConditionTag foreverTag = getConditionTagAt(FOREVER_CONDITION_INDEX);
597 if (foreverTag == null) return;
John Spurlock856edeb2014-06-01 20:36:47 -0400598 if (DEBUG) Log.d(mTag, "Selecting a default");
John Spurlock8f8ecd62014-08-27 17:46:03 -0400599 final int favoriteIndex = mPrefs.getMinuteIndex();
John Spurlock530052a2014-11-30 16:26:19 -0500600 if (favoriteIndex == -1 || !mCountdownConditionSupported) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400601 foreverTag.rb.setChecked(true);
John Spurlock856edeb2014-06-01 20:36:47 -0400602 } else {
Selim Cinek9c4a7072014-11-21 17:44:34 +0100603 mTimeCondition = ZenModeConfig.toTimeCondition(mContext,
604 MINUTE_BUCKETS[favoriteIndex], ActivityManager.getCurrentUser());
John Spurlock856edeb2014-06-01 20:36:47 -0400605 mBucketIndex = favoriteIndex;
Julia Reynolds656f9862016-06-01 11:37:29 -0400606 bind(mTimeCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
Julia Reynolds0842fe82015-10-01 14:34:22 -0400607 COUNTDOWN_CONDITION_INDEX);
Julia Reynolds656f9862016-06-01 11:37:29 -0400608 getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
John Spurlock856edeb2014-06-01 20:36:47 -0400609 }
610 }
611
John Spurlockb2278d62015-04-07 12:47:12 -0400612 private static boolean isCountdown(Condition c) {
John Spurlock530052a2014-11-30 16:26:19 -0500613 return c != null && ZenModeConfig.isValidCountdownConditionId(c.id);
614 }
615
John Spurlock0b688502014-12-22 15:13:30 -0500616 private boolean isForever(Condition c) {
617 return c != null && mForeverId.equals(c.id);
618 }
619
Julia Reynolds0842fe82015-10-01 14:34:22 -0400620 private void bind(final Condition condition, final View row, final int rowId) {
John Spurlock0b688502014-12-22 15:13:30 -0500621 if (condition == null) throw new IllegalArgumentException("condition must not be null");
622 final boolean enabled = condition.state == Condition.STATE_TRUE;
John Spurlock856edeb2014-06-01 20:36:47 -0400623 final ConditionTag tag =
624 row.getTag() != null ? (ConditionTag) row.getTag() : new ConditionTag();
625 row.setTag(tag);
John Spurlock530052a2014-11-30 16:26:19 -0500626 final boolean first = tag.rb == null;
John Spurlock856edeb2014-06-01 20:36:47 -0400627 if (tag.rb == null) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400628 tag.rb = (RadioButton) mZenRadioGroup.getChildAt(rowId);
John Spurlock856edeb2014-06-01 20:36:47 -0400629 }
John Spurlock4db0d982014-08-13 09:19:03 -0400630 tag.condition = condition;
John Spurlock530052a2014-11-30 16:26:19 -0500631 final Uri conditionId = getConditionId(tag.condition);
Julia Reynolds656f9862016-06-01 11:37:29 -0400632 if (DEBUG) Log.d(mTag, "bind i=" + mZenRadioGroupContent.indexOfChild(row) + " first="
633 + first + " condition=" + conditionId);
John Spurlock856edeb2014-06-01 20:36:47 -0400634 tag.rb.setEnabled(enabled);
635 tag.rb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
John Spurlock86005342014-05-23 11:58:00 -0400636 @Override
637 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
John Spurlockae641c92014-06-30 18:11:40 -0400638 if (mExpanded && isChecked) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400639 tag.rb.setChecked(true);
John Spurlock530052a2014-11-30 16:26:19 -0500640 if (DEBUG) Log.d(mTag, "onCheckedChanged " + conditionId);
Chris Wrenf6e9228b2016-01-26 18:04:35 -0500641 MetricsLogger.action(mContext, MetricsEvent.QS_DND_CONDITION_SELECT);
John Spurlock4db0d982014-08-13 09:19:03 -0400642 select(tag.condition);
John Spurlocka0457c22014-09-26 13:22:08 -0400643 announceConditionSelection(tag);
John Spurlock86005342014-05-23 11:58:00 -0400644 }
645 }
646 });
John Spurlocka0457c22014-09-26 13:22:08 -0400647
John Spurlockc90e6fe2014-10-28 11:21:42 -0400648 if (tag.lines == null) {
649 tag.lines = row.findViewById(android.R.id.content);
John Spurlock86005342014-05-23 11:58:00 -0400650 }
John Spurlockc90e6fe2014-10-28 11:21:42 -0400651 if (tag.line1 == null) {
652 tag.line1 = (TextView) row.findViewById(android.R.id.text1);
John Spurlockd8963232015-06-08 16:26:12 -0400653 mSpTexts.add(tag.line1);
John Spurlockc90e6fe2014-10-28 11:21:42 -0400654 }
655 if (tag.line2 == null) {
656 tag.line2 = (TextView) row.findViewById(android.R.id.text2);
John Spurlockd8963232015-06-08 16:26:12 -0400657 mSpTexts.add(tag.line2);
John Spurlockc90e6fe2014-10-28 11:21:42 -0400658 }
John Spurlock0b688502014-12-22 15:13:30 -0500659 final String line1 = !TextUtils.isEmpty(condition.line1) ? condition.line1
660 : condition.summary;
661 final String line2 = condition.line2;
John Spurlockc90e6fe2014-10-28 11:21:42 -0400662 tag.line1.setText(line1);
663 if (TextUtils.isEmpty(line2)) {
664 tag.line2.setVisibility(GONE);
665 } else {
666 tag.line2.setVisibility(VISIBLE);
667 tag.line2.setText(line2);
668 }
669 tag.lines.setEnabled(enabled);
670 tag.lines.setAlpha(enabled ? 1 : .4f);
John Spurlocka0457c22014-09-26 13:22:08 -0400671
John Spurlock86005342014-05-23 11:58:00 -0400672 final ImageView button1 = (ImageView) row.findViewById(android.R.id.button1);
673 button1.setOnClickListener(new OnClickListener() {
674 @Override
675 public void onClick(View v) {
Julia Reynolds0842fe82015-10-01 14:34:22 -0400676 onClickTimeButton(row, tag, false /*down*/, rowId);
John Spurlock86005342014-05-23 11:58:00 -0400677 }
678 });
679
680 final ImageView button2 = (ImageView) row.findViewById(android.R.id.button2);
681 button2.setOnClickListener(new OnClickListener() {
682 @Override
683 public void onClick(View v) {
Julia Reynolds0842fe82015-10-01 14:34:22 -0400684 onClickTimeButton(row, tag, true /*up*/, rowId);
John Spurlock86005342014-05-23 11:58:00 -0400685 }
686 });
John Spurlockc90e6fe2014-10-28 11:21:42 -0400687 tag.lines.setOnClickListener(new OnClickListener() {
John Spurlock86005342014-05-23 11:58:00 -0400688 @Override
689 public void onClick(View v) {
Julia Reynolds656f9862016-06-01 11:37:29 -0400690 tag.rb.setChecked(true);
John Spurlock86005342014-05-23 11:58:00 -0400691 }
692 });
John Spurlock856edeb2014-06-01 20:36:47 -0400693
John Spurlock530052a2014-11-30 16:26:19 -0500694 final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
Julia Reynolds0842fe82015-10-01 14:34:22 -0400695 if (rowId != COUNTDOWN_ALARM_CONDITION_INDEX && time > 0) {
John Spurlock530052a2014-11-30 16:26:19 -0500696 button1.setVisibility(VISIBLE);
697 button2.setVisibility(VISIBLE);
John Spurlock856edeb2014-06-01 20:36:47 -0400698 if (mBucketIndex > -1) {
699 button1.setEnabled(mBucketIndex > 0);
700 button2.setEnabled(mBucketIndex < MINUTE_BUCKETS.length - 1);
701 } else {
702 final long span = time - System.currentTimeMillis();
703 button1.setEnabled(span > MIN_BUCKET_MINUTES * MINUTES_MS);
John Spurlockc90e6fe2014-10-28 11:21:42 -0400704 final Condition maxCondition = ZenModeConfig.toTimeCondition(mContext,
Selim Cinek9c4a7072014-11-21 17:44:34 +0100705 MAX_BUCKET_MINUTES, ActivityManager.getCurrentUser());
John Spurlock856edeb2014-06-01 20:36:47 -0400706 button2.setEnabled(!Objects.equals(condition.summary, maxCondition.summary));
707 }
708
709 button1.setAlpha(button1.isEnabled() ? 1f : .5f);
710 button2.setAlpha(button2.isEnabled() ? 1f : .5f);
John Spurlock86005342014-05-23 11:58:00 -0400711 } else {
John Spurlock530052a2014-11-30 16:26:19 -0500712 button1.setVisibility(GONE);
713 button2.setVisibility(GONE);
John Spurlock86005342014-05-23 11:58:00 -0400714 }
John Spurlocka0457c22014-09-26 13:22:08 -0400715 // wire up interaction callbacks for newly-added condition rows
John Spurlock530052a2014-11-30 16:26:19 -0500716 if (first) {
John Spurlocka0457c22014-09-26 13:22:08 -0400717 Interaction.register(tag.rb, mInteractionCallback);
John Spurlockc90e6fe2014-10-28 11:21:42 -0400718 Interaction.register(tag.lines, mInteractionCallback);
John Spurlocka0457c22014-09-26 13:22:08 -0400719 Interaction.register(button1, mInteractionCallback);
720 Interaction.register(button2, mInteractionCallback);
721 }
John Spurlock530052a2014-11-30 16:26:19 -0500722 row.setVisibility(VISIBLE);
John Spurlocka0457c22014-09-26 13:22:08 -0400723 }
724
725 private void announceConditionSelection(ConditionTag tag) {
726 final int zen = getSelectedZen(Global.ZEN_MODE_OFF);
727 String modeText;
728 switch(zen) {
729 case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
John Spurlockd9c75db2015-04-28 11:19:13 -0400730 modeText = mContext.getString(R.string.interruption_level_priority);
John Spurlocka0457c22014-09-26 13:22:08 -0400731 break;
732 case Global.ZEN_MODE_NO_INTERRUPTIONS:
John Spurlockd9c75db2015-04-28 11:19:13 -0400733 modeText = mContext.getString(R.string.interruption_level_none);
John Spurlocka0457c22014-09-26 13:22:08 -0400734 break;
John Spurlock4f1163c2015-04-02 17:41:21 -0400735 case Global.ZEN_MODE_ALARMS:
John Spurlockd9c75db2015-04-28 11:19:13 -0400736 modeText = mContext.getString(R.string.interruption_level_alarms);
John Spurlock4f1163c2015-04-02 17:41:21 -0400737 break;
738 default:
John Spurlocka0457c22014-09-26 13:22:08 -0400739 return;
740 }
741 announceForAccessibility(mContext.getString(R.string.zen_mode_and_condition, modeText,
John Spurlockc90e6fe2014-10-28 11:21:42 -0400742 tag.line1.getText()));
John Spurlock856edeb2014-06-01 20:36:47 -0400743 }
744
Julia Reynolds0842fe82015-10-01 14:34:22 -0400745 private void onClickTimeButton(View row, ConditionTag tag, boolean up, int rowId) {
Chris Wrenf6e9228b2016-01-26 18:04:35 -0500746 MetricsLogger.action(mContext, MetricsEvent.QS_DND_TIME, up);
John Spurlock856edeb2014-06-01 20:36:47 -0400747 Condition newCondition = null;
748 final int N = MINUTE_BUCKETS.length;
749 if (mBucketIndex == -1) {
750 // not on a known index, search for the next or prev bucket by time
John Spurlock4db0d982014-08-13 09:19:03 -0400751 final Uri conditionId = getConditionId(tag.condition);
752 final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
John Spurlock856edeb2014-06-01 20:36:47 -0400753 final long now = System.currentTimeMillis();
754 for (int i = 0; i < N; i++) {
755 int j = up ? i : N - 1 - i;
756 final int bucketMinutes = MINUTE_BUCKETS[j];
757 final long bucketTime = now + bucketMinutes * MINUTES_MS;
758 if (up && bucketTime > time || !up && bucketTime < time) {
759 mBucketIndex = j;
John Spurlockc90e6fe2014-10-28 11:21:42 -0400760 newCondition = ZenModeConfig.toTimeCondition(mContext,
Julia Reynolds0842fe82015-10-01 14:34:22 -0400761 bucketTime, bucketMinutes, ActivityManager.getCurrentUser(),
John Spurlockbbde2672015-05-13 15:42:04 -0400762 false /*shortVersion*/);
John Spurlock856edeb2014-06-01 20:36:47 -0400763 break;
764 }
765 }
766 if (newCondition == null) {
767 mBucketIndex = DEFAULT_BUCKET_INDEX;
John Spurlockc90e6fe2014-10-28 11:21:42 -0400768 newCondition = ZenModeConfig.toTimeCondition(mContext,
Selim Cinek9c4a7072014-11-21 17:44:34 +0100769 MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
John Spurlock856edeb2014-06-01 20:36:47 -0400770 }
771 } else {
772 // on a known index, simply increment or decrement
773 mBucketIndex = Math.max(0, Math.min(N - 1, mBucketIndex + (up ? 1 : -1)));
John Spurlockc90e6fe2014-10-28 11:21:42 -0400774 newCondition = ZenModeConfig.toTimeCondition(mContext,
Selim Cinek9c4a7072014-11-21 17:44:34 +0100775 MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
John Spurlock856edeb2014-06-01 20:36:47 -0400776 }
John Spurlock4db0d982014-08-13 09:19:03 -0400777 mTimeCondition = newCondition;
Julia Reynolds0842fe82015-10-01 14:34:22 -0400778 bind(mTimeCondition, row, rowId);
Julia Reynolds656f9862016-06-01 11:37:29 -0400779 tag.rb.setChecked(true);
John Spurlock4db0d982014-08-13 09:19:03 -0400780 select(mTimeCondition);
John Spurlocka0457c22014-09-26 13:22:08 -0400781 announceConditionSelection(tag);
John Spurlock856edeb2014-06-01 20:36:47 -0400782 }
783
John Spurlock530052a2014-11-30 16:26:19 -0500784 private void select(final Condition condition) {
John Spurlock4db0d982014-08-13 09:19:03 -0400785 if (DEBUG) Log.d(mTag, "select " + condition);
John Spurlockb2278d62015-04-07 12:47:12 -0400786 if (mSessionZen == -1 || mSessionZen == Global.ZEN_MODE_OFF) {
787 if (DEBUG) Log.d(mTag, "Ignoring condition selection outside of manual zen");
788 return;
789 }
790 final Uri realConditionId = getRealConditionId(condition);
John Spurlock856edeb2014-06-01 20:36:47 -0400791 if (mController != null) {
John Spurlock530052a2014-11-30 16:26:19 -0500792 AsyncTask.execute(new Runnable() {
793 @Override
794 public void run() {
John Spurlockb2278d62015-04-07 12:47:12 -0400795 mController.setZen(mSessionZen, realConditionId, TAG + ".selectCondition");
John Spurlock530052a2014-11-30 16:26:19 -0500796 }
797 });
John Spurlock856edeb2014-06-01 20:36:47 -0400798 }
John Spurlock4db0d982014-08-13 09:19:03 -0400799 setExitCondition(condition);
John Spurlockb2278d62015-04-07 12:47:12 -0400800 if (realConditionId == null) {
John Spurlock8f8ecd62014-08-27 17:46:03 -0400801 mPrefs.setMinuteIndex(-1);
John Spurlock530052a2014-11-30 16:26:19 -0500802 } else if (isCountdown(condition) && mBucketIndex != -1) {
John Spurlock8f8ecd62014-08-27 17:46:03 -0400803 mPrefs.setMinuteIndex(mBucketIndex);
John Spurlock86005342014-05-23 11:58:00 -0400804 }
John Spurlock530052a2014-11-30 16:26:19 -0500805 setSessionExitCondition(copy(condition));
John Spurlock86005342014-05-23 11:58:00 -0400806 }
807
John Spurlock86005342014-05-23 11:58:00 -0400808 private void fireInteraction() {
809 if (mCallback != null) {
810 mCallback.onInteraction();
811 }
812 }
813
John Spurlockae641c92014-06-30 18:11:40 -0400814 private void fireExpanded() {
815 if (mCallback != null) {
816 mCallback.onExpanded(mExpanded);
817 }
818 }
819
John Spurlock86005342014-05-23 11:58:00 -0400820 private final ZenModeController.Callback mZenCallback = new ZenModeController.Callback() {
821 @Override
John Spurlockb2278d62015-04-07 12:47:12 -0400822 public void onManualRuleChanged(ZenRule rule) {
823 mHandler.obtainMessage(H.MANUAL_RULE_CHANGED, rule).sendToTarget();
John Spurlock856edeb2014-06-01 20:36:47 -0400824 }
John Spurlock86005342014-05-23 11:58:00 -0400825 };
826
827 private final class H extends Handler {
John Spurlockb2278d62015-04-07 12:47:12 -0400828 private static final int MANUAL_RULE_CHANGED = 2;
John Spurlockf55b7f22015-04-13 19:21:26 -0400829 private static final int UPDATE_WIDGETS = 3;
John Spurlock86005342014-05-23 11:58:00 -0400830
831 private H() {
832 super(Looper.getMainLooper());
833 }
834
835 @Override
836 public void handleMessage(Message msg) {
John Spurlockf55b7f22015-04-13 19:21:26 -0400837 switch (msg.what) {
John Spurlockf55b7f22015-04-13 19:21:26 -0400838 case MANUAL_RULE_CHANGED: handleUpdateManualRule((ZenRule) msg.obj); break;
839 case UPDATE_WIDGETS: updateWidgets(); break;
John Spurlock86005342014-05-23 11:58:00 -0400840 }
841 }
842 }
843
844 public interface Callback {
John Spurlockf55b7f22015-04-13 19:21:26 -0400845 void onPrioritySettings();
John Spurlock86005342014-05-23 11:58:00 -0400846 void onInteraction();
John Spurlockae641c92014-06-30 18:11:40 -0400847 void onExpanded(boolean expanded);
John Spurlock86005342014-05-23 11:58:00 -0400848 }
John Spurlock856edeb2014-06-01 20:36:47 -0400849
850 // used as the view tag on condition rows
851 private static class ConditionTag {
852 RadioButton rb;
John Spurlockc90e6fe2014-10-28 11:21:42 -0400853 View lines;
854 TextView line1;
855 TextView line2;
John Spurlock4db0d982014-08-13 09:19:03 -0400856 Condition condition;
John Spurlock856edeb2014-06-01 20:36:47 -0400857 }
858
John Spurlockf55b7f22015-04-13 19:21:26 -0400859 private final class ZenPrefs implements OnSharedPreferenceChangeListener {
John Spurlock8f8ecd62014-08-27 17:46:03 -0400860 private final int mNoneDangerousThreshold;
John Spurlock856edeb2014-06-01 20:36:47 -0400861
862 private int mMinuteIndex;
John Spurlock8f8ecd62014-08-27 17:46:03 -0400863 private int mNoneSelected;
John Spurlockd9c75db2015-04-28 11:19:13 -0400864 private boolean mConfirmedPriorityIntroduction;
865 private boolean mConfirmedSilenceIntroduction;
John Spurlock856edeb2014-06-01 20:36:47 -0400866
John Spurlockf55b7f22015-04-13 19:21:26 -0400867 private ZenPrefs() {
John Spurlock8f8ecd62014-08-27 17:46:03 -0400868 mNoneDangerousThreshold = mContext.getResources()
869 .getInteger(R.integer.zen_mode_alarm_warning_threshold);
John Spurlockf55b7f22015-04-13 19:21:26 -0400870 Prefs.registerListener(mContext, this);
John Spurlock856edeb2014-06-01 20:36:47 -0400871 updateMinuteIndex();
John Spurlock8f8ecd62014-08-27 17:46:03 -0400872 updateNoneSelected();
John Spurlockd9c75db2015-04-28 11:19:13 -0400873 updateConfirmedPriorityIntroduction();
874 updateConfirmedSilenceIntroduction();
John Spurlock8f8ecd62014-08-27 17:46:03 -0400875 }
876
877 public void trackNoneSelected() {
878 mNoneSelected = clampNoneSelected(mNoneSelected + 1);
879 if (DEBUG) Log.d(mTag, "Setting none selected: " + mNoneSelected + " threshold="
880 + mNoneDangerousThreshold);
John Spurlockf55b7f22015-04-13 19:21:26 -0400881 Prefs.putInt(mContext, Prefs.Key.DND_NONE_SELECTED, mNoneSelected);
John Spurlock856edeb2014-06-01 20:36:47 -0400882 }
883
884 public int getMinuteIndex() {
885 return mMinuteIndex;
886 }
887
888 public void setMinuteIndex(int minuteIndex) {
John Spurlock8f8ecd62014-08-27 17:46:03 -0400889 minuteIndex = clampIndex(minuteIndex);
John Spurlock856edeb2014-06-01 20:36:47 -0400890 if (minuteIndex == mMinuteIndex) return;
John Spurlock8f8ecd62014-08-27 17:46:03 -0400891 mMinuteIndex = clampIndex(minuteIndex);
John Spurlock856edeb2014-06-01 20:36:47 -0400892 if (DEBUG) Log.d(mTag, "Setting favorite minute index: " + mMinuteIndex);
John Spurlockf55b7f22015-04-13 19:21:26 -0400893 Prefs.putInt(mContext, Prefs.Key.DND_FAVORITE_BUCKET_INDEX, mMinuteIndex);
John Spurlock856edeb2014-06-01 20:36:47 -0400894 }
895
896 @Override
897 public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
898 updateMinuteIndex();
John Spurlock8f8ecd62014-08-27 17:46:03 -0400899 updateNoneSelected();
John Spurlockd9c75db2015-04-28 11:19:13 -0400900 updateConfirmedPriorityIntroduction();
901 updateConfirmedSilenceIntroduction();
John Spurlock856edeb2014-06-01 20:36:47 -0400902 }
903
904 private void updateMinuteIndex() {
John Spurlockf55b7f22015-04-13 19:21:26 -0400905 mMinuteIndex = clampIndex(Prefs.getInt(mContext,
906 Prefs.Key.DND_FAVORITE_BUCKET_INDEX, DEFAULT_BUCKET_INDEX));
John Spurlock856edeb2014-06-01 20:36:47 -0400907 if (DEBUG) Log.d(mTag, "Favorite minute index: " + mMinuteIndex);
908 }
909
John Spurlock8f8ecd62014-08-27 17:46:03 -0400910 private int clampIndex(int index) {
911 return MathUtils.constrain(index, -1, MINUTE_BUCKETS.length - 1);
912 }
913
914 private void updateNoneSelected() {
John Spurlockf55b7f22015-04-13 19:21:26 -0400915 mNoneSelected = clampNoneSelected(Prefs.getInt(mContext,
916 Prefs.Key.DND_NONE_SELECTED, 0));
John Spurlock8f8ecd62014-08-27 17:46:03 -0400917 if (DEBUG) Log.d(mTag, "None selected: " + mNoneSelected);
918 }
919
920 private int clampNoneSelected(int noneSelected) {
921 return MathUtils.constrain(noneSelected, 0, Integer.MAX_VALUE);
John Spurlock856edeb2014-06-01 20:36:47 -0400922 }
John Spurlockf55b7f22015-04-13 19:21:26 -0400923
John Spurlockd9c75db2015-04-28 11:19:13 -0400924 private void updateConfirmedPriorityIntroduction() {
John Spurlockf55b7f22015-04-13 19:21:26 -0400925 final boolean confirmed = Prefs.getBoolean(mContext,
926 Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, false);
John Spurlockd9c75db2015-04-28 11:19:13 -0400927 if (confirmed == mConfirmedPriorityIntroduction) return;
928 mConfirmedPriorityIntroduction = confirmed;
929 if (DEBUG) Log.d(mTag, "Confirmed priority introduction: "
930 + mConfirmedPriorityIntroduction);
931 }
932
933 private void updateConfirmedSilenceIntroduction() {
934 final boolean confirmed = Prefs.getBoolean(mContext,
935 Prefs.Key.DND_CONFIRMED_SILENCE_INTRODUCTION, false);
936 if (confirmed == mConfirmedSilenceIntroduction) return;
937 mConfirmedSilenceIntroduction = confirmed;
938 if (DEBUG) Log.d(mTag, "Confirmed silence introduction: "
939 + mConfirmedSilenceIntroduction);
John Spurlockf55b7f22015-04-13 19:21:26 -0400940 }
John Spurlock856edeb2014-06-01 20:36:47 -0400941 }
John Spurlockae641c92014-06-30 18:11:40 -0400942
Muyuan Li8303bd22016-03-23 20:08:26 -0700943 protected final SegmentedButtons.Callback mZenButtonsCallback = new SegmentedButtons.Callback() {
John Spurlockae641c92014-06-30 18:11:40 -0400944 @Override
Chris Wren4572cbc2015-06-29 11:27:18 -0400945 public void onSelected(final Object value, boolean fromClick) {
John Spurlockb2278d62015-04-07 12:47:12 -0400946 if (value != null && mZenButtons.isShown() && isAttachedToWindow()) {
John Spurlockd9c75db2015-04-28 11:19:13 -0400947 final int zen = (Integer) value;
Chris Wren4572cbc2015-06-29 11:27:18 -0400948 if (fromClick) {
Chris Wrenf6e9228b2016-01-26 18:04:35 -0500949 MetricsLogger.action(mContext, MetricsEvent.QS_DND_ZEN_SELECT, zen);
Chris Wren4572cbc2015-06-29 11:27:18 -0400950 }
John Spurlockd9c75db2015-04-28 11:19:13 -0400951 if (DEBUG) Log.d(mTag, "mZenButtonsCallback selected=" + zen);
John Spurlockb2278d62015-04-07 12:47:12 -0400952 final Uri realConditionId = getRealConditionId(mSessionExitCondition);
John Spurlock530052a2014-11-30 16:26:19 -0500953 AsyncTask.execute(new Runnable() {
954 @Override
955 public void run() {
John Spurlockd9c75db2015-04-28 11:19:13 -0400956 mController.setZen(zen, realConditionId, TAG + ".selectZen");
957 if (zen != Global.ZEN_MODE_OFF) {
958 Prefs.putInt(mContext, Prefs.Key.DND_FAVORITE_ZEN, zen);
959 }
John Spurlock530052a2014-11-30 16:26:19 -0500960 }
961 });
John Spurlockae641c92014-06-30 18:11:40 -0400962 }
963 }
John Spurlocka0457c22014-09-26 13:22:08 -0400964
965 @Override
966 public void onInteraction() {
967 fireInteraction();
968 }
969 };
970
971 private final Interaction.Callback mInteractionCallback = new Interaction.Callback() {
972 @Override
973 public void onInteraction() {
974 fireInteraction();
975 }
John Spurlockae641c92014-06-30 18:11:40 -0400976 };
John Spurlock530052a2014-11-30 16:26:19 -0500977
978 private final class TransitionHelper implements TransitionListener, Runnable {
979 private final ArraySet<View> mTransitioningViews = new ArraySet<View>();
980
981 private boolean mTransitioning;
John Spurlock530052a2014-11-30 16:26:19 -0500982 private boolean mPendingUpdateWidgets;
983
984 public void clear() {
985 mTransitioningViews.clear();
Julia Reynolds0842fe82015-10-01 14:34:22 -0400986 mPendingUpdateWidgets = false;
John Spurlock530052a2014-11-30 16:26:19 -0500987 }
988
989 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
990 pw.println(" TransitionHelper state:");
John Spurlock530052a2014-11-30 16:26:19 -0500991 pw.print(" mPendingUpdateWidgets="); pw.println(mPendingUpdateWidgets);
992 pw.print(" mTransitioning="); pw.println(mTransitioning);
993 pw.print(" mTransitioningViews="); pw.println(mTransitioningViews);
994 }
995
John Spurlock530052a2014-11-30 16:26:19 -0500996 public void pendingUpdateWidgets() {
997 mPendingUpdateWidgets = true;
998 }
999
1000 public boolean isTransitioning() {
1001 return !mTransitioningViews.isEmpty();
1002 }
1003
1004 @Override
1005 public void startTransition(LayoutTransition transition,
1006 ViewGroup container, View view, int transitionType) {
1007 mTransitioningViews.add(view);
1008 updateTransitioning();
1009 }
1010
1011 @Override
1012 public void endTransition(LayoutTransition transition,
1013 ViewGroup container, View view, int transitionType) {
1014 mTransitioningViews.remove(view);
1015 updateTransitioning();
1016 }
1017
1018 @Override
1019 public void run() {
1020 if (DEBUG) Log.d(mTag, "TransitionHelper run"
Julia Reynolds0842fe82015-10-01 14:34:22 -04001021 + " mPendingUpdateWidgets=" + mPendingUpdateWidgets);
John Spurlock530052a2014-11-30 16:26:19 -05001022 if (mPendingUpdateWidgets) {
1023 updateWidgets();
1024 }
Julia Reynolds0842fe82015-10-01 14:34:22 -04001025 mPendingUpdateWidgets = false;
John Spurlock530052a2014-11-30 16:26:19 -05001026 }
1027
1028 private void updateTransitioning() {
1029 final boolean transitioning = isTransitioning();
1030 if (mTransitioning == transitioning) return;
1031 mTransitioning = transitioning;
1032 if (DEBUG) Log.d(mTag, "TransitionHelper mTransitioning=" + mTransitioning);
1033 if (!mTransitioning) {
Julia Reynolds0842fe82015-10-01 14:34:22 -04001034 if (mPendingUpdateWidgets) {
John Spurlock530052a2014-11-30 16:26:19 -05001035 mHandler.post(this);
1036 } else {
Julia Reynolds0842fe82015-10-01 14:34:22 -04001037 mPendingUpdateWidgets = false;
John Spurlock530052a2014-11-30 16:26:19 -05001038 }
1039 }
1040 }
1041 }
John Spurlock86005342014-05-23 11:58:00 -04001042}