diff --git a/res/values/strings.xml b/res/values/strings.xml index 408ba8c812f..8abd6bee4c3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10142,6 +10142,9 @@ ^1 data warning / ^2 data limit + + Carrier data accounting may differ from device accounting + Excludes data used by carrier networks diff --git a/res/xml/data_usage_list.xml b/res/xml/data_usage_list.xml index 62456ed64a4..292d729998f 100644 --- a/res/xml/data_usage_list.xml +++ b/res/xml/data_usage_list.xml @@ -27,8 +27,7 @@ /> diff --git a/src/com/android/settings/datausage/DataUsageList.kt b/src/com/android/settings/datausage/DataUsageList.kt index 3083fb75443..1995097d6f1 100644 --- a/src/com/android/settings/datausage/DataUsageList.kt +++ b/src/com/android/settings/datausage/DataUsageList.kt @@ -34,6 +34,7 @@ import com.android.settings.dashboard.DashboardFragment import com.android.settings.datausage.lib.BillingCycleRepository import com.android.settings.datausage.lib.NetworkUsageData import com.android.settings.network.MobileNetworkRepository +import com.android.settings.network.SubscriptionUtil import com.android.settings.network.mobileDataEnabledFlow import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle @@ -95,6 +96,18 @@ open class DataUsageList : DashboardFragment() { } chartDataUsagePreferenceController = use(ChartDataUsagePreferenceController::class.java) .apply { init(template) } + + updateWarning() + } + + private fun updateWarning() { + val template = template ?: return + val warningPreference = findPreference(KEY_WARNING)!! + if (template.matchRule != NetworkTemplate.MATCH_WIFI) { + warningPreference.setSummary(R.string.operator_warning) + } else if (SubscriptionUtil.isSimHardwareVisible(context)) { + warningPreference.setSummary(R.string.non_carrier_data_usage_warning) + } } override fun onViewCreated(v: View, savedInstanceState: Bundle?) { @@ -188,5 +201,8 @@ open class DataUsageList : DashboardFragment() { private const val TAG = "DataUsageList" private const val KEY_USAGE_AMOUNT = "usage_amount" + + @VisibleForTesting + const val KEY_WARNING = "warning" } } diff --git a/tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt b/tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt index 29ec0eed352..7274eaa995f 100644 --- a/tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt +++ b/tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt @@ -26,8 +26,11 @@ import androidx.core.os.bundleOf import androidx.fragment.app.testing.launchFragment import androidx.fragment.app.testing.withFragment import androidx.lifecycle.Lifecycle +import androidx.preference.Preference import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settings.R +import com.android.settings.datausage.DataUsageList.Companion.KEY_WARNING import com.android.settingslib.spaprivileged.framework.common.userManager import com.google.common.truth.Truth.assertThat import org.junit.Before @@ -38,12 +41,14 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.spy import org.mockito.kotlin.stub -private val mockUserManager: UserManager = mock() +private val mockUserManager = mock() -private val mockContext: Context = spy(ApplicationProvider.getApplicationContext()) { +private val spyContext: Context = spy(ApplicationProvider.getApplicationContext()) { on { userManager } doReturn mockUserManager } +private val spyResources = spy(spyContext.resources) + private var fakeIntent = Intent() @RunWith(AndroidJUnit4::class) @@ -51,6 +56,9 @@ class DataUsageListTest { @Before fun setUp() { + spyContext.stub { + on { resources } doReturn spyResources + } mockUserManager.stub { on { isGuestUser } doReturn false } @@ -122,10 +130,60 @@ class DataUsageListTest { assertThat(activity!!.isFinishing).isFalse() } } + + @Test + fun warning_wifiAndHasSim_displayNonCarrierWarning() { + val template = NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build() + spyResources.stub { + on { getBoolean(R.bool.config_show_sim_info) } doReturn true + } + fakeIntent = Intent().apply { + putExtra(Settings.EXTRA_NETWORK_TEMPLATE, template) + } + + val scenario = launchFragment(initialState = Lifecycle.State.CREATED) + + scenario.withFragment { + assertThat(findPreference(KEY_WARNING)!!.summary) + .isEqualTo(context.getString(R.string.non_carrier_data_usage_warning)) + } + } + + @Test + fun warning_wifiAndNoSim_noWarning() { + val template = NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build() + spyResources.stub { + on { getBoolean(R.bool.config_show_sim_info) } doReturn false + } + fakeIntent = Intent().apply { + putExtra(Settings.EXTRA_NETWORK_TEMPLATE, template) + } + + val scenario = launchFragment(initialState = Lifecycle.State.CREATED) + + scenario.withFragment { + assertThat(findPreference(KEY_WARNING)!!.summary).isNull() + } + } + + @Test + fun warning_mobile_operatorWarning() { + val template = NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE).build() + fakeIntent = Intent().apply { + putExtra(Settings.EXTRA_NETWORK_TEMPLATE, template) + } + + val scenario = launchFragment(initialState = Lifecycle.State.CREATED) + + scenario.withFragment { + assertThat(findPreference(KEY_WARNING)!!.summary) + .isEqualTo(context.getString(R.string.operator_warning)) + } + } } class TestDataUsageList : DataUsageList() { - override fun getContext() = mockContext + override fun getContext() = spyContext override fun getIntent() = fakeIntent }