From 462fcdce168fbe1ad5b8ec6adc6946fdb2d38a1e Mon Sep 17 00:00:00 2001 From: Sagar <85388413+Sagar0-0@users.noreply.github.com> Date: Mon, 14 Apr 2025 21:53:41 +0530 Subject: [PATCH] Add glyph icons and SignalSymbol methods. --- .../MessageBackupsTypeSelectionScreen.kt | 11 +- .../remote/RemoteBackupsSettingsFragment.kt | 14 +- .../webrtc/PendingParticipantsView.kt | 27 +-- .../securesms/fonts/SignalSymbols.kt | 222 +++++++++++++++++- 4 files changed, 236 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsTypeSelectionScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsTypeSelectionScreen.kt index 4ced2bf56b..bc8b0a30bb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsTypeSelectionScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsTypeSelectionScreen.kt @@ -55,7 +55,7 @@ import org.signal.core.util.money.FiatMoney import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.backup.v2.MessageBackupTier import org.thoughtcrime.securesms.fonts.SignalSymbols -import org.thoughtcrime.securesms.fonts.SignalSymbols.SignalSymbol +import org.thoughtcrime.securesms.fonts.SignalSymbols.signalSymbolText import org.thoughtcrime.securesms.payments.FiatMoneyUtil import org.thoughtcrime.securesms.util.ByteUnit import java.math.BigDecimal @@ -260,11 +260,10 @@ fun MessageBackupsTypeBlock( ) { if (isCurrent) { Text( - text = buildAnnotatedString { - SignalSymbol(weight = SignalSymbols.Weight.REGULAR, glyph = SignalSymbols.Glyph.CHECKMARK) - append(" ") - append(stringResource(R.string.MessageBackupsTypeSelectionScreen__current_plan)) - }, + text = signalSymbolText( + text = stringResource(R.string.MessageBackupsTypeSelectionScreen__current_plan), + glyphStart = SignalSymbols.Glyph.CHECKMARK + ), color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier .padding(bottom = 12.dp) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt index 8ac5f66100..330ec1a30c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/backups/remote/RemoteBackupsSettingsFragment.kt @@ -99,7 +99,7 @@ import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity import org.thoughtcrime.securesms.components.settings.app.subscription.MessageBackupsCheckoutLauncher.createBackupsCheckoutLauncher import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.fonts.SignalSymbols -import org.thoughtcrime.securesms.fonts.SignalSymbols.SignalSymbol +import org.thoughtcrime.securesms.fonts.SignalSymbols.signalSymbolText import org.thoughtcrime.securesms.help.HelpFragment import org.thoughtcrime.securesms.keyvalue.protos.ArchiveUploadProgressState import org.thoughtcrime.securesms.payments.FiatMoneyUtil @@ -687,14 +687,10 @@ private fun BackupCard( } Text( - text = buildAnnotatedString { - if (backupState.isActive()) { - SignalSymbol(SignalSymbols.Weight.REGULAR, SignalSymbols.Glyph.CHECKMARK) - append(" ") - } - - append(title) - }, + text = signalSymbolText( + text = title, + glyphStart = if (backupState.isActive()) SignalSymbols.Glyph.CHECKMARK else null + ), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PendingParticipantsView.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PendingParticipantsView.kt index bdffe9df22..c3387d281b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PendingParticipantsView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PendingParticipantsView.kt @@ -6,7 +6,6 @@ package org.thoughtcrime.securesms.components.webrtc import android.content.Context -import android.text.SpannableStringBuilder import android.util.AttributeSet import android.view.View import android.widget.TextView @@ -19,7 +18,6 @@ import org.thoughtcrime.securesms.components.webrtc.v2.PendingParticipantsListen import org.thoughtcrime.securesms.fonts.SignalSymbols import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.service.webrtc.PendingParticipantCollection -import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.visible @@ -60,26 +58,11 @@ class PendingParticipantsView @JvmOverloads constructor( avatar.setAvatar(firstRecipient) avatar.setOnClickListener { listener?.onLaunchRecipientSheet(firstRecipient) } - name.text = if (ViewUtil.isLtr(this)) { - SpannableStringBuilder(firstRecipient.getShortDisplayName(context)) - .append(" ") - .append( - SpanUtil.ofSize( - SignalSymbols.getSpannedString(context, SignalSymbols.Weight.REGULAR, SignalSymbols.Glyph.CHEVRON_RIGHT), - 16 - ) - ) - } else { - SpannableStringBuilder(firstRecipient.getShortDisplayName(context)) - .insert(0, " ") - .insert( - 0, - SpanUtil.ofSize( - SignalSymbols.getSpannedString(context, SignalSymbols.Weight.REGULAR, SignalSymbols.Glyph.CHEVRON_LEFT), - 16 - ) - ) - } + name.text = SignalSymbols.getSignalSymbolText( + context = context, + text = firstRecipient.getShortDisplayName(context), + glyphEnd = if (ViewUtil.isLtr(context)) SignalSymbols.Glyph.CHEVRON_RIGHT else SignalSymbols.Glyph.CHEVRON_LEFT + ) name.setOnClickListener { listener?.onLaunchRecipientSheet(firstRecipient) } allow.setOnClickListener { listener?.onAllowPendingRecipient(firstRecipient) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/fonts/SignalSymbols.kt b/app/src/main/java/org/thoughtcrime/securesms/fonts/SignalSymbols.kt index 09160103c3..ac3986c5f5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/fonts/SignalSymbols.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/fonts/SignalSymbols.kt @@ -15,9 +15,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.withStyle import org.thoughtcrime.securesms.util.SpanUtil +import org.thoughtcrime.securesms.util.ViewUtil /** * Helper object for working with the SignalSymbols font @@ -29,7 +31,163 @@ object SignalSymbols { CHEVRON_LEFT('\uE024'), CHEVRON_RIGHT('\uE025'), PERSON_CIRCLE('\uE05E'), - LOCK('\uE041') + LOCK('\uE041'), + LOCK_OPEN('\uE07D'), + LOGO('\uE000'), + ALBUM('\uE001'), + APPEARANCE('\uE031'), + ARROW_LEFT('\u2190'), + ARROW_RIGHT('\u2192'), + ARROW_UP('\u2191'), + ARROW_DOWN('\u2193'), + ARROW_UP_LEFT('\u2196'), + ARROW_UP_RIGHT('\u2197'), + ARROW_DOWN_LEFT('\u2199'), + ARROW_DOWN_RIGHT('\u2198'), + ARROW_CIRCLE_LEFT('\uE00B'), + ARROW_CIRCLE_RIGHT('\uE00C'), + ARROW_CIRCLE_UP('\uE00D'), + ARROW_CIRCLE_DOWN('\uE00E'), + ARROW_CIRCLE_UP_LEFT('\uE00F'), + ARROW_CIRCLE_UP_RIGHT('\uE010'), + ARROW_CIRCLE_DOWN_LEFT('\uE011'), + ARROW_CIRCLE_DOWN_RIGHT('\uE012'), + ARROW_SQUARE_LEFT('\uE013'), + ARROW_SQUARE_RIGHT('\uE014'), + ARROW_SQUARE_UP('\uE015'), + ARROW_SQUARE_DOWN('\uE016'), + ARROW_SQUARE_UP_LEFT('\uE017'), + ARROW_SQUARE_UP_RIGHT('\uE018'), + ARROW_SQUARE_DOWN_LEFT('\uE019'), + ARROW_SQUARE_DOWN_RIGHT('\uE01A'), + ARROW_DASH_DOWN('\uE021'), + ARROW_CIRCLE_LEFT_FILL('\uE003'), + ARROW_CIRCLE_RIGHT_FILL('\uE004'), + ARROW_CIRCLE_UP_FILL('\uE005'), + ARROW_CIRCLE_DOWN_FILL('\uE006'), + ARROW_CIRCLE_UP_LEFT_FILL('\uE007'), + ARROW_CIRCLE_UP_RIGHT_FILL('\uE008'), + ARROW_CIRCLE_DOWN_LEFT_FILL('\uE009'), + ARROW_CIRCLE_DOWN_RIGHT_FILL('\uE00A'), + ARROW_SQUARE_LEFT_FILL('\uE08A'), + ARROW_SQUARE_RIGHT_FILL('\uE08B'), + ARROW_SQUARE_UP_FILL('\uE08C'), + ARROW_SQUARE_DOWN_FILL('\uE08D'), + ARROW_SQUARE_UP_LEFT_FILL('\uE08E'), + ARROW_SQUARE_UP_RIGHT_FILL('\uE08F'), + ARROW_SQUARE_DOWN_LEFT_FILL('\uE090'), + ARROW_SQUARE_DOWN_RIGHT_FILL('\uE091'), + AT('\uE01B'), + ATTACH('\uE058'), + AUDIO('\uE01C'), + AUDIO_RECTANGLE('\uE01D'), + BADGE('\uE099'), + BADGE_FILL('\uE09A'), + BELL('\uE01E'), + BELL_SLASH('\uE01F'), + BELL_RING('\uE020'), + BLOCK('\uE002'), + CHECK('\u2713'), + CHECK_CIRCLE('\uE022'), + CHECK_SQUARE('\uE023'), + CHEVRON_UP('\uE026'), + CHEVRON_DOWN('\uE027'), + CHEVRON_CIRCLE_LEFT('\uE028'), + CHEVRON_CIRCLE_RIGHT('\uE029'), + CHEVRON_CIRCLE_UP('\uE02A'), + CHEVRON_CIRCLE_DOWN('\uE02B'), + CHEVRON_SQUARE_LEFT('\uE02C'), + CHEVRON_SQUARE_RIGHT('\uE02D'), + CHEVRON_SQUARE_UP('\uE02E'), + CHEVRON_SQUARE_DOWN('\uE02F'), + DROPDOWN_DOWN('\uE07F'), + DROPDOWN_UP('\uE080'), + DROPDOWN_TRIANGLE_DOWN('\uE082'), + EDIT('\uE030'), + EMOJI('\u263A'), + ERROR('\uE032'), + ERROR_TRIANGLE('\uE092'), + ERROR_FILL('\uE093'), + ERROR_TRIANGLE_FILL('\uE094'), + FILE('\uE034'), + FORWARD('\uE035'), + FORWARD_FILL('\uE036'), + GIF('\uE037'), + GIF_RECTANGLE('\uE097'), + GROUP('\uE038'), + HEART('\uE039'), + INCOMING('\uE03A'), + INFO('\uE03B'), + LEAVE('\uE03C'), + LEAVE_RTL('\uE03D'), + LINK('\uE03E'), + LINK_ANDROID('\uE03F'), + LINK_BROKEN('\uE057'), + LINK_SLASH('\uE040'), + MEGAPHONE('\uE042'), + MERGE('\uE043'), + MESSAGE_STATUS_SENDING('\uE044'), + MESSAGE_STATUS_SENT('\uE045'), + MESSAGE_STATUS_READ('\uE046'), + MESSAGE_STATUS_DELIVERED('\uE047'), + MESSAGE_TIMER_00('\uE048'), + MESSAGE_TIMER_05('\uE049'), + MESSAGE_TIMER_10('\uE04A'), + MESSAGE_TIMER_15('\uE04B'), + MESSAGE_TIMER_20('\uE04C'), + MESSAGE_TIMER_25('\uE04D'), + MESSAGE_TIMER_30('\uE04E'), + MESSAGE_TIMER_35('\uE04F'), + MESSAGE_TIMER_40('\uE050'), + MESSAGE_TIMER_45('\uE051'), + MESSAGE_TIMER_50('\uE052'), + MESSAGE_TIMER_55('\uE053'), + MESSAGE_TIMER_60('\uE054'), + MIC('\uE055'), + MIC_SLASH('\uE056'), + MINUS('\u2212'), + MINUS_CIRCLE('\u2296'), + MINUS_SQUARE('\uE059'), + MISSED_INCOMING('\uE05A'), + MISSED_OUTGOING('\uE05B'), + NOTE('\uE095'), + NOTE_RTL('\uE096'), + OFFICIAL_BADGE('\uE086'), + OFFICIAL_BADGE_FILL('\uE087'), + OUTGOING('\uE05C'), + PERSON('\uE05D'), + PERSON_CHECK('\uE05F'), + PERSON_X('\uE060'), + PERSON_PLUS('\uE061'), + PERSON_MINUS('\uE062'), + PHONE('\uE063'), + PHONE_FILL('\uE064'), + PHOTO('\uE065'), + PLAY('\uE067'), + PLUS('\u002B'), + PLUS_CIRCLE('\u2295'), + PLUS_SQUARE('\uE06C'), + RAISE_HAND('\uE07E'), + RAISE_HAND_FILL('\uE084'), + REPLY('\uE06D'), + REPLY_FILL('\uE06E'), + SAFETY_NUMBER('\uE06F'), + SPAM('\uE033'), + STICKER('\uE070'), + THREAD('\uE071'), + THREAD_FILL('\uE072'), + TIMER('\uE073'), + TIMER_SLASH('\uE074'), + VIDEO_CAMERA('\uE075'), + VIDEO_CAMERA_SLASH('\uE076'), + VIDEO_CAMERA_FILL('\uE077'), + VIDEO('\uE088'), + VIEW_ONCE('\uE078'), + VIEW_ONCE_DASH('\uE079'), + VIEW_ONCE_VIEWED('\uE07A'), + X('\u00D7'), + X_CIRCLE('\u2297'), + X_SQUARE('\u2327') } enum class Weight { @@ -59,6 +217,46 @@ object SignalSymbols { } } + @JvmStatic + fun getSignalSymbolText( + context: Context, + text: String, + glyphStart: Glyph? = null, + glyphEnd: Glyph? = null, + glyphStartWeight: Weight = Weight.REGULAR, + glyphEndWeight: Weight = Weight.REGULAR, + glyphStartSizeSp: Int = 16, + glyphEndSizeSp: Int = 16 + ): AnnotatedString { + val isLtr = ViewUtil.isLtr(context) + val leftGlyph = if (isLtr) glyphStart else glyphEnd + val leftGlyphWeight = if (isLtr) glyphStartWeight else glyphEndWeight + val leftGlyphSizeSp = if (isLtr) glyphStartSizeSp else glyphEndSizeSp + val rightGlyph = if (isLtr) glyphEnd else glyphStart + val rightGlyphWeight = if (isLtr) glyphEndWeight else glyphStartWeight + val rightGlyphSizeSp = if (isLtr) glyphEndSizeSp else glyphStartSizeSp + + return buildAnnotatedString { + if (leftGlyph != null) { + val symbol = SpanUtil.ofSize( + getSpannedString(context, leftGlyphWeight, leftGlyph), + leftGlyphSizeSp + ) + append(symbol) + append(" ") + } + append(text) + if (rightGlyph != null) { + val symbol = SpanUtil.ofSize( + getSpannedString(context, rightGlyphWeight, rightGlyph), + rightGlyphSizeSp + ) + append(" ") + append(symbol) + } + } + } + @Composable fun AnnotatedString.Builder.SignalSymbol(weight: Weight, glyph: Glyph) { withStyle( @@ -70,6 +268,28 @@ object SignalSymbols { } } + @Composable + fun signalSymbolText( + text: String, + glyphStart: Glyph? = null, + glyphEnd: Glyph? = null, + glyphStartWeight: Weight = Weight.REGULAR, + glyphEndWeight: Weight = Weight.REGULAR, + glyphStartSizeSp: Int = 16, + glyphEndSizeSp: Int = 16 + ): AnnotatedString { + return getSignalSymbolText( + context = LocalContext.current, + text = text, + glyphStart = glyphStart, + glyphEnd = glyphEnd, + glyphStartWeight = glyphStartWeight, + glyphEndWeight = glyphEndWeight, + glyphStartSizeSp = glyphStartSizeSp, + glyphEndSizeSp = glyphEndSizeSp + ) + } + private fun getTypeface(context: Context, weight: Weight): Typeface { return when (weight) { Weight.BOLD -> getBoldWeightedFont(context)