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),
+ )
+ }
+ },
+ )
+}