diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2018-07-24 01:08:31 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-07-24 01:08:31 +0000 |
commit | 5b5d0bd0a180b2100a241104f720cc3f7ce486f4 (patch) | |
tree | 353f75fb24e08ca267dd778c62591980de0df1e6 /service | |
parent | c463f5688296f22449b9c61090a6c01011e2388e (diff) | |
parent | 2a41eab4494b917886f3ab50d98905c7f384f354 (diff) |
Merge "WifiScanningService: Scanner enable/disable"
Diffstat (limited to 'service')
8 files changed, 110 insertions, 111 deletions
diff --git a/service/java/com/android/server/wifi/ActiveModeManager.java b/service/java/com/android/server/wifi/ActiveModeManager.java index 7427123c6..7c50726f9 100644 --- a/service/java/com/android/server/wifi/ActiveModeManager.java +++ b/service/java/com/android/server/wifi/ActiveModeManager.java @@ -17,11 +17,6 @@ package com.android.server.wifi; import android.annotation.IntDef; -import android.content.Context; -import android.content.Intent; -import android.net.wifi.WifiManager; -import android.os.UserHandle; -import android.util.Log; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -34,8 +29,6 @@ import java.lang.annotation.RetentionPolicy; * Currently supported modes include Client, ScanOnly and SoftAp. */ public interface ActiveModeManager { - String TAG = "ActiveModeManager"; - /** * Method used to start the Manager for a given Wifi operational mode. */ @@ -65,22 +58,4 @@ public interface ActiveModeManager { * Method to dump for logging state. */ void dump(FileDescriptor fd, PrintWriter pw, String[] args); - - /** - * Method that allows Mode Managers to update WifiScanner about the current state. - * - * @param context Context to use for the notification - * @param available boolean indicating if scanning is available - */ - default void sendScanAvailableBroadcast(Context context, boolean available) { - Log.d(TAG, "sending scan available broadcast: " + available); - final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - if (available) { - intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_ENABLED); - } else { - intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_DISABLED); - } - context.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - } } diff --git a/service/java/com/android/server/wifi/ActiveModeWarden.java b/service/java/com/android/server/wifi/ActiveModeWarden.java index 69959502e..06b0013d7 100644 --- a/service/java/com/android/server/wifi/ActiveModeWarden.java +++ b/service/java/com/android/server/wifi/ActiveModeWarden.java @@ -317,18 +317,45 @@ public class ActiveModeWarden { if (mManager != null) { mManager.stop(); mActiveModeManagers.remove(mManager); + updateScanMode(); } updateBatteryStatsWifiState(false); } + + // Hook to be used by sub-classes of ModeActiveState to indicate the completion of + // bringup of the corresponding mode. + public void onModeActivationComplete() { + updateScanMode(); + } + + // Update the scan state based on all active mode managers. + // Note: This is an overkill currently because there is only 1 of scan-only or client + // mode present today. + private void updateScanMode() { + boolean scanEnabled = false; + boolean scanningForHiddenNetworksEnabled = false; + for (ActiveModeManager modeManager : mActiveModeManagers) { + @ActiveModeManager.ScanMode int scanState = modeManager.getScanMode(); + switch (scanState) { + case ActiveModeManager.SCAN_NONE: + break; + case ActiveModeManager.SCAN_WITHOUT_HIDDEN_NETWORKS: + scanEnabled = true; + break; + case ActiveModeManager.SCAN_WITH_HIDDEN_NETWORKS: + scanEnabled = true; + scanningForHiddenNetworksEnabled = true; + break; + } + } + mScanRequestProxy.enableScanning(scanEnabled, scanningForHiddenNetworksEnabled); + } } class WifiDisabledState extends ModeActiveState { @Override public void enter() { Log.d(TAG, "Entering WifiDisabledState"); - mDefaultModeManager.sendScanAvailableBroadcast(mContext, false); - mScanRequestProxy.enableScanningForHiddenNetworks(false); - mScanRequestProxy.clearScanResults(); } @Override @@ -369,6 +396,7 @@ public class ActiveModeWarden { } else if (state == WifiManager.WIFI_STATE_ENABLED) { // client mode is ready to go Log.d(TAG, "client mode active"); + onModeActivationComplete(); } else { // only care if client mode stopped or started, dropping } @@ -452,6 +480,7 @@ public class ActiveModeWarden { } else if (state == WifiManager.WIFI_STATE_ENABLED) { // scan mode is ready to go Log.d(TAG, "scan mode active"); + onModeActivationComplete(); } else { Log.d(TAG, "unexpected state update: " + state); } diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java index ce4b7045c..23e3f4755 100644 --- a/service/java/com/android/server/wifi/ClientModeImpl.java +++ b/service/java/com/android/server/wifi/ClientModeImpl.java @@ -181,7 +181,6 @@ public class ClientModeImpl extends StateMachine { private WifiConnectivityManager mWifiConnectivityManager; private ConnectivityManager mCm; private BaseWifiDiagnostics mWifiDiagnostics; - private ScanRequestProxy mScanRequestProxy; private final boolean mP2pSupported; private final AtomicBoolean mP2pConnected = new AtomicBoolean(false); private boolean mTemporarilyDisconnectWifi = false; @@ -794,7 +793,6 @@ public class ClientModeImpl extends StateMachine { mWifiMonitor = mWifiInjector.getWifiMonitor(); mWifiDiagnostics = mWifiInjector.getWifiDiagnostics(); - mScanRequestProxy = mWifiInjector.getScanRequestProxy(); mWifiPermissionsWrapper = mWifiInjector.getWifiPermissionsWrapper(); mWifiDataStall = mWifiInjector.getWifiDataStall(); @@ -3875,7 +3873,6 @@ public class ClientModeImpl extends StateMachine { if (!mWifiNative.removeAllNetworks(mInterfaceName)) { loge("Failed to remove networks on entering connect mode"); } - mScanRequestProxy.enableScanningForHiddenNetworks(true); mWifiInfo.reset(); mWifiInfo.setSupplicantState(SupplicantState.DISCONNECTED); @@ -3914,9 +3911,6 @@ public class ClientModeImpl extends StateMachine { if (!mWifiNative.removeAllNetworks(mInterfaceName)) { loge("Failed to remove networks on exiting connect mode"); } - mScanRequestProxy.enableScanningForHiddenNetworks(false); - // Do we want to optimize when we move from client mode to scan only mode. - mScanRequestProxy.clearScanResults(); mWifiInfo.reset(); mWifiInfo.setSupplicantState(SupplicantState.DISCONNECTED); stopClientMode(); diff --git a/service/java/com/android/server/wifi/ClientModeManager.java b/service/java/com/android/server/wifi/ClientModeManager.java index 5f523ced7..883b16a61 100644 --- a/service/java/com/android/server/wifi/ClientModeManager.java +++ b/service/java/com/android/server/wifi/ClientModeManager.java @@ -47,7 +47,6 @@ public class ClientModeManager implements ActiveModeManager { private final WifiMetrics mWifiMetrics; private final Listener mListener; - private final ScanRequestProxy mScanRequestProxy; private final ClientModeImpl mClientModeImpl; private String mClientInterfaceName; @@ -56,13 +55,11 @@ public class ClientModeManager implements ActiveModeManager { private boolean mExpectedStop = false; ClientModeManager(Context context, @NonNull Looper looper, WifiNative wifiNative, - Listener listener, WifiMetrics wifiMetrics, ScanRequestProxy scanRequestProxy, - ClientModeImpl clientModeImpl) { + Listener listener, WifiMetrics wifiMetrics, ClientModeImpl clientModeImpl) { mContext = context; mWifiNative = wifiNative; mListener = listener; mWifiMetrics = wifiMetrics; - mScanRequestProxy = scanRequestProxy; mClientModeImpl = clientModeImpl; mStateMachine = new ClientModeStateMachine(looper); } @@ -238,9 +235,6 @@ public class ClientModeManager implements ActiveModeManager { WifiManager.WIFI_STATE_UNKNOWN); break; } - sendScanAvailableBroadcast(false); - mScanRequestProxy.enableScanningForHiddenNetworks(false); - mScanRequestProxy.clearScanResults(); transitionTo(mStartedState); break; default: @@ -260,9 +254,8 @@ public class ClientModeManager implements ActiveModeManager { mIfaceIsUp = isUp; if (isUp) { Log.d(TAG, "Wifi is ready to use for client mode"); - sendScanAvailableBroadcast(true); mClientModeImpl.setOperationalMode(ClientModeImpl.CONNECT_MODE, - mClientInterfaceName); + mClientInterfaceName); updateWifiState(WifiManager.WIFI_STATE_ENABLED, WifiManager.WIFI_STATE_ENABLING); } else { @@ -284,7 +277,6 @@ public class ClientModeManager implements ActiveModeManager { Log.d(TAG, "entering StartedState"); mIfaceIsUp = false; onUpChanged(mWifiNative.isInterfaceUp(mClientInterfaceName)); - mScanRequestProxy.enableScanningForHiddenNetworks(true); } @Override @@ -339,17 +331,5 @@ public class ClientModeManager implements ActiveModeManager { mStateMachine.quitNow(); } } - - private void sendScanAvailableBroadcast(boolean available) { - Log.d(TAG, "sending scan available broadcast: " + available); - final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - if (available) { - intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_ENABLED); - } else { - intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_DISABLED); - } - mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - } } } diff --git a/service/java/com/android/server/wifi/ScanOnlyModeManager.java b/service/java/com/android/server/wifi/ScanOnlyModeManager.java index 353de9859..c3547be5d 100644 --- a/service/java/com/android/server/wifi/ScanOnlyModeManager.java +++ b/service/java/com/android/server/wifi/ScanOnlyModeManager.java @@ -46,7 +46,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { private final WifiMetrics mWifiMetrics; private final Listener mListener; - private final ScanRequestProxy mScanRequestProxy; private final WakeupController mWakeupController; private final SarManager mSarManager; @@ -58,14 +57,12 @@ public class ScanOnlyModeManager implements ActiveModeManager { ScanOnlyModeManager(@NonNull Context context, @NonNull Looper looper, @NonNull WifiNative wifiNative, @NonNull Listener listener, @NonNull WifiMetrics wifiMetrics, - @NonNull ScanRequestProxy scanRequestProxy, @NonNull WakeupController wakeupController, @NonNull SarManager sarManager) { mContext = context; mWifiNative = wifiNative; mListener = listener; mWifiMetrics = wifiMetrics; - mScanRequestProxy = scanRequestProxy; mWakeupController = wakeupController; mSarManager = sarManager; mStateMachine = new ScanOnlyModeStateMachine(looper); @@ -205,14 +202,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { updateWifiState(WifiManager.WIFI_STATE_UNKNOWN); break; } - // we have a new scanning interface, make sure scanner knows we aren't - // ready yet and clear out the ScanRequestProxy - sendScanAvailableBroadcast(false); - // explicitly disable scanning for hidden networks in case we were - // previously in client mode - mScanRequestProxy.enableScanningForHiddenNetworks(false); - mScanRequestProxy.clearScanResults(); - transitionTo(mStartedState); break; default: @@ -233,7 +222,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { if (isUp) { Log.d(TAG, "Wifi is ready to use for scanning"); mWakeupController.start(); - sendScanAvailableBroadcast(true); updateWifiState(WifiManager.WIFI_STATE_ENABLED); } else { // if the interface goes down we should exit and go back to idle state. @@ -245,7 +233,6 @@ public class ScanOnlyModeManager implements ActiveModeManager { @Override public void enter() { Log.d(TAG, "entering StartedState"); - mScanRequestProxy.enableScanningForHiddenNetworks(false); mIfaceIsUp = false; onUpChanged(mWifiNative.isInterfaceUp(mClientInterfaceName)); @@ -296,8 +283,4 @@ public class ScanOnlyModeManager implements ActiveModeManager { } } } - - private void sendScanAvailableBroadcast(boolean available) { - sendScanAvailableBroadcast(mContext, available); - } } diff --git a/service/java/com/android/server/wifi/ScanRequestProxy.java b/service/java/com/android/server/wifi/ScanRequestProxy.java index da2fd3e46..900d85095 100644 --- a/service/java/com/android/server/wifi/ScanRequestProxy.java +++ b/service/java/com/android/server/wifi/ScanRequestProxy.java @@ -47,6 +47,7 @@ import javax.annotation.concurrent.NotThreadSafe; * {@link WifiManager#startScan()}. * * This class is responsible for: + * a) Enable/Disable scanning based on the request from {@link ActiveModeWarden}. * a) Forwarding scan requests from {@link WifiManager#startScan()} to * {@link WifiScanner#startScan(WifiScanner.ScanSettings, WifiScanner.ScanListener)}. * Will essentially proxy scan requests from WifiService to WifiScanningService. @@ -85,6 +86,8 @@ public class ScanRequestProxy { // Verbose logging flag. private boolean mVerboseLoggingEnabled = false; + // Flag to decide if we need to scan or not. + private boolean mScanningEnabled = false; // Flag to decide if we need to scan for hidden networks or not. private boolean mScanningForHiddenNetworksEnabled = false; // Flag to indicate that we're waiting for scan results from an existing request. @@ -168,17 +171,6 @@ public class ScanRequestProxy { } /** - * Enable/disable scanning for hidden networks. - * @param enable true to enable, false to disable. - */ - public void enableScanningForHiddenNetworks(boolean enable) { - if (mVerboseLoggingEnabled) { - Log.d(TAG, "Scanning for hidden networks is " + (enable ? "enabled" : "disabled")); - } - mScanningForHiddenNetworksEnabled = enable; - } - - /** * Helper method to populate WifiScanner handle. This is done lazily because * WifiScanningService is started after WifiService. */ @@ -190,6 +182,54 @@ public class ScanRequestProxy { } /** + * Method that lets public apps know that scans are available. + * + * @param context Context to use for the notification + * @param available boolean indicating if scanning is available + */ + private void sendScanAvailableBroadcast(Context context, boolean available) { + Log.d(TAG, "Sending scan available broadcast: " + available); + final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + if (available) { + intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_ENABLED); + } else { + intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_DISABLED); + } + context.sendStickyBroadcastAsUser(intent, UserHandle.ALL); + } + + private void enableScanningInternal(boolean enable) { + if (!retrieveWifiScannerIfNecessary()) { + Log.e(TAG, "Failed to retrieve wifiscanner"); + return; + } + mWifiScanner.setScanningEnabled(enable); + sendScanAvailableBroadcast(mContext, enable); + clearScanResults(); + Log.i(TAG, "Scanning is " + (enable ? "enabled" : "disabled")); + } + + /** + * Enable/disable scanning. + * + * @param enable true to enable, false to disable. + * @param enableScanningForHiddenNetworks true to enable scanning for hidden networks, + * false to disable. + */ + public void enableScanning(boolean enable, boolean enableScanningForHiddenNetworks) { + if (enable) { + enableScanningInternal(true); + mScanningForHiddenNetworksEnabled = enableScanningForHiddenNetworks; + Log.i(TAG, "Scanning for hidden networks is " + + (enableScanningForHiddenNetworks ? "enabled" : "disabled")); + } else { + enableScanningInternal(false); + } + mScanningEnabled = enable; + } + + /** * Helper method to send the scan request status broadcast, if there is a scan ongoing. */ private void sendScanResultBroadcastIfScanProcessingNotComplete(boolean scanSucceeded) { @@ -406,7 +446,7 @@ public class ScanRequestProxy { /** * Clear the stored scan results. */ - public void clearScanResults() { + private void clearScanResults() { mLastScanResults.clear(); mLastScanTimestampForBgApps = 0; mLastScanTimestampsForFgApps.clear(); diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java index 7a60104a9..fb8d9eb41 100644 --- a/service/java/com/android/server/wifi/WifiInjector.java +++ b/service/java/com/android/server/wifi/WifiInjector.java @@ -485,7 +485,7 @@ public class WifiInjector { public ScanOnlyModeManager makeScanOnlyModeManager( @NonNull ScanOnlyModeManager.Listener listener) { return new ScanOnlyModeManager(mContext, mWifiCoreHandlerThread.getLooper(), - mWifiNative, listener, mWifiMetrics, mScanRequestProxy, mWakeupController, + mWifiNative, listener, mWifiMetrics, mWakeupController, mSarManager); } @@ -497,7 +497,7 @@ public class WifiInjector { */ public ClientModeManager makeClientModeManager(ClientModeManager.Listener listener) { return new ClientModeManager(mContext, mWifiCoreHandlerThread.getLooper(), - mWifiNative, listener, mWifiMetrics, mScanRequestProxy, mClientModeImpl); + mWifiNative, listener, mWifiMetrics, mClientModeImpl); } /** diff --git a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java index d2c4d5af8..4b89c327b 100644 --- a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java +++ b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java @@ -21,13 +21,9 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import android.Manifest; import android.app.AlarmManager; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.net.wifi.IWifiScanner; import android.net.wifi.ScanResult; -import android.net.wifi.WifiManager; import android.net.wifi.WifiScanner; import android.net.wifi.WifiScanner.ChannelSpec; import android.net.wifi.WifiScanner.PnoSettings; @@ -130,6 +126,13 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { "LocationHardware"); } + private void enforceNetworkStack(int uid) { + mContext.enforcePermission( + Manifest.permission.NETWORK_STACK, + UNKNOWN_PID, uid, + "NetworkStack"); + } + private class ClientHandler extends WifiHandler { ClientHandler(String tag, Looper looper) { @@ -185,7 +188,11 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { } try { - enforceLocationHardwarePermission(msg.sendingUid); + if (msg.what == WifiScanner.CMD_ENABLE || msg.what == WifiScanner.CMD_DISABLE) { + enforceNetworkStack(msg.sendingUid); + } else { + enforceLocationHardwarePermission(msg.sendingUid); + } } catch (SecurityException e) { localLog("failed to authorize app: " + e); replyFailed(msg, WifiScanner.REASON_NOT_AUTHORIZED, "Not authorized"); @@ -213,6 +220,16 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { } switch (msg.what) { + case WifiScanner.CMD_ENABLE: + mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_LOADED); + mSingleScanStateMachine.sendMessage(CMD_DRIVER_LOADED); + mPnoScanStateMachine.sendMessage(CMD_DRIVER_LOADED); + break; + case WifiScanner.CMD_DISABLE: + mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED); + mSingleScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED); + mPnoScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED); + break; case WifiScanner.CMD_START_BACKGROUND_SCAN: case WifiScanner.CMD_STOP_BACKGROUND_SCAN: mBackgroundScanStateMachine.sendMessage(Message.obtain(msg)); @@ -295,25 +312,6 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { mSingleScanStateMachine = new WifiSingleScanStateMachine(mLooper); mPnoScanStateMachine = new WifiPnoScanStateMachine(mLooper); - mContext.registerReceiver( - new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - int state = intent.getIntExtra( - WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_DISABLED); - if (DBG) localLog("SCAN_AVAILABLE : " + state); - if (state == WifiManager.WIFI_STATE_ENABLED) { - mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_LOADED); - mSingleScanStateMachine.sendMessage(CMD_DRIVER_LOADED); - mPnoScanStateMachine.sendMessage(CMD_DRIVER_LOADED); - } else if (state == WifiManager.WIFI_STATE_DISABLED) { - mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED); - mSingleScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED); - mPnoScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED); - } - } - }, new IntentFilter(WifiManager.WIFI_SCAN_AVAILABLE)); - mBackgroundScanStateMachine.start(); mSingleScanStateMachine.start(); mPnoScanStateMachine.start(); |