Unregister callback on data network disconnect
Remove the data network reference from dataNetworkControllerCallbacks when the network disconnect.
Test: voice call + data browsing + review log
Bug: 241212926
Change-Id: Ie37c67f462c122e32eaff4563c5aed5cc4aa6f3b
diff --git a/src/java/com/android/internal/telephony/data/DataNetwork.java b/src/java/com/android/internal/telephony/data/DataNetwork.java
index 3a0489f..42c4691 100644
--- a/src/java/com/android/internal/telephony/data/DataNetwork.java
+++ b/src/java/com/android/internal/telephony/data/DataNetwork.java
@@ -551,6 +551,10 @@
/** Data network controller. */
private final @NonNull DataNetworkController mDataNetworkController;
+ /** Data network controller callback. */
+ private final @NonNull DataNetworkController.DataNetworkControllerCallback
+ mDataNetworkControllerCallback;
+
/** Data config manager. */
private final @NonNull DataConfigManager mDataConfigManager;
@@ -887,12 +891,14 @@
mAccessNetworksManager = phone.getAccessNetworksManager();
mVcnManager = mPhone.getContext().getSystemService(VcnManager.class);
mDataNetworkController = phone.getDataNetworkController();
+ mDataNetworkControllerCallback = new DataNetworkController.DataNetworkControllerCallback(
+ getHandler()::post) {
+ @Override
+ public void onSubscriptionPlanOverride() {
+ sendMessage(EVENT_SUBSCRIPTION_PLAN_OVERRIDE);
+ }};
mDataNetworkController.registerDataNetworkControllerCallback(
- new DataNetworkController.DataNetworkControllerCallback(getHandler()::post) {
- @Override
- public void onSubscriptionPlanOverride() {
- sendMessage(EVENT_SUBSCRIPTION_PLAN_OVERRIDE);
- }});
+ mDataNetworkControllerCallback);
mDataConfigManager = mDataNetworkController.getDataConfigManager();
mDataCallSessionStats = new DataCallSessionStats(mPhone);
mDataNetworkCallback = callback;
@@ -1585,6 +1591,8 @@
}
notifyPreciseDataConnectionState();
mNetworkAgent.unregister();
+ mDataNetworkController.unregisterDataNetworkControllerCallback(
+ mDataNetworkControllerCallback);
mDataCallSessionStats.onDataCallDisconnected(mFailCause);
if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
index de9d0ef..cd50dfb 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
@@ -1215,16 +1215,32 @@
@Test
public void testDataNetworkControllerCallback() throws Exception {
+ Field field = DataNetworkController.class.getDeclaredField(
+ "mDataNetworkControllerCallbacks");
+ field.setAccessible(true);
+ Set<DataNetworkControllerCallback> dataNetworkControllerCallbacks =
+ (Set<DataNetworkControllerCallback>) field.get(mDataNetworkControllerUT);
+
+ // Verify register callback
mDataNetworkControllerUT.registerDataNetworkControllerCallback(
mMockedDataNetworkControllerCallback);
+ TelephonyNetworkRequest request = createNetworkRequest(
+ NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ mDataNetworkControllerUT.addNetworkRequest(request);
processAllMessages();
- testSetupDataNetwork();
verify(mMockedDataNetworkControllerCallback).onAnyDataNetworkExistingChanged(eq(true));
verify(mMockedDataNetworkControllerCallback).onInternetDataNetworkConnected(any());
- mDataNetworkControllerUT.unregisterDataNetworkControllerCallback(
- mMockedDataNetworkControllerCallback);
+ int countOfCallbacks = dataNetworkControllerCallbacks.size();
+
+ // Verify unregister callback
+ mDataNetworkControllerUT.removeNetworkRequest(request);
processAllMessages();
+ getDataNetworks().get(0).tearDown(DataNetwork
+ .TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED);
+ processAllFutureMessages();
+
+ assertEquals(countOfCallbacks - 1, dataNetworkControllerCallbacks.size());
}
@Test