blob: e618cb87887d0d797cca9e401671bf6187d11a58 [file] [log] [blame]
Jason Monk07b75fe2015-05-14 16:47:03 -04001/*
2 * Copyright (C) 2015 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 */
16package com.android.systemui.statusbar.policy;
17
18import android.os.Handler;
19import android.os.Looper;
20import android.os.Message;
21import android.telephony.SubscriptionInfo;
22
23import com.android.internal.annotations.VisibleForTesting;
24import com.android.systemui.statusbar.policy.NetworkController.IconState;
25import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
26import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener;
27
28import java.util.ArrayList;
29import java.util.List;
30
31
32/**
33 * Implements network listeners and forwards the calls along onto other listeners but on
34 * the current or specified Looper.
35 */
36public class CallbackHandler extends Handler implements EmergencyListener, SignalCallback {
37 private static final int MSG_EMERGENCE_CHANGED = 0;
38 private static final int MSG_SUBS_CHANGED = 1;
39 private static final int MSG_NO_SIM_VISIBLE_CHANGED = 2;
40 private static final int MSG_ETHERNET_CHANGED = 3;
41 private static final int MSG_AIRPLANE_MODE_CHANGED = 4;
42 private static final int MSG_MOBILE_DATA_ENABLED_CHANGED = 5;
43 private static final int MSG_ADD_REMOVE_EMERGENCY = 6;
44 private static final int MSG_ADD_REMOVE_SIGNAL = 7;
45
46 // All the callbacks.
47 private final ArrayList<EmergencyListener> mEmergencyListeners = new ArrayList<>();
48 private final ArrayList<SignalCallback> mSignalCallbacks = new ArrayList<>();
49
50 public CallbackHandler() {
51 super();
52 }
53
54 @VisibleForTesting
55 CallbackHandler(Looper looper) {
56 super(looper);
57 }
58
59 @Override
60 @SuppressWarnings("unchecked")
61 public void handleMessage(Message msg) {
62 switch (msg.what) {
63 case MSG_EMERGENCE_CHANGED:
64 for (EmergencyListener listener : mEmergencyListeners) {
65 listener.setEmergencyCallsOnly(msg.arg1 != 0);
66 }
67 break;
68 case MSG_SUBS_CHANGED:
69 for (SignalCallback signalCluster : mSignalCallbacks) {
70 signalCluster.setSubs((List<SubscriptionInfo>) msg.obj);
71 }
72 break;
73 case MSG_NO_SIM_VISIBLE_CHANGED:
74 for (SignalCallback signalCluster : mSignalCallbacks) {
75 signalCluster.setNoSims(msg.arg1 != 0);
76 }
77 break;
78 case MSG_ETHERNET_CHANGED:
79 for (SignalCallback signalCluster : mSignalCallbacks) {
80 signalCluster.setEthernetIndicators((IconState) msg.obj);
81 }
82 break;
83 case MSG_AIRPLANE_MODE_CHANGED:
84 for (SignalCallback signalCluster : mSignalCallbacks) {
85 signalCluster.setIsAirplaneMode((IconState) msg.obj);
86 }
87 break;
88 case MSG_MOBILE_DATA_ENABLED_CHANGED:
89 for (SignalCallback signalCluster : mSignalCallbacks) {
90 signalCluster.setMobileDataEnabled(msg.arg1 != 0);
91 }
92 break;
93 case MSG_ADD_REMOVE_EMERGENCY:
94 if (msg.arg1 != 0) {
95 mEmergencyListeners.add((EmergencyListener) msg.obj);
96 } else {
97 mEmergencyListeners.remove((EmergencyListener) msg.obj);
98 }
99 break;
100 case MSG_ADD_REMOVE_SIGNAL:
101 if (msg.arg1 != 0) {
102 mSignalCallbacks.add((SignalCallback) msg.obj);
103 } else {
104 mSignalCallbacks.remove((SignalCallback) msg.obj);
105 }
106 break;
107 }
108 }
109
110 @Override
111 public void setWifiIndicators(final boolean enabled, final IconState statusIcon,
112 final IconState qsIcon, final boolean activityIn, final boolean activityOut,
113 final String description) {
114 post(new Runnable() {
115 @Override
116 public void run() {
117 for (SignalCallback callback : mSignalCallbacks) {
118 callback.setWifiIndicators(enabled, statusIcon, qsIcon, activityIn, activityOut,
119 description);
120 }
121 }
122 });
123 }
124
125 @Override
126 public void setMobileDataIndicators(final IconState statusIcon, final IconState qsIcon,
Andrew Flynn2fdbe122015-06-01 16:34:21 -0400127 final int statusType, final int qsType,final boolean activityIn,
128 final boolean activityOut, final String typeContentDescription,
129 final String description, final boolean isWide, final int subId) {
Jason Monk07b75fe2015-05-14 16:47:03 -0400130 post(new Runnable() {
131 @Override
132 public void run() {
133 for (SignalCallback signalCluster : mSignalCallbacks) {
Andrew Flynn2fdbe122015-06-01 16:34:21 -0400134 signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType,
135 activityIn, activityOut, typeContentDescription, description, isWide,
136 subId);
Jason Monk07b75fe2015-05-14 16:47:03 -0400137 }
138 }
139 });
140 }
141
142 @Override
143 public void setSubs(List<SubscriptionInfo> subs) {
144 obtainMessage(MSG_SUBS_CHANGED, subs).sendToTarget();
145 }
146
147 @Override
148 public void setNoSims(boolean show) {
149 obtainMessage(MSG_NO_SIM_VISIBLE_CHANGED, show ? 1 : 0, 0).sendToTarget();
150 }
151
152 @Override
153 public void setMobileDataEnabled(boolean enabled) {
154 obtainMessage(MSG_MOBILE_DATA_ENABLED_CHANGED, enabled ? 1 : 0, 0).sendToTarget();
155 }
156
157 @Override
158 public void setEmergencyCallsOnly(boolean emergencyOnly) {
159 obtainMessage(MSG_EMERGENCE_CHANGED, emergencyOnly ? 1 : 0, 0).sendToTarget();
160 }
161
162 @Override
163 public void setEthernetIndicators(IconState icon) {
164 obtainMessage(MSG_ETHERNET_CHANGED, icon).sendToTarget();;
165 }
166
167 @Override
168 public void setIsAirplaneMode(IconState icon) {
169 obtainMessage(MSG_AIRPLANE_MODE_CHANGED, icon).sendToTarget();;
170 }
171
172 public void setListening(EmergencyListener listener, boolean listening) {
173 obtainMessage(MSG_ADD_REMOVE_EMERGENCY, listening ? 1 : 0, 0, listener).sendToTarget();
174 }
175
176 public void setListening(SignalCallback listener, boolean listening) {
177 obtainMessage(MSG_ADD_REMOVE_SIGNAL, listening ? 1 : 0, 0, listener).sendToTarget();
178 }
179
180}