diff options
author | lesl <lesl@google.com> | 2021-03-18 23:18:11 +0800 |
---|---|---|
committer | Les Lee <lesl@google.com> | 2021-03-23 02:58:49 +0000 |
commit | 3580e764208186e1d05e195a1b7e8797ed94ee6b (patch) | |
tree | 45613dafddc359608f77151384e81ff8637dde69 /wifi | |
parent | 2c946706faf3159b93f8f3abbf4114e73c7e8235 (diff) |
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
Diffstat (limited to 'wifi')
-rw-r--r-- | wifi/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java | 88 | ||||
-rw-r--r-- | wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java | 30 |
2 files changed, 118 insertions, 0 deletions
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<String, IClientInterface> mClientInterfaces = new HashMap<>(); private HashMap<String, IApInterface> mApInterfaces = new HashMap<>(); private HashMap<String, IWifiScannerImpl> mWificondScanners = new HashMap<>(); @@ -114,6 +115,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). */ public interface ScanEventCallback { @@ -147,6 +160,46 @@ public class WifiNl80211Manager { void onPnoRequestFailed(); } + /** @hide */ + @VisibleForTesting + public class WificondEventHandler extends IWificondEventCallback.Stub { + private Map<CountryCodeChangeListener, Executor> 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. @@ -1174,6 +1234,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 * the interface is deleted using {@link #tearDownSoftApInterface(String)} (no deregistration diff --git a/wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java b/wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java index 4b03a49e40bb..98a0042a7096 100644 --- a/wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java +++ b/wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -97,14 +98,20 @@ public class WifiNl80211ManagerTest { @Mock private WifiNl80211Manager.PnoScanRequestCallback mPnoScanRequestCallback; @Mock + private WifiNl80211Manager.CountryCodeChangeListener mCountryCodeChangeListener; + @Mock + private WifiNl80211Manager.CountryCodeChangeListener mCountryCodeChangeListener2; + @Mock private Context mContext; private TestLooper mLooper; private TestAlarmManager mTestAlarmManager; private AlarmManager mAlarmManager; private WifiNl80211Manager mWificondControl; + private WifiNl80211Manager.WificondEventHandler mWificondEventHandler; private static final String TEST_INTERFACE_NAME = "test_wlan_if"; private static final String TEST_INTERFACE_NAME1 = "test_wlan_if1"; private static final String TEST_INVALID_INTERFACE_NAME = "asdf"; + private static final String TEST_COUNTRY_CODE = "US"; private static final byte[] TEST_SSID = new byte[]{'G', 'o', 'o', 'g', 'l', 'e', 'G', 'u', 'e', 's', 't'}; private static final byte[] TEST_PSK = @@ -182,6 +189,7 @@ public class WifiNl80211ManagerTest { when(mClientInterface.getWifiScannerImpl()).thenReturn(mWifiScannerImpl); when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME); mWificondControl = new WifiNl80211Manager(mContext, mWificond); + mWificondEventHandler = mWificondControl.getWificondEventHandler(); assertEquals(true, mWificondControl.setupInterfaceForClientMode(TEST_INTERFACE_NAME, Runnable::run, mNormalScanCallback, mPnoScanCallback)); @@ -760,6 +768,28 @@ public class WifiNl80211ManagerTest { } /** + * Ensures callback works after register CountryCodeChangeListener. + */ + @Test + public void testCountryCodeChangeListenerInvocation() throws Exception { + assertTrue(mWificondControl.registerCountryCodeChangeListener( + Runnable::run, mCountryCodeChangeListener)); + assertTrue(mWificondControl.registerCountryCodeChangeListener( + Runnable::run, mCountryCodeChangeListener2)); + + mWificondEventHandler.OnRegDomainChanged(TEST_COUNTRY_CODE); + verify(mCountryCodeChangeListener).onChanged(TEST_COUNTRY_CODE); + verify(mCountryCodeChangeListener2).onChanged(TEST_COUNTRY_CODE); + + reset(mCountryCodeChangeListener); + reset(mCountryCodeChangeListener2); + mWificondControl.unregisterCountryCodeChangeListener(mCountryCodeChangeListener2); + mWificondEventHandler.OnRegDomainChanged(TEST_COUNTRY_CODE); + verify(mCountryCodeChangeListener).onChanged(TEST_COUNTRY_CODE); + verify(mCountryCodeChangeListener2, never()).onChanged(TEST_COUNTRY_CODE); + } + + /** * Verifies registration and invocation of wificond death handler. */ @Test |