@@ -10,13 +10,26 @@ import timber.log.Timber
1010import java.io.File
1111
1212object 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)
0 commit comments