From 5dfaf4e176cb0567a851a100a4f5076145fc5fbc Mon Sep 17 00:00:00 2001 From: Motomu Utsumi Date: Mon, 29 May 2023 17:02:16 +0900 Subject: [PATCH] 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 --- .../android/server/ConnectivityService.java | 53 ++++++++++++------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index d4d92333bf..c8f614eccb 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -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 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) {