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