From 55a189a6401f984a457d937d3b0a116d2dff9117 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Thu, 21 Feb 2019 15:56:19 -0800 Subject: [PATCH] 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 --- .../DataUsagePreferenceController.java | 11 +++++++++- .../DataUsagePreferenceControllerTest.java | 22 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/network/telephony/DataUsagePreferenceController.java b/src/com/android/settings/network/telephony/DataUsagePreferenceController.java index 7028a3e7ff0..f9e0a9724d6 100644 --- a/src/com/android/settings/network/telephony/DataUsagePreferenceController.java +++ b/src/com/android/settings/network/telephony/DataUsagePreferenceController.java @@ -63,7 +63,16 @@ public class DataUsagePreferenceController extends TelephonyBasePreferenceContro @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 f77a94f9086..348f8b4cbe1 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 @@ package com.android.settings.network.telephony; 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 android.telephony.TelephonyManager; 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.Mock; 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 @@ public class DataUsagePreferenceControllerTest { 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(); + } }