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

Commit 4333899a authored by lucaslin's avatar lucaslin
Browse files

Improve partial connectivity

Improve the design and fix some nits.

Bug: 113450764
Test: 1. Build pass
      2. atest FrameworksNetTests
      3. atest NetworkStackTests
      4. Change captive_portal_https_url to https://invalid.com
      to simulate partial connectivity.
Change-Id: Ia56645841d00d2ed8406cfeacb86a4a27fd58650
parent 13f15b37
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ oneway interface INetworkMonitor {
    void start();
    void launchCaptivePortalApp();
    void notifyCaptivePortalAppFinished(int response);
    void notifyAcceptPartialConnectivity();
    void setAcceptPartialConnectivity();
    void forceReevaluation(int uid);
    void notifyPrivateDnsChanged(in PrivateDnsConfigParcel config);
    void notifyDnsResponse(int returnCode);
+2 −2
Original line number Diff line number Diff line
@@ -253,9 +253,9 @@ public class NetworkStackService extends Service {
        }

        @Override
        public void notifyAcceptPartialConnectivity() {
        public void setAcceptPartialConnectivity() {
            checkNetworkStackCallingPermission();
            mNm.notifyAcceptPartialConnectivity();
            mNm.setAcceptPartialConnectivity();
        }

        @Override
+24 −7
Original line number Diff line number Diff line
@@ -319,7 +319,8 @@ public class NetworkMonitor extends StateMachine {
    private final DnsStallDetector mDnsStallDetector;
    private long mLastProbeTime;
    // Set to true if data stall is suspected and reset to false after metrics are sent to statsd.
    private boolean mCollectDataStallMetrics = false;
    private boolean mCollectDataStallMetrics;
    private boolean mAcceptPartialConnectivity;

    public NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
            SharedLog validationLog) {
@@ -386,10 +387,11 @@ public class NetworkMonitor extends StateMachine {
    }

    /**
     * ConnectivityService notifies NetworkMonitor that the user accepts partial connectivity and
     * NetworkMonitor should ignore the https probe.
     * ConnectivityService notifies NetworkMonitor that the user already accepted partial
     * connectivity previously, so NetworkMonitor can validate the network even if it has partial
     * connectivity.
     */
    public void notifyAcceptPartialConnectivity() {
    public void setAcceptPartialConnectivity() {
        sendMessage(EVENT_ACCEPT_PARTIAL_CONNECTIVITY);
    }

@@ -651,9 +653,11 @@ public class NetworkMonitor extends StateMachine {
                case EVENT_DNS_NOTIFICATION:
                    mDnsStallDetector.accumulateConsecutiveDnsTimeoutCount(message.arg1);
                    break;
                // Set mAcceptPartialConnectivity to true and if network start evaluating or
                // re-evaluating and get the result of partial connectivity, ProbingState will
                // disable HTTPS probe and transition to EvaluatingPrivateDnsState.
                case EVENT_ACCEPT_PARTIAL_CONNECTIVITY:
                    mUseHttps = false;
                    transitionTo(mEvaluatingPrivateDnsState);
                    mAcceptPartialConnectivity = true;
                    break;
                default:
                    break;
@@ -849,6 +853,14 @@ public class NetworkMonitor extends StateMachine {
                    // ignore any re-evaluation requests. After, restart the
                    // evaluation process via EvaluatingState#enter.
                    return (mEvaluateAttempts < IGNORE_REEVALUATE_ATTEMPTS) ? HANDLED : NOT_HANDLED;
                // Disable HTTPS probe and transition to EvaluatingPrivateDnsState because:
                // 1. Network is connected and finish the network validation.
                // 2. NetworkMonitor detects network is partial connectivity and user accepts it.
                case EVENT_ACCEPT_PARTIAL_CONNECTIVITY:
                    mAcceptPartialConnectivity = true;
                    mUseHttps = false;
                    transitionTo(mEvaluatingPrivateDnsState);
                    return HANDLED;
                default:
                    return NOT_HANDLED;
            }
@@ -1081,7 +1093,12 @@ public class NetworkMonitor extends StateMachine {
                        logNetworkEvent(NetworkEvent.NETWORK_PARTIAL_CONNECTIVITY);
                        notifyNetworkTested(NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY,
                                probeResult.redirectUrl);
                        if (mAcceptPartialConnectivity) {
                            mUseHttps = false;
                            transitionTo(mEvaluatingPrivateDnsState);
                        } else {
                            transitionTo(mWaitingForNextProbeState);
                        }
                    } else {
                        logNetworkEvent(NetworkEvent.NETWORK_VALIDATION_FAILED);
                        notifyNetworkTested(NETWORK_TEST_RESULT_INVALID, probeResult.redirectUrl);
+1 −1
Original line number Diff line number Diff line
@@ -583,7 +583,7 @@ public class NetworkMonitorTest {
        verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1))
                .notifyNetworkTested(NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY, null);

        nm.notifyAcceptPartialConnectivity();
        nm.setAcceptPartialConnectivity();
        verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1))
                .notifyNetworkTested(NETWORK_TEST_RESULT_VALID, null);
    }
+12 −22
Original line number Diff line number Diff line
@@ -2552,19 +2552,11 @@ public class ConnectivityService extends IConnectivityManager.Stub

                    final boolean partialConnectivity =
                            (msg.arg1 == NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY)
                                    // If user accepts partial connectivity network, NetworkMonitor
                                    // will skip https probing. It will make partial connectivity
                                    // network becomes valid. But user still need to know this
                                    // network is limited. So, it's needed to refer to
                                    // acceptPartialConnectivity to add
                                    // NET_CAPABILITY_PARTIAL_CONNECTIVITY into NetworkCapabilities
                                    // of this network. So that user can see "Limited connection"
                                    // in the settings.
                                    || (nai.networkMisc.acceptPartialConnectivity
                                            && nai.partialConnectivity);
                    // Once a network is determined to have partial connectivity, it cannot
                    // go back to full connectivity without a disconnect.
                    final boolean partialConnectivityChange =
                    final boolean partialConnectivityChanged =
                            (partialConnectivity && !nai.partialConnectivity);

                    final boolean valid = (msg.arg1 == NETWORK_TEST_RESULT_VALID);
@@ -2575,17 +2567,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
                        nai.captivePortalLoginNotified = true;
                        showNetworkNotification(nai, NotificationType.LOGGED_IN);
                    }
                    // If this network has just connected and partial connectivity has just been
                    // detected, tell NetworkMonitor if the user accepted partial connectivity on a
                    // previous connect.
                    if ((msg.arg1 == NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY)
                            && nai.networkMisc.acceptPartialConnectivity) {
                        try {
                            nai.networkMonitor().notifyAcceptPartialConnectivity();
                        } catch (RemoteException e) {
                            e.rethrowFromSystemServer();
                        }
                    }

                    final String redirectUrl = (msg.obj instanceof String) ? (String) msg.obj : "";

@@ -2615,7 +2596,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
                            mNotifier.clearNotification(nai.network.netId,
                                    NotificationType.LOST_INTERNET);
                        }
                    } else if (partialConnectivityChange) {
                    } else if (partialConnectivityChanged) {
                        nai.partialConnectivity = partialConnectivity;
                        updateCapabilities(nai.getCurrentScore(), nai, nai.networkCapabilities);
                    }
