From 54a540c04ace6b3f9c02adb3517f44970538eb15 Mon Sep 17 00:00:00 2001 From: Rebecca Silberstein Date: Wed, 26 Apr 2017 22:02:30 -0700 Subject: [PATCH] WifiManager: add LocalOnlyHotspotObserverProxy Add the proxy for LOHS observer callbacks to make sure we give updates to calling apps on the correct thread. This will be used in a follow-on CL. Bug: 36704763 Test: mmma -j64 frameworks/base/ Change-Id: I20faa73325116426f45d9d8fabc45b279bd5a286 --- wifi/java/android/net/wifi/WifiManager.java | 69 +++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index f806f1c74850..6f1324e95305 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -2436,6 +2436,75 @@ public class WifiManager { public void onStopped() {}; } + /** + * Callback proxy for LocalOnlyHotspotObserver objects. + */ + private static class LocalOnlyHotspotObserverProxy { + private final Handler mHandler; + private final WeakReference mWifiManager; + private final Looper mLooper; + private final Messenger mMessenger; + + /** + * Constructs a {@link LocalOnlyHotspotObserverProxy} using the specified looper. + * All callbacks will be delivered on the thread of the specified looper. + * + * @param manager WifiManager + * @param looper Looper for delivering callbacks + * @param observer LocalOnlyHotspotObserver to notify the calling application. + */ + LocalOnlyHotspotObserverProxy(WifiManager manager, Looper looper, + final LocalOnlyHotspotObserver observer) { + mWifiManager = new WeakReference<>(manager); + mLooper = looper; + + mHandler = new Handler(looper) { + @Override + public void handleMessage(Message msg) { + Log.d(TAG, "LocalOnlyHotspotObserverProxy: handle message what: " + + msg.what + " msg: " + msg); + + WifiManager manager = mWifiManager.get(); + if (manager == null) { + Log.w(TAG, "LocalOnlyHotspotObserverProxy: handle message post GC"); + return; + } + + switch (msg.what) { + case HOTSPOT_OBSERVER_REGISTERED: + observer.onRegistered(manager.new LocalOnlyHotspotSubscription()); + break; + case HOTSPOT_STARTED: + WifiConfiguration config = (WifiConfiguration) msg.obj; + if (config == null) { + Log.e(TAG, "LocalOnlyHotspotObserverProxy: config cannot be null."); + return; + } + observer.onStarted(config); + break; + case HOTSPOT_STOPPED: + observer.onStopped(); + break; + default: + Log.e(TAG, "LocalOnlyHotspotObserverProxy unhandled message. type: " + + msg.what); + } + } + }; + mMessenger = new Messenger(mHandler); + } + + public Messenger getMessenger() { + return mMessenger; + } + + public void registered() throws RemoteException { + Message msg = Message.obtain(); + msg.what = HOTSPOT_OBSERVER_REGISTERED; + mMessenger.send(msg); + } + } + // Ensure that multiple ServiceHandler threads do not interleave message dispatch. private static final Object sServiceHandlerDispatchLock = new Object(); -- 2.11.0