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
}
}