package com.vgmlr.shim
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import java.io.File
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
@Composable
fun DataDialog(shims: List<ShimClass>, onDismiss: () -> Unit) {
val context = LocalContext.current
val totalShimText = remember(shims) { shims.size.toString() }
val allTags = remember(shims) {
shims.flatMap { it.shimhash.split(" ").filter { tag -> tag.isNotBlank() } }
}
val uniqueTagsCount = remember(allTags) { allTags.distinct().size.toString() }
val lastModified = remember(shims) {
if (shims.isNotEmpty()) OTCClock.getCurrentOTCTime() else "none"
}
val lastBackup = remember {
val backupDir = context.getExternalFilesDir(null)?.let { File(it, "backups") }
val backupFile = backupDir?.let { File(it, "shim_backup.db") }
if (backupFile?.exists() == true) {
OTCClock.getOTCTime(LocalDateTime.ofInstant(Instant.ofEpochMilli(backupFile.lastModified()), ZoneId.systemDefault()))
} else "none"
}
Dialog(
properties = DialogProperties(usePlatformDefaultWidth = false),
onDismissRequest = onDismiss
) {
Surface(
modifier = Modifier.fillMaxWidth(),
color = colorResource(id = R.color.dialog_bg_color)
) {
Column(
modifier = Modifier.fillMaxWidth().padding(horizontal = 10.dp, vertical = 32.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Row {
Column(horizontalAlignment = Alignment.End) {
Text("Shims", color = colorResource(id = R.color.dialog_color), fontSize = 14.sp)
Text("Unique Tags", color = colorResource(id = R.color.dialog_color), fontSize = 14.sp)
Text("Modified", color = colorResource(id = R.color.dialog_color), fontSize = 14.sp)
Text("Archived", color = colorResource(id = R.color.dialog_color), fontSize = 14.sp)
}
Spacer(Modifier.width(16.dp))
Column {
Text(totalShimText, color = colorResource(id = R.color.dialog_color), fontSize = 13.sp, fontFamily = FontFamily.Monospace)
Text(uniqueTagsCount, color = colorResource(id = R.color.dialog_color), fontSize = 13.sp, fontFamily = FontFamily.Monospace)
Text(lastModified, color = colorResource(id = R.color.dialog_color), fontSize = 13.sp, fontFamily = FontFamily.Monospace)
Text(lastBackup, color = colorResource(id = R.color.dialog_color), fontSize = 13.sp, fontFamily = FontFamily.Monospace)
}
}
}
}
}
}
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun TagsDialog(shims: List<ShimClass>, onDismiss: () -> Unit, onTagClick: (String) -> Unit) {
val tagCounts = remember(shims) {
shims.flatMap { shim -> shim.shimhash.split(" ").filter { it.isNotBlank() } }
.groupingBy { it }
.eachCount()
.entries
.sortedByDescending { it.value }
.take(30)
.sortedBy { it.key }
}
if (tagCounts.isEmpty()) {
onDismiss()
return
}
val maxCount = tagCounts.maxOf { it.value }.toFloat()
val minCount = tagCounts.minOf { it.value }.toFloat()
Dialog(
properties = DialogProperties(usePlatformDefaultWidth = false),
onDismissRequest = onDismiss
) {
Surface(
modifier = Modifier.fillMaxWidth(),
color = colorResource(id = R.color.dialog_bg_color)
) {
Column(
modifier = Modifier.fillMaxWidth().padding(horizontal = 24.dp, vertical = 32.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
FlowRow(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) {
tagCounts.forEach { entry ->
val size = if (maxCount == minCount) 14.sp else (14 + (entry.value - minCount) / (maxCount - minCount) * 5).sp
Text(
text = entry.key,
color = colorResource(id = R.color.dialog_color),
fontSize = size,
modifier = Modifier.padding(horizontal = 6.dp, vertical = 4.dp).clickable { onTagClick(entry.key); onDismiss() }
)
}
}
}
}
}
}
@Composable
fun VersionDialog(onDismiss: () -> Unit) {
val uriHandler = LocalUriHandler.current
Dialog(
properties = DialogProperties(usePlatformDefaultWidth = false),
onDismissRequest = onDismiss
) {
Surface(
modifier = Modifier.fillMaxWidth(),
color = colorResource(id = R.color.dialog_bg_color)
) {
Column(
modifier = Modifier.fillMaxWidth().padding(horizontal = 10.dp, vertical = 26.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("com.vgmlr.shim", color = colorResource(id = R.color.dialog_color), fontSize = 14.sp)
Text("63.026.1", color = colorResource(id = R.color.dialog_color), fontSize = 14.sp)
Text(
"vgmlr.com/mlwrk",
color = colorResource(id = R.color.dialog_color),
fontSize = 14.sp,
modifier = Modifier.clickable { uriHandler.openUri("https://vgmlr.com/mlwrk") }
)
}
}
}
}