Merge "Prepare UpstreamNetworkMonitor for extraction"

This commit is contained in:
Erik Kline
2017-01-11 08:29:17 +00:00
committed by Gerrit Code Review

View File

@@ -199,7 +199,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper); mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper);
mTetherMasterSM.start(); mTetherMasterSM.start();
mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
mStateReceiver = new StateReceiver(); mStateReceiver = new StateReceiver();
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
@@ -1026,38 +1027,6 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
} }
} }
/**
* A NetworkCallback class that relays information of interest to the
* tethering master state machine thread for subsequent processing.
*/
class UpstreamNetworkCallback extends NetworkCallback {
@Override
public void onAvailable(Network network) {
mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
UpstreamNetworkMonitor.EVENT_ON_AVAILABLE, 0, network);
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES, 0,
new NetworkState(null, null, newNc, network, null, null));
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES, 0,
new NetworkState(null, newLp, null, network, null, null));
}
@Override
public void onLost(Network network) {
mTetherMasterSM.sendMessage(TetherMasterSM.EVENT_UPSTREAM_CALLBACK,
UpstreamNetworkMonitor.EVENT_ON_LOST, 0, network);
}
}
/** /**
* A class to centralize all the network and link properties information * A class to centralize all the network and link properties information
* pertaining to the current and any potential upstream network. * pertaining to the current and any potential upstream network.
@@ -1072,21 +1041,31 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
* TODO: Investigate whether more "upstream-specific" logic/functionality * TODO: Investigate whether more "upstream-specific" logic/functionality
* could/should be moved here. * could/should be moved here.
*/ */
class UpstreamNetworkMonitor { public class UpstreamNetworkMonitor {
static final int EVENT_ON_AVAILABLE = 1; public static final int EVENT_ON_AVAILABLE = 1;
static final int EVENT_ON_CAPABILITIES = 2; public static final int EVENT_ON_CAPABILITIES = 2;
static final int EVENT_ON_LINKPROPERTIES = 3; public static final int EVENT_ON_LINKPROPERTIES = 3;
static final int EVENT_ON_LOST = 4; public static final int EVENT_ON_LOST = 4;
final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>(); private final Context mContext;
NetworkCallback mDefaultNetworkCallback; private final StateMachine mTarget;
NetworkCallback mDunTetheringCallback; private final int mWhat;
private final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>();
private ConnectivityManager mCM;
private NetworkCallback mDefaultNetworkCallback;
private NetworkCallback mDunTetheringCallback;
void start() { public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) {
mContext = ctx;
mTarget = tgt;
mWhat = what;
}
public void start() {
stop(); stop();
mDefaultNetworkCallback = new UpstreamNetworkCallback(); mDefaultNetworkCallback = new UpstreamNetworkCallback();
getConnectivityManager().registerDefaultNetworkCallback(mDefaultNetworkCallback); cm().registerDefaultNetworkCallback(mDefaultNetworkCallback);
final NetworkRequest dunTetheringRequest = new NetworkRequest.Builder() final NetworkRequest dunTetheringRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
@@ -1094,29 +1073,28 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN) .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN)
.build(); .build();
mDunTetheringCallback = new UpstreamNetworkCallback(); mDunTetheringCallback = new UpstreamNetworkCallback();
getConnectivityManager().registerNetworkCallback( cm().registerNetworkCallback(dunTetheringRequest, mDunTetheringCallback);
dunTetheringRequest, mDunTetheringCallback);
} }
void stop() { public void stop() {
if (mDefaultNetworkCallback != null) { if (mDefaultNetworkCallback != null) {
getConnectivityManager().unregisterNetworkCallback(mDefaultNetworkCallback); cm().unregisterNetworkCallback(mDefaultNetworkCallback);
mDefaultNetworkCallback = null; mDefaultNetworkCallback = null;
} }
if (mDunTetheringCallback != null) { if (mDunTetheringCallback != null) {
getConnectivityManager().unregisterNetworkCallback(mDunTetheringCallback); cm().unregisterNetworkCallback(mDunTetheringCallback);
mDunTetheringCallback = null; mDunTetheringCallback = null;
} }
mNetworkMap.clear(); mNetworkMap.clear();
} }
NetworkState lookup(Network network) { public NetworkState lookup(Network network) {
return (network != null) ? mNetworkMap.get(network) : null; return (network != null) ? mNetworkMap.get(network) : null;
} }
NetworkState processCallback(int arg1, Object obj) { public NetworkState processCallback(int arg1, Object obj) {
switch (arg1) { switch (arg1) {
case EVENT_ON_AVAILABLE: { case EVENT_ON_AVAILABLE: {
final Network network = (Network) obj; final Network network = (Network) obj;
@@ -1128,7 +1106,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
new NetworkState(null, null, null, network, null, null)); new NetworkState(null, null, null, network, null, null));
} }
final ConnectivityManager cm = getConnectivityManager(); final ConnectivityManager cm = cm();
if (mDefaultNetworkCallback != null) { if (mDefaultNetworkCallback != null) {
cm.requestNetworkCapabilities(mDefaultNetworkCallback); cm.requestNetworkCapabilities(mDefaultNetworkCallback);
@@ -1199,6 +1177,42 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
return null; return null;
} }
} }
// Fetch (and cache) a ConnectivityManager only if and when we need one.
private ConnectivityManager cm() {
if (mCM == null) {
mCM = mContext.getSystemService(ConnectivityManager.class);
}
return mCM;
}
/**
* A NetworkCallback class that relays information of interest to the
* tethering master state machine thread for subsequent processing.
*/
private class UpstreamNetworkCallback extends NetworkCallback {
@Override
public void onAvailable(Network network) {
mTarget.sendMessage(mWhat, EVENT_ON_AVAILABLE, 0, network);
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
mTarget.sendMessage(mWhat, EVENT_ON_CAPABILITIES, 0,
new NetworkState(null, null, newNc, network, null, null));
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
mTarget.sendMessage(mWhat, EVENT_ON_LINKPROPERTIES, 0,
new NetworkState(null, newLp, null, network, null, null));
}
@Override
public void onLost(Network network) {
mTarget.sendMessage(mWhat, EVENT_ON_LOST, 0, network);
}
}
} }
// Needed because the canonical source of upstream truth is just the // Needed because the canonical source of upstream truth is just the