diff options
author | Mitchell Wills <mwills@google.com> | 2016-03-09 11:42:05 -0800 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2016-03-09 11:59:29 -0800 |
commit | 3c83d4783673c1e2fa64c56dc586c5f7c3ab73e0 (patch) | |
tree | fc719adecd1cd3c4c51aacb03311dfdfb45255bf /service/java/com/android/server/wifi/WifiMonitor.java | |
parent | d74ff28cdb01d3f711e0b0f0e99e51fdb221eaf2 (diff) | |
download | android_frameworks_opt_net_wifi-3c83d4783673c1e2fa64c56dc586c5f7c3ab73e0.tar.gz android_frameworks_opt_net_wifi-3c83d4783673c1e2fa64c56dc586c5f7c3ab73e0.tar.bz2 android_frameworks_opt_net_wifi-3c83d4783673c1e2fa64c56dc586c5f7c3ab73e0.zip |
Allow multiple Handlers to be registered for a WifiMonitor event
Bug: 26966049
Bug: 27569474
Change-Id: I07012b0e4ad2e3510e0a84368949b65d7b99507d
Diffstat (limited to 'service/java/com/android/server/wifi/WifiMonitor.java')
-rw-r--r-- | service/java/com/android/server/wifi/WifiMonitor.java | 56 |
1 files changed, 33 insertions, 23 deletions
diff --git a/service/java/com/android/server/wifi/WifiMonitor.java b/service/java/com/android/server/wifi/WifiMonitor.java index c44c7c6eb..cd1e6405e 100644 --- a/service/java/com/android/server/wifi/WifiMonitor.java +++ b/service/java/com/android/server/wifi/WifiMonitor.java @@ -29,6 +29,7 @@ import android.net.wifi.p2p.nsd.WifiP2pServiceResponse; import android.os.Handler; import android.os.Message; import android.text.TextUtils; +import android.util.ArraySet; import android.util.Base64; import android.util.LocalLog; import android.util.Log; @@ -46,6 +47,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -545,24 +547,20 @@ public class WifiMonitor { private boolean mConnected = false; - private final Map<String, SparseArray<Handler>> mHandlerMap = new HashMap<>(); + // TODO(b/27569474) remove support for multiple handlers for the same event + private final Map<String, SparseArray<Set<Handler>>> mHandlerMap = new HashMap<>(); public synchronized void registerHandler(String iface, int what, Handler handler) { - SparseArray<Handler> ifaceHandlers = mHandlerMap.get(iface); + SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface); if (ifaceHandlers == null) { ifaceHandlers = new SparseArray<>(); mHandlerMap.put(iface, ifaceHandlers); } - if (ifaceHandlers.get(what) != null) { - Log.w(TAG, "Handler for iface=" + iface + ",what=" + what + " already exists"); - } - ifaceHandlers.put(what, handler); - } - - public synchronized void unregisterHandler(String iface, int what) { - SparseArray<Handler> ifaceHandlers = mHandlerMap.get(iface); - if (ifaceHandlers != null) { - ifaceHandlers.remove(what); + Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(what); + if (ifaceWhatHandlers == null) { + ifaceWhatHandlers = new ArraySet<>(); + ifaceHandlers.put(what, ifaceWhatHandlers); } + ifaceWhatHandlers.add(handler); } private final Map<String, Boolean> mMonitoringMap = new HashMap<>(); @@ -678,32 +676,44 @@ public class WifiMonitor { } private void sendMessage(String iface, Message message) { - SparseArray<Handler> ifaceHandlers = mHandlerMap.get(iface); + SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface); if (iface != null && ifaceHandlers != null) { if (isMonitoring(iface)) { - sendMessage(ifaceHandlers, message); + boolean firstHandler = true; + Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(message.what); + for (Handler handler : ifaceWhatHandlers) { + if (firstHandler) { + firstHandler = false; + sendMessage(handler, message); + } + else { + sendMessage(handler, Message.obtain(message)); + } + } } else { if (DBG) Log.d(TAG, "Dropping event because (" + iface + ") is stopped"); } } else { if (DBG) Log.d(TAG, "Sending to all monitors because there's no matching iface"); boolean firstHandler = true; - for (Map.Entry<String, SparseArray<Handler>> entry : mHandlerMap.entrySet()) { + for (Map.Entry<String, SparseArray<Set<Handler>>> entry : mHandlerMap.entrySet()) { if (isMonitoring(entry.getKey())) { - if (firstHandler) { - firstHandler = false; - sendMessage(entry.getValue(), message); - } - else { - sendMessage(entry.getValue(), Message.obtain(message)); + Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(message.what); + for (Handler handler : ifaceWhatHandlers) { + if (firstHandler) { + firstHandler = false; + sendMessage(handler, message); + } + else { + sendMessage(handler, Message.obtain(message)); + } } } } } } - private void sendMessage(SparseArray<Handler> ifaceHandlers, Message message) { - Handler handler = ifaceHandlers.get(message.what); + private void sendMessage(Handler handler, Message message) { if (handler != null) { message.setTarget(handler); message.sendToTarget(); |