diff --git a/src/com/android/settings/datausage/DataUsagePreference.java b/src/com/android/settings/datausage/DataUsagePreference.java index af8d6d46e73..09465f7f075 100644 --- a/src/com/android/settings/datausage/DataUsagePreference.java +++ b/src/com/android/settings/datausage/DataUsagePreference.java @@ -21,6 +21,7 @@ import android.net.NetworkTemplate; import android.os.Bundle; import android.util.AttributeSet; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.SubSettingLauncher; @@ -51,17 +52,24 @@ public class DataUsagePreference extends Preference implements TemplatePreferenc NetworkServices services) { mTemplate = template; mSubId = subId; - DataUsageController controller = new DataUsageController(getContext()); - DataUsageController.DataUsageInfo usageInfo = controller.getDataUsageInfo(mTemplate); + final DataUsageController controller = getDataUsageController(); if (mTemplate.isMatchRuleMobile()) { setTitle(R.string.app_cellular_data_usage); } else { + final DataUsageController.DataUsageInfo usageInfo = + controller.getDataUsageInfo(mTemplate); setTitle(mTitleRes); setSummary(getContext().getString(R.string.data_usage_template, DataUsageUtils.formatDataUsage(getContext(), usageInfo.usageLevel), usageInfo.period)); } - setIntent(getIntent()); + final long usageLevel = controller.getHistoriclUsageLevel(template); + if (usageLevel > 0L) { + setIntent(getIntent()); + } else { + setIntent(null); + setEnabled(false); + } } @Override @@ -80,4 +88,9 @@ public class DataUsagePreference extends Preference implements TemplatePreferenc } return launcher.toIntent(); } + + @VisibleForTesting + DataUsageController getDataUsageController() { + return new DataUsageController(getContext()); + } } diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java index d0e48710cbc..ee9798df712 100644 --- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java +++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java @@ -38,6 +38,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.SubSettingLauncher; import com.android.settingslib.Utils; +import com.android.settingslib.net.DataUsageController; import com.android.settingslib.utils.StringUtil; import java.util.Objects; @@ -177,9 +178,14 @@ public class DataUsageSummaryPreference extends Preference { carrierInfo.setVisibility(View.GONE); limitInfo.setVisibility(View.GONE); - launchButton.setOnClickListener((view) -> { - launchWifiDataUsage(getContext()); - }); + final long usageLevel = getHistoriclUsageLevel(); + if (usageLevel > 0L) { + launchButton.setOnClickListener((view) -> { + launchWifiDataUsage(getContext()); + }); + } else { + launchButton.setEnabled(false); + } launchButton.setText(R.string.launch_wifi_text); launchButton.setVisibility(View.VISIBLE); } else { @@ -331,4 +337,11 @@ public class DataUsageSummaryPreference extends Preference { carrierInfo.setTextColor(Utils.getColorAttr(getContext(), colorId)); carrierInfo.setTypeface(typeface); } + + @VisibleForTesting + long getHistoriclUsageLevel() { + final DataUsageController controller = new DataUsageController(getContext()); + return controller.getHistoriclUsageLevel(NetworkTemplate.buildTemplateWifiWildcard()); + } + } diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java new file mode 100644 index 00000000000..422450a9d40 --- /dev/null +++ b/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.datausage; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.content.Intent; +import android.net.NetworkTemplate; + +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.net.DataUsageController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; + +@RunWith(SettingsRobolectricTestRunner.class) +public class DataUsagePreferenceTest { + + @Mock + private DataUsageController mController; + + private Context mContext; + private DataUsagePreference mPreference; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = RuntimeEnvironment.application; + mPreference = spy(new DataUsagePreference(mContext, null /* attrs */)); + doReturn(mController).when(mPreference).getDataUsageController(); + + } + + @Test + public void setTemplate_noDataUsage_shouldDisablePreference() { + doReturn(0L).when(mController).getHistoriclUsageLevel(any(NetworkTemplate.class)); + + mPreference.setTemplate( + NetworkTemplate.buildTemplateMobileWildcard(), 5 /* subId */, null /* services */); + + verify(mPreference).setEnabled(false); + verify(mPreference).setIntent(null); + } + + @Test + public void setTemplate_hasDataUsage_shouldNotDisablePreference() { + doReturn(200L).when(mController).getHistoriclUsageLevel(any(NetworkTemplate.class)); + + mPreference.setTemplate( + NetworkTemplate.buildTemplateMobileWildcard(), 5 /* subId */, null /* services */); + + verify(mPreference, never()).setEnabled(false); + verify(mPreference).setIntent(any(Intent.class)); + } +} diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java index 5b724715b39..d1655b71b17 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java @@ -486,11 +486,13 @@ public class DataUsageSummaryPreferenceTest { final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft) + TimeUnit.HOURS.toMillis(1); final Activity activity = Robolectric.setupActivity(Activity.class); + mSummaryPreference = spy(mSummaryPreference); mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */, new Intent()); mSummaryPreference.setUsageNumbers(1000000L, -1L, true); final String cycleText = "The quick fox"; mSummaryPreference.setWifiMode(true, cycleText); + doReturn(200L).when(mSummaryPreference).getHistoriclUsageLevel(); bindViewHolder(); assertThat(mUsageTitle.getText().toString()) @@ -522,6 +524,17 @@ public class DataUsageSummaryPreferenceTest { .isEqualTo(R.string.wifi_data_usage); } + @Test + public void testSetWifiMode_noUsageInfo_shouldDisableLaunchButton() { + mSummaryPreference = spy(mSummaryPreference); + mSummaryPreference.setWifiMode(true, "Test cycle text"); + doReturn(0L).when(mSummaryPreference).getHistoriclUsageLevel(); + + bindViewHolder(); + + assertThat(mLaunchButton.isEnabled()).isFalse(); + } + private void bindViewHolder() { mSummaryPreference.onBindViewHolder(mHolder); mUsageTitle = (TextView) mHolder.findViewById(R.id.usage_title);