diff --git a/src/com/android/settings/spa/app/appinfo/AppButtons.kt b/src/com/android/settings/spa/app/appinfo/AppButtons.kt index cbe2f1a9d42..831149132f2 100644 --- a/src/com/android/settings/spa/app/appinfo/AppButtons.kt +++ b/src/com/android/settings/spa/app/appinfo/AppButtons.kt @@ -18,8 +18,9 @@ package com.android.settings.spa.app.appinfo import android.content.pm.ApplicationInfo import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.remember +import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.settingslib.applications.AppUtils import com.android.settingslib.spa.widget.button.ActionButton import com.android.settingslib.spa.widget.button.ActionButtons @@ -44,12 +45,13 @@ private class AppButtonsPresenter(private val packageInfoPresenter: PackageInfoP private val appClearButton = AppClearButton(packageInfoPresenter) private val appForceStopButton = AppForceStopButton(packageInfoPresenter) + @OptIn(ExperimentalLifecycleComposeApi::class) @Composable fun rememberActionsButtons() = remember { packageInfoPresenter.flow.map { packageInfo -> if (packageInfo != null) getActionButtons(packageInfo.applicationInfo) else emptyList() } - }.collectAsState(initial = emptyList()) + }.collectAsStateWithLifecycle(initialValue = emptyList()) private fun getActionButtons(app: ApplicationInfo): List = listOfNotNull( appLaunchButton.getActionButton(app), diff --git a/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt b/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt index 1f7cc4dc607..b019061652b 100644 --- a/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt +++ b/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt @@ -20,11 +20,12 @@ import android.app.settings.SettingsEnums import android.content.pm.ApplicationInfo import android.os.Bundle import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState 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.ExperimentalLifecycleComposeApi +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavType import androidx.navigation.navArgument import com.android.settings.R @@ -34,6 +35,7 @@ import com.android.settings.spa.app.specialaccess.InstallUnknownAppsListProvider import com.android.settings.spa.app.specialaccess.ModifySystemSettingsAppListProvider import com.android.settings.spa.app.specialaccess.PictureInPictureListProvider import com.android.settingslib.spa.framework.common.SettingsPageProvider +import com.android.settingslib.spa.framework.compose.LifecycleEffect import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.widget.scaffold.RegularScaffold import com.android.settingslib.spa.widget.ui.Category @@ -77,9 +79,11 @@ object AppInfoSettingsProvider : SettingsPageProvider { fun getRoute(packageName: String, userId: Int): String = "$name/$packageName/$userId" } +@OptIn(ExperimentalLifecycleComposeApi::class) @Composable private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) { - val packageInfo = packageInfoPresenter.flow.collectAsState().value ?: return + LifecycleEffect(onStart = { packageInfoPresenter.reloadPackageInfo() }) + val packageInfo = packageInfoPresenter.flow.collectAsStateWithLifecycle().value ?: return val app = packageInfo.applicationInfo RegularScaffold( title = stringResource(R.string.application_info_label), diff --git a/src/com/android/settings/spa/app/appinfo/AppSettingsPreference.kt b/src/com/android/settings/spa/app/appinfo/AppSettingsPreference.kt index d700641a161..09957ca05a5 100644 --- a/src/com/android/settings/spa/app/appinfo/AppSettingsPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/AppSettingsPreference.kt @@ -49,7 +49,7 @@ import kotlinx.coroutines.plus fun AppSettingsPreference(app: ApplicationInfo) { val context = LocalContext.current val coroutineScope = rememberCoroutineScope() - val presenter = remember { AppSettingsPresenter(context, app, coroutineScope) } + val presenter = remember(app) { AppSettingsPresenter(context, app, coroutineScope) } if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return Preference(object : PreferenceModel { diff --git a/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt b/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt index 51426a1bdfe..a03fec727f4 100644 --- a/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt +++ b/src/com/android/settings/spa/app/appinfo/PackageInfoPresenter.kt @@ -59,11 +59,7 @@ class PackageInfoPresenter( val flow: StateFlow = _flow - init { - notifyChange() - } - - private fun notifyChange() { + fun reloadPackageInfo() { coroutineScope.launch(Dispatchers.IO) { _flow.value = getPackageInfo() } @@ -83,7 +79,7 @@ class PackageInfoPresenter( val packageInfo = flow.value if (packageInfo != null && packageInfo.applicationInfo.isSystemApp) { // System app still exists after uninstalling the updates, refresh the page. - notifyChange() + reloadPackageInfo() } else { navController.navigateBack() } @@ -98,7 +94,7 @@ class PackageInfoPresenter( userPackageManager.setApplicationEnabledSetting( packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 ) - notifyChange() + reloadPackageInfo() } } @@ -109,7 +105,7 @@ class PackageInfoPresenter( userPackageManager.setApplicationEnabledSetting( packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, 0 ) - notifyChange() + reloadPackageInfo() } } @@ -124,7 +120,7 @@ class PackageInfoPresenter( logAction(SettingsEnums.ACTION_SETTINGS_CLEAR_INSTANT_APP) coroutineScope.launch(Dispatchers.IO) { userPackageManager.deletePackageAsUser(packageName, null, 0, userId) - notifyChange() + reloadPackageInfo() } } @@ -134,7 +130,7 @@ class PackageInfoPresenter( coroutineScope.launch(Dispatchers.Default) { Log.d(TAG, "Stopping package $packageName") context.activityManager.forceStopPackageAsUser(packageName, userId) - notifyChange() + reloadPackageInfo() } }