package ru.officialdakari.fmd.dialogs import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageInfo import android.content.pm.PackageManager import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.Checkbox import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.KeyboardType fun getInstalledApps(context: Context): List> { val packageManager: PackageManager = context.packageManager val packages: List = packageManager.getInstalledPackages(PackageManager.GET_META_DATA) val apps = mutableListOf>() for (packageInfo in packages) { if (packageInfo?.applicationInfo != null && (packageInfo?.applicationInfo?.flags!! and ApplicationInfo.FLAG_SYSTEM == 0)) { val appName = packageManager.getApplicationLabel(packageInfo.applicationInfo as ApplicationInfo).toString() val packageName = packageInfo.packageName apps.add(Pair(packageName, appName)) } } return apps } @Composable fun SelectAppsDialog( context: Context, initialState: List>, onDismissRequest: () -> Unit, onConfirm: (List>) -> Unit ) { val items = getInstalledApps(context) val state by remember { mutableStateOf(mutableListOf>()) } for (pkg in initialState) { state.add(Pair(pkg.first, true)) } for (pkg in items) { if (state.find({ it.first == pkg.first }) == null) state.add(Pair(pkg.first, false)) } AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = "Apps") }, text = { Column { Text(text = "Select apps") Spacer(modifier = Modifier.height(8.dp)) LazyColumn(modifier = Modifier.fillMaxSize().padding(16.dp)) { items(state.size) { index -> val currentItem = state[index] Row( modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp), horizontalArrangement = Arrangement.Start, verticalAlignment = Alignment.CenterVertically ) { Checkbox( checked = currentItem.second, onCheckedChange = { isChecked -> state[index] = currentItem.copy(second = isChecked) } ) Spacer(modifier = Modifier.width(8.dp)) Text(text = items.find({ currentItem.first == it.first })!!.second) } } } } }, confirmButton = { Button( onClick = { onConfirm(state.toList()) onDismissRequest() } ) { Text("Save") } }, dismissButton = { Button(onClick = onDismissRequest) { Text("Cancel") } } ) }