113 lines
4.3 KiB
Kotlin
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")
|
|
}
|
|
}
|
|
)
|
|
}
|