Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b746b4d3 authored by Quang Luong's avatar Quang Luong Committed by Android (Google) Code Review
Browse files

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
parents 54fee7e2 919d4646
Loading
Loading
Loading
Loading
+73 −0
Original line number Diff line number Diff line
@@ -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 -->
+229 −39
Original line number Diff line number Diff line
@@ -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());
            mKey = getKey(getSsidStr(), getBssid(), getSecurity());
        }
            builder.append(',').append(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);
        } else {
        builder.append(KEY_PREFIX_AP);
            if (TextUtils.isEmpty(config.SSID)) {
                builder.append(config.BSSID);
        if (TextUtils.isEmpty(ssid)) {
            builder.append(bssid);
        } else {
                builder.append(removeDoubleQuotes(config.SSID));
            builder.append(ssid);
        }
            builder.append(',').append(getSecurity(config));
        }

        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.
@@ -1015,12 +1028,27 @@ public class AccessPoint implements Comparable<AccessPoint> {
        return mOsuProvider != null;
    }

    /**
     * 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);
                }
            });
        }
    }
}
+38 −13

File changed.

Preview size limit exceeded, changes collapsed.