summaryrefslogtreecommitdiff
path: root/wifi/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'wifi/java/src')
-rw-r--r--wifi/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java88
1 files changed, 88 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 1685d99b1c92..1a44fdb5d48b 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;
@@ -563,6 +622,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.
@@ -1163,6 +1223,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