diff --git a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java index c94edc6bb26..1d96688c168 100644 --- a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java +++ b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java @@ -46,14 +46,14 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; -import com.android.settingslib.spaprivileged.template.app.AppListItemKt; +import com.android.settingslib.spaprivileged.template.app.AppListItemModelKt; import com.android.settingslib.spaprivileged.template.app.AppListPageKt; import com.android.settingslib.widget.LottieColorUtils; import com.airbnb.lottie.LottieAnimationView; /** - * @deprecated Will be removed, use {@link AppListItemKt} {@link AppListPageKt} instead. + * @deprecated Will be removed, use {@link AppListItemModelKt} {@link AppListPageKt} instead. */ @Deprecated(forRemoval = true) public class ApplicationViewHolder extends RecyclerView.ViewHolder { diff --git a/src/com/android/settings/spa/about/AboutPhone.kt b/src/com/android/settings/spa/about/AboutPhone.kt index 7343da050c6..5f9aa97634a 100644 --- a/src/com/android/settings/spa/about/AboutPhone.kt +++ b/src/com/android/settings/spa/about/AboutPhone.kt @@ -29,7 +29,6 @@ import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold @@ -56,7 +55,7 @@ object AboutPhonePageProvider : SettingsPageProvider { val deviceNamePresenter = remember { DeviceNamePresenter(context) } Preference(object : PreferenceModel { override val title = stringResource(R.string.about_settings) - override val summary = deviceNamePresenter.deviceName.toState() + override val summary = { deviceNamePresenter.deviceName } override val onClick = navigator(name) override val icon = @Composable { SettingsIcon(imageVector = Icons.Outlined.PermDeviceInformation) diff --git a/src/com/android/settings/spa/about/DeviceName.kt b/src/com/android/settings/spa/about/DeviceName.kt index c481e329082..86a95127848 100644 --- a/src/com/android/settings/spa/about/DeviceName.kt +++ b/src/com/android/settings/spa/about/DeviceName.kt @@ -24,7 +24,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import com.android.settings.R import com.android.settings.deviceinfo.DeviceNamePreferenceController -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.widget.dialog.AlertDialogButton import com.android.settingslib.spa.widget.dialog.rememberAlertDialogPresenter import com.android.settingslib.spa.widget.preference.Preference @@ -48,7 +47,7 @@ object DeviceNamePreference { Preference(object : PreferenceModel { override val title = stringResource(R.string.my_device_info_device_name_preference_title) - override val summary = deviceNamePresenter.deviceName.toState() + override val summary = { deviceNamePresenter.deviceName } override val onClick = dialogPresenter::open }) diff --git a/src/com/android/settings/spa/app/AllAppList.kt b/src/com/android/settings/spa/app/AllAppList.kt index 383a0e8ea2e..5b13211adda 100644 --- a/src/com/android/settings/spa/app/AllAppList.kt +++ b/src/com/android/settings/spa/app/AllAppList.kt @@ -21,8 +21,6 @@ import android.content.pm.ApplicationInfo import android.os.Bundle import androidx.compose.runtime.Composable import androidx.compose.runtime.State -import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.res.stringResource import com.android.settings.R import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider @@ -116,7 +114,7 @@ class AllAppListModel( option: Int, recordListFlow: Flow>, ): Flow> = recordListFlow.filterItem( - when (SpinnerItem.values().getOrNull(option)) { + when (SpinnerItem.entries.getOrNull(option)) { SpinnerItem.Enabled -> ({ it.app.enabled && !it.app.isInstantApp }) SpinnerItem.Disabled -> isDisabled SpinnerItem.Instant -> isInstant @@ -130,22 +128,20 @@ class AllAppListModel( private val isInstant: (AppRecordWithSize) -> Boolean = { it.app.isInstantApp } @Composable - override fun getSummary(option: Int, record: AppRecordWithSize): State { + override fun getSummary(option: Int, record: AppRecordWithSize): () -> String { val storageSummary = record.app.getStorageSummary() - return remember { - derivedStateOf { - storageSummary.value + - when { - !record.app.installed && !record.app.isArchived -> { - System.lineSeparator() + context.getString(R.string.not_installed) - } - isDisabled(record) -> { - System.lineSeparator() + - context.getString(com.android.settingslib.R.string.disabled) - } - else -> "" - } + return { + val summaryList = mutableListOf(storageSummary.value) + when { + !record.app.installed && !record.app.isArchived -> { + summaryList += context.getString(R.string.not_installed) + } + + isDisabled(record) -> { + summaryList += context.getString(com.android.settingslib.R.string.disabled) + } } + summaryList.joinToString(separator = System.lineSeparator()) } } diff --git a/src/com/android/settings/spa/app/AppsMain.kt b/src/com/android/settings/spa/app/AppsMain.kt index 2dea9c5c977..83b3080af57 100644 --- a/src/com/android/settings/spa/app/AppsMain.kt +++ b/src/com/android/settings/spa/app/AppsMain.kt @@ -30,7 +30,6 @@ import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold @@ -54,10 +53,10 @@ object AppsMainPageProvider : SettingsPageProvider { fun buildInjectEntry() = SettingsEntryBuilder.createInject(owner = owner) .setUiLayoutFn { + val summary = stringResource(R.string.app_and_notification_dashboard_summary) Preference(object : PreferenceModel { override val title = stringResource(R.string.apps_dashboard_title) - override val summary = - stringResource(R.string.app_and_notification_dashboard_summary).toState() + override val summary = { summary } override val onClick = navigator(name) override val icon = @Composable { SettingsIcon(imageVector = Icons.Outlined.Apps) diff --git a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreference.kt b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreference.kt index 61098e82628..96884beb4cc 100644 --- a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreference.kt +++ b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreference.kt @@ -19,6 +19,7 @@ package com.android.settings.spa.app.appcompat import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -40,11 +41,12 @@ fun UserAspectRatioAppPreference(app: ApplicationInfo) { val presenter = remember { UserAspectRatioAppPresenter(context, app) } if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return + val summary by presenter.summaryFlow.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.summary_placeholder), + ) Preference(object : PreferenceModel { override val title = stringResource(R.string.aspect_ratio_experimental_title) - override val summary = presenter.summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.summary_placeholder), - ) + override val summary = { summary } override val onClick = presenter::startActivity }) } @@ -75,4 +77,4 @@ fun navigateToAppAspectRatioSettings(context: Context, app: ApplicationInfo) { context, AppInfoSettingsProvider.METRICS_CATEGORY, ) -} \ No newline at end of file +} diff --git a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt index deea745e65a..5af29ef655b 100644 --- a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt +++ b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt @@ -28,7 +28,7 @@ import android.util.Log import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable -import androidx.compose.runtime.State +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -41,15 +41,14 @@ import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.rememberContext -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.util.asyncMap import com.android.settingslib.spa.framework.util.filterItem -import com.android.settingslib.spa.widget.preference.Preference -import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.illustration.Illustration import com.android.settingslib.spa.widget.illustration.IllustrationModel import com.android.settingslib.spa.widget.illustration.ResourceType +import com.android.settingslib.spa.widget.preference.Preference +import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.ui.SettingsBody import com.android.settingslib.spa.widget.ui.SpinnerOption import com.android.settingslib.spaprivileged.model.app.AppListModel @@ -80,12 +79,14 @@ object UserAspectRatioAppsPageProvider : SettingsPageProvider { @Composable @VisibleForTesting - fun EntryItem() = + fun EntryItem() { + val summary = getSummary() Preference(object : PreferenceModel { override val title = stringResource(R.string.aspect_ratio_experimental_title) - override val summary = getSummary().toState() + override val summary = { summary } override val onClick = navigator(name) }) + } @VisibleForTesting fun buildInjectEntry() = SettingsEntryBuilder @@ -177,7 +178,7 @@ class UserAspectRatioAppListModel(private val context: Context) option: Int, recordListFlow: Flow> ): Flow> = recordListFlow.filterItem( - when (SpinnerItem.values().getOrNull(option)) { + when (SpinnerItem.entries.getOrNull(option)) { SpinnerItem.Suggested -> ({ it.canDisplay && it.suggested }) SpinnerItem.Overridden -> ({ it.userOverride != USER_MIN_ASPECT_RATIO_UNSET }) else -> ({ it.canDisplay }) @@ -185,13 +186,15 @@ class UserAspectRatioAppListModel(private val context: Context) ) @Composable - override fun getSummary(option: Int, record: UserAspectRatioAppListItemModel) : State = - remember(record.userOverride) { + override fun getSummary(option: Int, record: UserAspectRatioAppListItemModel): () -> String { + val summary by remember(record.userOverride) { flow { emit(userAspectRatioManager.getUserMinAspectRatioEntry(record.userOverride, record.app.packageName)) }.flowOn(Dispatchers.IO) }.collectAsStateWithLifecycle(initialValue = stringResource(R.string.summary_placeholder)) + return { summary } + } private fun getPackageAndActivityInfo(app: ApplicationInfo): PackageInfo? = try { packageManager.getPackageInfoAsUser(app.packageName, GET_ACTIVITIES_FLAGS, app.userId) diff --git a/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt b/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt index 34272d47838..31e068cb4c3 100644 --- a/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt @@ -24,6 +24,7 @@ import android.content.res.Resources import android.os.Bundle import android.util.Log import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalContext @@ -52,11 +53,12 @@ fun AppAllServicesPreference(app: ApplicationInfo) { val presenter = remember { AppAllServicesPresenter(context, app, coroutineScope) } if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return + val summary by presenter.summaryFlow.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.summary_placeholder), + ) Preference(object : PreferenceModel { override val title = stringResource(R.string.app_info_all_services_label) - override val summary = presenter.summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.summary_placeholder), - ) + override val summary = { summary } override val onClick = presenter::startActivity }) } diff --git a/src/com/android/settings/spa/app/appinfo/AppBatteryPreference.kt b/src/com/android/settings/spa/app/appinfo/AppBatteryPreference.kt index 7dd78a9ed5c..c707b44bae8 100644 --- a/src/com/android/settings/spa/app/appinfo/AppBatteryPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppBatteryPreference.kt @@ -21,7 +21,6 @@ import android.content.pm.ApplicationInfo import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -91,16 +90,17 @@ private class AppBatteryPresenter(private val context: Context, private val app: } } - val enabled = derivedStateOf { batteryDiffEntryState is LoadingState.Done } + val enabled = { batteryDiffEntryState is LoadingState.Done } - val summary = derivedStateOf { - if (!app.installed) return@derivedStateOf "" - batteryDiffEntryState.let { batteryDiffEntryState -> - when (batteryDiffEntryState) { - is LoadingState.Loading -> context.getString(R.string.summary_placeholder) - is LoadingState.Done -> batteryDiffEntryState.result.getSummary() + val summary = { + if (app.installed) { + batteryDiffEntryState.let { batteryDiffEntryState -> + when (batteryDiffEntryState) { + is LoadingState.Loading -> context.getString(R.string.summary_placeholder) + is LoadingState.Done -> batteryDiffEntryState.result.getSummary() + } } - } + } else "" } private fun BatteryDiffEntry?.getSummary(): String = @@ -155,7 +155,7 @@ private class AppBatteryPresenter(private val context: Context, private val app: } private sealed class LoadingState { - object Loading : LoadingState() + data object Loading : LoadingState() data class Done(val result: T) : LoadingState() diff --git a/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt b/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt index ceb3986ebf3..057f91111b9 100644 --- a/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt @@ -20,6 +20,7 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.net.NetworkTemplate import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalContext @@ -34,7 +35,6 @@ import com.android.settings.datausage.lib.IAppDataUsageSummaryRepository import com.android.settings.datausage.lib.INetworkTemplates import com.android.settings.datausage.lib.NetworkTemplates import com.android.settings.datausage.lib.NetworkTemplates.getTitleResId -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.model.app.hasFlag @@ -64,16 +64,17 @@ fun AppDataUsagePreference( } if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return + val summary by presenter.summaryFlow.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.computing_size), + ) Preference(object : PreferenceModel { override val title = stringResource( presenter.titleResIdFlow.collectAsStateWithLifecycle( initialValue = R.string.summary_placeholder, ).value ) - override val summary = presenter.summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.computing_size), - ) - override val enabled = presenter.isEnabled().toState() + override val summary = { summary } + override val enabled = { presenter.isEnabled() } override val onClick = presenter::startActivity }) } diff --git a/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt b/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt index 5a348f76c80..62e714a6627 100644 --- a/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt @@ -19,15 +19,16 @@ package com.android.settings.spa.app.appinfo import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope 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.Utils import com.android.settings.applications.AppStoreUtil import com.android.settingslib.applications.AppUtils -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.framework.common.asUser @@ -49,13 +50,14 @@ fun AppInstallerInfoPreference(app: ApplicationInfo) { val presenter = remember { AppInstallerInfoPresenter(context, app, coroutineScope) } if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return + val summary by presenter.summaryFlow.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.summary_placeholder), + ) + val enabled by presenter.enabledFlow.collectAsStateWithLifecycle(initialValue = false) Preference(object : PreferenceModel { override val title = stringResource(R.string.app_install_details_title) - override val summary = presenter.summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.summary_placeholder), - ) - override val enabled = - presenter.enabledFlow.collectAsStateWithLifecycle(initialValue = false) + override val summary = { summary } + override val enabled = { enabled } override val onClick = presenter::startActivity }) } diff --git a/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt b/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt index 2d6fbb6545a..3b2aace6a0d 100644 --- a/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt @@ -23,15 +23,16 @@ import android.content.pm.PackageManager import android.content.pm.PackageManager.ResolveInfoFlags import android.net.Uri import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember 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.applications.AppInfoBase import com.android.settings.applications.AppLocaleUtil import com.android.settings.applications.appinfo.AppLocaleDetails import com.android.settings.localepicker.AppLocalePickerActivity -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.model.app.userHandle @@ -46,11 +47,12 @@ fun AppLocalePreference(app: ApplicationInfo) { val presenter = remember { AppLocalePresenter(context, app) } if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return + val summary by presenter.summaryFlow.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.summary_placeholder), + ) Preference(object : PreferenceModel { override val title = stringResource(R.string.app_locale_preference_title) - override val summary = presenter.summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.summary_placeholder), - ) + override val summary = { summary } override val onClick = presenter::startActivity }) } diff --git a/src/com/android/settings/spa/app/appinfo/AppNotificationPreference.kt b/src/com/android/settings/spa/app/appinfo/AppNotificationPreference.kt index 45033e7a28e..28527c1bcae 100644 --- a/src/com/android/settings/spa/app/appinfo/AppNotificationPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppNotificationPreference.kt @@ -19,6 +19,7 @@ package com.android.settings.spa.app.appinfo import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -29,7 +30,6 @@ import com.android.settings.notification.app.AppNotificationSettings import com.android.settings.spa.notification.AppNotificationRepository import com.android.settings.spa.notification.IAppNotificationRepository import com.android.settingslib.spa.framework.compose.rememberContext -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.model.app.installed @@ -43,17 +43,17 @@ fun AppNotificationPreference( repository: IAppNotificationRepository = rememberContext(::AppNotificationRepository), ) { val context = LocalContext.current - val summaryFlow = remember(app) { + val summary by remember(app) { flow { emit(repository.getNotificationSummary(app)) - }.flowOn(Dispatchers.IO) - } + }.flowOn(Dispatchers.Default) + }.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.summary_placeholder) + ) Preference(object : PreferenceModel { override val title = stringResource(R.string.notifications_label) - override val summary = summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.summary_placeholder) - ) - override val enabled = stateOf(app.installed) + override val summary = { summary } + override val enabled = { app.installed } override val onClick = { navigateToAppNotificationSettings(context, app) } }) } @@ -65,4 +65,4 @@ private fun navigateToAppNotificationSettings(context: Context, app: Application context, AppInfoSettingsProvider.METRICS_CATEGORY, ) -} \ No newline at end of file +} diff --git a/src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt b/src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt index 757ddc29b90..aae9569bdad 100644 --- a/src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt @@ -19,6 +19,7 @@ package com.android.settings.spa.app.appinfo import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -28,7 +29,6 @@ import com.android.settings.applications.appinfo.AppInfoDashboardFragment import com.android.settings.applications.intentpicker.AppLaunchSettings import com.android.settings.applications.intentpicker.IntentPickerUtils import com.android.settingslib.applications.AppUtils -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.framework.common.asUser @@ -46,12 +46,13 @@ fun AppOpenByDefaultPreference(app: ApplicationInfo) { val presenter = remember(app) { AppOpenByDefaultPresenter(context, app) } if (remember(presenter) { !presenter.isAvailable() }) return + val summary by presenter.summaryFlow.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.summary_placeholder), + ) Preference(object : PreferenceModel { override val title = stringResource(R.string.launch_by_default) - override val summary = presenter.summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.summary_placeholder), - ) - override val enabled = stateOf(presenter.isEnabled()) + override val summary = { summary } + override val enabled = { presenter.isEnabled() } override val onClick = presenter::startActivity }) } diff --git a/src/com/android/settings/spa/app/appinfo/AppPermissionPreference.kt b/src/com/android/settings/spa/app/appinfo/AppPermissionPreference.kt index ad666dc50e8..ec1780f89b2 100644 --- a/src/com/android/settings/spa/app/appinfo/AppPermissionPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppPermissionPreference.kt @@ -22,7 +22,6 @@ import android.content.Intent import android.content.pm.ApplicationInfo import android.util.Log import androidx.compose.runtime.Composable -import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext @@ -52,8 +51,8 @@ fun AppPermissionPreference( model = remember { object : PreferenceModel { override val title = context.getString(R.string.permissions_label) - override val summary = derivedStateOf { summaryState.value.summary } - override val enabled = derivedStateOf { summaryState.value.enabled } + override val summary = { summaryState.value.summary } + override val enabled = { summaryState.value.enabled } override val onClick = { startManagePermissionsActivity(context, app) } } }, diff --git a/src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt b/src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt index e8b1018acfd..2b96454cbcb 100644 --- a/src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt @@ -19,9 +19,6 @@ package com.android.settings.spa.app.appinfo import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.Composable -import androidx.compose.runtime.State -import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import com.android.settings.R @@ -47,12 +44,13 @@ fun AppStoragePreference(app: ApplicationInfo) { } @Composable -private fun getSummary(context: Context, app: ApplicationInfo): State { +private fun getSummary(context: Context, app: ApplicationInfo): () -> String { val sizeState = app.getStorageSize() - return remember { - derivedStateOf { - val size = sizeState.value - if (size.isBlank()) return@derivedStateOf context.getString(R.string.computing_size) + return { + val size = sizeState.value + if (size.isBlank()) { + context.getString(R.string.computing_size) + } else { val storageType = context.getString( when (app.hasFlag(ApplicationInfo.FLAG_EXTERNAL_STORAGE)) { true -> R.string.storage_type_external diff --git a/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreference.kt b/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreference.kt index 21b3d735b56..7ba61dcd85a 100644 --- a/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppTimeSpentPreference.kt @@ -22,6 +22,7 @@ import android.content.pm.ApplicationInfo import android.content.pm.PackageManager.ResolveInfoFlags import android.provider.Settings import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext @@ -29,7 +30,6 @@ import androidx.compose.ui.res.stringResource import androidx.lifecycle.liveData import com.android.settings.R import com.android.settings.overlay.FeatureFactory.Companion.featureFactory -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.model.app.hasFlag @@ -43,12 +43,13 @@ fun AppTimeSpentPreference(app: ApplicationInfo) { val presenter = remember { AppTimeSpentPresenter(context, app) } if (!presenter.isAvailable()) return + val summary by presenter.summaryLiveData.observeAsState( + initial = stringResource(R.string.summary_placeholder), + ) Preference(object : PreferenceModel { override val title = stringResource(R.string.time_spent_in_app_pref_title) - override val summary = presenter.summaryLiveData.observeAsState( - initial = stringResource(R.string.summary_placeholder), - ) - override val enabled = stateOf(presenter.isEnabled()) + override val summary = { summary } + override val enabled = { presenter.isEnabled() } override val onClick = presenter::startActivity }) } diff --git a/src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt b/src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt index 74c0aa4dc21..51f68457ece 100644 --- a/src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt @@ -22,6 +22,7 @@ import android.content.Intent import android.content.pm.ApplicationInfo import androidx.annotation.StringRes import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext @@ -57,11 +58,12 @@ fun DefaultAppShortcutPreference(shortcut: DefaultAppShortcut, app: ApplicationI if (remember(presenter) { !presenter.isAvailable() }) return if (presenter.isVisible().observeAsState().value != true) return + val summary by presenter.summaryFlow.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.summary_placeholder), + ) Preference(object : PreferenceModel { override val title = stringResource(shortcut.titleResId) - override val summary = presenter.summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.summary_placeholder), - ) + override val summary = { summary } override val onClick = presenter::startActivity }) } diff --git a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt index f62a3beec19..77d68b5fe23 100644 --- a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt @@ -31,12 +31,11 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.settings.R import com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED import com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS import com.android.settingslib.spa.framework.compose.OverridableFlow -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.widget.preference.SwitchPreference import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel import com.android.settingslib.spaprivileged.framework.common.appHibernationManager @@ -44,12 +43,12 @@ import com.android.settingslib.spaprivileged.framework.common.appOpsManager import com.android.settingslib.spaprivileged.framework.common.asUser import com.android.settingslib.spaprivileged.framework.common.permissionControllerManager import com.android.settingslib.spaprivileged.model.app.userHandle +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.asExecutor import kotlinx.coroutines.flow.flow import kotlinx.coroutines.withContext -import kotlin.coroutines.resume -import kotlin.coroutines.suspendCoroutine @Composable fun HibernationSwitchPreference(app: ApplicationInfo) { @@ -62,7 +61,7 @@ fun HibernationSwitchPreference(app: ApplicationInfo) { SwitchPreference(remember { object : SwitchPreferenceModel { override val title = context.getString(R.string.unused_apps_switch) - override val summary = stateOf(context.getString(R.string.unused_apps_switch_summary)) + override val summary = { context.getString(R.string.unused_apps_switch_summary) } override val changeable = isEligibleState override val checked = derivedStateOf { diff --git a/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt b/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt index 7b9480d5215..9c3ec97e0f4 100644 --- a/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt @@ -32,9 +32,9 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier 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.Utils -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel @@ -53,11 +53,12 @@ fun InstantAppDomainsPreference(app: ApplicationInfo) { val presenter = remember { InstantAppDomainsPresenter(context, app) } var openDialog by rememberSaveable { mutableStateOf(false) } + val summary by presenter.summaryFlow.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.summary_placeholder), + ) Preference(object : PreferenceModel { override val title = stringResource(R.string.app_launch_supported_domain_urls_title) - override val summary = presenter.summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.summary_placeholder), - ) + override val summary = { summary } override val onClick = { openDialog = true } }) diff --git a/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt b/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt index 12f69070700..905e057598d 100644 --- a/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt @@ -19,13 +19,14 @@ package com.android.settings.spa.app.appinfo import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember 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.applications.appinfo.AppInfoDashboardFragment import com.android.settings.applications.specialaccess.interactacrossprofiles.InteractAcrossProfilesDetails -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.framework.common.crossProfileApps @@ -39,11 +40,12 @@ fun InteractAcrossProfilesDetailsPreference(app: ApplicationInfo) { val presenter = remember { InteractAcrossProfilesDetailsPresenter(context, app) } if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return + val summary by presenter.summaryFlow.collectAsStateWithLifecycle( + initialValue = stringResource(R.string.summary_placeholder), + ) Preference(object : PreferenceModel { override val title = stringResource(R.string.interact_across_profiles_title) - override val summary = presenter.summaryFlow.collectAsStateWithLifecycle( - initialValue = stringResource(R.string.summary_placeholder), - ) + override val summary = { summary } override val onClick = presenter::startActivity }) } diff --git a/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProvider.kt b/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProvider.kt index 6e0643b1bb6..89f473b56d8 100644 --- a/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProvider.kt +++ b/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProvider.kt @@ -32,6 +32,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Delete import androidx.compose.runtime.Composable import androidx.compose.runtime.State +import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -88,9 +89,10 @@ object BackgroundInstalledAppsPageProvider : SettingsPageProvider { @Composable fun EntryItem() { if(featureIsDisabled) return + val summary by generatePreferenceSummary() Preference(object : PreferenceModel { override val title = stringResource(R.string.background_install_title) - override val summary = generatePreferenceSummary() + override val summary = { summary } override val onClick = navigator(name) }) } diff --git a/src/com/android/settings/spa/app/storage/StorageAppList.kt b/src/com/android/settings/spa/app/storage/StorageAppList.kt index 8fc3eb54bc8..c33de33db59 100644 --- a/src/com/android/settings/spa/app/storage/StorageAppList.kt +++ b/src/com/android/settings/spa/app/storage/StorageAppList.kt @@ -22,7 +22,7 @@ import android.os.Bundle import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.runtime.State -import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -121,13 +121,9 @@ class StorageAppListModel( ): Flow> = recordListFlow.filterItem { type.filter(it) } @Composable - override fun getSummary(option: Int, record: AppRecordWithSize): State { - val storageSummary = record.app.getStorageSummary() - return remember { - derivedStateOf { - storageSummary.value - } - } + override fun getSummary(option: Int, record: AppRecordWithSize): () -> String { + val storageSummary by record.app.getStorageSummary() + return { storageSummary } } @Composable diff --git a/src/com/android/settings/spa/development/UsageStatsListModel.kt b/src/com/android/settings/spa/development/UsageStatsListModel.kt index 61c24aca853..d27796d14c8 100644 --- a/src/com/android/settings/spa/development/UsageStatsListModel.kt +++ b/src/com/android/settings/spa/development/UsageStatsListModel.kt @@ -22,10 +22,8 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.text.format.DateUtils import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import com.android.settings.R import com.android.settings.spa.development.UsageStatsListModel.SpinnerItem.Companion.toSpinnerItem -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.widget.ui.SpinnerOption import com.android.settingslib.spaprivileged.model.app.AppEntry import com.android.settingslib.spaprivileged.model.app.AppListModel @@ -55,7 +53,7 @@ class UsageStatsListModel(private val context: Context) : AppListModel): List = - SpinnerItem.values().map { + SpinnerItem.entries.map { SpinnerOption( id = it.ordinal, text = context.getString(it.stringResId), @@ -77,7 +75,7 @@ class UsageStatsListModel(private val context: Context) : AppListModel? { + override fun getSummary(option: Int, record: UsageStatsAppRecord): (() -> String)? { val usageStats = record.usageStats ?: return null val lastTimeUsed = DateUtils.formatSameDayTime( usageStats.lastTimeUsed, now, DateFormat.MEDIUM, DateFormat.MEDIUM @@ -85,7 +83,7 @@ class UsageStatsListModel(private val context: Context) : AppListModel { @@ -101,7 +99,7 @@ class UsageStatsListModel(private val context: Context) : AppListModel String = { + record.app.packageName + } @Composable override fun AppListItemModel.AppItem() { diff --git a/src/com/android/settings/spa/network/NetworkAndInternet.kt b/src/com/android/settings/spa/network/NetworkAndInternet.kt index 777133e666b..f9852371453 100644 --- a/src/com/android/settings/spa/network/NetworkAndInternet.kt +++ b/src/com/android/settings/spa/network/NetworkAndInternet.kt @@ -34,7 +34,6 @@ import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold @@ -60,9 +59,10 @@ object NetworkAndInternetPageProvider : SettingsPageProvider { fun buildInjectEntry(): SettingsEntryBuilder { return SettingsEntryBuilder.createInject(owner = owner) .setUiLayoutFn { + val summary = stringResource(getSummaryResId()) Preference(object : PreferenceModel { override val title = stringResource(R.string.network_dashboard_title) - override val summary = stringResource(getSummaryResId()).toState() + override val summary = { summary } override val onClick = navigator(name) override val icon = @Composable { SettingsIcon(imageVector = Icons.Outlined.Wifi) diff --git a/src/com/android/settings/spa/notification/AppListNotifications.kt b/src/com/android/settings/spa/notification/AppListNotifications.kt index c1e5d643639..00e439495a4 100644 --- a/src/com/android/settings/spa/notification/AppListNotifications.kt +++ b/src/com/android/settings/spa/notification/AppListNotifications.kt @@ -23,7 +23,6 @@ import com.android.settings.R import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.rememberContext -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.template.app.AppListPage @@ -41,9 +40,10 @@ object AppListNotificationsPageProvider : SettingsPageProvider { @Composable fun EntryItem() { + val summary = stringResource(R.string.app_notification_field_summary) Preference(object : PreferenceModel { override val title = stringResource(R.string.app_notifications_title) - override val summary = stringResource(R.string.app_notification_field_summary).toState() + override val summary = { summary } override val onClick = navigator(name) }) } diff --git a/src/com/android/settings/spa/notification/AppNotificationsListModel.kt b/src/com/android/settings/spa/notification/AppNotificationsListModel.kt index 0b9b67652d5..692ffcb85c1 100644 --- a/src/com/android/settings/spa/notification/AppNotificationsListModel.kt +++ b/src/com/android/settings/spa/notification/AppNotificationsListModel.kt @@ -27,7 +27,6 @@ import com.android.settings.R import com.android.settings.applications.AppInfoBase import com.android.settings.notification.app.AppNotificationSettings import com.android.settings.spa.notification.SpinnerItem.Companion.toSpinnerItem -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.framework.util.asyncFilter import com.android.settingslib.spa.framework.util.asyncForEach import com.android.settingslib.spa.widget.ui.SpinnerOption @@ -91,16 +90,17 @@ class AppNotificationsListModel( }.then(super.getComparator(option)) @Composable - override fun getSummary(option: Int, record: AppNotificationsRecord) = record.sentState?.let { - when (option.toSpinnerItem()) { - SpinnerItem.MostRecent -> stateOf(formatLastSent(it.lastSent)) - SpinnerItem.MostFrequent -> stateOf(repository.calculateFrequencySummary(it.sentCount)) - else -> null + override fun getSummary(option: Int, record: AppNotificationsRecord): (() -> String)? = + record.sentState?.let { + when (option.toSpinnerItem()) { + SpinnerItem.MostRecent -> ({ formatLastSent(it.lastSent) }) + SpinnerItem.MostFrequent -> ({ repository.calculateFrequencySummary(it.sentCount) }) + else -> null + } } - } override fun getSpinnerOptions(recordList: List): List = - SpinnerItem.values().map { + SpinnerItem.entries.map { SpinnerOption( id = it.ordinal, text = context.getString(it.stringResId), @@ -145,6 +145,6 @@ private enum class SpinnerItem(val stringResId: Int) { TurnedOff(R.string.filter_notif_blocked_apps); companion object { - fun Int.toSpinnerItem(): SpinnerItem = values()[this] + fun Int.toSpinnerItem(): SpinnerItem = entries[this] } } diff --git a/src/com/android/settings/spa/notification/NotificationMain.kt b/src/com/android/settings/spa/notification/NotificationMain.kt index 305f2015285..b3c7a55465c 100644 --- a/src/com/android/settings/spa/notification/NotificationMain.kt +++ b/src/com/android/settings/spa/notification/NotificationMain.kt @@ -25,13 +25,12 @@ import com.android.settings.R import com.android.settingslib.spa.framework.common.SettingsEntryBuilder import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory +import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold import com.android.settingslib.spa.widget.ui.SettingsIcon -import com.android.settingslib.spa.framework.common.createSettingsPage object NotificationMainPageProvider : SettingsPageProvider { override val name = "NotificationMain" @@ -53,9 +52,10 @@ object NotificationMainPageProvider : SettingsPageProvider { fun buildInjectEntry(): SettingsEntryBuilder { return SettingsEntryBuilder.createInject(owner = owner) .setUiLayoutFn { + val summary = stringResource(R.string.notification_dashboard_summary) Preference(object : PreferenceModel { override val title = stringResource(R.string.configure_notification_settings) - override val summary = stringResource(R.string.notification_dashboard_summary).toState() + override val summary = { summary } override val onClick = navigator(name) override val icon = @Composable { SettingsIcon(imageVector = Icons.Outlined.Notifications) diff --git a/src/com/android/settings/spa/system/AppLanguages.kt b/src/com/android/settings/spa/system/AppLanguages.kt index b878aa72ee0..d836a32e7a2 100644 --- a/src/com/android/settings/spa/system/AppLanguages.kt +++ b/src/com/android/settings/spa/system/AppLanguages.kt @@ -26,7 +26,6 @@ import com.android.settings.R import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.rememberContext -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel @@ -52,9 +51,10 @@ object AppLanguagesPageProvider : SettingsPageProvider { @Composable fun EntryItem() { + val summary = stringResource(R.string.app_locale_picker_summary) Preference(object : PreferenceModel { override val title = stringResource(R.string.app_locales_picker_menu_title) - override val summary = stringResource(R.string.app_locale_picker_summary).toState() + override val summary = { summary } override val onClick = navigator(name) }) } diff --git a/src/com/android/settings/spa/system/AppLanguagesListModel.kt b/src/com/android/settings/spa/system/AppLanguagesListModel.kt index 3413ff09d50..3573e257f6e 100644 --- a/src/com/android/settings/spa/system/AppLanguagesListModel.kt +++ b/src/com/android/settings/spa/system/AppLanguagesListModel.kt @@ -23,7 +23,7 @@ import android.content.pm.PackageManager import android.net.Uri import android.os.UserHandle import androidx.compose.runtime.Composable -import androidx.compose.runtime.State +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -79,12 +79,14 @@ class AppLanguagesListModel(private val context: Context) : AppListModel = - remember(record.app) { + override fun getSummary(option: Int, record: AppLanguagesRecord): () -> String { + val summary by remember(record.app) { flow { emit(getSummary(record.app)) }.flowOn(Dispatchers.IO) }.collectAsStateWithLifecycle(initialValue = stringResource(R.string.summary_placeholder)) + return { summary } + } private fun getSummary(app: ApplicationInfo): String = AppLocaleDetails.getSummary(context, app).toString() diff --git a/src/com/android/settings/spa/system/LanguageAndInputPageProvider.kt b/src/com/android/settings/spa/system/LanguageAndInputPageProvider.kt index b5cd2997589..5c1038d6719 100644 --- a/src/com/android/settings/spa/system/LanguageAndInputPageProvider.kt +++ b/src/com/android/settings/spa/system/LanguageAndInputPageProvider.kt @@ -24,7 +24,6 @@ import androidx.compose.ui.res.stringResource import com.android.settings.R import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold @@ -42,9 +41,10 @@ object LanguageAndInputPageProvider : SettingsPageProvider { @Composable fun EntryItem() { + val summary = stringResource(R.string.language_settings) Preference(object : PreferenceModel { override val title = stringResource(R.string.language_settings) - override val summary = stringResource(R.string.language_settings).toState() + override val summary = { summary } override val onClick = navigator(name) override val icon = @Composable { SettingsIcon(imageVector = Icons.Outlined.Language) diff --git a/src/com/android/settings/spa/system/SystemMain.kt b/src/com/android/settings/spa/system/SystemMain.kt index 04ae51209a8..c9aa8cc0ca7 100644 --- a/src/com/android/settings/spa/system/SystemMain.kt +++ b/src/com/android/settings/spa/system/SystemMain.kt @@ -27,7 +27,6 @@ import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator -import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold @@ -53,9 +52,10 @@ object SystemMainPageProvider : SettingsPageProvider { fun buildInjectEntry(): SettingsEntryBuilder { return SettingsEntryBuilder.createInject(owner = owner) .setUiLayoutFn { + val summary = stringResource(R.string.system_dashboard_summary) Preference(object : PreferenceModel { override val title = stringResource(R.string.header_category_system) - override val summary = stringResource(R.string.system_dashboard_summary).toState() + override val summary = { summary } override val onClick = navigator(name) override val icon = @Composable { SettingsIcon(imageVector = Icons.Outlined.Info) diff --git a/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt index 53ed4f0da9a..1a05479fda0 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt @@ -21,7 +21,6 @@ import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.graphics.drawable.Drawable import androidx.compose.runtime.SideEffect -import androidx.compose.runtime.State import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText @@ -146,12 +145,12 @@ class AllAppListTest { fun allAppListModel_getSummary() { val listModel = AllAppListModel(context) { stateOf(SUMMARY) } - lateinit var summaryState: State + lateinit var summary: () -> String composeTestRule.setContent { - summaryState = listModel.getSummary(option = 0, record = AppRecordWithSize(app = APP)) + summary = listModel.getSummary(option = 0, record = AppRecordWithSize(app = APP)) } - assertThat(summaryState.value).isEqualTo(SUMMARY) + assertThat(summary()).isEqualTo(SUMMARY) } @Test @@ -163,13 +162,13 @@ class AllAppListTest { enabled = false } - lateinit var summaryState: State + lateinit var summary: () -> String composeTestRule.setContent { - summaryState = + summary = listModel.getSummary(option = 0, record = AppRecordWithSize(app = disabledApp)) } - assertThat(summaryState.value).isEqualTo("$SUMMARY${System.lineSeparator()}Disabled") + assertThat(summary()).isEqualTo("$SUMMARY${System.lineSeparator()}Disabled") } @Test @@ -179,13 +178,13 @@ class AllAppListTest { packageName = PACKAGE_NAME } - lateinit var summaryState: State + lateinit var summary: () -> String composeTestRule.setContent { - summaryState = + summary = listModel.getSummary(option = 0, record = AppRecordWithSize(app = notInstalledApp)) } - assertThat(summaryState.value) + assertThat(summary()) .isEqualTo("$SUMMARY${System.lineSeparator()}Not installed for this user") } @@ -207,7 +206,7 @@ class AllAppListTest { AppListItemModel( record = AppRecordWithSize(app = app), label = LABEL, - summary = stateOf(SUMMARY), + summary = { SUMMARY }, ).AppItem() } } @@ -224,13 +223,13 @@ class AllAppListTest { isArchived = true } - lateinit var summaryState: State + lateinit var summary: () -> String composeTestRule.setContent { - summaryState = + summary = listModel.getSummary(option = 0, record = AppRecordWithSize(app = archivedApp)) } - assertThat(summaryState.value).isEqualTo(SUMMARY) + assertThat(summary()).isEqualTo(SUMMARY) } private fun getAppListInput(): AppListInput { @@ -252,7 +251,7 @@ class AllAppListTest { AppListItemModel( record = AppRecordWithSize(app = APP), label = LABEL, - summary = stateOf(SUMMARY), + summary = { SUMMARY }, ).AppItem() } } diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt index 4f372e29307..dfacca892eb 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt @@ -21,7 +21,6 @@ import android.content.pm.ApplicationInfo import android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_SPLIT_SCREEN import android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_UNSET import android.os.Build -import androidx.compose.runtime.State import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText @@ -29,7 +28,6 @@ import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.R -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.testutils.FakeNavControllerWrapper import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull import com.android.settingslib.spaprivileged.template.app.AppListItemModel @@ -132,7 +130,7 @@ class UserAspectRatioAppsPageProviderTest { AppListItemModel( record = APP_RECORD_SUGGESTED, label = LABEL, - summary = stateOf(SUMMARY) + summary = { SUMMARY } ).AppItem() } } @@ -141,23 +139,23 @@ class UserAspectRatioAppsPageProviderTest { @Test fun aspectRatioAppListModel_getSummaryDefault() { - val summaryState = setSummaryState(USER_MIN_ASPECT_RATIO_UNSET) - assertThat(summaryState.value) - .isEqualTo(context.getString(R.string.user_aspect_ratio_app_default)) + val summary = getSummary(USER_MIN_ASPECT_RATIO_UNSET) + + assertThat(summary).isEqualTo(context.getString(R.string.user_aspect_ratio_app_default)) } @Test fun aspectRatioAppListModel_getSummaryWhenSplitScreen() { - val summaryState = setSummaryState(USER_MIN_ASPECT_RATIO_SPLIT_SCREEN) - assertThat(summaryState.value) - .isEqualTo(context.getString(R.string.user_aspect_ratio_half_screen)) + val summary = getSummary(USER_MIN_ASPECT_RATIO_SPLIT_SCREEN) + + assertThat(summary).isEqualTo(context.getString(R.string.user_aspect_ratio_half_screen)) } - private fun setSummaryState(userOverride: Int): State { + private fun getSummary(userOverride: Int): String { val listModel = UserAspectRatioAppListModel(context) - lateinit var summaryState: State + lateinit var summary: () -> String composeTestRule.setContent { - summaryState = listModel.getSummary(option = 0, + summary = listModel.getSummary(option = 0, record = UserAspectRatioAppListItemModel( app = APP, userOverride = userOverride, @@ -165,7 +163,7 @@ class UserAspectRatioAppsPageProviderTest { canDisplay = true, )) } - return summaryState + return summary() } diff --git a/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt index ccd385fe4f9..5c65da11a66 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt @@ -29,7 +29,6 @@ import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.R -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.testutils.FakeNavControllerWrapper import com.android.settingslib.spaprivileged.template.app.AppListItemModel import com.google.common.truth.Truth.assertThat @@ -244,7 +243,7 @@ class BackgroundInstalledAppsPageProviderTest { app = APP, dateOfInstall = TEST_FIRST_INSTALL_TIME), label = TEST_LABEL, - summary = stateOf(TEST_SUMMARY), + summary = { TEST_SUMMARY }, ).AppItem() } } diff --git a/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt b/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt index 0cfdc7decc1..6aee4ce224e 100644 --- a/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt @@ -20,7 +20,6 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.content.pm.PackageManager.PackageInfoFlags -import androidx.compose.runtime.State import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -79,20 +78,20 @@ class PlatformCompatAppListModelTest { @Test fun getSummary() = runTest { - val summaryState = getSummaryState(APP) + val summary = getSummary(APP) - assertThat(summaryState.value).isEqualTo(PACKAGE_NAME) + assertThat(summary).isEqualTo(PACKAGE_NAME) } - private fun getSummaryState(app: ApplicationInfo): State { - lateinit var summary: State + private fun getSummary(app: ApplicationInfo): String { + lateinit var summary: () -> String composeTestRule.setContent { summary = listModel.getSummary( option = 0, record = PlatformCompatAppRecord(app), ) } - return summary + return summary() } private companion object {