Merge "Notify WifiManager of interface state changes" into oc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
0c21500920
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user