Merge commit '949dcad8' into manualmerge

Conflicts:
	services/java/com/android/server/ConnectivityService.java

Change-Id: I02fee6839c2a8879fb6e885d8fc8483f17d655c2
This commit is contained in:
Irfan Sheriff
2012-08-27 23:03:50 -07:00
4 changed files with 80 additions and 24 deletions

View File

@@ -921,4 +921,15 @@ public class ConnectivityManager {
return false; return false;
} }
} }
/**
* {@hide}
*/
public void captivePortalCheckComplete(NetworkInfo info) {
try {
mService.captivePortalCheckComplete(info);
} catch (RemoteException e) {
}
}
} }

View File

@@ -124,4 +124,6 @@ interface IConnectivityManager
LegacyVpnInfo getLegacyVpnInfo(); LegacyVpnInfo getLegacyVpnInfo();
boolean updateLockdownVpn(); boolean updateLockdownVpn();
void captivePortalCheckComplete(in NetworkInfo info);
} }

View File

@@ -79,7 +79,9 @@ public class NetworkInfo implements Parcelable {
/** Access to this network is blocked. */ /** Access to this network is blocked. */
BLOCKED, BLOCKED,
/** Link has poor connectivity. */ /** Link has poor connectivity. */
VERIFYING_POOR_LINK VERIFYING_POOR_LINK,
/** Checking if network is a captive portal */
CAPTIVE_PORTAL_CHECK,
} }
/** /**
@@ -97,6 +99,7 @@ public class NetworkInfo implements Parcelable {
stateMap.put(DetailedState.AUTHENTICATING, State.CONNECTING); stateMap.put(DetailedState.AUTHENTICATING, State.CONNECTING);
stateMap.put(DetailedState.OBTAINING_IPADDR, State.CONNECTING); stateMap.put(DetailedState.OBTAINING_IPADDR, State.CONNECTING);
stateMap.put(DetailedState.VERIFYING_POOR_LINK, State.CONNECTING); stateMap.put(DetailedState.VERIFYING_POOR_LINK, State.CONNECTING);
stateMap.put(DetailedState.CAPTIVE_PORTAL_CHECK, State.CONNECTING);
stateMap.put(DetailedState.CONNECTED, State.CONNECTED); stateMap.put(DetailedState.CONNECTED, State.CONNECTED);
stateMap.put(DetailedState.SUSPENDED, State.SUSPENDED); stateMap.put(DetailedState.SUSPENDED, State.SUSPENDED);
stateMap.put(DetailedState.DISCONNECTING, State.DISCONNECTING); stateMap.put(DetailedState.DISCONNECTING, State.DISCONNECTING);

View File

@@ -42,6 +42,7 @@ import android.content.IntentFilter;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.net.CaptivePortalTracker;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.DummyDataStateTracker; import android.net.DummyDataStateTracker;
import android.net.EthernetDataTracker; import android.net.EthernetDataTracker;
@@ -166,6 +167,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
*/ */
private NetworkStateTracker mNetTrackers[]; private NetworkStateTracker mNetTrackers[];
/* Handles captive portal check on a network */
private CaptivePortalTracker mCaptivePortalTracker;
/** /**
* The link properties that define the current links * The link properties that define the current links
*/ */
@@ -1363,8 +1367,10 @@ public class ConnectivityService extends IConnectivityManager.Stub {
return false; return false;
} }
NetworkStateTracker tracker = mNetTrackers[networkType]; NetworkStateTracker tracker = mNetTrackers[networkType];
DetailedState netState = tracker.getNetworkInfo().getDetailedState();
if (tracker == null || !tracker.getNetworkInfo().isConnected() || if (tracker == null || (netState != DetailedState.CONNECTED &&
netState != DetailedState.CAPTIVE_PORTAL_CHECK) ||
tracker.isTeardownRequested()) { tracker.isTeardownRequested()) {
if (VDBG) { if (VDBG) {
log("requestRouteToHostAddress on down network " + log("requestRouteToHostAddress on down network " +
@@ -1966,34 +1972,29 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
}; };
private boolean isNewNetTypePreferredOverCurrentNetType(int type) {
if ((type != mNetworkPreference &&
mNetConfigs[mActiveDefaultNetwork].priority >
mNetConfigs[type].priority) ||
mNetworkPreference == mActiveDefaultNetwork) return false;
return true;
}
private void handleConnect(NetworkInfo info) { private void handleConnect(NetworkInfo info) {
final int type = info.getType(); final int newNetType = info.getType();
final NetworkStateTracker thisNet = mNetTrackers[type];
setupDataActivityTracking(type); setupDataActivityTracking(newNetType);
setupDataActivityTracking(type);
// snapshot isFailover, because sendConnectedBroadcast() resets it // snapshot isFailover, because sendConnectedBroadcast() resets it
boolean isFailover = info.isFailover(); boolean isFailover = info.isFailover();
final NetworkStateTracker thisNet = mNetTrackers[newNetType];
final String thisIface = thisNet.getLinkProperties().getInterfaceName(); final String thisIface = thisNet.getLinkProperties().getInterfaceName();
// if this is a default net and other default is running // if this is a default net and other default is running
// kill the one not preferred // kill the one not preferred
if (mNetConfigs[type].isDefault()) { if (mNetConfigs[newNetType].isDefault()) {
if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != type) { if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != newNetType) {
if ((type != mNetworkPreference && if (isNewNetTypePreferredOverCurrentNetType(newNetType)) {
mNetConfigs[mActiveDefaultNetwork].priority >
mNetConfigs[type].priority) ||
mNetworkPreference == mActiveDefaultNetwork) {
// don't accept this one
if (VDBG) {
log("Not broadcasting CONNECT_ACTION " +
"to torn down network " + info.getTypeName());
}
teardown(thisNet);
return;
} else {
// tear down the other // tear down the other
NetworkStateTracker otherNet = NetworkStateTracker otherNet =
mNetTrackers[mActiveDefaultNetwork]; mNetTrackers[mActiveDefaultNetwork];
@@ -2006,6 +2007,14 @@ public class ConnectivityService extends IConnectivityManager.Stub {
teardown(thisNet); teardown(thisNet);
return; return;
} }
} else {
// don't accept this one
if (VDBG) {
log("Not broadcasting CONNECT_ACTION " +
"to torn down network " + info.getTypeName());
}
teardown(thisNet);
return;
} }
} }
synchronized (ConnectivityService.this) { synchronized (ConnectivityService.this) {
@@ -2019,7 +2028,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
1000); 1000);
} }
} }
mActiveDefaultNetwork = type; mActiveDefaultNetwork = newNetType;
// this will cause us to come up initially as unconnected and switching // this will cause us to come up initially as unconnected and switching
// to connected after our normal pause unless somebody reports us as reall // to connected after our normal pause unless somebody reports us as reall
// disconnected // disconnected
@@ -2031,19 +2040,47 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
thisNet.setTeardownRequested(false); thisNet.setTeardownRequested(false);
updateNetworkSettings(thisNet); updateNetworkSettings(thisNet);
handleConnectivityChange(type, false); handleConnectivityChange(newNetType, false);
sendConnectedBroadcastDelayed(info, getConnectivityChangeDelay()); sendConnectedBroadcastDelayed(info, getConnectivityChangeDelay());
// notify battery stats service about this network // notify battery stats service about this network
if (thisIface != null) { if (thisIface != null) {
try { try {
BatteryStatsService.getService().noteNetworkInterfaceType(thisIface, type); BatteryStatsService.getService().noteNetworkInterfaceType(thisIface, newNetType);
} catch (RemoteException e) { } catch (RemoteException e) {
// ignored; service lives in system_server // ignored; service lives in system_server
} }
} }
} }
private void handleCaptivePortalTrackerCheck(NetworkInfo info) {
if (DBG) log("Captive portal check " + info);
int type = info.getType();
final NetworkStateTracker thisNet = mNetTrackers[type];
if (mNetConfigs[type].isDefault()) {
if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != type) {
if (isNewNetTypePreferredOverCurrentNetType(type)) {
if (DBG) log("Captive check on " + info.getTypeName());
mCaptivePortalTracker = CaptivePortalTracker.detect(mContext, info,
ConnectivityService.this);
return;
} else {
if (DBG) log("Tear down low priority net " + info.getTypeName());
teardown(thisNet);
return;
}
}
}
thisNet.captivePortalCheckComplete();
}
/** @hide */
public void captivePortalCheckComplete(NetworkInfo info) {
mNetTrackers[info.getType()].captivePortalCheckComplete();
mCaptivePortalTracker = null;
}
/** /**
* Setup data activity tracking for the given network interface. * Setup data activity tracking for the given network interface.
* *
@@ -2632,6 +2669,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (info.getDetailedState() == if (info.getDetailedState() ==
NetworkInfo.DetailedState.FAILED) { NetworkInfo.DetailedState.FAILED) {
handleConnectionFailure(info); handleConnectionFailure(info);
} else if (info.getDetailedState() ==
DetailedState.CAPTIVE_PORTAL_CHECK) {
handleCaptivePortalTrackerCheck(info);
} else if (state == NetworkInfo.State.DISCONNECTED) { } else if (state == NetworkInfo.State.DISCONNECTED) {
handleDisconnect(info); handleDisconnect(info);
} else if (state == NetworkInfo.State.SUSPENDED) { } else if (state == NetworkInfo.State.SUSPENDED) {