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 1989f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlockimport android.app.AlarmManager; 20af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.app.INotificationManager; 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; 31af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.RemoteException; 32af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.ServiceManager; 3389f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlockimport android.os.UserHandle; 34af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.provider.Settings.Global; 3545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlockimport android.provider.Settings.Secure; 36af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.service.notification.Condition; 37af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.service.notification.IConditionListener; 38856edebad73560e9b1cce021a7de9a0470d07176John Spurlockimport android.service.notification.ZenModeConfig; 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; 46af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 47af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** Platform implementation of the zen mode controller. **/ 48af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpublic class ZenModeControllerImpl implements ZenModeController { 4989f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock private static final String TAG = "ZenModeController"; 5089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); 51af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 52af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>(); 53af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final Context mContext; 54856edebad73560e9b1cce021a7de9a0470d07176John Spurlock private final GlobalSetting mModeSetting; 55856edebad73560e9b1cce021a7de9a0470d07176John Spurlock private final GlobalSetting mConfigSetting; 56af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final INotificationManager mNoMan; 57af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final LinkedHashMap<Uri, Condition> mConditions = new LinkedHashMap<Uri, Condition>(); 5889f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock private final AlarmManager mAlarmManager; 5945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock private final SetupObserver mSetupObserver; 60af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 6189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock private int mUserId; 62af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private boolean mRequesting; 638b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock private boolean mRegistered; 64af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 65af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public ZenModeControllerImpl(Context context, Handler handler) { 66af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mContext = context; 67856edebad73560e9b1cce021a7de9a0470d07176John Spurlock mModeSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE) { 68af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 69af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock protected void handleValueChanged(int value) { 70ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock fireZenChanged(value); 71af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 72af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock }; 73856edebad73560e9b1cce021a7de9a0470d07176John Spurlock mConfigSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE_CONFIG_ETAG) { 74856edebad73560e9b1cce021a7de9a0470d07176John Spurlock @Override 75856edebad73560e9b1cce021a7de9a0470d07176John Spurlock protected void handleValueChanged(int value) { 76856edebad73560e9b1cce021a7de9a0470d07176John Spurlock fireExitConditionChanged(); 77856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 78856edebad73560e9b1cce021a7de9a0470d07176John Spurlock }; 79856edebad73560e9b1cce021a7de9a0470d07176John Spurlock mModeSetting.setListening(true); 80856edebad73560e9b1cce021a7de9a0470d07176John Spurlock mConfigSetting.setListening(true); 81af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mNoMan = INotificationManager.Stub.asInterface( 82af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 8389f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 8445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock mSetupObserver = new SetupObserver(handler); 8545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock mSetupObserver.register(); 86af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 87af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 88af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 89af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void addCallback(Callback callback) { 90af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mCallbacks.add(callback); 91af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 92af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 93af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 94af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void removeCallback(Callback callback) { 95af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mCallbacks.remove(callback); 96af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 97af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 98af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 99ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock public int getZen() { 100ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock return mModeSetting.getValue(); 101af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 102af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 103af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 104ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock public void setZen(int zen) { 105ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock mModeSetting.setValue(zen); 106af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 107af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 108af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 10945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock public boolean isZenAvailable() { 11045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock return mSetupObserver.isDeviceProvisioned() && mSetupObserver.isUserSetup(); 11145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 11245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock 11345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock @Override 114af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void requestConditions(boolean request) { 115af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mRequesting = request; 116af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock try { 117af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mNoMan.requestZenModeConditions(mListener, request ? Condition.FLAG_RELEVANT_NOW : 0); 118af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } catch (RemoteException e) { 119af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock // noop 120af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 121af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock if (!mRequesting) { 122af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mConditions.clear(); 123af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 124af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 125af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 126af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 1274db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock public void setExitCondition(Condition exitCondition) { 128856edebad73560e9b1cce021a7de9a0470d07176John Spurlock try { 1294db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock mNoMan.setZenModeCondition(exitCondition); 130856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } catch (RemoteException e) { 131856edebad73560e9b1cce021a7de9a0470d07176John Spurlock // noop 132856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 133856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 134856edebad73560e9b1cce021a7de9a0470d07176John Spurlock 135856edebad73560e9b1cce021a7de9a0470d07176John Spurlock @Override 1364db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock public Condition getExitCondition() { 137af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock try { 138856edebad73560e9b1cce021a7de9a0470d07176John Spurlock final ZenModeConfig config = mNoMan.getZenModeConfig(); 139856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (config != null) { 1404db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock return config.exitCondition; 141856edebad73560e9b1cce021a7de9a0470d07176John Spurlock } 142af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } catch (RemoteException e) { 143af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock // noop 144af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 145856edebad73560e9b1cce021a7de9a0470d07176John Spurlock return null; 146af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 147af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 148ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock @Override 14989f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock public long getNextAlarm() { 150235510e67210f90de30c2d5582a2077ccc589619Jose Lima final AlarmManager.AlarmClockInfo info = mAlarmManager.getNextAlarmClock(mUserId); 15189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock return info != null ? info.getTriggerTime() : 0; 15289f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock } 15389f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock 15489f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock @Override 15589f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock public void setUserId(int userId) { 15689f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock mUserId = userId; 1578b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock if (mRegistered) { 1588b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock mContext.unregisterReceiver(mReceiver); 1598b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock } 160661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock final IntentFilter filter = new IntentFilter(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); 161661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED); 162661f2cf45860d2e10924e6b69966a9afe255f28bJohn Spurlock mContext.registerReceiverAsUser(mReceiver, new UserHandle(mUserId), filter, null, null); 1638b0249da3ee6fd9f23ba59ee03eb19d9ee8efa92John Spurlock mRegistered = true; 16445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock mSetupObserver.register(); 16589f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock } 16689f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock 167b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock @Override 168b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock public ComponentName getEffectsSuppressor() { 169b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock return NotificationManager.from(mContext).getEffectsSuppressor(); 170b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock } 171b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock 17289f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock private void fireNextAlarmChanged() { 17389f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock for (Callback cb : mCallbacks) { 17489f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock cb.onNextAlarmChanged(); 17589f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock } 176ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock } 177ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock 178b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock private void fireEffectsSuppressorChanged() { 179b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock for (Callback cb : mCallbacks) { 180b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock cb.onEffectsSupressorChanged(); 181b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock } 182b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock } 183b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock 184ae641c9ccd3f81214cee54a5f13804f1765187adJohn Spurlock private void fireZenChanged(int zen) { 185af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock for (Callback cb : mCallbacks) { 186af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock cb.onZenChanged(zen); 187af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 188af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 189af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 19045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock private void fireZenAvailableChanged(boolean available) { 19145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock for (Callback cb : mCallbacks) { 19245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock cb.onZenAvailableChanged(available); 19345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 19445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 19545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock 196af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private void fireConditionsChanged(Condition[] conditions) { 197af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock for (Callback cb : mCallbacks) { 198af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock cb.onConditionsChanged(conditions); 199af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 200af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 201af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 202856edebad73560e9b1cce021a7de9a0470d07176John Spurlock private void fireExitConditionChanged() { 2034db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock final Condition exitCondition = getExitCondition(); 2044db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock if (DEBUG) Slog.d(TAG, "exitCondition changed: " + exitCondition); 205856edebad73560e9b1cce021a7de9a0470d07176John Spurlock for (Callback cb : mCallbacks) { 2064db0d98b42a723f2e16c6595e85e866fd26c6d98John Spurlock cb.onExitConditionChanged(exitCondition); 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 220af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final IConditionListener mListener = new IConditionListener.Stub() { 221af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 222af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void onConditionsReceived(Condition[] conditions) { 223856edebad73560e9b1cce021a7de9a0470d07176John Spurlock if (DEBUG) Slog.d(TAG, "onConditionsReceived " 224856edebad73560e9b1cce021a7de9a0470d07176John Spurlock + (conditions == null ? 0 : conditions.length) + " mRequesting=" + mRequesting); 225af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock if (!mRequesting) return; 226af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock updateConditions(conditions); 227af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 228af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock }; 22989f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock 23089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 23189f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock @Override 23289f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock public void onReceive(Context context, Intent intent) { 23389f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock if (AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(intent.getAction())) { 23489f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock fireNextAlarmChanged(); 23589f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock } 236b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock if (NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED.equals(intent.getAction())) { 237b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock fireEffectsSuppressorChanged(); 238b4782526f5600d9759baac64b23e0c0cd05e2050John Spurlock } 23989f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock } 24089f060a1e0fa48c497855d061b5c9ec44bb576c8John Spurlock }; 24145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock 24245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock private final class SetupObserver extends ContentObserver { 24345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock private final ContentResolver mResolver; 24445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock 24545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock private boolean mRegistered; 24645601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock 24745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock public SetupObserver(Handler handler) { 24845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock super(handler); 24945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock mResolver = mContext.getContentResolver(); 25045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 25145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock 25245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock public boolean isUserSetup() { 25345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock return Secure.getIntForUser(mResolver, Secure.USER_SETUP_COMPLETE, 0, mUserId) != 0; 25445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 25545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock 25645601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock public boolean isDeviceProvisioned() { 25745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock return Global.getInt(mResolver, Global.DEVICE_PROVISIONED, 0) != 0; 25845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 25945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock 26045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock public void register() { 26145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock if (mRegistered) { 26245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock mResolver.unregisterContentObserver(this); 26345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 26445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock mResolver.registerContentObserver( 26545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock Global.getUriFor(Global.DEVICE_PROVISIONED), false, this); 26645601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock mResolver.registerContentObserver( 26745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock Secure.getUriFor(Secure.USER_SETUP_COMPLETE), false, this, mUserId); 26845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock fireZenAvailableChanged(isZenAvailable()); 26945601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 27045601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock 27145601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock @Override 27245601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock public void onChange(boolean selfChange, Uri uri) { 27345601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock if (Global.getUriFor(Global.DEVICE_PROVISIONED).equals(uri) 27445601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock || Secure.getUriFor(Secure.USER_SETUP_COMPLETE).equals(uri)) { 27545601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock fireZenAvailableChanged(isZenAvailable()); 27645601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 27745601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 27845601d6b64f2117b0bee1d23d55d420bbf273c5cJohn Spurlock } 279af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock} 280