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