Skip to content

Commit 7c04d6a

Browse files
nopdanWhiredPlanck
authored andcommitted
perf: caching used fonts
1 parent a8ae212 commit 7c04d6a

File tree

2 files changed

+51
-19
lines changed

2 files changed

+51
-19
lines changed

app/src/main/java/com/osfans/trime/data/theme/FontManager.kt

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,26 @@ import timber.log.Timber
1010
import java.io.File
1111

1212
object FontManager {
13-
private val fontDir = File(DataManager.userDataDir, "fonts")
14-
private val theme get() = ThemeManager.activeTheme
15-
val hanBFont: Typeface get() = getTypefaceOrNull("hanb_font") ?: Typeface.DEFAULT
16-
val latinFont: Typeface get() = getTypefaceOrNull("latin_font") ?: Typeface.DEFAULT
13+
private val fontDir get() = File(DataManager.userDataDir, "fonts")
14+
var hanBFont: Typeface = getTypefaceOrDefault("hanb_font")
15+
private set
16+
var latinFont: Typeface = getTypefaceOrDefault("latin_font")
17+
private set
18+
private val typefaceCache = mutableMapOf<String, Typeface>()
19+
20+
fun reload() {
21+
typefaceCache.clear()
22+
fontFamiliyCache.clear()
23+
hanBFont = getTypefaceOrDefault("hanb_font")
24+
latinFont = getTypefaceOrDefault("latin_font")
25+
}
1726

1827
@JvmStatic
1928
fun getTypeface(key: String): Typeface {
29+
if (typefaceCache.containsKey(key)) {
30+
return typefaceCache[key]!!
31+
}
32+
Timber.d("getTypeface() key=%s", key)
2033
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
2134
val fontFamilies = mutableListOf<FontFamily>()
2235
getFontFamilies(key).let {
@@ -25,9 +38,15 @@ object FontManager {
2538
fontFamilies.addAll(it)
2639
fontFamilies.addAll(getFontFamilies("hanb_font"))
2740
}
28-
return buildTypeface(fontFamilies)
41+
buildTypeface(fontFamilies).let {
42+
typefaceCache[key] = it
43+
return@getTypeface it
44+
}
45+
}
46+
getTypefaceOrDefault(key).let {
47+
typefaceCache[key] = it
48+
return@getTypeface it
2949
}
30-
return getTypefaceOrNull(key) ?: Typeface.DEFAULT
3150
}
3251

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

43-
private fun getTypefaceOrNull(key: String): Typeface? {
44-
val fonts = theme.style.getObject(key)
62+
private fun getTypefaceOrDefault(key: String): Typeface {
63+
val fonts = ThemeManager.activeTheme.style.getObject(key)
4564

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

55-
if (fonts is String) return handler(fonts)
74+
if (fonts is String) return handler(fonts) ?: Typeface.DEFAULT
5675
if (fonts is List<*>) {
5776
for (font in fonts as List<String>) {
5877
handler(font).let {
5978
if (it != null) return it
6079
}
6180
}
6281
}
82+
return Typeface.DEFAULT
83+
}
84+
85+
private val fontFamiliyCache = mutableMapOf<String, FontFamily>()
86+
87+
@RequiresApi(Build.VERSION_CODES.Q)
88+
private fun getFontFamily(fontName: String): FontFamily? {
89+
if (fontFamiliyCache.containsKey(fontName)) {
90+
return fontFamiliyCache[fontName]!!
91+
}
92+
val fontFile = File(fontDir, fontName)
93+
if (fontFile.exists()) {
94+
return FontFamily.Builder(Font.Builder(fontFile).build()).build()
95+
}
96+
Timber.w("font %s not found", fontFile)
6397
return null
6498
}
6599

66100
@RequiresApi(Build.VERSION_CODES.Q)
67-
fun getFontFamilies(key: String): List<FontFamily> {
68-
val fonts = theme.style.getObject(key)
101+
private fun getFontFamilies(key: String): List<FontFamily> {
102+
val fonts = ThemeManager.activeTheme.style.getObject(key)
69103
val fontFamilies = mutableListOf<FontFamily>()
70104

71105
fun handler(fontName: String) {
72-
val fontFile = File(fontDir, fontName)
73-
if (fontFile.exists()) {
74-
fontFamilies.add(FontFamily.Builder(Font.Builder(fontFile).build()).build())
75-
return
106+
getFontFamily(fontName)?.let {
107+
fontFamilies.add(it)
76108
}
77-
Timber.w("font %s not found", fontFile)
78109
}
79110

80111
if (fonts is String) handler(fonts)

app/src/main/java/com/osfans/trime/data/theme/ThemeManager.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ object ThemeManager {
3333
?.toMutableList() ?: mutableListOf()
3434
}
3535

36-
val sharedThemes: MutableList<String> = listThemes(DataManager.sharedDataDir)
36+
private val sharedThemes: MutableList<String> = listThemes(DataManager.sharedDataDir)
3737

38-
val userThemes: MutableList<String> = listThemes(DataManager.userDataDir)
38+
private val userThemes: MutableList<String> = listThemes(DataManager.userDataDir)
3939

4040
@JvmStatic
4141
fun getAllThemes(): List<String> {
@@ -45,7 +45,7 @@ object ThemeManager {
4545
return sharedThemes + userThemes
4646
}
4747

48-
fun refreshThemes() {
48+
private fun refreshThemes() {
4949
sharedThemes.clear()
5050
userThemes.clear()
5151
sharedThemes.addAll(listThemes(DataManager.sharedDataDir))
@@ -61,6 +61,7 @@ object ThemeManager {
6161
if (_activeTheme == value) return
6262
_activeTheme = value
6363
fireChange()
64+
FontManager.reload()
6465
}
6566

6667
private var isNightMode = false

0 commit comments

Comments
 (0)