Loading res/xml/mobile_network_settings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -91,9 +91,11 @@ settings:searchable="false" settings:controller="com.android.settings.network.telephony.RoamingPreferenceController"/> <!-- Settings search is handled by DataUsageSearchItem. --> <Preference android:key="data_usage_summary" android:title="@string/app_cellular_data_usage" settings:searchable="false" settings:controller="com.android.settings.network.telephony.DataUsagePreferenceController"/> <com.android.settings.datausage.BillingCyclePreference Loading src/com/android/settings/network/telephony/DataUsagePreferenceController.kt +30 −23 Original line number Diff line number Diff line Loading @@ -29,35 +29,32 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.preference.Preference import androidx.preference.PreferenceScreen import com.android.settings.R import com.android.settings.core.BasePreferenceController import com.android.settings.datausage.DataUsageUtils import com.android.settings.datausage.lib.DataUsageFormatter.FormattedDataUsage import com.android.settings.datausage.lib.DataUsageLib import com.android.settings.datausage.lib.NetworkCycleDataRepository import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.AllTimeRange import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchResult import com.android.settingslib.spaprivileged.framework.compose.getPlaceholder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext /** * Preference controller for "Data usage" */ /** Preference controller for "Data usage" */ class DataUsagePreferenceController(context: Context, key: String) : TelephonyBasePreferenceController(context, key) { BasePreferenceController(context, key) { private var subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID private lateinit var preference: Preference private var networkTemplate: NetworkTemplate? = null fun init(subId: Int) { mSubId = subId this.subId = subId } override fun getAvailabilityStatus(subId: Int): Int = when { SubscriptionManager.isValidSubscriptionId(subId) && DataUsageUtils.hasMobileData(mContext) -> AVAILABLE else -> AVAILABLE_UNSEARCHABLE } override fun getAvailabilityStatus() = AVAILABLE override fun displayPreference(screen: PreferenceScreen) { super.displayPreference(screen) Loading @@ -75,10 +72,11 @@ class DataUsagePreferenceController(context: Context, key: String) : override fun handlePreferenceTreeClick(preference: Preference): Boolean { if (preference.key != preferenceKey || networkTemplate == null) return false val intent = Intent(Settings.ACTION_MOBILE_DATA_USAGE).apply { val intent = Intent(Settings.ACTION_MOBILE_DATA_USAGE).apply { setPackage(mContext.packageName) putExtra(Settings.EXTRA_NETWORK_TEMPLATE, networkTemplate) putExtra(Settings.EXTRA_SUB_ID, mSubId) putExtra(Settings.EXTRA_SUB_ID, subId) } mContext.startActivity(intent) return true Loading @@ -93,13 +91,10 @@ class DataUsagePreferenceController(context: Context, key: String) : preference.summary = summary?.displayText } private fun getNetworkTemplate(): NetworkTemplate? = when { SubscriptionManager.isValidSubscriptionId(mSubId) -> { DataUsageLib.getMobileTemplate(mContext, mSubId) } else -> null } private fun getNetworkTemplate(): NetworkTemplate? = if (SubscriptionManager.isValidSubscriptionId(subId)) { DataUsageLib.getMobileTemplate(mContext, subId) } else null @VisibleForTesting fun createNetworkCycleDataRepository(): NetworkCycleDataRepository? = Loading @@ -118,4 +113,16 @@ class DataUsagePreferenceController(context: Context, key: String) : val allTimeUsage = repository.queryUsage(AllTimeRange) return allTimeUsage.getDataUsedString(mContext) to (allTimeUsage.usage > 0) } companion object { class DataUsageSearchItem(private val context: Context) : MobileNetworkSettingsSearchItem { override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? { if (!DataUsageUtils.hasMobileData(context)) return null return MobileNetworkSettingsSearchResult( key = "data_usage_summary", title = context.getString(R.string.app_cellular_data_usage), ) } } } } src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt +2 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.provider.Settings import android.telephony.SubscriptionInfo import com.android.settings.R import com.android.settings.network.SubscriptionUtil import com.android.settings.network.telephony.DataUsagePreferenceController.Companion.DataUsageSearchItem import com.android.settings.network.telephony.MmsMessagePreferenceController.Companion.MmsMessageSearchItem import com.android.settings.network.telephony.NrAdvancedCallingPreferenceController.Companion.NrAdvancedCallingSearchItem import com.android.settings.network.telephony.RoamingPreferenceController.Companion.RoamingSearchItem Loading Loading @@ -114,6 +115,7 @@ class MobileNetworkSettingsSearchIndex( fun createSearchItems(context: Context): List<MobileNetworkSettingsSearchItem> = listOf( DataUsageSearchItem(context), MmsMessageSearchItem(context), NrAdvancedCallingSearchItem(context), PreferredNetworkModeSearchItem(context), Loading tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt +1 −11 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.dx.mockito.inline.extended.ExtendedMockito import com.android.settings.core.BasePreferenceController.AVAILABLE import com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE import com.android.settings.datausage.DataUsageUtils import com.android.settings.datausage.lib.DataUsageLib import com.android.settings.datausage.lib.NetworkCycleDataRepository Loading Loading @@ -77,7 +76,6 @@ class DataUsagePreferenceControllerTest { @Before fun setUp() { mockSession = ExtendedMockito.mockitoSession() .initMocks(this) .spyStatic(DataUsageUtils::class.java) .spyStatic(DataUsageLib::class.java) .strictness(Strictness.LENIENT) Loading @@ -101,18 +99,10 @@ class DataUsagePreferenceControllerTest { } @Test fun getAvailabilityStatus_validSubId_returnAvailable() { fun getAvailabilityStatus_returnAvailable() { assertThat(controller.availabilityStatus).isEqualTo(AVAILABLE) } @Test fun getAvailabilityStatus_invalidSubId_returnUnsearchable() { val availabilityStatus = controller.getAvailabilityStatus(SubscriptionManager.INVALID_SUBSCRIPTION_ID) assertThat(availabilityStatus).isEqualTo(AVAILABLE_UNSEARCHABLE) } @Test fun handlePreferenceTreeClick_startActivity() = runBlocking { val usageData = NetworkUsageData(START_TIME, END_TIME, 1L) Loading Loading
res/xml/mobile_network_settings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -91,9 +91,11 @@ settings:searchable="false" settings:controller="com.android.settings.network.telephony.RoamingPreferenceController"/> <!-- Settings search is handled by DataUsageSearchItem. --> <Preference android:key="data_usage_summary" android:title="@string/app_cellular_data_usage" settings:searchable="false" settings:controller="com.android.settings.network.telephony.DataUsagePreferenceController"/> <com.android.settings.datausage.BillingCyclePreference Loading
src/com/android/settings/network/telephony/DataUsagePreferenceController.kt +30 −23 Original line number Diff line number Diff line Loading @@ -29,35 +29,32 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.preference.Preference import androidx.preference.PreferenceScreen import com.android.settings.R import com.android.settings.core.BasePreferenceController import com.android.settings.datausage.DataUsageUtils import com.android.settings.datausage.lib.DataUsageFormatter.FormattedDataUsage import com.android.settings.datausage.lib.DataUsageLib import com.android.settings.datausage.lib.NetworkCycleDataRepository import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.AllTimeRange import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchResult import com.android.settingslib.spaprivileged.framework.compose.getPlaceholder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext /** * Preference controller for "Data usage" */ /** Preference controller for "Data usage" */ class DataUsagePreferenceController(context: Context, key: String) : TelephonyBasePreferenceController(context, key) { BasePreferenceController(context, key) { private var subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID private lateinit var preference: Preference private var networkTemplate: NetworkTemplate? = null fun init(subId: Int) { mSubId = subId this.subId = subId } override fun getAvailabilityStatus(subId: Int): Int = when { SubscriptionManager.isValidSubscriptionId(subId) && DataUsageUtils.hasMobileData(mContext) -> AVAILABLE else -> AVAILABLE_UNSEARCHABLE } override fun getAvailabilityStatus() = AVAILABLE override fun displayPreference(screen: PreferenceScreen) { super.displayPreference(screen) Loading @@ -75,10 +72,11 @@ class DataUsagePreferenceController(context: Context, key: String) : override fun handlePreferenceTreeClick(preference: Preference): Boolean { if (preference.key != preferenceKey || networkTemplate == null) return false val intent = Intent(Settings.ACTION_MOBILE_DATA_USAGE).apply { val intent = Intent(Settings.ACTION_MOBILE_DATA_USAGE).apply { setPackage(mContext.packageName) putExtra(Settings.EXTRA_NETWORK_TEMPLATE, networkTemplate) putExtra(Settings.EXTRA_SUB_ID, mSubId) putExtra(Settings.EXTRA_SUB_ID, subId) } mContext.startActivity(intent) return true Loading @@ -93,13 +91,10 @@ class DataUsagePreferenceController(context: Context, key: String) : preference.summary = summary?.displayText } private fun getNetworkTemplate(): NetworkTemplate? = when { SubscriptionManager.isValidSubscriptionId(mSubId) -> { DataUsageLib.getMobileTemplate(mContext, mSubId) } else -> null } private fun getNetworkTemplate(): NetworkTemplate? = if (SubscriptionManager.isValidSubscriptionId(subId)) { DataUsageLib.getMobileTemplate(mContext, subId) } else null @VisibleForTesting fun createNetworkCycleDataRepository(): NetworkCycleDataRepository? = Loading @@ -118,4 +113,16 @@ class DataUsagePreferenceController(context: Context, key: String) : val allTimeUsage = repository.queryUsage(AllTimeRange) return allTimeUsage.getDataUsedString(mContext) to (allTimeUsage.usage > 0) } companion object { class DataUsageSearchItem(private val context: Context) : MobileNetworkSettingsSearchItem { override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? { if (!DataUsageUtils.hasMobileData(context)) return null return MobileNetworkSettingsSearchResult( key = "data_usage_summary", title = context.getString(R.string.app_cellular_data_usage), ) } } } }
src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt +2 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.provider.Settings import android.telephony.SubscriptionInfo import com.android.settings.R import com.android.settings.network.SubscriptionUtil import com.android.settings.network.telephony.DataUsagePreferenceController.Companion.DataUsageSearchItem import com.android.settings.network.telephony.MmsMessagePreferenceController.Companion.MmsMessageSearchItem import com.android.settings.network.telephony.NrAdvancedCallingPreferenceController.Companion.NrAdvancedCallingSearchItem import com.android.settings.network.telephony.RoamingPreferenceController.Companion.RoamingSearchItem Loading Loading @@ -114,6 +115,7 @@ class MobileNetworkSettingsSearchIndex( fun createSearchItems(context: Context): List<MobileNetworkSettingsSearchItem> = listOf( DataUsageSearchItem(context), MmsMessageSearchItem(context), NrAdvancedCallingSearchItem(context), PreferredNetworkModeSearchItem(context), Loading
tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt +1 −11 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.dx.mockito.inline.extended.ExtendedMockito import com.android.settings.core.BasePreferenceController.AVAILABLE import com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE import com.android.settings.datausage.DataUsageUtils import com.android.settings.datausage.lib.DataUsageLib import com.android.settings.datausage.lib.NetworkCycleDataRepository Loading Loading @@ -77,7 +76,6 @@ class DataUsagePreferenceControllerTest { @Before fun setUp() { mockSession = ExtendedMockito.mockitoSession() .initMocks(this) .spyStatic(DataUsageUtils::class.java) .spyStatic(DataUsageLib::class.java) .strictness(Strictness.LENIENT) Loading @@ -101,18 +99,10 @@ class DataUsagePreferenceControllerTest { } @Test fun getAvailabilityStatus_validSubId_returnAvailable() { fun getAvailabilityStatus_returnAvailable() { assertThat(controller.availabilityStatus).isEqualTo(AVAILABLE) } @Test fun getAvailabilityStatus_invalidSubId_returnUnsearchable() { val availabilityStatus = controller.getAvailabilityStatus(SubscriptionManager.INVALID_SUBSCRIPTION_ID) assertThat(availabilityStatus).isEqualTo(AVAILABLE_UNSEARCHABLE) } @Test fun handlePreferenceTreeClick_startActivity() = runBlocking { val usageData = NetworkUsageData(START_TIME, END_TIME, 1L) Loading