Merge "Settings search for app data usage" into main

This commit is contained in:
Chaohui Wang
2024-08-19 05:17:45 +00:00
committed by Android (Google) Code Review
4 changed files with 35 additions and 34 deletions

View File

@@ -91,9 +91,11 @@
settings:searchable="false" settings:searchable="false"
settings:controller="com.android.settings.network.telephony.RoamingPreferenceController"/> settings:controller="com.android.settings.network.telephony.RoamingPreferenceController"/>
<!-- Settings search is handled by DataUsageSearchItem. -->
<Preference <Preference
android:key="data_usage_summary" android:key="data_usage_summary"
android:title="@string/app_cellular_data_usage" android:title="@string/app_cellular_data_usage"
settings:searchable="false"
settings:controller="com.android.settings.network.telephony.DataUsagePreferenceController"/> settings:controller="com.android.settings.network.telephony.DataUsagePreferenceController"/>
<com.android.settings.datausage.BillingCyclePreference <com.android.settings.datausage.BillingCyclePreference

View File

@@ -29,35 +29,32 @@ import androidx.lifecycle.repeatOnLifecycle
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import com.android.settings.R import com.android.settings.R
import com.android.settings.core.BasePreferenceController
import com.android.settings.datausage.DataUsageUtils import com.android.settings.datausage.DataUsageUtils
import com.android.settings.datausage.lib.DataUsageFormatter.FormattedDataUsage import com.android.settings.datausage.lib.DataUsageFormatter.FormattedDataUsage
import com.android.settings.datausage.lib.DataUsageLib import com.android.settings.datausage.lib.DataUsageLib
import com.android.settings.datausage.lib.NetworkCycleDataRepository import com.android.settings.datausage.lib.NetworkCycleDataRepository
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.AllTimeRange 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 com.android.settingslib.spaprivileged.framework.compose.getPlaceholder
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
/** /** Preference controller for "Data usage" */
* Preference controller for "Data usage"
*/
class DataUsagePreferenceController(context: Context, key: String) : 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 lateinit var preference: Preference
private var networkTemplate: NetworkTemplate? = null private var networkTemplate: NetworkTemplate? = null
fun init(subId: Int) { fun init(subId: Int) {
mSubId = subId this.subId = subId
} }
override fun getAvailabilityStatus(subId: Int): Int = when { override fun getAvailabilityStatus() = AVAILABLE
SubscriptionManager.isValidSubscriptionId(subId) &&
DataUsageUtils.hasMobileData(mContext) -> AVAILABLE
else -> AVAILABLE_UNSEARCHABLE
}
override fun displayPreference(screen: PreferenceScreen) { override fun displayPreference(screen: PreferenceScreen) {
super.displayPreference(screen) super.displayPreference(screen)
@@ -75,11 +72,12 @@ class DataUsagePreferenceController(context: Context, key: String) :
override fun handlePreferenceTreeClick(preference: Preference): Boolean { override fun handlePreferenceTreeClick(preference: Preference): Boolean {
if (preference.key != preferenceKey || networkTemplate == null) return false if (preference.key != preferenceKey || networkTemplate == null) return false
val intent = Intent(Settings.ACTION_MOBILE_DATA_USAGE).apply { val intent =
setPackage(mContext.packageName) Intent(Settings.ACTION_MOBILE_DATA_USAGE).apply {
putExtra(Settings.EXTRA_NETWORK_TEMPLATE, networkTemplate) setPackage(mContext.packageName)
putExtra(Settings.EXTRA_SUB_ID, mSubId) putExtra(Settings.EXTRA_NETWORK_TEMPLATE, networkTemplate)
} putExtra(Settings.EXTRA_SUB_ID, subId)
}
mContext.startActivity(intent) mContext.startActivity(intent)
return true return true
} }
@@ -93,13 +91,10 @@ class DataUsagePreferenceController(context: Context, key: String) :
preference.summary = summary?.displayText preference.summary = summary?.displayText
} }
private fun getNetworkTemplate(): NetworkTemplate? = when { private fun getNetworkTemplate(): NetworkTemplate? =
SubscriptionManager.isValidSubscriptionId(mSubId) -> { if (SubscriptionManager.isValidSubscriptionId(subId)) {
DataUsageLib.getMobileTemplate(mContext, mSubId) DataUsageLib.getMobileTemplate(mContext, subId)
} } else null
else -> null
}
@VisibleForTesting @VisibleForTesting
fun createNetworkCycleDataRepository(): NetworkCycleDataRepository? = fun createNetworkCycleDataRepository(): NetworkCycleDataRepository? =
@@ -118,4 +113,16 @@ class DataUsagePreferenceController(context: Context, key: String) :
val allTimeUsage = repository.queryUsage(AllTimeRange) val allTimeUsage = repository.queryUsage(AllTimeRange)
return allTimeUsage.getDataUsedString(mContext) to (allTimeUsage.usage > 0) 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),
)
}
}
}
} }

