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
This commit is contained in:
hoffc
2022-02-08 14:30:35 +08:00
committed by Weng Su
parent 41790c684b
commit f3fe5cf197
2 changed files with 20 additions and 3 deletions

View File

@@ -190,6 +190,8 @@ public class WifiSettings extends RestrictedSettingsFragment
// Worker thread used for WifiPickerTracker work
private HandlerThread mWorkerThread;
private Handler mMainHandler;
private Handler mWorkerHandler;
@VisibleForTesting
WifiPickerTracker mWifiPickerTracker;
@@ -290,11 +292,13 @@ public class WifiSettings extends RestrictedSettingsFragment
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 @@ public class WifiSettings extends RestrictedSettingsFragment
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 @@ public class WifiSettings extends RestrictedSettingsFragment
/** 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 @@ public class WifiSettings extends RestrictedSettingsFragment
@Override
public void onWifiEntriesChanged() {
if (isFinishingOrDestroyed()) {
return;
}
if (mIsWifiEntryListStale) {
mIsWifiEntryListStale = false;
updateWifiEntryPreferences();

View File

@@ -277,6 +277,11 @@ public class WifiSettingsTest {
@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());