From 59c8ba7fd03b247a0fc47eea68736fd92cba0dc4 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Mon, 11 Mar 2024 15:43:03 +0800 Subject: [PATCH] Use SubscriptionUtil.getFormattedPhoneNumber For Primary SIM. Bug: 318310357 Test: manual - on Mobile Settings Change-Id: Ic8085532fd025bb1e0b6897f5509f485c37a6d56 --- .../network/NetworkCellularGroupProvider.kt | 163 +++++++----------- .../spa/network/PrimarySimRepository.kt | 62 +++++++ .../spa/network/SimOnboardingPrimarySim.kt | 18 +- 3 files changed, 144 insertions(+), 99 deletions(-) create mode 100644 src/com/android/settings/spa/network/PrimarySimRepository.kt diff --git a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt index a0c363a206b..5a2a3947621 100644 --- a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt +++ b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt @@ -44,13 +44,13 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.android.settings.R import com.android.settings.network.SubscriptionInfoListViewModel import com.android.settings.network.telephony.MobileNetworkUtils +import com.android.settings.spa.network.PrimarySimRepository.PrimarySimInfo import com.android.settings.wifi.WifiPickerTrackerHelper import com.android.settingslib.spa.framework.common.SettingsEntryBuilder import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle -import com.android.settingslib.spa.widget.preference.ListPreferenceOption import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.preference.SwitchPreference @@ -173,27 +173,23 @@ fun PageImpl( ) { val selectableSubscriptionInfoList by selectableSubscriptionInfoListFlow .collectAsStateWithLifecycle(initialValue = emptyList()) - val activeSubscriptionInfoList: List = - selectableSubscriptionInfoList.filter { subscriptionInfo -> - subscriptionInfo.simSlotIndex != -1 - } val stringSims = stringResource(R.string.provider_network_settings_title) RegularScaffold(title = stringSims) { SimsSection(selectableSubscriptionInfoList) PrimarySimSectionImpl( - activeSubscriptionInfoList, - defaultVoiceSubId, - defaultSmsSubId, - defaultDataSubId, - nonDds + selectableSubscriptionInfoListFlow, + defaultVoiceSubId, + defaultSmsSubId, + defaultDataSubId, + nonDds ) } } @Composable fun PrimarySimImpl( - subscriptionInfoList: List, + primarySimInfo: PrimarySimInfo, callsSelectedId: MutableIntState, textsSelectedId: MutableIntState, mobileDataSelectedId: MutableIntState, @@ -237,108 +233,83 @@ fun PrimarySimImpl( } }, ) { - var state = rememberSaveable { mutableStateOf(false) } - var callsAndSmsList = remember { - mutableListOf(ListPreferenceOption(id = -1, text = "Loading")) - } - var dataList = remember { - mutableListOf(ListPreferenceOption(id = -1, text = "Loading")) + val telephonyManagerForNonDds: TelephonyManager? = + context.getSystemService(TelephonyManager::class.java) + ?.createForSubscriptionId(nonDds.intValue) + val automaticDataChecked = rememberSaveable() { + mutableStateOf(false) } - if (subscriptionInfoList.size >= 2) { - state.value = true - callsAndSmsList.clear() - dataList.clear() - for (info in subscriptionInfoList) { - var item = ListPreferenceOption( - id = info.subscriptionId, - text = "${info.displayName}", - summary = "${info.number}" - ) - callsAndSmsList.add(item) - dataList.add(item) - } - callsAndSmsList.add( - ListPreferenceOption( - id = SubscriptionManager.INVALID_SUBSCRIPTION_ID, - text = stringResource(id = R.string.sim_calls_ask_first_prefs_title) - ) - ) - } else { - // hide the primary sim - state.value = false - Log.d(NetworkCellularGroupProvider.name, "Hide primary sim") - } + CreatePrimarySimListPreference( + stringResource(id = R.string.primary_sim_calls_title), + primarySimInfo.callsAndSmsList, + callsSelectedId, + ImageVector.vectorResource(R.drawable.ic_phone), + actionSetCalls + ) + CreatePrimarySimListPreference( + stringResource(id = R.string.primary_sim_texts_title), + primarySimInfo.callsAndSmsList, + textsSelectedId, + Icons.AutoMirrored.Outlined.Message, + actionSetTexts + ) + CreatePrimarySimListPreference( + stringResource(id = R.string.mobile_data_settings_title), + primarySimInfo.dataList, + mobileDataSelectedId, + Icons.Outlined.DataUsage, + actionSetMobileData + ) - if (state.value) { - val telephonyManagerForNonDds: TelephonyManager? = - context.getSystemService(TelephonyManager::class.java) - ?.createForSubscriptionId(nonDds.intValue) - val automaticDataChecked = rememberSaveable() { - mutableStateOf(false) - } - - CreatePrimarySimListPreference( - stringResource(id = R.string.primary_sim_calls_title), - callsAndSmsList, - callsSelectedId, - ImageVector.vectorResource(R.drawable.ic_phone), - actionSetCalls - ) - CreatePrimarySimListPreference( - stringResource(id = R.string.primary_sim_texts_title), - callsAndSmsList, - textsSelectedId, - Icons.AutoMirrored.Outlined.Message, - actionSetTexts - ) - CreatePrimarySimListPreference( - stringResource(id = R.string.mobile_data_settings_title), - dataList, - mobileDataSelectedId, - Icons.Outlined.DataUsage, - actionSetMobileData - ) - - val autoDataTitle = stringResource(id = R.string.primary_sim_automatic_data_title) - val autoDataSummary = stringResource(id = R.string.primary_sim_automatic_data_msg) - SwitchPreference( - object : SwitchPreferenceModel { - override val title = autoDataTitle - override val summary = { autoDataSummary } - override val checked = { - if (nonDds.intValue != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - coroutineScope.launch { - automaticDataChecked.value = getAutomaticData(telephonyManagerForNonDds) - Log.d( - NetworkCellularGroupProvider.name, - "NonDds:${nonDds.intValue}" + - "getAutomaticData:${automaticDataChecked.value}" - ) - } + val autoDataTitle = stringResource(id = R.string.primary_sim_automatic_data_title) + val autoDataSummary = stringResource(id = R.string.primary_sim_automatic_data_msg) + SwitchPreference( + object : SwitchPreferenceModel { + override val title = autoDataTitle + override val summary = { autoDataSummary } + override val checked = { + if (nonDds.intValue != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + coroutineScope.launch { + automaticDataChecked.value = getAutomaticData(telephonyManagerForNonDds) + Log.d( + NetworkCellularGroupProvider.name, + "NonDds:${nonDds.intValue}" + + "getAutomaticData:${automaticDataChecked.value}" + ) } - automaticDataChecked.value - } - override val onCheckedChange: ((Boolean) -> Unit)? = { - automaticDataChecked.value = it - actionSetAutoDataSwitch(it) } + automaticDataChecked.value } - ) - } + override val onCheckedChange: ((Boolean) -> Unit)? = { + automaticDataChecked.value = it + actionSetAutoDataSwitch(it) + } + } + ) } @Composable fun PrimarySimSectionImpl( - subscriptionInfoList: List, + subscriptionInfoListFlow: Flow>, callsSelectedId: MutableIntState, textsSelectedId: MutableIntState, mobileDataSelectedId: MutableIntState, nonDds: MutableIntState, ) { + val context = LocalContext.current + val primarySimInfo = remember(subscriptionInfoListFlow) { + subscriptionInfoListFlow + .map { subscriptionInfoList -> + subscriptionInfoList.filter { subInfo -> subInfo.simSlotIndex != -1 } + } + .map(PrimarySimRepository(context)::getPrimarySimInfo) + .flowOn(Dispatchers.Default) + }.collectAsStateWithLifecycle(initialValue = null).value ?: return + Category(title = stringResource(id = R.string.primary_sim_title)) { PrimarySimImpl( - subscriptionInfoList, + primarySimInfo, callsSelectedId, textsSelectedId, mobileDataSelectedId, diff --git a/src/com/android/settings/spa/network/PrimarySimRepository.kt b/src/com/android/settings/spa/network/PrimarySimRepository.kt new file mode 100644 index 00000000000..b9eb3ffcb0a --- /dev/null +++ b/src/com/android/settings/spa/network/PrimarySimRepository.kt @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.spa.network + +import android.content.Context +import android.telephony.SubscriptionInfo +import android.telephony.SubscriptionManager +import android.util.Log +import com.android.settings.R +import com.android.settings.network.SubscriptionUtil +import com.android.settingslib.spa.widget.preference.ListPreferenceOption + +class PrimarySimRepository(private val context: Context) { + + data class PrimarySimInfo( + val callsAndSmsList: List, + val dataList: List, + ) + + fun getPrimarySimInfo(selectableSubscriptionInfoList: List): PrimarySimInfo? { + if (selectableSubscriptionInfoList.size < 2) { + Log.d(TAG, "Hide primary sim") + return null + } + + val callsAndSmsList = mutableListOf() + val dataList = mutableListOf() + for (info in selectableSubscriptionInfoList) { + val item = ListPreferenceOption( + id = info.subscriptionId, + text = "${info.displayName}", + summary = SubscriptionUtil.getFormattedPhoneNumber(context, info) ?: "", + ) + callsAndSmsList += item + dataList += item + } + callsAndSmsList += ListPreferenceOption( + id = SubscriptionManager.INVALID_SUBSCRIPTION_ID, + text = context.getString(R.string.sim_calls_ask_first_prefs_title), + ) + + return PrimarySimInfo(callsAndSmsList, dataList) + } + + private companion object { + private const val TAG = "PrimarySimRepository" + } +} diff --git a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt index b9849666e53..a8c0575e3e8 100644 --- a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt +++ b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt @@ -24,10 +24,13 @@ import androidx.compose.material.icons.outlined.SignalCellularAlt import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableIntState import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.settings.R import com.android.settings.network.SimOnboardingService import com.android.settingslib.spa.framework.theme.SettingsDimension @@ -38,6 +41,9 @@ import com.android.settingslib.spa.widget.scaffold.BottomAppBarButton import com.android.settingslib.spa.widget.scaffold.SuwScaffold import com.android.settingslib.spa.widget.ui.SettingsBody import com.android.settingslib.spa.widget.ui.SettingsIcon +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn /** * the sim onboarding primary sim compose @@ -77,13 +83,19 @@ fun SimOnboardingPrimarySimImpl( SettingsBody(stringResource(id = R.string.sim_onboarding_primary_sim_msg)) } - var selectedSubscriptionInfoList = - onboardingService.getSelectedSubscriptionInfoListWithRenaming() + val context = LocalContext.current + val primarySimInfo = remember { + flow { + val selectableSubInfoList = + onboardingService.getSelectedSubscriptionInfoListWithRenaming() + emit(PrimarySimRepository(context).getPrimarySimInfo(selectableSubInfoList)) + }.flowOn(Dispatchers.Default) + }.collectAsStateWithLifecycle(initialValue = null).value ?: return@SuwScaffold callsSelectedId.intValue = onboardingService.targetPrimarySimCalls textsSelectedId.intValue = onboardingService.targetPrimarySimTexts mobileDataSelectedId.intValue = onboardingService.targetPrimarySimMobileData PrimarySimImpl( - subscriptionInfoList = selectedSubscriptionInfoList, + primarySimInfo = primarySimInfo, callsSelectedId = callsSelectedId, textsSelectedId = textsSelectedId, mobileDataSelectedId = mobileDataSelectedId,