Loading src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt +16 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 ) Loading src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt +17 −10 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 }) Loading Loading @@ -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() { Loading Loading
src/com/android/settings/spa/app/appinfo/AppOpenByDefaultPreference.kt +16 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 ) Loading
src/com/android/settings/spa/app/appinfo/DefaultAppShortcutPreference.kt +17 −10 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 }) Loading Loading @@ -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() { Loading