From 904215fe384d048c74484c53114f160f949395bf Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 6 Apr 2022 10:09:42 -0400 Subject: [PATCH] Fix font networking main thread crash. --- .../securesms/fonts/FontTypefaceProvider.kt | 41 ++++++++++++------- .../securesms/stories/StoryTextPostView.kt | 14 +++++-- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/fonts/FontTypefaceProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/fonts/FontTypefaceProvider.kt index d90bb5484a..184bb1dffd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/fonts/FontTypefaceProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/fonts/FontTypefaceProvider.kt @@ -2,30 +2,41 @@ 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 -import java.util.Locale -import java.util.concurrent.ExecutionException /** * RenderContext TypefaceProvider that provides typefaces using TextFont. */ object FontTypefaceProvider : RendererContext.TypefaceProvider { override fun getSelectedTypeface(context: Context, renderer: Renderer, invalidate: RendererContext.Invalidate): Typeface { - return when (val fontResult = Fonts.resolveFont(context, Locale.getDefault(), TextFont.BOLD)) { - is Fonts.FontResult.Immediate -> fontResult.typeface - is Fonts.FontResult.Async -> { - fontResult.future.addListener(object : FutureTaskListener { - override fun onSuccess(result: Typeface?) { - invalidate.onInvalidate(renderer) - } + return getTypeface() + // TODO [cody] Need to rework Fonts.kt to not hit network on main, reverting to old typeface for now +// return when (val fontResult = Fonts.resolveFont(context, Locale.getDefault(), TextFont.BOLD)) { +// is Fonts.FontResult.Immediate -> fontResult.typeface +// is Fonts.FontResult.Async -> { +// fontResult.future.addListener(object : FutureTaskListener { +// override fun onSuccess(result: Typeface?) { +// invalidate.onInvalidate(renderer) +// } +// +// override fun onFailure(exception: ExecutionException?) = Unit +// }) +// +// fontResult.placeholder +// } +// } + } - 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() } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt index fef97c859c..55d725c8a2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt @@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryScale import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryTextWatcher import org.thoughtcrime.securesms.stories.viewer.page.StoryDisplay import org.thoughtcrime.securesms.util.concurrent.ListenableFuture +import org.thoughtcrime.securesms.util.concurrent.SimpleTask import org.thoughtcrime.securesms.util.visible import java.util.Locale @@ -152,10 +153,15 @@ class StoryTextPostView @JvmOverloads constructor( setTextBackgroundColor(storyTextPost.textBackgroundColor) setTextGravity(TextAlignment.CENTER) - when (val fontResult = Fonts.resolveFont(context, Locale.getDefault(), font)) { - is Fonts.FontResult.Immediate -> setTypeface(fontResult.typeface) - is Fonts.FontResult.Async -> setTypeface(fontResult.future.get()) - } + SimpleTask.run( + { + when (val fontResult = Fonts.resolveFont(context, Locale.getDefault(), font)) { + is Fonts.FontResult.Immediate -> fontResult.typeface + is Fonts.FontResult.Async -> fontResult.future.get() + } + }, + { typeface -> setTypeface(typeface) } + ) hideCloseButton()