diff --git a/lawnchair/res/drawable/ic_discord.xml b/lawnchair/res/drawable/ic_discord.xml index beb379db9d..5c2ab2aea3 100644 --- a/lawnchair/res/drawable/ic_discord.xml +++ b/lawnchair/res/drawable/ic_discord.xml @@ -1,9 +1,10 @@ - + android:width="192dp" + android:height="192dp" + android:viewportWidth="192" + android:viewportHeight="192" + android:tint="#000000"> + + + diff --git a/lawnchair/res/drawable/ic_donate.xml b/lawnchair/res/drawable/ic_donate.xml new file mode 100644 index 0000000000..522bfaee1b --- /dev/null +++ b/lawnchair/res/drawable/ic_donate.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/lawnchair/res/drawable/ic_github.xml b/lawnchair/res/drawable/ic_github.xml index 78a820bfe3..04ef8b4629 100644 --- a/lawnchair/res/drawable/ic_github.xml +++ b/lawnchair/res/drawable/ic_github.xml @@ -1,10 +1,5 @@ - - + + + + diff --git a/lawnchair/res/drawable/ic_telegram.xml b/lawnchair/res/drawable/ic_telegram.xml new file mode 100644 index 0000000000..63e0b7f139 --- /dev/null +++ b/lawnchair/res/drawable/ic_telegram.xml @@ -0,0 +1,8 @@ + + + diff --git a/lawnchair/res/drawable/ic_translate.xml b/lawnchair/res/drawable/ic_translate.xml new file mode 100644 index 0000000000..ef5aadd9e4 --- /dev/null +++ b/lawnchair/res/drawable/ic_translate.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/lawnchair/res/drawable/ic_x_twitter.xml b/lawnchair/res/drawable/ic_x_twitter.xml index 753b647906..5b45bc1e10 100644 --- a/lawnchair/res/drawable/ic_x_twitter.xml +++ b/lawnchair/res/drawable/ic_x_twitter.xml @@ -1,9 +1,10 @@ - + android:width="192dp" + android:height="192dp" + android:viewportWidth="192" + android:viewportHeight="192" + android:tint="#000000"> + + + diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index 029d485dba..530a79fd5d 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -440,11 +440,11 @@ About the app --> - News - Support - X + GitHub - Discord + Support + Translate + Donate Product Design and development @@ -453,9 +453,15 @@ DevOps Support and PR + Community + X + Telegram + News + Discord + + Legal Acknowledgements - Translate - Donate + Privacy policy Active diff --git a/lawnchair/src/app/lawnchair/ui/preferences/about/About.kt b/lawnchair/src/app/lawnchair/ui/preferences/about/About.kt index 2009573310..db6550efca 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/about/About.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/about/About.kt @@ -46,6 +46,7 @@ import app.lawnchair.ui.preferences.LocalIsExpandedScreen import app.lawnchair.ui.preferences.components.NavigationActionPreference import app.lawnchair.ui.preferences.components.controls.ClickablePreference import app.lawnchair.ui.preferences.components.layout.PreferenceDivider +import app.lawnchair.ui.preferences.components.layout.PreferenceGroupHeading import app.lawnchair.ui.preferences.components.layout.PreferenceGroupItem import app.lawnchair.ui.preferences.components.layout.PreferenceLayoutLazyColumn import app.lawnchair.ui.preferences.components.layout.preferenceGroupItems @@ -136,7 +137,7 @@ fun About( .fillMaxWidth() .padding(horizontal = 16.dp), ) { - uiState.links.forEach { link -> + uiState.topLinks.forEach { link -> LawnchairLink( iconResId = link.iconResId, label = stringResource(id = link.labelResId), @@ -166,8 +167,22 @@ fun About( member = it, ) } + preferenceGroupItems( + items = uiState.bottomLinks, + key = { _, it -> it.labelResId }, + isFirstChild = false, + heading = { stringResource(id = R.string.community) }, + ) { _, it -> + HorizontalLawnchairLink( + iconResId = it.iconResId, + label = stringResource(id = it.labelResId), + url = it.url, + ) + } item { - Spacer(modifier = Modifier.requiredHeight(16.dp)) + PreferenceGroupHeading( + stringResource(R.string.legal), + ) } item { PreferenceGroupItem( @@ -187,27 +202,9 @@ fun About( ) { PreferenceDivider() ClickablePreference( - label = stringResource(id = R.string.translate), + label = stringResource(id = R.string.privacy_policy), onClick = { - val webpage = CROWDIN_URL.toUri() - val intent = Intent(Intent.ACTION_VIEW, webpage) - if (intent.resolveActivity(context.packageManager) != null) { - context.startActivity(intent) - } - }, - ) - } - } - item { - PreferenceGroupItem( - cutTop = true, - cutBottom = false, - ) { - PreferenceDivider() - ClickablePreference( - label = stringResource(id = R.string.donate), - onClick = { - val webpage = OPENCOLLECTIVE_FUNDING_URL.toUri() + val webpage = PRIVACY_POLICY.toUri() val intent = Intent(Intent.ACTION_VIEW, webpage) if (intent.resolveActivity(context.packageManager) != null) { context.startActivity(intent) @@ -219,5 +216,4 @@ fun About( } } -private const val OPENCOLLECTIVE_FUNDING_URL = "https://opencollective.com/lawnchair" -private const val CROWDIN_URL = "https://lawnchair.crowdin.com/lawnchair" +private const val PRIVACY_POLICY = "https://lawnchair.app/privacy_policy" diff --git a/lawnchair/src/app/lawnchair/ui/preferences/about/AboutModels.kt b/lawnchair/src/app/lawnchair/ui/preferences/about/AboutModels.kt index 365de98b05..2c0a3648b9 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/about/AboutModels.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/about/AboutModels.kt @@ -16,7 +16,7 @@ import java.io.File * @param commitHash The commit hash of the current build. * @param coreTeam A list of [TeamMember] objects representing the core development team. * @param supportAndPr A list of [TeamMember] objects representing those involved in support and public relations. - * @param links A list of [Link] objects representing useful external links (e.g., social media, website). + * @param topLinks A list of [Link] objects representing useful external links (e.g., social media, website). * @param updateState The current [UpdateState] of the application's update checker. */ data class AboutUiState( @@ -24,7 +24,8 @@ data class AboutUiState( val commitHash: String = "", val coreTeam: List = emptyList(), val supportAndPr: List = emptyList(), - val links: List = emptyList(), + val topLinks: List = emptyList(), + val bottomLinks: List = emptyList(), val updateState: UpdateState = UpdateState.Hidden, ) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/about/AboutViewModel.kt b/lawnchair/src/app/lawnchair/ui/preferences/about/AboutViewModel.kt index 27f952b13b..412a5977ae 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/about/AboutViewModel.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/about/AboutViewModel.kt @@ -32,7 +32,8 @@ class AboutViewModel( commitHash = BuildConfig.COMMIT_HASH, coreTeam = team, supportAndPr = supportAndPr, - links = links, + topLinks = topLinks, + bottomLinks = bottomLinks, ) } @@ -155,7 +156,7 @@ class AboutViewModel( ), ) - private val links = listOf( + private val topLinks = listOf( Link( iconResId = R.drawable.ic_new_releases, labelResId = R.string.news, @@ -164,23 +165,41 @@ class AboutViewModel( Link( iconResId = R.drawable.ic_help, labelResId = R.string.support, - url = "https://t.me/lccommunity", - ), - Link( - iconResId = R.drawable.ic_x_twitter, - labelResId = R.string.x_twitter, - url = "https://x.com/lawnchairapp", + url = "https://lawnchair.app/support", ), Link( iconResId = R.drawable.ic_github, labelResId = R.string.github, url = "https://github.com/LawnchairLauncher/lawnchair", ), + Link( + iconResId = R.drawable.ic_translate, + labelResId = R.string.translate, + url = "https://lawnchair.crowdin.com/lawnchair", + ), + Link( + iconResId = R.drawable.ic_donate, + labelResId = R.string.donate, + url = "https://opencollective.com/lawnchair", + ), + ) + + private val bottomLinks = listOf( + Link( + iconResId = R.drawable.ic_telegram, + labelResId = R.string.telegram, + url = "https://t.me/lccommunity", + ), Link( iconResId = R.drawable.ic_discord, labelResId = R.string.discord, url = "https://discord.com/invite/3x8qNWxgGZ", ), + Link( + iconResId = R.drawable.ic_x_twitter, + labelResId = R.string.x_twitter, + url = "https://x.com/lawnchairapp", + ), ) private val supportAndPr = listOf( diff --git a/lawnchair/src/app/lawnchair/ui/preferences/about/LawnchairLink.kt b/lawnchair/src/app/lawnchair/ui/preferences/about/LawnchairLink.kt index 4998f1c2ae..4a5e555fac 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/about/LawnchairLink.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/about/LawnchairLink.kt @@ -17,7 +17,6 @@ package app.lawnchair.ui.preferences.about import android.content.Intent -import android.net.Uri import androidx.annotation.DrawableRes import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -26,9 +25,12 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -39,6 +41,8 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import androidx.core.net.toUri +import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate @Composable fun LawnchairLink( @@ -56,7 +60,7 @@ fun LawnchairLink( .height(64.dp) .clip(MaterialTheme.shapes.medium) .clickable { - val webpage = Uri.parse(url) + val webpage = url.toUri() val intent = Intent(Intent.ACTION_VIEW, webpage) if (intent.resolveActivity(context.packageManager) != null) { context.startActivity(intent) @@ -78,3 +82,40 @@ fun LawnchairLink( ) } } + +@Composable +fun HorizontalLawnchairLink( + @DrawableRes iconResId: Int, + label: String, + url: String, + modifier: Modifier = Modifier, +) { + val context = LocalContext.current + + PreferenceTemplate( + modifier = modifier.clickable { + val webpage = url.toUri() + val intent = Intent(Intent.ACTION_VIEW, webpage) + if (intent.resolveActivity(context.packageManager) != null) { + context.startActivity(intent) + } + }, + title = { + Text(label) + }, + startWidget = { + Surface( + shape = CircleShape, + color = MaterialTheme.colorScheme.secondaryContainer, + modifier = Modifier.requiredSize(32.dp), + ) { + Image( + painterResource(id = iconResId), + contentDescription = null, + colorFilter = ColorFilter.tint(color = MaterialTheme.colorScheme.onSecondaryContainer), + modifier = Modifier.requiredSize(20.dp), + ) + } + }, + ) +}