Skip to content

Commit

Permalink
Add basic donation activity
Browse files Browse the repository at this point in the history
  • Loading branch information
naveensingh committed May 7, 2024
1 parent 8799f0c commit 6416dab
Show file tree
Hide file tree
Showing 17 changed files with 341 additions and 10 deletions.
5 changes: 5 additions & 0 deletions commons/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@
android:exported="false"
android:label="@string/manage_blocked_numbers" />

<activity
android:name=".activities.DonationActivity"
android:exported="false"
android:label="@string/donate_to_fossify" />

<receiver
android:name=".receivers.SharedThemeReceiver"
android:enabled="true"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class AboutActivity : ComponentActivity() {
@Composable
private fun showWebsiteAndFullVersion(
resources: Resources,
showExternalLinks: Boolean
showExternalLinks: Boolean,
): Pair<Boolean, String> {
val showWebsite = remember { resources.getBoolean(R.bool.show_donate_in_about) && !showExternalLinks }
var version = intent.getStringExtra(APP_VERSION_NAME) ?: ""
Expand Down Expand Up @@ -170,7 +170,7 @@ class AboutActivity : ComponentActivity() {
}

private fun onEmailClick(
showConfirmationAdvancedDialog: () -> Unit
showConfirmationAdvancedDialog: () -> Unit,
) {
if (intent.getBooleanExtra(SHOW_FAQ_BEFORE_MAIL, false) && !baseConfig.wasBeforeAskingShown) {
baseConfig.wasBeforeAskingShown = true
Expand Down Expand Up @@ -228,7 +228,7 @@ class AboutActivity : ComponentActivity() {

private fun onRateUsClick(
showConfirmationAdvancedDialog: () -> Unit,
showRateStarsDialog: () -> Unit
showRateStarsDialog: () -> Unit,
) {
if (baseConfig.wasBeforeRateShown) {
launchRateUsPrompt(showRateStarsDialog)
Expand All @@ -239,7 +239,7 @@ class AboutActivity : ComponentActivity() {
}

private fun launchRateUsPrompt(
showRateStarsDialog: () -> Unit
showRateStarsDialog: () -> Unit,
) {
if (baseConfig.wasAppRated) {
redirectToRateUs()
Expand All @@ -266,7 +266,7 @@ class AboutActivity : ComponentActivity() {


private fun onDonateClick() {
launchViewIntent(getString(R.string.donate_url))
startActivity(Intent(applicationContext, DonationActivity::class.java))
}

private fun onGithubClick() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.fossify.commons.activities

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.text.AnnotatedString
import org.fossify.commons.R
import org.fossify.commons.compose.extensions.enableEdgeToEdgeSimple
import org.fossify.commons.compose.screens.donation.DonationScreen
import org.fossify.commons.compose.screens.donation.FossifyCryptoAddresses
import org.fossify.commons.compose.screens.donation.FossifyDonationPlatforms
import org.fossify.commons.compose.theme.AppThemeSurface
import org.fossify.commons.extensions.openWebsiteIntent
import org.fossify.commons.extensions.toast

class DonationActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdgeSimple()
setContent {
val clipboardManager = LocalClipboardManager.current
AppThemeSurface {
DonationScreen(
donationOptions = FossifyDonationPlatforms,
cryptoAddresses = FossifyCryptoAddresses,
goBack = ::finish,
openWebsite = ::openWebsiteIntent,
copyToClipboard = {
clipboardManager.setText(AnnotatedString(it))
toast(R.string.value_copied_to_clipboard)
},
)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ internal fun HelpUsSection(
if (showDonate) {
TwoLinerTextItem(
click = onDonateClick,
text = stringResource(id = R.string.donate),
icon = R.drawable.ic_dollar_vector
text = stringResource(id = R.string.donate_to_fossify),
icon = R.drawable.ic_donate_vector
)
}
SettingsHorizontalDivider()
Expand Down Expand Up @@ -126,7 +126,7 @@ internal fun OtherSection(
internal fun AboutSection(
setupFAQ: Boolean,
onFAQClick: () -> Unit,
onEmailClick: () -> Unit
onEmailClick: () -> Unit,
) {
SettingsGroup(title = {
SettingsTitleTextComponent(text = stringResource(id = R.string.support), modifier = startingTitlePadding)
Expand All @@ -151,7 +151,7 @@ internal fun AboutSection(
internal fun SocialSection(
onGithubClick: () -> Unit,
onRedditClick: () -> Unit,
onTelegramClick: () -> Unit
onTelegramClick: () -> Unit,
) {
SettingsGroup(title = {
SettingsTitleTextComponent(text = stringResource(id = R.string.social), modifier = startingTitlePadding)
Expand Down Expand Up @@ -181,7 +181,7 @@ internal fun SocialText(
text: String,
icon: Int,
tint: Color? = null,
click: () -> Unit
click: () -> Unit,
) {
SettingsListItem(
click = click,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package org.fossify.commons.compose.screens.donation

import org.fossify.commons.R

sealed class Donation {
data class Platform(
val fee: Int,
val icon: Int,
val link: String,
val name: String,
) : Donation()

data class Crypto(
val address: String,
val icon: Int,
val name: String,
) : Donation()
}

val FossifyDonationPlatforms = listOf(
Donation.Platform(
fee = 0,
icon = R.drawable.ic_github_tinted_vector,
link = "https://github.com/sponsors/FossifyOrg",
name = "GitHub Sponsors"
),
Donation.Platform(
fee = 0,
icon = R.drawable.ic_liberapay_vector,
link = "https://liberapay.com/naveensingh",
name = "Liberapay"
),
Donation.Platform(
fee = 10,
icon = R.drawable.ic_open_collective_vector,
link = "https://opencollective.com/fossify/donate?interval=month&amount=20",
name = "OpenCollective"
),
Donation.Platform(
fee = 10,
icon = R.drawable.ic_patreon_vector,
link = "https://www.patreon.com/naveen3singh",
name = "Patreon"
),
Donation.Platform(
fee = 5,
icon = R.drawable.ic_paypal_vector,
link = "https://paypal.me/naveen3singh",
name = "PayPal"
),
)

@Suppress("SpellCheckingInspection")
val FossifyCryptoAddresses = listOf(
Donation.Crypto(
address = "bc1qn5h97qdqsazpzvxm7gryke6vmrcx85t7neqp95",
icon = R.drawable.ic_bitcoin_vector,
name = "Bitcoin (BTC)"
),
Donation.Crypto(
address = "0x9354fC372BC3BdA58766a8a9Fabadf77A76CdE01",
icon = R.drawable.ic_ethereum_vector,
name = "Ethereum (ETH)"
),
Donation.Crypto(
address = "48FkVUcJ7AGeBMR4SC4J7QU5nAt6YNwKZWz6sGDT1s5haEY7reZtJr5CniXLaQzTzGAuZNoc83BQAcETHw1d3Lkn8AAf1XF",
icon = R.drawable.ic_monero_vector,
name = "Monero (XMR)"
),
Donation.Crypto(
address = "TGi4VpD1D9A9ZvyP9d3aVowwzMSvev2hub",
icon = R.drawable.ic_tron_vector,
name = "Tron (TRX)"
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
package org.fossify.commons.compose.screens.donation

import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ContentCopy
import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fossify.commons.R
import org.fossify.commons.compose.lists.SimpleColumnScaffold
import org.fossify.commons.compose.settings.SettingsGroup
import org.fossify.commons.compose.settings.SettingsHorizontalDivider
import org.fossify.commons.compose.settings.SettingsTitleTextComponent
import org.fossify.commons.compose.theme.Shapes
import org.fossify.commons.compose.theme.SimpleTheme
import org.fossify.commons.compose.theme.textSubTitleColor

@Composable
fun DonationScreen(
donationOptions: List<Donation.Platform>,
cryptoAddresses: List<Donation.Crypto>,
goBack: () -> Unit,
openWebsite: (String) -> Unit,
copyToClipboard: (String) -> Unit,
) {
SimpleColumnScaffold(title = stringResource(id = R.string.donate_to_fossify), goBack = goBack) {
DonationPlatforms(
options = donationOptions,
copyToClipboard = copyToClipboard,
openWebsite = openWebsite
)

SettingsHorizontalDivider()

DonationCryptos(
options = cryptoAddresses,
copyToClipboard = copyToClipboard,
)
}
}

@Composable
fun DonationPlatforms(
options: List<Donation.Platform>,
openWebsite: (String) -> Unit,
copyToClipboard: (String) -> Unit,
) {
SettingsGroup(title = {
SettingsTitleTextComponent(
text = stringResource(id = R.string.platforms),
modifier = Modifier
.padding(start = 56.dp)
)
}) {
options.forEach {
DonationListItem(
name = it.name,
description = if (it.fee == 0) {
stringResource(id = R.string.little_to_no_fee)
} else {
stringResource(R.string.fee_up_to_pct, it.fee)
},
icon = it.icon,
onClick = { openWebsite(it.link) },
onCopyClick = { copyToClipboard(it.link) },
)
}
}
}

@Composable
fun DonationCryptos(
options: List<Donation.Crypto>,
copyToClipboard: (String) -> Unit,
) {
SettingsGroup(title = {
SettingsTitleTextComponent(
text = stringResource(id = R.string.cryptocurrency),
modifier = Modifier
.padding(start = 56.dp)
)
}) {
options.forEach {
DonationListItem(
name = it.name,
description = it.address,
icon = it.icon,
onClick = { copyToClipboard(it.address) },
onCopyClick = { copyToClipboard(it.address) },
)
}
}
}

@Composable
fun DonationListItem(
name: String,
description: String,
@DrawableRes icon: Int,
onClick: () -> Unit,
onCopyClick: () -> Unit,
) {
ListItem(
modifier = Modifier
.clickable(onClick = onClick),
headlineContent = {
Text(
text = name,
modifier = Modifier
.fillMaxWidth(),
)
},
leadingContent = {
Image(
modifier = Modifier
.size(SimpleTheme.dimens.icon.medium),
painter = painterResource(id = icon),
contentDescription = name,
)
},
supportingContent = {
Text(
text = description,
style = SimpleTheme.typography.bodyMedium.copy(color = textSubTitleColor)
)
},
trailingContent = {
Icon(
imageVector = Icons.Rounded.ContentCopy,
contentDescription = stringResource(id = R.string.copy_to_clipboard),
tint = SimpleTheme.colorScheme.primary,
modifier = Modifier
.clip(Shapes.extraLarge)
.clickable(onClick = onCopyClick)
.padding(12.dp),
)
}
)
}

@Composable
@Preview
fun PreviewDonationScreen() {
DonationScreen(
donationOptions = FossifyDonationPlatforms,
cryptoAddresses = FossifyCryptoAddresses,
goBack = {},
openWebsite = {},
copyToClipboard = {},
)
}
4 changes: 4 additions & 0 deletions commons/src/main/res/drawable/ic_bitcoin_vector.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24.002346dp" android:viewportWidth="4091.3" android:viewportHeight="4091.7">
<path android:fillColor="#F7931A" android:pathData="M4030.1 2540.8c-273.2 1096-1383.3 1763-2479.5 1489.7C454.9 3757.3-212.1 2647.1 61.3 1551.2 334.4 455.1 1444.5-212 2540.3 61.3c1096.1 273.2 1763 1383.5 1489.8 2479.6z"/>
<path android:fillColor="#ffffff" android:pathData="M2947.8 1754.4c40.7-272.3-166.6-418.6-450-516.2l91.9-368.8-224.5-55.9-89.5 359.1c-59-14.7-119.6-28.6-179.9-42.3l90.2-361.5-224.4-55.9-92 368.7c-48.8-11.1-96.8-22.1-143.4-33.7l0.3-1.2-309.6-77.3-59.7 239.8s166.6 38.2 163.1 40.5c90.9 22.7 107.3 82.9 104.6 130.6l-104.7 420.1c6.3 1.6 14.4 3.9 23.3 7.5-7.5-1.9-15.5-3.9-23.7-5.9L1373 2390.6c-11.1 27.6-39.3 69.1-102.9 53.3 2.3 3.3-163.2-40.7-163.2-40.7l-111.5 257 292.1 72.8c54.3 13.6 107.6 27.9 160.1 41.3l-92.9 373 224.2 55.9 92-369.1c61.3 16.6 120.7 32 178.9 46.4l-91.7 367.3 224.5 55.9 92.9-372.3c382.8 72.4 670.7 43.2 791.8-303 97.6-278.8-4.9-439.6-206.3-544.4 146.7-33.8 257.2-130.3 286.6-329.6l-0.1-0.1zm-513 719.2c-69.4 278.8-538.8 128.1-690.9 90.3l123.3-494.2c152.2 38 640.2 113.2 567.7 403.9zm69.5-723.3c-63.3 253.6-454 124.8-580.7 93.2l111.8-448.2c126.7 31.6 534.8 90.6 468.9 355z"/>
</vector>
3 changes: 3 additions & 0 deletions commons/src/main/res/drawable/ic_donate_vector.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="960" android:viewportHeight="960">
<path android:fillColor="#FFFFFF" android:pathData="M535 873q11 3 25.5 2.5T585 871l295-111q0-34-24-57t-56-23H526q-3 0-7-0.5t-6-1.5l-59-21q-8-3-11-10t-1-15q2-7 10-11t16-1l45 17q4 2 6.5 2.5t7.5 0.5h105q19 0 33.5-13t14.5-34q0-14-8.5-27T649 548L372 445q-7-2-14-3.5t-14-1.5h-64v361l255 72zM40 800q0 33 23.5 56.5T120 880q33 0 56.5-23.5T200 800V520q0-33-23.5-56.5T120 440q-33 0-56.5 23.5T40 520v280zm600-312q-15 0-29.5-5.5T584 466L474 358q-31-30-52.5-66.5T400 212q0-55 38.5-93.5T532 80q32 0 60 13.5t48 36.5q20-23 48-36.5T748 80q55 0 93.5 38.5T880 212q0 43-21 79.5T807 358L696 466q-12 11-26.5 16.5T640 488z"/>
</vector>
5 changes: 5 additions & 0 deletions commons/src/main/res/drawable/ic_ethereum_vector.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="48" android:viewportHeight="48">
<path android:fillColor="#5f7edd" android:pathData="M48 24a24 24 0 0 1-24 24A24 24 0 0 1 0 24 24 24 0 0 1 24 0a24 24 0 0 1 24 24z"/>
<path android:fillColor="#ffffff" android:pathData="M17.899 24.407L17.73 24.3l-0.101-0.064-0.146-0.092c-0.058-0.036-0.13-0.081-0.159-0.102l-0.055-0.035 0.029-0.048c0.017-0.026 0.046-0.077 0.067-0.113 0.021-0.036 0.046-0.08 0.057-0.096l0.092-0.157c0.068-0.12 0.086-0.15 0.164-0.282l0.041-0.074c0.005-0.011 0.061-0.049 0.132-0.089 0.423-0.239 4.889-2.748 4.892-2.748 0.002 0 0.004 0.319 0.004 0.707v0.707l-0.986 0.555-2.369 1.332c-0.76 0.427-1.382 0.777-1.383 0.776l-0.11-0.069zm12.008 0.036l-1.154-0.648-1.229-0.691-1.914-1.076-0.379-0.213v-0.707c0-0.65 0.001-0.707 0.014-0.702 0.008 0.003 0.046 0.024 0.086 0.046l0.228 0.129 0.289 0.162c0.073 0.041 0.155 0.088 0.184 0.103l0.109 0.061 0.858 0.483 0.643 0.361 0.236 0.133 0.634 0.357 0.828 0.465 0.471 0.265c0.424 0.239 0.427 0.241 0.457 0.287 0.017 0.025 0.03 0.048 0.03 0.05 0 0.002 0.032 0.058 0.072 0.124l0.17 0.291 0.052 0.088 0.05 0.088 0.04 0.068c0.018 0.032 0.02 0.04 0.01 0.05-0.009 0.009-0.6 0.384-0.713 0.452-0.004 0.004-0.036-0.009-0.07-0.027zm-5.901 10.122v-3.426l0.995-0.625 1.171-0.736 3.404-2.138 1.943-1.221 0.862-0.542 0.022-0.014-0.018 0.026-0.185 0.267-1.468 2.122-0.796 1.151-2.564 3.706-1.396 2.017c-1.721 2.488-1.953 2.822-1.961 2.831-0.004 0.004-0.008-1.355-0.008-3.418zm1.724-1.242c0.194-0.282 0.409-0.592 0.477-0.689l0.27-0.389 0.802-1.158c0.36-0.52 0.654-0.947 0.652-0.949-0.002-0.003-0.525 0.326-2.222 1.391l-0.455 0.286-0.003 1.101-0.002 1.1 0.064-0.091 0.417-0.603zm-2.703 3.268l-3.116-4.502-3.551-5.131c-0.409-0.592-0.743-1.078-0.742-1.079 0.002-0.001 0.073 0.041 0.159 0.095l1.329 0.835 0.543 0.341 0.534 0.335 0.49 0.308 0.341 0.214 0.604 0.379 0.914 0.575c0.773 0.486 1.295 0.815 1.859 1.168l0.945 0.594c0.361 0.227 0.659 0.413 0.662 0.414 0.004 0.002 0.006 1.546 0.005 3.433L24 38zm-0.283-4.777c-0.006-0.006-0.122-0.08-0.256-0.164l-2.013-1.264c-0.216-0.137-0.395-0.246-0.396-0.244-0.002 0.002 0.067 0.105 0.153 0.229L21 31.481l0.809 1.169 0.57 0.823 0.372 0.538 0.003-1.094c0.002-0.868-0.001-1.096-0.009-1.103z"/>
<path android:fillColor="#ffffff" android:pathData="M23.989 19.851c0-5.417 0.002-9.847 0.004-9.845 0.004 0.004 0.116 0.196 0.981 1.684l1.986 3.413 0.277 0.477 1.245 2.139 0.774 1.33 0.652 1.12 0.308 0.529 1.088 1.868c0.892 1.531 1.077 1.852 1.075 1.854l-0.274 0.173c-0.383 0.241-1.264 0.795-1.636 1.031l-1.041 0.656-1.243 0.783-1.846 1.164-1.835 1.156c-0.277 0.175-0.507 0.319-0.509 0.319-0.003 0-0.005-4.432-0.005-9.85zm2.579 6.766l3.745-2.358c0.193-0.122 0.361-0.228 0.371-0.237l0.019-0.015-0.023-0.038-0.04-0.069-0.05-0.088-0.052-0.088-0.17-0.291-0.072-0.125c0-0.003-0.007-0.015-0.017-0.027-0.009-0.013-0.027-0.043-0.04-0.067-0.023-0.041-0.138-0.241-0.599-1.033l-0.652-1.12-0.761-1.308c-0.702-1.204-2.226-3.823-2.702-4.642l-0.287-0.49c-0.004-0.004-0.008 2.758-0.008 6.413 0 5.862 0.001 6.421 0.014 6.416 0.008-0.003 0.603-0.377 1.323-0.831zm-2.938 2.864l-0.49-0.309-0.276-0.173-0.818-0.516-1.011-0.637-0.477-0.3-0.232-0.146-0.284-0.179-0.319-0.201-0.888-0.56c-0.426-0.268-0.863-0.543-0.971-0.613l-0.473-0.298-0.438-0.276-0.652-0.41-0.704-0.444c-0.003-0.003 0.081-0.148 0.314-0.546l0.249-0.429 0.249-0.429 0.263-0.451 0.372-0.639 0.42-0.722 0.433-0.744 1.291-2.218 0.648-1.111 0.264-0.455 0.433-0.744 0.453-0.779 0.389-0.669 0.403-0.691 0.484-0.831 0.652-1.12 0.403-0.691 0.479-0.823c0.052-0.089 0.116-0.2 0.144-0.245l0.049-0.083v9.851c0 5.417-0.003 9.85-0.006 9.849-0.004 0-0.163-0.098-0.353-0.219zm-0.884-8.447c0-3.53-0.002-6.418-0.004-6.418-0.003 0-0.026 0.038-0.054 0.085l-0.082 0.143-0.249 0.429-0.385 0.661-0.438 0.752-0.497 0.853-1.209 2.078-0.481 0.827-1.314 2.258-0.266 0.459-0.033 0.057c-0.004 0.003-0.011 0.014-0.018 0.026l-0.101 0.173-0.102 0.177c-0.04 0.07-0.081 0.141-0.092 0.157l-0.057 0.096-0.067 0.113-0.029 0.048 0.055 0.035 0.159 0.102 0.146 0.092 0.313 0.197 0.923 0.582 0.84 0.529 1.159 0.731 1.046 0.659 0.315 0.199c0.403 0.255 0.507 0.319 0.514 0.319 0.004 0 0.007-2.888 0.007-6.418z"/>
</vector>
4 changes: 4 additions & 0 deletions commons/src/main/res/drawable/ic_github_tinted_vector.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="176" android:viewportHeight="176">
<path android:fillColor="#262626" android:pathData="M88 0a88 88 0 0 1 88 88 88 88 0 0 1-88 88A88 88 0 0 1 0 88 88 88 0 0 1 88 0z"/>
<path android:fillColor="#ffffff" android:pathData="M88 35.29c-30.39 0-55 24.2-55 54.05 0 23.88 15.76 44.14 37.61 51.28 2.75 0.5 3.75-1.17 3.75-2.6 0-1.43 0-4.69-0.06-9.19-15.3 3.26-18.53-7.25-18.53-7.25-2.5-6.24-6.12-7.91-6.12-7.91-5-3.35 0.39-3.28 0.39-3.28 5.52 0.37 8.42 5.57 8.42 5.57 4.9 8.26 12.87 5.87 16 4.49a11.42 11.42 0 0 1 3.54-7.22c-12.21-1.36-25-6-25-26.71A20.64 20.64 0 0 1 58.57 72c-0.62-1.37-2.47-6.86 0.48-14.31 0 0 4.61-1.45 15.13 5.54a52.85 52.85 0 0 1 27.5 0c10.45-7 15-5.54 15-5.54 3 7.45 1.1 12.94 0.55 14.31a20.71 20.71 0 0 1 5.64 14.5c0 20.76-12.86 25.33-25.09 26.66 1.92 1.62 3.71 4.94 3.71 10 0 7.23-0.07 13-0.07 14.8 0 1.42 1 3.11 3.78 2.57 22-7.1 37.75-27.37 37.75-51.21C143 59.49 118.37 35.29 88 35.29z"/>
</vector>
Loading

0 comments on commit 6416dab

Please sign in to comment.