aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/injectors
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2021-01-10 22:29:01 -0800
committerAllan Wang <me@allanwang.ca>2021-01-10 22:29:01 -0800
commitfd2cbf25f5744a939ef6245809a1655e013a6420 (patch)
treedc499bb99d7ae6b4f9efdd3c44d9f2066f23ad78 /app/src/main/kotlin/com/pitchedapps/frost/injectors
parentb01d23bdaa03b7feb23c17d2af63926b1f5bb592 (diff)
downloadfrost-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