diff options
author | Roshan Pius <rpius@google.com> | 2018-10-09 10:04:11 -0700 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2018-11-01 10:48:57 -0700 |
commit | aed69f8dabc5a719c9dbc5c5f52774e573315b4a (patch) | |
tree | adc05ac9691edcda2b71d9ace1e21e558e363e05 /service | |
parent | bab935ebc5468b35721e213c5a25199d67ccf82d (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')
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); + }); + } } |