Merge "No show AppButtons for system modules"
This commit is contained in:
@@ -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 ->
|
||||
|
@@ -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)
|
||||
}
|
||||
|
||||
|
@@ -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()
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user