mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-23 20:48:43 +00:00
Add glyph icons and SignalSymbol methods.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
name.text = SignalSymbols.getSignalSymbolText(
|
||||
context = context,
|
||||
text = firstRecipient.getShortDisplayName(context),
|
||||
glyphEnd = if (ViewUtil.isLtr(context)) SignalSymbols.Glyph.CHEVRON_RIGHT else SignalSymbols.Glyph.CHEVRON_LEFT
|
||||
)
|
||||
)
|
||||
} else {
|
||||
SpannableStringBuilder(firstRecipient.getShortDisplayName(context))
|
||||
.insert(0, " ")
|
||||
.insert(
|
||||
0,
|
||||
SpanUtil.ofSize(
|
||||
SignalSymbols.getSpannedString(context, SignalSymbols.Weight.REGULAR, SignalSymbols.Glyph.CHEVRON_LEFT),
|
||||
16
|
||||
)
|
||||
)
|
||||
}
|
||||
name.setOnClickListener { listener?.onLaunchRecipientSheet(firstRecipient) }
|
||||
|
||||
allow.setOnClickListener { listener?.onAllowPendingRecipient(firstRecipient) }
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user