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

Commit 4fea0413 authored by Wink Saville's avatar Wink Saville
Browse files

Tighten test for warm sim and add more debug.

- Require a non-204 response multiple times before declaring a
redirected error and hence a warm sim.

- If there is no connection or dns don't declare its a warm-sim.

- Add printing of the http headers to try to get more information
if we still get a false positive result.


Bug: 9972012
Change-Id: Ic115685cdbbe39c2b4de88b128eaf8d2ea96b45c
parent dc8d7048
Loading
Loading
Loading
Loading
+40 −25
Original line number Diff line number Diff line
@@ -3911,39 +3911,41 @@ public class ConnectivityService extends IConnectivityManager.Stub {

    /**
     * No connection was possible to the network.
     * This is NOT a warm sim.
     */
    public static final int CMP_RESULT_CODE_NO_CONNECTION = 0;
    private static final int CMP_RESULT_CODE_NO_CONNECTION = 0;

    /**
     * A connection was made to the internet, all is well.
     * This is NOT a warm sim.
     */
    public static final int CMP_RESULT_CODE_CONNECTABLE = 1;
    private static final int CMP_RESULT_CODE_CONNECTABLE = 1;

    /**
     * A connection was made but there was a redirection, we appear to be in walled garden.
     * This is an indication of a warm sim on a mobile network.
     * A connection was made but no dns server was available to resolve a name to address.
     * This is NOT a warm sim since provisioning network is supported.
     */
    public static final int CMP_RESULT_CODE_REDIRECTED = 2;
    private static final int CMP_RESULT_CODE_NO_DNS = 2;

    /**
     * A connection was made but no dns server was available to resolve a name to address.
     * This is an indication of a warm sim on a mobile network.
     * A connection was made but could not open a TCP connection.
     * This is NOT a warm sim since provisioning network is supported.
     */
    public static final int CMP_RESULT_CODE_NO_DNS = 3;
    private static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 3;

    /**
     * A connection was made but could not open a TCP connection.
     * This is an indication of a warm sim on a mobile network.
     * A connection was made but there was a redirection, we appear to be in walled garden.
     * This is an indication of a warm sim on a mobile network such as T-Mobile.
     */
    public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4;
    private static final int CMP_RESULT_CODE_REDIRECTED = 4;

    /**
     * The mobile network is a provisioning network.
     * This is an indication of a warm sim on a mobile network.
     * This is an indication of a warm sim on a mobile network such as AT&T.
     */
    public static final int CMP_RESULT_CODE_PROVISIONING_NETWORK = 5;
    private static final int CMP_RESULT_CODE_PROVISIONING_NETWORK = 5;

    AtomicBoolean mIsCheckingMobileProvisioning = new AtomicBoolean(false);
    private AtomicBoolean mIsCheckingMobileProvisioning = new AtomicBoolean(false);

    @Override
    public int checkMobileProvisioning(int suggestedTimeOutMs) {
@@ -4018,7 +4020,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                            mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI].getNetworkInfo();
                    switch(result) {
                        case CMP_RESULT_CODE_CONNECTABLE:
                        case CMP_RESULT_CODE_NO_CONNECTION: {
                        case CMP_RESULT_CODE_NO_CONNECTION:
                        case CMP_RESULT_CODE_NO_DNS:
                        case CMP_RESULT_CODE_NO_TCP_CONNECTION: {
                            if (DBG) log("CheckMp.onComplete: ignore, connected or no connection");
                            break;
                        }
@@ -4037,8 +4041,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                            }
                            break;
                        }
                        case CMP_RESULT_CODE_NO_DNS:
                        case CMP_RESULT_CODE_NO_TCP_CONNECTION: {
                        case CMP_RESULT_CODE_PROVISIONING_NETWORK: {
                            String url = getMobileProvisioningUrl();
                            if (TextUtils.isEmpty(url) == false) {
                                if (DBG) log("CheckMp.onComplete: warm (no dns/tcp), url=" + url);
@@ -4204,8 +4207,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                        MobileDataStateTracker mdst = (MobileDataStateTracker)
                                mCs.mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI];
                        if (mdst.isProvisioningNetwork()) {
                            if (DBG) log("isMobileOk: isProvisioningNetwork is true, no TCP conn");
                            result = CMP_RESULT_CODE_NO_TCP_CONNECTION;
                            if (DBG) log("isMobileOk: isProvisioningNetwork is true");
                            result = CMP_RESULT_CODE_PROVISIONING_NETWORK;
                            return result;
                        } else {
                            if (DBG) log("isMobileOk: isProvisioningNetwork is false, continue");
@@ -4285,25 +4288,37 @@ public class ConnectivityService extends IConnectivityManager.Stub {
                                urlConn.setAllowUserInteraction(false);
                                urlConn.setRequestProperty("Connection", "close");
                                int responseCode = urlConn.getResponseCode();

                                // For debug display the headers
                                Map<String, List<String>> headers = urlConn.getHeaderFields();
                                log("isMobileOk: headers=" + headers);

                                // Close the connection
                                urlConn.disconnect();
                                urlConn = null;

                                if (responseCode == 204) {
                                    // Return
                                    log("isMobileOk: expected responseCode=" + responseCode);
                                    result = CMP_RESULT_CODE_CONNECTABLE;
                                    return result;
                                } else {
                                    // Retry to be sure this was redirected, we've gotten
                                    // occasions where a server returned 200 even though
                                    // the device didn't have a "warm" sim.
                                    log("isMobileOk: not expected responseCode=" + responseCode);
                                    result = CMP_RESULT_CODE_REDIRECTED;
                                }
                                log("isMobileOk: connected responseCode=" + responseCode);
                                urlConn.disconnect();
                                urlConn = null;
                                return result;
                            } catch (Exception e) {
                                log("isMobileOk: HttpURLConnection Exception e=" + e);
                                result = CMP_RESULT_CODE_NO_TCP_CONNECTION;
                                if (urlConn != null) {
                                    urlConn.disconnect();
                                    urlConn = null;
                                }
                            }
                        }
                        result = CMP_RESULT_CODE_NO_TCP_CONNECTION;
                        log("isMobileOk: loops|timed out");
                        log("isMobileOk: loops|timed out result=" + result);
                        return result;
                    } catch (Exception e) {
                        log("isMobileOk: Exception e=" + e);