[IT4.4] Host network activity related logic into a new class
Create an inner class to handle the network activity related logic to isolate the code for code cleanliness. It's helpful for the follow-up modifications to move network activity logic from NMS to CS to support Connectivityservice mainline. Bug: 170598012 Test: atest FrameworksNetTests Change-Id: I33b3b11f2700cb10eb6e3b58b6dfa52251bece80
This commit is contained in:
@@ -1115,11 +1115,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
userAllContext.registerReceiver(
|
||||
mIntentReceiver, intentFilter, NETWORK_STACK, mHandler);
|
||||
|
||||
try {
|
||||
mNMS.registerObserver(mDataActivityObserver);
|
||||
} catch (RemoteException e) {
|
||||
loge("Error registering observer :" + e);
|
||||
}
|
||||
mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mNMS);
|
||||
|
||||
mSettingsObserver = new SettingsObserver(mContext, mHandler);
|
||||
registerSettingsCallbacks();
|
||||
@@ -1802,30 +1798,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
private INetworkManagementEventObserver mDataActivityObserver = new BaseNetworkObserver() {
|
||||
@Override
|
||||
public void interfaceClassDataActivityChanged(int transportType, boolean active,
|
||||
long tsNanos, int uid) {
|
||||
sendDataActivityBroadcast(transportTypeToLegacyType(transportType), active, tsNanos);
|
||||
}
|
||||
};
|
||||
|
||||
// This is deprecated and only to support legacy use cases.
|
||||
private int transportTypeToLegacyType(int type) {
|
||||
switch (type) {
|
||||
case NetworkCapabilities.TRANSPORT_CELLULAR:
|
||||
return ConnectivityManager.TYPE_MOBILE;
|
||||
case NetworkCapabilities.TRANSPORT_WIFI:
|
||||
return ConnectivityManager.TYPE_WIFI;
|
||||
case NetworkCapabilities.TRANSPORT_BLUETOOTH:
|
||||
return ConnectivityManager.TYPE_BLUETOOTH;
|
||||
case NetworkCapabilities.TRANSPORT_ETHERNET:
|
||||
return ConnectivityManager.TYPE_ETHERNET;
|
||||
default:
|
||||
loge("Unexpected transport in transportTypeToLegacyType: " + type);
|
||||
}
|
||||
return ConnectivityManager.TYPE_NONE;
|
||||
}
|
||||
/**
|
||||
* Ensures that the system cannot call a particular method.
|
||||
*/
|
||||
@@ -2274,20 +2246,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
sendStickyBroadcast(makeGeneralIntent(info, bcastType));
|
||||
}
|
||||
|
||||
private void sendDataActivityBroadcast(int deviceType, boolean active, long tsNanos) {
|
||||
Intent intent = new Intent(ConnectivityManager.ACTION_DATA_ACTIVITY_CHANGE);
|
||||
intent.putExtra(ConnectivityManager.EXTRA_DEVICE_TYPE, deviceType);
|
||||
intent.putExtra(ConnectivityManager.EXTRA_IS_ACTIVE, active);
|
||||
intent.putExtra(ConnectivityManager.EXTRA_REALTIME_NS, tsNanos);
|
||||
final long ident = Binder.clearCallingIdentity();
|
||||
try {
|
||||
mContext.sendOrderedBroadcastAsUser(intent, UserHandle.ALL,
|
||||
RECEIVE_DATA_ACTIVITY_CHANGE, null, null, 0, null, null);
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(ident);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendStickyBroadcast(Intent intent) {
|
||||
synchronized (this) {
|
||||
if (!mSystemReady
|
||||
@@ -2392,74 +2350,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup data activity tracking for the given network.
|
||||
*
|
||||
* Every {@code setupDataActivityTracking} should be paired with a
|
||||
* {@link #removeDataActivityTracking} for cleanup.
|
||||
*/
|
||||
private void setupDataActivityTracking(NetworkAgentInfo networkAgent) {
|
||||
final String iface = networkAgent.linkProperties.getInterfaceName();
|
||||
|
||||
final int timeout;
|
||||
final int type;
|
||||
|
||||
if (networkAgent.networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_CELLULAR)) {
|
||||
timeout = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.DATA_ACTIVITY_TIMEOUT_MOBILE,
|
||||
10);
|
||||
type = NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||
} else if (networkAgent.networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_WIFI)) {
|
||||
timeout = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.DATA_ACTIVITY_TIMEOUT_WIFI,
|
||||
15);
|
||||
type = NetworkCapabilities.TRANSPORT_WIFI;
|
||||
} else {
|
||||
return; // do not track any other networks
|
||||
}
|
||||
|
||||
if (timeout > 0 && iface != null) {
|
||||
try {
|
||||
mNMS.addIdleTimer(iface, timeout, type);
|
||||
} catch (Exception e) {
|
||||
// You shall not crash!
|
||||
loge("Exception in setupDataActivityTracking " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove data activity tracking when network disconnects.
|
||||
*/
|
||||
private void removeDataActivityTracking(NetworkAgentInfo networkAgent) {
|
||||
final String iface = networkAgent.linkProperties.getInterfaceName();
|
||||
final NetworkCapabilities caps = networkAgent.networkCapabilities;
|
||||
|
||||
if (iface != null && (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
|
||||
caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))) {
|
||||
try {
|
||||
// the call fails silently if no idle timer setup for this interface
|
||||
mNMS.removeIdleTimer(iface);
|
||||
} catch (Exception e) {
|
||||
loge("Exception in removeDataActivityTracking " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update data activity tracking when network state is updated.
|
||||
*/
|
||||
private void updateDataActivityTracking(NetworkAgentInfo newNetwork,
|
||||
NetworkAgentInfo oldNetwork) {
|
||||
if (newNetwork != null) {
|
||||
setupDataActivityTracking(newNetwork);
|
||||
}
|
||||
if (oldNetwork != null) {
|
||||
removeDataActivityTracking(oldNetwork);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Reads the network specific MTU size from resources.
|
||||
* and set it on it's iface.
|
||||
@@ -3484,7 +3374,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
// the default network disconnecting. Find out why, fix the rematch code, and delete this.
|
||||
if (nai.isSatisfyingRequest(mDefaultRequest.requestId)) {
|
||||
mDefaultNetworkNai = null;
|
||||
updateDataActivityTracking(null /* newNetwork */, nai);
|
||||
mNetworkActivityTracker.updateDataActivityTracking(null /* newNetwork */, nai);
|
||||
notifyLockdownVpn(nai);
|
||||
ensureNetworkTransitionWakelock(nai.toShortString());
|
||||
}
|
||||
@@ -7314,7 +7204,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
if (oldDefaultNetwork != null) {
|
||||
mLingerMonitor.noteLingerDefaultNetwork(oldDefaultNetwork, newDefaultNetwork);
|
||||
}
|
||||
updateDataActivityTracking(newDefaultNetwork, oldDefaultNetwork);
|
||||
mNetworkActivityTracker.updateDataActivityTracking(
|
||||
newDefaultNetwork, oldDefaultNetwork);
|
||||
// Notify system services of the new default.
|
||||
makeDefault(newDefaultNetwork);
|
||||
|
||||
@@ -8666,4 +8557,145 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
notifyDataStallSuspected(p, network.getNetId());
|
||||
}
|
||||
|
||||
private final LegacyNetworkActivityTracker mNetworkActivityTracker;
|
||||
|
||||
/**
|
||||
* Class used for updating network activity tracking with netd and notify network activity
|
||||
* changes.
|
||||
*/
|
||||
private static final class LegacyNetworkActivityTracker {
|
||||
private final Context mContext;
|
||||
private final INetworkManagementService mNMS;
|
||||
|
||||
LegacyNetworkActivityTracker(@NonNull Context context,
|
||||
@NonNull INetworkManagementService nms) {
|
||||
mContext = context;
|
||||
mNMS = nms;
|
||||
try {
|
||||
mNMS.registerObserver(mDataActivityObserver);
|
||||
} catch (RemoteException e) {
|
||||
loge("Error registering observer :" + e);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Migrate away the dependency with INetworkManagementEventObserver.
|
||||
private final INetworkManagementEventObserver mDataActivityObserver =
|
||||
new BaseNetworkObserver() {
|
||||
@Override
|
||||
public void interfaceClassDataActivityChanged(int transportType, boolean active,
|
||||
long tsNanos, int uid) {
|
||||
sendDataActivityBroadcast(transportTypeToLegacyType(transportType), active,
|
||||
tsNanos);
|
||||
}
|
||||
};
|
||||
|
||||
// This is deprecated and only to support legacy use cases.
|
||||
private int transportTypeToLegacyType(int type) {
|
||||
switch (type) {
|
||||
case NetworkCapabilities.TRANSPORT_CELLULAR:
|
||||
return ConnectivityManager.TYPE_MOBILE;
|
||||
case NetworkCapabilities.TRANSPORT_WIFI:
|
||||
return ConnectivityManager.TYPE_WIFI;
|
||||
case NetworkCapabilities.TRANSPORT_BLUETOOTH:
|
||||
return ConnectivityManager.TYPE_BLUETOOTH;
|
||||
case NetworkCapabilities.TRANSPORT_ETHERNET:
|
||||
return ConnectivityManager.TYPE_ETHERNET;
|
||||
default:
|
||||
loge("Unexpected transport in transportTypeToLegacyType: " + type);
|
||||
}
|
||||
return ConnectivityManager.TYPE_NONE;
|
||||
}
|
||||
|
||||
public void sendDataActivityBroadcast(int deviceType, boolean active, long tsNanos) {
|
||||
final Intent intent = new Intent(ConnectivityManager.ACTION_DATA_ACTIVITY_CHANGE);
|
||||
intent.putExtra(ConnectivityManager.EXTRA_DEVICE_TYPE, deviceType);
|
||||
intent.putExtra(ConnectivityManager.EXTRA_IS_ACTIVE, active);
|
||||
intent.putExtra(ConnectivityManager.EXTRA_REALTIME_NS, tsNanos);
|
||||
final long ident = Binder.clearCallingIdentity();
|
||||
try {
|
||||
mContext.sendOrderedBroadcastAsUser(intent, UserHandle.ALL,
|
||||
RECEIVE_DATA_ACTIVITY_CHANGE,
|
||||
null /* resultReceiver */,
|
||||
null /* scheduler */,
|
||||
0 /* initialCode */,
|
||||
null /* initialData */,
|
||||
null /* initialExtra */);
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(ident);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup data activity tracking for the given network.
|
||||
*
|
||||
* Every {@code setupDataActivityTracking} should be paired with a
|
||||
* {@link #removeDataActivityTracking} for cleanup.
|
||||
*/
|
||||
private void setupDataActivityTracking(NetworkAgentInfo networkAgent) {
|
||||
final String iface = networkAgent.linkProperties.getInterfaceName();
|
||||
|
||||
final int timeout;
|
||||
final int type;
|
||||
|
||||
if (networkAgent.networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_CELLULAR)) {
|
||||
timeout = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.DATA_ACTIVITY_TIMEOUT_MOBILE,
|
||||
10);
|
||||
type = NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||
} else if (networkAgent.networkCapabilities.hasTransport(
|
||||
NetworkCapabilities.TRANSPORT_WIFI)) {
|
||||
timeout = Settings.Global.getInt(mContext.getContentResolver(),
|
||||
Settings.Global.DATA_ACTIVITY_TIMEOUT_WIFI,
|
||||
15);
|
||||
type = NetworkCapabilities.TRANSPORT_WIFI;
|
||||
} else {
|
||||
return; // do not track any other networks
|
||||
}
|
||||
|
||||
if (timeout > 0 && iface != null) {
|
||||
try {
|
||||
// TODO: Access INetd directly instead of NMS
|
||||
mNMS.addIdleTimer(iface, timeout, type);
|
||||
} catch (Exception e) {
|
||||
// You shall not crash!
|
||||
loge("Exception in setupDataActivityTracking " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove data activity tracking when network disconnects.
|
||||
*/
|
||||
private void removeDataActivityTracking(NetworkAgentInfo networkAgent) {
|
||||
final String iface = networkAgent.linkProperties.getInterfaceName();
|
||||
final NetworkCapabilities caps = networkAgent.networkCapabilities;
|
||||
|
||||
if (iface != null && (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
|
||||
|| caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))) {
|
||||
try {
|
||||
// the call fails silently if no idle timer setup for this interface
|
||||
// TODO: Access INetd directly instead of NMS
|
||||
mNMS.removeIdleTimer(iface);
|
||||
} catch (Exception e) {
|
||||
// You shall not crash!
|
||||
loge("Exception in removeDataActivityTracking " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update data activity tracking when network state is updated.
|
||||
*/
|
||||
public void updateDataActivityTracking(NetworkAgentInfo newNetwork,
|
||||
NetworkAgentInfo oldNetwork) {
|
||||
if (newNetwork != null) {
|
||||
setupDataActivityTracking(newNetwork);
|
||||
}
|
||||
if (oldNetwork != null) {
|
||||
removeDataActivityTracking(oldNetwork);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user