package com.vgmlr.shim import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.enableEdgeToEdge import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent import androidx.core.graphics.toColorInt import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.text.font.FontWeight import androidx.compose.foundation.border import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import kotlinx.coroutines.delay import kotlinx.coroutines.launch class ShimSettings : ComponentActivity() { private lateinit var themeManager: ShimThemeManager private val btnShape = RoundedCornerShape(7.dp) private val btnColors = @Composable { ButtonDefaults.buttonColors(containerColor = Color.Gray) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge(statusBarStyle = SystemBarStyle.dark(android.graphics.Color.TRANSPARENT)) themeManager = ShimThemeManager(this) setContent { ShimTheme(themeManager) { SettingsScreen() } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun SettingsScreen() { var bgColor by remember { mutableStateOf(themeManager.hexBgColor) } var textColor by remember { mutableStateOf(themeManager.hexTextColor) } var fontSize by remember { mutableStateOf(themeManager.fontSize.floatValue.toString()) } var isMonospace by remember { mutableStateOf(themeManager.isMonospace.value) } var hashColor by remember { mutableStateOf(themeManager.hexHashColor) } var lineHeight by remember { mutableStateOf(themeManager.lineHeight.floatValue.toString()) } var lineSpacing by remember { mutableStateOf(themeManager.lineSpacing.floatValue.toString()) } var saveText by remember { mutableStateOf("Save") } val scope = rememberCoroutineScope() Scaffold( topBar = { TopAppBar( title = { Text("Settings", fontSize = 18.sp, color = Color.White) }, navigationIcon = { IconButton(onClick = { finish() }) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back", tint = Color.White) } }, colors = TopAppBarDefaults.topAppBarColors(containerColor = Color(0xFF486860)) ) }, contentWindowInsets = WindowInsets(0, 0, 0, 0), containerColor = themeManager.backgroundColor.value ) { padding -> Column( modifier = Modifier .fillMaxSize() .padding(padding) .imePadding() .background(themeManager.backgroundColor.value) .padding(16.dp) .verticalScroll(rememberScrollState()) ) { SettingItem("Ground Color", bgColor, true) { bgColor = it } SettingItem("Font Color", textColor, true) { textColor = it } SettingItem("Hash Tag Color", hashColor, true) { hashColor = it } Spacer(modifier = Modifier.height(10.dp)) Row( modifier = Modifier.fillMaxWidth().padding(vertical = 1.dp), verticalAlignment = Alignment.CenterVertically ) { Switch( checked = isMonospace, onCheckedChange = { isMonospace = it }, colors = SwitchDefaults.colors( checkedThumbColor = Color.Gray, checkedTrackColor = Color.Transparent, checkedBorderColor = Color.Gray, uncheckedThumbColor = Color.Gray, uncheckedTrackColor = Color.Transparent, uncheckedBorderColor = Color.Gray.copy(alpha = 0.5f) ) ) Spacer(modifier = Modifier.width(12.dp)) Text("Monospace", color = themeManager.textColor.value.copy(alpha = 0.6f), fontSize = 17.sp) } SettingItem("Font Size", fontSize, false) { fontSize = it } SettingItem("Line Height", lineHeight, false) { lineHeight = it } SettingItem("Line Spacing", lineSpacing, false) { lineSpacing = it } Spacer(modifier = Modifier.height(24.dp)) Button( onClick = { themeManager.saveTheme( bgColor, textColor, hashColor, isMonospace, fontSize, lineHeight, lineSpacing ) scope.launch { saveText = "Saved" delay(2000) saveText = "Save" } }, modifier = Modifier.fillMaxWidth().height(48.dp), colors = btnColors(), shape = btnShape ) { Text( text = saveText, color = Color.Black, fontSize = 16.sp ) } } } } @Composable fun SettingItem(label: String, value: String, isColor: Boolean, onValueChange: (String) -> Unit) { val labelCol = themeManager.textColor.value.copy(alpha = 0.6f) val bCol = themeManager.textColor.value.copy(alpha = 0.2f) Column(modifier = Modifier.padding(bottom = 5.dp)) { Text(label, color = labelCol, fontSize = 12.sp, fontWeight = FontWeight.Bold, modifier = Modifier.padding(top = 8.dp, bottom = 2.dp)) Row(verticalAlignment = Alignment.CenterVertically) { if (isColor) { val previewColor = try { Color((if (value.startsWith("#")) value else "#$value").toColorInt()) } catch (_: Exception) { Color.Gray } Box( modifier = Modifier .size(56.dp) .background(previewColor, RoundedCornerShape(4.dp)) .border(1.dp, bCol, RoundedCornerShape(4.dp)) ) Spacer(Modifier.width(12.dp)) } OutlinedTextField( value = value, onValueChange = onValueChange, modifier = Modifier.weight(1f), colors = OutlinedTextFieldDefaults.colors( focusedTextColor = themeManager.textColor.value, unfocusedTextColor = themeManager.textColor.value, focusedBorderColor = themeManager.textColor.value.copy(alpha = 0.5f), unfocusedBorderColor = themeManager.textColor.value.copy(alpha = 0.2f), cursorColor = themeManager.textColor.value ), placeholder = { Text( when(label) { "Font Size" -> "15.5" "Line Height" -> "1.35" "Line Spacing" -> "0.2" else -> "#000000" }, color = labelCol ) }, singleLine = true, ) } } } }