Refactor MobileNetworkSettingsSearchIndex

To support the case that MobileNetworkSettingsSearchItem could have
different key or title.

Bug: 358238959
Flag: EXEMPT refactor
Test: manual - search vo5g
Test: atest MobileNetworkSettingsSearchIndexTest
Test: atest MmsMessagePreferenceControllerTest
Change-Id: I18afc8a347566d50dd7969d2c906d0ae64be8a80
This commit is contained in:
Chaohui Wang
2024-08-08 13:46:43 +08:00
parent 221a8852dd
commit 749c22b1c6
6 changed files with 68 additions and 38 deletions

View File

@@ -20,11 +20,13 @@ import android.content.Context
import android.telephony.SubscriptionManager import android.telephony.SubscriptionManager
import android.telephony.TelephonyManager import android.telephony.TelephonyManager
import android.telephony.data.ApnSetting import android.telephony.data.ApnSetting
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import com.android.settings.R import com.android.settings.R
import com.android.settings.Settings.MobileNetworkActivity.EXTRA_MMS_MESSAGE import com.android.settings.Settings.MobileNetworkActivity.EXTRA_MMS_MESSAGE
import com.android.settings.core.TogglePreferenceController import com.android.settings.core.TogglePreferenceController
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchResult
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem
import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
@@ -109,7 +111,7 @@ constructor(
} }
class MmsMessageSearchItem( class MmsMessageSearchItem(
context: Context, private val context: Context,
private val getDefaultDataSubId: () -> Int = { private val getDefaultDataSubId: () -> Int = {
SubscriptionManager.getDefaultDataSubscriptionId() SubscriptionManager.getDefaultDataSubscriptionId()
}, },
@@ -117,12 +119,18 @@ constructor(
private var telephonyManager: TelephonyManager = private var telephonyManager: TelephonyManager =
context.getSystemService(TelephonyManager::class.java)!! context.getSystemService(TelephonyManager::class.java)!!
override val key: String = EXTRA_MMS_MESSAGE @VisibleForTesting
override val title: String = context.getString(R.string.mms_message_title) fun isAvailable(subId: Int): Boolean =
override fun isAvailable(subId: Int): Boolean =
getAvailabilityStatus( getAvailabilityStatus(
telephonyManager.createForSubscriptionId(subId), subId, getDefaultDataSubId) telephonyManager.createForSubscriptionId(subId), subId, getDefaultDataSubId)
override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? {
if (!isAvailable(subId)) return null
return MobileNetworkSettingsSearchResult(
key = EXTRA_MMS_MESSAGE,
title = context.getString(R.string.mms_message_title),
)
}
} }
} }
} }

View File

