Loading res/values/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -10142,6 +10142,9 @@ <!-- Format for a summary describing the amount of data before the user is warned or limited [CHAR LIMIT=NONE] --> <string name="cell_data_warning_and_limit"><xliff:g name="amount" example="1 GB">^1</xliff:g> data warning / <xliff:g name="amount" example="2 GB">^2</xliff:g> data limit</string> <!-- A summary shown on data usage screens to indicate inaccuracy of data tracking [CHAR LIMIT=NONE] --> <string name="operator_warning">Carrier data accounting may differ from device accounting</string> <!-- A summary shown on data usage screens to indicate data tracking excluded from carrier networks [CHAR LIMIT=NONE] --> <string name="non_carrier_data_usage_warning">Excludes data used by carrier networks</string> res/xml/data_usage_list.xml +1 −2 Original line number Diff line number Diff line Loading @@ -27,8 +27,7 @@ /> <Preference android:key="non_carrier_data_usage_warning" android:summary="@string/non_carrier_data_usage_warning" android:key="warning" android:selectable="false" /> </PreferenceCategory> Loading src/com/android/settings/datausage/DataUsageList.kt +16 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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<Preference>(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?) { Loading Loading @@ -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" } } tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt +61 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -38,12 +41,14 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.spy import org.mockito.kotlin.stub private val mockUserManager: UserManager = mock<UserManager>() private val mockUserManager = mock<UserManager>() 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) Loading @@ -51,6 +56,9 @@ class DataUsageListTest { @Before fun setUp() { spyContext.stub { on { resources } doReturn spyResources } mockUserManager.stub { on { isGuestUser } doReturn false } Loading Loading @@ -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<TestDataUsageList>(initialState = Lifecycle.State.CREATED) scenario.withFragment { assertThat(findPreference<Preference>(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<TestDataUsageList>(initialState = Lifecycle.State.CREATED) scenario.withFragment { assertThat(findPreference<Preference>(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<TestDataUsageList>(initialState = Lifecycle.State.CREATED) scenario.withFragment { assertThat(findPreference<Preference>(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 } Loading
res/values/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -10142,6 +10142,9 @@ <!-- Format for a summary describing the amount of data before the user is warned or limited [CHAR LIMIT=NONE] --> <string name="cell_data_warning_and_limit"><xliff:g name="amount" example="1 GB">^1</xliff:g> data warning / <xliff:g name="amount" example="2 GB">^2</xliff:g> data limit</string> <!-- A summary shown on data usage screens to indicate inaccuracy of data tracking [CHAR LIMIT=NONE] --> <string name="operator_warning">Carrier data accounting may differ from device accounting</string> <!-- A summary shown on data usage screens to indicate data tracking excluded from carrier networks [CHAR LIMIT=NONE] --> <string name="non_carrier_data_usage_warning">Excludes data used by carrier networks</string>
res/xml/data_usage_list.xml +1 −2 Original line number Diff line number Diff line Loading @@ -27,8 +27,7 @@ /> <Preference android:key="non_carrier_data_usage_warning" android:summary="@string/non_carrier_data_usage_warning" android:key="warning" android:selectable="false" /> </PreferenceCategory> Loading
src/com/android/settings/datausage/DataUsageList.kt +16 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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<Preference>(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?) { Loading Loading @@ -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" } }
tests/spa_unit/src/com/android/settings/datausage/DataUsageListTest.kt +61 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -38,12 +41,14 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.spy import org.mockito.kotlin.stub private val mockUserManager: UserManager = mock<UserManager>() private val mockUserManager = mock<UserManager>() 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) Loading @@ -51,6 +56,9 @@ class DataUsageListTest { @Before fun setUp() { spyContext.stub { on { resources } doReturn spyResources } mockUserManager.stub { on { isGuestUser } doReturn false } Loading Loading @@ -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<TestDataUsageList>(initialState = Lifecycle.State.CREATED) scenario.withFragment { assertThat(findPreference<Preference>(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<TestDataUsageList>(initialState = Lifecycle.State.CREATED) scenario.withFragment { assertThat(findPreference<Preference>(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<TestDataUsageList>(initialState = Lifecycle.State.CREATED) scenario.withFragment { assertThat(findPreference<Preference>(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 }