summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Quang Luong <qal@google.com> 2019-01-16 19:10:14 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-01-16 19:10:14 +0000
commitb746b4d385b6d7717135a30b42b11b38a6912bee (patch)
tree0de96a49b98bbfa9cf30e5960775cf5263ed9af6
parent54fee7e2647d6ac6d584c9cd01a6c695a3fd718c (diff)
parent919d4646add6bddfc1c9b6e06198db4726d4eed4 (diff)
Merge changes from topics "osu-at-the-top", "osu-provisioning-support"
* changes: Set connected OSU network to active AP at top of wifi picker Add correct RSSI for OSU entries in wifi picker Prioritize Passpoint home network over roaming network in wifi picker Added AccessPoint cache integration for OSU AccessPoints Display summary for OSU provisioning status and failures Added OSU provisioning support Removed OSU Provider APs of already provisioned Passpoint networks
-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 */