@@ -39,15 +39,14 @@ class MobileNetworkSettingsSearchIndex(
private val searchItemsFactory: (context: Context) -> List<MobileNetworkSettingsSearchItem> = private val searchItemsFactory: (context: Context) -> List<MobileNetworkSettingsSearchItem> =
::createSearchItems, ::createSearchItems,
) { ) {
data class MobileNetworkSettingsSearchResult(
val key: String,
val title: String,
val keywords: String? = null,
)
interface MobileNetworkSettingsSearchItem { interface MobileNetworkSettingsSearchItem {
val key: String fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult?
val title: String
val keywords: String?
get() = null
fun isAvailable(subId: Int): Boolean
} }
fun createSearchIndexableData(): SearchIndexableData { fun createSearchIndexableData(): SearchIndexableData {
@@ -71,13 +70,15 @@ class MobileNetworkSettingsSearchIndex(
searchItem: MobileNetworkSettingsSearchItem, searchItem: MobileNetworkSettingsSearchItem,
subInfos: List<SubscriptionInfo> subInfos: List<SubscriptionInfo>
): List<SearchIndexableRaw> = ): List<SearchIndexableRaw> =
subInfos subInfos.mapNotNull { subInfo ->
.filter { searchItem.isAvailable(it.subscriptionId) } searchItem.getSearchResult(subInfo.subscriptionId)?.let { searchResult ->
.map { subInfo -> searchIndexableRaw(context, searchItem, subInfo) } searchIndexableRaw(context, searchResult, subInfo)
}
}
private fun searchIndexableRaw( private fun searchIndexableRaw(
context: Context, context: Context,
searchItem: MobileNetworkSettingsSearchItem, searchResult: MobileNetworkSettingsSearchResult,
subInfo: SubscriptionInfo, subInfo: SubscriptionInfo,
): SearchIndexableRaw { ): SearchIndexableRaw {
val key = val key =
@@ -85,7 +86,7 @@ class MobileNetworkSettingsSearchIndex(
.setFragment( .setFragment(
SpaSearchLandingFragment.newBuilder() SpaSearchLandingFragment.newBuilder()
.setFragmentName(MobileNetworkSettings::class.java.name) .setFragmentName(MobileNetworkSettings::class.java.name)
.setPreferenceKey(searchItem.key) .setPreferenceKey(searchResult.key)
.putArguments( .putArguments(
Settings.EXTRA_SUB_ID, Settings.EXTRA_SUB_ID,
BundleValue.newBuilder().setIntValue(subInfo.subscriptionId).build())) BundleValue.newBuilder().setIntValue(subInfo.subscriptionId).build()))
@@ -94,8 +95,8 @@ class MobileNetworkSettingsSearchIndex(
return createSearchIndexableRaw( return createSearchIndexableRaw(
context = context, context = context,
spaSearchLandingKey = key, spaSearchLandingKey = key,
itemTitle = searchItem.title, itemTitle = searchResult.title,
keywords = searchItem.keywords, keywords = searchResult.keywords,
indexableClass = MobileNetworkSettings::class.java, indexableClass = MobileNetworkSettings::class.java,
pageTitle = "$simsTitle > ${subInfo.displayName}", pageTitle = "$simsTitle > ${subInfo.displayName}",
) )

View File

@@ -25,6 +25,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R import com.android.settings.R
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchResult
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem
import com.android.settings.spa.preference.ComposePreferenceController import com.android.settings.spa.preference.ComposePreferenceController
import com.android.settingslib.spa.widget.preference.SwitchPreference import com.android.settingslib.spa.widget.preference.SwitchPreference
@@ -79,12 +80,17 @@ class NrAdvancedCallingPreferenceController @JvmOverloads constructor(
companion object { companion object {
class NrAdvancedCallingSearchItem(private val context: Context) : class NrAdvancedCallingSearchItem(private val context: Context) :
MobileNetworkSettingsSearchItem { MobileNetworkSettingsSearchItem {
override val key = "nr_advanced_calling"
override val title: String = context.getString(R.string.nr_advanced_calling_title)
override val keywords: String = context.getString(R.string.keywords_nr_advanced_calling)
override fun isAvailable(subId: Int): Boolean = fun isAvailable(subId: Int): Boolean = VoNrRepository(context, subId).isVoNrAvailable()
VoNrRepository(context, subId).isVoNrAvailable()
override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? {
if (!isAvailable(subId)) return null
return MobileNetworkSettingsSearchResult(
key = "nr_advanced_calling",
title = context.getString(R.string.nr_advanced_calling_title),
keywords = context.getString(R.string.keywords_nr_advanced_calling),
)
}
} }
} }
} }

View File

@@ -29,6 +29,7 @@ import androidx.compose.ui.res.stringResource
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R import com.android.settings.R
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchResult
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem
import com.android.settings.spa.preference.ComposePreferenceController import com.android.settings.spa.preference.ComposePreferenceController
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
@@ -98,16 +99,21 @@ constructor(
companion object { companion object {
private const val DIALOG_TAG = "MobileDataDialog" private const val DIALOG_TAG = "MobileDataDialog"
class RoamingSearchItem(context: Context) : MobileNetworkSettingsSearchItem { class RoamingSearchItem(private val context: Context) : MobileNetworkSettingsSearchItem {
override val key = "button_roaming_key"
override val title: String = context.getString(R.string.roaming)
private val carrierConfigRepository = CarrierConfigRepository(context) private val carrierConfigRepository = CarrierConfigRepository(context)
override fun isAvailable(subId: Int): Boolean = fun isAvailable(subId: Int): Boolean =
SubscriptionManager.isValidSubscriptionId(subId) && SubscriptionManager.isValidSubscriptionId(subId) &&
!carrierConfigRepository.getBoolean( !carrierConfigRepository.getBoolean(
subId, CarrierConfigManager.KEY_FORCE_HOME_NETWORK_BOOL) subId, CarrierConfigManager.KEY_FORCE_HOME_NETWORK_BOOL)
override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? {
if (!isAvailable(subId)) return null
return MobileNetworkSettingsSearchResult(
key = "button_roaming_key",
title = context.getString(R.string.roaming),
)
}
} }
} }
} }

View File

@@ -27,6 +27,7 @@ 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.core.BasePreferenceController
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchResult
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem
import com.android.settings.network.telephony.wificalling.WifiCallingRepository import com.android.settings.network.telephony.wificalling.WifiCallingRepository
import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
@@ -132,12 +133,17 @@ open class WifiCallingPreferenceController @JvmOverloads constructor(
class WifiCallingSearchItem( class WifiCallingSearchItem(
private val context: Context, private val context: Context,
) : MobileNetworkSettingsSearchItem { ) : MobileNetworkSettingsSearchItem {
override val key: String = "wifi_calling" private fun isAvailable(subId: Int): Boolean = runBlocking {
override val title: String = context.getString(R.string.wifi_calling_settings_title)
override fun isAvailable(subId: Int): Boolean = runBlocking {
WifiCallingRepository(context, subId).wifiCallingReadyFlow().first() WifiCallingRepository(context, subId).wifiCallingReadyFlow().first()
} }
override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? {
if (!isAvailable(subId)) return null
return MobileNetworkSettingsSearchResult(
key = "wifi_calling",
title = context.getString(R.string.wifi_calling_settings_title),
)
}
} }
} }
} }

View File

@@ -25,6 +25,7 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R import com.android.settings.R
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.Companion.isMobileNetworkSettingsSearchable import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.Companion.isMobileNetworkSettingsSearchable
import com.android.settings.network.telephony.MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchResult
import com.android.settings.spa.SpaSearchLanding.BundleValue import com.android.settings.spa.SpaSearchLanding.BundleValue
import com.android.settings.spa.SpaSearchLanding.SpaSearchLandingFragment import com.android.settings.spa.SpaSearchLanding.SpaSearchLandingFragment
import com.android.settings.spa.SpaSearchLanding.SpaSearchLandingKey import com.android.settings.spa.SpaSearchLanding.SpaSearchLandingKey
@@ -62,10 +63,12 @@ class MobileNetworkSettingsSearchIndexTest {
private val mobileNetworkSettingsSearchIndex = MobileNetworkSettingsSearchIndex { private val mobileNetworkSettingsSearchIndex = MobileNetworkSettingsSearchIndex {
listOf( listOf(
object : MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem { object : MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem {
override val key = KEY override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? =
override val title = TITLE if (subId == SUB_ID_1) {
MobileNetworkSettingsSearchResult(key = KEY, title = TITLE)
override fun isAvailable(subId: Int) = subId == SUB_ID_1 } else {
null
}
}) })
} }