[Wi-Fi] Fix data usage screen flash 1~2 times problem

Data loaders should be destroyed at onPause or
the APP list will be updated twice.

Bug: 146841747
Test: make RunSettingsRoboTests ROBOTEST_FILTER=DataUsageListTest
Change-Id: Ic1b8ef443dd8e50777f1e3a16977add654748c54
diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java
index 0cfb831..8db32e9 100644
--- a/src/com/android/settings/datausage/DataUsageList.java
+++ b/src/com/android/settings/datausage/DataUsageList.java
@@ -90,8 +90,10 @@
     private static final String KEY_APP = "app";
     private static final String KEY_FIELDS = "fields";
 
-    private static final int LOADER_CHART_DATA = 2;
-    private static final int LOADER_SUMMARY = 3;
+    @VisibleForTesting
+    static final int LOADER_CHART_DATA = 2;
+    @VisibleForTesting
+    static final int LOADER_SUMMARY = 3;
 
     @VisibleForTesting
     MobileDataEnabledListener mDataStateListener;
@@ -188,6 +190,13 @@
     public void onResume() {
         super.onResume();
         mDataStateListener.start(mSubId);
+
+        // kick off loader for network history
+        // TODO: consider chaining two loaders together instead of reloading
+        // network history when showing app detail.
+        getLoaderManager().restartLoader(LOADER_CHART_DATA,
+                buildArgs(mTemplate), mNetworkCycleDataCallbacks);
+
         updateBody();
     }
 
@@ -195,6 +204,9 @@
     public void onPause() {
         super.onPause();
         mDataStateListener.stop();
+
+        getLoaderManager().destroyLoader(LOADER_CHART_DATA);
+        getLoaderManager().destroyLoader(LOADER_SUMMARY);
     }
 
     @Override
@@ -246,12 +258,6 @@
 
         final Context context = getActivity();
 
-        // kick off loader for network history
-        // TODO: consider chaining two loaders together instead of reloading
-        // network history when showing app detail.
-        getLoaderManager().restartLoader(LOADER_CHART_DATA,
-                buildArgs(mTemplate), mNetworkCycleDataCallbacks);
-
         // detail mode can change visible menus, invalidate
         getActivity().invalidateOptionsMenu();
 
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
index 9aca92e..e4f5b1f 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
@@ -38,6 +38,7 @@
 import android.widget.Spinner;
 
 import androidx.fragment.app.FragmentActivity;
+import androidx.loader.app.LoaderManager;
 import androidx.preference.PreferenceManager;
 
 import com.android.settings.R;
@@ -71,6 +72,8 @@
     private MobileDataEnabledListener mMobileDataEnabledListener;
     @Mock
     private TemplatePreference.NetworkServices mNetworkServices;
+    @Mock
+    private LoaderManager mLoaderManager;
 
     private Activity mActivity;
     private DataUsageList mDataUsageList;
@@ -90,6 +93,7 @@
         ReflectionHelpers.setField(mDataUsageList, "mDataStateListener",
                 mMobileDataEnabledListener);
         ReflectionHelpers.setField(mDataUsageList, "services", mNetworkServices);
+        doReturn(mLoaderManager).when(mDataUsageList).getLoaderManager();
     }
 
     @Test
@@ -216,6 +220,14 @@
         assertThat(spinner.getVisibility()).isEqualTo(View.VISIBLE);
     }
 
+    @Test
+    public void onPause_shouldDestroyLoaders() {
+        mDataUsageList.onPause();
+
+        verify(mLoaderManager).destroyLoader(DataUsageList.LOADER_CHART_DATA);
+        verify(mLoaderManager).destroyLoader(DataUsageList.LOADER_SUMMARY);
+    }
+
     private View getHeader() {
         final View rootView = LayoutInflater.from(mActivity)
                 .inflate(R.layout.preference_list_fragment, null, false);