diff --git a/src/com/android/settings/network/telephony/MmsMessagePreferenceController.kt b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.kt index c929d5ca897..220218c9473 100644 --- a/src/com/android/settings/network/telephony/MmsMessagePreferenceController.kt +++ b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.kt @@ -20,11 +20,13 @@ import android.content.Context import android.telephony.SubscriptionManager import android.telephony.TelephonyManager import android.telephony.data.ApnSetting +import androidx.annotation.VisibleForTesting import androidx.lifecycle.LifecycleOwner import androidx.preference.PreferenceScreen import com.android.settings.R import com.android.settings.Settings.MobileNetworkActivity.EXTRA_MMS_MESSAGE 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.settingslib.spa.framework.util.collectLatestWithLifecycle import kotlinx.coroutines.flow.combine @@ -109,7 +111,7 @@ constructor( } class MmsMessageSearchItem( - context: Context, + private val context: Context, private val getDefaultDataSubId: () -> Int = { SubscriptionManager.getDefaultDataSubscriptionId() }, @@ -117,12 +119,18 @@ constructor( private var telephonyManager: TelephonyManager = context.getSystemService(TelephonyManager::class.java)!! - override val key: String = EXTRA_MMS_MESSAGE - override val title: String = context.getString(R.string.mms_message_title) - - override fun isAvailable(subId: Int): Boolean = + @VisibleForTesting + fun isAvailable(subId: Int): Boolean = getAvailabilityStatus( 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), + ) + } } } } diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt b/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt index 4e97d318033..b702054643e 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt +++ b/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndex.kt @@ -39,15 +39,14 @@ class MobileNetworkSettingsSearchIndex( private val searchItemsFactory: (context: Context) -> List = ::createSearchItems, ) { + data class MobileNetworkSettingsSearchResult( + val key: String, + val title: String, + val keywords: String? = null, + ) + interface MobileNetworkSettingsSearchItem { - val key: String - - val title: String - - val keywords: String? - get() = null - - fun isAvailable(subId: Int): Boolean + fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? } fun createSearchIndexableData(): SearchIndexableData { @@ -71,13 +70,15 @@ class MobileNetworkSettingsSearchIndex( searchItem: MobileNetworkSettingsSearchItem, subInfos: List ): List = - subInfos - .filter { searchItem.isAvailable(it.subscriptionId) } - .map { subInfo -> searchIndexableRaw(context, searchItem, subInfo) } + subInfos.mapNotNull { subInfo -> + searchItem.getSearchResult(subInfo.subscriptionId)?.let { searchResult -> + searchIndexableRaw(context, searchResult, subInfo) + } + } private fun searchIndexableRaw( context: Context, - searchItem: MobileNetworkSettingsSearchItem, + searchResult: MobileNetworkSettingsSearchResult, subInfo: SubscriptionInfo, ): SearchIndexableRaw { val key = @@ -85,7 +86,7 @@ class MobileNetworkSettingsSearchIndex( .setFragment( SpaSearchLandingFragment.newBuilder() .setFragmentName(MobileNetworkSettings::class.java.name) - .setPreferenceKey(searchItem.key) + .setPreferenceKey(searchResult.key) .putArguments( Settings.EXTRA_SUB_ID, BundleValue.newBuilder().setIntValue(subInfo.subscriptionId).build())) @@ -94,8 +95,8 @@ class MobileNetworkSettingsSearchIndex( return createSearchIndexableRaw( context = context, spaSearchLandingKey = key, - itemTitle = searchItem.title, - keywords = searchItem.keywords, + itemTitle = searchResult.title, + keywords = searchResult.keywords, indexableClass = MobileNetworkSettings::class.java, pageTitle = "$simsTitle > ${subInfo.displayName}", ) diff --git a/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.kt b/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.kt index 5c94e848270..0d8766e4df0 100644 --- a/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.kt +++ b/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.kt @@ -25,6 +25,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.spa.preference.ComposePreferenceController import com.android.settingslib.spa.widget.preference.SwitchPreference @@ -79,12 +80,17 @@ class NrAdvancedCallingPreferenceController @JvmOverloads constructor( companion object { class NrAdvancedCallingSearchItem(private val context: Context) : 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 = - VoNrRepository(context, subId).isVoNrAvailable() + fun isAvailable(subId: Int): Boolean = 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), + ) + } } } } diff --git a/src/com/android/settings/network/telephony/RoamingPreferenceController.kt b/src/com/android/settings/network/telephony/RoamingPreferenceController.kt index 7633677dcb4..a5ac7d66640 100644 --- a/src/com/android/settings/network/telephony/RoamingPreferenceController.kt +++ b/src/com/android/settings/network/telephony/RoamingPreferenceController.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.res.stringResource import androidx.fragment.app.FragmentManager import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.spa.preference.ComposePreferenceController import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel @@ -98,16 +99,21 @@ constructor( companion object { private const val DIALOG_TAG = "MobileDataDialog" - class RoamingSearchItem(context: Context) : MobileNetworkSettingsSearchItem { - override val key = "button_roaming_key" - override val title: String = context.getString(R.string.roaming) - + class RoamingSearchItem(private val context: Context) : MobileNetworkSettingsSearchItem { private val carrierConfigRepository = CarrierConfigRepository(context) - override fun isAvailable(subId: Int): Boolean = + fun isAvailable(subId: Int): Boolean = SubscriptionManager.isValidSubscriptionId(subId) && !carrierConfigRepository.getBoolean( 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), + ) + } } } } diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.kt b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.kt index 7e8e58cceb5..e04763a88c1 100644 --- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.kt +++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.kt @@ -27,6 +27,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceScreen import com.android.settings.R 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.wificalling.WifiCallingRepository import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle @@ -132,12 +133,17 @@ open class WifiCallingPreferenceController @JvmOverloads constructor( class WifiCallingSearchItem( private val context: Context, ) : MobileNetworkSettingsSearchItem { - override val key: String = "wifi_calling" - override val title: String = context.getString(R.string.wifi_calling_settings_title) - - override fun isAvailable(subId: Int): Boolean = runBlocking { + private fun isAvailable(subId: Int): Boolean = runBlocking { 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), + ) + } } } } diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndexTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndexTest.kt index 5e7e83c9f43..bf5120817c1 100644 --- a/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndexTest.kt +++ b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSettingsSearchIndexTest.kt @@ -25,6 +25,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.R 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.SpaSearchLandingFragment import com.android.settings.spa.SpaSearchLanding.SpaSearchLandingKey @@ -62,10 +63,12 @@ class MobileNetworkSettingsSearchIndexTest { private val mobileNetworkSettingsSearchIndex = MobileNetworkSettingsSearchIndex { listOf( object : MobileNetworkSettingsSearchIndex.MobileNetworkSettingsSearchItem { - override val key = KEY - override val title = TITLE - - override fun isAvailable(subId: Int) = subId == SUB_ID_1 + override fun getSearchResult(subId: Int): MobileNetworkSettingsSearchResult? = + if (subId == SUB_ID_1) { + MobileNetworkSettingsSearchResult(key = KEY, title = TITLE) + } else { + null + } }) }