summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Quang Luong <qal@google.com> 2019-03-06 21:33:01 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-03-06 21:33:01 +0000
commitb4299df5637dc03041eaadb5f70939af1f4b4273 (patch)
tree9b7544e80371cbeee90a0b522923497a42f95298
parentab5598dfa75cc090c774dfcf87ea736d8a440bc9 (diff)
parent8123f7717a1f98140e3144d8dc03da4d98f83c1a (diff)
Merge "Added special constructors for Passpoint and OSU AccessPoints"
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java164
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java46
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java214
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java3
4 files changed, 313 insertions, 114 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 3d38837d8964..4fc62bb3937f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -57,6 +57,7 @@ import android.util.Log;
import androidx.annotation.NonNull;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.CollectionUtils;
import com.android.settingslib.R;
import com.android.settingslib.utils.ThreadUtils;
@@ -133,6 +134,12 @@ public class AccessPoint implements Comparable<AccessPoint> {
private final ArraySet<ScanResult> mScanResults = new ArraySet<>();
/**
+ * Extra set of unused scan results corresponding to this AccessPoint for verbose logging
+ * purposes, such as a set of Passpoint roaming scan results when home scans are available.
+ */
+ private final ArraySet<ScanResult> mExtraScanResults = new ArraySet<>();
+
+ /**
* Map of BSSIDs to scored networks for individual bssids.
*
* <p>This cache should not be evicted with scan results, as the values here are used to
@@ -216,6 +223,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
*/
private String mFqdn;
private String mProviderFriendlyName;
+ private boolean mIsRoaming = false;
private boolean mIsCarrierAp = false;
@@ -289,15 +297,12 @@ public class AccessPoint implements Comparable<AccessPoint> {
// Calculate required fields
updateKey();
- updateRssi();
+ updateBestRssiInfo();
}
/**
* Creates an AccessPoint with only a WifiConfiguration. This is used for the saved networks
* page.
- *
- * Passpoint Credential AccessPoints should be created with this.
- * Make sure to call setScanResults after constructing with this.
*/
public AccessPoint(Context context, WifiConfiguration config) {
mContext = context;
@@ -315,39 +320,33 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
/**
+ * Initialize an AccessPoint object for a Passpoint network.
+ */
+ public AccessPoint(@NonNull Context context, @NonNull WifiConfiguration config,
+ @Nullable Collection<ScanResult> homeScans,
+ @Nullable Collection<ScanResult> roamingScans) {
+ mContext = context;
+ networkId = config.networkId;
+ mConfig = config;
+ setScanResultsPasspoint(homeScans, roamingScans);
+ updateKey();
+ }
+
+ /**
* Initialize an AccessPoint object for a Passpoint OSU Provider.
- * Make sure to call setScanResults after constructing with this.
*/
- public AccessPoint(Context context, OsuProvider provider) {
+ public AccessPoint(@NonNull Context context, @NonNull OsuProvider provider,
+ @NonNull Collection<ScanResult> results) {
mContext = context;
mOsuProvider = provider;
- ssid = provider.getFriendlyName();
+ setScanResults(results);
updateKey();
}
AccessPoint(Context context, Collection<ScanResult> results) {
mContext = context;
-
- if (results.isEmpty()) {
- throw new IllegalArgumentException("Cannot construct with an empty ScanResult list");
- }
- mScanResults.addAll(results);
-
- // Information derived from scan results
- ScanResult firstResult = results.iterator().next();
- ssid = firstResult.SSID;
- bssid = firstResult.BSSID;
- security = getSecurity(firstResult);
- if (security == SECURITY_PSK) {
- pskType = getPskType(firstResult);
- }
+ setScanResults(results);
updateKey();
- updateRssi();
-
- // Passpoint Info
- mIsCarrierAp = firstResult.isCarrierAp;
- mCarrierApEapType = firstResult.carrierApEapType;
- mCarrierName = firstResult.carrierName;
}
@VisibleForTesting void loadConfig(WifiConfiguration config) {
@@ -468,7 +467,8 @@ public class AccessPoint implements Comparable<AccessPoint> {
if (isVerboseLoggingEnabled()) {
builder.append(",rssi=").append(mRssi);
- builder.append(",scan cache size=").append(mScanResults.size());
+ builder.append(",scan cache size=").append(mScanResults.size()
+ + mExtraScanResults.size());
}
return builder.append(')').toString();
@@ -703,14 +703,19 @@ public class AccessPoint implements Comparable<AccessPoint> {
*
* <p>Callers should not modify this set.
*/
- public Set<ScanResult> getScanResults() { return mScanResults; }
+ public Set<ScanResult> getScanResults() {
+ Set<ScanResult> allScans = new ArraySet<>();
+ allScans.addAll(mScanResults);
+ allScans.addAll(mExtraScanResults);
+ return allScans;
+ }
public Map<String, TimestampedScoredNetwork> getScoredNetworkCache() {
return mScoredNetworkCache;
}
/**
- * Updates {@link #mRssi}.
+ * Updates {@link #mRssi} and sets scan result information to that of the best RSSI scan result.
*
* <p>If the given connection is active, the existing value of {@link #mRssi} will be returned.
* If the given AccessPoint is not active, a value will be calculated from previous scan
@@ -718,22 +723,41 @@ public class AccessPoint implements Comparable<AccessPoint> {
* value. If the access point is not connected and there are no scan results, the rssi will be
* set to {@link #UNREACHABLE_RSSI}.
*/
- private void updateRssi() {
+ private void updateBestRssiInfo() {
if (this.isActive()) {
return;
}
- int rssi = UNREACHABLE_RSSI;
+ ScanResult bestResult = null;
+ int bestRssi = UNREACHABLE_RSSI;
for (ScanResult result : mScanResults) {
- if (result.level > rssi) {
- rssi = result.level;
+ if (result.level > bestRssi) {
+ bestRssi = result.level;
+ bestResult = result;
}
}
- if (rssi != UNREACHABLE_RSSI && mRssi != UNREACHABLE_RSSI) {
- mRssi = (mRssi + rssi) / 2; // half-life previous value
+ // Set the rssi to the average of the current rssi and the previous rssi.
+ if (bestRssi != UNREACHABLE_RSSI && mRssi != UNREACHABLE_RSSI) {
+ mRssi = (mRssi + bestRssi) / 2;
} else {
- mRssi = rssi;
+ mRssi = bestRssi;
+ }
+
+ if (bestResult != null) {
+ ssid = bestResult.SSID;
+ bssid = bestResult.BSSID;
+ security = getSecurity(bestResult);
+ if (security == SECURITY_PSK) {
+ pskType = getPskType(bestResult);
+ }
+ mIsCarrierAp = bestResult.isCarrierAp;
+ mCarrierApEapType = bestResult.carrierApEapType;
+ mCarrierName = bestResult.carrierName;
+ }
+ // Update the config SSID of a Passpoint network to that of the best RSSI
+ if (isPasspoint()) {
+ mConfig.SSID = convertToQuotedString(ssid);
}
}
@@ -897,18 +921,12 @@ public class AccessPoint implements Comparable<AccessPoint> {
summary.append(mContext.getString(R.string.tap_to_sign_up));
}
} else if (isActive()) {
- if (isPasspoint()) {
- // This is the active connection on passpoint
- summary.append(getSummary(mContext, /* ssid */ null, getDetailedState(),
- /* isEphemeral */ false,
- /* suggestionOrSpecifierPackageName */ null));
- } else if (mConfig != null && getDetailedState() == DetailedState.CONNECTED
+ if (mConfig != null && getDetailedState() == DetailedState.CONNECTED
&& mIsCarrierAp) {
// This is the active connection on a carrier AP
summary.append(String.format(mContext.getString(R.string.connected_via_carrier),
mCarrierName));
} else {
- // This is the active connection on non-passpoint network
summary.append(getSummary(mContext, /* ssid */ null, getDetailedState(),
mInfo != null && mInfo.isEphemeral(),
mInfo != null ? mInfo.getNetworkSuggestionOrSpecifierPackageName() : null));
@@ -1107,7 +1125,8 @@ public class AccessPoint implements Comparable<AccessPoint> {
if (mConfig != null) savedState.putParcelable(KEY_CONFIG, mConfig);
savedState.putParcelable(KEY_WIFIINFO, mInfo);
savedState.putParcelableArray(KEY_SCANRESULTS,
- mScanResults.toArray(new Parcelable[mScanResults.size()]));
+ mScanResults.toArray(new Parcelable[mScanResults.size()
+ + mExtraScanResults.size()]));
savedState.putParcelableArrayList(KEY_SCOREDNETWORKCACHE,
new ArrayList<>(mScoredNetworkCache.values()));
if (mNetworkInfo != null) {
@@ -1129,24 +1148,27 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
/**
- * Sets {@link #mScanResults} to the given collection.
+ * Sets {@link #mScanResults} to the given collection and updates info based on the best RSSI
+ * scan result.
*
* @param scanResults a collection of scan results to add to the internal set
- * @throws IllegalArgumentException if any of the given ScanResults did not belong to this AP
*/
void setScanResults(Collection<ScanResult> scanResults) {
+ if (CollectionUtils.isEmpty(scanResults)) {
+ Log.d(TAG, "Cannot set scan results to empty list");
+ return;
+ }
// Validate scan results are for current AP only by matching SSID/BSSID
// Passpoint networks are not bound to a specific SSID/BSSID, so skip this for passpoint.
- if (!isPasspoint() && !isOsuProvider()) {
- String key = getKey();
+ if (mKey != null && !isPasspoint() && !isOsuProvider()) {
for (ScanResult result : scanResults) {
String scanResultKey = AccessPoint.getKey(result);
- if (!mKey.equals(scanResultKey)) {
- throw new IllegalArgumentException(
- String.format(
+ if (mKey != null && !mKey.equals(scanResultKey)) {
+ Log.d(TAG, String.format(
"ScanResult %s\nkey of %s did not match current AP key %s",
- result, scanResultKey, key));
+ result, scanResultKey, mKey));
+ return;
}
}
}
@@ -1154,7 +1176,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
int oldLevel = getLevel();
mScanResults.clear();
mScanResults.addAll(scanResults);
- updateRssi();
+ updateBestRssiInfo();
int newLevel = getLevel();
// If newLevel is 0, there will be no displayed Preference since the AP is unreachable
@@ -1174,20 +1196,26 @@ public class AccessPoint implements Comparable<AccessPoint> {
mAccessPointListener.onAccessPointChanged(this);
}
});
+ }
- if (!scanResults.isEmpty()) {
- ScanResult result = scanResults.iterator().next();
-
- // This flag only comes from scans, is not easily saved in config
- if (security == SECURITY_PSK) {
- pskType = getPskType(result);
+ /**
+ * Sets the internal scan result cache to the list of home scans.
+ * If there are no home scans, then the roaming scan list is used, and the AccessPoint is
+ * marked as roaming.
+ */
+ void setScanResultsPasspoint(
+ @Nullable Collection<ScanResult> homeScans,
+ @Nullable Collection<ScanResult> roamingScans) {
+ mExtraScanResults.clear();
+ if (!CollectionUtils.isEmpty(homeScans)) {
+ if (!CollectionUtils.isEmpty(roamingScans)) {
+ mExtraScanResults.addAll(roamingScans);
}
-
- // The carrier info in the ScanResult is set by the platform based on the SSID and will
- // always be the same for all matching scan results.
- mIsCarrierAp = result.isCarrierAp;
- mCarrierApEapType = result.carrierApEapType;
- mCarrierName = result.carrierName;
+ mIsRoaming = false;
+ setScanResults(homeScans);
+ } else if (!CollectionUtils.isEmpty(roamingScans)) {
+ mIsRoaming = true;
+ setScanResults(roamingScans);
}
}
@@ -1204,7 +1232,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
*/
public boolean update(
@Nullable WifiConfiguration config, WifiInfo info, NetworkInfo networkInfo) {
-
boolean updated = false;
final int oldLevel = getLevel();
if (info != null && isInfoForThisAccessPoint(config, info)) {
@@ -1538,7 +1565,8 @@ public class AccessPoint implements Comparable<AccessPoint> {
*
* All methods are invoked on the Main Thread
*/
- private class AccessPointProvisioningCallback extends ProvisioningCallback {
+ @VisibleForTesting
+ class AccessPointProvisioningCallback extends ProvisioningCallback {
@Override
@MainThread public void onProvisioningFailure(int status) {
if (TextUtils.equals(mOsuStatus, mContext.getString(R.string.osu_completing_sign_up))) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 9ce6b34ecd46..a31d64ce8881 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -53,7 +53,6 @@ import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
-import com.android.internal.util.CollectionUtils;
import com.android.settingslib.R;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -646,30 +645,14 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
Map<Integer, List<ScanResult>>> pairing : passpointConfigsAndScans) {
WifiConfiguration config = pairing.first;
if (seenFQDNs.add(config.FQDN)) {
- List<ScanResult> apScanResults = new ArrayList<>();
-
List<ScanResult> homeScans =
pairing.second.get(WifiManager.PASSPOINT_HOME_NETWORK);
List<ScanResult> roamingScans =
pairing.second.get(WifiManager.PASSPOINT_ROAMING_NETWORK);
- // TODO(b/118705403): Differentiate home network vs roaming network for summary info
- if (!CollectionUtils.isEmpty(homeScans)) {
- apScanResults.addAll(homeScans);
- } else if (!CollectionUtils.isEmpty(roamingScans)) {
- apScanResults.addAll(roamingScans);
- }
-
- int bestRssi = Integer.MIN_VALUE;
- for (ScanResult result : apScanResults) {
- if (result.level >= bestRssi) {
- bestRssi = result.level;
- config.SSID = AccessPoint.convertToQuotedString(result.SSID);
- }
- }
-
AccessPoint accessPoint =
- getCachedOrCreatePasspoint(apScanResults, accessPointCache, config);
+ getCachedOrCreatePasspoint(config, homeScans, roamingScans,
+ accessPointCache);
accessPoints.add(accessPoint);
}
}
@@ -688,8 +671,8 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
for (OsuProvider provider : providersAndScans.keySet()) {
if (!alreadyProvisioned.contains(provider)) {
AccessPoint accessPointOsu =
- getCachedOrCreateOsu(providersAndScans.get(provider),
- accessPointCache, provider);
+ getCachedOrCreateOsu(provider, providersAndScans.get(provider),
+ accessPointCache);
accessPoints.add(accessPointOsu);
}
}
@@ -709,26 +692,29 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
}
private AccessPoint getCachedOrCreatePasspoint(
- List<ScanResult> scanResults,
- List<AccessPoint> cache,
- WifiConfiguration config) {
+ WifiConfiguration config,
+ List<ScanResult> homeScans,
+ List<ScanResult> roamingScans,
+ List<AccessPoint> cache) {
AccessPoint accessPoint = getCachedByKey(cache, AccessPoint.getKey(config));
if (accessPoint == null) {
- accessPoint = new AccessPoint(mContext, config);
+ accessPoint = new AccessPoint(mContext, config, homeScans, roamingScans);
+ } else {
+ accessPoint.setScanResultsPasspoint(homeScans, roamingScans);
}
- accessPoint.setScanResults(scanResults);
return accessPoint;
}
private AccessPoint getCachedOrCreateOsu(
+ OsuProvider provider,
List<ScanResult> scanResults,
- List<AccessPoint> cache,
- OsuProvider provider) {
+ List<AccessPoint> cache) {
AccessPoint accessPoint = getCachedByKey(cache, AccessPoint.getKey(provider));
if (accessPoint == null) {
- accessPoint = new AccessPoint(mContext, provider);
+ accessPoint = new AccessPoint(mContext, provider, scanResults);
+ } else {
+ accessPoint.setScanResults(scanResults);
}
- accessPoint.setScanResults(scanResults);
return accessPoint;
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index f5ead0c1c55b..06f5fde9c92b 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -43,13 +43,16 @@ import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiNetworkScoreCache;
import android.net.wifi.WifiSsid;
+import android.net.wifi.hotspot2.OsuProvider;
import android.net.wifi.hotspot2.PasspointConfiguration;
+import android.net.wifi.hotspot2.ProvisioningCallback;
import android.net.wifi.hotspot2.pps.HomeSp;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.SystemClock;
import android.text.SpannableString;
import android.text.format.DateUtils;
+import android.util.ArraySet;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -68,6 +71,9 @@ import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
@SmallTest
@@ -75,8 +81,11 @@ import java.util.concurrent.CountDownLatch;
public class AccessPointTest {
private static final String TEST_SSID = "\"test_ssid\"";
+ private static final String ROAMING_SSID = "\"roaming_ssid\"";
+ private static final String OSU_FRIENDLY_NAME = "osu_friendly_name";
- private static final ArrayList<ScanResult> SCAN_RESULTS = buildScanResultCache();
+ private ArrayList<ScanResult> mScanResults;
+ private ArrayList<ScanResult> mRoamingScans;
private static final RssiCurve FAST_BADGE_CURVE =
new RssiCurve(-150, 10, new byte[]{Speed.FAST});
@@ -88,10 +97,11 @@ public class AccessPointTest {
private WifiInfo mWifiInfo;
@Mock private RssiCurve mockBadgeCurve;
@Mock private WifiNetworkScoreCache mockWifiNetworkScoreCache;
- public static final int NETWORK_ID = 123;
- public static final int DEFAULT_RSSI = -55;
+ @Mock private AccessPoint.AccessPointListener mMockAccessPointListener;
+ private static final int NETWORK_ID = 123;
+ private static final int DEFAULT_RSSI = -55;
- private static ScanResult createScanResult(String ssid, String bssid, int rssi) {
+ private ScanResult createScanResult(String ssid, String bssid, int rssi) {
ScanResult scanResult = new ScanResult();
scanResult.SSID = ssid;
scanResult.level = rssi;
@@ -101,6 +111,12 @@ public class AccessPointTest {
return scanResult;
}
+ private OsuProvider createOsuProvider() {
+ Map<String, String> friendlyNames = new HashMap<>();
+ friendlyNames.put("en", OSU_FRIENDLY_NAME);
+ return new OsuProvider(null, friendlyNames, null, null, null, null, null);
+ }
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -108,6 +124,8 @@ public class AccessPointTest {
mWifiInfo = new WifiInfo();
mWifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
mWifiInfo.setBSSID(TEST_BSSID);
+ mScanResults = buildScanResultCache(TEST_SSID);
+ mRoamingScans = buildScanResultCache(ROAMING_SSID);
WifiTracker.sVerboseLogging = false;
}
@@ -573,14 +591,14 @@ public class AccessPointTest {
Bundle bundle = new Bundle();
bundle.putParcelableArray(
AccessPoint.KEY_SCANRESULTS,
- SCAN_RESULTS.toArray(new Parcelable[SCAN_RESULTS.size()]));
+ mScanResults.toArray(new Parcelable[mScanResults.size()]));
return new AccessPoint(mContext, bundle);
}
- private static ArrayList<ScanResult> buildScanResultCache() {
+ private ArrayList<ScanResult> buildScanResultCache(String ssid) {
ArrayList<ScanResult> scanResults = new ArrayList<>();
for (int i = 0; i < 5; i++) {
- ScanResult scanResult = createScanResult(TEST_SSID, "bssid-" + i, i);
+ ScanResult scanResult = createScanResult(ssid, "bssid-" + i, i);
scanResults.add(scanResult);
}
return scanResults;
@@ -975,12 +993,12 @@ public class AccessPointTest {
int speed1 = Speed.MODERATE;
RssiCurve badgeCurve1 = mock(RssiCurve.class);
when(badgeCurve1.lookupScore(anyInt())).thenReturn((byte) speed1);
- when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(0)))
+ when(mockWifiNetworkScoreCache.getScoredNetwork(mScanResults.get(0)))
.thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve1));
int speed2 = Speed.VERY_FAST;
RssiCurve badgeCurve2 = mock(RssiCurve.class);
when(badgeCurve2.lookupScore(anyInt())).thenReturn((byte) speed2);
- when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(1)))
+ when(mockWifiNetworkScoreCache.getScoredNetwork(mScanResults.get(1)))
.thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve2));
int expectedSpeed = (speed1 + speed2) / 2;
@@ -998,12 +1016,12 @@ public class AccessPointTest {
int speed1 = Speed.VERY_FAST;
RssiCurve badgeCurve1 = mock(RssiCurve.class);
when(badgeCurve1.lookupScore(anyInt())).thenReturn((byte) speed1);
- when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(0)))
+ when(mockWifiNetworkScoreCache.getScoredNetwork(mScanResults.get(0)))
.thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve1));
int speed2 = Speed.NONE;
RssiCurve badgeCurve2 = mock(RssiCurve.class);
when(badgeCurve2.lookupScore(anyInt())).thenReturn((byte) speed2);
- when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(1)))
+ when(mockWifiNetworkScoreCache.getScoredNetwork(mScanResults.get(1)))
.thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve2));
ap.update(
@@ -1123,7 +1141,7 @@ public class AccessPointTest {
.setActive(true)
.setScoredNetworkCache(
new ArrayList(Arrays.asList(recentScore)))
- .setScanResults(SCAN_RESULTS)
+ .setScanResults(mScanResults)
.build();
when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class)))
@@ -1151,7 +1169,7 @@ public class AccessPointTest {
.setActive(true)
.setScoredNetworkCache(
new ArrayList(Arrays.asList(recentScore)))
- .setScanResults(SCAN_RESULTS)
+ .setScanResults(mScanResults)
.build();
int newSpeed = Speed.MODERATE;
@@ -1196,7 +1214,7 @@ public class AccessPointTest {
AccessPoint ap = new TestAccessPointBuilder(mContext)
.setSsid(TEST_SSID)
.setBssid(TEST_BSSID)
- .setScanResults(SCAN_RESULTS)
+ .setScanResults(mScanResults)
.build();
assertThat(ap.update(null, mWifiInfo, null)).isFalse();
@@ -1217,4 +1235,172 @@ public class AccessPointTest {
assertThat(passpointAp.update(null, mWifiInfo, null)).isFalse();
}
+
+ /**
+ * Verifies that an AccessPoint's getKey() is consistent with the overloaded static getKey().
+ */
+ @Test
+ public void testGetKey_matchesKeysCorrectly() {
+ AccessPoint ap = new AccessPoint(mContext, mScanResults);
+ assertThat(ap.getKey()).isEqualTo(AccessPoint.getKey(mScanResults.get(0)));
+
+ WifiConfiguration spyConfig = spy(new WifiConfiguration());
+ when(spyConfig.isPasspoint()).thenReturn(true);
+ spyConfig.FQDN = "fqdn";
+ AccessPoint passpointAp = new AccessPoint(mContext, spyConfig, mScanResults, null);
+ assertThat(passpointAp.getKey()).isEqualTo(AccessPoint.getKey(spyConfig));
+
+ OsuProvider provider = createOsuProvider();
+ AccessPoint osuAp = new AccessPoint(mContext, provider, mScanResults);
+ assertThat(osuAp.getKey()).isEqualTo(AccessPoint.getKey(provider));
+ }
+
+ /**
+ * Verifies that the Passpoint AccessPoint constructor creates AccessPoints whose isPasspoint()
+ * returns true.
+ */
+ @Test
+ public void testPasspointAccessPointConstructor_createdAccessPointIsPasspoint() {
+ WifiConfiguration spyConfig = spy(new WifiConfiguration());
+ when(spyConfig.isPasspoint()).thenReturn(true);
+ AccessPoint passpointAccessPoint = new AccessPoint(mContext, spyConfig,
+ mScanResults, mRoamingScans);
+
+ assertThat(passpointAccessPoint.isPasspoint()).isTrue();
+ }
+
+ /**
+ * Verifies that Passpoint AccessPoints set their config's SSID to the home scans', and to the
+ * roaming scans' if no home scans are available.
+ */
+ @Test
+ public void testSetScanResultsPasspoint_differentiatesHomeAndRoaming() {
+ WifiConfiguration spyConfig = spy(new WifiConfiguration());
+ when(spyConfig.isPasspoint()).thenReturn(true);
+ AccessPoint passpointAccessPoint = new AccessPoint(mContext, spyConfig,
+ mScanResults, mRoamingScans);
+ assertThat(AccessPoint.removeDoubleQuotes(spyConfig.SSID)).isEqualTo(TEST_SSID);
+
+ passpointAccessPoint.setScanResultsPasspoint(null, mRoamingScans);
+ assertThat(AccessPoint.removeDoubleQuotes(spyConfig.SSID)).isEqualTo(ROAMING_SSID);
+
+ passpointAccessPoint.setScanResultsPasspoint(mScanResults, null);
+ assertThat(AccessPoint.removeDoubleQuotes(spyConfig.SSID)).isEqualTo(TEST_SSID);
+ }
+
+ /**
+ * Verifies that getScanResults returns both home and roaming scans.
+ */
+ @Test
+ public void testGetScanResults_showsHomeAndRoamingScans() {
+ WifiConfiguration spyConfig = spy(new WifiConfiguration());
+ when(spyConfig.isPasspoint()).thenReturn(true);
+ AccessPoint passpointAccessPoint = new AccessPoint(mContext, spyConfig,
+ mScanResults, mRoamingScans);
+ Set<ScanResult> fullSet = new ArraySet<>();
+ fullSet.addAll(mScanResults);
+ fullSet.addAll(mRoamingScans);
+ assertThat(passpointAccessPoint.getScanResults()).isEqualTo(fullSet);
+ }
+
+ /**
+ * Verifies that the Passpoint AccessPoint takes the ssid of the strongest scan result.
+ */
+ @Test
+ public void testPasspointAccessPoint_setsBestSsid() {
+ WifiConfiguration spyConfig = spy(new WifiConfiguration());
+ when(spyConfig.isPasspoint()).thenReturn(true);
+
+ String badSsid = "badSsid";
+ String goodSsid = "goodSsid";
+ String bestSsid = "bestSsid";
+ ScanResult badScanResult = createScanResult(badSsid, TEST_BSSID, -100);
+ ScanResult goodScanResult = createScanResult(goodSsid, TEST_BSSID, -10);
+ ScanResult bestScanResult = createScanResult(bestSsid, TEST_BSSID, -1);
+
+ AccessPoint passpointAccessPoint = new AccessPoint(mContext, spyConfig,
+ Arrays.asList(badScanResult, goodScanResult), null);
+ assertThat(passpointAccessPoint.getConfig().SSID)
+ .isEqualTo(AccessPoint.convertToQuotedString(goodSsid));
+ passpointAccessPoint.setScanResultsPasspoint(
+ Arrays.asList(badScanResult, goodScanResult, bestScanResult), null);
+ assertThat(passpointAccessPoint.getConfig().SSID)
+ .isEqualTo(AccessPoint.convertToQuotedString(bestSsid));
+ }
+
+ /**
+ * Verifies that the OSU AccessPoint constructor creates AccessPoints whose isOsuProvider()
+ * returns true.
+ */
+ @Test
+ public void testOsuAccessPointConstructor_createdAccessPointIsOsuProvider() {
+ AccessPoint osuAccessPoint = new AccessPoint(mContext, createOsuProvider(),
+ mScanResults);
+
+ assertThat(osuAccessPoint.isOsuProvider()).isTrue();
+ }
+
+ /**
+ * Verifies that the summary of an OSU entry only shows the tap_to_sign_up string.
+ */
+ @Test
+ public void testOsuAccessPointSummary_showsTapToSignUp() {
+ AccessPoint osuAccessPoint = new AccessPoint(mContext, createOsuProvider(),
+ mScanResults);
+
+ assertThat(osuAccessPoint.getSummary())
+ .isEqualTo(mContext.getString(R.string.tap_to_sign_up));
+ }
+
+ @Test
+ public void testOsuAccessPointSummary_showsProvisioningUpdates() {
+ AccessPoint osuAccessPoint = new AccessPoint(mContext, createOsuProvider(),
+ mScanResults);
+
+ osuAccessPoint.setListener(mMockAccessPointListener);
+
+ AccessPoint.AccessPointProvisioningCallback provisioningCallback =
+ osuAccessPoint.new AccessPointProvisioningCallback();
+
+ int[] openingProviderStatuses = {
+ ProvisioningCallback.OSU_STATUS_AP_CONNECTING,
+ ProvisioningCallback.OSU_STATUS_AP_CONNECTED,
+ ProvisioningCallback.OSU_STATUS_SERVER_CONNECTING,
+ ProvisioningCallback.OSU_STATUS_SERVER_VALIDATED,
+ ProvisioningCallback.OSU_STATUS_SERVER_CONNECTED,
+ ProvisioningCallback.OSU_STATUS_INIT_SOAP_EXCHANGE,
+ ProvisioningCallback.OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE
+ };
+ int[] completingSignUpStatuses = {
+ ProvisioningCallback.OSU_STATUS_REDIRECT_RESPONSE_RECEIVED,
+ ProvisioningCallback.OSU_STATUS_SECOND_SOAP_EXCHANGE,
+ ProvisioningCallback.OSU_STATUS_THIRD_SOAP_EXCHANGE,
+ ProvisioningCallback.OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS,
+ };
+
+ for (int status : openingProviderStatuses) {
+ provisioningCallback.onProvisioningStatus(status);
+ assertThat(osuAccessPoint.getSummary())
+ .isEqualTo(String.format(mContext.getString(R.string.osu_opening_provider),
+ OSU_FRIENDLY_NAME));
+ }
+
+ provisioningCallback.onProvisioningFailure(0);
+ assertThat(osuAccessPoint.getSummary())
+ .isEqualTo(mContext.getString(R.string.osu_connect_failed));
+
+ for (int status : completingSignUpStatuses) {
+ provisioningCallback.onProvisioningStatus(status);
+ assertThat(osuAccessPoint.getSummary())
+ .isEqualTo(mContext.getString(R.string.osu_completing_sign_up));
+ }
+
+ provisioningCallback.onProvisioningFailure(0);
+ assertThat(osuAccessPoint.getSummary())
+ .isEqualTo(mContext.getString(R.string.osu_sign_up_failed));
+
+ provisioningCallback.onProvisioningComplete();
+ assertThat(osuAccessPoint.getSummary())
+ .isEqualTo(mContext.getString(R.string.osu_sign_up_complete));
+ }
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
index 7d227883b1fe..edf414ddf323 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
@@ -1155,8 +1155,7 @@ public class WifiTrackerTest {
providersAndScans, cachedAccessPoints);
// Verify second update AP is the same object as the first update AP
- assertTrue(osuAccessPointsFirstUpdate.get(0)
- == osuAccessPointsSecondUpdate.get(0));
+ assertThat(osuAccessPointsFirstUpdate.get(0)).isSameAs(osuAccessPointsSecondUpdate.get(0));
// Verify second update AP has the average of the first and second update RSSIs
assertThat(osuAccessPointsSecondUpdate.get(0).getRssi())
.isEqualTo((prevRssi + newRssi) / 2);