Disable App data usage preference if there's no usage data.
- when there is no usage data at all, launching the app data usage page
will show something blank, as there's no cycle with available usage
data. Check the overall historic usage to make sure that there's
usage data to be shown, otherwise, disable the preference.
Fixes: 123518021
Test: make RunSettingsRoboTests
Change-Id: I2d19f85e8618c41e2c31b9e4259cdc522f69e371
diff --git a/src/com/android/settings/network/telephony/DataUsagePreferenceController.java b/src/com/android/settings/network/telephony/DataUsagePreferenceController.java
index 7028a3e..f9e0a97 100644
--- a/src/com/android/settings/network/telephony/DataUsagePreferenceController.java
+++ b/src/com/android/settings/network/telephony/DataUsagePreferenceController.java
@@ -63,7 +63,16 @@
@Override
public void updateState(Preference preference) {
super.updateState(preference);
- final boolean enabled = mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ preference.setEnabled(false);
+ return;
+ }
+ long usageLevel = mDataUsageInfo.usageLevel;
+ if (usageLevel <= 0L) {
+ final DataUsageController controller = new DataUsageController(mContext);
+ usageLevel = controller.getHistoricalUsageLevel(mTemplate);
+ }
+ final boolean enabled = usageLevel > 0L;
preference.setEnabled(enabled);
if (enabled) {
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
index f77a94f..348f8b4 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
@@ -18,11 +18,17 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.app.Activity;
+import android.app.usage.NetworkStats;
import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.content.Intent;
@@ -33,6 +39,7 @@
import androidx.preference.SwitchPreference;
import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.net.DataUsageController;
import org.junit.Before;
import org.junit.Test;
@@ -42,6 +49,7 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
+import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
public class DataUsagePreferenceControllerTest {
@@ -104,4 +112,18 @@
assertThat(mPreference.isEnabled()).isFalse();
}
+
+ @Test
+ public void updateState_noUsageData_shouldDisablePreference() throws Exception {
+ final NetworkStatsManager networkStatsManager = mock(NetworkStatsManager.class);
+ when(networkStatsManager.querySummaryForDevice(anyInt() /* networkType */,
+ anyString() /* subscriberId */, anyLong() /* startTime */, anyLong() /* endTime */))
+ .thenReturn(mock(NetworkStats.Bucket.class));
+ ReflectionHelpers.setField(
+ mController, "mDataUsageInfo", new DataUsageController.DataUsageInfo());
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
}