diff --git a/src/com/android/settings/wifi/calling/WifiCallingScreen.kt b/src/com/android/settings/wifi/calling/WifiCallingScreen.kt index 5eeed054ded..3967c2132c2 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingScreen.kt +++ b/src/com/android/settings/wifi/calling/WifiCallingScreen.kt @@ -16,15 +16,32 @@ package com.android.settings.wifi.calling import android.content.Context -import android.telephony.SubscriptionManager +import android.os.Bundle +import android.telephony.SubscriptionManager.getDefaultSubscriptionId +import android.telephony.SubscriptionManager.isValidSubscriptionId import com.android.settings.R import com.android.settings.flags.Flags +import com.android.settings.network.SubscriptionUtil +import com.android.settings.network.telephony.wificalling.WifiCallingRepository +import com.android.settings.wifi.calling.WifiCallingSettingsForSub.EXTRA_SUB_ID +import com.android.settingslib.metadata.PreferenceAvailabilityProvider import com.android.settingslib.metadata.ProvidePreferenceScreen import com.android.settingslib.metadata.preferenceHierarchy import com.android.settingslib.preference.PreferenceScreenCreator +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.asFlow +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.merge + +@ProvidePreferenceScreen(WifiCallingScreen.KEY, parameterized = true, parameterizedMigration = true) +class WifiCallingScreen(override val arguments: Bundle) : + PreferenceScreenCreator, PreferenceAvailabilityProvider { + + private val subId = arguments.getInt(EXTRA_SUB_ID, getDefaultSubscriptionId()) -@ProvidePreferenceScreen(WifiCallingScreen.KEY) -class WifiCallingScreen : PreferenceScreenCreator { override val key: String get() = KEY @@ -34,6 +51,8 @@ class WifiCallingScreen : PreferenceScreenCreator { override val summary: Int get() = R.string.wifi_calling_summary + override fun isAvailable(context: Context) = isValidSubscriptionId(subId) + override fun isFlagEnabled(context: Context) = Flags.catalystWifiCalling() override fun fragmentClass() = WifiCallingSettingsForSub::class.java @@ -41,14 +60,36 @@ class WifiCallingScreen : PreferenceScreenCreator { override fun hasCompleteHierarchy() = false override fun getPreferenceHierarchy(context: Context) = - preferenceHierarchy(context, this) { - val subId = SubscriptionManager.getDefaultSubscriptionId() - if (SubscriptionManager.isValidSubscriptionId(subId)) { - +WifiCallingMainSwitchPreference(subId) - } - } + preferenceHierarchy(context, this) { +WifiCallingMainSwitchPreference(subId) } companion object { const val KEY = "wifi_calling" + + /** + * Provides arguments to generate [WifiCallingScreen]. + * + * This method is used by annotation processor to produce + * `PreferenceScreenMetadataParameterizedFactory`). + */ + @JvmStatic + fun parameters(context: Context): Flow { + fun Int.toArguments() = Bundle(1).also { it.putInt(EXTRA_SUB_ID, this) } + // handle backward compatibility with default subscription id + val defaultSubId = getDefaultSubscriptionId() + val flow = + SubscriptionUtil.getSelectableSubscriptionInfoList(context) + .asFlow() + .filter { + val subId = it.subscriptionId + subId != defaultSubId && + WifiCallingRepository(context, subId).wifiCallingReadyFlow().first() + } + .map { it.subscriptionId.toArguments() } + // Bundle.EMPTY is for backward compatibility + return when { + isValidSubscriptionId(defaultSubId) -> merge(flowOf(Bundle.EMPTY), flow) + else -> flow + } + } } } diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingScreenTest.kt b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingScreenTest.kt index 474e304b338..eca2ff622ad 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingScreenTest.kt +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingScreenTest.kt @@ -15,6 +15,7 @@ */ package com.android.settings.wifi.calling +import android.os.Bundle import com.android.settings.flags.Flags import com.android.settingslib.preference.CatalystScreenTestCase import com.google.common.truth.Truth.assertThat @@ -22,7 +23,7 @@ import org.junit.Test class WifiCallingScreenTest : CatalystScreenTestCase() { - override val preferenceScreenCreator = WifiCallingScreen() + override val preferenceScreenCreator = WifiCallingScreen(Bundle.EMPTY) override val flagName: String get() = Flags.FLAG_CATALYST_WIFI_CALLING