@@ -3369,8 +3350,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
            // Tear down the network.
            teardownUnneededNetwork(nai);
        } else {
            // Inform NetworkMonitor that partial connectivity is acceptable. This will likely
            // result in a partial connectivity result which will be processed by
            // maybeHandleNetworkMonitorMessage.
            try {
                nai.networkMonitor().notifyAcceptPartialConnectivity();
                nai.networkMonitor().setAcceptPartialConnectivity();
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
            }
@@ -3578,6 +3562,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
        // because we're already prompting the user to sign in.
        if (nai == null || nai.everValidated || nai.everCaptivePortalDetected
                || !nai.networkMisc.explicitlySelected || nai.networkMisc.acceptUnvalidated
                // TODO: Once the value of acceptPartialConnectivity is moved to IpMemoryStore,
                // we should reevaluate how to handle acceptPartialConnectivity when network just
                // connected.
                || nai.networkMisc.acceptPartialConnectivity) {
            return;
        }
@@ -6386,6 +6373,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
            // NetworkMonitor seeing the correct LinkProperties when starting.
            // TODO: pass LinkProperties to the NetworkMonitor in the notifyNetworkConnected call.
            try {
                if (networkAgent.networkMisc.acceptPartialConnectivity) {
                    networkAgent.networkMonitor().setAcceptPartialConnectivity();
                }
                networkAgent.networkMonitor().notifyNetworkConnected();
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
Loading