Loading services/core/java/com/android/server/connectivity/Tethering.java +67 −53 Original line number Diff line number Diff line Loading @@ -199,7 +199,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper); mTetherMasterSM.start(); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor( mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK); mStateReceiver = new StateReceiver(); IntentFilter filter = new IntentFilter(); Loading Loading @@ -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 * pertaining to the current and any potential upstream network. Loading @@ -1072,21 +1041,31 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering * TODO: Investigate whether more "upstream-specific" logic/functionality * could/should be moved here. */ class UpstreamNetworkMonitor { static final int EVENT_ON_AVAILABLE = 1; static final int EVENT_ON_CAPABILITIES = 2; static final int EVENT_ON_LINKPROPERTIES = 3; static final int EVENT_ON_LOST = 4; public class UpstreamNetworkMonitor { public static final int EVENT_ON_AVAILABLE = 1; public static final int EVENT_ON_CAPABILITIES = 2; public static final int EVENT_ON_LINKPROPERTIES = 3; public static final int EVENT_ON_LOST = 4; private final Context mContext; private final StateMachine mTarget; private final int mWhat; private final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>(); private ConnectivityManager mCM; private NetworkCallback mDefaultNetworkCallback; private NetworkCallback mDunTetheringCallback; final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>(); NetworkCallback mDefaultNetworkCallback; NetworkCallback mDunTetheringCallback; public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) { mContext = ctx; mTarget = tgt; mWhat = what; } void start() { public void start() { stop(); mDefaultNetworkCallback = new UpstreamNetworkCallback(); getConnectivityManager().registerDefaultNetworkCallback(mDefaultNetworkCallback); cm().registerDefaultNetworkCallback(mDefaultNetworkCallback); final NetworkRequest dunTetheringRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) Loading @@ -1094,29 +1073,28 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN) .build(); mDunTetheringCallback = new UpstreamNetworkCallback(); getConnectivityManager().registerNetworkCallback( dunTetheringRequest, mDunTetheringCallback); cm().registerNetworkCallback(dunTetheringRequest, mDunTetheringCallback); } void stop() { public void stop() { if (mDefaultNetworkCallback != null) { getConnectivityManager().unregisterNetworkCallback(mDefaultNetworkCallback); cm().unregisterNetworkCallback(mDefaultNetworkCallback); mDefaultNetworkCallback = null; } if (mDunTetheringCallback != null) { getConnectivityManager().unregisterNetworkCallback(mDunTetheringCallback); cm().unregisterNetworkCallback(mDunTetheringCallback); mDunTetheringCallback = null; } mNetworkMap.clear(); } NetworkState lookup(Network network) { public NetworkState lookup(Network network) { return (network != null) ? mNetworkMap.get(network) : null; } NetworkState processCallback(int arg1, Object obj) { public NetworkState processCallback(int arg1, Object obj) { switch (arg1) { case EVENT_ON_AVAILABLE: { final Network network = (Network) obj; Loading @@ -1128,7 +1106,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering new NetworkState(null, null, null, network, null, null)); } final ConnectivityManager cm = getConnectivityManager(); final ConnectivityManager cm = cm(); if (mDefaultNetworkCallback != null) { cm.requestNetworkCapabilities(mDefaultNetworkCallback); Loading Loading @@ -1199,6 +1177,42 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering 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 Loading Loading
services/core/java/com/android/server/connectivity/Tethering.java +67 −53 Original line number Diff line number Diff line Loading @@ -199,7 +199,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper); mTetherMasterSM.start(); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor( mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK); mStateReceiver = new StateReceiver(); IntentFilter filter = new IntentFilter(); Loading Loading @@ -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 * pertaining to the current and any potential upstream network. Loading @@ -1072,21 +1041,31 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering * TODO: Investigate whether more "upstream-specific" logic/functionality * could/should be moved here. */ class UpstreamNetworkMonitor { static final int EVENT_ON_AVAILABLE = 1; static final int EVENT_ON_CAPABILITIES = 2; static final int EVENT_ON_LINKPROPERTIES = 3; static final int EVENT_ON_LOST = 4; public class UpstreamNetworkMonitor { public static final int EVENT_ON_AVAILABLE = 1; public static final int EVENT_ON_CAPABILITIES = 2; public static final int EVENT_ON_LINKPROPERTIES = 3; public static final int EVENT_ON_LOST = 4; private final Context mContext; private final StateMachine mTarget; private final int mWhat; private final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>(); private ConnectivityManager mCM; private NetworkCallback mDefaultNetworkCallback; private NetworkCallback mDunTetheringCallback; final HashMap<Network, NetworkState> mNetworkMap = new HashMap<>(); NetworkCallback mDefaultNetworkCallback; NetworkCallback mDunTetheringCallback; public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) { mContext = ctx; mTarget = tgt; mWhat = what; } void start() { public void start() { stop(); mDefaultNetworkCallback = new UpstreamNetworkCallback(); getConnectivityManager().registerDefaultNetworkCallback(mDefaultNetworkCallback); cm().registerDefaultNetworkCallback(mDefaultNetworkCallback); final NetworkRequest dunTetheringRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) Loading @@ -1094,29 +1073,28 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering .addCapability(NetworkCapabilities.NET_CAPABILITY_DUN) .build(); mDunTetheringCallback = new UpstreamNetworkCallback(); getConnectivityManager().registerNetworkCallback( dunTetheringRequest, mDunTetheringCallback); cm().registerNetworkCallback(dunTetheringRequest, mDunTetheringCallback); } void stop() { public void stop() { if (mDefaultNetworkCallback != null) { getConnectivityManager().unregisterNetworkCallback(mDefaultNetworkCallback); cm().unregisterNetworkCallback(mDefaultNetworkCallback); mDefaultNetworkCallback = null; } if (mDunTetheringCallback != null) { getConnectivityManager().unregisterNetworkCallback(mDunTetheringCallback); cm().unregisterNetworkCallback(mDunTetheringCallback); mDunTetheringCallback = null; } mNetworkMap.clear(); } NetworkState lookup(Network network) { public NetworkState lookup(Network network) { return (network != null) ? mNetworkMap.get(network) : null; } NetworkState processCallback(int arg1, Object obj) { public NetworkState processCallback(int arg1, Object obj) { switch (arg1) { case EVENT_ON_AVAILABLE: { final Network network = (Network) obj; Loading @@ -1128,7 +1106,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering new NetworkState(null, null, null, network, null, null)); } final ConnectivityManager cm = getConnectivityManager(); final ConnectivityManager cm = cm(); if (mDefaultNetworkCallback != null) { cm.requestNetworkCapabilities(mDefaultNetworkCallback); Loading Loading @@ -1199,6 +1177,42 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering 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 Loading