Updated on 2026-08-14

This commit is contained in:
Tangem 2026-04-22 14:26:49 +03:00
parent 3baed1e815
commit 5e3da8cc47
3 changed files with 267 additions and 0 deletions

View file

@ -0,0 +1,79 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<path
android:pathData="M28,12C28,10.343 29.343,9 31,9C32.657,9 34,10.343 34,12V31C34,32.657 32.657,34 31,34C29.343,34 28,32.657 28,31V12Z"
android:fillColor="#27B456"/>
<path
android:pathData="M28,12C28,10.343 29.343,9 31,9C32.657,9 34,10.343 34,12V31C34,32.657 32.657,34 31,34C29.343,34 28,32.657 28,31V12Z"
android:fillAlpha="0.2">
<aapt:attr name="android:fillColor">
<gradient
android:startX="31"
android:startY="9"
android:endX="31"
android:endY="30.499"
android:type="linear">
<item android:offset="0" android:color="#00FFFFFF"/>
<item android:offset="1" android:color="#FFFFFFFF"/>
</gradient>
</aapt:attr>
</path>
<path
android:strokeWidth="1"
android:pathData="M31,9.5C32.381,9.5 33.5,10.619 33.5,12V31C33.5,32.381 32.381,33.5 31,33.5C29.619,33.5 28.5,32.381 28.5,31V12C28.5,10.619 29.619,9.5 31,9.5Z"
android:strokeAlpha="0.15"
android:fillColor="#00000000"
android:strokeColor="#ffffff"/>
<path
android:pathData="M17,19C17,17.343 18.343,16 20,16C21.657,16 23,17.343 23,19V31C23,32.657 21.657,34 20,34C18.343,34 17,32.657 17,31V19Z"
android:fillColor="#27B456"/>
<path
android:pathData="M17,19C17,17.343 18.343,16 20,16C21.657,16 23,17.343 23,19V31C23,32.657 21.657,34 20,34C18.343,34 17,32.657 17,31V19Z"
android:fillAlpha="0.2">
<aapt:attr name="android:fillColor">
<gradient
android:startX="20"
android:startY="16"
android:endX="20"
android:endY="31.48"
android:type="linear">
<item android:offset="0" android:color="#00FFFFFF"/>
<item android:offset="1" android:color="#FFFFFFFF"/>
</gradient>
</aapt:attr>
</path>
<path
android:strokeWidth="1"
android:pathData="M20,16.5C21.381,16.5 22.5,17.619 22.5,19V31C22.5,32.381 21.381,33.5 20,33.5C18.619,33.5 17.5,32.381 17.5,31V19C17.5,17.619 18.619,16.5 20,16.5Z"
android:strokeAlpha="0.15"
android:fillColor="#00000000"
android:strokeColor="#ffffff"/>
<path
android:pathData="M6,25C6,23.343 7.343,22 9,22C10.657,22 12,23.343 12,25V31C12,32.657 10.657,34 9,34C7.343,34 6,32.657 6,31V25Z"
android:fillColor="#27B456"/>
<path
android:pathData="M6,25C6,23.343 7.343,22 9,22C10.657,22 12,23.343 12,25V31C12,32.657 10.657,34 9,34C7.343,34 6,32.657 6,31V25Z"
android:fillAlpha="0.2">
<aapt:attr name="android:fillColor">
<gradient
android:startX="9"
android:startY="22"
android:endX="9"
android:endY="32.32"
android:type="linear">
<item android:offset="0" android:color="#00FFFFFF"/>
<item android:offset="1" android:color="#FFFFFFFF"/>
</gradient>
</aapt:attr>
</path>
<path
android:strokeWidth="1"
android:pathData="M9,22.5C10.381,22.5 11.5,23.619 11.5,25V31C11.5,32.381 10.381,33.5 9,33.5C7.619,33.5 6.5,32.381 6.5,31V25C6.5,23.619 7.619,22.5 9,22.5Z"
android:strokeAlpha="0.15"
android:fillColor="#00000000"
android:strokeColor="#ffffff"/>
</vector>

View file

