Fix font networking main thread crash.

This commit is contained in:
Cody Henthorne
2022-04-04 20:22:42 -04:00
parent bb66c3fa68
commit be241524db
4 changed files with 48 additions and 26 deletions

View File

@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.fonts
import android.content.Context
import android.graphics.Typeface
import android.os.Build
import org.signal.imageeditor.core.Renderer
import org.signal.imageeditor.core.RendererContext
import org.thoughtcrime.securesms.util.FutureTaskListener
@@ -18,28 +19,41 @@ class FontTypefaceProvider : RendererContext.TypefaceProvider {
private var cachedLocale: Locale? = null
override fun getSelectedTypeface(context: Context, renderer: Renderer, invalidate: RendererContext.Invalidate): Typeface {
val typeface = cachedTypeface
if (typeface != null && cachedLocale == LocaleUtil.getFirstLocale()) {
return typeface
}
return getTypeface()
//TODO [cody] Need to rework Fonts.kt to not hit network on main, reverting to old typeface for now
// val typeface = cachedTypeface
// if (typeface != null && cachedLocale == LocaleUtil.getFirstLocale()) {
// return typeface
// }
//
// return when (val fontResult = Fonts.resolveFont(context, TextFont.BOLD)) {
// is Fonts.FontResult.Immediate -> {
// cachedTypeface = fontResult.typeface
// cachedLocale = LocaleUtil.getFirstLocale()
// fontResult.typeface
// }
// is Fonts.FontResult.Async -> {
// fontResult.future.addListener(object : FutureTaskListener<Typeface> {
// override fun onSuccess(result: Typeface?) {
// invalidate.onInvalidate(renderer)
// }
//
// override fun onFailure(exception: ExecutionException?) = Unit
// })
//
// fontResult.placeholder
// }
// }
}
return when (val fontResult = Fonts.resolveFont(context, TextFont.BOLD)) {
is Fonts.FontResult.Immediate -> {
cachedTypeface = fontResult.typeface
cachedLocale = LocaleUtil.getFirstLocale()
fontResult.typeface
}
is Fonts.FontResult.Async -> {
fontResult.future.addListener(object : FutureTaskListener<Typeface> {
override fun onSuccess(result: Typeface?) {
invalidate.onInvalidate(renderer)
}
override fun onFailure(exception: ExecutionException?) = Unit
})
fontResult.placeholder
}
private fun getTypeface(): Typeface {
return if (Build.VERSION.SDK_INT < 26) {
Typeface.create(Typeface.DEFAULT, Typeface.BOLD)
} else {
Typeface.Builder("")
.setFallback("sans-serif")
.setWeight(900)
.build()
}
}
}

View File

@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.fonts
import android.content.Context
import android.graphics.Typeface
import androidx.annotation.WorkerThread
import org.signal.core.util.ThreadUtil
import org.signal.core.util.concurrent.SignalExecutors
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.s3.S3
@@ -57,6 +58,7 @@ object Fonts {
*/
@WorkerThread
fun resolveFont(context: Context, font: TextFont, guessedScript: SupportedScript = SupportedScript.UNKNOWN): FontResult {
ThreadUtil.assertNotMainThread()
synchronized(this) {
val errorFallback = FontResult.Immediate(Typeface.create(font.fallbackFamily, font.fallbackStyle))
val version = FontVersion.get(context)