diff options
author | Allan Wang <me@allanwang.ca> | 2021-01-10 22:29:01 -0800 |
---|---|---|
committer | Allan Wang <me@allanwang.ca> | 2021-01-10 22:29:01 -0800 |
commit | fd2cbf25f5744a939ef6245809a1655e013a6420 (patch) | |
tree | dc499bb99d7ae6b4f9efdd3c44d9f2066f23ad78 /app/src/main/kotlin/com/pitchedapps/frost/injectors | |
parent | b01d23bdaa03b7feb23c17d2af63926b1f5bb592 (diff) | |
download | frost-fd2cbf25f5744a939ef6245809a1655e013a6420.tar.gz frost-fd2cbf25f5744a939ef6245809a1655e013a6420.tar.bz2 frost-fd2cbf25f5744a939ef6245809a1655e013a6420.zip |
Start converting pref colors into themeProvider colors
Diffstat (limited to 'app/src/main/kotlin/com/pitchedapps/frost/injectors')
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAsset.kt (renamed from app/src/main/kotlin/com/pitchedapps/frost/injectors/CssSmallAssets.kt) | 2 | ||||
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/injectors/ThemeProvider.kt (renamed from app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt) | 99 |
2 files changed, 66 insertions, 35 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssSmallAssets.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAsset.kt index 30ee7a8f..b384efad 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssSmallAssets.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAsset.kt @@ -22,7 +22,7 @@ import com.pitchedapps.frost.prefs.Prefs /** * Small misc inline css assets */ -enum class CssSmallAssets(private val content: String) : InjectorContract { +enum class CssAsset(private val content: String) : InjectorContract { FullSizeImage("div._4prr[style*=\"max-width\"][style*=\"max-height\"]{max-width:none !important;max-height:none !important}") ; diff --git a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt b/app/src/main/kotlin/com/pitchedapps/frost/injectors/ThemeProvider.kt index e012de3f..5a9576d2 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/injectors/CssAssets.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/injectors/ThemeProvider.kt @@ -18,53 +18,82 @@ package com.pitchedapps.frost.injectors import android.content.Context import android.graphics.Color -import android.webkit.WebView -import androidx.annotation.VisibleForTesting import ca.allanwang.kau.utils.adjustAlpha import ca.allanwang.kau.utils.colorToBackground import ca.allanwang.kau.utils.colorToForeground +import ca.allanwang.kau.utils.isColorVisibleOn import ca.allanwang.kau.utils.toRgbaString import ca.allanwang.kau.utils.use import ca.allanwang.kau.utils.withAlpha +import com.pitchedapps.frost.enums.FACEBOOK_BLUE +import com.pitchedapps.frost.enums.Theme +import com.pitchedapps.frost.enums.ThemeCategory import com.pitchedapps.frost.prefs.Prefs import com.pitchedapps.frost.utils.L import java.io.BufferedReader import java.io.FileNotFoundException -import java.util.Locale import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -private const val THEME_FOLDER = "themes" - /** * Created by Allan Wang on 2017-05-31. * Mapping of the available assets * The enum name must match the css file name */ -enum class CssAssets(val folder: String = THEME_FOLDER) : InjectorContract { - MATERIAL_LIGHT, MATERIAL_DARK, MATERIAL_AMOLED, MATERIAL_GLASS, CUSTOM - ; +class ThemeProvider(private val context: Context, private val prefs: Prefs) { + + var theme: Theme = Theme.values[prefs.theme] + + private val injectors: MutableMap<ThemeCategory, InjectorContract> = mutableMapOf() + + val textColor: Int + get() = theme.textColorGetter(prefs) + + val accentColor: Int + get() = theme.accentColorGetter(prefs) + + val accentColorForWhite: Int + get() = when { + accentColor.isColorVisibleOn(Color.WHITE) -> accentColor + textColor.isColorVisibleOn(Color.WHITE) -> textColor + else -> FACEBOOK_BLUE + } + + val nativeBgColor: Int + get() = bgColor.withAlpha(30) + + fun nativeBgColor(unread: Boolean) = bgColor + .colorToForeground(if (unread) 0.7f else 0.0f) + .withAlpha(30) + + val bgColor: Int + get() = theme.backgroundColorGetter(prefs) - @VisibleForTesting - internal val file = "${name.toLowerCase(Locale.CANADA)}.css" + val headerColor: Int + get() = theme.headerColorGetter(prefs) + + val iconColor: Int + get() = theme.iconColorGetter(prefs) + + val isCustomTheme: Boolean + get() = theme == Theme.CUSTOM /** - * Note that while this can be loaded from any thread, it is typically done through [load] + * Note that while this can be loaded from any thread, it is typically done through [preload]] */ - private var injector: JsInjector? = null - - private fun injector(context: Context, prefs: Prefs): JsInjector = - injector ?: createInjector(context, prefs).also { injector = it } + fun injector(category: ThemeCategory): InjectorContract = + injectors.getOrPut(category) { createInjector(category) } /** - * Note that while this can be loaded from any thread, it is typically done through [load] + * Note that while this can be loaded from any thread, it is typically done through [preload] */ - private fun createInjector(context: Context, prefs: Prefs): JsInjector = + private fun createInjector(category: ThemeCategory): InjectorContract { + val file = theme.file ?: return JsActions.EMPTY try { var content = - context.assets.open("css/$folder/$file").bufferedReader() + context.assets.open("css/${category.folder}/theme/${file}").bufferedReader() .use(BufferedReader::readText) - if (this == CUSTOM) { + if (theme == Theme.CUSTOM) { val bt = if (Color.alpha(prefs.bgColor) == 255) prefs.bgColor.toRgbaString() else @@ -86,30 +115,32 @@ enum class CssAssets(val folder: String = THEME_FOLDER) : InjectorContract { .replace("\$TI\$", bb.withAlpha(60).toRgbaString()) .replace("\$C\$", bt) } - JsBuilder().css(content).build() + return JsBuilder().css(content).build() } catch (e: FileNotFoundException) { L.e(e) { "CssAssets file not found" } - JsInjector(JsActions.EMPTY.function) + return JsActions.EMPTY } + } - override fun inject(webView: WebView, prefs: Prefs) = - injector(webView.context, prefs).inject(webView, prefs) + fun setTheme(id: Int) { + theme = Theme.values[id] + reset() + } fun reset() { - injector = null + injectors.clear() } - companion object { + suspend fun preload() { + withContext(Dispatchers.IO) { + reset() + ThemeCategory.values().forEach { injector(it) } + } + } - // Ensures that all non themes and the selected theme are loaded - suspend fun load(context: Context, prefs: Prefs) { - withContext(Dispatchers.IO) { - val currentTheme = prefs.themeInjector as? CssAssets - val (themes, others) = values().partition { it.folder == THEME_FOLDER } - themes.filter { it != currentTheme }.forEach { it.reset() } - currentTheme?.injector(context, prefs) - others.forEach { it.injector(context, prefs) } - } + companion object { + fun module() = org.koin.dsl.module { + single { ThemeProvider(get(), get()) } } } }
\ No newline at end of file |