@ -0,0 +1,64 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<path
android:pathData="M28,12C28,10.343 29.343,9 31,9C32.657,9 34,10.343 34,12V31C34,32.657 32.657,34 31,34C29.343,34 28,32.657 28,31V12Z"
android:fillColor="#454545"
android:fillAlpha="0.2"/>
<path
android:pathData="M28,12C28,10.343 29.343,9 31,9C32.657,9 34,10.343 34,12V31C34,32.657 32.657,34 31,34C29.343,34 28,32.657 28,31V12Z"
android:fillAlpha="0.2">
<aapt:attr name="android:fillColor">
<gradient
android:startX="31"
android:startY="-3.608"
android:endX="31"
android:endY="44.868"
android:type="linear">
<item android:offset="0" android:color="#00FFFFFF"/>
<item android:offset="1" android:color="#FFFFFFFF"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M17,19C17,17.343 18.343,16 20,16C21.657,16 23,17.343 23,19V31C23,32.657 21.657,34 20,34C18.343,34 17,32.657 17,31V19Z"
android:fillColor="#454545"
android:fillAlpha="0.2"/>
<path
android:pathData="M17,19C17,17.343 18.343,16 20,16C21.657,16 23,17.343 23,19V31C23,32.657 21.657,34 20,34C18.343,34 17,32.657 17,31V19Z"
android:fillAlpha="0.2">
<aapt:attr name="android:fillColor">
<gradient
android:startX="20"
android:startY="6.922"
android:endX="20"
android:endY="41.825"
android:type="linear">
<item android:offset="0" android:color="#00FFFFFF"/>
<item android:offset="1" android:color="#FFFFFFFF"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M6,25C6,23.343 7.343,22 9,22C10.657,22 12,23.343 12,25V31C12,32.657 10.657,34 9,34C7.343,34 6,32.657 6,31V25Z"
android:fillColor="#454545"
android:fillAlpha="0.2"/>
<path
android:pathData="M6,25C6,23.343 7.343,22 9,22C10.657,22 12,23.343 12,25V31C12,32.657 10.657,34 9,34C7.343,34 6,32.657 6,31V25Z"
android:fillAlpha="0.2">
<aapt:attr name="android:fillColor">
<gradient
android:startX="9"
android:startY="15.948"
android:endX="9"
android:endY="39.217"
android:type="linear">
<item android:offset="0" android:color="#00FFFFFF"/>
<item android:offset="1" android:color="#FFFFFFFF"/>
</gradient>
</aapt:attr>
</path>
</vector>

View file

