shim/app/src/main/kotlin/com/vgmlr/shim/ShimThemeManager.kt (3.2 kb)
Modified: 02:29:14 66 026 (20 May 026) - 4 Days Ago
Download
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
    }
}