Move network activity change processing to handler thread

Following CLs update LegacyNetworkActivityTracker to support multiple
network activity tracking on U+ devices.
This CL is a preparation for them.

Bug: 267870186
Bug: 279380356
Test: atest FrameworksNetTests
Change-Id: I2598feef93ef34e10bf576560f687ff7fc449ab9
This commit is contained in:
Motomu Utsumi
2023-05-29 17:02:16 +09:00
parent 2738f4fd4d
commit 5dfaf4e176

View File

@@ -1703,7 +1703,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mUserAllContext.registerReceiver(mPackageIntentReceiver, packageIntentFilter,
null /* broadcastPermission */, mHandler);
mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mHandler, mNetd);
mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mNetd);
final NetdCallback netdCallback = new NetdCallback();
try {
@@ -5876,7 +5876,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
break;
}
case EVENT_REPORT_NETWORK_ACTIVITY:
mNetworkActivityTracker.handleReportNetworkActivity();
final NetworkActivityParams arg = (NetworkActivityParams) msg.obj;
mNetworkActivityTracker.handleReportNetworkActivity(arg);
break;
case EVENT_MOBILE_DATA_PREFERRED_UIDS_CHANGED:
handleMobileDataPreferredUidsChanged();
@@ -11059,11 +11060,34 @@ public class ConnectivityService extends IConnectivityManager.Stub
notifyDataStallSuspected(p, network.getNetId());
}
/**
* Class to hold the information for network activity change event from idle timers
* {@link NetdCallback#onInterfaceClassActivityChanged(boolean, int, long, int)}
*/
private static final class NetworkActivityParams {
public final boolean isActive;
// Label used for idle timer. Transport type is used as label.
// label is int since NMS was using the identifier as int, and it has not been changed
public final int label;
public final long timestampNs;
// Uid represents the uid that was responsible for waking the radio.
// -1 for no uid and uid is -1 if isActive is false.
public final int uid;
NetworkActivityParams(boolean isActive, int label, long timestampNs, int uid) {
this.isActive = isActive;
this.label = label;
this.timestampNs = timestampNs;
this.uid = uid;
}
}
private class NetdCallback extends BaseNetdUnsolicitedEventListener {
@Override
public void onInterfaceClassActivityChanged(boolean isActive, int transportType,
public void onInterfaceClassActivityChanged(boolean isActive, int label,
long timestampNs, int uid) {
mNetworkActivityTracker.setAndReportNetworkActive(isActive, transportType, timestampNs);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REPORT_NETWORK_ACTIVITY,
new NetworkActivityParams(isActive, label, timestampNs, uid)));
}
@Override
@@ -11098,7 +11122,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
private boolean mNetworkActive;
@GuardedBy("mActiveIdleTimers")
private final ArrayMap<String, IdleTimerParams> mActiveIdleTimers = new ArrayMap<>();
private final Handler mHandler;
private static class IdleTimerParams {
public final int timeout;
@@ -11110,17 +11133,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
LegacyNetworkActivityTracker(@NonNull Context context, @NonNull Handler handler,
@NonNull INetd netd) {
LegacyNetworkActivityTracker(@NonNull Context context, @NonNull INetd netd) {
mContext = context;
mNetd = netd;
mHandler = handler;
}
public void setAndReportNetworkActive(boolean active, int transportType, long tsNanos) {
sendDataActivityBroadcast(transportTypeToLegacyType(transportType), active, tsNanos);
public void handleReportNetworkActivity(NetworkActivityParams activityParams) {
sendDataActivityBroadcast(transportTypeToLegacyType(activityParams.label),
activityParams.isActive, activityParams.timestampNs);
synchronized (mActiveIdleTimers) {
mNetworkActive = active;
mNetworkActive = activityParams.isActive;
// If there are no idle timers, it means that system is not monitoring
// activity, so the system default network for those default network
// unspecified apps is always considered active.
@@ -11130,7 +11152,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// the mActiveIdleTimers should be always not empty. The legacy behavior
// is no-op. Remove to refer to mNetworkActive only.
if (mNetworkActive || mActiveIdleTimers.isEmpty()) {
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REPORT_NETWORK_ACTIVITY));
reportNetworkActive();
}
}
}
@@ -11154,13 +11176,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
@GuardedBy("mActiveIdleTimers")
public void handleReportNetworkActivity() {
synchronized (mActiveIdleTimers) {
reportNetworkActive();
}
}
// This is deprecated and only to support legacy use cases.
private int transportTypeToLegacyType(int type) {
switch (type) {