🖼️ opencollective/liberapay/bitcoin/litecoin icons

This adds colorful icons to the donation section on the AppDetails
composable.
This commit is contained in:
Michael Pöhn
2026-07-09 13:25:11 +02:00
parent 413dc46222
commit 8d09dc01c3
10 changed files with 88 additions and 81 deletions

View File

@@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.calculateStartPadding
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll
@@ -19,7 +20,6 @@ import androidx.compose.material.icons.filled.ChangeHistory
import androidx.compose.material.icons.filled.Code
import androidx.compose.material.icons.filled.CurrencyBitcoin
import androidx.compose.material.icons.filled.EditNote
import androidx.compose.material.icons.filled.Groups
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Link
import androidx.compose.material.icons.filled.Mail
@@ -52,6 +52,7 @@ import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.LiveRegionMode
import androidx.compose.ui.semantics.liveRegion
@@ -81,7 +82,6 @@ import org.fdroid.R
import org.fdroid.install.InstallState
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.icons.License
import org.fdroid.ui.icons.Litecoin
import org.fdroid.ui.lists.AppListType
import org.fdroid.ui.navigation.NavigationKey
import org.fdroid.ui.utils.BigLoadingIndicator
@@ -275,7 +275,7 @@ fun AppDetails(
)
item.app.donate?.forEach { donation ->
AppDetailsLink(
icon = Icons.Default.Link,
icon = rememberVectorPainter(Icons.Default.Link),
title = donation,
url = donation,
modifier = Modifier.padding(horizontal = 16.dp).padding(bottom = 8.dp),
@@ -283,7 +283,8 @@ fun AppDetails(
}
item.liberapayUri?.let { liberapayUri ->
AppDetailsLink(
icon = Icons.Default.ChangeHistory,
icon = painterResource(id = R.drawable.ic_donation_liberapay),
disableTinting = true,
title = "Liberapay",
url = liberapayUri,
modifier = Modifier.padding(horizontal = 16.dp).padding(bottom = 8.dp),
@@ -291,7 +292,8 @@ fun AppDetails(
}
item.openCollectiveUri?.let { openCollectiveUri ->
AppDetailsLink(
icon = Icons.Default.Groups,
icon = painterResource(id = R.drawable.ic_donation_opencollective),
disableTinting = true,
title = "Open Collective",
url = openCollectiveUri,
modifier = Modifier.padding(horizontal = 16.dp).padding(bottom = 8.dp),
@@ -299,7 +301,8 @@ fun AppDetails(
}
item.bitcoinUri?.let { bitcoinUri ->
AppDetailsLink(
icon = Icons.Default.CurrencyBitcoin,
icon = painterResource(id = R.drawable.ic_donation_bitcoin),
disableTinting = true,
title = stringResource(R.string.menu_bitcoin),
url = bitcoinUri,
modifier = Modifier.padding(horizontal = 16.dp).padding(bottom = 8.dp),
@@ -307,7 +310,8 @@ fun AppDetails(
}
item.litecoinUri?.let { litecoinUri ->
AppDetailsLink(
icon = Litecoin,
icon = painterResource(id = R.drawable.ic_donation_litecoin),
disableTinting = true,
title = stringResource(R.string.menu_litecoin),
url = litecoinUri,
modifier = Modifier.padding(horizontal = 16.dp).padding(bottom = 8.dp),
@@ -323,49 +327,49 @@ fun AppDetails(
Column(modifier = Modifier.padding(start = 16.dp)) {
item.app.webSite?.let { webSite ->
AppDetailsLink(
icon = Icons.Default.Home,
icon = rememberVectorPainter(Icons.Default.Home),
title = stringResource(R.string.menu_website),
url = webSite,
)
}
item.app.issueTracker?.let { issueTracker ->
AppDetailsLink(
icon = Icons.Default.EditNote,
icon = rememberVectorPainter(Icons.Default.EditNote),
title = stringResource(R.string.menu_issues),
url = issueTracker,
)
}
item.app.changelog?.let { changelog ->
AppDetailsLink(
icon = Icons.Default.ChangeHistory,
icon = rememberVectorPainter(Icons.Default.ChangeHistory),
title = stringResource(R.string.menu_changelog),
url = changelog,
)
}
item.app.license?.let { license ->
AppDetailsLink(
icon = License,
icon = rememberVectorPainter(License),
title = stringResource(R.string.menu_license, license),
url = "https://spdx.org/licenses/$license",
)
}
item.app.translation?.let { translation ->
AppDetailsLink(
icon = Icons.Default.Translate,
icon = rememberVectorPainter(Icons.Default.Translate),
title = stringResource(R.string.menu_translation),
url = translation,
)
}
item.app.sourceCode?.let { sourceCode ->
AppDetailsLink(
icon = Icons.Default.Code,
icon = rememberVectorPainter(Icons.Default.Code),
title = stringResource(R.string.menu_source),
url = sourceCode,
)
}
item.app.video?.getBestLocale(LocaleListCompat.getDefault())?.let { video ->
AppDetailsLink(
icon = Icons.Default.OndemandVideo,
icon = rememberVectorPainter(Icons.Default.OndemandVideo),
title = stringResource(R.string.menu_video),
url = video,
)
@@ -386,14 +390,14 @@ fun AppDetails(
Column(modifier = Modifier.padding(start = 16.dp)) {
item.app.authorWebSite?.let { authorWebSite ->
AppDetailsLink(
icon = Icons.Default.Home,
icon = rememberVectorPainter(Icons.Default.Home),
title = stringResource(R.string.menu_website),
url = authorWebSite,
)
}
item.app.authorEmail?.let { authorEmail ->
AppDetailsLink(
icon = Icons.Default.Mail,
icon = rememberVectorPainter(Icons.Default.Mail),
title = stringResource(R.string.menu_email),
url = authorEmail,
)

View File

@@ -6,13 +6,16 @@ import androidx.compose.foundation.layout.Arrangement.spacedBy
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.ClipEntry
import androidx.compose.ui.platform.LocalClipboard
@@ -25,7 +28,13 @@ import org.fdroid.R
import org.fdroid.ui.utils.openUriSafe
@Composable
fun AppDetailsLink(icon: ImageVector, title: String, url: String, modifier: Modifier = Modifier) {
fun AppDetailsLink(
icon: Painter,
title: String,
url: String,
disableTinting: Boolean = false,
modifier: Modifier = Modifier)
{
val uriHandler = LocalUriHandler.current
val haptics = LocalHapticFeedback.current
val clipboardManager = LocalClipboard.current
@@ -47,7 +56,13 @@ fun AppDetailsLink(icon: ImageVector, title: String, url: String, modifier: Modi
onLongClickLabel = stringResource(R.string.copy_link),
),
) {
Icon(icon, null)
Icon(
icon,
null,
// don't tint colorful icons (e.g. for donation options)
tint = if (disableTinting) Color.Unspecified else LocalContentColor.current,
modifier = Modifier.size(24.dp)
)
Text(title)
}
}

View File

@@ -1,56 +0,0 @@
package org.fdroid.ui.icons
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.path
import androidx.compose.ui.unit.dp
val Litecoin: ImageVector
get() {
if (_Litecoin != null) return _Litecoin!!
_Litecoin =
ImageVector.Builder(
name = "litecoin",
defaultWidth = 24.dp,
defaultHeight = 24.dp,
viewportWidth = 24f,
viewportHeight = 24f,
)
.apply {
path(fill = SolidColor(Color(0xFF000000))) {}
path(fill = SolidColor(Color(0xFF000000))) {}
path(fill = SolidColor(Color(0xFF000000))) {
moveTo(12f, 1f)
arcTo(11f, 11f, 0f, true, false, 23f, 12f)
arcTo(11f, 11f, 0f, false, false, 12f, 1f)
close()
moveToRelative(0.178277f, 11.361877f)
lineToRelative(-1.14417f, 3.860909f)
horizontalLineToRelative(6.119981f)
arcToRelative(0.31398162f, 0.31398162f, 0f, false, true, 0.300677f, 0.401791f)
lineToRelative(-0.532172f, 1.833333f)
arcToRelative(0.42041606f, 0.42041606f, 0f, false, true, -0.404451f, 0.303339f)
horizontalLineTo(7.170537f)
lineTo(8.7510885f, 13.423561f)
lineTo(7.0029028f, 13.955733f)
lineTo(7.3887276f, 12.707789f)
lineTo(9.1395743f, 12.175616f)
lineTo(11.358733f, 4.6773101f)
arcToRelative(0.4177552f, 0.4177552f, 0f, false, true, 0.401789f, -0.305999f)
horizontalLineToRelative(2.368167f)
arcToRelative(0.31398162f, 0.31398162f, 0f, false, true, 0.303338f, 0.3991292f)
lineTo(12.569424f, 11.111273f)
lineTo(14.31761f, 10.5791f)
lineTo(13.942429f, 11.848331f)
close()
}
path(fill = SolidColor(Color(0xFF000000))) {}
}
.build()
return _Litecoin!!
}
private var _Litecoin: ImageVector? = null

View File

@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="6.35"
android:viewportHeight="6.35">
<path
android:pathData="M3.051,0.0021C2.8252,0.0317 2.6038,0.0414 2.3812,0.1 1.715,0.2755 1.1172,0.6617 0.6868,1.2005 0.4503,1.4967 0.2661,1.8407 0.1537,2.2027 0.0472,2.5452 -0.0156,2.9097 0.0002,3.2693 0.0468,4.3346 0.6013,5.3166 1.5131,5.8816 1.8013,6.0601 2.1211,6.1881 2.4507,6.2662 2.8226,6.3544 3.2084,6.3709 3.5868,6.3238 4.6065,6.1969 5.5262,5.5448 5.9965,4.6335 6.2414,4.159 6.363,3.6189 6.3499,3.0857 6.3157,1.6865 5.3107,0.4366 3.9539,0.0974 3.7471,0.0457 3.5365,0.0141 3.3238,0.0048 3.2349,0.0009 3.1398,-0.0096 3.051,0.0021"
android:fillColor="#f79313"
android:strokeColor="#00000000"/>
<path
android:pathData="M3.3933,1.1906 L3.2544,1.7562c0.0875,0.0071 0.1957,0.0335 0.2778,0.0645 0.0289,-0.1398 0.0677,-0.2782 0.1023,-0.4167 0.0066,-0.0264 0.016,-0.1252 0.043,-0.1355 0.0232,-0.0089 0.0694,0.0124 0.0928,0.0183 0.0827,0.0207 0.166,0.0395 0.248,0.0626 -0.0261,0.1937 -0.123,0.3807 -0.1389,0.5755 0.0639,0.0096 0.1294,0.0448 0.1885,0.0702 0.2056,0.0883 0.4213,0.2308 0.4901,0.4557 0.0897,0.2932 -0.071,0.7503 -0.4207,0.7789 0.0349,0.0378 0.0924,0.0599 0.1339,0.0912 0.0908,0.0682 0.1637,0.1541 0.2043,0.2611 0.0452,0.119 0.038,0.25 0.0111,0.3721C4.4275,4.2225 4.2722,4.4616 4.0035,4.5538 3.7557,4.6387 3.4706,4.5965 3.2196,4.5492 3.2037,4.7439 3.1068,4.9309 3.0807,5.1246 2.9652,5.1152 2.8401,5.0717 2.7285,5.0403L2.8135,4.698 2.8724,4.4698C2.8077,4.4564 2.7425,4.4397 2.6789,4.4216 2.66,4.4163 2.6198,4.3972 2.601,4.4064 2.5727,4.4203 2.564,4.52 2.5567,4.5492 2.5216,4.6896 2.49,4.8315 2.4507,4.9709L2.1034,4.8865C2.1293,4.6944 2.1947,4.4928 2.2473,4.3061 2.0187,4.2417 1.7698,4.2112 1.5478,4.1275 1.58,3.9922 1.6637,3.8594 1.7165,3.7306 1.817,3.7442 1.9916,3.8445 2.0835,3.7726 2.1268,3.7388 2.1362,3.6865 2.1487,3.6364L2.2144,3.3734C2.2884,3.0775 2.3612,2.7813 2.4352,2.4854l0.062,-0.248c0.0121,-0.0485 0.0298,-0.0982 0.0206,-0.1488 -0.0239,-0.1324 -0.1764,-0.1568 -0.2854,-0.1818 -0.0255,-0.0058 -0.1041,-0.0115 -0.1185,-0.0343 -0.0125,-0.0198 0.0121,-0.0751 0.0174,-0.0964 0.0224,-0.0895 0.054,-0.1815 0.0663,-0.2729L2.9021,1.6768 2.9871,1.3345 3.046,1.1063 3.3933,1.1906M2.9865,2.8625c0.1422,0.0294 0.2805,0.0788 0.4266,0.0889 0.0813,0.0056 0.1632,0.0078 0.2431,-0.0126C3.8647,2.8854 3.9752,2.636 3.8386,2.4557 3.7399,2.3254 3.5606,2.264 3.4082,2.2243 3.3488,2.2089 3.2894,2.1946 3.2296,2.1811c-0.0166,-0.0037 -0.0512,-0.0182 -0.0667,-0.0079 -0.0122,0.0082 -0.0138,0.0313 -0.0171,0.0443L3.1136,2.3465C3.0714,2.5154 3.0097,2.6901 2.9865,2.8625m-0.0857,0.3574c-0.0283,0.0209 -0.0355,0.1198 -0.0439,0.1536 -0.0359,0.1438 -0.0707,0.2879 -0.1067,0.4316l-0.031,0.124c-0.0032,0.0127 -0.0128,0.0344 -0.005,0.0468 0.0093,0.0148 0.0434,0.0169 0.0589,0.0208l0.1587,0.0397c0.1454,0.0362 0.2919,0.0564 0.4415,0.0564 0.1017,0 0.2154,-0.0172 0.2977,-0.0819C3.8152,3.8974 3.8287,3.6702 3.7054,3.5371 3.5756,3.3972 3.3753,3.3287 3.1948,3.2823 3.1224,3.2637 3.0497,3.2452 2.9766,3.2296c-0.0184,-0.0039 -0.0588,-0.0222 -0.0758,-0.0097z"
android:fillColor="#ffffff"
android:strokeColor="#00000000"/>
</vector>

View File

@@ -0,0 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:viewportHeight="80" android:viewportWidth="80" android:width="24dp">
<path android:fillColor="#f6c915" android:pathData="M10,0L70,0A10,10 0,0 1,80 10L80,70A10,10 0,0 1,70 80L10,80A10,10 0,0 1,0 70L0,10A10,10 0,0 1,10 0z"/>
<path android:fillColor="#1a171b" android:pathData="M32.73,56.265c-2.587,0 -4.617,-0.338 -6.093,-1.011s-2.531,-1.594 -3.171,-2.761 -0.946,-2.493 -0.928,-4.015 0.227,-3.123 0.628,-4.836l6.939,-29.014 8.47,-1.311 -7.595,31.473c-0.146,0.655 -0.228,1.257 -0.246,1.803s0.082,1.029 0.3,1.447 0.592,0.757 1.12,1.011 1.266,0.42 2.213,0.493zM40.533,28.021c1.46,-0.437 3.127,-0.828 5.003,-1.175s3.908,-0.518 6.093,-0.518 3.799,0.309 5.273,0.928 2.686,1.467 3.634,2.541 1.648,2.332 2.102,3.77 0.683,2.978 0.683,4.618c0,2.658 -0.437,5.09 -1.321,7.294s-2.076,4.108 -3.624,5.71 -3.406,2.851 -5.576,3.747 -4.523,1.334 -7.072,1.334c-1.239,0 -2.477,-0.11 -3.716,-0.33l-2.459,9.891h-8.087zM43.487,49.387c0.619,0.146 1.384,0.213 2.295,0.213 1.42,0 2.713,-0.258 3.879,-0.788s2.158,-1.265 2.978,-2.213 1.456,-2.084 1.912,-3.415 0.683,-2.795 0.683,-4.398 -0.347,-2.896 -1.038,-3.989 -1.894,-1.639 -3.606,-1.639c-1.167,0 -2.259,0.109 -3.279,0.328z"/>
</vector>

View File

@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="6.35"
android:viewportHeight="6.35">
<path
android:pathData="M3.009,0.013C2.8072,0.0395 2.6093,0.0528 2.4096,0.1002 1.9008,0.221 1.4091,0.4834 1.0264,0.8398 0.7146,1.1303 0.4603,1.475 0.2823,1.8626 -0.2829,3.0938 0.0184,4.6192 1.0264,5.5312 1.4193,5.8866 1.8823,6.1267 2.3912,6.2665 2.7859,6.375 3.2141,6.3868 3.6177,6.3324 5.0811,6.1353 6.2818,4.8595 6.3468,3.3749 6.4132,1.8592 5.4265,0.474 3.9404,0.1025 3.6493,0.0297 3.3093,-0.0264 3.009,0.013"
android:strokeWidth="0.264733"
android:fillColor="#345d9d"
android:strokeColor="#00000000"/>
<path
android:pathData="M3.3318,2.9231 L3.8298,2.7663C3.8257,2.8561 3.785,2.9478 3.7599,3.0337 3.7493,3.0699 3.7431,3.1183 3.7078,3.1391 3.6145,3.1942 3.473,3.2171 3.3687,3.2471 3.327,3.2591 3.2567,3.2692 3.2278,3.3039 3.1656,3.3789 3.1478,3.5487 3.121,3.6423 3.0483,3.8958 2.9518,4.1495 2.8984,4.4077h1.2357,0.3689c0.0571,0 0.1295,-0.0117 0.1843,0.006 0.0611,0.0197 0.068,0.0781 0.054,0.1323 -0.0357,0.1391 -0.0787,0.2769 -0.1184,0.415 -0.0161,0.0558 -0.0269,0.1318 -0.0834,0.1618 -0.0609,0.0323 -0.163,0.0134 -0.2301,0.0134H3.7652,1.7826L1.9262,4.6383 2.2344,3.5962 1.7365,3.753c0.0079,-0.0903 0.0461,-0.1806 0.0711,-0.2674 0.0092,-0.0322 0.0142,-0.0781 0.0434,-0.0989 0.0895,-0.0637 0.2508,-0.0842 0.3558,-0.1158 0.0488,-0.0147 0.1161,-0.0221 0.1423,-0.0717C2.4231,3.0593 2.4463,2.8716 2.4929,2.7202 2.6059,2.3526 2.7127,1.9827 2.8207,1.6136 2.8603,1.4783 2.9019,1.3435 2.9406,1.2079 2.9578,1.1478 2.9692,1.0634 3.0127,1.0162 3.0621,0.9625 3.1462,0.9773 3.2119,0.9773H3.7006c0.0678,0 0.1629,-0.0075 0.1729,0.083 0.0061,0.0553 -0.0275,0.1225 -0.0425,0.1752C3.7942,1.365 3.7552,1.4939 3.7165,1.6228 3.5878,2.0521 3.4919,2.5047 3.3318,2.9231"
android:strokeWidth="0.264733"
android:fillColor="#ffffff"
android:strokeColor="#00000000"/>
</vector>

View File

@@ -0,0 +1,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:viewportHeight="29" android:viewportWidth="29" android:width="24dp">
<path android:fillColor="#99cfff" android:fillType="evenOdd" android:pathData="M26.009,6.526C27.58,8.789 28.5,11.537 28.5,14.5c0,2.963 -0.92,5.711 -2.491,7.973l-3.626,-3.626c0.712,-1.289 1.117,-2.771 1.117,-4.347 0,-1.576 -0.405,-3.058 -1.117,-4.347z"/>
<path android:fillColor="#1f87ff" android:fillType="evenOdd" android:pathData="M22.473,2.991 L18.847,6.617C17.558,5.905 16.076,5.5 14.5,5.5c-4.97,0 -9,4.03 -9,9 0,4.97 4.03,9 9,9 1.576,0 3.058,-0.405 4.347,-1.117l3.627,3.626c-2.263,1.571 -5.01,2.491 -7.973,2.491 -7.732,0 -14,-6.268 -14,-14 0,-7.732 6.268,-14 14,-14 2.963,0 5.711,0.92 7.973,2.491z"/>
</vector>

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:61b512fa575daefef96994eceface3e57215fc98fbdf87259cec391396dcc5ab
size 280535
oid sha256:7db37b028cf9bb47933add41a7662b700e0146344ab793b8257827b86c94b5b1
size 283496

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1ad1f6d63b7faee4f29430de1017a884a6c80fa39a8feea0ab269db5d4acc5d1
size 346754
oid sha256:cd399ae999c2a0cd9b048b1b7b79d78eea6cc673c25053440c6eda9215239b35
size 349703

View File

@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b1ade7881aaf578b91be6a14202ce9d206f9aaacd0ad51763d71d4c5b10896d3
size 328351
oid sha256:a0f6881da35cec7bcd9de4e6477a9bd0179c5c8675b17dfc13eed8dbd2fd2861
size 331438