ZenModeControllerImpl.java revision ae641c9ccd3f81214cee54a5f13804f1765187ad
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.systemui.statusbar.policy; 18 19import android.app.INotificationManager; 20import android.content.Context; 21import android.net.Uri; 22import android.os.Handler; 23import android.os.RemoteException; 24import android.os.ServiceManager; 25import android.provider.Settings.Global; 26import android.service.notification.Condition; 27import android.service.notification.IConditionListener; 28import android.service.notification.ZenModeConfig; 29import android.util.Slog; 30 31import com.android.internal.widget.LockPatternUtils; 32import com.android.systemui.qs.GlobalSetting; 33 34import java.util.ArrayList; 35import java.util.LinkedHashMap; 36 37/** Platform implementation of the zen mode controller. **/ 38public class ZenModeControllerImpl implements ZenModeController { 39 private static final String TAG = "ZenModeControllerImpl"; 40 private static final boolean DEBUG = false; 41 42 private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>(); 43 private final Context mContext; 44 private final GlobalSetting mModeSetting; 45 private final GlobalSetting mConfigSetting; 46 private final INotificationManager mNoMan; 47 private final LinkedHashMap<Uri, Condition> mConditions = new LinkedHashMap<Uri, Condition>(); 48 private final LockPatternUtils mUtils; 49 50 private boolean mRequesting; 51 52 public ZenModeControllerImpl(Context context, Handler handler) { 53 mContext = context; 54 mUtils = new LockPatternUtils(mContext); 55 mModeSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE) { 56 @Override 57 protected void handleValueChanged(int value) { 58 fireZenChanged(value); 59 } 60 }; 61 mConfigSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE_CONFIG_ETAG) { 62 @Override 63 protected void handleValueChanged(int value) { 64 fireExitConditionChanged(); 65 } 66 }; 67 mModeSetting.setListening(true); 68 mConfigSetting.setListening(true); 69 mNoMan = INotificationManager.Stub.asInterface( 70 ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 71 } 72 73 @Override 74 public void addCallback(Callback callback) { 75 mCallbacks.add(callback); 76 } 77 78 @Override 79 public void removeCallback(Callback callback) { 80 mCallbacks.remove(callback); 81 } 82 83 @Override 84 public int getZen() { 85 return mModeSetting.getValue(); 86 } 87 88 @Override 89 public void setZen(int zen) { 90 mModeSetting.setValue(zen); 91 } 92 93 @Override 94 public void requestConditions(boolean request) { 95 mRequesting = request; 96 try { 97 mNoMan.requestZenModeConditions(mListener, request ? Condition.FLAG_RELEVANT_NOW : 0); 98 } catch (RemoteException e) { 99 // noop 100 } 101 if (!mRequesting) { 102 mConditions.clear(); 103 } 104 } 105 106 @Override 107 public void setExitConditionId(Uri exitConditionId) { 108 try { 109 mNoMan.setZenModeCondition(exitConditionId); 110 } catch (RemoteException e) { 111 // noop 112 } 113 } 114 115 @Override 116 public Uri getExitConditionId() { 117 try { 118 final ZenModeConfig config = mNoMan.getZenModeConfig(); 119 if (config != null) { 120 return config.exitConditionId; 121 } 122 } catch (RemoteException e) { 123 // noop 124 } 125 return null; 126 } 127 128 @Override 129 public boolean hasNextAlarm() { 130 return mUtils.getNextAlarm() != null; 131 } 132 133 private void fireZenChanged(int zen) { 134 for (Callback cb : mCallbacks) { 135 cb.onZenChanged(zen); 136 } 137 } 138 139 private void fireConditionsChanged(Condition[] conditions) { 140 for (Callback cb : mCallbacks) { 141 cb.onConditionsChanged(conditions); 142 } 143 } 144 145 private void fireExitConditionChanged() { 146 final Uri exitConditionId = getExitConditionId(); 147 if (DEBUG) Slog.d(TAG, "exitConditionId changed: " + exitConditionId); 148 for (Callback cb : mCallbacks) { 149 cb.onExitConditionChanged(exitConditionId); 150 } 151 } 152 153 private void updateConditions(Condition[] conditions) { 154 if (conditions == null || conditions.length == 0) return; 155 for (Condition c : conditions) { 156 if ((c.flags & Condition.FLAG_RELEVANT_NOW) == 0) continue; 157 mConditions.put(c.id, c); 158 } 159 fireConditionsChanged( 160 mConditions.values().toArray(new Condition[mConditions.values().size()])); 161 } 162 163 private final IConditionListener mListener = new IConditionListener.Stub() { 164 @Override 165 public void onConditionsReceived(Condition[] conditions) { 166 if (DEBUG) Slog.d(TAG, "onConditionsReceived " 167 + (conditions == null ? 0 : conditions.length) + " mRequesting=" + mRequesting); 168 if (!mRequesting) return; 169 updateConditions(conditions); 170 } 171 }; 172} 173