Loading core/java/android/net/ConnectivityManager.java +16 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); } } /** Loading Loading @@ -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"); Loading Loading @@ -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()); Loading @@ -3319,7 +3327,7 @@ public class ConnectivityManager { // Only remove mapping if rpc was successful. sCallbacks.remove(r); } networkCallback.networkRequest = null; networkCallback.networkRequest = ALREADY_UNREGISTERED; } } Loading packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +8 −5 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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) { Loading Loading @@ -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: Loading Loading @@ -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. Loading Loading
core/java/android/net/ConnectivityManager.java +16 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); } } /** Loading Loading @@ -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"); Loading Loading @@ -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()); Loading @@ -3319,7 +3327,7 @@ public class ConnectivityManager { // Only remove mapping if rpc was successful. sCallbacks.remove(r); } networkCallback.networkRequest = null; networkCallback.networkRequest = ALREADY_UNREGISTERED; } } Loading
packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +8 −5 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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) { Loading Loading @@ -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: Loading Loading @@ -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. Loading