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