Merge "No show AppButtons for system modules"

This commit is contained in:
Chaohui Wang
2022-10-31 05:08:02 +00:00
committed by Android (Google) Code Review
5 changed files with 165 additions and 10 deletions

View File

@@ -20,18 +20,25 @@ import android.content.pm.PackageInfo
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember
import com.android.settingslib.applications.AppUtils
import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
import com.android.settingslib.spa.widget.button.ActionButton
import com.android.settingslib.spa.widget.button.ActionButtons
import com.android.settingslib.spaprivileged.model.app.isSystemModule
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
@Composable
fun AppButtons(packageInfoPresenter: PackageInfoPresenter) {
val appButtonsHolder = remember { AppButtonsHolder(packageInfoPresenter) }
appButtonsHolder.Dialogs()
ActionButtons(actionButtons = appButtonsHolder.rememberActionsButtons().value)
val presenter = remember { AppButtonsPresenter(packageInfoPresenter) }
if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return
presenter.Dialogs()
ActionButtons(actionButtons = presenter.rememberActionsButtons().value)
}
private class AppButtonsHolder(private val packageInfoPresenter: PackageInfoPresenter) {
private class AppButtonsPresenter(private val packageInfoPresenter: PackageInfoPresenter) {
private val appLaunchButton = AppLaunchButton(packageInfoPresenter)
private val appInstallButton = AppInstallButton(packageInfoPresenter)
private val appDisableButton = AppDisableButton(packageInfoPresenter)
@@ -39,6 +46,15 @@ private class AppButtonsHolder(private val packageInfoPresenter: PackageInfoPres
private val appClearButton = AppClearButton(packageInfoPresenter)
private val appForceStopButton = AppForceStopButton(packageInfoPresenter)
val isAvailableFlow = flow { emit(isAvailable()) }
private suspend fun isAvailable(): Boolean = withContext(Dispatchers.IO) {
!packageInfoPresenter.userPackageManager.isSystemModule(packageInfoPresenter.packageName) &&
!AppUtils.isMainlineModule(
packageInfoPresenter.userPackageManager, packageInfoPresenter.packageName
)
}
@Composable
fun rememberActionsButtons() = remember {
packageInfoPresenter.flow.map { packageInfo ->

View File

@@ -27,10 +27,10 @@ import com.android.settingslib.spaprivileged.model.app.userHandle
class AppLaunchButton(packageInfoPresenter: PackageInfoPresenter) {
private val context = packageInfoPresenter.context
private val packageManagerAsUser = packageInfoPresenter.packageManagerAsUser
private val userPackageManager = packageInfoPresenter.userPackageManager
fun getActionButton(packageInfo: PackageInfo): ActionButton? =
packageManagerAsUser.getLaunchIntentForPackage(packageInfo.packageName)?.let { intent ->
userPackageManager.getLaunchIntentForPackage(packageInfo.packageName)?.let { intent ->
launchButton(intent, packageInfo.applicationInfo)
}

View File

@@ -51,7 +51,7 @@ class PackageInfoPresenter(
) {
private val metricsFeatureProvider = FeatureFactory.getFactory(context).metricsFeatureProvider
val userContext by lazy { context.asUser(UserHandle.of(userId)) }
val packageManagerAsUser: PackageManager by lazy { userContext.packageManager }
val userPackageManager: PackageManager by lazy { userContext.packageManager }
private val _flow: MutableStateFlow<PackageInfo?> = MutableStateFlow(null)
val flow: StateFlow<PackageInfo?> = _flow
@@ -92,7 +92,7 @@ class PackageInfoPresenter(
fun enable() {
logAction(SettingsEnums.ACTION_SETTINGS_ENABLE_APP)
coroutineScope.launch(Dispatchers.IO) {
packageManagerAsUser.setApplicationEnabledSetting(
userPackageManager.setApplicationEnabledSetting(
packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0
)
notifyChange()
@@ -103,7 +103,7 @@ class PackageInfoPresenter(
fun disable() {
logAction(SettingsEnums.ACTION_SETTINGS_DISABLE_APP)
coroutineScope.launch(Dispatchers.IO) {
packageManagerAsUser.setApplicationEnabledSetting(
userPackageManager.setApplicationEnabledSetting(
packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, 0
)
notifyChange()
@@ -124,7 +124,7 @@ class PackageInfoPresenter(
fun clearInstantApp() {
logAction(SettingsEnums.ACTION_SETTINGS_CLEAR_INSTANT_APP)
coroutineScope.launch(Dispatchers.IO) {
packageManagerAsUser.deletePackageAsUser(packageName, null, 0, userId)
userPackageManager.deletePackageAsUser(packageName, null, 0, userId)
notifyChange()
}
}