summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-09-10 23:17:49 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-09-10 23:17:49 +0000
commit23a730cfd4de3002f667b311961c1dd8e24b666c (patch)
tree7ac520d95fc1125933bb26c890cbbf5eb2759952
parentc006242c5f4156f479f395339012586d46288775 (diff)
parentb2e7091ff04668b7dc0946c50d6043cf52dfcf6a (diff)
Snap for 6826141 from b2e7091ff04668b7dc0946c50d6043cf52dfcf6a to rvc-qpr1-release
Change-Id: Iec725bd9793f78bb72c0879fb3f45695faf79f59
-rw-r--r--service/java/com/android/server/wifi/DeviceConfigFacade.java15
-rw-r--r--service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java2
-rw-r--r--service/java/com/android/server/wifi/WifiHealthMonitor.java28
-rw-r--r--service/java/com/android/server/wifi/WifiMetrics.java21
-rw-r--r--service/java/com/android/server/wifi/WifiNetworkSelector.java15
-rw-r--r--service/java/com/android/server/wifi/WifiScoreReport.java24
-rw-r--r--service/proto/src/metrics.proto7
-rw-r--r--tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java5
-rw-r--r--tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java12
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java8
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java31
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java50
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java16
13 files changed, 212 insertions, 22 deletions
diff --git a/service/java/com/android/server/wifi/DeviceConfigFacade.java b/service/java/com/android/server/wifi/DeviceConfigFacade.java
index 3856ff1fd..a7bcfc764 100644
--- a/service/java/com/android/server/wifi/DeviceConfigFacade.java
+++ b/service/java/com/android/server/wifi/DeviceConfigFacade.java
@@ -139,6 +139,9 @@ public class DeviceConfigFacade {
// depends on the score evaluation period normally controlled by
// 'com.android.wifi.resources.R' config_wifiPollRssiIntervalMilliseconds.
static final int DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS = 0;
+ // Default RSSI threshold in dBm above which low score is not sent to connectivity service
+ // when external scorer takes action.
+ static final int DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM = -67;
// Cached values of fields updated via updateDeviceConfigFlags()
private boolean mIsAbnormalConnectionBugreportEnabled;
private int mAbnormalConnectionDurationMs;
@@ -189,6 +192,7 @@ public class DeviceConfigFacade {
private int mHealthMonitorFwAlertValidTimeMs;
private int mMinConfirmationDurationSendLowScoreMs;
private int mMinConfirmationDurationSendHighScoreMs;
+ private int mRssiThresholdNotSendLowScoreToCsDbm;
public DeviceConfigFacade(Context context, Handler handler, WifiMetrics wifiMetrics) {
mContext = context;
@@ -342,6 +346,9 @@ public class DeviceConfigFacade {
mMinConfirmationDurationSendHighScoreMs = DeviceConfig.getInt(NAMESPACE,
"min_confirmation_duration_send_high_score_ms",
DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS);
+ mRssiThresholdNotSendLowScoreToCsDbm = DeviceConfig.getInt(NAMESPACE,
+ "rssi_threshold_not_send_low_score_to_cs_dbm",
+ DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM);
}
private Set<String> getUnmodifiableSetQuoted(String key) {
@@ -706,4 +713,12 @@ public class DeviceConfigFacade {
public int getMinConfirmationDurationSendHighScoreMs() {
return mMinConfirmationDurationSendHighScoreMs;
}
+
+ /**
+ * Gets the RSSI threshold above which low score is not sent to connectivity service when
+ * external scorer takes action.
+ */
+ public int getRssiThresholdNotSendLowScoreToCsDbm() {
+ return mRssiThresholdNotSendLowScoreToCsDbm;
+ }
}
diff --git a/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java b/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java
index 98664d0fc..a9c99ae54 100644
--- a/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java
+++ b/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java
@@ -28,6 +28,7 @@ import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -92,6 +93,7 @@ public class ImsiPrivacyProtectionExemptionStoreData implements WifiConfigStore.
throws XmlPullParserException, IOException {
// Ignore empty reads.
if (in == null) {
+ mDataSource.fromDeserialized(Collections.emptyMap());
return;
}
diff --git a/service/java/com/android/server/wifi/WifiHealthMonitor.java b/service/java/com/android/server/wifi/WifiHealthMonitor.java
index bc1f9af01..b21ea516d 100644
--- a/service/java/com/android/server/wifi/WifiHealthMonitor.java
+++ b/service/java/com/android/server/wifi/WifiHealthMonitor.java
@@ -24,6 +24,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.app.AlarmManager;
import android.content.Context;
+import android.content.pm.ModuleInfo;
import android.content.pm.PackageManager;
import android.net.MacAddress;
import android.net.wifi.ScanResult;
@@ -76,7 +77,7 @@ public class WifiHealthMonitor {
"WifiHealthMonitor Schedule Post-Boot Detection Timer";
// Package name of WiFi mainline module found from the following adb command
// adb shell pm list packages --apex-only| grep wifi
- private static final String WIFI_APK_PACKAGE_NAME = "com.google.android.wifi";
+ private static final String WIFI_APEX_NAME = "com.android.wifi";
private static final String SYSTEM_INFO_DATA_NAME = "systemInfoData";
// The time that device waits after device boot before triggering post-boot detection.
// This needs be long enough so that memory read can complete before post-boot detection.
@@ -329,8 +330,20 @@ public class WifiHealthMonitor {
* @Return a non-zero value if version code is available, 0 otherwise.
*/
public long getWifiStackVersion() {
- WifiSoftwareBuildInfo currentBuild = getWifiSystemInfoStats().getCurrSoftwareBuildInfo();
- return (currentBuild == null) ? 0 : currentBuild.getWifiStackVersion();
+ PackageManager packageManager = mContext.getPackageManager();
+ long wifiStackVersion = 0;
+ try {
+ ModuleInfo wifiModule = packageManager.getModuleInfo(
+ WIFI_APEX_NAME, PackageManager.MODULE_APEX_NAME);
+ String wifiPackageName = wifiModule.getPackageName();
+ if (wifiPackageName != null) {
+ wifiStackVersion = packageManager.getPackageInfo(
+ wifiPackageName, PackageManager.MATCH_APEX).getLongVersionCode();
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, " Hit PackageManager exception", e);
+ }
+ return wifiStackVersion;
}
private synchronized void dailyDetectionHandler() {
@@ -539,14 +552,7 @@ public class WifiHealthMonitor {
if (!mWifiEnabled) {
return null;
}
- PackageManager packageManager = mContext.getPackageManager();
- long wifiStackVersion = 0;
- try {
- wifiStackVersion = packageManager.getPackageInfo(
- WIFI_APK_PACKAGE_NAME, PackageManager.MATCH_APEX).getLongVersionCode();
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(TAG, " Hit PackageManager exception", e);
- }
+ long wifiStackVersion = getWifiStackVersion();
String osBuildVersion = replaceNullByEmptyString(Build.DISPLAY);
if (mWifiNative == null) {
return null;
diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java
index 1ac361ef3..75d53fc95 100644
--- a/service/java/com/android/server/wifi/WifiMetrics.java
+++ b/service/java/com/android/server/wifi/WifiMetrics.java
@@ -242,6 +242,7 @@ public class WifiMetrics {
private int mLastPollRxLinkSpeed = -1;
private int mLastPollFreq = -1;
private int mLastScore = -1;
+ private boolean mAdaptiveConnectivityEnabled = true;
/**
* Metrics are stored within an instance of the WifiLog proto during runtime,
@@ -4908,6 +4909,7 @@ public class WifiMetrics {
if (mWifiDataStall != null) {
staEvent.isCellularDataAvailable = mWifiDataStall.isCellularDataAvailable();
}
+ staEvent.isAdaptiveConnectivityEnabled = mAdaptiveConnectivityEnabled;
mSupplicantStateChangeBitmask = 0;
mLastPollRssi = -127;
mLastPollFreq = -1;
@@ -5124,6 +5126,7 @@ public class WifiMetrics {
if (event.totalRxBytes > 0) sb.append(" totalRxBytes=").append(event.totalRxBytes);
sb.append(" screenOn=").append(event.screenOn);
sb.append(" cellularData=").append(event.isCellularDataAvailable);
+ sb.append(" adaptiveConnectivity=").append(event.isAdaptiveConnectivityEnabled);
if (event.supplicantStateChangesBitmask != 0) {
sb.append(", ").append(supplicantStateChangesBitmaskToString(
event.supplicantStateChangesBitmask));
@@ -5343,6 +5346,15 @@ public class WifiMetrics {
return result;
}
+ /**
+ * Converts Adaptive Connectivity state to UserActionEvent type.
+ * @param value
+ */
+ public static int convertAdaptiveConnectivityStateToUserActionEventType(boolean value) {
+ return value ? UserActionEvent.EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_ON
+ : UserActionEvent.EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_OFF;
+ }
+
static class MeteredNetworkStatsBuilder {
// A map from network identifier to MeteredDetail
Map<String, MeteredDetail> mNetworkMap = new ArrayMap<>();
@@ -6713,4 +6725,13 @@ public class WifiMetrics {
mCarrierWifiMetrics.numConnectionNonAuthFailure++;
}
}
+
+ /**
+ * Set Adaptive Connectivity state (On/Off)
+ */
+ public void setAdaptiveConnectivityState(boolean adaptiveConnectivityEnabled) {
+ synchronized (mLock) {
+ mAdaptiveConnectivityEnabled = adaptiveConnectivityEnabled;
+ }
+ }
}
diff --git a/service/java/com/android/server/wifi/WifiNetworkSelector.java b/service/java/com/android/server/wifi/WifiNetworkSelector.java
index 50078b628..fbbcb3174 100644
--- a/service/java/com/android/server/wifi/WifiNetworkSelector.java
+++ b/service/java/com/android/server/wifi/WifiNetworkSelector.java
@@ -462,6 +462,17 @@ public class WifiNetworkSelector {
return validScanDetails;
}
+ private ScanDetail findScanDetailForBssid(List<ScanDetail> scanDetails,
+ String currentBssid) {
+ for (ScanDetail scanDetail : scanDetails) {
+ ScanResult scanResult = scanDetail.getScanResult();
+ if (scanResult.BSSID.equals(currentBssid)) {
+ return scanDetail;
+ }
+ }
+ return null;
+ }
+
private boolean isEnhancedOpenSupported() {
if (mIsEnhancedOpenSupportedInitialized) {
return mIsEnhancedOpenSupported;
@@ -790,6 +801,8 @@ public class WifiNetworkSelector {
WifiCandidates.Key key = new WifiCandidates.Key(
ScanResultMatchInfo.fromWifiConfiguration(currentNetwork),
bssid, currentNetwork.networkId);
+ ScanDetail scanDetail = findScanDetailForBssid(mFilteredNetworks, currentBssid);
+ int predictedTputMbps = (scanDetail == null) ? 0 : predictThroughput(scanDetail);
wifiCandidates.add(key, currentNetwork,
NetworkNominator.NOMINATOR_ID_CURRENT,
wifiInfo.getRssi(),
@@ -797,7 +810,7 @@ public class WifiNetworkSelector {
calculateLastSelectionWeight(currentNetwork.networkId),
WifiConfiguration.isMetered(currentNetwork, wifiInfo),
isFromCarrierOrPrivilegedApp(currentNetwork),
- 0 /* Mbps */);
+ predictedTputMbps);
}
for (NetworkNominator registeredNominator : mNominators) {
localLog("About to run " + registeredNominator.getName() + " :");
diff --git a/service/java/com/android/server/wifi/WifiScoreReport.java b/service/java/com/android/server/wifi/WifiScoreReport.java
index 381be7f2b..80a561d05 100644
--- a/service/java/com/android/server/wifi/WifiScoreReport.java
+++ b/service/java/com/android/server/wifi/WifiScoreReport.java
@@ -206,14 +206,25 @@ public class WifiScoreReport {
&& mContext.getResources().getBoolean(
R.bool.config_wifiMinConfirmationDurationSendNetworkScoreEnabled)) {
long millis = mClock.getWallClockMillis();
- if (mLastScoreBreachLowTimeMillis != INVALID_WALL_CLOCK_MILLIS
- && (millis - mLastScoreBreachLowTimeMillis)
- < mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs()) {
- return;
+ if (mLastScoreBreachLowTimeMillis != INVALID_WALL_CLOCK_MILLIS) {
+ if (mWifiInfo.getRssi()
+ >= mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm()) {
+ Log.d(TAG, "Not reporting low score because RSSI is high "
+ + mWifiInfo.getRssi());
+ return;
+ }
+ if ((millis - mLastScoreBreachLowTimeMillis)
+ < mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs()) {
+ Log.d(TAG, "Not reporting low score because elapsed time is shorter than "
+ + "the minimum confirmation duration");
+ return;
+ }
}
if (mLastScoreBreachHighTimeMillis != INVALID_WALL_CLOCK_MILLIS
&& (millis - mLastScoreBreachHighTimeMillis)
< mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs()) {
+ Log.d(TAG, "Not reporting high score because elapsed time is shorter than "
+ + "the minimum confirmation duration");
return;
}
}
@@ -322,6 +333,10 @@ public class WifiScoreReport {
super.onChange(selfChange);
mAdaptiveConnectivityEnabled = getValue();
Log.d(TAG, "Adaptive connectivity status changed: " + mAdaptiveConnectivityEnabled);
+ mWifiMetrics.setAdaptiveConnectivityState(mAdaptiveConnectivityEnabled);
+ mWifiMetrics.logUserActionEvent(
+ mWifiMetrics.convertAdaptiveConnectivityStateToUserActionEventType(
+ mAdaptiveConnectivityEnabled));
}
/**
@@ -335,6 +350,7 @@ public class WifiScoreReport {
}
mFrameworkFacade.registerContentObserver(mContext, uri, true, this);
mAdaptiveConnectivityEnabled = mAdaptiveConnectivityEnabledSettingObserver.getValue();
+ mWifiMetrics.setAdaptiveConnectivityState(mAdaptiveConnectivityEnabled);
}
public boolean getValue() {
diff --git a/service/proto/src/metrics.proto b/service/proto/src/metrics.proto
index a7f706fb8..1c3b27872 100644
--- a/service/proto/src/metrics.proto
+++ b/service/proto/src/metrics.proto
@@ -1471,6 +1471,9 @@ message StaEvent {
// Whether cellular data network is available
optional bool is_cellular_data_available = 25;
+
+ //Whether Adaptive Connectivity is enabled
+ optional bool is_adaptive_connectivity_enabled = 26;
}
// Wi-Fi Aware metrics
@@ -3158,6 +3161,10 @@ message UserActionEvent {
EVENT_CONFIGURE_METERED_STATUS_AUTO = 12;
// User adds a new network or updates configurations for an existing network.
EVENT_ADD_OR_UPDATE_NETWORK = 13;
+ // User sets the adaptive connectivity to on
+ EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_ON = 14;
+ // User sets the adaptive connectivity to off
+ EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_OFF = 15;
}
// The type of user action
diff --git a/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java b/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java
index 43a16fe4c..a570d2948 100644
--- a/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java
@@ -209,6 +209,8 @@ public class DeviceConfigFacadeTest extends WifiBaseTest {
mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs());
assertEquals(DeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS,
mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs());
+ assertEquals(DeviceConfigFacade.DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM,
+ mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm());
}
/**
@@ -315,6 +317,8 @@ public class DeviceConfigFacadeTest extends WifiBaseTest {
anyInt())).thenReturn(4000);
when(DeviceConfig.getInt(anyString(), eq("min_confirmation_duration_send_high_score_ms"),
anyInt())).thenReturn(1000);
+ when(DeviceConfig.getInt(anyString(), eq("rssi_threshold_not_send_low_score_to_cs_dbm"),
+ anyInt())).thenReturn(-70);
mOnPropertiesChangedListenerCaptor.getValue().onPropertiesChanged(null);
// Verifying fields are updated to the new values
@@ -373,5 +377,6 @@ public class DeviceConfigFacadeTest extends WifiBaseTest {
assertEquals(1000, mDeviceConfigFacade.getHealthMonitorFwAlertValidTimeMs());
assertEquals(4000, mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs());
assertEquals(1000, mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs());
+ assertEquals(-70, mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm());
}
}
diff --git a/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java b/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java
index ec2142dbf..77d5c1933 100644
--- a/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java
@@ -17,6 +17,7 @@
package com.android.server.wifi;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -102,6 +103,17 @@ public class ImsiPrivacyProtectionExemptionStoreDataTest {
assertSerializeDeserialize(imsiPrivacyProtectionExemptionMap);
}
+ @Test
+ public void testDeserializeOnNewDeviceOrNewUser() throws Exception {
+ ArgumentCaptor<Map> deserializedNetworkSuggestionsMap =
+ ArgumentCaptor.forClass(Map.class);
+ mImsiPrivacyProtectionExemptionStoreData.deserializeData(null, 0,
+ WifiConfigStore.ENCRYPT_CREDENTIALS_CONFIG_STORE_DATA_VERSION, null);
+ verify(mDataSource).fromDeserialized(deserializedNetworkSuggestionsMap.capture());
+ assertTrue(deserializedNetworkSuggestionsMap.getValue().isEmpty());
+ }
+
+
private Map<Integer, Boolean> assertSerializeDeserialize(
Map<Integer, Boolean> mImsiPrivacyProtectionExemptionMap) throws Exception {
// Setup the data to serialize.
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java
index 21a00f9a1..c679954b1 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java
@@ -28,6 +28,7 @@ import static org.mockito.Mockito.when;
import android.app.test.MockAnswerUtil.AnswerWithArguments;
import android.app.test.TestAlarmManager;
import android.content.Context;
+import android.content.pm.ModuleInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.MacAddress;
@@ -98,6 +99,8 @@ public class WifiHealthMonitorTest extends WifiBaseTest {
PackageManager mPackageManager;
@Mock
PackageInfo mPackageInfo;
+ @Mock
+ ModuleInfo mModuleInfo;
private final ArrayList<String> mKeys = new ArrayList<>();
private final ArrayList<WifiScoreCard.BlobListener> mBlobListeners = new ArrayList<>();
@@ -154,8 +157,9 @@ public class WifiHealthMonitorTest extends WifiBaseTest {
mDriverVersion = "build 1.1";
mFirmwareVersion = "HW 1.1";
when(mPackageInfo.getLongVersionCode()).thenReturn(MODULE_VERSION);
- when(mContext.getPackageName()).thenReturn("WifiAPK");
when(mPackageManager.getPackageInfo(anyString(), anyInt())).thenReturn(mPackageInfo);
+ when(mPackageManager.getModuleInfo(anyString(), anyInt())).thenReturn(mModuleInfo);
+ when(mModuleInfo.getPackageName()).thenReturn("WifiAPK");
when(mContext.getPackageManager()).thenReturn(mPackageManager);
mWifiConfigManager = mockConfigManager();
@@ -323,7 +327,7 @@ public class WifiHealthMonitorTest extends WifiBaseTest {
// trigger extractCurrentSoftwareBuildInfo() call to update currSoftwareBuildInfo
mWifiHealthMonitor.installMemoryStoreSetUpDetectionAlarm(mMemoryStore);
mWifiHealthMonitor.setWifiEnabled(true);
- assertEquals(0, mWifiHealthMonitor.getWifiStackVersion());
+ assertEquals(MODULE_VERSION, mWifiHealthMonitor.getWifiStackVersion());
millisecondsPass(5000);
mWifiScanner.startScan(mScanSettings, mScanListener);
mAlarmManager.dispatch(WifiHealthMonitor.POST_BOOT_DETECTION_TIMER_TAG);
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
index b4cd7592c..b69b30208 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java
@@ -2302,6 +2302,7 @@ public class WifiMetricsTest extends WifiBaseTest {
mTestLooper.dispatchAll();
wifiMetrics.setScreenState(true);
when(mWifiDataStall.isCellularDataAvailable()).thenReturn(true);
+ wifiMetrics.setAdaptiveConnectivityState(true);
for (int i = 0; i < mTestStaLogInts.length; i++) {
int[] lia = mTestStaLogInts[i];
wifiMetrics.logStaEvent(lia[0], lia[1], lia[2] == 1 ? mTestWifiConfig : null);
@@ -2342,6 +2343,7 @@ public class WifiMetricsTest extends WifiBaseTest {
evs[7] == 1 ? mTestWifiConfig : null, event.configInfo);
assertEquals(true, event.screenOn);
assertEquals(true, event.isCellularDataAvailable);
+ assertEquals(true, event.isAdaptiveConnectivityEnabled);
j++;
}
assertEquals(mExpectedValues.length, j);
@@ -2554,6 +2556,35 @@ public class WifiMetricsTest extends WifiBaseTest {
}
/**
+ * Test the logging of UserActionEvent for Adaptive Connectivity toggle
+ */
+ @Test
+ public void testLogUserActionEventForAdaptiveConnectivity() throws Exception {
+ long testStartTimeMillis = 123123L;
+ boolean adaptiveConnectivityEnabled = true;
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(testStartTimeMillis);
+ mWifiMetrics.logUserActionEvent(
+ mWifiMetrics.convertAdaptiveConnectivityStateToUserActionEventType(
+ adaptiveConnectivityEnabled));
+ long testStartTimeMillis2 = 200000L;
+ boolean adaptiveConnectivityEnabled2 = false;
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(testStartTimeMillis2);
+ mWifiMetrics.logUserActionEvent(
+ mWifiMetrics.convertAdaptiveConnectivityStateToUserActionEventType(
+ adaptiveConnectivityEnabled2));
+ dumpProtoAndDeserialize();
+
+ WifiMetricsProto.UserActionEvent[] userActionEvents = mDecodedProto.userActionEvents;
+ assertEquals(2, userActionEvents.length);
+ assertEquals(WifiMetricsProto.UserActionEvent.EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_ON,
+ userActionEvents[0].eventType);
+ assertEquals(testStartTimeMillis, userActionEvents[0].startTimeMillis);
+ assertEquals(WifiMetricsProto.UserActionEvent.EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_OFF,
+ userActionEvents[1].eventType);
+ assertEquals(testStartTimeMillis2, userActionEvents[1].startTimeMillis);
+ }
+
+ /**
* Verify that the max length of the UserActionEvent list is limited to MAX_USER_ACTION_EVENTS.
*/
@Test
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java
index 0bd14a470..1507e9c55 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java
@@ -741,6 +741,56 @@ public class WifiNetworkSelectorTest extends WifiBaseTest {
}
/**
+ * Wifi network selector stays with current network if current network is not nominated
+ * but has the higher score
+ */
+ @Test
+ public void includeCurrentNetworkWhenCurrentNetworkNotNominated() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2437, 5120};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-PSK][ESS]"};
+ int[] levels = {mThresholdMinimumRssi2G + 10, mThresholdMinimumRssi2G + 20};
+ int[] securities = {SECURITY_EAP, SECURITY_PSK};
+ // VHT cap IE
+ byte[] iesBytes = {(byte) 0x92, (byte) 0x01, (byte) 0x80, (byte) 0x33, (byte) 0xaa,
+ (byte) 0xff, (byte) 0x00, (byte) 0x00, (byte) 0xaa, (byte) 0xff, (byte) 0x00,
+ (byte) 0x00};
+ byte[][] iesByteStream = {iesBytes, iesBytes};
+ // Make a network selection to connect to test1.
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock, iesByteStream);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ assertEquals(2, scanDetails.size());
+ HashSet<String> blocklist = new HashSet<String>();
+ List<WifiCandidates.Candidate> candidates = mWifiNetworkSelector.getCandidatesFromScan(
+ scanDetails, blocklist, mWifiInfo, false, true, false);
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(candidates);
+
+ when(mWifiInfo.getSupplicantState()).thenReturn(SupplicantState.COMPLETED);
+ when(mWifiInfo.getNetworkId()).thenReturn(0); // 0 is current network
+ when(mWifiInfo.getBSSID()).thenReturn(bssids[0]);
+ when(mWifiInfo.is24GHz()).thenReturn(true);
+ when(mWifiInfo.getScore()).thenReturn(ConnectedScore.WIFI_TRANSITION_SCORE);
+ when(mWifiInfo.is5GHz()).thenReturn(false);
+ when(mWifiInfo.getFrequency()).thenReturn(2400);
+ when(mWifiInfo.getRssi()).thenReturn(levels[0]);
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()
+ + WifiNetworkSelector.MINIMUM_NETWORK_SELECTION_INTERVAL_MS + 2000);
+
+ when(mThroughputPredictor.predictThroughput(any(), anyInt(), anyInt(), anyInt(),
+ anyInt(), anyInt(), anyInt(), anyInt(), anyBoolean())).thenReturn(100);
+ // Force to return 2nd network in the network nominator
+ mDummyNominator.setNetworkIndexToReturn(1);
+
+ candidates = mWifiNetworkSelector.getCandidatesFromScan(
+ scanDetails, blocklist, mWifiInfo, true, false, false);
+ assertEquals(2, candidates.size());
+ assertEquals(100, candidates.get(0).getPredictedThroughputMbps());
+ }
+
+ /**
* If two qualified networks, test1 and test2, are in range when the user selects test2 over
* test1, WifiNetworkSelector will override the NetworkSelector's choice to connect to test1
* with test2.
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
index cf83fbee3..954d4fe82 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java
@@ -218,6 +218,8 @@ public class WifiScoreReportTest extends WifiBaseTest {
DeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_LOW_SCORE_MS);
when(mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs()).thenReturn(
DeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS);
+ when(mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm()).thenReturn(
+ DeviceConfigFacade.DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM);
}
/**
@@ -880,6 +882,7 @@ public class WifiScoreReportTest extends WifiBaseTest {
mClock.mStepMillis = 0;
mClock.mWallClockMillis = 10;
+ mWifiInfo.setRssi(-65);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 49);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(anyInt());
@@ -901,9 +904,11 @@ public class WifiScoreReportTest extends WifiBaseTest {
mClock.mWallClockMillis = 10;
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 60);
+ mWifiInfo.setRssi(-70);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(60);
mClock.mWallClockMillis = 3010;
+ mWifiInfo.setRssi(-65);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 59);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(59);
@@ -914,11 +919,11 @@ public class WifiScoreReportTest extends WifiBaseTest {
}
/**
- * Verify confirmation duration is added for reporting low score when it is enabled in
- * config overlay
+ * Verify confirmation duration and RSSI check is added for reporting low score when it is
+ * enabled in config overlay
*/
@Test
- public void confirmationDurationIsAddedForSendingLowScore() throws Exception {
+ public void confirmationDurationAndRssiCheckIsAddedForSendingLowScore() throws Exception {
WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl();
// Register Client for verification.
mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl);
@@ -939,11 +944,13 @@ public class WifiScoreReportTest extends WifiBaseTest {
verify(mNetworkAgent, never()).sendNetworkScore(anyInt());
mClock.mWallClockMillis = 10
+ mDeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_LOW_SCORE_MS;
+ mWifiInfo.setRssi(-65);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 47);
mLooper.dispatchAll();
- verify(mNetworkAgent).sendNetworkScore(47);
+ verify(mNetworkAgent, never()).sendNetworkScore(47);
mClock.mWallClockMillis = 10
+ mDeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_LOW_SCORE_MS + 3000;
+ mWifiInfo.setRssi(-68);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 46);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(46);
@@ -968,6 +975,7 @@ public class WifiScoreReportTest extends WifiBaseTest {
mLooper.dispatchAll();
verify(mNetworkAgent, never()).sendNetworkScore(anyInt());
mClock.mWallClockMillis = 3000;
+ mWifiInfo.setRssi(-70);
scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 51);
mLooper.dispatchAll();
verify(mNetworkAgent).sendNetworkScore(51);