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; 39be3235abcddbcab63e60184de416c6243697abb7Jason Monkimport android.text.format.DateUtils; 40530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlockimport android.util.ArraySet; 418600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.util.AttributeSet; 42856edebad73560e9b1cce021a7de9a0470d07176John Spurlockimport android.util.Log; 438f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlockimport android.util.MathUtils; 447635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynoldsimport android.util.Slog; 458600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.view.LayoutInflater; 468600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.view.View; 473e0770163686c1be83959d681976dafaf25272e1John Spurlockimport android.view.ViewGroup; 488600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.CompoundButton; 498600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.CompoundButton.OnCheckedChangeListener; 50be3235abcddbcab63e60184de416c6243697abb7Jason Monkimport android.widget.FrameLayout; 518600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.ImageView; 528600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.LinearLayout; 538600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.RadioButton; 54656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynoldsimport android.widget.RadioGroup; 558600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport android.widget.TextView; 568600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 577635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynoldsimport com.android.internal.annotations.VisibleForTesting; 589e7283f6a31bc2beb75c84c6173968a46582c563Chris Wrenimport com.android.internal.logging.MetricsLogger; 59383db5ebcc3a4a615faf249bf4f126f42e80b82eTamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 60f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlockimport com.android.systemui.Prefs; 618600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport com.android.systemui.R; 628600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport com.android.systemui.statusbar.policy.ZenModeController; 638600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 64530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlockimport java.io.FileDescriptor; 65530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlockimport java.io.PrintWriter; 668600534df66c2ff5846ed230b50c56229322d48aJohn Spurlockimport java.util.Arrays; 670842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynoldsimport java.util.Calendar; 680842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynoldsimport java.util.GregorianCalendar; 698be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlockimport java.util.Locale; 70856edebad73560e9b1cce021a7de9a0470d07176John Spurlockimport java.util.Objects; 718600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 72be3235abcddbcab63e60184de416c6243697abb7Jason Monkpublic class ZenModePanel extends FrameLayout { 73ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private static final String TAG = "ZenModePanel"; 74ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); 75856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 76be3235abcddbcab63e60184de416c6243697abb7Jason Monk public static final int STATE_MODIFY = 0; 77be3235abcddbcab63e60184de416c6243697abb7Jason Monk public static final int STATE_AUTO_RULE = 1; 78be3235abcddbcab63e60184de416c6243697abb7Jason Monk public static final int STATE_OFF = 2; 79be3235abcddbcab63e60184de416c6243697abb7Jason Monk 8050806fc4ceff4bb093a18bdecb506163e68b9cbbJohn Spurlock private static final int SECONDS_MS = 1000; 8150806fc4ceff4bb093a18bdecb506163e68b9cbbJohn Spurlock private static final int MINUTES_MS = 60 * SECONDS_MS; 8250806fc4ceff4bb093a18bdecb506163e68b9cbbJohn Spurlock 830ca82fecc2acb7ef0688d2fd22a39838ebf4f1dfJulia Reynolds private static final int[] MINUTE_BUCKETS = ZenModeConfig.MINUTE_BUCKETS; 84856edebad73560e9b1cce021a7de9a0470d07176John Spurlock private static final int MIN_BUCKET_MINUTES = MINUTE_BUCKETS[0]; 85856edebad73560e9b1cce021a7de9a0470d07176John Spurlock private static final int MAX_BUCKET_MINUTES = MINUTE_BUCKETS[MINUTE_BUCKETS.length - 1]; 86856edebad73560e9b1cce021a7de9a0470d07176John Spurlock private static final int DEFAULT_BUCKET_INDEX = Arrays.binarySearch(MINUTE_BUCKETS, 60); 87ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private static final int FOREVER_CONDITION_INDEX = 0; 88530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private static final int COUNTDOWN_CONDITION_INDEX = 1; 890842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds private static final int COUNTDOWN_ALARM_CONDITION_INDEX = 2; 908e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds private static final int COUNTDOWN_CONDITION_COUNT = 2; 91856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 92f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock public static final Intent ZEN_SETTINGS 93f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS); 94f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock public static final Intent ZEN_PRIORITY_SETTINGS 95f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock = new Intent(Settings.ACTION_ZEN_MODE_PRIORITY_SETTINGS); 968600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 97be3235abcddbcab63e60184de416c6243697abb7Jason Monk private static final long TRANSITION_DURATION = 300; 98be3235abcddbcab63e60184de416c6243697abb7Jason Monk 997f1df5e98578f8532a5e009009e7c1f82ed5885cJohn Spurlock private final Context mContext; 10094fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li protected final LayoutInflater mInflater; 1018600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock private final H mHandler = new H(); 102f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock private final ZenPrefs mPrefs; 103530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private final TransitionHelper mTransitionHelper = new TransitionHelper(); 1040b688503754737a20165f0cff1833e714a5c4164John Spurlock private final Uri mForeverId; 10503c548f292b71eaad576bbc10208283467c775b3Julia Reynolds private final ConfigurableTexts mConfigurableTexts; 106856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 107eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock private String mTag = TAG + "/" + Integer.toHexString(System.identityHashCode(this)); 108ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 1098303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li protected SegmentedButtons mZenButtons; 110f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock private View mZenIntroduction; 111d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock private TextView mZenIntroductionMessage; 112f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock private View mZenIntroductionConfirm; 113d896323eab66be9394cd33d3b3bf16372cbbaa07John Spurlock private TextView mZenIntroductionCustomize; 11494fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li protected LinearLayout mZenConditions; 1158be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock private TextView mZenAlarmWarning; 116656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds private RadioGroup mZenRadioGroup; 117656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds private LinearLayout mZenRadioGroupContent; 118ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 1198600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock private Callback mCallback; 1208600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock private ZenModeController mController; 1214db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock private Condition mExitCondition; 122856edebad73560e9b1cce021a7de9a0470d07176John Spurlock private int mBucketIndex = -1; 123ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private boolean mExpanded; 124530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private boolean mHidden; 125fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock private int mSessionZen; 1268f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock private int mAttachedZen; 1273e0770163686c1be83959d681976dafaf25272e1John Spurlock private boolean mAttached; 1284db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock private Condition mSessionExitCondition; 129cbd7a31a4440eea6d1f648a9e54e55677547ab7bJohn Spurlock private boolean mVoiceCapable; 1308600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 1318b270903165cf86a01fe090479b76b1ab98ec105Muyuan Li protected int mZenModeConditionLayoutId; 1328b270903165cf86a01fe090479b76b1ab98ec105Muyuan Li protected int mZenModeButtonLayoutId; 133be3235abcddbcab63e60184de416c6243697abb7Jason Monk private View mEmpty; 134be3235abcddbcab63e60184de416c6243697abb7Jason Monk private TextView mEmptyText; 135be3235abcddbcab63e60184de416c6243697abb7Jason Monk private ImageView mEmptyIcon; 136be3235abcddbcab63e60184de416c6243697abb7Jason Monk private View mAutoRule; 137be3235abcddbcab63e60184de416c6243697abb7Jason Monk private TextView mAutoTitle; 138be3235abcddbcab63e60184de416c6243697abb7Jason Monk private int mState = STATE_MODIFY; 139be3235abcddbcab63e60184de416c6243697abb7Jason Monk private ViewGroup mEdit; 1408b270903165cf86a01fe090479b76b1ab98ec105Muyuan Li 1418600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock public ZenModePanel(Context context, AttributeSet attrs) { 1428600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock super(context, attrs); 1437f1df5e98578f8532a5e009009e7c1f82ed5885cJohn Spurlock mContext = context; 144f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock mPrefs = new ZenPrefs(); 145b2eb67b2860c26b7ab733bd9ed59bea050b4a47aJason Monk mInflater = LayoutInflater.from(mContext); 1460b688503754737a20165f0cff1833e714a5c4164John Spurlock mForeverId = Condition.newId(mContext).appendPath("forever").build(); 14703c548f292b71eaad576bbc10208283467c775b3Julia Reynolds mConfigurableTexts = new ConfigurableTexts(mContext); 148cbd7a31a4440eea6d1f648a9e54e55677547ab7bJohn Spurlock mVoiceCapable = Util.isVoiceCapable(mContext); 1498b270903165cf86a01fe090479b76b1ab98ec105Muyuan Li mZenModeConditionLayoutId = R.layout.zen_mode_condition; 1508b270903165cf86a01fe090479b76b1ab98ec105Muyuan Li mZenModeButtonLayoutId = R.layout.zen_mode_button; 151856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (DEBUG) Log.d(mTag, "new ZenModePanel"); 152856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 153856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 154530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 155530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.println("ZenModePanel state:"); 156530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.print(" mAttached="); pw.println(mAttached); 157530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.print(" mHidden="); pw.println(mHidden); 158530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.print(" mExpanded="); pw.println(mExpanded); 159530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.print(" mSessionZen="); pw.println(mSessionZen); 160530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.print(" mAttachedZen="); pw.println(mAttachedZen); 161d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock pw.print(" mConfirmedPriorityIntroduction="); 162d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock pw.println(mPrefs.mConfirmedPriorityIntroduction); 163d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock pw.print(" mConfirmedSilenceIntroduction="); 164d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock pw.println(mPrefs.mConfirmedSilenceIntroduction); 165cbd7a31a4440eea6d1f648a9e54e55677547ab7bJohn Spurlock pw.print(" mVoiceCapable="); pw.println(mVoiceCapable); 166530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mTransitionHelper.dump(fd, pw, args); 167530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 168530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1698303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li protected void createZenButtons() { 170be3235abcddbcab63e60184de416c6243697abb7Jason Monk mZenButtons = findViewById(R.id.zen_buttons); 1714f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock mZenButtons.addButton(R.string.interruption_level_none_twoline, 172bd1abe631cb0a405605babd811b5fd4dbe9e0cf8John Spurlock R.string.interruption_level_none_with_warning, 1734f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock Global.ZEN_MODE_NO_INTERRUPTIONS); 1744f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock mZenButtons.addButton(R.string.interruption_level_alarms_twoline, 175a1c7ffe755d414a1082920ce1742a8ae82d81529John Spurlock R.string.interruption_level_alarms, 1764f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock Global.ZEN_MODE_ALARMS); 1774f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock mZenButtons.addButton(R.string.interruption_level_priority_twoline, 178a1c7ffe755d414a1082920ce1742a8ae82d81529John Spurlock R.string.interruption_level_priority, 1794291fb79c70ba77af4357d53dac2e5626eabba45John Spurlock Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); 180ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock mZenButtons.setCallback(mZenButtonsCallback); 1818303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li } 182ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 1838303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li @Override 1848303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li protected void onFinishInflate() { 1858303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li super.onFinishInflate(); 1868303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li createZenButtons(); 187f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock mZenIntroduction = findViewById(R.id.zen_introduction); 188be3235abcddbcab63e60184de416c6243697abb7Jason Monk mZenIntroductionMessage = findViewById(R.id.zen_introduction_message); 189f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock mZenIntroductionConfirm = findViewById(R.id.zen_introduction_confirm); 190be3235abcddbcab63e60184de416c6243697abb7Jason Monk mZenIntroductionConfirm.setOnClickListener(v -> confirmZenIntroduction()); 191be3235abcddbcab63e60184de416c6243697abb7Jason Monk mZenIntroductionCustomize = findViewById(R.id.zen_introduction_customize); 192be3235abcddbcab63e60184de416c6243697abb7Jason Monk mZenIntroductionCustomize.setOnClickListener(v -> { 193be3235abcddbcab63e60184de416c6243697abb7Jason Monk confirmZenIntroduction(); 194be3235abcddbcab63e60184de416c6243697abb7Jason Monk if (mCallback != null) { 195be3235abcddbcab63e60184de416c6243697abb7Jason Monk mCallback.onPrioritySettings(); 196f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock } 197f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock }); 19803c548f292b71eaad576bbc10208283467c775b3Julia Reynolds mConfigurableTexts.add(mZenIntroductionCustomize, R.string.zen_priority_customize_button); 199f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock 200be3235abcddbcab63e60184de416c6243697abb7Jason Monk mZenConditions = findViewById(R.id.zen_conditions); 201be3235abcddbcab63e60184de416c6243697abb7Jason Monk mZenAlarmWarning = findViewById(R.id.zen_alarm_warning); 202be3235abcddbcab63e60184de416c6243697abb7Jason Monk mZenRadioGroup = findViewById(R.id.zen_radio_buttons); 203be3235abcddbcab63e60184de416c6243697abb7Jason Monk mZenRadioGroupContent = findViewById(R.id.zen_radio_buttons_content); 204be3235abcddbcab63e60184de416c6243697abb7Jason Monk 205be3235abcddbcab63e60184de416c6243697abb7Jason Monk mEdit = findViewById(R.id.edit_container); 206be3235abcddbcab63e60184de416c6243697abb7Jason Monk 207be3235abcddbcab63e60184de416c6243697abb7Jason Monk mEmpty = findViewById(android.R.id.empty); 208be3235abcddbcab63e60184de416c6243697abb7Jason Monk mEmpty.setVisibility(INVISIBLE); 209be3235abcddbcab63e60184de416c6243697abb7Jason Monk mEmptyText = mEmpty.findViewById(android.R.id.title); 210be3235abcddbcab63e60184de416c6243697abb7Jason Monk mEmptyIcon = mEmpty.findViewById(android.R.id.icon); 211be3235abcddbcab63e60184de416c6243697abb7Jason Monk 212be3235abcddbcab63e60184de416c6243697abb7Jason Monk mAutoRule = findViewById(R.id.auto_rule); 213be3235abcddbcab63e60184de416c6243697abb7Jason Monk mAutoTitle = mAutoRule.findViewById(android.R.id.title); 214be3235abcddbcab63e60184de416c6243697abb7Jason Monk mAutoRule.setVisibility(INVISIBLE); 215be3235abcddbcab63e60184de416c6243697abb7Jason Monk } 216be3235abcddbcab63e60184de416c6243697abb7Jason Monk 217be3235abcddbcab63e60184de416c6243697abb7Jason Monk public void setEmptyState(int icon, int text) { 218be3235abcddbcab63e60184de416c6243697abb7Jason Monk mEmptyIcon.post(() -> { 219be3235abcddbcab63e60184de416c6243697abb7Jason Monk mEmptyIcon.setImageResource(icon); 220be3235abcddbcab63e60184de416c6243697abb7Jason Monk mEmptyText.setText(text); 221be3235abcddbcab63e60184de416c6243697abb7Jason Monk }); 222be3235abcddbcab63e60184de416c6243697abb7Jason Monk } 223be3235abcddbcab63e60184de416c6243697abb7Jason Monk 224be3235abcddbcab63e60184de416c6243697abb7Jason Monk public void setAutoText(CharSequence text) { 225be3235abcddbcab63e60184de416c6243697abb7Jason Monk mAutoTitle.post(() -> mAutoTitle.setText(text)); 226be3235abcddbcab63e60184de416c6243697abb7Jason Monk } 227be3235abcddbcab63e60184de416c6243697abb7Jason Monk 228be3235abcddbcab63e60184de416c6243697abb7Jason Monk public void setState(int state) { 229be3235abcddbcab63e60184de416c6243697abb7Jason Monk if (mState == state) return; 230be3235abcddbcab63e60184de416c6243697abb7Jason Monk transitionFrom(getView(mState), getView(state)); 231be3235abcddbcab63e60184de416c6243697abb7Jason Monk mState = state; 232be3235abcddbcab63e60184de416c6243697abb7Jason Monk } 233be3235abcddbcab63e60184de416c6243697abb7Jason Monk 234be3235abcddbcab63e60184de416c6243697abb7Jason Monk private void transitionFrom(View from, View to) { 235be3235abcddbcab63e60184de416c6243697abb7Jason Monk from.post(() -> { 236be3235abcddbcab63e60184de416c6243697abb7Jason Monk // TODO: Better transitions 237be3235abcddbcab63e60184de416c6243697abb7Jason Monk to.setAlpha(0); 238be3235abcddbcab63e60184de416c6243697abb7Jason Monk to.setVisibility(VISIBLE); 239be3235abcddbcab63e60184de416c6243697abb7Jason Monk to.bringToFront(); 240be3235abcddbcab63e60184de416c6243697abb7Jason Monk to.animate().cancel(); 241be3235abcddbcab63e60184de416c6243697abb7Jason Monk to.animate().alpha(1) 242be3235abcddbcab63e60184de416c6243697abb7Jason Monk .setDuration(TRANSITION_DURATION) 243be3235abcddbcab63e60184de416c6243697abb7Jason Monk .withEndAction(() -> from.setVisibility(INVISIBLE)) 244be3235abcddbcab63e60184de416c6243697abb7Jason Monk .start(); 245be3235abcddbcab63e60184de416c6243697abb7Jason Monk }); 246be3235abcddbcab63e60184de416c6243697abb7Jason Monk } 247be3235abcddbcab63e60184de416c6243697abb7Jason Monk 248be3235abcddbcab63e60184de416c6243697abb7Jason Monk private View getView(int state) { 249be3235abcddbcab63e60184de416c6243697abb7Jason Monk switch (state) { 250be3235abcddbcab63e60184de416c6243697abb7Jason Monk case STATE_AUTO_RULE: 251be3235abcddbcab63e60184de416c6243697abb7Jason Monk return mAutoRule; 252be3235abcddbcab63e60184de416c6243697abb7Jason Monk case STATE_OFF: 253be3235abcddbcab63e60184de416c6243697abb7Jason Monk return mEmpty; 254be3235abcddbcab63e60184de416c6243697abb7Jason Monk default: 255be3235abcddbcab63e60184de416c6243697abb7Jason Monk return mEdit; 256be3235abcddbcab63e60184de416c6243697abb7Jason Monk } 257814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock } 258530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 259814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock @Override 260814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock protected void onConfigurationChanged(Configuration newConfig) { 261814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock super.onConfigurationChanged(newConfig); 26203c548f292b71eaad576bbc10208283467c775b3Julia Reynolds mConfigurableTexts.update(); 263814ee6ab8bbf4a3f96dc76091d6bce67394b5b70John Spurlock if (mZenButtons != null) { 26403c548f292b71eaad576bbc10208283467c775b3Julia Reynolds mZenButtons.update(); 265cf398419e2c081b913229a0a8c7482c09e1b6f97Yongjiang Wu } 2663e0770163686c1be83959d681976dafaf25272e1John Spurlock } 2673e0770163686c1be83959d681976dafaf25272e1John Spurlock 268f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock private void confirmZenIntroduction() { 269d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock final String prefKey = prefKeyForConfirmation(getSelectedZen(Global.ZEN_MODE_OFF)); 270d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock if (prefKey == null) return; 271d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock if (DEBUG) Log.d(TAG, "confirmZenIntroduction " + prefKey); 272d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock Prefs.putBoolean(mContext, prefKey, true); 273f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock mHandler.sendEmptyMessage(H.UPDATE_WIDGETS); 274f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock } 275f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock 276d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock private static String prefKeyForConfirmation(int zen) { 277d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock switch (zen) { 278d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: 279d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock return Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION; 280d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock case Global.ZEN_MODE_NO_INTERRUPTIONS: 281d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock return Prefs.Key.DND_CONFIRMED_SILENCE_INTRODUCTION; 282d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds case Global.ZEN_MODE_ALARMS: 283d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds return Prefs.Key.DND_CONFIRMED_ALARM_INTRODUCTION; 284d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock default: 285d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock return null; 286530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 2878600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 2888600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 289035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk private void onAttach() { 290be3235abcddbcab63e60184de416c6243697abb7Jason Monk setExpanded(true); 291035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk mAttachedZen = mController.getZen(); 292035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk ZenRule manualRule = mController.getManualRule(); 293035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk mExitCondition = manualRule != null ? manualRule.condition : null; 294035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk if (DEBUG) Log.d(mTag, "onAttach " + mAttachedZen + " " + manualRule); 295035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk handleUpdateManualRule(manualRule); 296035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk mZenButtons.setSelectedValue(mAttachedZen, false); 2978f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock mSessionZen = mAttachedZen; 298530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mTransitionHelper.clear(); 299b44ef7eb43a07b7c2968d21f53a5b30243229bdbJulia Reynolds mController.addCallback(mZenCallback); 300530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock setSessionExitCondition(copy(mExitCondition)); 30150806fc4ceff4bb093a18bdecb506163e68b9cbbJohn Spurlock updateWidgets(); 3027635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds setAttached(true); 303856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 304856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 305035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk private void onDetach() { 306035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk if (DEBUG) Log.d(mTag, "onDetach"); 307be3235abcddbcab63e60184de416c6243697abb7Jason Monk setExpanded(false); 3088f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock checkForAttachedZenChange(); 3097635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds setAttached(false); 3108f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock mAttachedZen = -1; 311fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock mSessionZen = -1; 312b44ef7eb43a07b7c2968d21f53a5b30243229bdbJulia Reynolds mController.removeCallback(mZenCallback); 313530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock setSessionExitCondition(null); 314530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mTransitionHelper.clear(); 315530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 316530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 3177635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds @VisibleForTesting 3187635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds void setAttached(boolean attached) { 3197635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds mAttached = attached; 3207635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } 3217635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds 322035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk @Override 323035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk public void onVisibilityAggregated(boolean isVisible) { 324035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk super.onVisibilityAggregated(isVisible); 325035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk if (isVisible == mAttached) return; 326035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk if (isVisible) { 327035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk onAttach(); 328035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk } else { 329035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk onDetach(); 330035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk } 331035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk } 332035a9369f51f356bc16005e93cfb1f1aeb0ab5ddJason Monk 333530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private void setSessionExitCondition(Condition condition) { 334530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (Objects.equals(condition, mSessionExitCondition)) return; 335530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (DEBUG) Log.d(mTag, "mSessionExitCondition=" + getConditionId(condition)); 336530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mSessionExitCondition = condition; 337856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 338856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 339eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock public void setHidden(boolean hidden) { 340eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock if (mHidden == hidden) return; 3413e0770163686c1be83959d681976dafaf25272e1John Spurlock if (DEBUG) Log.d(mTag, "hidden=" + hidden); 342eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock mHidden = hidden; 343eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock updateWidgets(); 344eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock } 345eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock 3468f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock private void checkForAttachedZenChange() { 3478f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock final int selectedZen = getSelectedZen(-1); 3488f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock if (DEBUG) Log.d(mTag, "selectedZen=" + selectedZen); 3498f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock if (selectedZen != mAttachedZen) { 3508f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock if (DEBUG) Log.d(mTag, "attachedZen: " + mAttachedZen + " -> " + selectedZen); 3518f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock if (selectedZen == Global.ZEN_MODE_NO_INTERRUPTIONS) { 3528f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock mPrefs.trackNoneSelected(); 3538f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock } 3548f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock } 3558f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock } 3568f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock 357ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private void setExpanded(boolean expanded) { 358ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock if (expanded == mExpanded) return; 359f88d8082a86bee00c604cbbcfb5261f5573936feJohn Spurlock if (DEBUG) Log.d(mTag, "setExpanded " + expanded); 360ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock mExpanded = expanded; 361ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock updateWidgets(); 362ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock fireExpanded(); 3638600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 3648600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 36594fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li protected void addZenConditions(int count) { 36694fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li for (int i = 0; i < count; i++) { 367be3235abcddbcab63e60184de416c6243697abb7Jason Monk final View rb = mInflater.inflate(mZenModeButtonLayoutId, mEdit, false); 368656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds rb.setId(i); 369656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds mZenRadioGroup.addView(rb); 370be3235abcddbcab63e60184de416c6243697abb7Jason Monk final View rbc = mInflater.inflate(mZenModeConditionLayoutId, mEdit, false); 371656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds rbc.setId(i + count); 372656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds mZenRadioGroupContent.addView(rbc); 37394fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li } 37494fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li } 37594fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li 376eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock public void init(ZenModeController controller) { 3778600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock mController = controller; 3787635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds final int minConditions = 1 /*forever*/ + COUNTDOWN_CONDITION_COUNT; 37994fa1df7135eea68d2aae41634567c57833d6a47Muyuan Li addZenConditions(minConditions); 380fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock mSessionZen = getSelectedZen(-1); 381b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock handleUpdateManualRule(mController.getManualRule()); 3824db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock if (DEBUG) Log.d(mTag, "init mExitCondition=" + mExitCondition); 383530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock hideAllConditions(); 384ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 385ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 3864db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock private void setExitCondition(Condition exitCondition) { 38725c3421c5e65ddc7f2b2bf1b1208f3634e6f5256John Spurlock if (Objects.equals(mExitCondition, exitCondition)) return; 3884db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock mExitCondition = exitCondition; 389530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (DEBUG) Log.d(mTag, "mExitCondition=" + getConditionId(mExitCondition)); 39089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock updateWidgets(); 391ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 392ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 3934db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock private static Uri getConditionId(Condition condition) { 3944db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock return condition != null ? condition.id : null; 3954db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock } 3964db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock 397b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock private Uri getRealConditionId(Condition condition) { 398b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock return isForever(condition) ? null : getConditionId(condition); 399b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock } 400b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 4014db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock private static Condition copy(Condition condition) { 4024db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock return condition == null ? null : condition.copy(); 4034db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock } 4044db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock 4058600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock public void setCallback(Callback callback) { 4068600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock mCallback = callback; 4078600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 4088600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 4097635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds @VisibleForTesting 4107635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds void handleUpdateManualRule(ZenRule rule) { 411b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock final int zen = rule != null ? rule.zenMode : Global.ZEN_MODE_OFF; 412b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock handleUpdateZen(zen); 413be3235abcddbcab63e60184de416c6243697abb7Jason Monk final Condition c = rule == null ? null 414be3235abcddbcab63e60184de416c6243697abb7Jason Monk : rule.condition != null ? rule.condition 415be3235abcddbcab63e60184de416c6243697abb7Jason Monk : createCondition(rule.conditionId); 4167635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds handleUpdateConditions(c); 4177635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds setExitCondition(c); 418b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock } 419b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 420be3235abcddbcab63e60184de416c6243697abb7Jason Monk private Condition createCondition(Uri conditionId) { 4217635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds if (ZenModeConfig.isValidCountdownToAlarmConditionId(conditionId)) { 4227635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds long time = ZenModeConfig.tryParseCountdownConditionId(conditionId); 4237635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds Condition c = ZenModeConfig.toNextAlarmCondition( 4247635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds mContext, time, ActivityManager.getCurrentUser()); 4257635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds return c; 4267635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } else if (ZenModeConfig.isValidCountdownConditionId(conditionId)) { 427be3235abcddbcab63e60184de416c6243697abb7Jason Monk long time = ZenModeConfig.tryParseCountdownConditionId(conditionId); 428be3235abcddbcab63e60184de416c6243697abb7Jason Monk int mins = (int) ((time - System.currentTimeMillis() + DateUtils.MINUTE_IN_MILLIS / 2) 429be3235abcddbcab63e60184de416c6243697abb7Jason Monk / DateUtils.MINUTE_IN_MILLIS); 430be3235abcddbcab63e60184de416c6243697abb7Jason Monk Condition c = ZenModeConfig.toTimeCondition(mContext, time, mins, 431be3235abcddbcab63e60184de416c6243697abb7Jason Monk ActivityManager.getCurrentUser(), false); 432be3235abcddbcab63e60184de416c6243697abb7Jason Monk return c; 433be3235abcddbcab63e60184de416c6243697abb7Jason Monk } 4342d77c0f06479746f1e925a3351d14593a7f04708Jason Monk // If there is a manual rule, but it has no condition listed then it is forever. 4352d77c0f06479746f1e925a3351d14593a7f04708Jason Monk return forever(); 436be3235abcddbcab63e60184de416c6243697abb7Jason Monk } 437be3235abcddbcab63e60184de416c6243697abb7Jason Monk 438ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private void handleUpdateZen(int zen) { 439fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock if (mSessionZen != -1 && mSessionZen != zen) { 440fbb3d6ff392e9cd13fea49f85f12efd0a304d448John Spurlock mSessionZen = zen; 441ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 4424572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren mZenButtons.setSelectedValue(zen, false /* fromClick */); 443ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock updateWidgets(); 444b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock } 445b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock 4467635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds @VisibleForTesting 4477635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds int getSelectedZen(int defValue) { 448ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock final Object zen = mZenButtons.getSelectedValue(); 449ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock return zen != null ? (Integer) zen : defValue; 450ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 451ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 452ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private void updateWidgets() { 453530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (mTransitionHelper.isTransitioning()) { 454530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mTransitionHelper.pendingUpdateWidgets(); 455530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock return; 456530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 457ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock final int zen = getSelectedZen(Global.ZEN_MODE_OFF); 458ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock final boolean zenImportant = zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; 459ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock final boolean zenNone = zen == Global.ZEN_MODE_NO_INTERRUPTIONS; 460d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds final boolean zenAlarm = zen == Global.ZEN_MODE_ALARMS; 461d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock final boolean introduction = (zenImportant && !mPrefs.mConfirmedPriorityIntroduction 462d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds || zenNone && !mPrefs.mConfirmedSilenceIntroduction 463d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds || zenAlarm && !mPrefs.mConfirmedAlarmIntroduction); 464eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock 465eb2727bb2f0f32016ca7c4bdd2c0a79eec8cb80aJohn Spurlock mZenButtons.setVisibility(mHidden ? GONE : VISIBLE); 466f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock mZenIntroduction.setVisibility(introduction ? VISIBLE : GONE); 467d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock if (introduction) { 468d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds int message = zenImportant 46903c548f292b71eaad576bbc10208283467c775b3Julia Reynolds ? R.string.zen_priority_introduction 470d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds : zenAlarm 471d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds ? R.string.zen_alarms_introduction 472d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds : mVoiceCapable 473d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds ? R.string.zen_silence_introduction_voice 474d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds : R.string.zen_silence_introduction; 475d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds mConfigurableTexts.add(mZenIntroductionMessage, message); 47603c548f292b71eaad576bbc10208283467c775b3Julia Reynolds mConfigurableTexts.update(); 477d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock mZenIntroductionCustomize.setVisibility(zenImportant ? VISIBLE : GONE); 478d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock } 4798be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final String warning = computeAlarmWarningText(zenNone); 4808be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock mZenAlarmWarning.setVisibility(warning != null ? VISIBLE : GONE); 4818be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock mZenAlarmWarning.setText(warning); 4828be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock } 4838be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock 4848be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock private String computeAlarmWarningText(boolean zenNone) { 4858be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock if (!zenNone) { 4868be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock return null; 4878be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock } 4888be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final long now = System.currentTimeMillis(); 4898be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final long nextAlarm = mController.getNextAlarm(); 4908be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock if (nextAlarm < now) { 4918be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock return null; 4928be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock } 4938be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock int warningRes = 0; 4948be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock if (mSessionExitCondition == null || isForever(mSessionExitCondition)) { 4958be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock warningRes = R.string.zen_alarm_warning_indef; 4968be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock } else { 4978be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final long time = ZenModeConfig.tryParseCountdownConditionId(mSessionExitCondition.id); 4988be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock if (time > now && nextAlarm < time) { 4998be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock warningRes = R.string.zen_alarm_warning; 5008be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock } 5018be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock } 5028be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock if (warningRes == 0) { 5038be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock return null; 5048be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock } 5058be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final boolean soon = (nextAlarm - now) < 24 * 60 * 60 * 1000; 5068be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final boolean is24 = DateFormat.is24HourFormat(mContext, ActivityManager.getCurrentUser()); 5078be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final String skeleton = soon ? (is24 ? "Hm" : "hma") : (is24 ? "EEEHm" : "EEEhma"); 5088be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton); 5098be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final CharSequence formattedTime = DateFormat.format(pattern, nextAlarm); 5108be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final int templateRes = soon ? R.string.alarm_template : R.string.alarm_template_far; 5118be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock final String template = getResources().getString(templateRes, formattedTime); 5128be53eaaf7b2dcc5617c6ed6bef14d15cbe9e28dJohn Spurlock return getResources().getString(warningRes, template); 51389f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock } 51489f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock 5157635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds @VisibleForTesting 5167635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds void handleUpdateConditions(Condition c) { 517530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (mTransitionHelper.isTransitioning()) { 518530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock return; 519530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 5204db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock // forever 521656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds bind(forever(), mZenRadioGroupContent.getChildAt(FOREVER_CONDITION_INDEX), 5220842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds FOREVER_CONDITION_INDEX); 5237635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds if (c == null) { 5247635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bindGenericCountdown(); 5257635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bindNextAlarm(getTimeUntilNextAlarmCondition()); 5267635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } else if (isForever(c)) { 527e28c94f98e648f9453cdce2792e54e8e91da2f28Beverly 5287635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds getConditionTagAt(FOREVER_CONDITION_INDEX).rb.setChecked(true); 5297635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bindGenericCountdown(); 5307635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bindNextAlarm(getTimeUntilNextAlarmCondition()); 5317635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } else { 5327635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds if (isAlarm(c)) { 5337635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bindGenericCountdown(); 5347635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bindNextAlarm(c); 5357635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds getConditionTagAt(COUNTDOWN_ALARM_CONDITION_INDEX).rb.setChecked(true); 5367635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } else if (isCountdown(c)) { 5377635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bindNextAlarm(getTimeUntilNextAlarmCondition()); 5387635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bind(c, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX), 5397635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds COUNTDOWN_CONDITION_INDEX); 5407635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true); 541c3960f66beb5daf9af1b7a914c8bc60cc6e02756Julia Reynolds } else { 5427635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds Slog.wtf(TAG, "Invalid manual condition: " + c); 5438e2d2bbeec74b02960504a09e02e601ee2cf5e0eJulia Reynolds } 5444db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock } 545e138f55512d7dc5854c9f6d98ec987f5c773f12cJason Monk mZenConditions.setVisibility(mSessionZen != Global.ZEN_MODE_OFF ? View.VISIBLE : View.GONE); 5464db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock } 5474db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock 5487635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds private void bindGenericCountdown() { 5497635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds mBucketIndex = DEFAULT_BUCKET_INDEX; 5507635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds Condition countdown = ZenModeConfig.toTimeCondition(mContext, 5517635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser()); 5527635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds // don't change the hour condition while the user is viewing the panel 5537635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds if (!mAttached || getConditionTagAt(COUNTDOWN_CONDITION_INDEX).condition == null) { 5547635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bind(countdown, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX), 5557635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds COUNTDOWN_CONDITION_INDEX); 5567635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } 5577635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } 5587635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds 5597635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds private void bindNextAlarm(Condition c) { 5607635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds View alarmContent = mZenRadioGroupContent.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX); 5617635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds ConditionTag tag = (ConditionTag) alarmContent.getTag(); 5627635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds // Don't change the alarm condition while the user is viewing the panel 5637635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds if (c != null && (!mAttached || tag == null || tag.condition == null)) { 5647635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bind(c, alarmContent, COUNTDOWN_ALARM_CONDITION_INDEX); 5657635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } 5667635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds 5677635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds tag = (ConditionTag) alarmContent.getTag(); 5687635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds boolean showAlarm = tag != null && tag.condition != null; 5697635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds mZenRadioGroup.getChildAt(COUNTDOWN_ALARM_CONDITION_INDEX).setVisibility( 570e28c94f98e648f9453cdce2792e54e8e91da2f28Beverly showAlarm ? View.VISIBLE : View.INVISIBLE); 571e28c94f98e648f9453cdce2792e54e8e91da2f28Beverly alarmContent.setVisibility(showAlarm ? View.VISIBLE : View.INVISIBLE); 5727635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } 5737635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds 5740b688503754737a20165f0cff1833e714a5c4164John Spurlock private Condition forever() { 575b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock return new Condition(mForeverId, foreverSummary(mContext), "", "", 0 /*icon*/, 576b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock Condition.STATE_TRUE, 0 /*flags*/); 5770b688503754737a20165f0cff1833e714a5c4164John Spurlock } 5780b688503754737a20165f0cff1833e714a5c4164John Spurlock 579b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock private static String foreverSummary(Context context) { 580b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock return context.getString(com.android.internal.R.string.zen_mode_forever); 5810b688503754737a20165f0cff1833e714a5c4164John Spurlock } 5820b688503754737a20165f0cff1833e714a5c4164John Spurlock 5830842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds // Returns a time condition if the next alarm is within the next week. 5840842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds private Condition getTimeUntilNextAlarmCondition() { 5850842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds GregorianCalendar weekRange = new GregorianCalendar(); 5860842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds setToMidnight(weekRange); 58712d3393249f8a6d65ad6960758c4fe089ffc72cfDan Sandler weekRange.add(Calendar.DATE, 6); 5880842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds final long nextAlarmMs = mController.getNextAlarm(); 5890842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds if (nextAlarmMs > 0) { 5900842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds GregorianCalendar nextAlarm = new GregorianCalendar(); 5910842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds nextAlarm.setTimeInMillis(nextAlarmMs); 5920842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds setToMidnight(nextAlarm); 5930842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds 5940842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds if (weekRange.compareTo(nextAlarm) >= 0) { 5957635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds return ZenModeConfig.toNextAlarmCondition(mContext, nextAlarmMs, 5967635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds ActivityManager.getCurrentUser()); 5970842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds } 5980842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds } 5990842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds return null; 6000842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds } 6010842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds 6020842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds private void setToMidnight(Calendar calendar) { 6030842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds calendar.set(Calendar.HOUR_OF_DAY, 0); 6040842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds calendar.set(Calendar.MINUTE, 0); 6050842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds calendar.set(Calendar.SECOND, 0); 6060842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds calendar.set(Calendar.MILLISECOND, 0); 6070842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds } 6080842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds 6097635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds @VisibleForTesting 6107635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds ConditionTag getConditionTagAt(int index) { 611656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds return (ConditionTag) mZenRadioGroupContent.getChildAt(index).getTag(); 612856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 613856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 6147635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds @VisibleForTesting 6157635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds int getVisibleConditions() { 616530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock int rt = 0; 617656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds final int N = mZenRadioGroupContent.getChildCount(); 618530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock for (int i = 0; i < N; i++) { 619656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds rt += mZenRadioGroupContent.getChildAt(i).getVisibility() == VISIBLE ? 1 : 0; 620530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 621530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock return rt; 622530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 623530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 624530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private void hideAllConditions() { 625656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds final int N = mZenRadioGroupContent.getChildCount(); 626530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock for (int i = 0; i < N; i++) { 627656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds mZenRadioGroupContent.getChildAt(i).setVisibility(GONE); 628530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 629530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 630530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 6317635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds private static boolean isAlarm(Condition c) { 6327635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds return c != null && ZenModeConfig.isValidCountdownToAlarmConditionId(c.id); 6338600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 6348600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 635b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock private static boolean isCountdown(Condition c) { 636530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock return c != null && ZenModeConfig.isValidCountdownConditionId(c.id); 637530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 638530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 6390b688503754737a20165f0cff1833e714a5c4164John Spurlock private boolean isForever(Condition c) { 6400b688503754737a20165f0cff1833e714a5c4164John Spurlock return c != null && mForeverId.equals(c.id); 6410b688503754737a20165f0cff1833e714a5c4164John Spurlock } 6420b688503754737a20165f0cff1833e714a5c4164John Spurlock 6430842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds private void bind(final Condition condition, final View row, final int rowId) { 6440b688503754737a20165f0cff1833e714a5c4164John Spurlock if (condition == null) throw new IllegalArgumentException("condition must not be null"); 6450b688503754737a20165f0cff1833e714a5c4164John Spurlock final boolean enabled = condition.state == Condition.STATE_TRUE; 646856edebad73560e9b1cce021a7de9a0470d07176John Spurlock final ConditionTag tag = 647856edebad73560e9b1cce021a7de9a0470d07176John Spurlock row.getTag() != null ? (ConditionTag) row.getTag() : new ConditionTag(); 648856edebad73560e9b1cce021a7de9a0470d07176John Spurlock row.setTag(tag); 649530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock final boolean first = tag.rb == null; 650856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (tag.rb == null) { 651656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds tag.rb = (RadioButton) mZenRadioGroup.getChildAt(rowId); 652856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 6534db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock tag.condition = condition; 654530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock final Uri conditionId = getConditionId(tag.condition); 655656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds if (DEBUG) Log.d(mTag, "bind i=" + mZenRadioGroupContent.indexOfChild(row) + " first=" 656656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds + first + " condition=" + conditionId); 657856edebad73560e9b1cce021a7de9a0470d07176John Spurlock tag.rb.setEnabled(enabled); 658856edebad73560e9b1cce021a7de9a0470d07176John Spurlock tag.rb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 6598600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock @Override 6608600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 661ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock if (mExpanded && isChecked) { 662656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds tag.rb.setChecked(true); 663530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (DEBUG) Log.d(mTag, "onCheckedChanged " + conditionId); 664f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren MetricsLogger.action(mContext, MetricsEvent.QS_DND_CONDITION_SELECT); 6654db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock select(tag.condition); 666a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock announceConditionSelection(tag); 6678600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 6688600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 6698600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock }); 670a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock 671c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock if (tag.lines == null) { 672c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.lines = row.findViewById(android.R.id.content); 673a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock } 674c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock if (tag.line1 == null) { 675c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.line1 = (TextView) row.findViewById(android.R.id.text1); 67603c548f292b71eaad576bbc10208283467c775b3Julia Reynolds mConfigurableTexts.add(tag.line1); 677c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock } 678c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock if (tag.line2 == null) { 679c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.line2 = (TextView) row.findViewById(android.R.id.text2); 68003c548f292b71eaad576bbc10208283467c775b3Julia Reynolds mConfigurableTexts.add(tag.line2); 681c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock } 6820b688503754737a20165f0cff1833e714a5c4164John Spurlock final String line1 = !TextUtils.isEmpty(condition.line1) ? condition.line1 6830b688503754737a20165f0cff1833e714a5c4164John Spurlock : condition.summary; 6840b688503754737a20165f0cff1833e714a5c4164John Spurlock final String line2 = condition.line2; 685c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.line1.setText(line1); 686c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock if (TextUtils.isEmpty(line2)) { 687c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.line2.setVisibility(GONE); 6888600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } else { 689c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.line2.setVisibility(VISIBLE); 690c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.line2.setText(line2); 6918600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 692c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.lines.setEnabled(enabled); 693c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.lines.setAlpha(enabled ? 1 : .4f); 694a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock 6958600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock final ImageView button1 = (ImageView) row.findViewById(android.R.id.button1); 6968600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock button1.setOnClickListener(new OnClickListener() { 6978600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock @Override 6988600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock public void onClick(View v) { 6990842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds onClickTimeButton(row, tag, false /*down*/, rowId); 7008600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 7018600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock }); 7028600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 7038600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock final ImageView button2 = (ImageView) row.findViewById(android.R.id.button2); 7048600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock button2.setOnClickListener(new OnClickListener() { 7058600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock @Override 7068600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock public void onClick(View v) { 7070842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds onClickTimeButton(row, tag, true /*up*/, rowId); 7088600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 7098600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock }); 710c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.lines.setOnClickListener(new OnClickListener() { 7118600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock @Override 7128600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock public void onClick(View v) { 713656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds tag.rb.setChecked(true); 7148600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 7158600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock }); 716856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 717530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId); 7180842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds if (rowId != COUNTDOWN_ALARM_CONDITION_INDEX && time > 0) { 719530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock button1.setVisibility(VISIBLE); 720530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock button2.setVisibility(VISIBLE); 721856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (mBucketIndex > -1) { 722856edebad73560e9b1cce021a7de9a0470d07176John Spurlock button1.setEnabled(mBucketIndex > 0); 723856edebad73560e9b1cce021a7de9a0470d07176John Spurlock button2.setEnabled(mBucketIndex < MINUTE_BUCKETS.length - 1); 724856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } else { 725856edebad73560e9b1cce021a7de9a0470d07176John Spurlock final long span = time - System.currentTimeMillis(); 726856edebad73560e9b1cce021a7de9a0470d07176John Spurlock button1.setEnabled(span > MIN_BUCKET_MINUTES * MINUTES_MS); 727c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock final Condition maxCondition = ZenModeConfig.toTimeCondition(mContext, 7289c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek MAX_BUCKET_MINUTES, ActivityManager.getCurrentUser()); 729856edebad73560e9b1cce021a7de9a0470d07176John Spurlock button2.setEnabled(!Objects.equals(condition.summary, maxCondition.summary)); 730856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 731856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 732856edebad73560e9b1cce021a7de9a0470d07176John Spurlock button1.setAlpha(button1.isEnabled() ? 1f : .5f); 733856edebad73560e9b1cce021a7de9a0470d07176John Spurlock button2.setAlpha(button2.isEnabled() ? 1f : .5f); 7348600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } else { 735530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock button1.setVisibility(GONE); 736530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock button2.setVisibility(GONE); 7378600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 738a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock // wire up interaction callbacks for newly-added condition rows 739530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (first) { 740a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock Interaction.register(tag.rb, mInteractionCallback); 741c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock Interaction.register(tag.lines, mInteractionCallback); 742a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock Interaction.register(button1, mInteractionCallback); 743a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock Interaction.register(button2, mInteractionCallback); 744a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock } 745530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock row.setVisibility(VISIBLE); 746a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock } 747a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock 748a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock private void announceConditionSelection(ConditionTag tag) { 749a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock final int zen = getSelectedZen(Global.ZEN_MODE_OFF); 750a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock String modeText; 751a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock switch(zen) { 752a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: 753d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock modeText = mContext.getString(R.string.interruption_level_priority); 754a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock break; 755a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock case Global.ZEN_MODE_NO_INTERRUPTIONS: 756d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock modeText = mContext.getString(R.string.interruption_level_none); 757a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock break; 7584f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock case Global.ZEN_MODE_ALARMS: 759d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock modeText = mContext.getString(R.string.interruption_level_alarms); 7604f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock break; 7614f1163c83e79da52b2be7ff6b10163441895bc26John Spurlock default: 762a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock return; 763a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock } 764a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock announceForAccessibility(mContext.getString(R.string.zen_mode_and_condition, modeText, 765c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock tag.line1.getText())); 766856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 767856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 7680842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds private void onClickTimeButton(View row, ConditionTag tag, boolean up, int rowId) { 769f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren MetricsLogger.action(mContext, MetricsEvent.QS_DND_TIME, up); 770856edebad73560e9b1cce021a7de9a0470d07176John Spurlock Condition newCondition = null; 771856edebad73560e9b1cce021a7de9a0470d07176John Spurlock final int N = MINUTE_BUCKETS.length; 772856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (mBucketIndex == -1) { 773856edebad73560e9b1cce021a7de9a0470d07176John Spurlock // not on a known index, search for the next or prev bucket by time 7744db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock final Uri conditionId = getConditionId(tag.condition); 7754db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId); 776856edebad73560e9b1cce021a7de9a0470d07176John Spurlock final long now = System.currentTimeMillis(); 777856edebad73560e9b1cce021a7de9a0470d07176John Spurlock for (int i = 0; i < N; i++) { 778856edebad73560e9b1cce021a7de9a0470d07176John Spurlock int j = up ? i : N - 1 - i; 779856edebad73560e9b1cce021a7de9a0470d07176John Spurlock final int bucketMinutes = MINUTE_BUCKETS[j]; 780856edebad73560e9b1cce021a7de9a0470d07176John Spurlock final long bucketTime = now + bucketMinutes * MINUTES_MS; 781856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (up && bucketTime > time || !up && bucketTime < time) { 782856edebad73560e9b1cce021a7de9a0470d07176John Spurlock mBucketIndex = j; 783c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock newCondition = ZenModeConfig.toTimeCondition(mContext, 7840842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds bucketTime, bucketMinutes, ActivityManager.getCurrentUser(), 785bbde26774fcf7ea65abd92d60f7468478c015053John Spurlock false /*shortVersion*/); 786856edebad73560e9b1cce021a7de9a0470d07176John Spurlock break; 787856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 788856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 789856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (newCondition == null) { 790856edebad73560e9b1cce021a7de9a0470d07176John Spurlock mBucketIndex = DEFAULT_BUCKET_INDEX; 791c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock newCondition = ZenModeConfig.toTimeCondition(mContext, 7929c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser()); 793856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 794856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } else { 795856edebad73560e9b1cce021a7de9a0470d07176John Spurlock // on a known index, simply increment or decrement 796856edebad73560e9b1cce021a7de9a0470d07176John Spurlock mBucketIndex = Math.max(0, Math.min(N - 1, mBucketIndex + (up ? 1 : -1))); 797c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock newCondition = ZenModeConfig.toTimeCondition(mContext, 7989c4a707912da2c954b2d3d1311b8a691ded8aa16Selim Cinek MINUTE_BUCKETS[mBucketIndex], ActivityManager.getCurrentUser()); 799856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 8007635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds bind(newCondition, row, rowId); 801656f98681e93fc7ae6d4e42daa4b0d1bc268c86dJulia Reynolds tag.rb.setChecked(true); 8027635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds select(newCondition); 803a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock announceConditionSelection(tag); 804856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 805856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 806530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private void select(final Condition condition) { 8074db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock if (DEBUG) Log.d(mTag, "select " + condition); 808b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock if (mSessionZen == -1 || mSessionZen == Global.ZEN_MODE_OFF) { 809b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock if (DEBUG) Log.d(mTag, "Ignoring condition selection outside of manual zen"); 810b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock return; 811b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock } 812b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock final Uri realConditionId = getRealConditionId(condition); 813856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (mController != null) { 814530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock AsyncTask.execute(new Runnable() { 815530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock @Override 816530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public void run() { 817b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock mController.setZen(mSessionZen, realConditionId, TAG + ".selectCondition"); 818530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 819530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock }); 820856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 8214db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock setExitCondition(condition); 822b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock if (realConditionId == null) { 8238f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock mPrefs.setMinuteIndex(-1); 8247635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds } else if ((isAlarm(condition) || isCountdown(condition)) && mBucketIndex != -1) { 8258f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock mPrefs.setMinuteIndex(mBucketIndex); 8268600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 827530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock setSessionExitCondition(copy(condition)); 8288600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 8298600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 8308600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock private void fireInteraction() { 8318600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock if (mCallback != null) { 8328600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock mCallback.onInteraction(); 8338600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 8348600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 8358600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 836ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private void fireExpanded() { 837ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock if (mCallback != null) { 838ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock mCallback.onExpanded(mExpanded); 839ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 840ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 841ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 8428600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock private final ZenModeController.Callback mZenCallback = new ZenModeController.Callback() { 8438600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock @Override 844b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock public void onManualRuleChanged(ZenRule rule) { 845b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock mHandler.obtainMessage(H.MANUAL_RULE_CHANGED, rule).sendToTarget(); 846856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 8478600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock }; 8488600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 8498600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock private final class H extends Handler { 850b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock private static final int MANUAL_RULE_CHANGED = 2; 851f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock private static final int UPDATE_WIDGETS = 3; 8528600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 8538600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock private H() { 8548600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock super(Looper.getMainLooper()); 8558600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 8568600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 8578600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock @Override 8588600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock public void handleMessage(Message msg) { 859f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock switch (msg.what) { 860f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock case MANUAL_RULE_CHANGED: handleUpdateManualRule((ZenRule) msg.obj); break; 861f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock case UPDATE_WIDGETS: updateWidgets(); break; 8628600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 8638600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 8648600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 8658600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock 8668600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock public interface Callback { 867f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock void onPrioritySettings(); 8688600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock void onInteraction(); 869ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock void onExpanded(boolean expanded); 8708600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock } 871856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 872856edebad73560e9b1cce021a7de9a0470d07176John Spurlock // used as the view tag on condition rows 8737635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds @VisibleForTesting 8747635ab0a1b7b91104cef84b5600ae829aa6999d5Julia Reynolds static class ConditionTag { 875856edebad73560e9b1cce021a7de9a0470d07176John Spurlock RadioButton rb; 876c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock View lines; 877c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock TextView line1; 878c90e6fe863bb5ac84612bd777d3b352f69265950John Spurlock TextView line2; 8794db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock Condition condition; 880856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 881856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 882f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock private final class ZenPrefs implements OnSharedPreferenceChangeListener { 8838f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock private final int mNoneDangerousThreshold; 884856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 885856edebad73560e9b1cce021a7de9a0470d07176John Spurlock private int mMinuteIndex; 8868f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock private int mNoneSelected; 887d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock private boolean mConfirmedPriorityIntroduction; 888d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock private boolean mConfirmedSilenceIntroduction; 889d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds private boolean mConfirmedAlarmIntroduction; 890856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 891f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock private ZenPrefs() { 8928f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock mNoneDangerousThreshold = mContext.getResources() 8938f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock .getInteger(R.integer.zen_mode_alarm_warning_threshold); 894f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock Prefs.registerListener(mContext, this); 895856edebad73560e9b1cce021a7de9a0470d07176John Spurlock updateMinuteIndex(); 8968f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock updateNoneSelected(); 897d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock updateConfirmedPriorityIntroduction(); 898d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock updateConfirmedSilenceIntroduction(); 899d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds updateConfirmedAlarmIntroduction(); 9008f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock } 9018f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock 9028f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock public void trackNoneSelected() { 9038f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock mNoneSelected = clampNoneSelected(mNoneSelected + 1); 9048f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock if (DEBUG) Log.d(mTag, "Setting none selected: " + mNoneSelected + " threshold=" 9058f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock + mNoneDangerousThreshold); 906f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock Prefs.putInt(mContext, Prefs.Key.DND_NONE_SELECTED, mNoneSelected); 907856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 908856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 909856edebad73560e9b1cce021a7de9a0470d07176John Spurlock public int getMinuteIndex() { 910856edebad73560e9b1cce021a7de9a0470d07176John Spurlock return mMinuteIndex; 911856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 912856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 913856edebad73560e9b1cce021a7de9a0470d07176John Spurlock public void setMinuteIndex(int minuteIndex) { 9148f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock minuteIndex = clampIndex(minuteIndex); 915856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (minuteIndex == mMinuteIndex) return; 9168f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock mMinuteIndex = clampIndex(minuteIndex); 917856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (DEBUG) Log.d(mTag, "Setting favorite minute index: " + mMinuteIndex); 918f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock Prefs.putInt(mContext, Prefs.Key.DND_FAVORITE_BUCKET_INDEX, mMinuteIndex); 919856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 920856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 921856edebad73560e9b1cce021a7de9a0470d07176John Spurlock @Override 922856edebad73560e9b1cce021a7de9a0470d07176John Spurlock public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 923856edebad73560e9b1cce021a7de9a0470d07176John Spurlock updateMinuteIndex(); 9248f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock updateNoneSelected(); 925d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock updateConfirmedPriorityIntroduction(); 926d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock updateConfirmedSilenceIntroduction(); 927d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds updateConfirmedAlarmIntroduction(); 928856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 929856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 930856edebad73560e9b1cce021a7de9a0470d07176John Spurlock private void updateMinuteIndex() { 931f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock mMinuteIndex = clampIndex(Prefs.getInt(mContext, 932f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock Prefs.Key.DND_FAVORITE_BUCKET_INDEX, DEFAULT_BUCKET_INDEX)); 933856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (DEBUG) Log.d(mTag, "Favorite minute index: " + mMinuteIndex); 934856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 935856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 9368f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock private int clampIndex(int index) { 9378f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock return MathUtils.constrain(index, -1, MINUTE_BUCKETS.length - 1); 9388f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock } 9398f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock 9408f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock private void updateNoneSelected() { 941f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock mNoneSelected = clampNoneSelected(Prefs.getInt(mContext, 942f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock Prefs.Key.DND_NONE_SELECTED, 0)); 9438f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock if (DEBUG) Log.d(mTag, "None selected: " + mNoneSelected); 9448f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock } 9458f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock 9468f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock private int clampNoneSelected(int noneSelected) { 9478f8ecd620c796834a1048ec98f0e8072f5ad926cJohn Spurlock return MathUtils.constrain(noneSelected, 0, Integer.MAX_VALUE); 948856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 949f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock 950d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock private void updateConfirmedPriorityIntroduction() { 951f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock final boolean confirmed = Prefs.getBoolean(mContext, 952f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, false); 953d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock if (confirmed == mConfirmedPriorityIntroduction) return; 954d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock mConfirmedPriorityIntroduction = confirmed; 955d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock if (DEBUG) Log.d(mTag, "Confirmed priority introduction: " 956d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock + mConfirmedPriorityIntroduction); 957d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock } 958d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock 959d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock private void updateConfirmedSilenceIntroduction() { 960d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock final boolean confirmed = Prefs.getBoolean(mContext, 961d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock Prefs.Key.DND_CONFIRMED_SILENCE_INTRODUCTION, false); 962d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock if (confirmed == mConfirmedSilenceIntroduction) return; 963d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock mConfirmedSilenceIntroduction = confirmed; 964d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock if (DEBUG) Log.d(mTag, "Confirmed silence introduction: " 965d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock + mConfirmedSilenceIntroduction); 966f55b7f2fb614b917b7d1943396880978258dd1bbJohn Spurlock } 967d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds 968d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds private void updateConfirmedAlarmIntroduction() { 969d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds final boolean confirmed = Prefs.getBoolean(mContext, 970d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds Prefs.Key.DND_CONFIRMED_ALARM_INTRODUCTION, false); 971d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds if (confirmed == mConfirmedAlarmIntroduction) return; 972d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds mConfirmedAlarmIntroduction = confirmed; 973d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds if (DEBUG) Log.d(mTag, "Confirmed alarm introduction: " 974d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds + mConfirmedAlarmIntroduction); 975d7a00aa186f2faf8c779fc7a1b6634fb4efb75acJulia Reynolds } 976856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 977ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 9788303bd2b17eb33dcecf2ef63d1aee87f7427f812Muyuan Li protected final SegmentedButtons.Callback mZenButtonsCallback = new SegmentedButtons.Callback() { 979ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock @Override 9804572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren public void onSelected(final Object value, boolean fromClick) { 981b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock if (value != null && mZenButtons.isShown() && isAttachedToWindow()) { 982d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock final int zen = (Integer) value; 9834572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren if (fromClick) { 984f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren MetricsLogger.action(mContext, MetricsEvent.QS_DND_ZEN_SELECT, zen); 9854572cbc917b62aeece4afcd73713eeabed2a5d92Chris Wren } 986d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock if (DEBUG) Log.d(mTag, "mZenButtonsCallback selected=" + zen); 987b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock final Uri realConditionId = getRealConditionId(mSessionExitCondition); 988530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock AsyncTask.execute(new Runnable() { 989530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock @Override 990530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public void run() { 991d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock mController.setZen(zen, realConditionId, TAG + ".selectZen"); 992d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock if (zen != Global.ZEN_MODE_OFF) { 993d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock Prefs.putInt(mContext, Prefs.Key.DND_FAVORITE_ZEN, zen); 994d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock } 995530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 996530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock }); 997ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 998ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 999a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock 1000a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock @Override 1001a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock public void onInteraction() { 1002a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock fireInteraction(); 1003a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock } 1004a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock }; 1005a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock 1006a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock private final Interaction.Callback mInteractionCallback = new Interaction.Callback() { 1007a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock @Override 1008a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock public void onInteraction() { 1009a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock fireInteraction(); 1010a0457c2e92fc85cfba9a52d502d5038ecc7920f4John Spurlock } 1011ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock }; 1012530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1013530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private final class TransitionHelper implements TransitionListener, Runnable { 1014530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private final ArraySet<View> mTransitioningViews = new ArraySet<View>(); 1015530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1016530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private boolean mTransitioning; 1017530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private boolean mPendingUpdateWidgets; 1018530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1019530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public void clear() { 1020530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mTransitioningViews.clear(); 10210842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds mPendingUpdateWidgets = false; 1022530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1023530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1024530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 1025530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.println(" TransitionHelper state:"); 1026530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.print(" mPendingUpdateWidgets="); pw.println(mPendingUpdateWidgets); 1027530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.print(" mTransitioning="); pw.println(mTransitioning); 1028530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock pw.print(" mTransitioningViews="); pw.println(mTransitioningViews); 1029530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1030530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1031530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public void pendingUpdateWidgets() { 1032530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mPendingUpdateWidgets = true; 1033530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1034530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1035530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public boolean isTransitioning() { 1036530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock return !mTransitioningViews.isEmpty(); 1037530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1038530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1039530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock @Override 1040530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public void startTransition(LayoutTransition transition, 1041530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock ViewGroup container, View view, int transitionType) { 1042530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mTransitioningViews.add(view); 1043530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock updateTransitioning(); 1044530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1045530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1046530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock @Override 1047530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public void endTransition(LayoutTransition transition, 1048530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock ViewGroup container, View view, int transitionType) { 1049530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mTransitioningViews.remove(view); 1050530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock updateTransitioning(); 1051530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1052530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1053530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock @Override 1054530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock public void run() { 1055530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (DEBUG) Log.d(mTag, "TransitionHelper run" 10560842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds + " mPendingUpdateWidgets=" + mPendingUpdateWidgets); 1057530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (mPendingUpdateWidgets) { 1058530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock updateWidgets(); 1059530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 10600842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds mPendingUpdateWidgets = false; 1061530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1062530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock 1063530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock private void updateTransitioning() { 1064530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock final boolean transitioning = isTransitioning(); 1065530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (mTransitioning == transitioning) return; 1066530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mTransitioning = transitioning; 1067530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (DEBUG) Log.d(mTag, "TransitionHelper mTransitioning=" + mTransitioning); 1068530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock if (!mTransitioning) { 10690842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds if (mPendingUpdateWidgets) { 1070530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock mHandler.post(this); 1071530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } else { 10720842fe87b27b9e4a7aecfec25b93dba2d39f398aJulia Reynolds mPendingUpdateWidgets = false; 1073530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1074530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1075530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 1076530052a2fe3b6a6a4246ce28ab0ced647fe7f470John Spurlock } 10778600534df66c2ff5846ed230b50c56229322d48aJohn Spurlock} 1078