Skip to content

Commit

Permalink
perf: caching used fonts
Browse files Browse the repository at this point in the history
  • Loading branch information
nopdan authored and WhiredPlanck committed Feb 9, 2024
1 parent a8ae212 commit 7c04d6a
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 19 deletions.
63 changes: 47 additions & 16 deletions app/src/main/java/com/osfans/trime/data/theme/FontManager.kt
Expand Up @@ -10,13 +10,26 @@ import timber.log.Timber
import java.io.File

object FontManager {
private val fontDir = File(DataManager.userDataDir, "fonts")
private val theme get() = ThemeManager.activeTheme
val hanBFont: Typeface get() = getTypefaceOrNull("hanb_font") ?: Typeface.DEFAULT
val latinFont: Typeface get() = getTypefaceOrNull("latin_font") ?: Typeface.DEFAULT
private val fontDir get() = File(DataManager.userDataDir, "fonts")
var hanBFont: Typeface = getTypefaceOrDefault("hanb_font")
private set
var latinFont: Typeface = getTypefaceOrDefault("latin_font")
private set
private val typefaceCache = mutableMapOf<String, Typeface>()

fun reload() {
typefaceCache.clear()
fontFamiliyCache.clear()
hanBFont = getTypefaceOrDefault("hanb_font")
latinFont = getTypefaceOrDefault("latin_font")
}

@JvmStatic
fun getTypeface(key: String): Typeface {
if (typefaceCache.containsKey(key)) {
return typefaceCache[key]!!
}
Timber.d("getTypeface() key=%s", key)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val fontFamilies = mutableListOf<FontFamily>()
getFontFamilies(key).let {
Expand All @@ -25,9 +38,15 @@ object FontManager {
fontFamilies.addAll(it)
fontFamilies.addAll(getFontFamilies("hanb_font"))
}
return buildTypeface(fontFamilies)
buildTypeface(fontFamilies).let {
typefaceCache[key] = it
return@getTypeface it
}
}
getTypefaceOrDefault(key).let {
typefaceCache[key] = it
return@getTypeface it
}
return getTypefaceOrNull(key) ?: Typeface.DEFAULT
}

@RequiresApi(Build.VERSION_CODES.Q)
Expand All @@ -40,8 +59,8 @@ object FontManager {
return builder.setSystemFallback("sans-serif").build()
}

private fun getTypefaceOrNull(key: String): Typeface? {
val fonts = theme.style.getObject(key)
private fun getTypefaceOrDefault(key: String): Typeface {
val fonts = ThemeManager.activeTheme.style.getObject(key)

fun handler(fontName: String): Typeface? {
val fontFile = File(fontDir, fontName)
Expand All @@ -52,29 +71,41 @@ object FontManager {
return null
}

if (fonts is String) return handler(fonts)
if (fonts is String) return handler(fonts) ?: Typeface.DEFAULT
if (fonts is List<*>) {
for (font in fonts as List<String>) {
handler(font).let {
if (it != null) return it
}
}
}
return Typeface.DEFAULT
}

private val fontFamiliyCache = mutableMapOf<String, FontFamily>()

@RequiresApi(Build.VERSION_CODES.Q)
private fun getFontFamily(fontName: String): FontFamily? {
if (fontFamiliyCache.containsKey(fontName)) {
return fontFamiliyCache[fontName]!!
}
val fontFile = File(fontDir, fontName)
if (fontFile.exists()) {
return FontFamily.Builder(Font.Builder(fontFile).build()).build()
}
Timber.w("font %s not found", fontFile)
return null
}

@RequiresApi(Build.VERSION_CODES.Q)
fun getFontFamilies(key: String): List<FontFamily> {
val fonts = theme.style.getObject(key)
private fun getFontFamilies(key: String): List<FontFamily> {
val fonts = ThemeManager.activeTheme.style.getObject(key)
val fontFamilies = mutableListOf<FontFamily>()

fun handler(fontName: String) {
val fontFile = File(fontDir, fontName)
if (fontFile.exists()) {
fontFamilies.add(FontFamily.Builder(Font.Builder(fontFile).build()).build())
return
getFontFamily(fontName)?.let {
fontFamilies.add(it)
}
Timber.w("font %s not found", fontFile)
}

if (fonts is String) handler(fonts)
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/java/com/osfans/trime/data/theme/ThemeManager.kt
Expand Up @@ -33,9 +33,9 @@ object ThemeManager {
?.toMutableList() ?: mutableListOf()
}

val sharedThemes: MutableList<String> = listThemes(DataManager.sharedDataDir)
private val sharedThemes: MutableList<String> = listThemes(DataManager.sharedDataDir)

val userThemes: MutableList<String> = listThemes(DataManager.userDataDir)
private val userThemes: MutableList<String> = listThemes(DataManager.userDataDir)

@JvmStatic
fun getAllThemes(): List<String> {
Expand All @@ -45,7 +45,7 @@ object ThemeManager {
return sharedThemes + userThemes
}

fun refreshThemes() {
private fun refreshThemes() {
sharedThemes.clear()
userThemes.clear()
sharedThemes.addAll(listThemes(DataManager.sharedDataDir))
Expand All @@ -61,6 +61,7 @@ object ThemeManager {
if (_activeTheme == value) return
_activeTheme = value
fireChange()
FontManager.reload()
}

private var isNightMode = false
Expand Down

0 comments on commit 7c04d6a

Please sign in to comment.