Do not shut down IwlanDataServiceHandler in deInitNetworkCallback

When phone app crashes, IwlanDataService.onUnbind() will be triggered and Iwlan will force close all tunnels. Also, as part of DataService.onUnbind(), all IwlanDataServiceProviders will be closed and IwlanDataServiceHandler will be shut down in deInitNetworkCallBack().

When EpdgTunnelManager closed the tunnel and report to IwlanDataService via IwlanTunnelCallback, as the handler is already shut down, Iwlan was not able to process the event and raise NullPointerException.

Fixing this issue by not shutting down IwlanDataServiceHandler.

Bug: 245701042
Test: atest IwlanDataServiceTest, verified in live test by crashing phone app with adb command
Change-Id: Idfed9a4e67a1b8d0371a3afd7a4a70df8af13f40
Merged-In: Idfed9a4e67a1b8d0371a3afd7a4a70df8af13f40
diff --git a/src/com/google/android/iwlan/IwlanDataService.java b/src/com/google/android/iwlan/IwlanDataService.java
index 77207a2..35dff9f 100644
--- a/src/com/google/android/iwlan/IwlanDataService.java
+++ b/src/com/google/android/iwlan/IwlanDataService.java
@@ -1647,11 +1647,6 @@
                 mContext.getSystemService(ConnectivityManager.class);
         connectivityManager.unregisterNetworkCallback(mNetworkMonitorCallback);
         mNetworkMonitorCallback = null;
-        if (mIwlanDataServiceHandlerThread != null) {
-            mIwlanDataServiceHandlerThread.quit();
-            mIwlanDataServiceHandlerThread = null;
-        }
-        mIwlanDataServiceHandler = null;
     }
 
     @VisibleForTesting
diff --git a/test/com/google/android/iwlan/IwlanDataServiceTest.java b/test/com/google/android/iwlan/IwlanDataServiceTest.java
index 607b751..1aa5d15 100644
--- a/test/com/google/android/iwlan/IwlanDataServiceTest.java
+++ b/test/com/google/android/iwlan/IwlanDataServiceTest.java
@@ -278,7 +278,6 @@
         mIwlanDataService.removeDataServiceProvider(mMockIwlanDataServiceProvider);
         mTestLooper.dispatchAll();
         verify(mIwlanDataService, times(1)).deinitNetworkCallback();
-        assertEquals(mIwlanDataService.mIwlanDataServiceHandler, null);
         mIwlanDataService.onCreateDataServiceProvider(DEFAULT_SLOT_INDEX);
         mTestLooper.dispatchAll();
     }
@@ -867,6 +866,28 @@
         assertEquals(finalUpStats.getMax(), tunnelUpStats.getMax(), 100);
     }
 
+    @Test
+    public void testIwlanDataServiceHandlerOnUnbind() {
+        DataProfile dp = buildDataProfile();
+        doReturn(mMockEpdgTunnelManager).when(mSpyIwlanDataServiceProvider).getTunnelManager();
+        mSpyIwlanDataServiceProvider.setTunnelState(
+                dp, mMockDataServiceCallback, TunnelState.TUNNEL_UP, null, false, 1);
+
+        // Simulate IwlanDataService.onUnbind() which force close all tunnels
+        mSpyIwlanDataServiceProvider.forceCloseTunnels();
+        // Simulate DataService.onUnbind() which remove all IwlanDataServiceProviders
+        mSpyIwlanDataServiceProvider.close();
+        mTestLooper.dispatchAll();
+
+        verify(mMockEpdgTunnelManager, atLeastOnce()).closeTunnel(eq(TEST_APN_NAME), eq(true));
+        assertNotNull(mIwlanDataService.mIwlanDataServiceHandler);
+        // Should not raise NullPointerException
+        mSpyIwlanDataServiceProvider
+                .getIwlanTunnelCallback()
+                .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.NO_ERROR));
+        mTestLooper.dispatchAll();
+    }
+
     private void mockTunnelSetupFail(DataProfile dp) {
         mSpyIwlanDataServiceProvider.setupDataCall(
                 AccessNetworkType.IWLAN, /* AccessNetworkType */