Merge "Fix App Info item summaries not refreshed" into udc-dev

This commit is contained in:
Chaohui Wang
2023-03-01 05:47:06 +00:00
committed by Android (Google) Code Review
2 changed files with 33 additions and 21 deletions

View File

@@ -19,11 +19,11 @@ 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.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.liveData
import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R
import com.android.settings.applications.appinfo.AppInfoDashboardFragment
import com.android.settings.applications.intentpicker.AppLaunchSettings
@@ -38,17 +38,20 @@ import com.android.settingslib.spaprivileged.model.app.hasFlag
import com.android.settingslib.spaprivileged.model.app.userHandle
import com.android.settingslib.spaprivileged.model.app.userId
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
@OptIn(ExperimentalLifecycleComposeApi::class)
@Composable
fun AppOpenByDefaultPreference(app: ApplicationInfo) {
val context = LocalContext.current
val presenter = remember { AppOpenByDefaultPresenter(context, app) }
if (!presenter.isAvailable()) return
val presenter = remember(app) { AppOpenByDefaultPresenter(context, app) }
if (remember(presenter) { !presenter.isAvailable() }) return
Preference(object : PreferenceModel {
override val title = stringResource(R.string.launch_by_default)
override val summary = presenter.summaryLiveData.observeAsState(
initial = stringResource(R.string.summary_placeholder),
override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
initialValue = stringResource(R.string.summary_placeholder),
)
override val enabled = stateOf(presenter.isEnabled())
override val onClick = presenter::startActivity
@@ -66,14 +69,16 @@ private class AppOpenByDefaultPresenter(
fun isEnabled() = app.hasFlag(ApplicationInfo.FLAG_INSTALLED) && app.enabled
val summaryLiveData = liveData(Dispatchers.IO) {
emit(context.getString(when {
val summaryFlow = flow { emit(getSummary()) }.flowOn(Dispatchers.IO)
private fun getSummary() = context.getString(
when {
isLinkHandlingAllowed() -> R.string.app_link_open_always
else -> R.string.app_link_open_never
}))
}
}
)
fun isLinkHandlingAllowed(): Boolean {
private fun isLinkHandlingAllowed(): Boolean {
val userState = IntentPickerUtils.getDomainVerificationUserState(
domainVerificationManager, app.packageName
)

View File

@@ -26,6 +26,8 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.liveData
import com.android.settings.R
import com.android.settingslib.spa.widget.preference.Preference
@@ -39,23 +41,28 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
data class DefaultAppShortcut(
val roleName: String,
@StringRes val titleResId: Int,
)
@OptIn(ExperimentalLifecycleComposeApi::class)
@Composable
fun DefaultAppShortcutPreference(shortcut: DefaultAppShortcut, app: ApplicationInfo) {
val context = LocalContext.current
val presenter = remember { DefaultAppShortcutPresenter(context, shortcut.roleName, app) }
if (!presenter.isAvailable()) return
val presenter = remember(shortcut.roleName, app) {
DefaultAppShortcutPresenter(context, shortcut.roleName, app)
}
if (remember(presenter) { !presenter.isAvailable() }) return
if (presenter.isVisible().observeAsState().value != true) return
Preference(object : PreferenceModel {
override val title = stringResource(shortcut.titleResId)
override val summary = presenter.summaryLiveData.observeAsState(
initial = stringResource(R.string.summary_placeholder),
override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
initialValue = stringResource(R.string.summary_placeholder),
)
override val onClick = presenter::startActivity
})
@@ -93,13 +100,13 @@ private class DefaultAppShortcutPresenter(
}
}
val summaryLiveData = liveData(Dispatchers.IO) {
val defaultApp = roleManager.getRoleHoldersAsUser(roleName, app.userHandle).firstOrNull()
val summaryFlow = flow { emit(getSummary()) }.flowOn(Dispatchers.IO)
emit(context.getString(when (defaultApp) {
app.packageName -> R.string.yes
else -> R.string.no
}))
private fun getSummary(): String {
val defaultApp = roleManager.getRoleHoldersAsUser(roleName, app.userHandle).firstOrNull()
return context.getString(
if (defaultApp == app.packageName) R.string.yes else R.string.no
)
}
fun startActivity() {