@ -0,0 +1,124 @@
package com.tangem.features.yield.supply.impl.main.model.converter
import com.google.common.truth.Truth.assertThat
import com.tangem.common.ui.earn.EarnBlockUM
import com.tangem.core.ui.extensions.stringReference
import com.tangem.features.yield.supply.impl.main.entity.YieldSupplyUM
import org.junit.jupiter.api.Test
internal class YieldSupplyToEarnBlockConverterTest {
private val converter = YieldSupplyToEarnBlockConverter()
@Test
fun `GIVEN Initial WHEN convert THEN null`() {
val result = converter.convert(YieldSupplyUM.Initial)
assertThat(result).isNull()
}
@Test
fun `GIVEN Unavailable WHEN convert THEN null`() {
val result = converter.convert(YieldSupplyUM.Unavailable)
assertThat(result).isNull()
}
@Test
fun `GIVEN Loading WHEN convert THEN EarnBlockUM Loading`() {
val result = converter.convert(YieldSupplyUM.Loading)
assertThat(result).isEqualTo(EarnBlockUM.Loading)
}
@Test
fun `GIVEN Content WHEN convert THEN Content`() {
var clicked = false
val content = YieldSupplyUM.Content(
apy = "5.1",
title = stringReference("Yield Mode"),
subtitle = stringReference("Interest accrues automatically"),
rewardsApy = stringReference("APY 5.1%"),
onClick = { clicked = true },
showWarningIcon = false,
showInfoIcon = false,
)
val result = converter.convert(content)
assertThat(result).isInstanceOf(EarnBlockUM.Content::class.java)
val earnBlock = result as EarnBlockUM.Content
assertThat(earnBlock.type).isEqualTo(EarnBlockUM.Type.YieldSupply)
assertThat(earnBlock.backgroundUM).isEqualTo(EarnBlockUM.BackgroundUM.Surface)
assertThat(earnBlock.iconUM).isInstanceOf(EarnBlockUM.IconUM.Glowing::class.java)
assertThat(earnBlock.titleUM.tone).isEqualTo(EarnBlockUM.TitleUM.Tone.Primary)
assertThat((earnBlock.subtitleUM as EarnBlockUM.SubtitleUM.Text).tone)
.isEqualTo(EarnBlockUM.SubtitleUM.Tone.Accent)
assertThat(earnBlock.trailingUM).isInstanceOf(EarnBlockUM.TrailingUM.Button::class.java)
val button = earnBlock.trailingUM as EarnBlockUM.TrailingUM.Button
assertThat(button.isEnabled).isTrue()
assertThat(earnBlock.onClick).isNotNull()
earnBlock.onClick?.invoke()
assertThat(clicked).isTrue()
}
@Test
fun `GIVEN Processing Enter WHEN convert THEN Surface Content`() {
val result = converter.convert(YieldSupplyUM.Processing.Enter)
assertThat(result).isInstanceOf(EarnBlockUM.Content::class.java)
val earnBlock = result as EarnBlockUM.Content
assertThat(earnBlock.type).isEqualTo(EarnBlockUM.Type.YieldSupply)
assertThat(earnBlock.backgroundUM).isEqualTo(EarnBlockUM.BackgroundUM.Surface)
assertThat(earnBlock.iconUM).isInstanceOf(EarnBlockUM.IconUM.Glowing::class.java)
assertThat(earnBlock.trailingUM).isNull()
}
@Test
fun `GIVEN Processing Exit WHEN convert THEN Surface Content`() {
val result = converter.convert(YieldSupplyUM.Processing.Exit)
assertThat(result).isInstanceOf(EarnBlockUM.Content::class.java)
val earnBlock = result as EarnBlockUM.Content
assertThat(earnBlock.type).isEqualTo(EarnBlockUM.Type.YieldSupply)
assertThat(earnBlock.backgroundUM).isEqualTo(EarnBlockUM.BackgroundUM.Surface)
assertThat(earnBlock.iconUM).isInstanceOf(EarnBlockUM.IconUM.Plain::class.java)
assertThat(earnBlock.trailingUM).isNull()
}
@Test
fun `GIVEN Available WHEN convert THEN Content with expected structure`() {
var clicked = false
val available = YieldSupplyUM.Available(
apy = "5.1",
apyText = stringReference("5.1 % APY"),
title = stringReference("Yield Mode"),
onClick = { clicked = true },
)
val result = converter.convert(available)
assertThat(result).isInstanceOf(EarnBlockUM.Content::class.java)
val content = result as EarnBlockUM.Content
assertThat(content.type).isEqualTo(EarnBlockUM.Type.YieldSupply)
assertThat(content.backgroundUM).isEqualTo(EarnBlockUM.BackgroundUM.AccentSoft)
assertThat(content.iconUM).isInstanceOf(EarnBlockUM.IconUM.Glowing::class.java)
assertThat(content.titleUM.style).isEqualTo(EarnBlockUM.TitleUM.Style.Large)
assertThat(content.titleUM.tone).isEqualTo(EarnBlockUM.TitleUM.Tone.Primary)
assertThat(content.subtitleUM).isInstanceOf(EarnBlockUM.SubtitleUM.Text::class.java)
val subtitle = content.subtitleUM as EarnBlockUM.SubtitleUM.Text
assertThat(subtitle.style).isEqualTo(EarnBlockUM.SubtitleUM.Style.Small)
assertThat(subtitle.tone).isEqualTo(EarnBlockUM.SubtitleUM.Tone.Accent)
assertThat(content.trailingUM).isInstanceOf(EarnBlockUM.TrailingUM.Button::class.java)
val button = content.trailingUM as EarnBlockUM.TrailingUM.Button
assertThat(button.isEnabled).isTrue()
assertThat(content.onClick).isNotNull()
content.onClick?.invoke()
assertThat(clicked).isTrue()
}
}