package com.android.settings.spa.app.appinfo import android.content.pm.ApplicationInfo import android.content.pm.GosPackageState import android.content.pm.GosPackageStateFlag import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import com.android.settings.R import com.android.settings.applications.AswExploitProtectionFragment import com.android.settingslib.spa.widget.preference.SwitchPreference import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel import com.android.settingslib.spaprivileged.model.app.installed import com.android.settingslib.spaprivileged.model.app.userId @Composable fun AppExploitProtectionCompatModeSwitchPreference(app: ApplicationInfo, packageInfoPresenter: PackageInfoPresenter) { if (app.isSystemApp || !app.installed) { return } val context = LocalContext.current val pkgName = app.packageName val userId = app.userId val psFlag = GosPackageStateFlag.ENABLE_EXPLOIT_PROTECTION_COMPAT_MODE SwitchPreference(object : SwitchPreferenceModel { override val title = stringResource(R.string.aep_compat_mode_title) override val summary = { context.getString(R.string.aep_compat_mode_summary) } override val checked = { GosPackageState.get(pkgName, userId).hasFlag(psFlag) } override val onCheckedChange = { newChecked: Boolean -> val action = Runnable { GosPackageState.edit(pkgName, userId).run { setFlagState(psFlag, newChecked) killUidAfterApply() if (apply()) { // needed to recompose other exploit protection settings check(packageInfoPresenter.manualRefreshFlow.tryEmit(Any())) } } } if (newChecked) { val d = AswExploitProtectionFragment.getExploitProtectionWarningOnDisable(context, action) d.show() } else { action.run() } Unit } }) }