Fix app group bugs (#195)

This commit is contained in:
BinTianqi
2025-11-20 12:58:01 +08:00
parent 1dab0a08d2
commit aa022aaee5
2 changed files with 17 additions and 14 deletions

View File

@@ -249,7 +249,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
val ucdPackages = MutableStateFlow(emptyList<AppInfo>()) val ucdPackages = MutableStateFlow(emptyList<AppInfo>())
@RequiresApi(30) @RequiresApi(30)
fun getUcdPackages() { fun getUcdPackages() {
ucdPackages.value = DPM.getUserControlDisabledPackages(DAR).map { ucdPackages.value = DPM.getUserControlDisabledPackages(DAR).distinct().map {
getAppInfo(it) getAppInfo(it)
} }
} }
@@ -284,7 +284,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
val mddPackages = MutableStateFlow(emptyList<AppInfo>()) val mddPackages = MutableStateFlow(emptyList<AppInfo>())
@RequiresApi(28) @RequiresApi(28)
fun getMddPackages() { fun getMddPackages() {
mddPackages.value = DPM.getMeteredDataDisabledPackages(DAR).map { getAppInfo(it) } mddPackages.value = DPM.getMeteredDataDisabledPackages(DAR).distinct().map { getAppInfo(it) }
} }
@RequiresApi(28) @RequiresApi(28)
fun setPackageMdd(name: String, status: Boolean): Boolean { fun setPackageMdd(name: String, status: Boolean): Boolean {
@@ -299,7 +299,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
val kuPackages = MutableStateFlow(emptyList<AppInfo>()) val kuPackages = MutableStateFlow(emptyList<AppInfo>())
@RequiresApi(28) @RequiresApi(28)
fun getKuPackages() { fun getKuPackages() {
kuPackages.value = DPM.getKeepUninstalledPackages(DAR)?.map { getAppInfo(it) } ?: emptyList() kuPackages.value = DPM.getKeepUninstalledPackages(DAR)?.distinct()?.map { getAppInfo(it) } ?: emptyList()
} }
@RequiresApi(28) @RequiresApi(28)
fun setPackageKu(name: String, status: Boolean) { fun setPackageKu(name: String, status: Boolean) {
@@ -327,7 +327,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
// Cross-profile widget providers // Cross-profile widget providers
val cpwProviders = MutableStateFlow(emptyList<AppInfo>()) val cpwProviders = MutableStateFlow(emptyList<AppInfo>())
fun getCpwProviders() { fun getCpwProviders() {
cpwProviders.value = DPM.getCrossProfileWidgetProviders(DAR).map { getAppInfo(it) } cpwProviders.value = DPM.getCrossProfileWidgetProviders(DAR).distinct().map { getAppInfo(it) }
} }
fun setCpwProvider(name: String, status: Boolean): Boolean { fun setCpwProvider(name: String, status: Boolean): Boolean {
val result = if (status) { val result = if (status) {
@@ -388,7 +388,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
@RequiresApi(34) @RequiresApi(34)
fun getCmPolicy(): Int { fun getCmPolicy(): Int {
return DPM.credentialManagerPolicy?.let { policy -> return DPM.credentialManagerPolicy?.let { policy ->
cmPackages.value = policy.packageNames.map { getAppInfo(it) } cmPackages.value = policy.packageNames.distinct().map { getAppInfo(it) }
policy.policyType policy.policyType
} ?: -1 } ?: -1
} }
@@ -409,7 +409,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
val pimPackages = MutableStateFlow(emptyList<AppInfo>()) val pimPackages = MutableStateFlow(emptyList<AppInfo>())
fun getPimPackages(): Boolean { fun getPimPackages(): Boolean {
return DPM.getPermittedInputMethods(DAR).let { packages -> return DPM.getPermittedInputMethods(DAR).let { packages ->
pimPackages.value = packages?.map { getAppInfo(it) } ?: emptyList() pimPackages.value = packages?.distinct()?.map { getAppInfo(it) } ?: emptyList()
packages == null packages == null
} }
} }
@@ -429,7 +429,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
val pasPackages = MutableStateFlow(emptyList<AppInfo>()) val pasPackages = MutableStateFlow(emptyList<AppInfo>())
fun getPasPackages(): Boolean { fun getPasPackages(): Boolean {
return DPM.getPermittedAccessibilityServices(DAR).let { packages -> return DPM.getPermittedAccessibilityServices(DAR).let { packages ->
pasPackages.value = packages?.map { getAppInfo(it) } ?: emptyList() pasPackages.value = packages?.distinct()?.map { getAppInfo(it) } ?: emptyList()
packages == null packages == null
} }
} }

View File

@@ -763,6 +763,7 @@ fun PackageFunctionScreen(
val groups by appGroups.collectAsStateWithLifecycle() val groups by appGroups.collectAsStateWithLifecycle()
val packages by packagesState.collectAsStateWithLifecycle() val packages by packagesState.collectAsStateWithLifecycle()
var packageName by rememberSaveable { mutableStateOf("") } var packageName by rememberSaveable { mutableStateOf("") }
var dialog by remember { mutableStateOf(false) }
var selectedGroup by remember { mutableStateOf<AppGroup?>(null) } var selectedGroup by remember { mutableStateOf<AppGroup?>(null) }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
onGet() onGet()
@@ -787,6 +788,7 @@ fun PackageFunctionScreen(
{ Text("(${it.apps.size}) ${it.name}") }, { Text("(${it.apps.size}) ${it.name}") },
{ {
selectedGroup = it selectedGroup = it
dialog = true
expand = false expand = false
} }
) )
@@ -821,7 +823,8 @@ fun PackageFunctionScreen(
} }
}, },
Modifier.fillMaxWidth().padding(horizontal = HorizontalPadding).padding(bottom = 10.dp), Modifier.fillMaxWidth().padding(horizontal = HorizontalPadding).padding(bottom = 10.dp),
packageName.isValidPackageName packageName.isValidPackageName &&
packages.find { it.name == packageName } == null
) { ) {
Text(stringResource(R.string.add)) Text(stringResource(R.string.add))
} }
@@ -830,14 +833,14 @@ fun PackageFunctionScreen(
} }
} }
} }
if (selectedGroup != null) AlertDialog( if (dialog) AlertDialog(
text = { text = {
Column { Column {
Button({ Button({
selectedGroup!!.apps.forEach { selectedGroup!!.apps.forEach {
onSet(it, true) onSet(it, true)
} }
selectedGroup = null dialog = false
}) { }) {
Text(stringResource(R.string.add_to_list)) Text(stringResource(R.string.add_to_list))
} }
@@ -845,18 +848,18 @@ fun PackageFunctionScreen(
selectedGroup!!.apps.forEach { selectedGroup!!.apps.forEach {
onSet(it, false) onSet(it, false)
} }
selectedGroup = null dialog = false
}) { }) {
Text(stringResource(R.string.remove_from_list)) Text(stringResource(R.string.remove_from_list))
} }
} }
}, },
confirmButton = { confirmButton = {
TextButton({ selectedGroup = null }) { TextButton({ dialog = false }) {
Text(stringResource(R.string.cancel)) Text(stringResource(R.string.cancel))
} }
}, },
onDismissRequest = { selectedGroup = null } onDismissRequest = { dialog = false }
) )
} }
@@ -969,7 +972,7 @@ fun EditAppGroupScreen(
packageName = "" packageName = ""
}, },
Modifier.fillMaxWidth().padding(horizontal = HorizontalPadding).padding(bottom = 10.dp), Modifier.fillMaxWidth().padding(horizontal = HorizontalPadding).padding(bottom = 10.dp),
packageName.isValidPackageName packageName.isValidPackageName && packageName !in list
) { ) {
Text(stringResource(R.string.add)) Text(stringResource(R.string.add))
} }