diff options
author | Rebecca Silberstein <silberst@google.com> | 2018-04-04 00:09:59 -0700 |
---|---|---|
committer | Rebecca Silberstein <silberst@google.com> | 2018-04-18 09:17:43 -0700 |
commit | a7798d5d92a8a324ba8e70148a2601547a138d2e (patch) | |
tree | d53e84f2c349de59d12c858371ee418a3ceca830 /service | |
parent | 82961d68a1c8c87475d40213f9e4dd4060ceea7f (diff) |
ActiveModeManager: add default scan available bcast
Add a default implementation to send the ScanAvailable
broadcast for mode implementations to use - in particular, when they are
entering a mode. This allows modes to signal the proper state to
WifiScanningService without adding ref counting that would complicate
the ScanningService impl when only one STA interface is available. At
the point multiple STA interfaces can be running in parallel, this will
need to be changed.
Note: the scan available update in WSMP for softap mode will be removed
when softap is independent of the other modes.
Bug: 76168955
Test: frameworks/opt/net/wifi/tests/wifitests/runtests.sh
Test: manually verified WifiScanner state when toggling wifi, location
and softap
Test: wifi integration tests
Change-Id: Ie6857478aa1082e3b9886a2497916225a56296c2
Diffstat (limited to 'service')
5 files changed, 41 insertions, 22 deletions
diff --git a/service/java/com/android/server/wifi/ActiveModeManager.java b/service/java/com/android/server/wifi/ActiveModeManager.java index 00ae7b3c2..6669e32f7 100644 --- a/service/java/com/android/server/wifi/ActiveModeManager.java +++ b/service/java/com/android/server/wifi/ActiveModeManager.java @@ -16,6 +16,12 @@ package com.android.server.wifi; +import android.content.Context; +import android.content.Intent; +import android.net.wifi.WifiManager; +import android.os.UserHandle; +import android.util.Log; + /** * Base class for available WiFi operating modes. * @@ -33,4 +39,22 @@ public interface ActiveModeManager { * Method used to stop the Manager for a give Wifi operational mode. */ void stop(); + + /** + * 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/ScanOnlyModeManager.java b/service/java/com/android/server/wifi/ScanOnlyModeManager.java index 3e7f96b1b..0ad662848 100644 --- a/service/java/com/android/server/wifi/ScanOnlyModeManager.java +++ b/service/java/com/android/server/wifi/ScanOnlyModeManager.java @@ -18,11 +18,9 @@ package com.android.server.wifi; import android.annotation.NonNull; import android.content.Context; -import android.content.Intent; import android.net.wifi.WifiManager; import android.os.Looper; import android.os.Message; -import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; @@ -161,10 +159,12 @@ public class ScanOnlyModeManager implements ActiveModeManager { mWifiNativeInterfaceCallback); if (TextUtils.isEmpty(mClientInterfaceName)) { Log.e(TAG, "Failed to create ClientInterface. Sit in Idle"); - sendScanAvailableBroadcast(false); updateWifiState(WifiManager.WIFI_STATE_UNKNOWN); break; } + // we have a new scanning interface, make sure scanner knows we aren't + // ready yet + sendScanAvailableBroadcast(false); transitionTo(mStartedState); break; default: @@ -240,23 +240,13 @@ public class ScanOnlyModeManager implements ActiveModeManager { mWakeupController.stop(); mWifiNative.teardownInterface(mClientInterfaceName); mClientInterfaceName = null; - // let WifiScanner know that wifi is down. - sendScanAvailableBroadcast(false); updateWifiState(WifiManager.WIFI_STATE_DISABLED); mScanRequestProxy.clearScanResults(); } } + } - 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); - } + private void sendScanAvailableBroadcast(boolean available) { + sendScanAvailableBroadcast(mContext, available); } } diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java index 82f7d6cb2..6f620c286 100644 --- a/service/java/com/android/server/wifi/WifiInjector.java +++ b/service/java/com/android/server/wifi/WifiInjector.java @@ -257,7 +257,7 @@ public class WifiInjector { this, mBackupManagerProxy, mCountryCode, mWifiNative, new WrongPasswordNotifier(mContext, mFrameworkFacade)); IBinder b = mFrameworkFacade.getService(Context.NETWORKMANAGEMENT_SERVICE); - mWifiStateMachinePrime = new WifiStateMachinePrime(this, wifiStateMachineLooper, + mWifiStateMachinePrime = new WifiStateMachinePrime(this, mContext, wifiStateMachineLooper, mWifiNative, new DefaultModeManager(mContext, wifiStateMachineLooper), mBatteryStats); mOpenNetworkNotifier = new OpenNetworkNotifier(mContext, diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index ac4b2efbd..c04ea192b 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -978,11 +978,6 @@ public class WifiStateMachine extends StateMachine { // We update this field when we receive broadcasts from the system. handleScreenStateChanged(powerManager.isInteractive()); - final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_DISABLED); - mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - sendWifiScanAvailable(false); } @@ -3861,6 +3856,8 @@ public class WifiStateMachine extends StateMachine { transitionTo(mDefaultState); return; } + // we have a new interface, but are not ready for scan requests, let scanner know + sendWifiScanAvailable(false); mIpClient = mFacade.makeIpClient(mContext, mInterfaceName, new IpClientCallback()); mIpClient.setMulticastFilter(true); diff --git a/service/java/com/android/server/wifi/WifiStateMachinePrime.java b/service/java/com/android/server/wifi/WifiStateMachinePrime.java index 023554394..1da2176b0 100644 --- a/service/java/com/android/server/wifi/WifiStateMachinePrime.java +++ b/service/java/com/android/server/wifi/WifiStateMachinePrime.java @@ -17,6 +17,7 @@ package com.android.server.wifi; import android.annotation.NonNull; +import android.content.Context; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.BatteryStats; @@ -53,6 +54,7 @@ public class WifiStateMachinePrime { private DefaultModeManager mDefaultModeManager; private final WifiInjector mWifiInjector; + private final Context mContext; private final Looper mLooper; private final WifiNative mWifiNative; private final IBatteryStats mBatteryStats; @@ -125,11 +127,13 @@ public class WifiStateMachinePrime { } WifiStateMachinePrime(WifiInjector wifiInjector, + Context context, Looper looper, WifiNative wifiNative, DefaultModeManager defaultModeManager, IBatteryStats batteryStats) { mWifiInjector = wifiInjector; + mContext = context; mLooper = looper; mWifiNative = wifiNative; mActiveModeManagers = new ArraySet(); @@ -279,6 +283,7 @@ public class WifiStateMachinePrime { Log.d(TAG, "Entering WifiDisabledState"); // make sure everything is torn down - remove when client mode is moved here cleanup(); + mDefaultModeManager.sendScanAvailableBroadcast(mContext, false); } @Override @@ -446,6 +451,9 @@ public class WifiStateMachinePrime { // make sure everything is torn down - remove when client mode is moved here cleanup(); + // until softap mode is freed, make sure wifi scanner is disabled + mDefaultModeManager.sendScanAvailableBroadcast(mContext, false); + SoftApModeConfiguration softApModeConfig = mApConfigQueue.poll(); WifiConfiguration config = softApModeConfig.getWifiConfiguration(); // TODO (b/67601382): add checks for valid softap configs |