From 04854f82340643e45c57f5f0341b31c548cff02c Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Fri, 20 Mar 2020 13:34:33 +0800 Subject: [PATCH] [Wi-Fi] Fix exception when WifiTracker2 callbacks to Wi-Fi Settings When WifiTracker2 callbacks to Wi-Fi Settings, should check if the activity is finishing at first. Bug: 151677440 Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=WifiSettings2Test Change-Id: I95737eae3f67e6471c75ba845b57af2d721d5d37 --- .../settings/SettingsPreferenceFragment.java | 5 +++++ .../android/settings/wifi/WifiSettings2.java | 19 +++++++++--------- .../SavedAccessPointsWifiSettings2.java | 6 ++++++ .../settings/wifi/WifiSettings2Test.java | 20 +++++++++++++++++++ 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 80e57060431..659ada4bd40 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -699,4 +699,9 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF } getActivity().setResult(result); } + + protected boolean isFinishingOrDestroyed() { + final Activity activity = getActivity(); + return activity == null || activity.isFinishing() || activity.isDestroyed(); + } } diff --git a/src/com/android/settings/wifi/WifiSettings2.java b/src/com/android/settings/wifi/WifiSettings2.java index b94994edc98..13ccdc3695b 100644 --- a/src/com/android/settings/wifi/WifiSettings2.java +++ b/src/com/android/settings/wifi/WifiSettings2.java @@ -674,11 +674,17 @@ public class WifiSettings2 extends RestrictedSettingsFragment @Override public void onNumSavedNetworksChanged() { + if (isFinishingOrDestroyed()) { + return; + } setAdditionalSettingsSummaries(); } @Override public void onNumSavedSubscriptionsChanged() { + if (isFinishingOrDestroyed()) { + return; + } setAdditionalSettingsSummaries(); } @@ -993,12 +999,10 @@ public class WifiSettings2 extends RestrictedSettingsFragment @Override public void onFailure(int reason) { - final Activity activity = getActivity(); - if (isFisishingOrDestroyed(activity)) { + if (isFinishingOrDestroyed()) { return; } - - Toast.makeText(activity, R.string.wifi_failed_connect_message, Toast.LENGTH_SHORT) + Toast.makeText(getContext(), R.string.wifi_failed_connect_message, Toast.LENGTH_SHORT) .show(); } }; @@ -1020,8 +1024,7 @@ public class WifiSettings2 extends RestrictedSettingsFragment @Override public void onConnectResult(@ConnectStatus int status) { - final Activity activity = getActivity(); - if (isFisishingOrDestroyed(activity)) { + if (isFinishingOrDestroyed()) { return; } @@ -1041,10 +1044,6 @@ public class WifiSettings2 extends RestrictedSettingsFragment } } - private boolean isFisishingOrDestroyed(Activity activity) { - return activity == null || activity.isFinishing() || activity.isDestroyed(); - } - private void launchConfigNewNetworkFragment(WifiEntry wifiEntry) { final Bundle bundle = new Bundle(); bundle.putString(WifiNetworkDetailsFragment2.KEY_CHOSEN_WIFIENTRY_KEY, diff --git a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java index 0145bb48d32..c70f0773175 100644 --- a/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java +++ b/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2.java @@ -153,6 +153,9 @@ public class SavedAccessPointsWifiSettings2 extends DashboardFragment @Override public void onSavedWifiEntriesChanged() { + if (isFinishingOrDestroyed()) { + return; + } final PreferenceScreen screen = getPreferenceScreen(); use(SavedAccessPointsPreferenceController2.class) .displayPreference(screen, mSavedNetworkTracker.getSavedWifiEntries()); @@ -160,6 +163,9 @@ public class SavedAccessPointsWifiSettings2 extends DashboardFragment @Override public void onSubscriptionWifiEntriesChanged() { + if (isFinishingOrDestroyed()) { + return; + } final PreferenceScreen screen = getPreferenceScreen(); use(SubscribedAccessPointsPreferenceController2.class) .displayPreference(screen, mSavedNetworkTracker.getSubscriptionWifiEntries()); diff --git a/tests/robotests/src/com/android/settings/wifi/WifiSettings2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiSettings2Test.java index c85ea497973..b4aea4f1710 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiSettings2Test.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiSettings2Test.java @@ -280,4 +280,24 @@ public class WifiSettings2Test { verify(mWifiSettings2, times(1)).startActivityForResult(any(), anyInt()); } + + @Test + public void onNumSavedNetworksChanged_isFinishing_ShouldNotCrash() { + final FragmentActivity activity = mock(FragmentActivity.class); + when(activity.isFinishing()).thenReturn(true); + when(mWifiSettings2.getActivity()).thenReturn(activity); + when(mWifiSettings2.getContext()).thenReturn(null); + + mWifiSettings2.onNumSavedNetworksChanged(); + } + + @Test + public void onNumSavedSubscriptionsChanged_isFinishing_ShouldNotCrash() { + final FragmentActivity activity = mock(FragmentActivity.class); + when(activity.isFinishing()).thenReturn(true); + when(mWifiSettings2.getActivity()).thenReturn(activity); + when(mWifiSettings2.getContext()).thenReturn(null); + + mWifiSettings2.onNumSavedSubscriptionsChanged(); + } }