Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a916eaa authored by Weng Su's avatar Weng Su
Browse files

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
parent e796b8bf
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -167,7 +167,8 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
    }

    private boolean mIsViewLoading;
    private final Runnable mRemoveLoadingRunnable = () -> {
    @VisibleForTesting
    final Runnable mRemoveLoadingRunnable = () -> {
        if (mIsViewLoading) {
            setLoading(false, false);
            mIsViewLoading = false;
@@ -175,11 +176,13 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
    };

    private boolean mIsWifiEntryListStale = true;
    private final Runnable mUpdateWifiEntryPreferencesRunnable = () -> {
    @VisibleForTesting
    final Runnable mUpdateWifiEntryPreferencesRunnable = () -> {
        updateWifiEntryPreferences();
        getView().postDelayed(mRemoveLoadingRunnable, 10);
    };
    private final Runnable mHideProgressBarRunnable = () -> {
    @VisibleForTesting
    final Runnable mHideProgressBarRunnable = () -> {
        setProgressBarVisible(false);
    };

@@ -445,6 +448,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
    @Override
    public void onStop() {
        mIsWifiEntryListStale = true;
        getView().removeCallbacks(mRemoveLoadingRunnable);
        getView().removeCallbacks(mUpdateWifiEntryPreferencesRunnable);
        getView().removeCallbacks(mHideProgressBarRunnable);
        mAirplaneModeEnabler.stop();
+27 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import android.view.View;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.recyclerview.widget.RecyclerView;
@@ -79,6 +80,8 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowToast;

@RunWith(RobolectricTestRunner.class)
@@ -527,4 +530,28 @@ public class NetworkProviderSettingsTest {

        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
        }
    }
}