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(); + } }