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, 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, 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") } ) } } } }