View File

@@ -21,6 +21,7 @@ import android.provider.Settings
import android.telephony.SubscriptionInfo import android.telephony.SubscriptionInfo
import com.android.settings.R import com.android.settings.R
import com.android.settings.network.SubscriptionUtil 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.MmsMessagePreferenceController.Companion.MmsMessageSearchItem
import com.android.settings.network.telephony.NrAdvancedCallingPreferenceController.Companion.NrAdvancedCallingSearchItem import com.android.settings.network.telephony.NrAdvancedCallingPreferenceController.Companion.NrAdvancedCallingSearchItem
import com.android.settings.network.telephony.RoamingPreferenceController.Companion.RoamingSearchItem import com.android.settings.network.telephony.RoamingPreferenceController.Companion.RoamingSearchItem
@@ -114,6 +115,7 @@ class MobileNetworkSettingsSearchIndex(
fun createSearchItems(context: Context): List<MobileNetworkSettingsSearchItem> = fun createSearchItems(context: Context): List<MobileNetworkSettingsSearchItem> =
listOf( listOf(
DataUsageSearchItem(context),
MmsMessageSearchItem(context), MmsMessageSearchItem(context),
NrAdvancedCallingSearchItem(context), NrAdvancedCallingSearchItem(context),
PreferredNetworkModeSearchItem(context), PreferredNetworkModeSearchItem(context),

View File

@@ -29,7 +29,6 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.dx.mockito.inline.extended.ExtendedMockito import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.settings.core.BasePreferenceController.AVAILABLE 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.DataUsageUtils
import com.android.settings.datausage.lib.DataUsageLib import com.android.settings.datausage.lib.DataUsageLib
import com.android.settings.datausage.lib.NetworkCycleDataRepository import com.android.settings.datausage.lib.NetworkCycleDataRepository
@@ -77,7 +76,6 @@ class DataUsagePreferenceControllerTest {
@Before @Before
fun setUp() { fun setUp() {
mockSession = ExtendedMockito.mockitoSession() mockSession = ExtendedMockito.mockitoSession()
.initMocks(this)
.spyStatic(DataUsageUtils::class.java) .spyStatic(DataUsageUtils::class.java)
.spyStatic(DataUsageLib::class.java) .spyStatic(DataUsageLib::class.java)
.strictness(Strictness.LENIENT) .strictness(Strictness.LENIENT)
@@ -101,18 +99,10 @@ class DataUsagePreferenceControllerTest {
} }
@Test @Test
fun getAvailabilityStatus_validSubId_returnAvailable() { fun getAvailabilityStatus_returnAvailable() {
assertThat(controller.availabilityStatus).isEqualTo(AVAILABLE) assertThat(controller.availabilityStatus).isEqualTo(AVAILABLE)
} }
@Test
fun getAvailabilityStatus_invalidSubId_returnUnsearchable() {
val availabilityStatus =
controller.getAvailabilityStatus(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
assertThat(availabilityStatus).isEqualTo(AVAILABLE_UNSEARCHABLE)
}
@Test @Test
fun handlePreferenceTreeClick_startActivity() = runBlocking { fun handlePreferenceTreeClick_startActivity() = runBlocking {
val usageData = NetworkUsageData(START_TIME, END_TIME, 1L) val usageData = NetworkUsageData(START_TIME, END_TIME, 1L)