diff options
Diffstat (limited to 'service')
4 files changed, 76 insertions, 3 deletions
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java index a4eb8eaf1..42fa19155 100644 --- a/service/java/com/android/server/wifi/ClientModeImpl.java +++ b/service/java/com/android/server/wifi/ClientModeImpl.java @@ -2792,6 +2792,12 @@ public class ClientModeImpl extends StateMachine { + " - " + Thread.currentThread().getStackTrace()[5].getMethodName()); } + WifiConfiguration wifiConfig = getCurrentWifiConfiguration(); + if (wifiConfig != null) { + ScanResultMatchInfo matchInfo = ScanResultMatchInfo.fromWifiConfiguration(wifiConfig); + mWifiInjector.getWakeupController().setLastDisconnectInfo(matchInfo); + } + stopRssiMonitoringOffload(); clearTargetBssid("handleNetworkDisconnect"); diff --git a/service/java/com/android/server/wifi/WakeupController.java b/service/java/com/android/server/wifi/WakeupController.java index c911e96eb..5c81a3bb0 100644 --- a/service/java/com/android/server/wifi/WakeupController.java +++ b/service/java/com/android/server/wifi/WakeupController.java @@ -62,6 +62,7 @@ public class WakeupController { private final WifiInjector mWifiInjector; private final WakeupConfigStoreData mWakeupConfigStoreData; private final WifiWakeMetrics mWifiWakeMetrics; + private final Clock mClock; private final WifiScanner.ScanListener mScanListener = new WifiScanner.ScanListener() { @Override @@ -104,6 +105,20 @@ public class WakeupController { /** Whether Wifi verbose logging is enabled. */ private boolean mVerboseLoggingEnabled; + /** + * The timestamp of when the Wifi network was last disconnected (either device disconnected + * from the network or Wifi was turned off entirely). + * Note: mLastDisconnectTimestampMillis and mLastDisconnectInfo must always be updated together. + */ + private long mLastDisconnectTimestampMillis; + + /** + * The SSID of the last Wifi network the device was connected to (either device disconnected + * from the network or Wifi was turned off entirely). + * Note: mLastDisconnectTimestampMillis and mLastDisconnectInfo must always be updated together. + */ + private ScanResultMatchInfo mLastDisconnectInfo; + public WakeupController( Context context, Looper looper, @@ -114,7 +129,8 @@ public class WakeupController { WifiConfigStore wifiConfigStore, WifiWakeMetrics wifiWakeMetrics, WifiInjector wifiInjector, - FrameworkFacade frameworkFacade) { + FrameworkFacade frameworkFacade, + Clock clock) { mContext = context; mHandler = new Handler(looper); mWakeupLock = wakeupLock; @@ -143,6 +159,9 @@ public class WakeupController { mWakeupOnboarding.getNotificationsDataSource(), mWakeupLock.getDataSource()); wifiConfigStore.registerStoreData(mWakeupConfigStoreData); + mClock = clock; + mLastDisconnectTimestampMillis = 0; + mLastDisconnectInfo = null; } private void readWifiWakeupEnabledFromSettings() { @@ -160,6 +179,39 @@ public class WakeupController { } /** + * Saves the SSID of the last Wifi network that was disconnected. Should only be called before + * WakeupController is active. + */ + public void setLastDisconnectInfo(ScanResultMatchInfo scanResultMatchInfo) { + if (mIsActive) { + Log.e(TAG, "Unexpected setLastDisconnectInfo when WakeupController is active!"); + return; + } + if (scanResultMatchInfo == null) { + Log.e(TAG, "Unexpected setLastDisconnectInfo(null)"); + return; + } + mLastDisconnectTimestampMillis = mClock.getElapsedSinceBootMillis(); + mLastDisconnectInfo = scanResultMatchInfo; + if (mVerboseLoggingEnabled) { + Log.d(TAG, "mLastDisconnectInfo set to " + scanResultMatchInfo); + } + } + + /** + * If Wifi was disabled within LAST_DISCONNECT_TIMEOUT_MILLIS of losing a Wifi connection, + * add that Wifi connection to the Wakeup Lock as if Wifi was disabled while connected to that + * connection. + * Often times, networks with poor signal intermittently connect and disconnect, causing the + * user to manually turn off Wifi. If the Wifi was turned off during the disconnected phase of + * the intermittent connection, then that connection normally would not be added to the Wakeup + * Lock. This constant defines the timeout after disconnecting, in milliseconds, within which + * if Wifi was disabled, the network would still be added to the wakeup lock. + */ + @VisibleForTesting + static final long LAST_DISCONNECT_TIMEOUT_MILLIS = 5 * 1000; + + /** * Starts listening for incoming scans. * * <p>Should only be called upon entering ScanMode. WakeupController registers its listener with @@ -186,6 +238,18 @@ public class WakeupController { Set<ScanResultMatchInfo> matchInfos = toMatchInfos(scanResults); matchInfos.retainAll(getGoodSavedNetworks()); + // ensure that the last disconnected network is added to the wakeup lock, since we don't + // want to automatically reconnect to the same network that the user manually + // disconnected from + long now = mClock.getElapsedSinceBootMillis(); + if (mLastDisconnectInfo != null && ((now - mLastDisconnectTimestampMillis) + <= LAST_DISCONNECT_TIMEOUT_MILLIS)) { + matchInfos.add(mLastDisconnectInfo); + if (mVerboseLoggingEnabled) { + Log.d(TAG, "Added last connected network to lock: " + mLastDisconnectInfo); + } + } + if (mVerboseLoggingEnabled) { Log.d(TAG, "Saved networks in most recent scan:" + matchInfos); } @@ -204,6 +268,8 @@ public class WakeupController { */ public void stop() { Log.d(TAG, "stop()"); + mLastDisconnectTimestampMillis = 0; + mLastDisconnectInfo = null; mWifiInjector.getWifiScanner().deregisterScanListener(mScanListener); mWakeupOnboarding.onStop(); } diff --git a/service/java/com/android/server/wifi/WakeupLock.java b/service/java/com/android/server/wifi/WakeupLock.java index c6a8f5a34..3a1d097fc 100644 --- a/service/java/com/android/server/wifi/WakeupLock.java +++ b/service/java/com/android/server/wifi/WakeupLock.java @@ -39,7 +39,7 @@ public class WakeupLock { private static final String TAG = WakeupLock.class.getSimpleName(); @VisibleForTesting - static final int CONSECUTIVE_MISSED_SCANS_REQUIRED_TO_EVICT = 3; + static final int CONSECUTIVE_MISSED_SCANS_REQUIRED_TO_EVICT = 5; @VisibleForTesting static final long MAX_LOCK_TIME_MILLIS = 10 * DateUtils.MINUTE_IN_MILLIS; diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java index 24e125a29..5d54fa7e7 100644 --- a/service/java/com/android/server/wifi/WifiInjector.java +++ b/service/java/com/android/server/wifi/WifiInjector.java @@ -280,7 +280,8 @@ public class WifiInjector { mWifiCoreHandlerThread.getLooper(), new WakeupLock(mWifiConfigManager, mWifiMetrics.getWakeupMetrics(), mClock), WakeupEvaluator.fromContext(mContext), wakeupOnboarding, mWifiConfigManager, - mWifiConfigStore, mWifiMetrics.getWakeupMetrics(), this, mFrameworkFacade); + mWifiConfigStore, mWifiMetrics.getWakeupMetrics(), this, mFrameworkFacade, + mClock); mLockManager = new WifiLockManager(mContext, BatteryStatsService.getService()); mWifiController = new WifiController(mContext, mClientModeImpl, clientModeImplLooper, mSettingsStore, mWifiServiceHandlerThread.getLooper(), mFrameworkFacade, |