Updated on 2026-08-14
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
BIN
core/ui/src/main/res/drawable-hdpi/img_hardware_wallet.webp
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
core/ui/src/main/res/drawable-hdpi/img_mobile_wallet.webp
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
core/ui/src/main/res/drawable-mdpi/img_hardware_wallet.webp
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
core/ui/src/main/res/drawable-mdpi/img_mobile_wallet.webp
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
core/ui/src/main/res/drawable-xhdpi/img_hardware_wallet.webp
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
BIN
core/ui/src/main/res/drawable-xhdpi/img_mobile_wallet.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
core/ui/src/main/res/drawable-xxhdpi/img_hardware_wallet.webp
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
core/ui/src/main/res/drawable-xxhdpi/img_mobile_wallet.webp
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
core/ui/src/main/res/drawable-xxxhdpi/img_hardware_wallet.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
core/ui/src/main/res/drawable-xxxhdpi/img_mobile_wallet.webp
Normal file
|
After Width: | Height: | Size: 128 KiB |
9
core/ui/src/main/res/drawable/ic_chevron_right_18x24.xml
Normal 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>
|
||||
9
core/ui/src/main/res/drawable/ic_flash_16.xml
Normal 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>
|
||||
10
core/ui/src/main/res/drawable/ic_shield_check_16.xml
Normal 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>
|
||||
12
core/ui/src/main/res/drawable/ic_sparkles_16.xml
Normal 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>
|
||||
15
core/ui/src/main/res/drawable/ic_stack_fill_new_16.xml
Normal 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>
|
||||