Merge "Notify WifiManager of interface state changes" into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-28 09:49:41 +00:00
committed by Android (Google) Code Review
3 changed files with 44 additions and 6 deletions

View File

@@ -218,6 +218,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
return (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); return (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
} }
private WifiManager getWifiManager() {
return (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
}
private void updateConfiguration() { private void updateConfiguration() {
mConfig = new TetheringConfiguration(mContext); mConfig = new TetheringConfiguration(mContext);
} }
@@ -396,8 +400,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
private int setWifiTethering(final boolean enable) { private int setWifiTethering(final boolean enable) {
synchronized (mPublicSync) { synchronized (mPublicSync) {
mWifiTetherRequested = enable; mWifiTetherRequested = enable;
final WifiManager wifiManager = final WifiManager wifiManager = getWifiManager();
(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
if ((enable && wifiManager.startSoftAp(null /* use existing wifi config */)) || if ((enable && wifiManager.startSoftAp(null /* use existing wifi config */)) ||
(!enable && wifiManager.stopSoftAp())) { (!enable && wifiManager.stopSoftAp())) {
return ConnectivityManager.TETHER_ERROR_NO_ERROR; return ConnectivityManager.TETHER_ERROR_NO_ERROR;
@@ -1421,12 +1424,37 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
} else { } else {
mForwardedDownstreams.remove(who); mForwardedDownstreams.remove(who);
} }
// If this is a Wi-Fi interface, notify WifiManager of the active serving state.
if (who.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
final WifiManager mgr = getWifiManager();
final String iface = who.interfaceName();
switch (mode) {
case IControlsTethering.STATE_TETHERED:
mgr.updateInterfaceIpState(iface, WifiManager.IFACE_IP_MODE_TETHERED);
break;
case IControlsTethering.STATE_LOCAL_ONLY:
mgr.updateInterfaceIpState(iface, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
break;
default:
Log.wtf(TAG, "Unknown active serving mode: " + mode);
break;
}
}
} }
private void handleInterfaceServingStateInactive(TetherInterfaceStateMachine who) { private void handleInterfaceServingStateInactive(TetherInterfaceStateMachine who) {
mNotifyList.remove(who); mNotifyList.remove(who);
mIPv6TetheringCoordinator.removeActiveDownstream(who); mIPv6TetheringCoordinator.removeActiveDownstream(who);
mForwardedDownstreams.remove(who); mForwardedDownstreams.remove(who);
// If this is a Wi-Fi interface, tell WifiManager of any errors.
if (who.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
if (who.lastError() != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
getWifiManager().updateInterfaceIpState(
who.interfaceName(), WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR);
}
}
} }
class InitialState extends State { class InitialState extends State {
@@ -1743,7 +1771,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
public void notifyInterfaceStateChange(String iface, TetherInterfaceStateMachine who, public void notifyInterfaceStateChange(String iface, TetherInterfaceStateMachine who,
int state, int error) { int state, int error) {
synchronized (mPublicSync) { synchronized (mPublicSync) {
TetherState tetherState = mTetherStates.get(iface); final TetherState tetherState = mTetherStates.get(iface);
if (tetherState != null && tetherState.stateMachine.equals(who)) { if (tetherState != null && tetherState.stateMachine.equals(who)) {
tetherState.lastState = state; tetherState.lastState = state;
tetherState.lastError = error; tetherState.lastError = error;

View File

@@ -117,9 +117,11 @@ public class TetherInterfaceStateMachine extends StateMachine {
setInitialState(mInitialState); setInitialState(mInitialState);
} }
public int interfaceType() { public String interfaceName() { return mIfaceName; }
return mInterfaceType;
} public int interfaceType() { return mInterfaceType; }
public int lastError() { return mLastError; }
// configured when we start tethering and unconfig'd on error or conclusion // configured when we start tethering and unconfig'd on error or conclusion
private boolean configureIfaceIp(boolean enabled) { private boolean configureIfaceIp(boolean enabled) {

View File

@@ -236,6 +236,9 @@ public class TetheringTest {
verify(mNMService, times(1)).setIpForwardingEnabled(true); verify(mNMService, times(1)).setIpForwardingEnabled(true);
verify(mNMService, times(1)).startTethering(any(String[].class)); verify(mNMService, times(1)).startTethering(any(String[].class));
verifyNoMoreInteractions(mNMService); verifyNoMoreInteractions(mNMService);
verify(mWifiManager).updateInterfaceIpState(
mTestIfname, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
verifyNoMoreInteractions(mWifiManager);
verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY); verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY);
// UpstreamNetworkMonitor will be started, and will register two callbacks: // UpstreamNetworkMonitor will be started, and will register two callbacks:
// a "listen all" and a "track default". // a "listen all" and a "track default".
@@ -261,6 +264,7 @@ public class TetheringTest {
verify(mNMService, times(1)).stopTethering(); verify(mNMService, times(1)).stopTethering();
verify(mNMService, times(1)).setIpForwardingEnabled(false); verify(mNMService, times(1)).setIpForwardingEnabled(false);
verifyNoMoreInteractions(mNMService); verifyNoMoreInteractions(mNMService);
verifyNoMoreInteractions(mWifiManager);
// Asking for the last error after the per-interface state machine // Asking for the last error after the per-interface state machine
// has been reaped yields an unknown interface error. // has been reaped yields an unknown interface error.
assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE, assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE,
@@ -292,6 +296,9 @@ public class TetheringTest {
verify(mNMService, times(1)).setIpForwardingEnabled(true); verify(mNMService, times(1)).setIpForwardingEnabled(true);
verify(mNMService, times(1)).startTethering(any(String[].class)); verify(mNMService, times(1)).startTethering(any(String[].class));
verifyNoMoreInteractions(mNMService); verifyNoMoreInteractions(mNMService);
verify(mWifiManager).updateInterfaceIpState(
mTestIfname, WifiManager.IFACE_IP_MODE_TETHERED);
verifyNoMoreInteractions(mWifiManager);
verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_ACTIVE_TETHER); verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_ACTIVE_TETHER);
// UpstreamNetworkMonitor will be started, and will register two callbacks: // UpstreamNetworkMonitor will be started, and will register two callbacks:
// a "listen all" and a "track default". // a "listen all" and a "track default".
@@ -338,6 +345,7 @@ public class TetheringTest {
verify(mNMService, times(1)).stopTethering(); verify(mNMService, times(1)).stopTethering();
verify(mNMService, times(1)).setIpForwardingEnabled(false); verify(mNMService, times(1)).setIpForwardingEnabled(false);
verifyNoMoreInteractions(mNMService); verifyNoMoreInteractions(mNMService);
verifyNoMoreInteractions(mWifiManager);
// Asking for the last error after the per-interface state machine // Asking for the last error after the per-interface state machine
// has been reaped yields an unknown interface error. // has been reaped yields an unknown interface error.
assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE, assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE,