Merge "Settings search for app data usage" into main
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user