10842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds/**
28600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock * Copyright (C) 2014 The Android Open Source Project
38600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock *
48600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License");
58600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock * you may not use this file except in compliance with the License.
68600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock * You may obtain a copy of the License at
78600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock *
88600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock *      http://www.apache.org/licenses/LICENSE-2.0
98600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock *
108600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock * Unless required by applicable law or agreed to in writing, software
118600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS,
128600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock * See the License for the specific language governing permissions and
148600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock * limitations under the License.
158600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock */
168600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
178600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockpackage com.android.systemui.volume;
188600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
193e0770163686c1be83959d681976dafaf25272e1John Spurlockimport android.animation.LayoutTransition;
20530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlockimport android.animation.LayoutTransition.TransitionListener;
219c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinekimport android.app.ActivityManager;
228600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.content.Context;
238600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.content.Intent;
24856edebad73560e9b1cce021a7de9a0470d07176John Spurlockimport android.content.SharedPreferences;
25856edebad73560e9b1cce021a7de9a0470d07176John Spurlockimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;
26814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlockimport android.content.res.Configuration;
278600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.net.Uri;
28530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlockimport android.os.AsyncTask;
298600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.os.Handler;
308600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.os.Looper;
318600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.os.Message;
328600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.provider.Settings;
33ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlockimport android.provider.Settings.Global;
348600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.service.notification.Condition;
35856edebad73560e9b1cce021a7de9a0470d07176John Spurlockimport android.service.notification.ZenModeConfig;
36b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlockimport android.service.notification.ZenModeConfig.ZenRule;
37c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlockimport android.text.TextUtils;
388be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlockimport android.text.format.DateFormat;
39530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlockimport android.util.ArraySet;
408600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.util.AttributeSet;
41856edebad73560e9b1cce021a7de9a0470d07176John Spurlockimport android.util.Log;
428f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlockimport android.util.MathUtils;
438600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.view.LayoutInflater;
448600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.view.View;
453e0770163686c1be83959d681976dafaf25272e1John Spurlockimport android.view.ViewGroup;
468600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.CompoundButton;
478600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.CompoundButton.OnCheckedChangeListener;
488600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.ImageView;
498600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.LinearLayout;
508600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.RadioButton;
51656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynoldsimport android.widget.RadioGroup;
528600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.TextView;
538600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
549e7283f6a31bc2beb75c84c6173968a46582c563Chris Wrenimport com.android.internal.logging.MetricsLogger;
55f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent;
56f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlockimport com.android.systemui.Prefs;
578600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport com.android.systemui.R;
588600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport com.android.systemui.statusbar.policy.ZenModeController;
598600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
60530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlockimport java.io.FileDescriptor;
61530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlockimport java.io.PrintWriter;
628600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport java.util.Arrays;
630842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynoldsimport java.util.Calendar;
640842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynoldsimport java.util.GregorianCalendar;
658be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlockimport java.util.Locale;
66856edebad73560e9b1cce021a7de9a0470d07176John Spurlockimport java.util.Objects;
678600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
688600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockpublic class ZenModePanel extends LinearLayout {
69ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private static final String TAG = "ZenModePanel";
70ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
71856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
7250806fc4ceff4bb093a18bdecb506163e68b9cbbJohn Spurlock    private static final int SECONDS_MS = 1000;
7350806fc4ceff4bb093a18bdecb506163e68b9cbbJohn Spurlock    private static final int MINUTES_MS = 60 * SECONDS_MS;
7450806fc4ceff4bb093a18bdecb506163e68b9cbbJohn Spurlock
750ca82fecc2acb7ef0688d2fd22a39838ebf4f1dfJulia Reynolds    private static final int[] MINUTE_BUCKETS = ZenModeConfig.MINUTE_BUCKETS;
76856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    private static final int MIN_BUCKET_MINUTES = MINUTE_BUCKETS[0];
77856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    private static final int MAX_BUCKET_MINUTES = MINUTE_BUCKETS[MINUTE_BUCKETS.length - 1];
78856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    private static final int DEFAULT_BUCKET_INDEX = Arrays.binarySearch(MINUTE_BUCKETS, 60);
79ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private static final int FOREVER_CONDITION_INDEX = 0;
80530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private static final int COUNTDOWN_CONDITION_INDEX = 1;
810842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds    private static final int COUNTDOWN_ALARM_CONDITION_INDEX = 2;
828e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds    private static final int COUNTDOWN_CONDITION_COUNT = 2;
83856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
84f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock    public static final Intent ZEN_SETTINGS
85f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS);
86f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock    public static final Intent ZEN_PRIORITY_SETTINGS
87f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            = new Intent(Settings.ACTION_ZEN_MODE_PRIORITY_SETTINGS);
888600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
897f1df5e98578f8532a5e009009e7c1f82ed5885cJohn Spurlock    private final Context mContext;
9094fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li    protected final LayoutInflater mInflater;
918600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    private final H mHandler = new H();
92f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock    private final ZenPrefs mPrefs;
93530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private final TransitionHelper mTransitionHelper = new TransitionHelper();
940b688503754737a20165f0cff1833e714a5c4164John Spurlock    private final Uri mForeverId;
95d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock    private final SpTexts mSpTexts;
96856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
97eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock    private String mTag = TAG + "/" + Integer.toHexString(System.identityHashCode(this));
98ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
998303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li    protected SegmentedButtons mZenButtons;
100f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock    private View mZenIntroduction;
101d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock    private TextView mZenIntroductionMessage;
102f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock    private View mZenIntroductionConfirm;
103d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock    private TextView mZenIntroductionCustomize;
10494fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li    protected LinearLayout mZenConditions;
1058be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock    private TextView mZenAlarmWarning;
106656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds    private RadioGroup mZenRadioGroup;
107656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds    private LinearLayout mZenRadioGroupContent;
108ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
1098600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    private Callback mCallback;
1108600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    private ZenModeController mController;
111ad680d46be19cbee16d42cbed4d2ed250648ac0bJohn Spurlock    private boolean mCountdownConditionSupported;
1128600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    private boolean mRequestingConditions;
1134db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    private Condition mExitCondition;
114856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    private int mBucketIndex = -1;
115ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private boolean mExpanded;
116530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private boolean mHidden;
117fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock    private int mSessionZen;
1188f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock    private int mAttachedZen;
1193e0770163686c1be83959d681976dafaf25272e1John Spurlock    private boolean mAttached;
1204db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    private Condition mSessionExitCondition;
1214db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    private Condition[] mConditions;
1224db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    private Condition mTimeCondition;
123cbd7a31a4440eea6d1f648a9e54e55677547ab7bJohn Spurlock    private boolean mVoiceCapable;
1248600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
1258600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    public ZenModePanel(Context context, AttributeSet attrs) {
1268600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        super(context, attrs);
1277f1df5e98578f8532a5e009009e7c1f82ed5885cJohn Spurlock        mContext = context;
128f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        mPrefs = new ZenPrefs();
129f7d22132c2c9b83134b05aaed63a89f61c639fd9John Spurlock        mInflater = LayoutInflater.from(mContext.getApplicationContext());
1300b688503754737a20165f0cff1833e714a5c4164John Spurlock        mForeverId = Condition.newId(mContext).appendPath("forever").build();
131d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock        mSpTexts = new SpTexts(mContext);
132cbd7a31a4440eea6d1f648a9e54e55677547ab7bJohn Spurlock        mVoiceCapable = Util.isVoiceCapable(mContext);
133856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (DEBUG) Log.d(mTag, "new ZenModePanel");
134856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
135856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
136530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
137530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        pw.println("ZenModePanel state:");
138530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        pw.print("  mCountdownConditionSupported="); pw.println(mCountdownConditionSupported);
139530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        pw.print("  mRequestingConditions="); pw.println(mRequestingConditions);
140530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        pw.print("  mAttached="); pw.println(mAttached);
141530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        pw.print("  mHidden="); pw.println(mHidden);
142530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        pw.print("  mExpanded="); pw.println(mExpanded);
143530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        pw.print("  mSessionZen="); pw.println(mSessionZen);
144530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        pw.print("  mAttachedZen="); pw.println(mAttachedZen);
145d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        pw.print("  mConfirmedPriorityIntroduction=");
146d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        pw.println(mPrefs.mConfirmedPriorityIntroduction);
147d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        pw.print("  mConfirmedSilenceIntroduction=");
148d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        pw.println(mPrefs.mConfirmedSilenceIntroduction);
149cbd7a31a4440eea6d1f648a9e54e55677547ab7bJohn Spurlock        pw.print("  mVoiceCapable="); pw.println(mVoiceCapable);
150530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        mTransitionHelper.dump(fd, pw, args);
151530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    }
152530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
1538303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li    protected void createZenButtons() {
154ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        mZenButtons = (SegmentedButtons) findViewById(R.id.zen_buttons);
1554f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock        mZenButtons.addButton(R.string.interruption_level_none_twoline,
156bd1abe631cb0a405605babd811b5fd4dbe9e0cf8John Spurlock                R.string.interruption_level_none_with_warning,
1574f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock                Global.ZEN_MODE_NO_INTERRUPTIONS);
1584f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock        mZenButtons.addButton(R.string.interruption_level_alarms_twoline,
159a1c7ffe755d414a1082920ce1742a8ae82d81529John Spurlock                R.string.interruption_level_alarms,
1604f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock                Global.ZEN_MODE_ALARMS);
1614f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock        mZenButtons.addButton(R.string.interruption_level_priority_twoline,
162a1c7ffe755d414a1082920ce1742a8ae82d81529John Spurlock                R.string.interruption_level_priority,
1634291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock                Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
164ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        mZenButtons.setCallback(mZenButtonsCallback);
1658303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li    }
166ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
1678303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li    @Override
1688303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li    protected void onFinishInflate() {
1698303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li        super.onFinishInflate();
1708303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li        createZenButtons();
171f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        mZenIntroduction = findViewById(R.id.zen_introduction);
172d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        mZenIntroductionMessage = (TextView) findViewById(R.id.zen_introduction_message);
173d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock        mSpTexts.add(mZenIntroductionMessage);
174f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        mZenIntroductionConfirm = findViewById(R.id.zen_introduction_confirm);
175f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        mZenIntroductionConfirm.setOnClickListener(new OnClickListener() {
176f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            @Override
177f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            public void onClick(View v) {
178f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                confirmZenIntroduction();
179f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            }
180f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        });
181d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock        mZenIntroductionCustomize = (TextView) findViewById(R.id.zen_introduction_customize);
182f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        mZenIntroductionCustomize.setOnClickListener(new OnClickListener() {
183f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            @Override
184f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            public void onClick(View v) {
185f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                confirmZenIntroduction();
186f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                if (mCallback != null) {
187f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                    mCallback.onPrioritySettings();
188f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                }
189f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            }
190f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        });
191d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock        mSpTexts.add(mZenIntroductionCustomize);
192f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock
193ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        mZenConditions = (LinearLayout) findViewById(R.id.zen_conditions);
1948be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        mZenAlarmWarning = (TextView) findViewById(R.id.zen_alarm_warning);
195656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds        mZenRadioGroup = (RadioGroup) findViewById(R.id.zen_radio_buttons);
196656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds        mZenRadioGroupContent = (LinearLayout) findViewById(R.id.zen_radio_buttons_content);
197814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock    }
198530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
199814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock    @Override
200814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock    protected void onConfigurationChanged(Configuration newConfig) {
201814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock        super.onConfigurationChanged(newConfig);
202814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock        if (mZenButtons != null) {
203814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock            mZenButtons.updateLocale();
204814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock        }
2053e0770163686c1be83959d681976dafaf25272e1John Spurlock    }
2063e0770163686c1be83959d681976dafaf25272e1John Spurlock
207f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock    private void confirmZenIntroduction() {
208d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        final String prefKey = prefKeyForConfirmation(getSelectedZen(Global.ZEN_MODE_OFF));
209d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        if (prefKey == null) return;
210d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        if (DEBUG) Log.d(TAG, "confirmZenIntroduction " + prefKey);
211d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        Prefs.putBoolean(mContext, prefKey, true);
212f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        mHandler.sendEmptyMessage(H.UPDATE_WIDGETS);
213f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock    }
214f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock
215d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock    private static String prefKeyForConfirmation(int zen) {
216d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        switch (zen) {
217d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
218d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                return Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION;
219d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            case Global.ZEN_MODE_NO_INTERRUPTIONS:
220d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                return Prefs.Key.DND_CONFIRMED_SILENCE_INTRODUCTION;
221d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            default:
222d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                return null;
223530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
2248600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
2258600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
2268600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    @Override
227856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    protected void onAttachedToWindow() {
228856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        super.onAttachedToWindow();
229856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (DEBUG) Log.d(mTag, "onAttachedToWindow");
2303e0770163686c1be83959d681976dafaf25272e1John Spurlock        mAttached = true;
2318f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        mAttachedZen = getSelectedZen(-1);
2328f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        mSessionZen = mAttachedZen;
233530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        mTransitionHelper.clear();
234b44ef7eb43a07b7c2968d21f53a5b30243229bdbJulia Reynolds        mController.addCallback(mZenCallback);
235530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        setSessionExitCondition(copy(mExitCondition));
23650806fc4ceff4bb093a18bdecb506163e68b9cbbJohn Spurlock        updateWidgets();
2373e0770163686c1be83959d681976dafaf25272e1John Spurlock        setRequestingConditions(!mHidden);
238856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
239856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
240856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    @Override
241856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    protected void onDetachedFromWindow() {
242856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        super.onDetachedFromWindow();
243856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (DEBUG) Log.d(mTag, "onDetachedFromWindow");
2448f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        checkForAttachedZenChange();
2453e0770163686c1be83959d681976dafaf25272e1John Spurlock        mAttached = false;
2468f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        mAttachedZen = -1;
247fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock        mSessionZen = -1;
248b44ef7eb43a07b7c2968d21f53a5b30243229bdbJulia Reynolds        mController.removeCallback(mZenCallback);
249530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        setSessionExitCondition(null);
2503e0770163686c1be83959d681976dafaf25272e1John Spurlock        setRequestingConditions(false);
251530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        mTransitionHelper.clear();
252530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    }
253530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
254530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private void setSessionExitCondition(Condition condition) {
255530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (Objects.equals(condition, mSessionExitCondition)) return;
256530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (DEBUG) Log.d(mTag, "mSessionExitCondition=" + getConditionId(condition));
257530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        mSessionExitCondition = condition;
258856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
259856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
260eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock    public void setHidden(boolean hidden) {
261eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock        if (mHidden == hidden) return;
2623e0770163686c1be83959d681976dafaf25272e1John Spurlock        if (DEBUG) Log.d(mTag, "hidden=" + hidden);
263eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock        mHidden = hidden;
2643e0770163686c1be83959d681976dafaf25272e1John Spurlock        setRequestingConditions(mAttached && !mHidden);
265eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock        updateWidgets();
266eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock    }
267eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock
2688f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock    private void checkForAttachedZenChange() {
2698f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        final int selectedZen = getSelectedZen(-1);
2708f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        if (DEBUG) Log.d(mTag, "selectedZen=" + selectedZen);
2718f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        if (selectedZen != mAttachedZen) {
2728f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            if (DEBUG) Log.d(mTag, "attachedZen: " + mAttachedZen + " -> " + selectedZen);
2738f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            if (selectedZen == Global.ZEN_MODE_NO_INTERRUPTIONS) {
2748f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock                mPrefs.trackNoneSelected();
2758f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            }
2768f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        }
2778f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock    }
2788f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock
279ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private void setExpanded(boolean expanded) {
280ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        if (expanded == mExpanded) return;
281f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock        if (DEBUG) Log.d(mTag, "setExpanded " + expanded);
282ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        mExpanded = expanded;
283b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        if (mExpanded && isShown()) {
2843e0770163686c1be83959d681976dafaf25272e1John Spurlock            ensureSelection();
2853e0770163686c1be83959d681976dafaf25272e1John Spurlock        }
286ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        updateWidgets();
287ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        fireExpanded();
2888600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
2898600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
2908600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    /** Start or stop requesting relevant zen mode exit conditions */
291530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private void setRequestingConditions(final boolean requesting) {
2928600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        if (mRequestingConditions == requesting) return;
293856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (DEBUG) Log.d(mTag, "setRequestingConditions " + requesting);
2948600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        mRequestingConditions = requesting;
2958600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        if (mRequestingConditions) {
296b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            mTimeCondition = parseExistingTimeCondition(mContext, mExitCondition);
2974db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock            if (mTimeCondition != null) {
298856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                mBucketIndex = -1;
299856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            } else {
300856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                mBucketIndex = DEFAULT_BUCKET_INDEX;
301c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock                mTimeCondition = ZenModeConfig.toTimeCondition(mContext,
3029c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek                        MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
303856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            }
304856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            if (DEBUG) Log.d(mTag, "Initial bucket index: " + mBucketIndex);
3050842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds
3064db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock            mConditions = null; // reset conditions
3074db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock            handleUpdateConditions();
3088600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        } else {
309530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            hideAllConditions();
3108600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        }
3118600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
3128600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
31394fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li    protected void addZenConditions(int count) {
31494fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li        for (int i = 0; i < count; i++) {
315656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            final View rb = mInflater.inflate(R.layout.zen_mode_button, this, false);
316656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            rb.setId(i);
317656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            mZenRadioGroup.addView(rb);
318656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            final View rbc = mInflater.inflate(R.layout.zen_mode_condition, this, false);
319656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            rbc.setId(i + count);
320656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            mZenRadioGroupContent.addView(rbc);
32194fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li        }
32294fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li    }
32394fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li
324eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock    public void init(ZenModeController controller) {
3258600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        mController = controller;
326ad680d46be19cbee16d42cbed4d2ed250648ac0bJohn Spurlock        mCountdownConditionSupported = mController.isCountdownConditionSupported();
3278e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds        final int countdownDelta = mCountdownConditionSupported ? COUNTDOWN_CONDITION_COUNT : 0;
328ad680d46be19cbee16d42cbed4d2ed250648ac0bJohn Spurlock        final int minConditions = 1 /*forever*/ + countdownDelta;
32994fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li        addZenConditions(minConditions);
330fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock        mSessionZen = getSelectedZen(-1);
331b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        handleUpdateManualRule(mController.getManualRule());
3324db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        if (DEBUG) Log.d(mTag, "init mExitCondition=" + mExitCondition);
333530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        hideAllConditions();
334ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    }
335ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
336e2f4771a0105ad6a94ff759353ca00c3a5fba72aJason Monk    public void updateLocale() {
3374291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock        mZenButtons.updateLocale();
338e2f4771a0105ad6a94ff759353ca00c3a5fba72aJason Monk    }
339e2f4771a0105ad6a94ff759353ca00c3a5fba72aJason Monk
3404db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    private void setExitCondition(Condition exitCondition) {
34125c3421c5e65ddc7f2b2bf1b1208f3634e6f5256John Spurlock        if (Objects.equals(mExitCondition, exitCondition)) return;
3424db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        mExitCondition = exitCondition;
343530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (DEBUG) Log.d(mTag, "mExitCondition=" + getConditionId(mExitCondition));
34489f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock        updateWidgets();
345ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    }
346ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
3474db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    private static Uri getConditionId(Condition condition) {
3484db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        return condition != null ? condition.id : null;
3494db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    }
3504db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock
351b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private Uri getRealConditionId(Condition condition) {
352b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        return isForever(condition) ? null : getConditionId(condition);
353b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    }
354b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock
3554db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    private static boolean sameConditionId(Condition lhs, Condition rhs) {
3564db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        return lhs == null ? rhs == null : rhs != null && lhs.id.equals(rhs.id);
3574db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    }
3584db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock
3594db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    private static Condition copy(Condition condition) {
3604db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        return condition == null ? null : condition.copy();
3614db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    }
3624db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock
3638600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    public void setCallback(Callback callback) {
3648600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        mCallback = callback;
3658600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
3668600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
367b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private void handleUpdateManualRule(ZenRule rule) {
368b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        final int zen = rule != null ? rule.zenMode : Global.ZEN_MODE_OFF;
369b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        handleUpdateZen(zen);
370b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        final Condition c = rule != null ? rule.condition : null;
371b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        handleExitConditionChanged(c);
372b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    }
373b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock
374ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private void handleUpdateZen(int zen) {
375fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock        if (mSessionZen != -1 && mSessionZen != zen) {
376d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            setExpanded(isShown());
377fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock            mSessionZen = zen;
378ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        }
3794572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren        mZenButtons.setSelectedValue(zen, false /* fromClick */);
380ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        updateWidgets();
381530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        handleUpdateConditions();
382530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (mExpanded) {
383530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            final Condition selected = getSelectedCondition();
384530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            if (!Objects.equals(mExitCondition, selected)) {
385530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                select(selected);
386530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            }
387530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
388530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    }
389530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
390b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private void handleExitConditionChanged(Condition exitCondition) {
391b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        setExitCondition(exitCondition);
392b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        if (DEBUG) Log.d(mTag, "handleExitConditionChanged " + mExitCondition);
393b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        final int N = getVisibleConditions();
394b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        for (int i = 0; i < N; i++) {
395b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            final ConditionTag tag = getConditionTagAt(i);
396b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            if (tag != null) {
397b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock                if (sameConditionId(tag.condition, mExitCondition)) {
398656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds                    bind(exitCondition, mZenRadioGroupContent.getChildAt(i), i);
399b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock                }
400b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            }
401b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        }
402b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    }
403b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock
404530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private Condition getSelectedCondition() {
405530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        final int N = getVisibleConditions();
406530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        for (int i = 0; i < N; i++) {
407530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            final ConditionTag tag = getConditionTagAt(i);
408530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            if (tag != null && tag.rb.isChecked()) {
409530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                return tag.condition;
410530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            }
411530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
412530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        return null;
413ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    }
414ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
415ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private int getSelectedZen(int defValue) {
416ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        final Object zen = mZenButtons.getSelectedValue();
417ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        return zen != null ? (Integer) zen : defValue;
418ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    }
419ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
420ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private void updateWidgets() {
421530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (mTransitionHelper.isTransitioning()) {
422530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            mTransitionHelper.pendingUpdateWidgets();
423530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            return;
424530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
425ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        final int zen = getSelectedZen(Global.ZEN_MODE_OFF);
426ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        final boolean zenImportant = zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
427ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        final boolean zenNone = zen == Global.ZEN_MODE_NO_INTERRUPTIONS;
428d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        final boolean introduction = (zenImportant && !mPrefs.mConfirmedPriorityIntroduction
429d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                        || zenNone && !mPrefs.mConfirmedSilenceIntroduction);
430eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock
431eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock        mZenButtons.setVisibility(mHidden ? GONE : VISIBLE);
432f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        mZenIntroduction.setVisibility(introduction ? VISIBLE : GONE);
433d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        if (introduction) {
434d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            mZenIntroductionMessage.setText(zenImportant ? R.string.zen_priority_introduction
435cbd7a31a4440eea6d1f648a9e54e55677547ab7bJohn Spurlock                    : mVoiceCapable ? R.string.zen_silence_introduction_voice
436d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                    : R.string.zen_silence_introduction);
437d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            mZenIntroductionCustomize.setVisibility(zenImportant ? VISIBLE : GONE);
438d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        }
4398be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final String warning = computeAlarmWarningText(zenNone);
4408be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        mZenAlarmWarning.setVisibility(warning != null ? VISIBLE : GONE);
4418be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        mZenAlarmWarning.setText(warning);
4428be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock    }
4438be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock
4448be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock    private String computeAlarmWarningText(boolean zenNone) {
4458be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        if (!zenNone) {
4468be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock            return null;
4478be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        }
4488be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final long now = System.currentTimeMillis();
4498be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final long nextAlarm = mController.getNextAlarm();
4508be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        if (nextAlarm < now) {
4518be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock            return null;
4528be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        }
4538be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        int warningRes = 0;
4548be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        if (mSessionExitCondition == null || isForever(mSessionExitCondition)) {
4558be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock            warningRes = R.string.zen_alarm_warning_indef;
4568be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        } else {
4578be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock            final long time = ZenModeConfig.tryParseCountdownConditionId(mSessionExitCondition.id);
4588be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock            if (time > now && nextAlarm < time) {
4598be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock                warningRes = R.string.zen_alarm_warning;
4608be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock            }
4618be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        }
4628be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        if (warningRes == 0) {
4638be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock            return null;
4648be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        }
4658be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final boolean soon = (nextAlarm - now) < 24 * 60 * 60 * 1000;
4668be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final boolean is24 = DateFormat.is24HourFormat(mContext, ActivityManager.getCurrentUser());
4678be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final String skeleton = soon ? (is24 ? "Hm" : "hma") : (is24 ? "EEEHm" : "EEEhma");
4688be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
4698be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final CharSequence formattedTime = DateFormat.format(pattern, nextAlarm);
4708be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final int templateRes = soon ? R.string.alarm_template : R.string.alarm_template_far;
4718be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        final String template = getResources().getString(templateRes, formattedTime);
4728be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock        return getResources().getString(warningRes, template);
47389f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    }
47489f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock
475b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private static Condition parseExistingTimeCondition(Context context, Condition condition) {
4764db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        if (condition == null) return null;
4774db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        final long time = ZenModeConfig.tryParseCountdownConditionId(condition.id);
478856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (time == 0) return null;
479c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        final long now = System.currentTimeMillis();
480c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        final long span = time - now;
481856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (span <= 0 || span > MAX_BUCKET_MINUTES * MINUTES_MS) return null;
482b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        return ZenModeConfig.toTimeCondition(context,
4830842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                time, Math.round(span / (float) MINUTES_MS), ActivityManager.getCurrentUser(),
484bbde26774fcf7ea65abd92d60f7468478c015053John Spurlock                false /*shortVersion*/);
4858600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
4868600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
4874db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    private void handleUpdateConditions() {
488530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (mTransitionHelper.isTransitioning()) {
489530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            return;
490530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
4914db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        final int conditionCount = mConditions == null ? 0 : mConditions.length;
4924db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        if (DEBUG) Log.d(mTag, "handleUpdateConditions conditionCount=" + conditionCount);
4934db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        // forever
494656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds        bind(forever(), mZenRadioGroupContent.getChildAt(FOREVER_CONDITION_INDEX),
4950842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                FOREVER_CONDITION_INDEX);
4964db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        // countdown
4970b688503754737a20165f0cff1833e714a5c4164John Spurlock        if (mCountdownConditionSupported && mTimeCondition != null) {
498656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            bind(mTimeCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
4990842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                    COUNTDOWN_CONDITION_INDEX);
500530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
5010842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        // countdown until alarm
5028e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds        if (mCountdownConditionSupported) {
5038e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds            Condition nextAlarmCondition = getTimeUntilNextAlarmCondition();
5048e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds            if (nextAlarmCondition != null) {
505c3960f66beb5daf9af1b7a914c8bc60cc6e02756Julia Reynolds                mZenRadioGroup.getChildAt(
506c3960f66beb5daf9af1b7a914c8bc60cc6e02756Julia Reynolds                        COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.VISIBLE);
507c3960f66beb5daf9af1b7a914c8bc60cc6e02756Julia Reynolds                mZenRadioGroupContent.getChildAt(
508c3960f66beb5daf9af1b7a914c8bc60cc6e02756Julia Reynolds                        COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.VISIBLE);
5098e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds                bind(nextAlarmCondition,
510656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds                        mZenRadioGroupContent.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX),
5118e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds                        COUNTDOWN_ALARM_CONDITION_INDEX);
512c3960f66beb5daf9af1b7a914c8bc60cc6e02756Julia Reynolds            } else {
513c3960f66beb5daf9af1b7a914c8bc60cc6e02756Julia Reynolds                mZenRadioGroup.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.GONE);
514c3960f66beb5daf9af1b7a914c8bc60cc6e02756Julia Reynolds                mZenRadioGroupContent.getChildAt(
515c3960f66beb5daf9af1b7a914c8bc60cc6e02756Julia Reynolds                        COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility(View.GONE);
5168e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds            }
5174db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        }
5183e0770163686c1be83959d681976dafaf25272e1John Spurlock        // ensure something is selected
519b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        if (mExpanded && isShown()) {
5203e0770163686c1be83959d681976dafaf25272e1John Spurlock            ensureSelection();
5213e0770163686c1be83959d681976dafaf25272e1John Spurlock        }
522e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk        mZenConditions.setVisibility(mSessionZen != Global.ZEN_MODE_OFF ? View.VISIBLE : View.GONE);
5234db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock    }
5244db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock
5250b688503754737a20165f0cff1833e714a5c4164John Spurlock    private Condition forever() {
526b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        return new Condition(mForeverId, foreverSummary(mContext), "", "", 0 /*icon*/,
527b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock                Condition.STATE_TRUE, 0 /*flags*/);
5280b688503754737a20165f0cff1833e714a5c4164John Spurlock    }
5290b688503754737a20165f0cff1833e714a5c4164John Spurlock
530b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private static String foreverSummary(Context context) {
531b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        return context.getString(com.android.internal.R.string.zen_mode_forever);
5320b688503754737a20165f0cff1833e714a5c4164John Spurlock    }
5330b688503754737a20165f0cff1833e714a5c4164John Spurlock
5340842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds    // Returns a time condition if the next alarm is within the next week.
5350842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds    private Condition getTimeUntilNextAlarmCondition() {
5360842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        GregorianCalendar weekRange = new GregorianCalendar();
5370842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        final long now = weekRange.getTimeInMillis();
5380842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        setToMidnight(weekRange);
53912d3393249f8a6d65ad6960758c4fe089ffc72cfDan Sandler        weekRange.add(Calendar.DATE, 6);
5400842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        final long nextAlarmMs = mController.getNextAlarm();
5410842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        if (nextAlarmMs > 0) {
5420842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds            GregorianCalendar nextAlarm = new GregorianCalendar();
5430842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds            nextAlarm.setTimeInMillis(nextAlarmMs);
5440842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds            setToMidnight(nextAlarm);
5450842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds
5460842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds            if (weekRange.compareTo(nextAlarm) >= 0) {
5471998ee56285419ff7fea0ec9a247e31d1d27a0abJulia Reynolds                return ZenModeConfig.toNextAlarmCondition(mContext, now,
5481998ee56285419ff7fea0ec9a247e31d1d27a0abJulia Reynolds                        nextAlarmMs, ActivityManager.getCurrentUser());
5490842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds            }
5500842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        }
5510842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        return null;
5520842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds    }
5530842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds
5540842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds    private void setToMidnight(Calendar calendar) {
5550842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        calendar.set(Calendar.HOUR_OF_DAY, 0);
5560842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        calendar.set(Calendar.MINUTE, 0);
5570842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        calendar.set(Calendar.SECOND, 0);
5580842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        calendar.set(Calendar.MILLISECOND, 0);
5590842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds    }
5600842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds
561856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    private ConditionTag getConditionTagAt(int index) {
562656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds        return (ConditionTag) mZenRadioGroupContent.getChildAt(index).getTag();
563856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
564856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
565530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private int getVisibleConditions() {
566530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        int rt = 0;
567656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds        final int N = mZenRadioGroupContent.getChildCount();
568530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        for (int i = 0; i < N; i++) {
569656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            rt += mZenRadioGroupContent.getChildAt(i).getVisibility() == VISIBLE ? 1 : 0;
570530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
571530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        return rt;
572530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    }
573530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
574530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private void hideAllConditions() {
575656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds        final int N = mZenRadioGroupContent.getChildCount();
576530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        for (int i = 0; i < N; i++) {
577656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            mZenRadioGroupContent.getChildAt(i).setVisibility(GONE);
578530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
579530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    }
580530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
5813e0770163686c1be83959d681976dafaf25272e1John Spurlock    private void ensureSelection() {
582856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        // are we left without anything selected?  if so, set a default
583530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        final int visibleConditions = getVisibleConditions();
584530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (visibleConditions == 0) return;
585530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        for (int i = 0; i < visibleConditions; i++) {
586530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            final ConditionTag tag = getConditionTagAt(i);
587530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            if (tag != null && tag.rb.isChecked()) {
588530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                if (DEBUG) Log.d(mTag, "Not selecting a default, checked=" + tag.condition);
589856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                return;
590856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            }
591856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
592530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        final ConditionTag foreverTag = getConditionTagAt(FOREVER_CONDITION_INDEX);
593530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (foreverTag == null) return;
594856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (DEBUG) Log.d(mTag, "Selecting a default");
5958f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        final int favoriteIndex = mPrefs.getMinuteIndex();
596530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (favoriteIndex == -1 || !mCountdownConditionSupported) {
597656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            foreverTag.rb.setChecked(true);
598856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        } else {
5999c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek            mTimeCondition = ZenModeConfig.toTimeCondition(mContext,
6009c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek                    MINUTE_BUCKETS[favoriteIndex], ActivityManager.getCurrentUser());
601856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            mBucketIndex = favoriteIndex;
602656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            bind(mTimeCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
6030842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                    COUNTDOWN_CONDITION_INDEX);
604656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
605856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
6068600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
6078600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
608b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private static boolean isCountdown(Condition c) {
609530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        return c != null && ZenModeConfig.isValidCountdownConditionId(c.id);
610530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    }
611530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
6120b688503754737a20165f0cff1833e714a5c4164John Spurlock    private boolean isForever(Condition c) {
6130b688503754737a20165f0cff1833e714a5c4164John Spurlock        return c != null && mForeverId.equals(c.id);
6140b688503754737a20165f0cff1833e714a5c4164John Spurlock    }
6150b688503754737a20165f0cff1833e714a5c4164John Spurlock
6160842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds    private void bind(final Condition condition, final View row, final int rowId) {
6170b688503754737a20165f0cff1833e714a5c4164John Spurlock        if (condition == null) throw new IllegalArgumentException("condition must not be null");
6180b688503754737a20165f0cff1833e714a5c4164John Spurlock        final boolean enabled = condition.state == Condition.STATE_TRUE;
619856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        final ConditionTag tag =
620856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                row.getTag() != null ? (ConditionTag) row.getTag() : new ConditionTag();
621856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        row.setTag(tag);
622530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        final boolean first = tag.rb == null;
623856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (tag.rb == null) {
624656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds            tag.rb = (RadioButton) mZenRadioGroup.getChildAt(rowId);
625856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
6264db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        tag.condition = condition;
627530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        final Uri conditionId = getConditionId(tag.condition);
628656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds        if (DEBUG) Log.d(mTag, "bind i=" + mZenRadioGroupContent.indexOfChild(row) + " first="
629656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds                + first + " condition=" + conditionId);
630856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        tag.rb.setEnabled(enabled);
631856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        tag.rb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
6328600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            @Override
6338600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
634ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock                if (mExpanded && isChecked) {
635656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds                    tag.rb.setChecked(true);
636530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                    if (DEBUG) Log.d(mTag, "onCheckedChanged " + conditionId);
637f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren                    MetricsLogger.action(mContext, MetricsEvent.QS_DND_CONDITION_SELECT);
6384db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock                    select(tag.condition);
639a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock                    announceConditionSelection(tag);
6408600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock                }
6418600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            }
6428600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        });
643a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock
644c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        if (tag.lines == null) {
645c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock            tag.lines = row.findViewById(android.R.id.content);
646a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        }
647c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        if (tag.line1 == null) {
648c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock            tag.line1 = (TextView) row.findViewById(android.R.id.text1);
649d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock            mSpTexts.add(tag.line1);
650c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        }
651c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        if (tag.line2 == null) {
652c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock            tag.line2 = (TextView) row.findViewById(android.R.id.text2);
653d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock            mSpTexts.add(tag.line2);
654c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        }
6550b688503754737a20165f0cff1833e714a5c4164John Spurlock        final String line1 = !TextUtils.isEmpty(condition.line1) ? condition.line1
6560b688503754737a20165f0cff1833e714a5c4164John Spurlock                : condition.summary;
6570b688503754737a20165f0cff1833e714a5c4164John Spurlock        final String line2 = condition.line2;
658c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        tag.line1.setText(line1);
659c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        if (TextUtils.isEmpty(line2)) {
660c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock            tag.line2.setVisibility(GONE);
6618600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        } else {
662c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock            tag.line2.setVisibility(VISIBLE);
663c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock            tag.line2.setText(line2);
6648600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        }
665c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        tag.lines.setEnabled(enabled);
666c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        tag.lines.setAlpha(enabled ? 1 : .4f);
667a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock
6688600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        final ImageView button1 = (ImageView) row.findViewById(android.R.id.button1);
6698600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        button1.setOnClickListener(new OnClickListener() {
6708600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            @Override
6718600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            public void onClick(View v) {
6720842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                onClickTimeButton(row, tag, false /*down*/, rowId);
6738600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            }
6748600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        });
6758600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
6768600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        final ImageView button2 = (ImageView) row.findViewById(android.R.id.button2);
6778600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        button2.setOnClickListener(new OnClickListener() {
6788600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            @Override
6798600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            public void onClick(View v) {
6800842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                onClickTimeButton(row, tag, true /*up*/, rowId);
6818600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            }
6828600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        });
683c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        tag.lines.setOnClickListener(new OnClickListener() {
6848600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            @Override
6858600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            public void onClick(View v) {
686656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds                tag.rb.setChecked(true);
6878600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            }
6888600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        });
689856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
690530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
6910842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        if (rowId != COUNTDOWN_ALARM_CONDITION_INDEX && time > 0) {
692530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            button1.setVisibility(VISIBLE);
693530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            button2.setVisibility(VISIBLE);
694856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            if (mBucketIndex > -1) {
695856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                button1.setEnabled(mBucketIndex > 0);
696856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                button2.setEnabled(mBucketIndex < MINUTE_BUCKETS.length - 1);
697856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            } else {
698856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                final long span = time - System.currentTimeMillis();
699856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                button1.setEnabled(span > MIN_BUCKET_MINUTES * MINUTES_MS);
700c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock                final Condition maxCondition = ZenModeConfig.toTimeCondition(mContext,
7019c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek                        MAX_BUCKET_MINUTES, ActivityManager.getCurrentUser());
702856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                button2.setEnabled(!Objects.equals(condition.summary, maxCondition.summary));
703856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            }
704856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
705856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            button1.setAlpha(button1.isEnabled() ? 1f : .5f);
706856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            button2.setAlpha(button2.isEnabled() ? 1f : .5f);
7078600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        } else {
708530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            button1.setVisibility(GONE);
709530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            button2.setVisibility(GONE);
7108600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        }
711a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        // wire up interaction callbacks for newly-added condition rows
712530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        if (first) {
713a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock            Interaction.register(tag.rb, mInteractionCallback);
714c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock            Interaction.register(tag.lines, mInteractionCallback);
715a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock            Interaction.register(button1, mInteractionCallback);
716a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock            Interaction.register(button2, mInteractionCallback);
717a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        }
718530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        row.setVisibility(VISIBLE);
719a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock    }
720a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock
721a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock    private void announceConditionSelection(ConditionTag tag) {
722a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        final int zen = getSelectedZen(Global.ZEN_MODE_OFF);
723a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        String modeText;
724a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        switch(zen) {
725a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock            case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
726d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                modeText = mContext.getString(R.string.interruption_level_priority);
727a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock                break;
728a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock            case Global.ZEN_MODE_NO_INTERRUPTIONS:
729d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                modeText = mContext.getString(R.string.interruption_level_none);
730a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock                break;
7314f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock            case Global.ZEN_MODE_ALARMS:
732d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                modeText = mContext.getString(R.string.interruption_level_alarms);
7334f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock                break;
7344f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock            default:
735a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock                return;
736a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        }
737a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        announceForAccessibility(mContext.getString(R.string.zen_mode_and_condition, modeText,
738c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock                tag.line1.getText()));
739856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
740856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
7410842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds    private void onClickTimeButton(View row, ConditionTag tag, boolean up, int rowId) {
742f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren        MetricsLogger.action(mContext, MetricsEvent.QS_DND_TIME, up);
743856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        Condition newCondition = null;
744856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        final int N = MINUTE_BUCKETS.length;
745856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (mBucketIndex == -1) {
746856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            // not on a known index, search for the next or prev bucket by time
7474db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock            final Uri conditionId = getConditionId(tag.condition);
7484db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock            final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId);
749856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            final long now = System.currentTimeMillis();
750856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            for (int i = 0; i < N; i++) {
751856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                int j = up ? i : N - 1 - i;
752856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                final int bucketMinutes = MINUTE_BUCKETS[j];
753856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                final long bucketTime = now + bucketMinutes * MINUTES_MS;
754856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                if (up && bucketTime > time || !up && bucketTime < time) {
755856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                    mBucketIndex = j;
756c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock                    newCondition = ZenModeConfig.toTimeCondition(mContext,
7570842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                            bucketTime, bucketMinutes, ActivityManager.getCurrentUser(),
758bbde26774fcf7ea65abd92d60f7468478c015053John Spurlock                            false /*shortVersion*/);
759856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                    break;
760856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                }
761856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            }
762856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            if (newCondition == null) {
763856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                mBucketIndex = DEFAULT_BUCKET_INDEX;
764c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock                newCondition = ZenModeConfig.toTimeCondition(mContext,
7659c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek                        MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
766856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            }
767856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        } else {
768856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            // on a known index, simply increment or decrement
769856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            mBucketIndex = Math.max(0, Math.min(N - 1, mBucketIndex + (up ? 1 : -1)));
770c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock            newCondition = ZenModeConfig.toTimeCondition(mContext,
7719c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek                    MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser());
772856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
7734db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        mTimeCondition = newCondition;
7740842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds        bind(mTimeCondition, row, rowId);
775656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds        tag.rb.setChecked(true);
7764db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        select(mTimeCondition);
777a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        announceConditionSelection(tag);
778856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
779856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
780530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private void select(final Condition condition) {
7814db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        if (DEBUG) Log.d(mTag, "select " + condition);
782b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        if (mSessionZen == -1 || mSessionZen == Global.ZEN_MODE_OFF) {
783b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            if (DEBUG) Log.d(mTag, "Ignoring condition selection outside of manual zen");
784b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            return;
785b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        }
786b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        final Uri realConditionId = getRealConditionId(condition);
787856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        if (mController != null) {
788530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            AsyncTask.execute(new Runnable() {
789530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                @Override
790530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                public void run() {
791b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock                    mController.setZen(mSessionZen, realConditionId, TAG + ".selectCondition");
792530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                }
793530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            });
794856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
7954db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        setExitCondition(condition);
796b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        if (realConditionId == null) {
7978f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            mPrefs.setMinuteIndex(-1);
798530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        } else if (isCountdown(condition) && mBucketIndex != -1) {
7998f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            mPrefs.setMinuteIndex(mBucketIndex);
8008600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        }
801530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        setSessionExitCondition(copy(condition));
8028600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
8038600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
8048600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    private void fireInteraction() {
8058600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        if (mCallback != null) {
8068600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            mCallback.onInteraction();
8078600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        }
8088600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
8098600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
810ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private void fireExpanded() {
811ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        if (mCallback != null) {
812ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock            mCallback.onExpanded(mExpanded);
813ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        }
814ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    }
815ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
8168600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    private final ZenModeController.Callback mZenCallback = new ZenModeController.Callback() {
8178600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        @Override
818b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        public void onManualRuleChanged(ZenRule rule) {
819b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            mHandler.obtainMessage(H.MANUAL_RULE_CHANGED, rule).sendToTarget();
820856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
8218600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    };
8228600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
8238600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    private final class H extends Handler {
824b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        private static final int MANUAL_RULE_CHANGED = 2;
825f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        private static final int UPDATE_WIDGETS = 3;
8268600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
8278600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        private H() {
8288600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            super(Looper.getMainLooper());
8298600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        }
8308600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
8318600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        @Override
8328600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        public void handleMessage(Message msg) {
833f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            switch (msg.what) {
834f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                case MANUAL_RULE_CHANGED: handleUpdateManualRule((ZenRule) msg.obj); break;
835f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                case UPDATE_WIDGETS: updateWidgets(); break;
8368600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock            }
8378600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        }
8388600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
8398600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock
8408600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    public interface Callback {
841f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        void onPrioritySettings();
8428600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock        void onInteraction();
843ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        void onExpanded(boolean expanded);
8448600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock    }
845856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
846856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    // used as the view tag on condition rows
847856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    private static class ConditionTag {
848856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        RadioButton rb;
849c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        View lines;
850c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        TextView line1;
851c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock        TextView line2;
8524db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock        Condition condition;
853856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
854856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
855f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock    private final class ZenPrefs implements OnSharedPreferenceChangeListener {
8568f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        private final int mNoneDangerousThreshold;
857856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
858856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        private int mMinuteIndex;
8598f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        private int mNoneSelected;
860d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        private boolean mConfirmedPriorityIntroduction;
861d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        private boolean mConfirmedSilenceIntroduction;
862856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
863f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        private ZenPrefs() {
8648f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            mNoneDangerousThreshold = mContext.getResources()
8658f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock                    .getInteger(R.integer.zen_mode_alarm_warning_threshold);
866f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            Prefs.registerListener(mContext, this);
867856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            updateMinuteIndex();
8688f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            updateNoneSelected();
869d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            updateConfirmedPriorityIntroduction();
870d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            updateConfirmedSilenceIntroduction();
8718f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        }
8728f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock
8738f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        public void trackNoneSelected() {
8748f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            mNoneSelected = clampNoneSelected(mNoneSelected + 1);
8758f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            if (DEBUG) Log.d(mTag, "Setting none selected: " + mNoneSelected + " threshold="
8768f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock                    + mNoneDangerousThreshold);
877f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            Prefs.putInt(mContext, Prefs.Key.DND_NONE_SELECTED, mNoneSelected);
878856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
879856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
880856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        public int getMinuteIndex() {
881856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            return mMinuteIndex;
882856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
883856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
884856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        public void setMinuteIndex(int minuteIndex) {
8858f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            minuteIndex = clampIndex(minuteIndex);
886856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            if (minuteIndex == mMinuteIndex) return;
8878f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            mMinuteIndex = clampIndex(minuteIndex);
888856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            if (DEBUG) Log.d(mTag, "Setting favorite minute index: " + mMinuteIndex);
889f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            Prefs.putInt(mContext, Prefs.Key.DND_FAVORITE_BUCKET_INDEX, mMinuteIndex);
890856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
891856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
892856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        @Override
893856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
894856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            updateMinuteIndex();
8958f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            updateNoneSelected();
896d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            updateConfirmedPriorityIntroduction();
897d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            updateConfirmedSilenceIntroduction();
898856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
899856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
900856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        private void updateMinuteIndex() {
901f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            mMinuteIndex = clampIndex(Prefs.getInt(mContext,
902f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                    Prefs.Key.DND_FAVORITE_BUCKET_INDEX, DEFAULT_BUCKET_INDEX));
903856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            if (DEBUG) Log.d(mTag, "Favorite minute index: " + mMinuteIndex);
904856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
905856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
9068f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        private int clampIndex(int index) {
9078f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            return MathUtils.constrain(index, -1, MINUTE_BUCKETS.length - 1);
9088f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        }
9098f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock
9108f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        private void updateNoneSelected() {
911f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            mNoneSelected = clampNoneSelected(Prefs.getInt(mContext,
912f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                    Prefs.Key.DND_NONE_SELECTED, 0));
9138f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            if (DEBUG) Log.d(mTag, "None selected: " + mNoneSelected);
9148f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        }
9158f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock
9168f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock        private int clampNoneSelected(int noneSelected) {
9178f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock            return MathUtils.constrain(noneSelected, 0, Integer.MAX_VALUE);
918856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
919f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock
920d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        private void updateConfirmedPriorityIntroduction() {
921f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock            final boolean confirmed =  Prefs.getBoolean(mContext,
922f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock                    Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, false);
923d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            if (confirmed == mConfirmedPriorityIntroduction) return;
924d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            mConfirmedPriorityIntroduction = confirmed;
925d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            if (DEBUG) Log.d(mTag, "Confirmed priority introduction: "
926d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                    + mConfirmedPriorityIntroduction);
927d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        }
928d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock
929d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        private void updateConfirmedSilenceIntroduction() {
930d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            final boolean confirmed =  Prefs.getBoolean(mContext,
931d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                    Prefs.Key.DND_CONFIRMED_SILENCE_INTRODUCTION, false);
932d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            if (confirmed == mConfirmedSilenceIntroduction) return;
933d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            mConfirmedSilenceIntroduction = confirmed;
934d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock            if (DEBUG) Log.d(mTag, "Confirmed silence introduction: "
935d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                    + mConfirmedSilenceIntroduction);
936f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock        }
937856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
938ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
9398303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li    protected final SegmentedButtons.Callback mZenButtonsCallback = new SegmentedButtons.Callback() {
940ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        @Override
9414572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren        public void onSelected(final Object value, boolean fromClick) {
942b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            if (value != null && mZenButtons.isShown() && isAttachedToWindow()) {
943d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                final int zen = (Integer) value;
9444572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren                if (fromClick) {
945f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren                    MetricsLogger.action(mContext, MetricsEvent.QS_DND_ZEN_SELECT, zen);
9464572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren                }
947d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                if (DEBUG) Log.d(mTag, "mZenButtonsCallback selected=" + zen);
948b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock                final Uri realConditionId = getRealConditionId(mSessionExitCondition);
949530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                AsyncTask.execute(new Runnable() {
950530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                    @Override
951530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                    public void run() {
952d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                        mController.setZen(zen, realConditionId, TAG + ".selectZen");
953d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                        if (zen != Global.ZEN_MODE_OFF) {
954d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                            Prefs.putInt(mContext, Prefs.Key.DND_FAVORITE_ZEN, zen);
955d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock                        }
956530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                    }
957530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                });
958ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock            }
959ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        }
960a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock
961a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        @Override
962a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        public void onInteraction() {
963a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock            fireInteraction();
964a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        }
965a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock    };
966a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock
967a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock    private final Interaction.Callback mInteractionCallback = new Interaction.Callback() {
968a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        @Override
969a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        public void onInteraction() {
970a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock            fireInteraction();
971a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock        }
972ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    };
973530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
974530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    private final class TransitionHelper implements TransitionListener, Runnable {
975530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        private final ArraySet<View> mTransitioningViews = new ArraySet<View>();
976530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
977530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        private boolean mTransitioning;
978530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        private boolean mPendingUpdateWidgets;
979530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
980530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        public void clear() {
981530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            mTransitioningViews.clear();
9820842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds            mPendingUpdateWidgets = false;
983530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
984530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
985530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
986530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            pw.println("  TransitionHelper state:");
987530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            pw.print("    mPendingUpdateWidgets="); pw.println(mPendingUpdateWidgets);
988530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            pw.print("    mTransitioning="); pw.println(mTransitioning);
989530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            pw.print("    mTransitioningViews="); pw.println(mTransitioningViews);
990530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
991530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
992530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        public void pendingUpdateWidgets() {
993530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            mPendingUpdateWidgets = true;
994530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
995530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
996530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        public boolean isTransitioning() {
997530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            return !mTransitioningViews.isEmpty();
998530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
999530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
1000530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        @Override
1001530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        public void startTransition(LayoutTransition transition,
1002530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                ViewGroup container, View view, int transitionType) {
1003530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            mTransitioningViews.add(view);
1004530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            updateTransitioning();
1005530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
1006530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
1007530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        @Override
1008530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        public void endTransition(LayoutTransition transition,
1009530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                ViewGroup container, View view, int transitionType) {
1010530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            mTransitioningViews.remove(view);
1011530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            updateTransitioning();
1012530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
1013530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
1014530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        @Override
1015530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        public void run() {
1016530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            if (DEBUG) Log.d(mTag, "TransitionHelper run"
10170842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                    + " mPendingUpdateWidgets=" + mPendingUpdateWidgets);
1018530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            if (mPendingUpdateWidgets) {
1019530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                updateWidgets();
1020530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            }
10210842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds            mPendingUpdateWidgets = false;
1022530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
1023530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock
1024530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        private void updateTransitioning() {
1025530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            final boolean transitioning = isTransitioning();
1026530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            if (mTransitioning == transitioning) return;
1027530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            mTransitioning = transitioning;
1028530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            if (DEBUG) Log.d(mTag, "TransitionHelper mTransitioning=" + mTransitioning);
1029530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            if (!mTransitioning) {
10300842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                if (mPendingUpdateWidgets) {
1031530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                    mHandler.post(this);
1032530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                } else {
10330842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds                    mPendingUpdateWidgets = false;
1034530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock                }
1035530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock            }
1036530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock        }
1037530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock    }
10388600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock}
1039