Updated on 2026-08-14

This commit is contained in:
Tangem 2025-10-13 13:02:12 +03:00
commit 3946e4ebca
359 changed files with 8459 additions and 3324 deletions

View file

@ -27,10 +27,6 @@
"name": "alephium",
"version": "5.21.0"
},
{
"name": "scroll",
"version": "undefined"
},
{
"name": "zklink",
"version": "undefined"

View file

@ -43,7 +43,7 @@ internal class TangemPay(
private fun createProdEnvironment(): ApiEnvironmentConfig = ApiEnvironmentConfig(
environment = ApiEnvironment.PROD,
baseUrl = "https://api.paera.com/bff/",
baseUrl = "https://api.us.paera.com/bff/",
headers = createHeaders(),
)

View file

@ -156,7 +156,7 @@ interface TangemTechApi {
@Path("walletId") walletId: String,
@Header("If-Match") eTag: String,
@Body body: SaveWalletAccountsResponse,
): ApiResponse<Unit>
): ApiResponse<GetWalletAccountsResponse>
@GET("/v1/wallets/{walletId}/accounts/archived")
suspend fun getWalletArchivedAccounts(

View file

@ -4,7 +4,7 @@ import com.tangem.datasource.api.common.response.ApiResponse
import com.tangem.datasource.api.tangemTech.models.YieldMarketsResponse
import com.tangem.datasource.api.tangemTech.models.YieldModuleStatusResponse
import com.tangem.datasource.api.tangemTech.models.YieldSupplyChangeTokenStatusBody
import com.tangem.datasource.api.tangemTech.models.YieldTokenStatusResponse
import com.tangem.datasource.api.tangemTech.models.YieldSupplyMarketTokenDto
import com.tangem.datasource.api.tangemTech.models.YieldTokenChartResponse
import retrofit2.http.Body
import retrofit2.http.GET
@ -15,13 +15,13 @@ import retrofit2.http.Query
interface YieldSupplyApi {
@GET("api/v1/yield/markets")
suspend fun getYieldMarkets(@Query("chainId") chainId: Int? = null): ApiResponse<YieldMarketsResponse>
suspend fun getYieldMarkets(@Query("chainId") chainId: String? = null): ApiResponse<YieldMarketsResponse>
@GET("api/v1/yield/token/{chainId}/{tokenAddress}")
suspend fun getYieldTokenStatus(
@Path("chainId") chainId: Int,
@Path("tokenAddress") tokenAddress: String,
): ApiResponse<YieldTokenStatusResponse>
): ApiResponse<YieldSupplyMarketTokenDto>
@GET("api/v1/yield/token/{chainId}/{tokenAddress}/chart")
suspend fun getYieldTokenChart(

View file

@ -2,21 +2,9 @@ package com.tangem.datasource.api.tangemTech.models
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import java.math.BigDecimal
@JsonClass(generateAdapter = true)
data class YieldMarketsResponse(
@Json(name = "tokens") val marketDtos: List<MarketDto>,
@Json(name = "tokens") val marketDtos: List<YieldSupplyMarketTokenDto>,
@Json(name = "lastUpdatedAt") val lastUpdated: String,
) {
@JsonClass(generateAdapter = true)
data class MarketDto(
@Json(name = "tokenAddress") val tokenAddress: String? = null,
@Json(name = "tokenSymbol") val tokenSymbol: String? = null,
@Json(name = "tokenName") val tokenName: String? = null,
@Json(name = "apy") val apy: BigDecimal,
@Json(name = "isActive") val isActive: Boolean,
@Json(name = "chainId") val chainId: Int? = null,
)
}
)

View file

@ -5,7 +5,7 @@ import com.squareup.moshi.JsonClass
import java.math.BigDecimal
@JsonClass(generateAdapter = true)
data class YieldTokenStatusResponse(
data class YieldSupplyMarketTokenDto(
@Json(name = "tokenAddress") val tokenAddress: String? = null,
@Json(name = "tokenSymbol") val tokenSymbol: String? = null,
@Json(name = "tokenName") val tokenName: String? = null,

View file

@ -2,8 +2,37 @@ package com.tangem.datasource.api.tangemTech.models.account
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import com.tangem.datasource.utils.SerializeNulls
@JsonClass(generateAdapter = true)
data class SaveWalletAccountsResponse(
@Json(name = "accounts") val accounts: List<WalletAccountDTO>,
)
@Json(name = "accounts") val accounts: List<AccountDTO>,
) {
@SerializeNulls
@JsonClass(generateAdapter = true)
data class AccountDTO(
@Json(name = "id") val id: String,
@Json(name = "name") val name: String?,
@Json(name = "derivation") val derivationIndex: Int,
@Json(name = "icon") val icon: String,
@Json(name = "iconColor") val iconColor: String,
)
companion object {
operator fun invoke(accounts: List<WalletAccountDTO>): SaveWalletAccountsResponse {
return SaveWalletAccountsResponse(
accounts = accounts.map { accountDto ->
AccountDTO(
id = accountDto.id,
name = accountDto.name,
derivationIndex = accountDto.derivationIndex,
icon = accountDto.icon,
iconColor = accountDto.iconColor,
)
},
)
}
}
}

View file

@ -9,6 +9,7 @@ import com.tangem.common.json.MoshiJsonConverter
import com.tangem.datasource.api.common.adapter.*
import com.tangem.datasource.local.config.providers.models.ProviderModel
import com.tangem.datasource.local.network.entity.NetworkStatusDM
import com.tangem.datasource.utils.SerializeNullsFactory
import com.tangem.domain.models.scan.serialization.*
import com.tangem.domain.visa.model.VisaActivationRemoteState
import com.tangem.domain.visa.model.VisaCardActivationStatus
@ -28,6 +29,7 @@ class MoshiModule {
@NetworkMoshi
fun provideNetworkMoshi(): Moshi {
return Moshi.Builder()
.add(SerializeNullsFactory)
.add(
PolymorphicJsonAdapterFactory.of(ProviderModel::class.java, "type")
.withSubtype(ProviderModel.Public::class.java, "public")

View file

@ -4,11 +4,11 @@ import android.content.Context
import androidx.datastore.core.DataStoreFactory
import androidx.datastore.dataStoreFile
import com.squareup.moshi.Moshi
import com.tangem.datasource.api.tangemTech.models.YieldSupplyMarketTokenDto
import com.tangem.datasource.local.yieldsupply.DefaultYieldMarketsStore
import com.tangem.datasource.local.yieldsupply.YieldMarketsStore
import com.tangem.datasource.utils.MoshiDataStoreSerializer
import com.tangem.datasource.utils.listTypes
import com.tangem.domain.yield.supply.models.YieldMarketToken
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
import dagger.Provides
@ -34,7 +34,7 @@ object YieldSupplyModule {
persistenceStore = DataStoreFactory.create(
serializer = MoshiDataStoreSerializer(
moshi = moshi,
types = listTypes<YieldMarketToken>(),
types = listTypes<YieldSupplyMarketTokenDto>(),
defaultValue = emptyList(),
),
produceFile = { context.dataStoreFile(fileName = "yield_markets_cache") },

View file

@ -12,5 +12,7 @@ interface TangemPayStorage {
suspend fun getOrderId(customerWalletAddress: String): String?
suspend fun clear(customerWalletAddress: String)
suspend fun clearOrderId(customerWalletAddress: String)
suspend fun clearAll(customerWalletAddress: String)
}

View file

@ -1,21 +1,21 @@
package com.tangem.datasource.local.yieldsupply
import androidx.datastore.core.DataStore
import com.tangem.domain.yield.supply.models.YieldMarketToken
import com.tangem.datasource.api.tangemTech.models.YieldSupplyMarketTokenDto
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.firstOrNull
internal class DefaultYieldMarketsStore(
private val persistenceStore: DataStore<List<YieldMarketToken>>,
private val persistenceStore: DataStore<List<YieldSupplyMarketTokenDto>>,
) : YieldMarketsStore {
override fun get(): Flow<List<YieldMarketToken>> = persistenceStore.data
override fun get(): Flow<List<YieldSupplyMarketTokenDto>> = persistenceStore.data
override suspend fun getSyncOrNull(): List<YieldMarketToken>? {
override suspend fun getSyncOrNull(): List<YieldSupplyMarketTokenDto>? {
return persistenceStore.data.firstOrNull()
}
override suspend fun store(items: List<YieldMarketToken>) {
override suspend fun store(items: List<YieldSupplyMarketTokenDto>) {
persistenceStore.updateData { _ -> items }
}
}

View file

@ -1,13 +1,13 @@
package com.tangem.datasource.local.yieldsupply
import com.tangem.domain.yield.supply.models.YieldMarketToken
import com.tangem.datasource.api.tangemTech.models.YieldSupplyMarketTokenDto
import kotlinx.coroutines.flow.Flow
interface YieldMarketsStore {
fun get(): Flow<List<YieldMarketToken>>
fun get(): Flow<List<YieldSupplyMarketTokenDto>>
suspend fun getSyncOrNull(): List<YieldMarketToken>?
suspend fun getSyncOrNull(): List<YieldSupplyMarketTokenDto>?
suspend fun store(items: List<YieldMarketToken>)
suspend fun store(items: List<YieldSupplyMarketTokenDto>)
}

View file

@ -0,0 +1,5 @@
package com.tangem.datasource.utils
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class SerializeNulls

View file

@ -0,0 +1,25 @@
package com.tangem.datasource.utils
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
import java.lang.reflect.Type
/**
* Factory to serialize nulls in Moshi if the class is annotated with [SerializeNulls].
*
[REDACTED_AUTHOR]
*/
internal object SerializeNullsFactory : JsonAdapter.Factory {
override fun create(type: Type, annotations: MutableSet<out Annotation>, moshi: Moshi): JsonAdapter<*>? {
val rawType = Types.getRawType(type)
if (!rawType.isAnnotationPresent(SerializeNulls::class.java)) {
return null
}
val nextAdapter: JsonAdapter<Any> = moshi.nextAdapter(this, type, annotations)
return nextAdapter.serializeNulls()
}
}

View file

@ -0,0 +1,51 @@
package com.tangem.datasource.utils
import com.google.common.truth.Truth.assertThat
import com.squareup.moshi.JsonClass
import com.squareup.moshi.Moshi
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
// --- DTO ---
@SerializeNulls
@JsonClass(generateAdapter = true)
data class UserWithNulls(val id: String?, val name: String?)
@JsonClass(generateAdapter = true)
data class UserWithoutNulls(val id: String?, val name: String?)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class SerializeNullsFactoryTest {
private val moshi = Moshi.Builder()
.add(SerializeNullsFactory)
.build()
@Test
fun `should serialize nulls for annotated class`() {
val adapter = moshi.adapter(UserWithNulls::class.java)
val json = adapter.toJson(UserWithNulls(id = null, name = "John"))
assertThat(json).isEqualTo("""{"id":null,"name":"John"}""")
}
@Test
fun `should skip nulls for non-annotated class`() {
val adapter = moshi.adapter(UserWithoutNulls::class.java)
val json = adapter.toJson(UserWithoutNulls(id = null, name = "John"))
assertThat(json).isEqualTo("""{"name":"John"}""")
}
@Test
fun `should deserialize annotated class correctly`() {
val adapter = moshi.adapter(UserWithNulls::class.java)
val json = """{"id":null,"name":"Jane"}"""
val result = adapter.fromJson(json)
assertThat(result).isEqualTo(UserWithNulls(id = null, name = "Jane"))
}
}

View file

@ -40,7 +40,7 @@ fun SimpleSettingsRow(
onItemsClick()
}
},
).testTag(BaseBottomSheetTestTags.ACTION_TITLE),
).testTag(BaseBottomSheetTestTags.ACTION_BUTTON),
horizontalArrangement = Arrangement.Start,
verticalAlignment = Alignment.CenterVertically,
) {
@ -48,7 +48,8 @@ fun SimpleSettingsRow(
painter = painterResource(id = icon),
contentDescription = null,
modifier = Modifier
.padding(horizontal = if (redesign) TangemTheme.dimens.spacing12 else TangemTheme.dimens.spacing20),
.padding(horizontal = if (redesign) TangemTheme.dimens.spacing12 else TangemTheme.dimens.spacing20)
.testTag(BaseBottomSheetTestTags.ACTION_ICON),
tint = rowColors.iconColor(enabled = enabled).value,
)
Column(

View file

@ -1,12 +1,54 @@
package com.tangem.core.ui.components
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.staticCompositionLocalOf
import com.google.accompanist.systemuicontroller.SystemUiController
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.tangem.core.ui.res.LocalIsInDarkTheme
val LocalSystemBarsIconsController = staticCompositionLocalOf<SystemBarsIconsController> {
error("No SystemBarsIconsController provided")
}
class SystemBarsIconsController(private val systemUiController: SystemUiController) {
private var count by mutableIntStateOf(0)
fun setIcons(darkIcons: Boolean, isNavigationBarContrastEnforced: Boolean) {
if (count == 0) {
systemUiController.systemBarsDarkContentEnabled = darkIcons
systemUiController.isNavigationBarContrastEnforced = isNavigationBarContrastEnforced
}
count++
}
fun restoreIcons(isDarkTheme: Boolean) {
count--
if (count == 0) {
systemUiController.systemBarsDarkContentEnabled = !isDarkTheme
systemUiController.isNavigationBarContrastEnforced = false
}
}
}
@Composable
fun ProvideSystemBarsIconsController(content: @Composable () -> Unit) {
val systemUiController = rememberSystemUiController()
val controller = remember(systemUiController) { SystemBarsIconsController(systemUiController) }
CompositionLocalProvider(
LocalSystemBarsIconsController provides controller,
content = content,
)
}
/**
* Provides the ability to set a scrim for 3-button navigation
*
@ -43,19 +85,16 @@ fun NavigationBar3ButtonsScrim() {
*/
@Composable
fun SystemBarsIconsDisposable(darkIcons: Boolean, isNavigationBarContrastEnforced: Boolean = false) {
val systemUiController = rememberSystemUiController()
val controller = LocalSystemBarsIconsController.current
val isDarkTheme = LocalIsInDarkTheme.current
SideEffect {
systemUiController.systemBarsDarkContentEnabled = darkIcons
systemUiController.isNavigationBarContrastEnforced = isNavigationBarContrastEnforced
controller.setIcons(darkIcons, isNavigationBarContrastEnforced)
}
val isDarkTheme = LocalIsInDarkTheme.current
DisposableEffect(isDarkTheme) {
onDispose {
systemUiController.systemBarsDarkContentEnabled = !isDarkTheme
systemUiController.isNavigationBarContrastEnforced = false
controller.restoreIcons(isDarkTheme)
}
}
}

View file

@ -51,7 +51,19 @@ fun BlockItem(model: BlockUM, modifier: Modifier = Modifier) {
overflow = TextOverflow.Ellipsis,
)
model.label?.let { Label(it) }
when (val endContent = model.endContent) {
is BlockUM.EndContent.None -> Unit
is BlockUM.EndContent.Icon -> Icon(
painter = painterResource(id = endContent.resId),
contentDescription = null,
tint = when (endContent.accentType) {
BlockUM.AccentType.NONE -> TangemTheme.colors.text.primary1
BlockUM.AccentType.ACCENT -> TangemTheme.colors.text.accent
BlockUM.AccentType.WARNING -> TangemTheme.colors.text.warning
},
)
is BlockUM.EndContent.Label -> Label(endContent.label)
}
}
}
}

View file

@ -3,15 +3,29 @@ package com.tangem.core.ui.components.block.model
import androidx.annotation.DrawableRes
import com.tangem.core.ui.components.label.entity.LabelUM
import com.tangem.core.ui.extensions.TextReference
import javax.annotation.concurrent.Immutable
data class BlockUM(
val text: TextReference,
@DrawableRes val iconRes: Int,
val onClick: () -> Unit,
val accentType: AccentType = AccentType.NONE,
val label: LabelUM? = null,
val endContent: EndContent = EndContent.None,
) {
@Immutable
sealed interface EndContent {
data object None : EndContent
data class Label(
val label: LabelUM,
) : EndContent
data class Icon(
val resId: Int,
val accentType: AccentType = AccentType.NONE,
) : EndContent
}
enum class AccentType {
NONE, ACCENT, WARNING,
}

View file

@ -27,15 +27,20 @@ private const val DISABLED_ICON_ALPHA = 0.4f
* [Figma Component](https://www.figma.com/design/14ISV23YB1yVW1uNVwqrKv/Android?node-id=2737-2800&t=ewlXfWwbDnRhjw4B-4)
* */
@Composable
fun BlockchainRow(model: BlockchainRowUM, modifier: Modifier = Modifier, action: @Composable BoxScope.() -> Unit) {
fun BlockchainRow(
model: BlockchainRowUM,
modifier: Modifier = Modifier,
itemPadding: PaddingValues = PaddingValues(
top = TangemTheme.dimens.spacing8,
bottom = TangemTheme.dimens.spacing8,
start = TangemTheme.dimens.spacing8,
),
action: @Composable BoxScope.() -> Unit,
) {
RowContentContainer(
modifier = modifier
.heightIn(min = TangemTheme.dimens.size52)
.padding(
top = TangemTheme.dimens.spacing8,
bottom = TangemTheme.dimens.spacing8,
start = TangemTheme.dimens.spacing8,
),
.padding(itemPadding),
icon = {
RowIcon(
resId = model.iconResId,
@ -58,7 +63,7 @@ fun BlockchainRow(model: BlockchainRowUM, modifier: Modifier = Modifier, action:
}
@Composable
private fun RowIcon(
fun RowIcon(
@DrawableRes resId: Int,
isColored: Boolean,
showAccentBadge: Boolean,

View file

@ -60,10 +60,10 @@ fun TokenListItem(state: TokensListItemUM, isBalanceHidden: Boolean, modifier: M
@Composable
fun PortfolioListItem(state: TokensListItemUM.Portfolio, isBalanceHidden: Boolean, modifier: Modifier = Modifier) {
if (state.isExpanded) {
ExpandedPortfolioHeader(state.state, modifier)
ExpandedPortfolioHeader(state = state.tokenItemUM, isCollapsable = state.isCollapsable, modifier = modifier)
} else {
TokenItem(
state = state.state,
state = state.tokenItemUM,
isBalanceHidden = isBalanceHidden,
modifier = modifier,
)
@ -83,7 +83,7 @@ fun PortfolioTokensListItem(state: PortfolioTokensListItemUM, isBalanceHidden: B
}
@Composable
private fun ExpandedPortfolioHeader(state: TokenItemState, modifier: Modifier = Modifier) {
private fun ExpandedPortfolioHeader(state: TokenItemState, isCollapsable: Boolean, modifier: Modifier = Modifier) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = modifier
@ -130,11 +130,13 @@ private fun ExpandedPortfolioHeader(state: TokenItemState, modifier: Modifier =
)
}
Icon(
modifier = Modifier.size(TangemTheme.dimens.size16),
painter = painterResource(id = R.drawable.ic_minimize_24),
tint = TangemTheme.colors.icon.inactive,
contentDescription = null,
)
if (isCollapsable) {
Icon(
modifier = Modifier.size(TangemTheme.dimens.size16),
painter = painterResource(id = R.drawable.ic_minimize_24),
tint = TangemTheme.colors.icon.inactive,
contentDescription = null,
)
}
}
}

View file

@ -4,6 +4,7 @@ import androidx.compose.runtime.Immutable
import com.tangem.core.ui.components.fields.entity.SearchBarUM
import com.tangem.core.ui.components.token.state.TokenItemState
import com.tangem.core.ui.extensions.TextReference
import kotlinx.collections.immutable.ImmutableList
/** Tokens list item state */
@Immutable
@ -41,11 +42,12 @@ sealed interface TokensListItemUM {
}
data class Portfolio(
val state: TokenItemState,
val tokenItemUM: TokenItemState,
val isExpanded: Boolean,
val tokens: List<PortfolioTokensListItemUM>,
val isCollapsable: Boolean,
val tokens: ImmutableList<PortfolioTokensListItemUM>,
) : TokensListItemUM {
override val id: String = state.id
override val id: String = tokenItemUM.id
}
data class Text(override val id: Any, val text: TextReference) : TokensListItemUM

View file

@ -0,0 +1,26 @@
package com.tangem.core.ui.decompose
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.runtime.Stable
import androidx.compose.ui.Modifier
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@Stable
interface ComposableListContentComponent<T> {
val uiState: StateFlow<T>
fun LazyListScope.content(uiState: T, modifier: Modifier)
companion object {
val EMPTY = EmptyComposableListContentComponent
}
}
object EmptyComposableListContentComponent : ComposableListContentComponent<Unit> {
override val uiState: StateFlow<Unit> = MutableStateFlow(Unit)
override fun LazyListScope.content(uiState: Unit, modifier: Modifier) { /* no-op */
}
}

View file

@ -90,12 +90,14 @@ fun getActiveIconRes(blockchainId: String): Int {
"bitrock", "bitrock/test" -> R.drawable.img_bitrock_22
"sonic", "sonic/test" -> R.drawable.img_sonic_22
"apechain", "apechain/test" -> R.drawable.img_apecoin_22
"scroll", "scroll/test" -> R.drawable.ic_alert_24 // FIXME: add icon during full integration
"scroll", "scroll/test" -> R.drawable.img_scroll_22
"zklink", "zklink/test" -> R.drawable.img_zklink_22
"vanar-chain", "vanar-chain/test" -> R.drawable.img_vanar_22
"pepecoin", "pepecoin/test" -> R.drawable.img_pepecoin_22
"hyperliquid", "hyperliquid/test" -> R.drawable.img_hyperliquid_22
"quai", "quai/test" -> R.drawable.img_quai_22
"linea", "linea/test" -> R.drawable.img_linea_22
"arbitrum-nova" -> R.drawable.img_arbitrum_nova_22
else -> R.drawable.ic_alert_24
}
}
@ -184,12 +186,14 @@ fun getActiveIconResByCoinId(coinId: String): Int {
"bitrock", "bitrock/test" -> R.drawable.img_bitrock_22
"sonic", "sonic/test" -> R.drawable.img_sonic_22
"apechain", "apechain/test" -> R.drawable.img_apecoin_22
"scroll", "scroll/test" -> R.drawable.ic_alert_24 // FIXME: add icon during full integration
"scroll", "scroll/test" -> R.drawable.img_scroll_22
"zklink", "zklink/test" -> R.drawable.img_zklink_22
"vanar-chain", "vanar-chain/test" -> R.drawable.img_vanar_22
"pepecoin-network", "pepecoin-network/test" -> R.drawable.img_pepecoin_22
"hyperliquid", "hyperliquid/test" -> R.drawable.img_hyperliquid_22
"quai", "quai/test" -> R.drawable.img_quai_22
"linea", "linea/test" -> R.drawable.img_linea_22
"arbitrum-nova" -> R.drawable.img_arbitrum_nova_22
else -> R.drawable.ic_alert_24
}
}
@ -281,12 +285,14 @@ fun getGreyedOutIconRes(blockchainId: String): Int {
"bitrock", "bitrock/test" -> R.drawable.ic_bitrock_22
"sonic", "sonic/test" -> R.drawable.ic_sonic_22
"apechain", "apechain/test" -> R.drawable.ic_apecoin_22
"scroll", "scroll/test" -> R.drawable.ic_alert_24 // FIXME: add icon during full integration
"scroll", "scroll/test" -> R.drawable.ic_scroll_22
"zklink", "zklink/test" -> R.drawable.ic_zklink_22
"vanar-chain", "vanar-chain/test" -> R.drawable.ic_vanar_22
"pepecoin", "pepecoin/test" -> R.drawable.ic_pepecoin_22
"hyperliquid", "hyperliquid/test" -> R.drawable.ic_hyperliquid_22
"quai", "quai/test" -> R.drawable.ic_quai_22
"linea", "linea/test" -> R.drawable.ic_linea_22
"arbitrum-nova" -> R.drawable.ic_arbitrum_nova_22
else -> R.drawable.ic_alert_24
}
}

View file

@ -13,6 +13,8 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalView
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.tangem.core.ui.UiDependencies
import com.tangem.core.ui.components.LocalSystemBarsIconsController
import com.tangem.core.ui.components.SystemBarsIconsController
import com.tangem.core.ui.components.TangemShimmer
import com.tangem.core.ui.components.text.BladeAnimation
import com.tangem.core.ui.components.text.rememberBladeAnimation
@ -65,6 +67,8 @@ fun TangemTheme(
val themeColors = if (isDark) darkThemeColors() else lightThemeColors()
val rememberedColors = remember { themeColors }
.also { it.update(themeColors) }
val systemUiController = rememberSystemUiController()
val systemBarsIconsController = remember(systemUiController) { SystemBarsIconsController(systemUiController) }
val shapes = remember { TangemShapes(dimens) }
@ -103,6 +107,7 @@ fun TangemTheme(
LocalEventMessageHandler provides eventMessageHandler,
LocalWindowSize provides windowSize,
LocalBladeAnimation provides rememberBladeAnimation(),
LocalSystemBarsIconsController provides systemBarsIconsController,
) {
CompositionLocalProvider(
LocalTangemShimmer provides TangemShimmer,
@ -119,6 +124,14 @@ fun TangemTheme(
}
}
@Composable
fun ForceDarkTheme(content: @Composable () -> Unit) {
CompositionLocalProvider(
LocalTangemColors provides darkThemeColors(),
content = content,
)
}
object TangemTheme {
val colors: TangemColors
@Composable

View file

@ -1,7 +1,8 @@
package com.tangem.core.ui.test
object BaseBottomSheetTestTags {
const val ACTION_TITLE = "BASE_BOTTOM_SHEET_ACTION_TITLE"
const val ACTION_BUTTON = "BASE_BOTTOM_SHEET_ACTION_BUTTON"
const val ACTION_ICON = "BASE_BOTTOM_SHEET_ACTION_ICON"
const val TITLE = "BASE_BOTTOM_SHEET_TITLE"
const val SUBTITLE = "BASE_BOTTOM_SHEET_SUBTITLE"
const val CLOSE_BUTTON = "BASE_BOTTOM_SHEET_CLOSE_BUTTON"

View file

@ -4,13 +4,11 @@ object SendScreenTestTags {
const val SCREEN_CONTAINER = "SEND_SCREEN_CONTAINER"
const val AMOUNT_CONTAINER_TITLE = "SEND_SCREEN_AMOUNT_CONTAINER_TITLE"
const val AMOUNT_CONTAINER_TEXT = "SEND_SCREEN_AMOUNT_CONTAINER_TEXT"
const val INPUT_TEXT_FIELD = "SEND_SCREEN_INPUT_TEXT_FIELD"
const val TOKEN_NAME = "SEND_SCREEN_TOKEN_NAME"
const val PRIMARY_AMOUNT = "SEND_SCREEN_PRIMARY_AMOUNT"
const val SECONDARY_AMOUNT = "SEND_SCREEN_SECONDARY_AMOUNT"
const val CURRENCY_BUTTON = "SEND_SCREEN_CURRENCY_BUTTON"
const val FIAT_ICON = "SEND_SCREEN_FIAT_ICON"
const val CURRENCY_ICON = "SEND_SCREEN_CURRENCY_ICON"
const val MAX_BUTTON = "END_SCREEN_MAX_BUTTON"
const val MAX_BUTTON = "SEND_SCREEN_MAX_BUTTON"
const val PREVIOUS_BUTTON = "SEND_SCREEN_PREVIOUS_BUTTON"
}

View file

@ -9,6 +9,6 @@ object SwapTokenScreenTestTags {
const val PROVIDERS_BLOCK = "SWAP_TOKEN_SCREEN_PROVIDERS_BLOCK"
const val SWAP_BUTTON = "SWAP_TOKEN_SCREEN_SWAP_BUTTON"
const val TOKEN = "SWAP_TOKEN_SCREEN_TOKEN"
const val TOKEN_NAME = "SWAP_TOKEN_SCREEN_TOKEN_NAME"
const val TOKEN_SYMBOL = "SWAP_TOKEN_SCREEN_TOKEN_SYMBOL"
const val TOKEN_ICON = "SWAP_TOKEN_SCREEN_TOKEN_ICON"
}

View file

@ -0,0 +1,7 @@
package com.tangem.core.ui.test
object TokenReceiveQrCodeBottomSheetTestTags {
const val TITLE = "TOKEN_RECEIVE_QR_CODE_BOTTOM_SHEET_TITLE"
const val QR_CODE = "TOKEN_RECEIVE_QR_CODE_BOTTOM_SHEET_QR_CODE"
const val ADDRESS = "TOKEN_RECEIVE_QR_CODE_BOTTOM_SHEET_ADDRESS"
}

View file

@ -0,0 +1,5 @@
package com.tangem.core.ui.test
object TokenReceiveWarningBottomSheetTestTags {
const val BOTTOM_SHEET = "TOKEN_RECEIVE_WARNING_BOTTOM_SHEET"
}

View file

@ -7,4 +7,5 @@ object WalletConnectScreenTestTags {
const val APP_NAME = "WALLET_CONNECT_SCREEN_APP_NAME"
const val APPROVE_ICON = "WALLET_CONNECT_SCREEN_APPROVE_ICON"
const val APP_URL = "WALLET_CONNECT_SCREEN_APP_URL"
const val WALLET_CONNECT_IMAGE = "WALLET_CONNECT_SCREEN_WALLET_CONNECT_IMAGE"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M11.413,2.426C12.757,2.426 13.43,2.426 13.943,2.688C14.395,2.918 14.762,3.285 14.992,3.736C15.254,4.25 15.253,4.922 15.253,6.266V9.736C15.253,11.079 15.254,11.752 14.992,12.265C14.762,12.716 14.395,13.084 13.943,13.314C13.43,13.575 12.757,13.575 11.413,13.575H4.587C3.243,13.575 2.57,13.575 2.057,13.314C1.605,13.084 1.238,12.716 1.008,12.265C0.746,11.752 0.746,11.079 0.746,9.736V6.266C0.746,4.922 0.746,4.25 1.008,3.736C1.238,3.285 1.605,2.918 2.057,2.688C2.57,2.426 3.243,2.426 4.587,2.426H11.413ZM8,5.063C7.876,5.063 7.814,5.063 7.763,5.073C7.551,5.115 7.386,5.281 7.344,5.492C7.334,5.544 7.333,5.606 7.333,5.729V7.334H5.729C5.606,7.334 5.544,7.334 5.492,7.344C5.281,7.386 5.115,7.551 5.073,7.763C5.063,7.815 5.063,7.877 5.063,8.001C5.063,8.124 5.063,8.186 5.073,8.238C5.115,8.449 5.281,8.615 5.492,8.657C5.544,8.667 5.606,8.667 5.729,8.667H7.333V10.271C7.333,10.394 7.334,10.456 7.344,10.508C7.386,10.719 7.551,10.885 7.763,10.927C7.814,10.937 7.876,10.938 8,10.938C8.124,10.938 8.186,10.937 8.238,10.927C8.449,10.885 8.615,10.719 8.657,10.508C8.667,10.456 8.667,10.394 8.667,10.271V8.667H10.27C10.394,8.667 10.456,8.667 10.508,8.657C10.719,8.615 10.885,8.449 10.927,8.238C10.937,8.186 10.937,8.124 10.937,8.001C10.937,7.877 10.937,7.815 10.927,7.763C10.885,7.551 10.719,7.386 10.508,7.344C10.456,7.333 10.394,7.334 10.27,7.334H8.667V5.729C8.667,5.606 8.667,5.544 8.657,5.492C8.615,5.281 8.449,5.115 8.238,5.073C8.186,5.063 8.124,5.063 8,5.063Z"
android:fillColor="#0099FF"
android:fillType="evenOdd"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<path
android:fillColor="#000000"
android:pathData="M8.857,6H7.575C7.486,6 7.407,6.058 7.377,6.146L4.006,15.851C3.981,15.924 4.032,16 4.105,16H5.388C5.476,16 5.555,15.942 5.586,15.855L8.956,6.149C8.981,6.076 8.93,6 8.857,6ZM10.416,10.067C10.383,9.97 10.252,9.97 10.218,10.067L9.554,11.981C9.537,12.03 9.537,12.084 9.554,12.133L10.846,15.854C10.876,15.942 10.955,16 11.044,16H12.326C12.399,16 12.45,15.924 12.425,15.851L10.416,10.067ZM13.685,11.941C13.719,12.038 13.849,12.038 13.883,11.941L15.894,6.149C15.919,6.076 15.868,6 15.795,6H14.513C14.424,6 14.345,6.058 14.315,6.146L13.02,9.874C13.003,9.923 13.003,9.977 13.02,10.026L13.685,11.941ZM11.157,6.144C11.127,6.058 11.048,6 10.96,6H9.674C9.585,6 9.506,6.058 9.476,6.145L6.106,15.851C6.081,15.924 6.132,16 6.205,16H7.487C7.576,16 7.655,15.942 7.685,15.855L10.265,8.423C10.282,8.374 10.348,8.374 10.365,8.423L12.945,15.855C12.976,15.942 13.055,16 13.143,16H14.425C14.499,16 14.55,15.924 14.524,15.851L11.157,6.144ZM17.895,6H16.612C16.524,6 16.445,6.058 16.414,6.145L14.07,12.898C14.053,12.946 14.053,13 14.07,13.049L14.735,14.964C14.768,15.061 14.899,15.061 14.933,14.964L17.253,8.28L17.993,6.149C18.019,6.076 17.968,6 17.895,6Z" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="19dp"
android:height="24dp"
android:viewportWidth="19"
android:viewportHeight="24">
<path
android:pathData="M12.632,12.113C12.632,12.331 12.552,12.511 12.382,12.682L8.287,16.687C8.148,16.825 7.984,16.889 7.787,16.889C7.388,16.889 7.063,16.575 7.063,16.176C7.063,15.979 7.149,15.798 7.292,15.655L10.93,12.118L7.292,8.57C7.149,8.427 7.063,8.251 7.063,8.049C7.063,7.65 7.388,7.331 7.787,7.331C7.984,7.331 8.148,7.4 8.287,7.538L12.382,11.543C12.558,11.714 12.632,11.894 12.632,12.113Z"
android:fillColor="#ffffff"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="17dp"
android:height="16dp"
android:viewportWidth="17"
android:viewportHeight="16">
<path
android:pathData="M10.49,1.932C10.866,2.174 11.072,2.631 10.988,3.121L10.323,7.004C10.312,7.067 10.355,7.127 10.418,7.138L12.198,7.443C12.706,7.53 12.997,7.933 13.079,8.318C13.162,8.702 13.063,9.161 12.713,9.481L7.814,13.946C7.422,14.304 6.898,14.317 6.51,14.067C6.135,13.825 5.928,13.368 6.012,12.878L6.677,8.995C6.688,8.932 6.646,8.872 6.582,8.861L4.803,8.556C4.295,8.469 4.003,8.066 3.921,7.681C3.839,7.297 3.937,6.838 4.288,6.519L9.186,2.053C9.579,1.695 10.102,1.682 10.49,1.932Z"
android:fillColor="#0099FF"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M12.054,1.505C13.173,1.505 13.733,1.505 14.161,1.723C14.537,1.914 14.843,2.221 15.035,2.597C15.253,3.024 15.253,3.585 15.253,4.705V11.296C15.253,12.416 15.253,12.976 15.035,13.404C14.843,13.781 14.537,14.087 14.161,14.278C13.733,14.496 13.173,14.496 12.054,14.496H3.946C2.827,14.496 2.267,14.496 1.839,14.278C1.463,14.087 1.157,13.78 0.965,13.404C0.747,12.976 0.746,12.416 0.746,11.296V4.705C0.746,3.585 0.747,3.024 0.965,2.597C1.157,2.221 1.463,1.914 1.839,1.723C2.267,1.505 2.827,1.505 3.946,1.505H12.054ZM3.597,10.534C3.21,10.535 2.897,10.848 2.896,11.234C2.896,11.621 3.21,11.934 3.597,11.935H6.563C6.949,11.935 7.263,11.621 7.263,11.234C7.263,10.848 6.949,10.534 6.563,10.534H3.597ZM10.921,6.947C10.535,6.947 10.221,7.261 10.221,7.647V9.544L9.72,9.043C9.446,8.77 9.003,8.77 8.729,9.043C8.456,9.316 8.457,9.76 8.729,10.033L10.426,11.729C10.699,12.002 11.142,12.002 11.415,11.729L13.111,10.034C13.384,9.761 13.384,9.317 13.111,9.044C12.838,8.771 12.394,8.77 12.121,9.043L11.62,9.544V7.647C11.62,7.261 11.307,6.947 10.921,6.947ZM3.597,7.301C3.21,7.301 2.897,7.615 2.896,8.001C2.897,8.387 3.21,8.701 3.597,8.701H6.563C6.949,8.701 7.262,8.387 7.263,8.001C7.263,7.615 6.949,7.301 6.563,7.301H3.597ZM3.597,4.066C3.21,4.067 2.897,4.38 2.896,4.767C2.896,5.153 3.21,5.467 3.597,5.467H6.563C6.949,5.467 7.263,5.153 7.263,4.767C7.263,4.38 6.949,4.066 6.563,4.066H3.597ZM9.438,4.066C9.051,4.067 8.737,4.38 8.737,4.767C8.737,5.153 9.051,5.467 9.438,5.467H12.403C12.79,5.467 13.104,5.153 13.104,4.767C13.103,4.38 12.79,4.067 12.403,4.066H9.438Z"
android:fillColor="#0099FF"/>
</vector>

View file

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<group>
<clip-path android:pathData="M15.573,6H6V16H15.573V6Z" />
<path
android:fillColor="#121212"
android:pathData="M13.951,16H6V7.623H7.819V14.376H13.951V15.999V16Z" />
<path
android:fillColor="#121212"
android:pathData="M13.95,9.245C14.847,9.245 15.573,8.519 15.573,7.623C15.573,6.727 14.847,6 13.95,6C13.054,6 12.328,6.727 12.328,7.623C12.328,8.519 13.054,9.245 13.95,9.245Z" />
</group>
</vector>

View file

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M4.559,7.397C5.105,7.397 5.547,7.839 5.547,8.385V13.432C5.547,13.977 5.105,14.419 4.559,14.419H1.91C1.364,14.419 0.922,13.977 0.922,13.432V8.385C0.922,7.839 1.364,7.397 1.91,7.397H4.559ZM2.773,8.382C2.482,8.382 2.246,8.617 2.246,8.908C2.246,9.199 2.482,9.435 2.773,9.435H3.695C3.986,9.435 4.221,9.199 4.221,8.908C4.221,8.617 3.986,8.382 3.695,8.382H2.773Z"
android:fillColor="#0099FF"
android:fillType="evenOdd"/>
<path
android:pathData="M9.376,1.58C9.887,1.58 10.267,1.58 10.596,1.668C11.485,1.905 12.179,2.598 12.417,3.484C12.473,3.693 12.493,3.923 12.501,4.194C12.597,4.203 12.689,4.213 12.778,4.225C13.375,4.305 13.902,4.479 14.324,4.9C14.746,5.322 14.922,5.848 15.002,6.443C15.078,7.011 15.078,7.727 15.078,8.596V9.971C15.078,10.84 15.078,11.557 15.002,12.124C14.922,12.72 14.746,13.246 14.324,13.667C13.902,14.089 13.375,14.263 12.778,14.343C12.209,14.419 11.491,14.419 10.619,14.419H6.666C6.658,14.419 6.65,14.419 6.642,14.419C6.784,14.12 6.865,13.785 6.865,13.432V8.385C6.865,7.112 5.833,6.08 4.56,6.08H1.91C1.557,6.08 1.221,6.16 0.922,6.302V3.506C0.922,2.442 1.786,1.58 2.852,1.58H9.376ZM12.271,8.29C11.645,8.29 11.138,8.797 11.138,9.423C11.138,10.048 11.645,10.555 12.271,10.555C12.896,10.555 13.404,10.048 13.404,9.423C13.403,8.797 12.896,8.29 12.271,8.29ZM2.852,2.864C2.497,2.864 2.208,3.151 2.208,3.506C2.208,3.86 2.497,4.148 2.852,4.148H10.619C10.825,4.148 11.022,4.148 11.211,4.149C11.205,3.983 11.194,3.892 11.173,3.816C11.054,3.373 10.707,3.026 10.263,2.908C10.12,2.869 9.926,2.864 9.286,2.864H2.852Z"
android:fillColor="#0099FF"
android:fillType="evenOdd"/>
</vector>

View file

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<path
android:fillColor="#000000"
android:pathData="M6.498,9.623C6.039,9.179 5.717,8.609 5.717,7.926V7.856C5.754,6.697 6.691,5.762 7.831,5.729H15.093C15.281,5.739 15.433,5.874 15.433,6.071V12.321C15.598,12.349 15.681,12.372 15.842,12.433C15.97,12.48 16.145,12.583 16.145,12.583V6.071C16.136,5.477 15.672,5 15.088,5H7.826C6.259,5.023 5,6.328 5,7.926C5,8.857 5.418,9.651 6.098,10.208C6.144,10.245 6.19,10.297 6.31,10.297C6.521,10.297 6.673,10.123 6.664,9.937C6.664,9.778 6.595,9.722 6.498,9.623Z" />
<path
android:fillColor="#000000"
android:pathData="M14.904,12.732H9.21C8.829,12.737 8.521,13.05 8.521,13.438V14.27C8.53,14.653 8.852,14.981 9.238,14.981H9.661V14.27H9.233V13.457C9.233,13.457 9.339,13.457 9.463,13.457C10.184,13.457 10.713,14.134 10.713,14.864C10.713,15.509 10.134,16.331 9.169,16.266C8.314,16.21 7.85,15.434 7.85,14.864V7.805C7.85,7.487 7.592,7.225 7.28,7.225H6.71V7.95H7.133V14.868C7.11,16.275 8.116,16.981 9.169,16.981L14.909,17C16.063,17 17,16.046 17,14.868C17.005,13.69 16.063,12.732 14.904,12.732ZM16.288,14.915C16.265,15.668 15.654,16.275 14.904,16.275L10.915,16.261C11.232,15.887 11.425,15.401 11.425,14.868C11.425,14.036 10.938,13.461 10.938,13.461H14.909C15.672,13.461 16.292,14.092 16.292,14.868L16.288,14.915Z" />
<path
android:fillColor="#000000"
android:pathData="M13.369,8.08H9.076V7.356H13.369C13.562,7.356 13.723,7.515 13.723,7.716C13.727,7.917 13.571,8.08 13.369,8.08Z" />
<path
android:fillColor="#000000"
android:pathData="M13.369,11.479H9.076V10.759H13.369C13.562,10.759 13.723,10.918 13.723,11.119C13.727,11.315 13.571,11.479 13.369,11.479Z" />
<path
android:fillColor="#000000"
android:pathData="M14.127,9.777H9.076V9.053H14.123C14.316,9.053 14.477,9.212 14.477,9.413C14.486,9.613 14.325,9.777 14.127,9.777Z" />
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M7.973,1.085C8.088,1.085 8.207,1.096 8.331,1.118C8.455,1.14 8.572,1.167 8.682,1.198C8.829,1.247 9.036,1.316 9.302,1.405C9.573,1.494 9.871,1.596 10.197,1.712C10.523,1.828 10.849,1.943 11.175,2.059C11.505,2.17 11.806,2.275 12.077,2.373C12.348,2.471 12.559,2.551 12.711,2.613C13.046,2.746 13.293,2.905 13.454,3.087C13.615,3.269 13.695,3.556 13.695,3.948V8.912C13.695,9.508 13.606,10.035 13.427,10.493C13.248,10.947 12.956,11.372 12.552,11.768C12.149,12.164 11.609,12.562 10.934,12.962C10.264,13.367 9.435,13.816 8.448,14.31C8.361,14.355 8.274,14.385 8.187,14.403C8.104,14.426 8.033,14.436 7.973,14.436C7.913,14.436 7.84,14.425 7.753,14.403C7.67,14.385 7.585,14.355 7.498,14.31C6.529,13.79 5.708,13.324 5.033,12.915C4.363,12.51 3.823,12.117 3.414,11.734C3.006,11.347 2.71,10.929 2.526,10.48C2.343,10.031 2.251,9.508 2.251,8.912V3.948C2.251,3.556 2.331,3.269 2.492,3.087C2.653,2.905 2.9,2.746 3.235,2.613C3.387,2.555 3.598,2.477 3.869,2.379C4.14,2.277 4.438,2.168 4.764,2.052C5.09,1.937 5.416,1.823 5.742,1.712C6.072,1.596 6.371,1.494 6.637,1.405C6.908,1.316 7.117,1.247 7.264,1.198C7.379,1.167 7.496,1.14 7.615,1.118C7.739,1.096 7.858,1.085 7.973,1.085ZM11.402,5.142C11.057,4.855 10.545,4.902 10.258,5.246L7.505,8.554L6.188,7.237C5.871,6.92 5.357,6.92 5.04,7.237C4.723,7.555 4.723,8.069 5.04,8.386L6.986,10.332C7.147,10.494 7.369,10.58 7.597,10.569C7.825,10.559 8.039,10.453 8.185,10.278L11.507,6.285C11.794,5.941 11.747,5.429 11.402,5.142Z"
android:fillColor="#0099FF"
android:fillType="evenOdd"/>
</vector>

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="17dp"
android:height="16dp"
android:viewportWidth="17"
android:viewportHeight="16">
<path
android:pathData="M10.313,1.505C10.524,1.505 10.708,1.652 10.755,1.858L11.08,3.303C11.318,4.358 12.142,5.182 13.196,5.42L14.642,5.745C14.848,5.792 14.995,5.975 14.995,6.187C14.995,6.399 14.848,6.583 14.642,6.629L13.196,6.955C12.142,7.193 11.318,8.016 11.08,9.071L10.755,10.516C10.708,10.723 10.524,10.87 10.313,10.87C10.101,10.87 9.917,10.723 9.87,10.516L9.545,9.071C9.307,8.016 8.484,7.193 7.429,6.955L5.984,6.629C5.777,6.583 5.63,6.399 5.63,6.187C5.63,5.975 5.777,5.792 5.984,5.745L7.429,5.42C8.484,5.182 9.307,4.358 9.545,3.303L9.87,1.858C9.917,1.652 10.101,1.505 10.313,1.505Z"
android:fillColor="#0099FF"/>
<path
android:pathData="M5.479,7.547C5.691,7.547 5.874,7.694 5.921,7.9L6.154,8.933C6.312,9.637 6.863,10.188 7.567,10.346L8.6,10.579C8.806,10.625 8.953,10.809 8.953,11.021C8.953,11.233 8.806,11.416 8.6,11.463L7.567,11.696C6.863,11.854 6.312,12.405 6.154,13.109L5.921,14.142C5.874,14.348 5.691,14.495 5.479,14.495C5.267,14.495 5.083,14.348 5.037,14.142L4.804,13.109C4.646,12.405 4.095,11.854 3.391,11.696L2.358,11.463C2.152,11.416 2.005,11.233 2.005,11.021C2.005,10.809 2.152,10.625 2.358,10.579L3.391,10.346C4.095,10.188 4.646,9.637 4.804,8.933L5.037,7.9C5.083,7.694 5.267,7.547 5.479,7.547Z"
android:fillColor="#0099FF"/>
</vector>

View file

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M12.94,10.526C13.241,10.375 13.608,10.497 13.758,10.798C13.909,11.099 13.786,11.465 13.485,11.615L8.459,14.129C8.422,14.148 8.3,14.215 8.16,14.241C8.054,14.261 7.945,14.261 7.839,14.241C7.7,14.215 7.578,14.148 7.541,14.129L2.515,11.615C2.214,11.465 2.091,11.099 2.241,10.798C2.392,10.497 2.758,10.375 3.059,10.526L8,12.995L12.94,10.526Z"
android:fillColor="#0099FF"/>
<path
android:pathData="M12.94,7.455C13.241,7.305 13.608,7.427 13.758,7.727C13.909,8.028 13.786,8.394 13.485,8.545L8.459,11.059C8.422,11.077 8.299,11.144 8.16,11.171C8.054,11.191 7.945,11.191 7.839,11.171C7.7,11.144 7.578,11.077 7.541,11.059L2.515,8.545C2.214,8.394 2.091,8.028 2.241,7.727C2.392,7.427 2.758,7.305 3.059,7.455L8,9.925L12.94,7.455Z"
android:fillColor="#0099FF"/>
<path
android:pathData="M8.08,1.749L8.16,1.76L8.261,1.786C8.355,1.817 8.431,1.857 8.459,1.871L13.485,4.385C13.692,4.488 13.822,4.7 13.823,4.93C13.823,5.161 13.691,5.372 13.485,5.475L8.459,7.989C8.422,8.008 8.299,8.074 8.16,8.1C8.054,8.12 7.945,8.12 7.839,8.1C7.7,8.074 7.578,8.008 7.541,7.989L2.514,5.475C2.308,5.372 2.177,5.161 2.177,4.93C2.177,4.7 2.308,4.488 2.514,4.385L7.541,1.871C7.578,1.853 7.7,1.786 7.839,1.76L7.92,1.749C7.973,1.744 8.026,1.744 8.08,1.749Z"
android:fillColor="#0099FF"/>
</vector>

View file

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<group>
<clip-path android:pathData="M11,0L11,0A11,11 0,0 1,22 11L22,11A11,11 0,0 1,11 22L11,22A11,11 0,0 1,0 11L0,11A11,11 0,0 1,11 0z" />
<path
android:fillColor="#ffffff"
android:pathData="M11,0L11,0A11,11 0,0 1,22 11L22,11A11,11 0,0 1,11 22L11,22A11,11 0,0 1,0 11L0,11A11,11 0,0 1,11 0z" />
<path
android:fillColor="#181818"
android:pathData="M0,0h22v22h-22z" />
<path
android:fillColor="#EF8220"
android:pathData="M8.857,6H7.575C7.486,6 7.407,6.058 7.377,6.146L4.006,15.851C3.981,15.924 4.032,16 4.105,16H5.388C5.476,16 5.555,15.942 5.586,15.855L8.956,6.149C8.981,6.076 8.93,6 8.857,6ZM10.416,10.067C10.383,9.97 10.252,9.97 10.218,10.067L9.554,11.981C9.537,12.03 9.537,12.084 9.554,12.133L10.846,15.854C10.876,15.942 10.955,16 11.044,16H12.326C12.399,16 12.45,15.924 12.425,15.851L10.416,10.067ZM13.685,11.941C13.719,12.038 13.849,12.038 13.883,11.941L15.894,6.149C15.919,6.076 15.868,6 15.795,6H14.513C14.424,6 14.345,6.058 14.315,6.146L13.02,9.874C13.003,9.923 13.003,9.977 13.02,10.026L13.685,11.941ZM11.157,6.144C11.127,6.058 11.048,6 10.96,6H9.674C9.585,6 9.506,6.058 9.476,6.145L6.106,15.851C6.081,15.924 6.132,16 6.205,16H7.487C7.576,16 7.655,15.942 7.685,15.855L10.265,8.423C10.282,8.374 10.348,8.374 10.365,8.423L12.945,15.855C12.976,15.942 13.055,16 13.143,16H14.425C14.499,16 14.55,15.924 14.524,15.851L11.157,6.144ZM17.895,6H16.612C16.524,6 16.445,6.058 16.414,6.145L14.07,12.898C14.053,12.946 14.053,13 14.07,13.049L14.735,14.964C14.768,15.061 14.899,15.061 14.933,14.964L17.253,8.28L17.993,6.149C18.019,6.076 17.968,6 17.895,6Z" />
</group>
</vector>

View file

@ -0,0 +1,26 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<group>
<clip-path
android:pathData="M11,0L11,0A11,11 0,0 1,22 11L22,11A11,11 0,0 1,11 22L11,22A11,11 0,0 1,0 11L0,11A11,11 0,0 1,11 0z"/>
<path
android:pathData="M11,0L11,0A11,11 0,0 1,22 11L22,11A11,11 0,0 1,11 22L11,22A11,11 0,0 1,0 11L0,11A11,11 0,0 1,11 0z"
android:fillColor="#ffffff"/>
<path
android:pathData="M0,0h22v22h-22z"
android:fillColor="#61DFFF"/>
<group>
<clip-path
android:pathData="M15.573,6H6V16H15.573V6Z"/>
<path
android:pathData="M13.951,16H6V7.623H7.819V14.376H13.951V15.999V16Z"
android:fillColor="#121212"/>
<path
android:pathData="M13.95,9.245C14.847,9.245 15.573,8.519 15.573,7.623C15.573,6.727 14.847,6 13.95,6C13.054,6 12.328,6.727 12.328,7.623C12.328,8.519 13.054,9.245 13.95,9.245Z"
android:fillColor="#121212"/>
</group>
</group>
</vector>

View file

@ -0,0 +1,36 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<group>
<clip-path android:pathData="M11,0L11,0A11,11 0,0 1,22 11L22,11A11,11 0,0 1,11 22L11,22A11,11 0,0 1,0 11L0,11A11,11 0,0 1,11 0z" />
<path
android:fillColor="#ffffff"
android:pathData="M11,0L11,0A11,11 0,0 1,22 11L22,11A11,11 0,0 1,11 22L11,22A11,11 0,0 1,0 11L0,11A11,11 0,0 1,11 0z" />
<path
android:fillColor="#FFEEDA"
android:pathData="M0,0h22v22h-22z" />
<path
android:fillColor="#FFEEDA"
android:pathData="M16.145,13.145V6.07C16.136,5.477 15.672,5 15.088,5H7.826C6.259,5.023 5,6.327 5,7.925C5,8.463 5.142,8.925 5.358,9.332C5.542,9.668 5.832,9.986 6.117,10.224C6.2,10.29 6.158,10.262 6.406,10.416C6.746,10.626 7.137,10.734 7.137,10.734L7.132,14.967C7.142,15.168 7.16,15.36 7.215,15.542C7.376,16.14 7.785,16.598 8.337,16.818C8.566,16.911 8.828,16.972 9.109,16.977L14.909,16.996C16.062,16.996 17,16.042 17,14.865C17.004,14.164 16.66,13.538 16.145,13.145Z" />
<path
android:fillColor="#EBC28E"
android:pathData="M16.287,14.916C16.264,15.668 15.653,16.276 14.904,16.276L10.915,16.262C11.232,15.888 11.425,15.402 11.425,14.87C11.425,14.038 10.938,13.463 10.938,13.463H14.909C15.672,13.463 16.292,14.094 16.292,14.87L16.287,14.916Z" />
<path
android:fillColor="#101010"
android:pathData="M6.498,9.626C6.039,9.183 5.717,8.612 5.717,7.93V7.86C5.754,6.701 6.691,5.767 7.831,5.734H15.092C15.281,5.743 15.433,5.879 15.433,6.075V12.323C15.598,12.351 15.681,12.374 15.842,12.435C15.97,12.482 16.145,12.585 16.145,12.585V6.075C16.136,5.482 15.672,5.005 15.088,5.005H7.826C6.259,5.028 5,6.332 5,7.93C5,8.86 5.418,9.655 6.098,10.211C6.144,10.248 6.19,10.299 6.31,10.299C6.521,10.299 6.673,10.127 6.664,9.94C6.664,9.781 6.595,9.725 6.498,9.626Z" />
<path
android:fillColor="#101010"
android:pathData="M14.904,12.733H9.21C8.829,12.738 8.521,13.051 8.521,13.439V14.271C8.53,14.654 8.852,14.981 9.238,14.981H9.661V14.271H9.233V13.458C9.233,13.458 9.339,13.458 9.463,13.458C10.184,13.458 10.713,14.135 10.713,14.864C10.713,15.509 10.134,16.332 9.169,16.266C8.314,16.21 7.85,15.434 7.85,14.864V7.808C7.85,7.49 7.592,7.229 7.28,7.229H6.71V7.953H7.133V14.869C7.11,16.276 8.116,16.981 9.169,16.981L14.909,17C16.063,17 17,16.047 17,14.869C17.005,13.691 16.063,12.733 14.904,12.733ZM16.288,14.916C16.265,15.668 15.653,16.276 14.904,16.276L10.915,16.262C11.232,15.888 11.425,15.402 11.425,14.869C11.425,14.037 10.938,13.462 10.938,13.462H14.909C15.672,13.462 16.292,14.093 16.292,14.869L16.288,14.916Z" />
<path
android:fillColor="#101010"
android:pathData="M13.369,8.084H9.076V7.36H13.369C13.562,7.36 13.723,7.519 13.723,7.72C13.727,7.921 13.571,8.084 13.369,8.084Z" />
<path
android:fillColor="#101010"
android:pathData="M13.369,11.482H9.076V10.762H13.369C13.562,10.762 13.723,10.921 13.723,11.122C13.727,11.318 13.571,11.482 13.369,11.482Z" />
<path
android:fillColor="#101010"
android:pathData="M14.127,9.78H9.076V9.056H14.123C14.316,9.056 14.477,9.215 14.477,9.416C14.486,9.617 14.325,9.78 14.127,9.78Z" />
</group>
</vector>