Fix the NPE issue in the Internet Settings
- Missing to remove the mRemoveLoadingRunnable in the onStop() function, which will cause the callback to run after the fragment is destroyed and encounter this NPE issue. Bug: 193405782 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=NetworkProviderSettingsTest Change-Id: I48b85173db1e6689dd056ba71f2fac776ffabbc9
This commit is contained in:
@@ -167,7 +167,8 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean mIsViewLoading;
|
private boolean mIsViewLoading;
|
||||||
private final Runnable mRemoveLoadingRunnable = () -> {
|
@VisibleForTesting
|
||||||
|
final Runnable mRemoveLoadingRunnable = () -> {
|
||||||
if (mIsViewLoading) {
|
if (mIsViewLoading) {
|
||||||
setLoading(false, false);
|
setLoading(false, false);
|
||||||
mIsViewLoading = false;
|
mIsViewLoading = false;
|
||||||
@@ -175,11 +176,13 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
|
|||||||
};
|
};
|
||||||
|
|
||||||
private boolean mIsWifiEntryListStale = true;
|
private boolean mIsWifiEntryListStale = true;
|
||||||
private final Runnable mUpdateWifiEntryPreferencesRunnable = () -> {
|
@VisibleForTesting
|
||||||
|
final Runnable mUpdateWifiEntryPreferencesRunnable = () -> {
|
||||||
updateWifiEntryPreferences();
|
updateWifiEntryPreferences();
|
||||||
getView().postDelayed(mRemoveLoadingRunnable, 10);
|
getView().postDelayed(mRemoveLoadingRunnable, 10);
|
||||||
};
|
};
|
||||||
private final Runnable mHideProgressBarRunnable = () -> {
|
@VisibleForTesting
|
||||||
|
final Runnable mHideProgressBarRunnable = () -> {
|
||||||
setProgressBarVisible(false);
|
setProgressBarVisible(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -445,6 +448,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
|
|||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onStop() {
|
||||||
mIsWifiEntryListStale = true;
|
mIsWifiEntryListStale = true;
|
||||||
|
getView().removeCallbacks(mRemoveLoadingRunnable);
|
||||||
getView().removeCallbacks(mUpdateWifiEntryPreferencesRunnable);
|
getView().removeCallbacks(mUpdateWifiEntryPreferencesRunnable);
|
||||||
getView().removeCallbacks(mHideProgressBarRunnable);
|
getView().removeCallbacks(mHideProgressBarRunnable);
|
||||||
mAirplaneModeEnabler.stop();
|
mAirplaneModeEnabler.stop();
|
||||||
|
@@ -53,6 +53,7 @@ import android.view.View;
|
|||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceCategory;
|
import androidx.preference.PreferenceCategory;
|
||||||
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
@@ -79,6 +80,8 @@ import org.mockito.MockitoAnnotations;
|
|||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
import org.robolectric.annotation.Implementation;
|
||||||
|
import org.robolectric.annotation.Implements;
|
||||||
import org.robolectric.shadows.ShadowToast;
|
import org.robolectric.shadows.ShadowToast;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@@ -527,4 +530,28 @@ public class NetworkProviderSettingsTest {
|
|||||||
|
|
||||||
verify(mNetworkProviderSettings.mWifiEntryPreferenceCategory, never()).setVisible(true);
|
verify(mNetworkProviderSettings.mWifiEntryPreferenceCategory, never()).setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Config(shadows = ShadowPreferenceFragmentCompat.class)
|
||||||
|
public void onStop_shouldRemoveCallbacks() {
|
||||||
|
View fragmentView = mock(View.class);
|
||||||
|
when(mNetworkProviderSettings.getView()).thenReturn(fragmentView);
|
||||||
|
|
||||||
|
mNetworkProviderSettings.onStop();
|
||||||
|
|
||||||
|
verify(fragmentView).removeCallbacks(mNetworkProviderSettings.mRemoveLoadingRunnable);
|
||||||
|
verify(fragmentView).removeCallbacks(
|
||||||
|
mNetworkProviderSettings.mUpdateWifiEntryPreferencesRunnable);
|
||||||
|
verify(fragmentView).removeCallbacks(mNetworkProviderSettings.mHideProgressBarRunnable);
|
||||||
|
verify(mAirplaneModeEnabler).stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Implements(PreferenceFragmentCompat.class)
|
||||||
|
public static class ShadowPreferenceFragmentCompat {
|
||||||
|
|
||||||
|
@Implementation
|
||||||
|
public void onStop() {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user