From 3580e764208186e1d05e195a1b7e8797ed94ee6b Mon Sep 17 00:00:00 2001 From: lesl Date: Thu, 18 Mar 2021 23:18:11 +0800 Subject: wifi: Add Country code event listener support 1. Register WificondEventCallback when wificond init. The event callback can be used for any generic NL80211 event, like country code. 2. Create countryCodeListener for framework WifiCountryCode. Setup listener into WificondEventCallback to get country code changed event. Bug: 177630837 CTS-Coverage-Bug: 177630837 Test: atest -c FrameworksWifiNonUpdatableApiTests Test: Manual Test, country code change can pass to framework. Change-Id: I8c250122415aafc5b8e4f87409b8ebfcf2e795e9 --- .../net/wifi/nl80211/WifiNl80211Manager.java | 88 ++++++++++++++++++++++ 1 file changed, 88 insertions(+) (limited to 'wifi/java') diff --git a/wifi/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java b/wifi/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java index c64f4bc605f1..da0571ba88e1 100644 --- a/wifi/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java +++ b/wifi/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java @@ -101,6 +101,7 @@ public class WifiNl80211Manager { // Cached wificond binder handlers. private IWificond mWificond; + private WificondEventHandler mWificondEventHandler = new WificondEventHandler(); private HashMap mClientInterfaces = new HashMap<>(); private HashMap mApInterfaces = new HashMap<>(); private HashMap mWificondScanners = new HashMap<>(); @@ -113,6 +114,18 @@ public class WifiNl80211Manager { */ private AtomicBoolean mSendMgmtFrameInProgress = new AtomicBoolean(false); + /** + * Interface used to listen country code event + */ + public interface CountryCodeChangeListener { + /** + * Called when country code changed. + * + * @param countryCode A new country code which is 2-Character alphanumeric. + */ + void onChanged(@NonNull String countryCode); + } + /** * Interface used when waiting for scans to be completed (with results). */ @@ -147,6 +160,46 @@ public class WifiNl80211Manager { void onPnoRequestFailed(); } + /** @hide */ + @VisibleForTesting + public class WificondEventHandler extends IWificondEventCallback.Stub { + private Map mCountryCodeChangeListenerHolder = + new HashMap<>(); + + /** + * Register CountryCodeChangeListener with pid. + * + * @param executor The Executor on which to execute the callbacks. + * @param listener listener for country code changed events. + */ + public void registerCountryCodeChangeListener(Executor executor, + CountryCodeChangeListener listener) { + mCountryCodeChangeListenerHolder.put(listener, executor); + } + + /** + * Unregister CountryCodeChangeListener with pid. + * + * @param listener listener which registered country code changed events. + */ + public void unregisterCountryCodeChangeListener(CountryCodeChangeListener listener) { + mCountryCodeChangeListenerHolder.remove(listener); + } + + @Override + public void OnRegDomainChanged(String countryCode) { + Log.d(TAG, "OnRegDomainChanged " + countryCode); + final long token = Binder.clearCallingIdentity(); + try { + mCountryCodeChangeListenerHolder.forEach((listener, executor) -> { + executor.execute(() -> listener.onChanged(countryCode)); + }); + } finally { + Binder.restoreCallingIdentity(token); + } + } + } + private class ScanEventHandler extends IScanEvent.Stub { private Executor mExecutor; private ScanEventCallback mCallback; @@ -347,6 +400,12 @@ public class WifiNl80211Manager { mWificond = wificond; } + /** @hide */ + @VisibleForTesting + public WificondEventHandler getWificondEventHandler() { + return mWificondEventHandler; + } + private class PnoScanEventHandler extends IPnoScanEvent.Stub { private Executor mExecutor; private ScanEventCallback mCallback; @@ -574,6 +633,7 @@ public class WifiNl80211Manager { } try { mWificond.asBinder().linkToDeath(() -> binderDied(), 0); + mWificond.registerWificondEventCallback(mWificondEventHandler); } catch (RemoteException e) { Log.e(TAG, "Failed to register death notification for wificond"); // The remote has already died. @@ -1173,6 +1233,34 @@ public class WifiNl80211Manager { } } + /** + * Register the provided listener for country code event. + * + * @param executor The Executor on which to execute the callbacks. + * @param listener listener for country code changed events. + * @return true on success, false on failure. + */ + public boolean registerCountryCodeChangeListener(@NonNull @CallbackExecutor Executor executor, + @NonNull CountryCodeChangeListener listener) { + if (!retrieveWificondAndRegisterForDeath()) { + return false; + } + Log.d(TAG, "registerCountryCodeEventListener called"); + mWificondEventHandler.registerCountryCodeChangeListener(executor, listener); + return true; + } + + + /** + * Unregister CountryCodeChangeListener with pid. + * + * @param listener listener which registered country code changed events. + */ + public void unregisterCountryCodeChangeListener(@NonNull CountryCodeChangeListener listener) { + Log.d(TAG, "unregisterCountryCodeEventListener called"); + mWificondEventHandler.unregisterCountryCodeChangeListener(listener); + } + /** * Register the provided callback handler for SoftAp events. The interface must first be created * using {@link #setupInterfaceForSoftApMode(String)}. The callback registration is valid until -- cgit v1.2.3-59-g8ed1b