Reload package info for each time enter App Info

So disable button and app settings preference status can be updated.

Bug: 236346018
Test: Manually with Settings
Change-Id: I4409cb25f9d959404653de665b55f65b3293c56b
This commit is contained in:
Chaohui Wang
2023-01-05 19:25:08 +08:00
parent d54c9cab7d
commit 7d7bcaf46f
4 changed files with 17 additions and 15 deletions

View File

@@ -18,8 +18,9 @@ package com.android.settings.spa.app.appinfo
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember 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.applications.AppUtils
import com.android.settingslib.spa.widget.button.ActionButton import com.android.settingslib.spa.widget.button.ActionButton
import com.android.settingslib.spa.widget.button.ActionButtons 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 appClearButton = AppClearButton(packageInfoPresenter)
private val appForceStopButton = AppForceStopButton(packageInfoPresenter) private val appForceStopButton = AppForceStopButton(packageInfoPresenter)
@OptIn(ExperimentalLifecycleComposeApi::class)
@Composable @Composable
fun rememberActionsButtons() = remember { fun rememberActionsButtons() = remember {
packageInfoPresenter.flow.map { packageInfo -> packageInfoPresenter.flow.map { packageInfo ->
if (packageInfo != null) getActionButtons(packageInfo.applicationInfo) else emptyList() if (packageInfo != null) getActionButtons(packageInfo.applicationInfo) else emptyList()
} }
}.collectAsState(initial = emptyList()) }.collectAsStateWithLifecycle(initialValue = emptyList())
private fun getActionButtons(app: ApplicationInfo): List<ActionButton> = listOfNotNull( private fun getActionButtons(app: ApplicationInfo): List<ActionButton> = listOfNotNull(
appLaunchButton.getActionButton(app), appLaunchButton.getActionButton(app),

View File

@@ -20,11 +20,12 @@ import android.app.settings.SettingsEnums
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.os.Bundle import android.os.Bundle
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
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.navigation.NavType import androidx.navigation.NavType
import androidx.navigation.navArgument import androidx.navigation.navArgument
import com.android.settings.R 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.ModifySystemSettingsAppListProvider
import com.android.settings.spa.app.specialaccess.PictureInPictureListProvider import com.android.settings.spa.app.specialaccess.PictureInPictureListProvider
import com.android.settingslib.spa.framework.common.SettingsPageProvider 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.framework.compose.navigator
import com.android.settingslib.spa.widget.scaffold.RegularScaffold import com.android.settingslib.spa.widget.scaffold.RegularScaffold
import com.android.settingslib.spa.widget.ui.Category 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" fun getRoute(packageName: String, userId: Int): String = "$name/$packageName/$userId"
} }
@OptIn(ExperimentalLifecycleComposeApi::class)
@Composable @Composable
private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) { 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 val app = packageInfo.applicationInfo
RegularScaffold( RegularScaffold(
title = stringResource(R.string.application_info_label), title = stringResource(R.string.application_info_label),

View File

@@ -49,7 +49,7 @@ import kotlinx.coroutines.plus
fun AppSettingsPreference(app: ApplicationInfo) { fun AppSettingsPreference(app: ApplicationInfo) {
val context = LocalContext.current val context = LocalContext.current
val coroutineScope = rememberCoroutineScope() 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 if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return
Preference(object : PreferenceModel { Preference(object : PreferenceModel {

View File

@@ -59,11 +59,7 @@ class PackageInfoPresenter(
val flow: StateFlow<PackageInfo?> = _flow val flow: StateFlow<PackageInfo?> = _flow
init { fun reloadPackageInfo() {
notifyChange()
}
private fun notifyChange() {
coroutineScope.launch(Dispatchers.IO) { coroutineScope.launch(Dispatchers.IO) {
_flow.value = getPackageInfo() _flow.value = getPackageInfo()
} }
@@ -83,7 +79,7 @@ class PackageInfoPresenter(
val packageInfo = flow.value val packageInfo = flow.value
if (packageInfo != null && packageInfo.applicationInfo.isSystemApp) { if (packageInfo != null && packageInfo.applicationInfo.isSystemApp) {
// System app still exists after uninstalling the updates, refresh the page. // System app still exists after uninstalling the updates, refresh the page.
notifyChange() reloadPackageInfo()
} else { } else {
navController.navigateBack() navController.navigateBack()
} }
@@ -98,7 +94,7 @@ class PackageInfoPresenter(
userPackageManager.setApplicationEnabledSetting( userPackageManager.setApplicationEnabledSetting(
packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0
) )
notifyChange() reloadPackageInfo()
} }
} }
@@ -109,7 +105,7 @@ class PackageInfoPresenter(
userPackageManager.setApplicationEnabledSetting( userPackageManager.setApplicationEnabledSetting(
packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, 0 packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, 0
) )
notifyChange() reloadPackageInfo()
} }
} }
@@ -124,7 +120,7 @@ class PackageInfoPresenter(
logAction(SettingsEnums.ACTION_SETTINGS_CLEAR_INSTANT_APP) logAction(SettingsEnums.ACTION_SETTINGS_CLEAR_INSTANT_APP)
coroutineScope.launch(Dispatchers.IO) { coroutineScope.launch(Dispatchers.IO) {
userPackageManager.deletePackageAsUser(packageName, null, 0, userId) userPackageManager.deletePackageAsUser(packageName, null, 0, userId)
notifyChange() reloadPackageInfo()
} }
} }
@@ -134,7 +130,7 @@ class PackageInfoPresenter(
coroutineScope.launch(Dispatchers.Default) { coroutineScope.launch(Dispatchers.Default) {
Log.d(TAG, "Stopping package $packageName") Log.d(TAG, "Stopping package $packageName")
context.activityManager.forceStopPackageAsUser(packageName, userId) context.activityManager.forceStopPackageAsUser(packageName, userId)
notifyChange() reloadPackageInfo()
} }
} }