diff options
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 |