• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.settings.notification;
18 
19 import android.animation.LayoutTransition;
20 import android.app.INotificationManager;
21 import android.content.Context;
22 import android.net.Uri;
23 import android.os.Handler;
24 import android.os.Message;
25 import android.os.RemoteException;
26 import android.os.ServiceManager;
27 import android.service.notification.Condition;
28 import android.service.notification.IConditionListener;
29 import android.util.ArraySet;
30 import android.util.Log;
31 import android.widget.CheckBox;
32 import android.widget.CompoundButton;
33 import android.widget.LinearLayout;
34 
35 import com.android.settings.R;
36 
37 public class ZenModeAutomaticConditionSelection extends LinearLayout {
38     private static final String TAG = "ZenModeAutomaticConditionSelection";
39     private static final boolean DEBUG = true;
40 
41     private final INotificationManager mNoMan;
42     private final H mHandler = new H();
43     private final Context mContext;
44     private final ArraySet<Uri> mSelectedConditions = new ArraySet<Uri>();
45 
ZenModeAutomaticConditionSelection(Context context)46     public ZenModeAutomaticConditionSelection(Context context) {
47         super(context);
48         mContext = context;
49         setOrientation(VERTICAL);
50         setLayoutTransition(new LayoutTransition());
51         final int p = mContext.getResources().getDimensionPixelSize(R.dimen.content_margin_left);
52         setPadding(p, p, p, 0);
53         mNoMan = INotificationManager.Stub.asInterface(
54                 ServiceManager.getService(Context.NOTIFICATION_SERVICE));
55         refreshSelectedConditions();
56     }
57 
refreshSelectedConditions()58     private void refreshSelectedConditions() {
59         try {
60             final Condition[] automatic = mNoMan.getAutomaticZenModeConditions();
61             mSelectedConditions.clear();
62             if (automatic != null) {
63                 for (Condition c : automatic) {
64                     mSelectedConditions.add(c.id);
65                 }
66             }
67         } catch (RemoteException e) {
68             Log.w(TAG, "Error calling getAutomaticZenModeConditions", e);
69         }
70     }
71 
newCheckBox(Object tag)72     private CheckBox newCheckBox(Object tag) {
73         final CheckBox button = new CheckBox(mContext);
74         button.setTag(tag);
75         button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
76             @Override
77             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
78                  setSelectedCondition((Uri)button.getTag(), isChecked);
79             }
80         });
81         addView(button);
82         return button;
83     }
84 
setSelectedCondition(Uri conditionId, boolean selected)85     private void setSelectedCondition(Uri conditionId, boolean selected) {
86         if (DEBUG) Log.d(TAG, "setSelectedCondition conditionId=" + conditionId
87                 + " selected=" + selected);
88         if (selected) {
89             mSelectedConditions.add(conditionId);
90         } else {
91             mSelectedConditions.remove(conditionId);
92         }
93         final Uri[] automatic = new Uri[mSelectedConditions.size()];
94         for (int i = 0; i < automatic.length; i++) {
95             automatic[i] = mSelectedConditions.valueAt(i);
96         }
97         try {
98             mNoMan.setAutomaticZenModeConditions(automatic);
99         } catch (RemoteException e) {
100             Log.w(TAG, "Error calling setAutomaticZenModeConditions", e);
101         }
102     }
103 
104     @Override
onAttachedToWindow()105     protected void onAttachedToWindow() {
106         super.onAttachedToWindow();
107         requestZenModeConditions(Condition.FLAG_RELEVANT_ALWAYS);
108     }
109 
110     @Override
onDetachedFromWindow()111     protected void onDetachedFromWindow() {
112         super.onDetachedFromWindow();
113         requestZenModeConditions(0 /*none*/);
114     }
115 
requestZenModeConditions(int relevance)116     protected void requestZenModeConditions(int relevance) {
117         if (DEBUG) Log.d(TAG, "requestZenModeConditions " + Condition.relevanceToString(relevance));
118         try {
119             mNoMan.requestZenModeConditions(mListener, relevance);
120         } catch (RemoteException e) {
121             Log.w(TAG, "Error calling requestZenModeConditions", e);
122         }
123     }
124 
handleConditions(Condition[] conditions)125     protected void handleConditions(Condition[] conditions) {
126         for (final Condition c : conditions) {
127             CheckBox v = (CheckBox) findViewWithTag(c.id);
128             if (c.state != Condition.STATE_ERROR) {
129                 if (v == null) {
130                     v = newCheckBox(c.id);
131                 }
132             }
133             if (v != null) {
134                 v.setText(c.summary);
135                 v.setEnabled(c.state != Condition.STATE_ERROR);
136                 v.setChecked(mSelectedConditions.contains(c.id));
137             }
138         }
139     }
140 
141     private final IConditionListener mListener = new IConditionListener.Stub() {
142         @Override
143         public void onConditionsReceived(Condition[] conditions) {
144             if (conditions == null || conditions.length == 0) return;
145             mHandler.obtainMessage(H.CONDITIONS, conditions).sendToTarget();
146         }
147     };
148 
149     private final class H extends Handler {
150         private static final int CONDITIONS = 1;
151 
152         @Override
handleMessage(Message msg)153         public void handleMessage(Message msg) {
154             if (msg.what == CONDITIONS) handleConditions((Condition[])msg.obj);
155         }
156     }
157 }
158