diff --git a/framework/src/android/net/NetworkAgent.java b/framework/src/android/net/NetworkAgent.java index 29add1cbfc..2c50c73331 100644 --- a/framework/src/android/net/NetworkAgent.java +++ b/framework/src/android/net/NetworkAgent.java @@ -1076,11 +1076,12 @@ public abstract class NetworkAgent { */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public final void sendNetworkInfo(NetworkInfo networkInfo) { - queueOrSendNetworkInfo(new NetworkInfo(networkInfo)); + queueOrSendNetworkInfo(networkInfo); } private void queueOrSendNetworkInfo(NetworkInfo networkInfo) { - queueOrSendMessage(reg -> reg.sendNetworkInfo(networkInfo)); + final NetworkInfo ni = new NetworkInfo(networkInfo); + queueOrSendMessage(reg -> reg.sendNetworkInfo(ni)); } /** diff --git a/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt b/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt index 050497392e..d4f3d579a6 100644 --- a/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt +++ b/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt @@ -1275,4 +1275,23 @@ class NetworkAgentTest { matchAllCallback.expectCallback(wifiNetwork) wifiAgent.expectCallback() } + + @Test + fun testUnregisterAgentBeforeAgentFullyConnected() { + val specifier = UUID.randomUUID().toString() + val callback = TestableNetworkCallback() + val transports = intArrayOf(TRANSPORT_CELLULAR) + // Ensure this NetworkAgent is never unneeded by filing a request with its specifier. + requestNetwork(makeTestNetworkRequest(specifier = specifier), callback) + val nc = makeTestNetworkCapabilities(specifier, transports) + val agent = createNetworkAgent(realContext, initialNc = nc) + // Connect the agent + agent.register() + // Mark agent connected then unregister agent immediately. Verify that both available and + // lost callback should be sent still. + agent.markConnected() + agent.unregister() + callback.expectCallback(agent.network!!) + callback.eventuallyExpect { it.network == agent.network } + } }