Merge "Fix App Info item summaries not refreshed" into udc-dev
This commit is contained in:
@@ -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
|
||||||
)
|
)
|
||||||
|
@@ -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() {
|
||||||
|
Reference in New Issue
Block a user