From be241524dbd05a1500f8c62e3016a6be4371ab0c Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 4 Apr 2022 20:22:42 -0400 Subject: [PATCH] Fix font networking main thread crash. --- .../securesms/database/ThreadDatabase.java | 2 +- .../securesms/fonts/FontTypefaceProvider.kt | 56 ++++++++++++------- .../org/thoughtcrime/securesms/fonts/Fonts.kt | 2 + .../securesms/stories/StoryTextPostView.kt | 14 +++-- 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index 2a15f5a945..87c98d04e8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -1367,7 +1367,7 @@ public class ThreadDatabase extends Database { try { type = SignalDatabase.mmsSms().getConversationSnippetType(threadId); } catch (NoSuchMessageException e) { - Log.w(TAG, "Unable to find snippet message for thread: " + threadId, e); + Log.w(TAG, "Unable to find snippet message for thread: " + threadId); return; } 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 1d3405b9a5..f8d250cd6d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/fonts/FontTypefaceProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/fonts/FontTypefaceProvider.kt @@ -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 { +// 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 { - 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() } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/fonts/Fonts.kt b/app/src/main/java/org/thoughtcrime/securesms/fonts/Fonts.kt index 3dbc01c7c8..fd956b5d0d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/fonts/Fonts.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/fonts/Fonts.kt @@ -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) 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 c2a129bfd2..1f56e0a7e6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt @@ -12,6 +12,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.doOnNextLayout import androidx.core.view.isVisible import com.google.android.material.imageview.ShapeableImageView +import org.signal.core.util.concurrent.SimpleTask import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.conversation.colors.ChatColors import org.thoughtcrime.securesms.database.model.databaseprotos.StoryTextPost @@ -153,10 +154,15 @@ class StoryTextPostView @JvmOverloads constructor( setTextBackgroundColor(storyTextPost.textBackgroundColor) setTextGravity(TextAlignment.CENTER) - when (val fontResult = Fonts.resolveFont(context, font, TextToScript.guessScript(storyTextPost.body))) { - is Fonts.FontResult.Immediate -> setTypeface(fontResult.typeface) - is Fonts.FontResult.Async -> setTypeface(fontResult.future.get()) - } + SimpleTask.run( + { + when (val fontResult = Fonts.resolveFont(context, font, TextToScript.guessScript(storyTextPost.body))) { + is Fonts.FontResult.Immediate -> fontResult.typeface + is Fonts.FontResult.Async -> fontResult.future.get() + } + }, + { typeface -> setTypeface(typeface) } + ) hideCloseButton()