From 5c5d55d2655fab6686e7c6ee8f08c8f3e0587a22 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 11 Mar 2024 11:14:05 -0300 Subject: [PATCH] Introduce glyph fonts to correct spacing. --- .../main/assets/fonts/SignalSymbols-Bold.otf | Bin 0 -> 18060 bytes .../preferences/BioTextPreference.kt | 29 +++++-- .../securesms/fonts/SignalSymbols.kt | 80 ++++++++++++++++++ .../RecipientBottomSheetDialogFragment.java | 22 +++-- 4 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 app/src/main/assets/fonts/SignalSymbols-Bold.otf create mode 100644 app/src/main/java/org/thoughtcrime/securesms/fonts/SignalSymbols.kt diff --git a/app/src/main/assets/fonts/SignalSymbols-Bold.otf b/app/src/main/assets/fonts/SignalSymbols-Bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..8aed1da3c73a6c5dc729dd71da18efd670ac5412 GIT binary patch literal 18060 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 NV+0zKf&Wdw{{bp-y4C;y literal 0 HcmV?d00001 diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/BioTextPreference.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/BioTextPreference.kt index 79f282c0fa..936cf6e725 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/BioTextPreference.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/BioTextPreference.kt @@ -7,9 +7,9 @@ import android.view.View import android.widget.TextView import android.widget.Toast import androidx.core.content.ContextCompat -import org.signal.core.util.dp import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.PreferenceModel +import org.thoughtcrime.securesms.fonts.SignalSymbols import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.ContextUtil import org.thoughtcrime.securesms.util.ServiceUtil @@ -57,20 +57,31 @@ object BioTextPreference { SpanUtil.appendSpacer(this, 8) SpanUtil.appendCenteredImageSpanWithoutSpace(this, ContextUtil.requireDrawable(context, R.drawable.ic_official_28), 28, 28) } else if (recipient.isSystemContact) { - val drawable = ContextUtil.requireDrawable(context, R.drawable.symbol_person_circle_24).apply { - setTint(ContextCompat.getColor(context, R.color.signal_colorOnSurface)) + val systemContactGlyph = SignalSymbols.getSpannedString( + context, + SignalSymbols.Weight.BOLD, + SignalSymbols.Glyph.PERSON_CIRCLE + ).let { + SpanUtil.ofSize(it, 20) } - SpanUtil.appendSpacer(this, 8) - SpanUtil.appendCenteredImageSpanWithoutSpace(this, drawable, 24, 24) + + append(" ") + append(systemContactGlyph) } if (recipient.isIndividual && !recipient.isSelf) { - val drawable = ContextUtil.requireDrawable(context, R.drawable.symbol_chevron_right_24).apply { - setBounds(0, 0, 24.dp, 24.dp) - setTint(ContextCompat.getColor(context, R.color.signal_colorOutline)) + val chevronGlyph = SignalSymbols.getSpannedString( + context, + SignalSymbols.Weight.BOLD, + SignalSymbols.Glyph.CHEVRON_RIGHT + ).let { + SpanUtil.ofSize(it, 24) + }.let { + SpanUtil.color(ContextCompat.getColor(context, R.color.signal_colorOutline), it) } - append(SpanUtil.buildCenteredImageSpan(drawable)) + append(" ") + append(chevronGlyph) } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/fonts/SignalSymbols.kt b/app/src/main/java/org/thoughtcrime/securesms/fonts/SignalSymbols.kt new file mode 100644 index 0000000000..52fc3cf5aa --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/fonts/SignalSymbols.kt @@ -0,0 +1,80 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.fonts + +import android.content.Context +import android.graphics.Typeface +import android.text.SpannableStringBuilder +import android.text.TextPaint +import android.text.style.MetricAffectingSpan + +/** + * Helper object for working with the SignalSymbols font + */ +object SignalSymbols { + + enum class Glyph(val unicode: Char) { + CHEVRON_RIGHT('\uE025'), + PERSON_CIRCLE('\uE05E') + } + + enum class Weight { + BOLD + } + + private val cache = mutableMapOf() + + fun getSpannedString( + context: Context, + weight: Weight, + glyph: Glyph + ): CharSequence { + val typeface = getTypeface(context, weight) + val span = CustomTypefaceSpan(typeface) + + val text = SpannableStringBuilder(glyph.unicode.toString()) + text.setSpan(span, 0, text.length, 0) + + return text + } + + private fun getTypeface(context: Context, weight: Weight): Typeface { + return when (weight) { + Weight.BOLD -> getBoldWeightedFont(context) + else -> error("Unsupported weight: $weight") + } + } + + private fun getBoldWeightedFont(context: Context): Typeface { + return cache.getOrPut( + Weight.BOLD + ) { + Typeface.createFromAsset( + context.assets, + "fonts/SignalSymbols-Bold.otf" + ) + } + } + + /** + * Custom TypefaceSpan to support TypefaceSpan in API<28 + * + * Source: https://www.youtube.com/watch?v=x-FcOX6ErdI&t=486s + */ + private class CustomTypefaceSpan(val font: Typeface?) : MetricAffectingSpan() { + override fun updateMeasureState(textPaint: TextPaint) = update(textPaint) + override fun updateDrawState(textPaint: TextPaint?) = update(textPaint) + + private fun update(tp: TextPaint?) { + tp.apply { + val old = this!!.typeface + val oldStyle = old?.style ?: 0 + val font = Typeface.create(font, oldStyle) + typeface = font + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java index 2a3fc5f564..0d100ab2e4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java @@ -36,6 +36,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsIcon; import org.thoughtcrime.securesms.components.settings.conversation.preferences.ButtonStripPreference; import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.FallbackPhoto80dp; +import org.thoughtcrime.securesms.fonts.SignalSymbols; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; @@ -191,17 +192,22 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF SpanUtil.appendSpacer(nameBuilder, 8); SpanUtil.appendCenteredImageSpanWithoutSpace(nameBuilder, ContextUtil.requireDrawable(requireContext(), R.drawable.ic_official_28), 28, 28); } else if (recipient.isSystemContact()) { - Drawable drawable = ContextUtil.requireDrawable(requireContext(), R.drawable.symbol_person_circle_24); - drawable.setTint(ContextCompat.getColor(requireContext(), R.color.signal_colorOnSurface)); - SpanUtil.appendSpacer(nameBuilder, 8); - SpanUtil.appendCenteredImageSpanWithoutSpace(nameBuilder, drawable, 24, 24); + CharSequence systemContactGlyph = SignalSymbols.INSTANCE.getSpannedString(requireContext(), + SignalSymbols.Weight.BOLD, + SignalSymbols.Glyph.PERSON_CIRCLE); + + nameBuilder.append(" "); + nameBuilder.append(SpanUtil.ofSize(systemContactGlyph, 20)); } if (!recipient.isSelf() && recipient.isIndividual()) { - Drawable drawable = ContextUtil.requireDrawable(requireContext(), R.drawable.symbol_chevron_right_24); - drawable.setBounds(0, 0, (int) DimensionUnit.DP.toPixels(24), (int) DimensionUnit.DP.toPixels(24)); - drawable.setTint(ContextCompat.getColor(requireContext(), R.color.signal_colorOutline)); - nameBuilder.append(SpanUtil.buildCenteredImageSpan(drawable)); + CharSequence chevronGlyph = SignalSymbols.INSTANCE.getSpannedString(requireContext(), + SignalSymbols.Weight.BOLD, + SignalSymbols.Glyph.CHEVRON_RIGHT); + + nameBuilder.append(" "); + nameBuilder.append(SpanUtil.color(ContextCompat.getColor(requireContext(), R.color.signal_colorOutline), + SpanUtil.ofSize(chevronGlyph, 24))); fullName.setText(nameBuilder); fullName.setOnClickListener(v -> {