diff --git a/app/src/main/java/com/kaajjo/libresudoku/core/Constants.kt b/app/src/main/java/com/kaajjo/libresudoku/core/Constants.kt new file mode 100644 index 00000000..6efcb4f5 --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/core/Constants.kt @@ -0,0 +1,9 @@ +package com.kaajjo.libresudoku.core + +const val GITHUB_REPOSITORY = "https://github.com/kaajjo/Libre-Sudoku" +const val WEBLATE_ENGAGE = "https://hosted.weblate.org/engage/libresudoku/" +const val TELEGRAM_CHANNEL = "https://t.me/libresudoku" +const val CRYPTO_BTC = "bc1qhpx222kmk5v6tqrra524fezwjqr0lhjq77ee8q" +const val CRYPTO_TON = "EQCKG3oMsmOlsLrskCKl_xOF1DZezscfEp4QCOlS62H59AH7" +const val CRYPTO_USDT_TRC20 = "TDLEHdTVrWGU36h1q742AorJxUA6qyMUzV" +const val CARD_MIR = "2202 2080 8068 0045" \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/more/about/AboutScreen.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/more/about/AboutScreen.kt index 3d1bb21a..88543bbd 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/ui/more/about/AboutScreen.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/more/about/AboutScreen.kt @@ -1,40 +1,78 @@ package com.kaajjo.libresudoku.ui.more.about +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.FlowRowScope import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Info +import androidx.compose.material.icons.rounded.ContentCopy +import androidx.compose.material.icons.rounded.Payments import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar +import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp import com.kaajjo.libresudoku.BuildConfig import com.kaajjo.libresudoku.R +import com.kaajjo.libresudoku.core.CARD_MIR +import com.kaajjo.libresudoku.core.CRYPTO_BTC +import com.kaajjo.libresudoku.core.CRYPTO_TON +import com.kaajjo.libresudoku.core.CRYPTO_USDT_TRC20 +import com.kaajjo.libresudoku.core.GITHUB_REPOSITORY +import com.kaajjo.libresudoku.core.TELEGRAM_CHANNEL +import com.kaajjo.libresudoku.core.WEBLATE_ENGAGE import com.kaajjo.libresudoku.destinations.AboutLibrariesScreenDestination import com.kaajjo.libresudoku.ui.components.AnimatedNavigation -import com.kaajjo.libresudoku.ui.components.PreferenceRow +import com.kaajjo.libresudoku.ui.theme.ColorUtils.harmonizeWithPrimary +import com.kaajjo.libresudoku.ui.theme.icons.Bitcoin +import com.kaajjo.libresudoku.ui.theme.icons.ExteraGram +import com.kaajjo.libresudoku.ui.theme.icons.LibreSudokuIconAlt +import com.kaajjo.libresudoku.ui.theme.icons.Mir +import com.kaajjo.libresudoku.ui.theme.icons.Ton +import com.kaajjo.libresudoku.ui.theme.icons.Usdt import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.navigation.DestinationsNavigator @Destination(style = AnimatedNavigation::class) -@OptIn(ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable fun AboutScreen( navigator: DestinationsNavigator ) { + val uriHandler = LocalUriHandler.current + val clipboardManager = LocalClipboardManager.current + Scaffold( topBar = { TopAppBar( @@ -49,59 +87,255 @@ fun AboutScreen( } ) } - ) { + ) { paddingValues -> Column( modifier = Modifier - .padding(it) + .padding(paddingValues) .fillMaxWidth() + .verticalScroll(rememberScrollState()) ) { + + Box( + modifier = Modifier + .clip(CircleShape) + .background(MaterialTheme.colorScheme.surfaceContainerHighest) + .align(Alignment.CenterHorizontally) + ) { + Icon( + modifier = Modifier + .padding(12.dp) + .align(Alignment.Center) + .size(48.dp), + imageVector = Icons.Rounded.LibreSudokuIconAlt, + contentDescription = null + ) + } + Spacer(modifier = Modifier.height(16.dp)) Row( modifier = Modifier - .fillMaxWidth() - .padding(vertical = 8.dp), + .fillMaxWidth(), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically ) { - Icon( - modifier = Modifier.size(56.dp), - painter = painterResource(R.drawable.ic_launcher_foreground), - contentDescription = null, - ) Text( text = stringResource(R.string.app_name), style = MaterialTheme.typography.titleLarge ) } + Spacer(modifier = Modifier.height(4.dp)) + Box( + modifier = Modifier + .clip(MaterialTheme.shapes.large) + .background(MaterialTheme.colorScheme.surfaceContainerHighest) + .align(Alignment.CenterHorizontally) + ) { + Text( + "Версия ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})", + style = MaterialTheme.typography.labelMedium, + modifier = Modifier.padding(vertical = 4.dp, horizontal = 8.dp) + ) + } - HorizontalDivider() - - PreferenceRow( - title = stringResource(R.string.about_version), - subtitle = BuildConfig.VERSION_NAME, - painter = painterResource(R.drawable.ic_outline_info_24), - ) + FlowRow( + modifier = Modifier + .padding(horizontal = 12.dp, vertical = 8.dp) + .align(Alignment.CenterHorizontally) + .fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + maxItemsInEachRow = 3 + ) { + AboutSectionBox( + title = stringResource(R.string.about_github_project), + subtitle = stringResource(R.string.about_github_source_code), + icon = ImageVector.vectorResource(R.drawable.ic_github_24dp), + onClick = { uriHandler.openUri(GITHUB_REPOSITORY) } + ) + AboutSectionBox( + title = stringResource(R.string.weblate), + subtitle = stringResource(R.string.help_translate), + icon = ImageVector.vectorResource(R.drawable.ic_weblate), + onClick = { uriHandler.openUri(WEBLATE_ENGAGE) } + ) + AboutSectionBox( + title = stringResource(R.string.telegram), + subtitle = stringResource(R.string.telegram_link), + icon = Icons.Rounded.ExteraGram, + onClick = { uriHandler.openUri(TELEGRAM_CHANNEL) } + ) + AboutSectionBox( + title = stringResource(R.string.libraries_licenses), + subtitle = stringResource(R.string.libraries_licenses_title), + icon = Icons.Outlined.Info, + onClick = { navigator.navigate(AboutLibrariesScreenDestination()) } + ) + } - val uriHandler = LocalUriHandler.current - PreferenceRow( - title = stringResource(R.string.about_github_project), - painter = painterResource(R.drawable.ic_github_24dp), - onClick = { - uriHandler.openUri("https://github.com/kaajjo/Libre-Sudoku") + Box( + modifier = Modifier + .padding(horizontal = 12.dp) + .clip(MaterialTheme.shapes.large) + .background(MaterialTheme.colorScheme.surfaceContainer) + .fillMaxWidth() + ) { + Column( + modifier = Modifier + .padding(vertical = 12.dp, horizontal = 8.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Spacer(modifier = Modifier.width(4.dp)) + Icon( + imageVector = Icons.Rounded.Payments, + contentDescription = null + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = stringResource(R.string.donation_title), + style = MaterialTheme.typography.titleMedium + ) + } + Column( + modifier = Modifier + .padding(top = 4.dp) + .clip(MaterialTheme.shapes.medium) + .background(MaterialTheme.colorScheme.surfaceColorAtElevation(7.dp)) + ) { + Text( + text = stringResource(R.string.donation_description), + style = MaterialTheme.typography.labelMedium, + modifier = Modifier.padding(8.dp) + ) + } + Spacer(modifier = Modifier.height(8.dp)) + Column( + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + DonationItem( + title = stringResource(R.string.crypto_bitcoin), + information = CRYPTO_BTC, + icon = Icons.Filled.Bitcoin, + onClick = { clipboardManager.setText(AnnotatedString(text = CRYPTO_BTC)) } + ) + DonationItem( + title = stringResource(R.string.crypto_ton), + information = CRYPTO_TON, + icon = Icons.Rounded.Ton, + onClick = { clipboardManager.setText(AnnotatedString(text = CRYPTO_TON)) } + ) + DonationItem( + title = stringResource(R.string.crypto_usdt), + information = CRYPTO_USDT_TRC20, + icon = Icons.Rounded.Usdt, + onClick = { clipboardManager.setText(AnnotatedString(text = CRYPTO_USDT_TRC20)) } + ) + DonationItem( + title = stringResource(R.string.card_mir), + information = CARD_MIR, + icon = Icons.Filled.Mir, + onClick = { clipboardManager.setText(AnnotatedString(text = CARD_MIR.filter { it != ' ' })) } + ) + } } - ) + } + } + } +} - PreferenceRow( - title = stringResource(R.string.help_translate), - painter = painterResource(R.drawable.ic_weblate), - onClick = { - uriHandler.openUri("https://hosted.weblate.org/engage/libresudoku/") - } - ) - PreferenceRow( - title = stringResource(R.string.libraries_licenses_title), - painter = painterResource(R.drawable.ic_outline_info_24), - onClick = { navigator.navigate(AboutLibrariesScreenDestination()) } +@OptIn(ExperimentalLayoutApi::class) +@Composable +fun FlowRowScope.AboutSectionBox( + title: String, + icon: ImageVector, + onClick: () -> Unit, + modifier: Modifier = Modifier, + subtitle: String? = null, + additionalContent: @Composable (ColumnScope.() -> Unit)? = null +) { + Box( + modifier = modifier + .clip(MaterialTheme.shapes.large) + .background(MaterialTheme.colorScheme.surfaceContainer) + .fillMaxRowHeight() + .weight(1f) + .clickable(onClick = onClick) + ) { + Column( + modifier = Modifier.padding(16.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = icon, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurface.harmonizeWithPrimary(), + modifier = Modifier.size(24.dp) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = title, + style = MaterialTheme.typography.titleLarge + ) + } + if (subtitle != null) { + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = subtitle + ) + } + if (additionalContent != null) { + additionalContent() + } + } + } +} + +@Composable +fun DonationItem( + title: String, + information: String, + icon: ImageVector, + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier + .clip(MaterialTheme.shapes.medium) + .background(MaterialTheme.colorScheme.surfaceContainerHighest.harmonizeWithPrimary()) + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(start = 12.dp, top = 8.dp, bottom = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + + Row( + modifier = Modifier.weight(1f), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = icon, + contentDescription = null + ) + Spacer(modifier = Modifier.width(8.dp)) + Column { + Text( + text = title, + style = MaterialTheme.typography.labelLarge + ) + Text( + text = information, + style = MaterialTheme.typography.bodySmall + ) + } + } + IconButton(onClick = onClick) { + Icon( + imageVector = Icons.Rounded.ContentCopy, + contentDescription = null ) } } diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Bitcoin.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Bitcoin.kt new file mode 100644 index 00000000..9e33f100 --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Bitcoin.kt @@ -0,0 +1,12 @@ +package com.kaajjo.libresudoku.ui.theme.icons + +import androidx.compose.material.icons.Icons +import com.kaajjo.libresudoku.ui.util.iconFromXmlPath + +val Icons.Filled.Bitcoin by lazy { + iconFromXmlPath( + pathStr = "M11.5 11.5v-2.5c1.75 0 2.789.25 2.789 1.25 0 1.172-1.684 1.25-2.789 1.25zm0 .997v2.503c1.984 0 3.344-.188 3.344-1.258 0-1.148-1.469-1.245-3.344-1.245zm12.5-.497c0 6.627-5.373 12-12 12s-12-5.373-12-12 5.373-12 12-12 12 5.373 12 12zm-7 1.592c0-1.279-1.039-1.834-1.789-2.025.617-.223 1.336-1.138 1.046-2.228-.245-.922-1.099-1.74-3.257-1.813v-1.526h-1v1.5h-.5v-1.5h-1v1.5h-2.5v1.5h.817c.441 0 .683.286.683.702v4.444c0 .429-.253.854-.695.854h-.539l-.25 1.489h2.484v1.511h1v-1.511h.5v1.511h1v-1.5c2.656 0 4-1.167 4-2.908z", + viewportHeight = 24f, + viewportWidth = 24f + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/ExteraGram.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/ExteraGram.kt new file mode 100644 index 00000000..98ebde0c --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/ExteraGram.kt @@ -0,0 +1,12 @@ +package com.kaajjo.libresudoku.ui.theme.icons + +import androidx.compose.material.icons.Icons +import com.kaajjo.libresudoku.ui.util.iconFromXmlPath + +val Icons.Rounded.ExteraGram by lazy { + iconFromXmlPath( + pathStr = "M 31.2 2.5 c 2.8 -0.9 4.5 0.6 3.6 3.4 c -2.3 7.1 -6.7 20.1 -9.5 28.2 c -0.7 2.1 -4.1 2.1 -5 0 c -1.5 -3.6 -3.6 -7.8 -6.6 -10.8 c -2.8 -2.9 -6.8 -5 -10.3 -6.5 c -2.1 -0.9 -2.2 -4.5 0 -5.2 l 27.7 -9.1 Z", + viewportHeight = 36f, + viewportWidth = 36f + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/LibreSudokuAlt.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/LibreSudokuAlt.kt new file mode 100644 index 00000000..5f4d2e15 --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/LibreSudokuAlt.kt @@ -0,0 +1,16 @@ +package com.kaajjo.libresudoku.ui.theme.icons + +import androidx.compose.material.icons.Icons +import androidx.compose.ui.graphics.Color +import com.kaajjo.libresudoku.ui.util.iconFromXmlPath + +val Icons.Rounded.LibreSudokuIconAlt by lazy { + iconFromXmlPath( + pathStr = """ + M 40 0 h 1.9 v 60 h -1.9 z M 20 0 h 1.9 v 60 h -1.9 z M 0 20 l 0 -2 l 60 0 l 0 2 z M 0 40 l 0 -2 l 60 0 l 0 2 z + """.trimIndent(), + viewportWidth = 60f, + viewportHeight = 60f, + fillColor = Color(0xFFC0C0C0.toInt()) + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Mir.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Mir.kt new file mode 100644 index 00000000..cae9317c --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Mir.kt @@ -0,0 +1,16 @@ +package com.kaajjo.libresudoku.ui.theme.icons + +import androidx.compose.material.icons.Icons +import androidx.compose.ui.unit.dp +import com.kaajjo.libresudoku.ui.util.iconFromXmlPath + + +val Icons.Filled.Mir by lazy { + iconFromXmlPath( + pathStr = "M 22.2 0 h -21 C 0.6 0 0 0.6 0 1.3 v 12.5 c 0 0.7 0.6 1.3 1.3 1.3 h 21 c 0.7 0 1.3 -0.6 1.3 -1.3 V 1.3 C 23.5 0.6 22.9 0 22.2 0 z M 8.7 10.4 h -1.8 v -3.4 c 0 0 0 0 0 0 c 0 -0.1 -0.1 -0.1 -0.1 -0.1 c -0.1 0 -0.1 0 -0.1 0.1 l -1.1 3.4 H 4.3 L 3.3 7 c -0 -0.1 -0.1 -0.1 -0.1 -0.1 c -0.1 0 -0.1 0.1 -0.1 0.1 c 0 0 0 0 0 0 l 0 3.4 h -1.8 v -5.9 h 1.5 H 3.3 c 0.3 0 0.7 0.3 0.8 0.6 l 0.9 2.9 c 0 0.1 0.1 0.1 0.2 0 l 0.9 -2.9 c 0.1 -0.3 0.4 -0.6 0.8 -0.6 h 0.5 h 1.5 V 10.4 z M 15.4 10.4 h -1.8 V 6.9 l 0 0 c -0 -0.1 -0 -0.1 -0.1 -0.1 c -0 0 -0.1 0 -0.1 0.1 l 0 0 l 0 0 c 0 0 -0 0 -0 0 l -1.5 3.2 c -0.1 0.2 -0.3 0.4 -0.6 0.4 v 0 h -1.8 v -5.9 h 1.8 v 3.4 c 0 0.1 0.1 0.1 0.1 0.1 c 0 0 0.1 -0 0.1 -0.1 l 0 0 l 0 0 c 0 -0 0 -0 0 -0 l 1.4 -3.1 c 0.1 -0.2 0.4 -0.4 0.6 -0.4 h 1.8 V 10.4 z M 20.2 8.5 h -2 v 1.9 h -1.8 v -3.2 h 5.7 C 21.8 8 21 8.5 20.2 8.5 z M 22.1 6.9 c 0 0 -3.1 0 -3.1 0 c -1.5 0 -2.8 -1 -2.9 -2.4 l 4.1 0 c 1.1 0 2 0.9 2 2 C 22.1 6.7 22.1 6.8 22.1 6.9 z", + viewportWidth = 24f, + viewportHeight = 15f, + defaultHeight = 15.dp, + defaultWidth = 24.dp + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Ton.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Ton.kt new file mode 100644 index 00000000..824d504d --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Ton.kt @@ -0,0 +1,12 @@ +package com.kaajjo.libresudoku.ui.theme.icons + +import androidx.compose.material.icons.Icons +import com.kaajjo.libresudoku.ui.util.iconFromXmlPath + +val Icons.Rounded.Ton by lazy { + iconFromXmlPath( + pathStr = "M24.56 0.628H5.439C1.923 0.628 -0.306 4.42 1.463 7.486L13.264 27.941C14.035 29.277 15.964 29.277 16.735 27.941L28.538 7.486C30.304 4.425 28.076 0.628 24.563 0.628H24.56ZM13.255 21.807L10.685 16.833L4.483 5.741C4.074 5.032 4.579 4.122 5.436 4.122H13.252V21.809L13.255 21.807ZM25.511 5.739L19.312 16.835L16.742 21.807V4.119H24.558C25.415 4.119 25.92 5.029 25.511 5.739Z", + viewportWidth = 30f, + viewportHeight = 30f + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Usdt.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Usdt.kt new file mode 100644 index 00000000..da4719b7 --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/Usdt.kt @@ -0,0 +1,12 @@ +package com.kaajjo.libresudoku.ui.theme.icons + +import androidx.compose.material.icons.Icons +import com.kaajjo.libresudoku.ui.util.iconFromXmlPath + +val Icons.Rounded.Usdt by lazy { + iconFromXmlPath( + pathStr = "M 10.417969 5 L 2.0820312 22.949219 L 25 45 L 47.917969 22.949219 L 39.582031 5 L 10.417969 5 z M 12.957031 10.042969 L 36.957031 10.042969 L 37 16 L 28 16 L 28 19.490234 C 36.125 19.874234 39.582031 21.046969 39.582031 22.542969 C 39.582031 24.037969 34.551 25.694 28 26 L 28 37 L 22 37 L 22 26 C 15.449 25.694 10.417969 24.037969 10.417969 22.542969 C 10.417969 21.046969 13.875 19.749234 22 19.490234 L 22 16 L 13 16 L 12.957031 10.042969 z M 22 20.375 C 16.611 20.635 13 21.283 13 22.375 C 13 23.67 18.097 24.625 25 24.625 C 31.903 24.625 37 23.545 37 22.25 C 37 21.158 33.389 20.76 28 20.5 L 28 23 C 27 23.063 26.083 23.082031 25 23.082031 C 23.917 23.082031 23 23.062 22 23 L 22 20.375 z", + viewportWidth = 48f, + viewportHeight = 48f + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/util/IconFromXmlPath.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/util/IconFromXmlPath.kt new file mode 100644 index 00000000..d40e9d93 --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/util/IconFromXmlPath.kt @@ -0,0 +1,36 @@ +package com.kaajjo.libresudoku.ui.util + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.addPathNodes +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + + +fun iconFromXmlPath( + pathStr: String, + viewportWidth: Float = 24f, + viewportHeight: Float = 24f, + defaultWidth: Dp = 24.dp, + defaultHeight: Dp = 24.dp, + fillColor: Color = Color.White, +): ImageVector { + val fillBrush = SolidColor(fillColor) + val strokeBrush = SolidColor(fillColor) + + return ImageVector.Builder( + defaultWidth = defaultWidth, + defaultHeight = defaultHeight, + viewportWidth = viewportWidth, + viewportHeight = viewportHeight, + ).run { + addPath( + pathData = addPathNodes(pathStr), + name = "", + fill = fillBrush, + stroke = strokeBrush, + ) + build() + } +} diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 85cd488c..89bf4ea3 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -71,7 +71,8 @@ Сбросить все тип карточки Тип карточки сброшены! Версия - Проект на GitHub + GitHub + Исходный код GitHub Сдаться Начать заново Да @@ -169,7 +170,8 @@ Скрытые пары Скрытые пары это почти то же самое, что и голые пары, только с одним отличием, они скрыты среди других. Эти две клетки имеют кое-что общее, а именно, в них могут стоять цифры 6 и 9, и это единственные две клетки в этом блоке, где они могут стоять Из этого можно сделать вывод, что эти две клетки будут содержать именно эти две цифры, и никакие другие. Так что, мы можем убрать ненужные заметки из этих клеток. Как и с голыми парами, это точно также работает со строками и столбцами - Open Source лицензии + Лицензии + Лицензии открытого ПО Можно продолжить Показать свое Кастомное судоку @@ -202,6 +204,7 @@ ID Сортировка Фильтр + Weblate Помочь с переводом Создать папку Удалить папку @@ -340,4 +343,13 @@ Последние %1$d игр Последние %1$d игр + + Telegram + Присоединяйтесь в Telegram + Пожертвование + Это приложение бесплатно и без реклам навсегда. Вы моежет поддержать меня ниже + Bitcoin + TON + USDT (TRC20) + MIR \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 22c27dee..51fb8bd8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -76,7 +76,8 @@ App language Default Version - Project on GitHub + GitHub + Source code on GitHub Give up Reset the game Yes @@ -172,6 +173,7 @@ Previous Next -- + Licenses Open Source Licenses Can continue Custom sudoku @@ -204,6 +206,7 @@ ID Sort Filter + Weblate Help translate Folders Create a folder @@ -338,4 +341,13 @@ Last %1$d game Last %1$d games + + Telegram + Join us on Telegram + Donation + This app is free and ad-free forever. You can support me below + Bitcoin + TON + USDT (TRC20) + MIR \ No newline at end of file