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

View File

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