Handle source PDN lost during HO

when source PDN is reported lost duing HO, source transport thinks the old interfaceName can be reused
by other PDN, but because HO in progress, the current network is still under the old interfaceName. Fix by mark current network SUSPENDED
 and update the current interfaceName to be "" .

Test: atest + basic placing phone call
Fix: 243698950
Change-Id: I7650c79ba1a9a69a22f6a0e67cf7932f6fa2dfc3
diff --git a/src/java/com/android/internal/telephony/data/DataNetwork.java b/src/java/com/android/internal/telephony/data/DataNetwork.java
index a7b974e..2f17b00 100644
--- a/src/java/com/android/internal/telephony/data/DataNetwork.java
+++ b/src/java/com/android/internal/telephony/data/DataNetwork.java
@@ -1417,6 +1417,13 @@
                                 + AccessNetworkConstants.transportTypeToString(transport)
                                 + " data call list changed event. " + responseList);
                     } else {
+                        // If source PDN is reported lost, notify network agent that the PDN is
+                        // temporarily suspended and the old interface name is no longer usable.
+                        boolean currentPdnIsAlive = responseList.stream()
+                                .anyMatch(r -> mCid.get(mTransport) == r.getId());
+                        if (!currentPdnIsAlive) {
+                            notifyNetworkUnusable();
+                        }
                         log("Defer message " + eventToString(msg.what) + ":" + responseList);
                         deferMessage(msg);
                     }
@@ -1464,6 +1471,25 @@
             }
             return HANDLED;
         }
+
+        /**
+         * Notify network agent that the PDN is temporarily suspended and the old interface name is
+         * no longer usable. The state will be re-evaluated when the handover ends.
+         */
+        private void notifyNetworkUnusable() {
+            log(AccessNetworkConstants.transportTypeToString(mTransport)
+                    + " reports current PDN lost, update capability to SUSPENDED,"
+                    + " TNA interfaceName to \"\"");
+            mNetworkCapabilities = new NetworkCapabilities
+                    .Builder(mNetworkCapabilities)
+                    .removeCapability(
+                            NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED)
+                    .build();
+            mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities);
+
+            mLinkProperties.setInterfaceName("");
+            mNetworkAgent.sendLinkProperties(mLinkProperties);
+        }
     }
 
     /**
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
index 7bab74d..6b96d83 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
@@ -989,12 +989,30 @@
     public void testHandover() throws Exception {
         setupDataNetwork();
 
-        setSuccessfulSetupDataResponse(mMockedWlanDataServiceManager, 456);
         // Now handover to IWLAN
         mDataNetworkUT.startHandover(AccessNetworkConstants.TRANSPORT_TYPE_WLAN, null);
+        // the source transport might report PDN lost
+        mDataNetworkUT.sendMessage(8/*EVENT_DATA_STATE_CHANGED*/,
+                new AsyncResult(AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
+                        Collections.emptyList(), null));
         processAllMessages();
 
+        // make sure interface name of source PDN is cleared
+        assertThat(mDataNetworkUT.getLinkProperties().getInterfaceName()).isNotEqualTo("ifname");
+        // make sure the capability of source PDN is set to SUSPENDED
+        assertThat(mDataNetworkUT.getNetworkCapabilities()
+                .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED)).isFalse();
         verify(mMockedWwanDataServiceManager).startHandover(eq(123), any(Message.class));
+
+        // continue the HO
+        setSuccessfulSetupDataResponse(mMockedWlanDataServiceManager, 456);
+        Message msg = new Message();
+        msg.what = 26/*EVENT_NOTIFY_HANDOVER_STARTED_RESPONSE*/;
+        msg.arg2 = AccessNetworkConstants.TRANSPORT_TYPE_WLAN;
+        msg.obj = null;
+        mDataNetworkUT.sendMessage(msg);
+        processAllMessages();
+
         verify(mLinkBandwidthEstimator).unregisterCallback(any(
                 LinkBandwidthEstimatorCallback.class));
         assertThat(mDataNetworkUT.getTransport())