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

Commit c649a997 authored by Hugo Benichi's avatar Hugo Benichi Committed by Android (Google) Code Review
Browse files

Merge changes I4d2be5d9,I34706201 into oc-dr1-dev

* changes:
  Better errors from unregisterNetworkCallback
  CaptivePortalLogin correctly unregisters callbacks
parents e20bfea3 9c2acc17
Loading
Loading
Loading
Loading
+16 −8
Original line number Diff line number Diff line
@@ -601,6 +601,15 @@ public class ConnectivityManager {
     */
    public final static int REQUEST_ID_UNSET = 0;

    /**
     * Static unique request used as a tombstone for NetworkCallbacks that have been unregistered.
     * This allows to distinguish when unregistering NetworkCallbacks those that were never
     * registered and those that were already unregistered.
     * @hide
     */
    private final static NetworkRequest ALREADY_UNREGISTERED =
            new NetworkRequest.Builder().clearCapabilities().build();

    /**
     * A NetID indicating no Network is selected.
     * Keep in sync with bionic/libc/dns/include/resolv_netid.h
@@ -2686,10 +2695,6 @@ public class ConnectivityManager {
        public void onNetworkResumed(Network network) {}

        private NetworkRequest networkRequest;

        private boolean isRegistered() {
            return (networkRequest != null) && (networkRequest.requestId != REQUEST_ID_UNSET);
        }
    }

    /**
@@ -2856,7 +2861,8 @@ public class ConnectivityManager {
        final NetworkRequest request;
        try {
            synchronized(sCallbacks) {
                if (callback.isRegistered()) {
                if (callback.networkRequest != null
                        && callback.networkRequest != ALREADY_UNREGISTERED) {
                    // TODO: throw exception instead and enforce 1:1 mapping of callbacks
                    // and requests (http://b/20701525).
                    Log.e(TAG, "NetworkCallback was already registered");
@@ -3302,8 +3308,10 @@ public class ConnectivityManager {
        // Find all requests associated to this callback and stop callback triggers immediately.
        // Callback is reusable immediately. http://b/20701525, http://b/35921499.
        synchronized (sCallbacks) {
            Preconditions.checkArgument(
                    networkCallback.isRegistered(), "NetworkCallback was not registered");
            Preconditions.checkArgument(networkCallback.networkRequest != null,
                    "NetworkCallback was not registered");
            Preconditions.checkArgument(networkCallback.networkRequest != ALREADY_UNREGISTERED,
                    "NetworkCallback was already unregistered");
            for (Map.Entry<NetworkRequest, NetworkCallback> e : sCallbacks.entrySet()) {
                if (e.getValue() == networkCallback) {
                    reqs.add(e.getKey());
@@ -3319,7 +3327,7 @@ public class ConnectivityManager {
                // Only remove mapping if rpc was successful.
                sCallbacks.remove(r);
            }
            networkCallback.networkRequest = null;
            networkCallback.networkRequest = ALREADY_UNREGISTERED;
        }
    }

+8 −5
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ import java.lang.InterruptedException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;

public class CaptivePortalLoginActivity extends Activity {
    private static final String TAG = CaptivePortalLoginActivity.class.getSimpleName();
@@ -82,6 +83,8 @@ public class CaptivePortalLoginActivity extends Activity {
    private ConnectivityManager mCm;
    private boolean mLaunchBrowser = false;
    private MyWebViewClient mWebViewClient;
    // Ensures that done() happens once exactly, handling concurrent callers with atomic operations.
    private final AtomicBoolean isDone = new AtomicBoolean(false);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
@@ -178,13 +181,13 @@ public class CaptivePortalLoginActivity extends Activity {
    }

    private void done(Result result) {
        if (isDone.getAndSet(true)) {
            // isDone was already true: done() already called
            return;
        }
        if (DBG) {
            Log.d(TAG, String.format("Result %s for %s", result.name(), mUrl.toString()));
        }
        if (mNetworkCallback != null) {
            mCm.unregisterNetworkCallback(mNetworkCallback);
            mNetworkCallback = null;
        }
        logMetricsEvent(result.metricsEvent);
        switch (result) {
            case DISMISSED:
@@ -244,8 +247,8 @@ public class CaptivePortalLoginActivity extends Activity {
    public void onDestroy() {
        super.onDestroy();
        if (mNetworkCallback != null) {
            // mNetworkCallback is not null if mUrl is not null.
            mCm.unregisterNetworkCallback(mNetworkCallback);
            mNetworkCallback = null;
        }
        if (mLaunchBrowser) {
            // Give time for this network to become default. After 500ms just proceed.