diff options
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 */ |