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