summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsLib/res/values/strings.xml73
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java268
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java51
3 files changed, 340 insertions, 52 deletions
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 9e89b890d583..16bfcc9e739f 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -127,6 +127,79 @@
<!-- Status message of Wi-Fi when an available network is a carrier network. [CHAR LIMIT=NONE] -->
<string name="available_via_carrier">Available via %1$s</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_AP_CONNECTION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_ap_connection">Connection failed</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_URL_INVALID. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_server_url_invalid">Invalid OSU server URL</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_CONNECTION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_server_connection">OSU server connection failed</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_VALIDATION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_server_validation">OSU server validation failed</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_service_provider_verification">Invalid OSU server certificate</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_ABORTED. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_provisioning_aborted">Provisioning aborted</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_NOT_AVAILABLE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_provisioning_not_available">Provisioning not available</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_INVALID_SERVER_URL. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_invalid_server_url">Invalid OSU server URL</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_COMMAND_TYPE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_unexpected_command_type">Unexpected command type</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_unexpected_soap_message_type">Unexpected SOAP message type</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_SOAP_MESSAGE_EXCHANGE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_soap_message_exchange">SOAP message exchange failed</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_START_REDIRECT_LISTENER. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_start_redirect_listener">Redirect listener failed to start</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_timed_out_redirect_listener">Timed out waiting for redirect</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_OSU_ACTIVITY_FOUND. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_osu_activity_found">No OSU activity found</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_unexpected_soap_message_status">Unexpected SOAP message status</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_PPS_MO. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_pps_mo">Failed to find PPS-MO</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_aaa_server_trust_root_node">Failed to find trust root node for AAA server</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_remediation_server_trust_root_node">Failed to find trust root node for remediation server</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_policy_server_trust_root_node">Failed to find trust root node for policy server</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_retrieve_trust_root_certificates">Failed to retrieve trust root certificates</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_no_aaa_trust_root_certificate">Failed to find trust root certificate for AAA server</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_add_passpoint_configuration">Failed to add PassPoint configuration</string>
+ <!-- Status message of OSU Provider on receiving OSU_FAILURE_OSU_PROVIDER_NOT_FOUND. [CHAR LIMIT=NONE] -->
+ <string name="osu_failure_osu_provider_not_found">Failed to find an OSU provider</string>
+
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTING. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_ap_connecting">Connecting</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTED. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_ap_connected">Connected</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTING. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_server_connecting">Connecting to OSU server</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_VALIDATED. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_server_validated">OSU server validated</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTED. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_server_connected">Connected to OSU server</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_INIT_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_init_soap_exchange">Initial SOAP exchange</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_waiting_for_redirect_response">Waiting for redirect response</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_REDIRECT_RESPONSE_RECEIVED. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_redirect_response_received">Received redirect response</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_SECOND_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_second_soap_exchange">Second SOAP exchange</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_THIRD_SOAP_EXCHANGE. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_third_soap_exchange">Third SOAP exchange</string>
+ <!-- Status message of OSU Provider on receiving OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS. [CHAR LIMIT=NONE] -->
+ <string name="osu_status_retrieving_trust_root_certs">Retrieving trust root certificates</string>
+
+ <!-- Status message of OSU Provider on completing provisioning. [CHAR LIMIT=NONE] -->
+ <string name="osu_provisioning_complete">Provisioning complete</string>
+
<!-- Speed label for very slow network speed -->
<string name="speed_label_very_slow">Very Slow</string>
<!-- Speed label for slow network speed -->
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index a97931a946bf..e2013dff8663 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -43,6 +43,7 @@ import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkScoreCache;
import android.net.wifi.hotspot2.OsuProvider;
import android.net.wifi.hotspot2.PasspointConfiguration;
+import android.net.wifi.hotspot2.ProvisioningCallback;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.RemoteException;
@@ -219,6 +220,11 @@ public class AccessPoint implements Comparable<AccessPoint> {
private boolean mIsCarrierAp = false;
private OsuProvider mOsuProvider;
+
+ private String mOsuStatus;
+ private String mOsuFailure;
+ private boolean mOsuProvisioningComplete = false;
+
/**
* The EAP type {@link WifiEnterpriseConfig.Eap} associated with this AP if it is a carrier AP.
*/
@@ -315,9 +321,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
public AccessPoint(Context context, OsuProvider provider) {
mContext = context;
mOsuProvider = provider;
- mRssi = 1;
- // TODO: This placeholder SSID is here to avoid null pointer exceptions.
- ssid = "<OsuProvider AP SSID goes here>";
+ ssid = provider.getFriendlyName();
updateKey();
}
@@ -358,24 +362,13 @@ public class AccessPoint implements Comparable<AccessPoint> {
/** Updates {@link #mKey} and should only called upon object creation/initialization. */
private void updateKey() {
// TODO(sghuman): Consolidate Key logic on ScanResultMatchInfo
-
- StringBuilder builder = new StringBuilder();
-
if (isPasspoint()) {
- builder.append(KEY_PREFIX_FQDN).append(mConfig.FQDN);
+ mKey = getKey(mConfig);
} else if (isOsuProvider()) {
- builder.append(KEY_PREFIX_OSU).append(mOsuProvider.getOsuSsid());
- builder.append(',').append(mOsuProvider.getServerUri());
+ mKey = getKey(mOsuProvider);
} else { // Non-Passpoint AP
- builder.append(KEY_PREFIX_AP);
- if (TextUtils.isEmpty(getSsidStr())) {
- builder.append(getBssid());
- } else {
- builder.append(getSsidStr());
- }
- builder.append(',').append(getSecurity());
+ mKey = getKey(getSsidStr(), getBssid(), getSecurity());
}
- mKey = builder.toString();
}
/**
@@ -616,34 +609,46 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
public static String getKey(ScanResult result) {
- StringBuilder builder = new StringBuilder();
+ return getKey(result.SSID, result.BSSID, getSecurity(result));
+ }
- builder.append(KEY_PREFIX_AP);
- if (TextUtils.isEmpty(result.SSID)) {
- builder.append(result.BSSID);
+ /**
+ * Returns the AccessPoint key for a WifiConfiguration.
+ * This will return a special Passpoint key if the config is for Passpoint.
+ */
+ public static String getKey(WifiConfiguration config) {
+ if (config.isPasspoint()) {
+ return new StringBuilder()
+ .append(KEY_PREFIX_FQDN)
+ .append(config.FQDN).toString();
} else {
- builder.append(result.SSID);
+ return getKey(config.SSID, config.BSSID, getSecurity(config));
}
+ }
- builder.append(',').append(getSecurity(result));
- return builder.toString();
+ /**
+ * Returns the AccessPoint key corresponding to the OsuProvider.
+ */
+ public static String getKey(OsuProvider provider) {
+ return new StringBuilder()
+ .append(KEY_PREFIX_OSU)
+ .append(provider.getOsuSsid())
+ .append(',')
+ .append(provider.getServerUri()).toString();
}
- public static String getKey(WifiConfiguration config) {
+ /**
+ * Returns the AccessPoint key for a normal non-Passpoint network by ssid/bssid and security.
+ */
+ private static String getKey(String ssid, String bssid, int security) {
StringBuilder builder = new StringBuilder();
-
- if (config.isPasspoint()) {
- builder.append(KEY_PREFIX_FQDN).append(config.FQDN);
+ builder.append(KEY_PREFIX_AP);
+ if (TextUtils.isEmpty(ssid)) {
+ builder.append(bssid);
} else {
- builder.append(KEY_PREFIX_AP);
- if (TextUtils.isEmpty(config.SSID)) {
- builder.append(config.BSSID);
- } else {
- builder.append(removeDoubleQuotes(config.SSID));
- }
- builder.append(',').append(getSecurity(config));
+ builder.append(ssid);
}
-
+ builder.append(',').append(security);
return builder.toString();
}
@@ -881,7 +886,17 @@ public class AccessPoint implements Comparable<AccessPoint> {
// Update to new summary
StringBuilder summary = new StringBuilder();
- if (isActive()) {
+ if (isOsuProvider()) {
+ if (mOsuProvisioningComplete) {
+ summary.append(mContext.getString(R.string.osu_provisioning_complete));
+ } else if (mOsuFailure != null) {
+ summary.append(mOsuFailure);
+ } else if (mOsuStatus != null) {
+ summary.append(mOsuStatus);
+ } else {
+ summary.append(mContext.getString(R.string.tap_to_set_up));
+ }
+ } else if (isActive()) {
if (isPasspoint()) {
// This is the active connection on passpoint
summary.append(getSummary(mContext, ssid, getDetailedState(),
@@ -926,8 +941,6 @@ public class AccessPoint implements Comparable<AccessPoint> {
} else if (mIsCarrierAp) {
summary.append(String.format(mContext.getString(
R.string.available_via_carrier), mCarrierName));
- } else if (isOsuProvider()) {
- summary.append(mContext.getString(R.string.tap_to_set_up));
} else if (!isReachable()) { // Wifi out of range
summary.append(mContext.getString(R.string.wifi_not_in_range));
} else { // In range, not disabled.
@@ -1016,11 +1029,26 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
/**
+ * Starts the OSU Provisioning flow.
+ */
+ public void startOsuProvisioning() {
+ mContext.getSystemService(WifiManager.class).startSubscriptionProvisioning(
+ mOsuProvider,
+ new AccessPointProvisioningCallback(),
+ ThreadUtils.getUiThreadHandler()
+ );
+ }
+
+ /**
* Return whether the given {@link WifiInfo} is for this access point.
* If the current AP does not have a network Id then the config is used to
* match based on SSID and security.
*/
private boolean isInfoForThisAccessPoint(WifiConfiguration config, WifiInfo info) {
+ if (info.isOsuAp()) {
+ return (mOsuStatus != null);
+ }
+
if (isPasspoint() == false && networkId != WifiConfiguration.INVALID_NETWORK_ID) {
return networkId == info.getNetworkId();
} else if (config != null) {
@@ -1493,4 +1521,166 @@ public class AccessPoint implements Comparable<AccessPoint> {
private static boolean isVerboseLoggingEnabled() {
return WifiTracker.sVerboseLogging || Log.isLoggable(TAG, Log.VERBOSE);
}
+
+ /**
+ * Callbacks relaying changes to the OSU provisioning status started in startOsuProvisioning().
+ *
+ * All methods are invoked on the Main Thread
+ */
+ private class AccessPointProvisioningCallback extends ProvisioningCallback {
+ // TODO: Remove logs and implement summary changing logic for these provisioning callbacks.
+ @Override
+ @MainThread public void onProvisioningFailure(int status) {
+ switch (status) {
+ case OSU_FAILURE_AP_CONNECTION:
+ mOsuFailure = mContext.getString(R.string.osu_failure_ap_connection);
+ break;
+ case OSU_FAILURE_SERVER_URL_INVALID:
+ mOsuFailure = mContext.getString(R.string.osu_failure_server_url_invalid);
+ break;
+ case OSU_FAILURE_SERVER_CONNECTION:
+ mOsuFailure = mContext.getString(R.string.osu_failure_server_connection);
+ break;
+ case OSU_FAILURE_SERVER_VALIDATION:
+ mOsuFailure = mContext.getString(R.string.osu_failure_server_validation);
+ break;
+ case OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_service_provider_verification);
+ break;
+ case OSU_FAILURE_PROVISIONING_ABORTED:
+ mOsuFailure = mContext.getString(R.string.osu_failure_provisioning_aborted);
+ break;
+ case OSU_FAILURE_PROVISIONING_NOT_AVAILABLE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_provisioning_not_available);
+ break;
+ case OSU_FAILURE_INVALID_SERVER_URL:
+ mOsuFailure = mContext.getString(R.string.osu_failure_invalid_server_url);
+ break;
+ case OSU_FAILURE_UNEXPECTED_COMMAND_TYPE:
+ mOsuFailure = mContext.getString(R.string.osu_failure_unexpected_command_type);
+ break;
+ case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_unexpected_soap_message_type);
+ break;
+ case OSU_FAILURE_SOAP_MESSAGE_EXCHANGE:
+ mOsuFailure = mContext.getString(R.string.osu_failure_soap_message_exchange);
+ break;
+ case OSU_FAILURE_START_REDIRECT_LISTENER:
+ mOsuFailure = mContext.getString(R.string.osu_failure_start_redirect_listener);
+ break;
+ case OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_timed_out_redirect_listener);
+ break;
+ case OSU_FAILURE_NO_OSU_ACTIVITY_FOUND:
+ mOsuFailure = mContext.getString(R.string.osu_failure_no_osu_activity_found);
+ break;
+ case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_unexpected_soap_message_status);
+ break;
+ case OSU_FAILURE_NO_PPS_MO:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_pps_mo);
+ break;
+ case OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_aaa_server_trust_root_node);
+ break;
+ case OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_remediation_server_trust_root_node);
+ break;
+ case OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_policy_server_trust_root_node);
+ break;
+ case OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_retrieve_trust_root_certificates);
+ break;
+ case OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_no_aaa_trust_root_certificate);
+ break;
+ case OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION:
+ mOsuFailure = mContext.getString(
+ R.string.osu_failure_add_passpoint_configuration);
+ break;
+ case OSU_FAILURE_OSU_PROVIDER_NOT_FOUND:
+ mOsuFailure = mContext.getString(R.string.osu_failure_osu_provider_not_found);
+ break;
+ }
+ mOsuStatus = null;
+ mOsuProvisioningComplete = false;
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(AccessPoint.this);
+ }
+ });
+ }
+
+ @Override
+ @MainThread public void onProvisioningStatus(int status) {
+ switch (status) {
+ case OSU_STATUS_AP_CONNECTING:
+ mOsuStatus = mContext.getString(R.string.osu_status_ap_connecting);
+ break;
+ case OSU_STATUS_AP_CONNECTED:
+ mOsuStatus = mContext.getString(R.string.osu_status_ap_connected);
+ break;
+ case OSU_STATUS_SERVER_CONNECTING:
+ mOsuStatus = mContext.getString(R.string.osu_status_server_connecting);
+ break;
+ case OSU_STATUS_SERVER_VALIDATED:
+ mOsuStatus = mContext.getString(R.string.osu_status_server_validated);
+ break;
+ case OSU_STATUS_SERVER_CONNECTED:
+ mOsuStatus = mContext.getString(R.string.osu_status_server_connected);
+ break;
+ case OSU_STATUS_INIT_SOAP_EXCHANGE:
+ mOsuStatus = mContext.getString(R.string.osu_status_init_soap_exchange);
+ break;
+ case OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE:
+ mOsuStatus = mContext.getString(
+ R.string.osu_status_waiting_for_redirect_response);
+ break;
+ case OSU_STATUS_REDIRECT_RESPONSE_RECEIVED:
+ mOsuStatus = mContext.getString(R.string.osu_status_redirect_response_received);
+ break;
+ case OSU_STATUS_SECOND_SOAP_EXCHANGE:
+ mOsuStatus = mContext.getString(R.string.osu_status_second_soap_exchange);
+ break;
+ case OSU_STATUS_THIRD_SOAP_EXCHANGE:
+ mOsuStatus = mContext.getString(R.string.osu_status_third_soap_exchange);
+ break;
+ case OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS:
+ mOsuStatus = mContext.getString(
+ R.string.osu_status_retrieving_trust_root_certs);
+ break;
+ }
+ mOsuFailure = null;
+ mOsuProvisioningComplete = false;
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(AccessPoint.this);
+ }
+ });
+ }
+
+ @Override
+ @MainThread public void onProvisioningComplete() {
+ mOsuProvisioningComplete = true;
+ mOsuFailure = null;
+ mOsuStatus = null;
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(AccessPoint.this);
+ }
+ });
+ }
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 6d2889121c64..58c93e4727eb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -68,6 +68,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -585,7 +586,6 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
Map<Integer, List<ScanResult>>> pairing : passpointConfigsAndScans) {
WifiConfiguration config = pairing.first;
- // TODO(b/118705403): Prioritize home networks before roaming networks
List<ScanResult> scanResults = new ArrayList<>();
List<ScanResult> homeScans =
@@ -600,8 +600,12 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
roamingScans = new ArrayList<>();
}
- scanResults.addAll(homeScans);
- scanResults.addAll(roamingScans);
+ // TODO(b/118705403): Differentiate home network vs roaming network for summary info
+ if (!homeScans.isEmpty()) {
+ scanResults.addAll(homeScans);
+ } else {
+ scanResults.addAll(roamingScans);
+ }
if (seenFQDNs.add(config.FQDN)) {
int bestRssi = Integer.MIN_VALUE;
@@ -620,19 +624,19 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
}
// Add Passpoint OSU Provider AccessPoints
- // TODO(b/118705403): filter out OSU Providers which we already have credentials from.
Map<OsuProvider, List<ScanResult>> providersAndScans =
mWifiManager.getMatchingOsuProviders(cachedScanResults);
+ Set<OsuProvider> alreadyProvisioned = mWifiManager
+ .getMatchingPasspointConfigsForOsuProviders(
+ providersAndScans.keySet()).keySet();
for (OsuProvider provider : providersAndScans.keySet()) {
- AccessPoint accessPointOsu = new AccessPoint(mContext, provider);
- // TODO(b/118705403): accessPointOsu.setScanResults(Matching ScanResult with best
- // RSSI)
- // TODO(b/118705403): Figure out if we would need to update an OSU AP (this will be
- // used if we need to display it at the top of the picker as the "active" AP).
- // Otherwise, OSU APs should ignore attempts to update the active connection
- // info.
- // accessPointOsu.update(connectionConfig, mLastInfo, mLastNetworkInfo);
- accessPoints.add(accessPointOsu);
+ if (!alreadyProvisioned.contains(provider)) {
+ AccessPoint accessPointOsu =
+ getCachedOrCreateOsu(providersAndScans.get(provider),
+ cachedAccessPoints, provider);
+ accessPointOsu.update(connectionConfig, mLastInfo, mLastNetworkInfo);
+ accessPoints.add(accessPointOsu);
+ }
}
@@ -697,6 +701,27 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
return accessPoint;
}
+ private AccessPoint getCachedOrCreateOsu(
+ List<ScanResult> scanResults,
+ List<AccessPoint> cache,
+ OsuProvider provider) {
+ AccessPoint matchedAccessPoint = null;
+ ListIterator<AccessPoint> lit = cache.listIterator();
+ while (lit.hasNext()) {
+ AccessPoint currentAccessPoint = lit.next();
+ if (currentAccessPoint.getKey().equals(AccessPoint.getKey(provider))) {
+ lit.remove();
+ matchedAccessPoint = currentAccessPoint;
+ break;
+ }
+ }
+ if (matchedAccessPoint == null) {
+ matchedAccessPoint = new AccessPoint(mContext, provider);
+ }
+ matchedAccessPoint.setScanResults(scanResults);
+ return matchedAccessPoint;
+ }
+
private void updateNetworkInfo(NetworkInfo networkInfo) {
/* Sticky broadcasts can call this when wifi is disabled */