diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 716c71332f..803c682f75 100644 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -158,6 +158,7 @@ import static com.android.net.module.util.PermissionUtils.hasAnyPermissionOf; import static com.android.server.ConnectivityStatsLog.CONNECTIVITY_STATE_SAMPLE; import static com.android.server.connectivity.ConnectivityFlags.CELLULAR_DATA_INACTIVITY_TIMEOUT; import static com.android.server.connectivity.ConnectivityFlags.CLOSE_QUIC_CONNECTION; +import static com.android.server.connectivity.ConnectivityFlags.CONSTRAINED_DATA_SATELLITE_METRICS; import static com.android.server.connectivity.ConnectivityFlags.DELAY_DESTROY_SOCKETS; import static com.android.server.connectivity.ConnectivityFlags.INGRESS_TO_VPN_ADDRESS_FILTERING; import static com.android.server.connectivity.ConnectivityFlags.NAMESPACE_TETHERING_BOOT; @@ -338,6 +339,7 @@ import com.android.metrics.NetworkDescription; import com.android.metrics.NetworkList; import com.android.metrics.NetworkRequestCount; import com.android.metrics.RequestCountForType; +import com.android.metrics.SatelliteAccessInfo; import com.android.modules.utils.BasicShellCommandHandler; import com.android.modules.utils.build.SdkLevel; import com.android.net.module.util.BaseNetdUnsolicitedEventListener; @@ -551,6 +553,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private final boolean mQueueCallbacksForFrozenApps; // Flag for early link properties update private final boolean mSupportEarlyLinkPropertiesUpdateForVPN; + private final boolean mConstrainedDataSatelliteMetrics; /** * Uids ConnectivityService tracks blocked status of to send blocked status callbacks. @@ -1992,6 +1995,8 @@ public class ConnectivityService extends IConnectivityManager.Stub } else { mSatelliteAccessController = null; } + mConstrainedDataSatelliteMetrics = (mSatelliteAccessController != null) + && mDeps.isFeatureNotChickenedOut(mContext, CONSTRAINED_DATA_SATELLITE_METRICS); // To ensure uid state is synchronized with Network Policy, register for // NetworkPolicyManagerService events must happen prior to NetworkPolicyManagerService @@ -2760,6 +2765,9 @@ public class ConnectivityService extends IConnectivityManager.Stub builder.setConnectionDurationPerTransports(sampleConnectionDuration(mNetworkAgentInfos)); builder.setNetworkRequestCount(sampleNetworkRequestCount(mNetworkRequests.values())); builder.setNetworks(sampleNetworks(mNetworkAgentInfos)); + if (mConstrainedDataSatelliteMetrics) { + builder.setSatelliteAccessInfo(sampleSatelliteAccessInfo(mSatelliteAccessController)); + } return builder.build(); } @@ -2859,6 +2867,13 @@ public class ConnectivityService extends IConnectivityManager.Stub return builder.build(); } + @NonNull + private static SatelliteAccessInfo sampleSatelliteAccessInfo( + @NonNull final SatelliteAccessController controller) { + final int optInUidCount = controller.getCachedOptInUidsCount(); + return SatelliteAccessInfo.newBuilder().setOptinUidCount(optInUidCount).build(); + } + @Override public boolean isNetworkSupported(int networkType) { enforceAccessPermission(); diff --git a/service/src/com/android/server/connectivity/ConnectivityFlags.java b/service/src/com/android/server/connectivity/ConnectivityFlags.java index 0905fbec1e..19c97fee1d 100644 --- a/service/src/com/android/server/connectivity/ConnectivityFlags.java +++ b/service/src/com/android/server/connectivity/ConnectivityFlags.java @@ -70,6 +70,9 @@ public final class ConnectivityFlags { public static final String CONSTRAINED_DATA_SATELLITE_OPTIN = "constrained_data_satellite_optin"; + public static final String CONSTRAINED_DATA_SATELLITE_METRICS = + "constrained_data_satellite_metrics"; + /** * A feature flag to control whether the early link properties update for vpn should be enabled. * diff --git a/service/src/com/android/server/connectivity/SatelliteAccessController.java b/service/src/com/android/server/connectivity/SatelliteAccessController.java index 6951624d72..4e804b9c02 100644 --- a/service/src/com/android/server/connectivity/SatelliteAccessController.java +++ b/service/src/com/android/server/connectivity/SatelliteAccessController.java @@ -456,6 +456,12 @@ public class SatelliteAccessController { return pm; } + // Return cached opt-in uid list for metrics sampling. + // Should only be called on handler thread. + public int getCachedOptInUidsCount() { + return mSatelliteDataOptInUids.size(); + } + /** Dump info to dumpsys */ public void dump(@NonNull IndentingPrintWriter pw) { HandlerUtils.ensureRunningOnHandlerThread(mConnectivityServiceHandler); diff --git a/tests/unit/java/com/android/metrics/ConnectivitySampleMetricsTest.kt b/tests/unit/java/com/android/metrics/ConnectivitySampleMetricsTest.kt index 8a9286fb6a..9fb8d61f4e 100644 --- a/tests/unit/java/com/android/metrics/ConnectivitySampleMetricsTest.kt +++ b/tests/unit/java/com/android/metrics/ConnectivitySampleMetricsTest.kt @@ -35,6 +35,7 @@ import androidx.test.filters.SmallTest import com.android.net.module.util.BitUtils import com.android.server.CSTest import com.android.server.FromS +import com.android.server.connectivity.ConnectivityFlags.CONSTRAINED_DATA_SATELLITE_METRICS import com.android.server.connectivity.FullScore import com.android.server.connectivity.FullScore.POLICY_IS_UNMETERED import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo @@ -46,6 +47,7 @@ import kotlin.test.fail import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mockito.doReturn private fun Handler.onHandler(f: () -> T): T { val future = CompletableFuture() @@ -215,13 +217,12 @@ class ConnectivitySampleMetricsTest : CSTest() { } } - @Test fun testSampleConnectivityState_NetworkRequest() { val requestCount = 5 - fileNetworkRequest(RT_APP, requestCount); - fileNetworkRequest(RT_SYSTEM, requestCount, SYSTEM_UID); - fileNetworkRequest(RT_SYSTEM_ON_BEHALF_OF_APP, requestCount, SYSTEM_UID); + fileNetworkRequest(RT_APP, requestCount) + fileNetworkRequest(RT_SYSTEM, requestCount, SYSTEM_UID) + fileNetworkRequest(RT_SYSTEM_ON_BEHALF_OF_APP, requestCount, SYSTEM_UID) val stats = csHandler.onHandler { service.sampleConnectivityState() } @@ -246,4 +247,24 @@ class ConnectivitySampleMetricsTest : CSTest() { "found ${systemOnBehalfOfAppRequest.requestCount}", systemOnBehalfOfAppRequest.requestCount >= requestCount) } + + @Test + fun testSampleConnectivityState_satelliteAccessInfo() { + doTestSampleConnectivityState_satelliteAccessInfo(true) + } + + @FeatureFlags(flags = [Flag(CONSTRAINED_DATA_SATELLITE_METRICS, false)]) + @Test + fun testSampleConnectivityState_satelliteAccessInfo_disabled() { + doTestSampleConnectivityState_satelliteAccessInfo(false) + } + + private fun doTestSampleConnectivityState_satelliteAccessInfo(expectUpdated: Boolean) { + val statsBefore = csHandler.onHandler { service.sampleConnectivityState() } + assertEquals(0, statsBefore.satelliteAccessInfo.optinUidCount) + + doReturn(3).`when`(satelliteAccessController).cachedOptInUidsCount + val statsAfter = csHandler.onHandler { service.sampleConnectivityState() } + assertEquals(if (expectUpdated) 3 else 0, statsAfter.satelliteAccessInfo.optinUidCount) + } } diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index a8b95b7418..4d70c2f189 100644 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -2208,6 +2208,7 @@ public class ConnectivityServiceTest { case ConnectivityFlags.QUEUE_NETWORK_AGENT_EVENTS_IN_SYSTEM_SERVER: case ConnectivityFlags.CLOSE_QUIC_CONNECTION: case ConnectivityFlags.EARLY_LINK_PROPERTIES_UPDATE_FOR_VPN: + case ConnectivityFlags.CONSTRAINED_DATA_SATELLITE_METRICS: return true; default: throw new UnsupportedOperationException("Unknown flag " + name diff --git a/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt b/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt index 0a915df77c..431ce5ac74 100644 --- a/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt +++ b/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt @@ -179,6 +179,7 @@ open class CSTest { it[ConnectivityFlags.QUEUE_NETWORK_AGENT_EVENTS_IN_SYSTEM_SERVER] = true it[ConnectivityFlags.CLOSE_QUIC_CONNECTION] = true it[ConnectivityFlags.EARLY_LINK_PROPERTIES_UPDATE_FOR_VPN] = true + it[ConnectivityFlags.CONSTRAINED_DATA_SATELLITE_METRICS] = true } fun setFeatureEnabled(flag: String, enabled: Boolean) = enabledFeatures.set(flag, enabled)