1af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/*
2af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Copyright (C) 2014 The Android Open Source Project
3af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
4af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Licensed under the Apache License, Version 2.0 (the "License");
5af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * you may not use this file except in compliance with the License.
6af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * You may obtain a copy of the License at
7af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
8af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *      http://www.apache.org/licenses/LICENSE-2.0
9af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
10af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Unless required by applicable law or agreed to in writing, software
11af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * distributed under the License is distributed on an "AS IS" BASIS,
12af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * See the License for the specific language governing permissions and
14af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * limitations under the License.
15af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock */
16af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
17af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpackage com.android.systemui.statusbar.policy;
18af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
19d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlockimport android.app.ActivityManager;
2089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlockimport android.app.AlarmManager;
21b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlockimport android.app.NotificationManager;
2289f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlockimport android.content.BroadcastReceiver;
23b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlockimport android.content.ComponentName;
2445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlockimport android.content.ContentResolver;
25af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.Context;
2689f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlockimport android.content.Intent;
2789f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlockimport android.content.IntentFilter;
2845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlockimport android.database.ContentObserver;
29af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.net.Uri;
30af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.Handler;
3189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlockimport android.os.UserHandle;
32f0a60dd2060148e5f7fc915d5ad9c313c0626a79Jason Monkimport android.os.UserManager;
33af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.provider.Settings.Global;
3445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlockimport android.provider.Settings.Secure;
35af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.service.notification.Condition;
36af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.service.notification.IConditionListener;
37856edebad73560e9b1cce021a7de9a0470d07176John Spurlockimport android.service.notification.ZenModeConfig;
38b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlockimport android.service.notification.ZenModeConfig.ZenRule;
3989f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlockimport android.util.Log;
40af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.util.Slog;
41af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
42af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.GlobalSetting;
43af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
44af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport java.util.ArrayList;
45af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport java.util.LinkedHashMap;
46b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlockimport java.util.Objects;
47af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
48af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** Platform implementation of the zen mode controller. **/
49af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpublic class ZenModeControllerImpl implements ZenModeController {
5089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    private static final String TAG = "ZenModeController";
5189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
52af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
53af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>();
54af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final Context mContext;
55856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    private final GlobalSetting mModeSetting;
56856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    private final GlobalSetting mConfigSetting;
57cdb57aeb0e2c83a887c86da0ca2a890df7f02f41John Spurlock    private final NotificationManager mNoMan;
58af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final LinkedHashMap<Uri, Condition> mConditions = new LinkedHashMap<Uri, Condition>();
5989f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    private final AlarmManager mAlarmManager;
6045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock    private final SetupObserver mSetupObserver;
61f0a60dd2060148e5f7fc915d5ad9c313c0626a79Jason Monk    private final UserManager mUserManager;
62af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
6389f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    private int mUserId;
64af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mRequesting;
658b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock    private boolean mRegistered;
66b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private ZenModeConfig mConfig;
67af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
68af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public ZenModeControllerImpl(Context context, Handler handler) {
69af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mContext = context;
70856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        mModeSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE) {
71af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            @Override
72af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            protected void handleValueChanged(int value) {
73ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock                fireZenChanged(value);
74af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
75af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        };
76856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        mConfigSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE_CONFIG_ETAG) {
77856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            @Override
78856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            protected void handleValueChanged(int value) {
79b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock                updateZenModeConfig();
80856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            }
81856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        };
82b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        mNoMan = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
83b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        mConfig = mNoMan.getZenModeConfig();
84856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        mModeSetting.setListening(true);
85856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        mConfigSetting.setListening(true);
8689f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
8745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        mSetupObserver = new SetupObserver(handler);
8845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        mSetupObserver.register();
89f0a60dd2060148e5f7fc915d5ad9c313c0626a79Jason Monk        mUserManager = context.getSystemService(UserManager.class);
90f0a60dd2060148e5f7fc915d5ad9c313c0626a79Jason Monk    }
91f0a60dd2060148e5f7fc915d5ad9c313c0626a79Jason Monk
92f0a60dd2060148e5f7fc915d5ad9c313c0626a79Jason Monk    @Override
93f0a60dd2060148e5f7fc915d5ad9c313c0626a79Jason Monk    public boolean isVolumeRestricted() {
94f0a60dd2060148e5f7fc915d5ad9c313c0626a79Jason Monk        return mUserManager.hasUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME,
95f0a60dd2060148e5f7fc915d5ad9c313c0626a79Jason Monk                new UserHandle(mUserId));
96af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
97af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
98af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
99af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void addCallback(Callback callback) {
100af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mCallbacks.add(callback);
101af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
102af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
103af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
104af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void removeCallback(Callback callback) {
105af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mCallbacks.remove(callback);
106af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
107af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
108af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
109ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    public int getZen() {
110ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock        return mModeSetting.getValue();
111af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
112af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
113af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
114b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    public void setZen(int zen, Uri conditionId, String reason) {
115b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        mNoMan.setZenMode(zen, conditionId, reason);
116af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
117af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
118af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
11945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock    public boolean isZenAvailable() {
12045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        return mSetupObserver.isDeviceProvisioned() && mSetupObserver.isUserSetup();
12145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock    }
12245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock
12345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock    @Override
124b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    public ZenRule getManualRule() {
125b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        return mConfig == null ? null : mConfig.manualRule;
126856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
127856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
128856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    @Override
129b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    public ZenModeConfig getConfig() {
130b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        return mConfig;
131af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
132af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
133ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    @Override
13489f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    public long getNextAlarm() {
135235510e67210f90de30c2d5582a2077ccc589619Jose Lima        final AlarmManager.AlarmClockInfo info = mAlarmManager.getNextAlarmClock(mUserId);
13689f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock        return info != null ? info.getTriggerTime() : 0;
13789f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    }
13889f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock
13989f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    @Override
14089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    public void setUserId(int userId) {
14189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock        mUserId = userId;
1428b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock        if (mRegistered) {
1438b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock            mContext.unregisterReceiver(mReceiver);
1448b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock        }
145661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock        final IntentFilter filter = new IntentFilter(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
146661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock        filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED);
147661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock        mContext.registerReceiverAsUser(mReceiver, new UserHandle(mUserId), filter, null, null);
1488b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock        mRegistered = true;
14945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        mSetupObserver.register();
15089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    }
15189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock
152b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock    @Override
153b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock    public ComponentName getEffectsSuppressor() {
154b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock        return NotificationManager.from(mContext).getEffectsSuppressor();
155b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock    }
156b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock
157ad680d46be19cbee16d42cbed4d2ed250648ac0bJohn Spurlock    @Override
158ad680d46be19cbee16d42cbed4d2ed250648ac0bJohn Spurlock    public boolean isCountdownConditionSupported() {
159ad680d46be19cbee16d42cbed4d2ed250648ac0bJohn Spurlock        return NotificationManager.from(mContext)
160ad680d46be19cbee16d42cbed4d2ed250648ac0bJohn Spurlock                .isSystemConditionProviderEnabled(ZenModeConfig.COUNTDOWN_PATH);
161ad680d46be19cbee16d42cbed4d2ed250648ac0bJohn Spurlock    }
162ad680d46be19cbee16d42cbed4d2ed250648ac0bJohn Spurlock
163d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock    @Override
164d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock    public int getCurrentUser() {
165d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock        return ActivityManager.getCurrentUser();
166d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock    }
167d9c75dba75ad4742dbaadc34db99d2b76cebca91John Spurlock
16889f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    private void fireNextAlarmChanged() {
16989f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock        for (Callback cb : mCallbacks) {
17089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock            cb.onNextAlarmChanged();
17189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock        }
172ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    }
173ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock
174b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock    private void fireEffectsSuppressorChanged() {
175b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock        for (Callback cb : mCallbacks) {
176b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock            cb.onEffectsSupressorChanged();
177b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock        }
178b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock    }
179b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock
180ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock    private void fireZenChanged(int zen) {
181af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        for (Callback cb : mCallbacks) {
182af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            cb.onZenChanged(zen);
183af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
184af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
185af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
18645601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock    private void fireZenAvailableChanged(boolean available) {
18745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        for (Callback cb : mCallbacks) {
18845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            cb.onZenAvailableChanged(available);
18945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        }
19045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock    }
19145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock
192af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private void fireConditionsChanged(Condition[] conditions) {
193af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        for (Callback cb : mCallbacks) {
194af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            cb.onConditionsChanged(conditions);
195af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
196af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
197af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
198b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private void fireManualRuleChanged(ZenRule rule) {
199b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        for (Callback cb : mCallbacks) {
200b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            cb.onManualRuleChanged(rule);
201b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        }
202b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    }
203b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock
204b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private void fireConfigChanged(ZenModeConfig config) {
205856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        for (Callback cb : mCallbacks) {
206b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock            cb.onConfigChanged(config);
207856edebad73560e9b1cce021a7de9a0470d07176John Spurlock        }
208856edebad73560e9b1cce021a7de9a0470d07176John Spurlock    }
209856edebad73560e9b1cce021a7de9a0470d07176John Spurlock
210af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private void updateConditions(Condition[] conditions) {
211af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (conditions == null || conditions.length == 0) return;
212af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        for (Condition c : conditions) {
213af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if ((c.flags & Condition.FLAG_RELEVANT_NOW) == 0) continue;
214af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mConditions.put(c.id, c);
215af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
216af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        fireConditionsChanged(
217af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mConditions.values().toArray(new Condition[mConditions.values().size()]));
218af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
219af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
220b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    private void updateZenModeConfig() {
221b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        final ZenModeConfig config = mNoMan.getZenModeConfig();
222b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        if (Objects.equals(config, mConfig)) return;
223b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        final ZenRule oldRule = mConfig != null ? mConfig.manualRule : null;
224b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        mConfig = config;
225b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        fireConfigChanged(config);
226b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        final ZenRule newRule = config != null ? config.manualRule : null;
227b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        if (Objects.equals(oldRule, newRule)) return;
228b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock        fireManualRuleChanged(newRule);
229b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock    }
230b2278d65714c0dd0a6f94d1913db1ebc8bfc8b06John Spurlock
231af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final IConditionListener mListener = new IConditionListener.Stub() {
232af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
233af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void onConditionsReceived(Condition[] conditions) {
234856edebad73560e9b1cce021a7de9a0470d07176John Spurlock            if (DEBUG) Slog.d(TAG, "onConditionsReceived "
235856edebad73560e9b1cce021a7de9a0470d07176John Spurlock                    + (conditions == null ? 0 : conditions.length) + " mRequesting=" + mRequesting);
236af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (!mRequesting) return;
237af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateConditions(conditions);
238af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
239af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    };
24089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock
24189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
24289f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock        @Override
24389f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock        public void onReceive(Context context, Intent intent) {
24489f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock            if (AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(intent.getAction())) {
24589f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock                fireNextAlarmChanged();
24689f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock            }
247b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock            if (NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED.equals(intent.getAction())) {
248b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock                fireEffectsSuppressorChanged();
249b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock            }
25089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock        }
25189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock    };
25245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock
25345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock    private final class SetupObserver extends ContentObserver {
25445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        private final ContentResolver mResolver;
25545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock
25645601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        private boolean mRegistered;
25745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock
25845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        public SetupObserver(Handler handler) {
25945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            super(handler);
26045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            mResolver = mContext.getContentResolver();
26145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        }
26245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock
26345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        public boolean isUserSetup() {
26445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            return Secure.getIntForUser(mResolver, Secure.USER_SETUP_COMPLETE, 0, mUserId) != 0;
26545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        }
26645601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock
26745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        public boolean isDeviceProvisioned() {
26845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            return Global.getInt(mResolver, Global.DEVICE_PROVISIONED, 0) != 0;
26945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        }
27045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock
27145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        public void register() {
27245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            if (mRegistered) {
27345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock                mResolver.unregisterContentObserver(this);
27445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            }
27545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            mResolver.registerContentObserver(
27645601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock                    Global.getUriFor(Global.DEVICE_PROVISIONED), false, this);
27745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            mResolver.registerContentObserver(
27845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock                    Secure.getUriFor(Secure.USER_SETUP_COMPLETE), false, this, mUserId);
27945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            fireZenAvailableChanged(isZenAvailable());
28045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        }
28145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock
28245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        @Override
28345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        public void onChange(boolean selfChange, Uri uri) {
28445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            if (Global.getUriFor(Global.DEVICE_PROVISIONED).equals(uri)
28545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock                    || Secure.getUriFor(Secure.USER_SETUP_COMPLETE).equals(uri)) {
28645601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock                fireZenAvailableChanged(isZenAvailable());
28745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock            }
28845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock        }
28945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock    }
290af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock}
291