summaryrefslogtreecommitdiff
path: root/wifi
diff options
context:
space:
mode:
authorlesl <lesl@google.com>2021-03-18 23:18:11 +0800
committerLes Lee <lesl@google.com>2021-03-23 02:58:49 +0000
commit3580e764208186e1d05e195a1b7e8797ed94ee6b (patch)
tree45613dafddc359608f77151384e81ff8637dde69 /wifi
parent2c946706faf3159b93f8f3abbf4114e73c7e8235 (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.java88
-rw-r--r--wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java30
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