summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2018-10-09 10:04:11 -0700
committerRoshan Pius <rpius@google.com>2018-11-01 10:48:57 -0700
commitaed69f8dabc5a719c9dbc5c5f52774e573315b4a (patch)
treeadc05ac9691edcda2b71d9ace1e21e558e363e05 /service
parentbab935ebc5468b35721e213c5a25199d67ccf82d (diff)
WifiServiceImpl: Network request match callback registration
Implement the new network request match callback register/unregister methods to be used by settings UI. Note: This uses the same pattern used for other callbacks to settings like traffic state change, softap. Bug: 113878056 Test: Unit tests Change-Id: Ifb6d8c99418503114cf69a978c7d3e3eaca73614
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/ClientModeImpl.java17
-rw-r--r--service/java/com/android/server/wifi/WifiNetworkFactory.java65
-rw-r--r--service/java/com/android/server/wifi/WifiServiceImpl.java61
3 files changed, 142 insertions, 1 deletions
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index ce71f36db..838bc23b0 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -51,6 +51,7 @@ import android.net.StaticIpConfiguration;
import android.net.TrafficStats;
import android.net.dhcp.DhcpClient;
import android.net.ip.IpClient;
+import android.net.wifi.INetworkRequestMatchCallback;
import android.net.wifi.RssiPacketCountInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.SupplicantState;
@@ -5816,4 +5817,20 @@ public class ClientModeImpl extends StateMachine {
resultMsg.recycle();
return result;
}
+
+ /**
+ * Add a network request match callback to {@link WifiNetworkFactory}.
+ */
+ public void addNetworkRequestMatchCallback(IBinder binder,
+ INetworkRequestMatchCallback callback,
+ int callbackIdentifier) {
+ mNetworkFactory.addCallback(binder, callback, callbackIdentifier);
+ }
+
+ /**
+ * Remove a network request match callback from {@link WifiNetworkFactory}.
+ */
+ public void removeNetworkRequestMatchCallback(int callbackIdentifier) {
+ mNetworkFactory.removeCallback(callbackIdentifier);
+ }
}
diff --git a/service/java/com/android/server/wifi/WifiNetworkFactory.java b/service/java/com/android/server/wifi/WifiNetworkFactory.java
index 2e213fc33..20ac0ebc9 100644
--- a/service/java/com/android/server/wifi/WifiNetworkFactory.java
+++ b/service/java/com/android/server/wifi/WifiNetworkFactory.java
@@ -26,21 +26,27 @@ import android.net.NetworkCapabilities;
import android.net.NetworkFactory;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
+import android.net.wifi.INetworkRequestMatchCallback;
+import android.net.wifi.INetworkRequestUserSelectionCallback;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiNetworkSpecifier;
import android.net.wifi.WifiScanner;
import android.os.Handler;
+import android.os.IBinder;
import android.os.Looper;
+import android.os.RemoteException;
import android.os.WorkSource;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.wifi.util.ExternalCallbackTracker;
import com.android.server.wifi.util.WifiPermissionsUtil;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+
/**
* Network factory to handle trusted wifi network requests.
*/
@@ -62,6 +68,7 @@ public class WifiNetworkFactory extends NetworkFactory {
private final WifiScanner.ScanSettings mScanSettings;
private final NetworkFactoryScanListener mScanListener;
private final NetworkFactoryAlarmListener mPeriodicScanTimerListener;
+ private final ExternalCallbackTracker<INetworkRequestMatchCallback> mRegisteredCallbacks;
private int mGenericConnectionReqCount = 0;
private NetworkRequest mActiveSpecificNetworkRequest;
@@ -129,6 +136,32 @@ public class WifiNetworkFactory extends NetworkFactory {
}
}
+ // Callback result from settings UI.
+ private class NetworkFactoryUserSelectionCallback extends
+ INetworkRequestUserSelectionCallback.Stub {
+ @Override
+ public void select(WifiConfiguration wifiConfiguration) {
+ mHandler.post(() -> {
+ if (mActiveSpecificNetworkRequest == null) {
+ Log.e(TAG, "Stale callback select received");
+ return;
+ }
+ // TODO(b/113878056): Trigger network connection to |wificonfiguration|.
+ });
+ }
+
+ @Override
+ public void reject() {
+ mHandler.post(() -> {
+ if (mActiveSpecificNetworkRequest == null) {
+ Log.e(TAG, "Stale callback reject received");
+ return;
+ }
+ // TODO(b/113878056): Clear the active network request.
+ });
+ }
+ }
+
public WifiNetworkFactory(Looper looper, Context context, NetworkCapabilities nc,
ActivityManager activityManager, AlarmManager alarmManager,
Clock clock, WifiInjector wifiInjector,
@@ -150,6 +183,7 @@ public class WifiNetworkFactory extends NetworkFactory {
mScanSettings.reportEvents = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;
mScanListener = new NetworkFactoryScanListener();
mPeriodicScanTimerListener = new NetworkFactoryAlarmListener();
+ mRegisteredCallbacks = new ExternalCallbackTracker<INetworkRequestMatchCallback>(mHandler);
setScoreFilter(SCORE_FILTER);
}
@@ -162,6 +196,37 @@ public class WifiNetworkFactory extends NetworkFactory {
}
/**
+ * Add a new callback for network request match handling.
+ */
+ public void addCallback(IBinder binder, INetworkRequestMatchCallback callback,
+ int callbackIdentifier) {
+ if (!mRegisteredCallbacks.add(binder, callback, callbackIdentifier)) {
+ Log.e(TAG, "Failed to add callback");
+ return;
+ }
+ // Register our user selection callback immediately.
+ try {
+ callback.onUserSelectionCallbackRegistration(new NetworkFactoryUserSelectionCallback());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to invoke user selection registration callback " + callback, e);
+ }
+ if (mVerboseLoggingEnabled) {
+ Log.v(TAG, "Adding callback. Num callbacks: " + mRegisteredCallbacks.getNumCallbacks());
+ }
+ }
+
+ /**
+ * Remove an existing callback for network request match handling.
+ */
+ public void removeCallback(int callbackIdentifier) {
+ mRegisteredCallbacks.remove(callbackIdentifier);
+ if (mVerboseLoggingEnabled) {
+ Log.v(TAG, "Removing callback. Num callbacks: "
+ + mRegisteredCallbacks.getNumCallbacks());
+ }
+ }
+
+ /**
* Check whether to accept the new network connection request.
*
* All the validation of the incoming request is done in this method.
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 6206d9b15..4b1766d79 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -58,6 +58,7 @@ import android.net.Network;
import android.net.NetworkUtils;
import android.net.Uri;
import android.net.ip.IpClient;
+import android.net.wifi.INetworkRequestMatchCallback;
import android.net.wifi.ISoftApCallback;
import android.net.wifi.ITrafficStateCallback;
import android.net.wifi.IWifiManager;
@@ -75,6 +76,7 @@ import android.os.AsyncTask;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Bundle;
+import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
@@ -2822,7 +2824,7 @@ public class WifiServiceImpl extends IWifiManager.Stub {
/**
* see {@link android.net.wifi.WifiManager#registerTrafficStateCallback(
- * TrafficStateCallback, Handler)}
+ * WifiManager.TrafficStateCallback, Handler)}
*
* @param binder IBinder instance to allow cleanup if the app dies
* @param callback Traffic State callback to register
@@ -2890,4 +2892,61 @@ public class WifiServiceImpl extends IWifiManager.Stub {
private static boolean hasAutomotiveFeature(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
}
+
+ /**
+ * see {@link android.net.wifi.WifiManager#registerNetworkRequestMatchCallback(
+ * WifiManager.NetworkRequestMatchCallback, Handler)} (
+ *
+ * @param binder IBinder instance to allow cleanup if the app dies
+ * @param callback Network Request Match callback to register
+ * @param callbackIdentifier Unique ID of the registering callback. This ID will be used to
+ * unregister the callback.
+ * See {@link #unregisterNetworkRequestMatchCallback(int)} (int)}
+ *
+ * @throws SecurityException if the caller does not have permission to register a callback
+ * @throws RemoteException if remote exception happens
+ * @throws IllegalArgumentException if the arguments are null or invalid
+ */
+ @Override
+ public void registerNetworkRequestMatchCallback(IBinder binder,
+ INetworkRequestMatchCallback callback,
+ int callbackIdentifier) {
+ // verify arguments
+ if (binder == null) {
+ throw new IllegalArgumentException("Binder must not be null");
+ }
+ if (callback == null) {
+ throw new IllegalArgumentException("Callback must not be null");
+ }
+ enforceNetworkSettingsPermission();
+ if (mVerboseLoggingEnabled) {
+ mLog.info("registerNetworkRequestMatchCallback uid=%")
+ .c(Binder.getCallingUid()).flush();
+ }
+ // Post operation to handler thread
+ mClientHandler.post(() -> {
+ mClientModeImpl.addNetworkRequestMatchCallback(binder, callback, callbackIdentifier);
+ });
+ }
+
+ /**
+ * see {@link android.net.wifi.WifiManager#unregisterNetworkRequestMatchCallback(
+ * WifiManager.NetworkRequestMatchCallback)}
+ *
+ * @param callbackIdentifier Unique ID of the callback to be unregistered.
+ *
+ * @throws SecurityException if the caller does not have permission to register a callback
+ */
+ @Override
+ public void unregisterNetworkRequestMatchCallback(int callbackIdentifier) {
+ enforceNetworkSettingsPermission();
+ if (mVerboseLoggingEnabled) {
+ mLog.info("unregisterNetworkRequestMatchCallback uid=%")
+ .c(Binder.getCallingUid()).flush();
+ }
+ // Post operation to handler thread
+ mClientHandler.post(() -> {
+ mClientModeImpl.removeNetworkRequestMatchCallback(callbackIdentifier);
+ });
+ }
}