Updated on 2026-08-14

This commit is contained in:
Tangem 2025-10-10 13:51:10 +05:00
parent 499351d5a9
commit 2bc8c29f6d
31 changed files with 1086 additions and 7 deletions

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

@ -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

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,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,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>