[Catalyst] Migrate WifiCallingScreen to parameterized screen

Bug: 388420844
Bug: 372732219
Flag: com.android.settings.flags.catalyst_wifi_calling
Test: devtool
Change-Id: I322001acc453eae0d69761f7a585c6f33087ef6a
This commit is contained in:
Jacky Wang
2025-01-23 15:37:57 +08:00
parent 1e92038918
commit 7a24cd61ac
2 changed files with 52 additions and 10 deletions

View File

@@ -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<Bundle> {
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
}
}
}
}

View File

@@ -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