Pith - shim
shim/app/src/main/kotlin/com/vgmlr/shim/ShimTheme.kt [3.9 kb]
Modified: 22:39:16 117 026 (14 Jul 026)
11 Days Ago
package com.vgmlr.shim

import android.content.Context
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Typography
import androidx.compose.material3.darkColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.mutableFloatStateOf
import androidx.core.graphics.toColorInt
import androidx.compose.ui.graphics.Color
import androidx.core.content.edit

@Composable
fun ShimTheme(
    themeManager: ShimThemeManager,
    content: @Composable () -> Unit
) {
    val colorScheme = darkColorScheme(
        primary = Color(0xFF486860),
        background = themeManager.backgroundColor.value,
        onBackground = themeManager.textColor.value,
        surface = themeManager.backgroundColor.value,
        onSurface = themeManager.textColor.value
    )

    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography(),
        content = content
    )
}

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 {
            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)
        }
        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
    }
}
Updates
Wedge - Android 126.026
Wedge - Linux 124.026
Shim - Android 117.026
Miter - 114.026
Kerf - Android 112.026
Dev
TVShow (227) 'CSA'
TVShow (228) 'APT'
TVProgram (83) 'BXT'
Miter Update(s)
Peen (Messaging)

Menu
Calendar
Project Tin (024/029)
Miter
RSS Feed
User Avatar
@vgmlr
=SUM(parts)