Settings: Fix WifiSettings FC when rotating screen

Rotating screen will trigger wifisettings re-creation. Force close occurs If receiving wifi picker tracker callback during activity finishing.

Bug: 218411211
Test: manual test
make RunSettingsRoboTests ROBOTEST_FILTER=WifiSettingsTest

Change-Id: I06d251a8a12d3f8785db24ead0abe31c0f34cc9b
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index f0ae90e..7f41f36 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -190,6 +190,8 @@
 
     // Worker thread used for WifiPickerTracker work
     private HandlerThread mWorkerThread;
+    private Handler mMainHandler;
+    private Handler mWorkerHandler;
 
     @VisibleForTesting
     WifiPickerTracker mWifiPickerTracker;
@@ -290,11 +292,13 @@
                 return SystemClock.elapsedRealtime();
             }
         };
+
+        mMainHandler = new Handler(Looper.getMainLooper());
+        mWorkerHandler = mWorkerThread.getThreadHandler();
         mWifiPickerTracker = FeatureFactory.getFactory(context)
                 .getWifiTrackerLibProvider()
                 .createWifiPickerTracker(getSettingsLifecycle(), context,
-                        new Handler(Looper.getMainLooper()),
-                        mWorkerThread.getThreadHandler(),
+                        mMainHandler, mWorkerHandler,
                         elapsedRealtimeClock,
                         MAX_SCAN_AGE_MILLIS,
                         SCAN_INTERVAL_MILLIS,
@@ -366,6 +370,10 @@
         if (mWifiEnabler != null) {
             mWifiEnabler.teardownSwitchController();
         }
+
+        // remove all msg and callback in main handler and worker handler
+        mMainHandler.removeCallbacksAndMessages(null);
+        mWorkerHandler.removeCallbacksAndMessages(null);
         mWorkerThread.quit();
 
         super.onDestroyView();
@@ -650,7 +658,7 @@
     /** Called when the state of Wifi has changed. */
     @Override
     public void onWifiStateChanged() {
-        if (mIsRestricted) {
+        if (mIsRestricted || isFinishingOrDestroyed()) {
             return;
         }
         final int wifiState = mWifiPickerTracker.getWifiState();
@@ -688,6 +696,10 @@
 
     @Override
     public void onWifiEntriesChanged() {
+        if (isFinishingOrDestroyed()) {
+            return;
+        }
+
         if (mIsWifiEntryListStale) {
             mIsWifiEntryListStale = false;
             updateWifiEntryPreferences();
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java
index 5f2f564..abed447 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java
@@ -277,6 +277,11 @@
 
     @Test
     public void onWifiEntriesChanged_shouldChangeNextButtonState() {
+        final FragmentActivity activity = mock(FragmentActivity.class);
+        doReturn(false).when(activity).isFinishing();
+        doReturn(false).when(activity).isDestroyed();
+        doReturn(activity).when(mWifiSettings).getActivity();
+
         mWifiSettings.onWifiEntriesChanged();
 
         verify(mWifiSettings).changeNextButtonState(anyBoolean());