Merge "Settings: Fix NPE FC when access saved wifi p2p device after screen rotation"
diff --git a/src/com/android/settings/network/InternetResetHelper.java b/src/com/android/settings/network/InternetResetHelper.java
index d6c5476..253cf56 100644
--- a/src/com/android/settings/network/InternetResetHelper.java
+++ b/src/com/android/settings/network/InternetResetHelper.java
@@ -204,7 +204,7 @@
     protected void resumePreferences() {
         if (mIsRecoveryReady && mMobileNetworkController != null) {
             Log.d(TAG, "Resume the Mobile Network controller");
-            mMobileNetworkController.hidePreference(false /* hide */, false /* immediately */);
+            mMobileNetworkController.hidePreference(false /* hide */, true /* immediately */);
         }
         if (mIsWifiReady && mWifiTogglePreferences != null) {
             Log.d(TAG, "Resume the Wi-Fi preferences");
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());
diff --git a/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java b/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
index 00ca8e1..3dbaa91 100644
--- a/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
+++ b/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
@@ -217,7 +217,7 @@
         // Show resetting preference
         assertThat(mResettingPreference.isVisible()).isTrue();
         // Show Mobile Network controller
-        verify(mMobileNetworkController).hidePreference(false /* hide */, false /* immediately*/);
+        verify(mMobileNetworkController).hidePreference(false /* hide */, true /* immediately*/);
         // Hide Wi-Fi preferences
         assertThat(mWifiTogglePreferences.isVisible()).isFalse();
         assertThat(mConnectedWifiEntryPreferences.isVisible()).isFalse();
@@ -240,7 +240,7 @@
         assertThat(mWifiEntryPreferences.isVisible()).isTrue();
         // Hide Mobile Network controller
         verify(mMobileNetworkController, never())
-                .hidePreference(false /* hide */, false /* immediately*/);
+                .hidePreference(false /* hide */, true /* immediately*/);
     }
 
     @Test
@@ -251,7 +251,7 @@
         mInternetResetHelper.resumePreferences();
 
         // Show subsystem preferences
-        verify(mMobileNetworkController).hidePreference(false, false);
+        verify(mMobileNetworkController).hidePreference(false, true);
         assertThat(mWifiTogglePreferences.isVisible()).isTrue();
         assertThat(mConnectedWifiEntryPreferences.isVisible()).isTrue();
         assertThat(mWifiEntryPreferences.isVisible()).isTrue();