[Spa] Fix "State<T> as a parameter" of Preference
Bug: 292036686 Test: manual - with Settings Test: unit tests Change-Id: I8a9faaefe4780667a2747a4ef1573361d3258705
This commit is contained in:
@@ -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 {
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
})
|
||||
|
||||
|
@@ -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<List<AppRecordWithSize>>,
|
||||
): Flow<List<AppRecordWithSize>> = 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<String> {
|
||||
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())
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@@ -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<List<UserAspectRatioAppListItemModel>>
|
||||
): Flow<List<UserAspectRatioAppListItemModel>> = 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<String> =
|
||||
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)
|
||||
|
@@ -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
|
||||
})
|
||||
}
|
||||
|
@@ -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<String> {
|
||||
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<out T> {
|
||||
object Loading : LoadingState<Nothing>()
|
||||
data object Loading : LoadingState<Nothing>()
|
||||
|
||||
data class Done<T>(val result: T) : LoadingState<T>()
|
||||
|
||||
|
@@ -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
|
||||
})
|
||||
}
|
||||
|
@@ -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
|
||||
})
|
||||
}
|
||||
|
@@ -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
|
||||
})
|
||||
}
|
||||
|
@@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
})
|
||||
}
|
||||
|
@@ -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) }
|
||||
}
|
||||
},
|
||||
|
@@ -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<String> {
|
||||
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
|
||||
|
@@ -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
|
||||
})
|
||||
}
|
||||
|
@@ -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
|
||||
})
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
@@ -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 }
|
||||
})
|
||||
|
||||
|
@@ -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
|
||||
})
|
||||
}
|
||||
|
@@ -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)
|
||||
})
|
||||
}
|
||||
|
@@ -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<List<AppRecordWithSize>> = recordListFlow.filterItem { type.filter(it) }
|
||||
|
||||
@Composable
|
||||
override fun getSummary(option: Int, record: AppRecordWithSize): State<String> {
|
||||
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
|
||||
|
@@ -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<UsageStat
|
||||
}
|
||||
|
||||
override fun getSpinnerOptions(recordList: List<UsageStatsAppRecord>): List<SpinnerOption> =
|
||||
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<UsageStat
|
||||
}.then(super.getComparator(option))
|
||||
|
||||
@Composable
|
||||
override fun getSummary(option: Int, record: UsageStatsAppRecord): State<String>? {
|
||||
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<UsageStat
|
||||
val lastTimeUsedLine = "${context.getString(R.string.last_time_used_label)}: $lastTimeUsed"
|
||||
val usageTime = DateUtils.formatElapsedTime(usageStats.totalTimeInForeground / 1000)
|
||||
val usageTimeLine = "${context.getString(R.string.usage_time_label)}: $usageTime"
|
||||
return stateOf("$lastTimeUsedLine\n$usageTimeLine")
|
||||
return { "$lastTimeUsedLine\n$usageTimeLine" }
|
||||
}
|
||||
|
||||
private fun getUsageStats(): Map<String, UsageStats> {
|
||||
@@ -101,7 +99,7 @@ class UsageStatsListModel(private val context: Context) : AppListModel<UsageStat
|
||||
AppName(R.string.usage_stats_sort_by_app_name);
|
||||
|
||||
companion object {
|
||||
fun Int.toSpinnerItem(): SpinnerItem = values()[this]
|
||||
fun Int.toSpinnerItem(): SpinnerItem = entries[this]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -24,7 +24,6 @@ import androidx.compose.runtime.Composable
|
||||
import androidx.core.os.bundleOf
|
||||
import com.android.settings.core.SubSettingLauncher
|
||||
import com.android.settings.development.compat.PlatformCompatDashboard
|
||||
import com.android.settingslib.spa.framework.compose.stateOf
|
||||
import com.android.settingslib.spa.framework.util.filterItem
|
||||
import com.android.settingslib.spa.framework.util.mapItem
|
||||
import com.android.settingslib.spaprivileged.model.app.AppListModel
|
||||
@@ -53,8 +52,9 @@ class PlatformCompatAppListModel(
|
||||
}
|
||||
|
||||
@Composable
|
||||
override fun getSummary(option: Int, record: PlatformCompatAppRecord) =
|
||||
stateOf(record.app.packageName)
|
||||
override fun getSummary(option: Int, record: PlatformCompatAppRecord): () -> String = {
|
||||
record.app.packageName
|
||||
}
|
||||
|
||||
@Composable
|
||||
override fun AppListItemModel<PlatformCompatAppRecord>.AppItem() {
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
})
|
||||
}
|
||||
|
@@ -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<AppNotificationsRecord>): List<SpinnerOption> =
|
||||
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]
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
})
|
||||
}
|
||||
|
@@ -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<AppLang
|
||||
) = recordListFlow.filterItem { it.isAppLocaleSupported }
|
||||
|
||||
@Composable
|
||||
override fun getSummary(option: Int, record: AppLanguagesRecord): State<String> =
|
||||
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()
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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<String>
|
||||
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<String>
|
||||
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<String>
|
||||
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<String>
|
||||
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<AppRecordWithSize> {
|
||||
@@ -252,7 +251,7 @@ class AllAppListTest {
|
||||
AppListItemModel(
|
||||
record = AppRecordWithSize(app = APP),
|
||||
label = LABEL,
|
||||
summary = stateOf(SUMMARY),
|
||||
summary = { SUMMARY },
|
||||
).AppItem()
|
||||
}
|
||||
}
|
||||
|
@@ -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<String> {
|
||||
private fun getSummary(userOverride: Int): String {
|
||||
val listModel = UserAspectRatioAppListModel(context)
|
||||
lateinit var summaryState: State<String>
|
||||
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()
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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()
|
||||
}
|
||||
}
|
||||
|
@@ -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<String> {
|
||||
lateinit var summary: State<String>
|
||||
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 {
|
||||
|
Reference in New Issue
Block a user