package com.vgmlr.shim import android.content.Context import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableFloatStateOf import androidx.core.graphics.toColorInt import androidx.compose.ui.graphics.Color class ShimThemeManager(private val context: Context) { private val prefs = context.getSharedPreferences("shim_prefs", Context.MODE_PRIVATE) var backgroundColor = mutableStateOf(Color(context.getColor(R.color.background_color))) var textColor = mutableStateOf(Color(context.getColor(R.color.text_color))) var hashtagColor = mutableStateOf(Color(context.getColor(R.color.hash_color))) var fontSize = mutableFloatStateOf(15.5f) var isMonospace = mutableStateOf(false) var lineHeight = mutableFloatStateOf(1.35f) var lineSpacing = mutableFloatStateOf(0.2f) var hexBgColor = "#%06X".format(0xFFFFFF and context.getColor(R.color.background_color)) var hexTextColor = "#%06X".format(0xFFFFFF and context.getColor(R.color.text_color)) var hexHashColor = "#%06X".format(0xFFFFFF and context.getColor(R.color.hash_color)) init { refresh() } private fun getSafeString(key: String, default: String): String = prefs.getString(key, default) ?: default private fun formatHex(hex: String): String = if (hex.startsWith("#")) hex else "#$hex" private fun formatNum(num: String): String = num.replace(Regex("[^0-9.]"), "") fun saveTheme(bg: String, text: String, hash: String, mono: Boolean, size: String, height: String, spacing: String) { prefs.edit().apply { putString("main_background", formatHex(bg)) putString("main_color", formatHex(text)) putString("hashtag_color", formatHex(hash)) putBoolean("is_monospace", mono) putString("main_size", formatNum(size)) putString("line_height", height) putString("line_spacing", spacing) apply() } refresh() } fun refresh() { val defaultBg = "#%06X".format(0xFFFFFF and context.getColor(R.color.background_color)) val defaultText = "#%06X".format(0xFFFFFF and context.getColor(R.color.text_color)) val defaultHash = "#%06X".format(0xFFFFFF and context.getColor(R.color.hash_color)) hexBgColor = getSafeString("main_background", defaultBg) hexTextColor = getSafeString("main_color", defaultText) hexHashColor = getSafeString("hashtag_color", defaultHash) backgroundColor.value = try { Color(hexBgColor.toColorInt()) } catch (_: Exception) { Color(context.getColor(R.color.background_color)) } textColor.value = try { Color(hexTextColor.toColorInt()) } catch (_: Exception) { Color(context.getColor(R.color.text_color)) } hashtagColor.value = try { Color(hexHashColor.toColorInt()) } catch (_: Exception) { Color(context.getColor(R.color.hash_color)) } isMonospace.value = prefs.getBoolean("is_monospace", false) fontSize.floatValue = getSafeString("main_size", "15.5").toFloatOrNull() ?: 15.5f lineHeight.floatValue = getSafeString("line_height", "1.35").toFloatOrNull() ?: 1.35f lineSpacing.floatValue = getSafeString("line_spacing", "0.2").toFloatOrNull() ?: 0.2f } }