FindMyAndroid/app/src/main/java/ru/officialdakari/fmd/dialogs/SelectAppsDialog.kt

113 lines
4.3 KiB
Kotlin

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<Pair<String, String>> {
val packageManager: PackageManager = context.packageManager
val packages: List<PackageInfo> = packageManager.getInstalledPackages(PackageManager.GET_META_DATA)
val apps = mutableListOf<Pair<String, String>>()
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<Pair<String, Boolean>>,
onDismissRequest: () -> Unit,
onConfirm: (List<Pair<String, Boolean>>) -> Unit
) {
val items = getInstalledApps(context)
val state by remember { mutableStateOf(mutableListOf<Pair<String, Boolean>>()) }
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")
}
}
)
}