From e11c8c28f20cab09c8ceffac315378227961240e Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Tue, 24 Oct 2023 20:23:38 +0200 Subject: [PATCH 1/9] feat: Add AboutTile --- .../SettingsScreen/atoms/AboutTile.kt | 69 +++++++++++++++++++ .../app/myzel394/alibi/ui/enums/Screen.kt | 1 + .../alibi/ui/screens/SettingsScreen.kt | 2 + app/src/main/res/values/strings.xml | 1 + 4 files changed, 73 insertions(+) create mode 100644 app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt new file mode 100644 index 0000000..ea5911a --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt @@ -0,0 +1,69 @@ +package app.myzel394.alibi.ui.components.SettingsScreen.atoms + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ChevronRight +import androidx.compose.material.icons.filled.Info +import androidx.compose.material.icons.filled.Notifications +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import app.myzel394.alibi.R +import app.myzel394.alibi.dataStore +import app.myzel394.alibi.db.AppSettings +import app.myzel394.alibi.ui.components.atoms.SettingsTile +import app.myzel394.alibi.ui.enums.Screen + +@Composable +fun AboutTile( + navController: NavController, +) { + val label = stringResource(R.string.ui_about_title) + + Row( + modifier = Modifier + .padding(horizontal = 32.dp, vertical = 48.dp) + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .background(MaterialTheme.colorScheme.surfaceVariant) + .padding(16.dp) + .semantics { + contentDescription = label + } + .clickable { + navController.navigate(Screen.About.route) + }, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + Icon( + Icons.Default.Info, + contentDescription = null, + ) + Text( + text = label, + ) + } + Icon( + Icons.Default.ChevronRight, + contentDescription = null, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/app/myzel394/alibi/ui/enums/Screen.kt b/app/src/main/java/app/myzel394/alibi/ui/enums/Screen.kt index 218bde3..d8ba5a8 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/enums/Screen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/enums/Screen.kt @@ -5,6 +5,7 @@ sealed class Screen(val route: String) { data object Settings : Screen("settings") data object Welcome : Screen("welcome") data object CustomRecordingNotifications : Screen("custom-recording-notifications") + data object About : Screen("about") fun withArgs(vararg args: String): String { return buildString { diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/SettingsScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/SettingsScreen.kt index b64a964..0c2e972 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/SettingsScreen.kt @@ -39,6 +39,7 @@ import app.myzel394.alibi.R import app.myzel394.alibi.dataStore import app.myzel394.alibi.db.AppSettings import app.myzel394.alibi.ui.SUPPORTS_DARK_MODE_NATIVELY +import app.myzel394.alibi.ui.components.SettingsScreen.atoms.AboutTile import app.myzel394.alibi.ui.components.SettingsScreen.atoms.BitrateTile import app.myzel394.alibi.ui.components.SettingsScreen.atoms.CustomNotificationTile import app.myzel394.alibi.ui.components.SettingsScreen.atoms.EncoderTile @@ -147,6 +148,7 @@ fun SettingsScreen( ForceExactMaxDurationTile() InAppLanguagePicker() CustomNotificationTile(navController = navController) + AboutTile(navController = navController) AnimatedVisibility(visible = settings.showAdvancedSettings) { Column( horizontalAlignment = Alignment.CenterHorizontally, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 33e9c64..378ea4f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -88,4 +88,5 @@ Show Duration Update notification This is a preview for your notification. You can edit the title and the message. At the bottom you can find some presets. + About Alibi \ No newline at end of file From 8c77376fa6373b4d382c4e728621848e9ed7f1fa Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Tue, 24 Oct 2023 20:37:15 +0200 Subject: [PATCH 2/9] feat: Added basic AboutScreen --- app/build.gradle | 1 + .../java/app/myzel394/alibi/ui/Navigation.kt | 14 +++ .../SettingsScreen/atoms/AboutTile.kt | 8 +- .../myzel394/alibi/ui/screens/AboutScreen.kt | 97 +++++++++++++++++++ 4 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt diff --git a/app/build.gradle b/app/build.gradle index b7ff841..f0256b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -78,6 +78,7 @@ android { } buildFeatures { compose true + buildConfig = true } composeOptions { kotlinCompilerExtensionVersion '1.5.1' diff --git a/app/src/main/java/app/myzel394/alibi/ui/Navigation.kt b/app/src/main/java/app/myzel394/alibi/ui/Navigation.kt index bd4bca3..efef5d4 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/Navigation.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/Navigation.kt @@ -27,6 +27,7 @@ import app.myzel394.alibi.dataStore import app.myzel394.alibi.db.LastRecording import app.myzel394.alibi.ui.enums.Screen import app.myzel394.alibi.ui.models.AudioRecorderModel +import app.myzel394.alibi.ui.screens.AboutScreen import app.myzel394.alibi.ui.screens.AudioRecorder import app.myzel394.alibi.ui.screens.CustomRecordingNotificationsScreen import app.myzel394.alibi.ui.screens.SettingsScreen @@ -111,5 +112,18 @@ fun Navigation( navController = navController, ) } + composable( + Screen.About.route, + enterTransition = { + scaleIn() + }, + exitTransition = { + scaleOut() + fadeOut(tween(150)) + } + ) { + AboutScreen( + navController = navController, + ) + } } } diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt index ea5911a..c4a5089 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt @@ -39,15 +39,15 @@ fun AboutTile( modifier = Modifier .padding(horizontal = 32.dp, vertical = 48.dp) .fillMaxWidth() - .clip(MaterialTheme.shapes.medium) - .background(MaterialTheme.colorScheme.surfaceVariant) - .padding(16.dp) .semantics { contentDescription = label } .clickable { navController.navigate(Screen.About.route) - }, + } + .clip(MaterialTheme.shapes.medium) + .background(MaterialTheme.colorScheme.surfaceVariant) + .padding(16.dp), horizontalArrangement = Arrangement.SpaceBetween, ) { Row( diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt new file mode 100644 index 0000000..5476290 --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt @@ -0,0 +1,97 @@ +package app.myzel394.alibi.ui.screens + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +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.TopAppBarDefaults +import androidx.compose.material3.rememberTopAppBarState +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.input.nestedscroll.nestedScroll +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import app.myzel394.alibi.R +import app.myzel394.alibi.BuildConfig + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AboutScreen( + navController: NavController, +) { + val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior( + rememberTopAppBarState() + ) + + Scaffold( + topBar = { + TopAppBar( + title = { + Text(stringResource(R.string.ui_about_title)) + }, + navigationIcon = { + IconButton(onClick = navController::popBackStack) { + Icon( + Icons.Default.ArrowBack, + contentDescription = "Back" + ) + } + }, + scrollBehavior = scrollBehavior, + ) + }, + modifier = Modifier + .nestedScroll(scrollBehavior.nestedScrollConnection) + ) { padding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(padding), + verticalArrangement = Arrangement.spacedBy(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Box( + modifier = Modifier + .clip(CircleShape) + .size(200.dp) + .background( + MaterialTheme.colorScheme.surfaceVariant + ), + ) { + Image( + painter = painterResource(R.drawable.launcher_foreground), + contentDescription = null, + ) + } + Text( + text = stringResource(R.string.app_name), + style = MaterialTheme.typography.headlineLarge, + ) + Text( + text = "Version %s (%s)".format( + BuildConfig.VERSION_NAME, + BuildConfig.VERSION_CODE.toString() + ), + style = MaterialTheme.typography.bodyMedium, + ) + } + } +} From d6a95c4ce1d18ff94fb70960743528785d5a0be2 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Wed, 25 Oct 2023 15:44:05 +0200 Subject: [PATCH 3/9] current stand --- .../myzel394/alibi/ui/screens/AboutScreen.kt | 97 ++++++++++++++----- app/src/main/res/drawable/ic_github.xml | 10 ++ app/src/main/res/values/strings.xml | 3 + 3 files changed, 87 insertions(+), 23 deletions(-) create mode 100644 app/src/main/res/drawable/ic_github.xml diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt index 5476290..f260943 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt @@ -5,12 +5,16 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row 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.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.OpenInNew +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -24,9 +28,11 @@ 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.ColorFilter import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.navigation.NavController import app.myzel394.alibi.R @@ -64,34 +70,79 @@ fun AboutScreen( Column( modifier = Modifier .fillMaxSize() - .padding(padding), - verticalArrangement = Arrangement.spacedBy(16.dp), + .padding(padding) + .padding(horizontal = 32.dp), + verticalArrangement = Arrangement.spacedBy(48.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { - Box( - modifier = Modifier - .clip(CircleShape) - .size(200.dp) - .background( - MaterialTheme.colorScheme.surfaceVariant - ), + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, ) { - Image( - painter = painterResource(R.drawable.launcher_foreground), - contentDescription = null, + Box( + modifier = Modifier + .clip(CircleShape) + .size(200.dp) + .background( + MaterialTheme.colorScheme.surfaceVariant + ), + ) { + Image( + painter = painterResource(R.drawable.launcher_foreground), + contentDescription = null, + ) + } + Text( + text = stringResource(R.string.app_name), + style = MaterialTheme.typography.headlineLarge, + ) + Text( + text = "Version %s (%s)".format( + BuildConfig.VERSION_NAME, + BuildConfig.VERSION_CODE.toString() + ), + style = MaterialTheme.typography.bodyMedium, ) } - Text( - text = stringResource(R.string.app_name), - style = MaterialTheme.typography.headlineLarge, - ) - Text( - text = "Version %s (%s)".format( - BuildConfig.VERSION_NAME, - BuildConfig.VERSION_CODE.toString() - ), - style = MaterialTheme.typography.bodyMedium, - ) + Column( + verticalArrangement = Arrangement.spacedBy(24.dp), + ) { + Text( + stringResource(R.string.ui_about_contribute_title), + style = MaterialTheme.typography.titleMedium, + ) + Text( + stringResource(R.string.ui_about_contribute_message), + style = MaterialTheme.typography.titleMedium, + ) + Row( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .background( + MaterialTheme.colorScheme.surfaceVariant + ) + .padding(16.dp), + horizontalArrangement = Arrangement.SpaceEvenly, + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = painterResource(R.drawable.ic_github), + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurfaceVariant), + contentDescription = null, + modifier = Modifier.size(ButtonDefaults.IconSize.times(1.5f)) + ) + Text( + stringResource(R.string.ui_about_contribute_development), + fontWeight = FontWeight.Bold, + ) + Icon( + Icons.Default.OpenInNew, + contentDescription = null, + modifier = Modifier.size(ButtonDefaults.IconSize) + ) + } + } } } } diff --git a/app/src/main/res/drawable/ic_github.xml b/app/src/main/res/drawable/ic_github.xml new file mode 100644 index 0000000..34241ea --- /dev/null +++ b/app/src/main/res/drawable/ic_github.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 378ea4f..527649d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,4 +89,7 @@ Update notification This is a preview for your notification. You can edit the title and the message. At the bottom you can find some presets. About Alibi + Support Alibi + In my free time I develop Alibi and other free open source software. It would mean the world to me if you could help me in any way :) + Developing features or fixing bugs \ No newline at end of file From a024ef915444f9110e97b5f945ad41d1d768c032 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:19:40 +0200 Subject: [PATCH 4/9] feat: Improving AboutScreen --- .../SettingsScreen/atoms/AboutTile.kt | 2 +- .../myzel394/alibi/ui/screens/AboutScreen.kt | 110 +++++++++++++++++- app/src/main/res/drawable/ic_crowdin.xml | 24 ++++ app/src/main/res/values/strings.xml | 3 + 4 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_crowdin.xml diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt index c4a5089..857584d 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/SettingsScreen/atoms/AboutTile.kt @@ -39,13 +39,13 @@ fun AboutTile( modifier = Modifier .padding(horizontal = 32.dp, vertical = 48.dp) .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) .semantics { contentDescription = label } .clickable { navController.navigate(Screen.About.route) } - .clip(MaterialTheme.shapes.medium) .background(MaterialTheme.colorScheme.surfaceVariant) .padding(16.dp), horizontalArrangement = Arrangement.SpaceBetween, diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt index f260943..f397944 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt @@ -2,6 +2,7 @@ package app.myzel394.alibi.ui.screens import androidx.compose.foundation.Image 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 @@ -13,6 +14,14 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.CurrencyBitcoin +import androidx.compose.material.icons.filled.CurrencyFranc +import androidx.compose.material.icons.filled.CurrencyLira +import androidx.compose.material.icons.filled.CurrencyPound +import androidx.compose.material.icons.filled.CurrencyRuble +import androidx.compose.material.icons.filled.CurrencyRupee +import androidx.compose.material.icons.filled.CurrencyYen +import androidx.compose.material.icons.filled.CurrencyYuan import androidx.compose.material.icons.filled.OpenInNew import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api @@ -25,18 +34,29 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.navigation.NavController import app.myzel394.alibi.R import app.myzel394.alibi.BuildConfig +import kotlin.random.Random + +const val GITHUB_URL = "https://github.com/Myzel394/Alibi" +const val CROWDIN_URL = "https://crowdin.com/project/alibi" @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -46,6 +66,7 @@ fun AboutScreen( val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior( rememberTopAppBarState() ) + val uriHandler = LocalUriHandler.current Scaffold( topBar = { @@ -115,22 +136,30 @@ fun AboutScreen( stringResource(R.string.ui_about_contribute_message), style = MaterialTheme.typography.titleMedium, ) + + val githubLabel = stringResource(R.string.accessibility_open_in_browser, GITHUB_URL) Row( modifier = Modifier .fillMaxWidth() .clip(MaterialTheme.shapes.medium) + .semantics { + contentDescription = githubLabel + } + .clickable { + uriHandler.openUri(GITHUB_URL) + } .background( MaterialTheme.colorScheme.surfaceVariant ) .padding(16.dp), - horizontalArrangement = Arrangement.SpaceEvenly, + horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { Image( painter = painterResource(R.drawable.ic_github), colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurfaceVariant), contentDescription = null, - modifier = Modifier.size(ButtonDefaults.IconSize.times(1.5f)) + modifier = Modifier.size(ButtonDefaults.IconSize.times(1.2f)) ) Text( stringResource(R.string.ui_about_contribute_development), @@ -142,6 +171,83 @@ fun AboutScreen( modifier = Modifier.size(ButtonDefaults.IconSize) ) } + + val crowdinLabel = + stringResource(R.string.accessibility_open_in_browser, CROWDIN_URL) + Row( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .semantics { + contentDescription = crowdinLabel + } + .clickable { + uriHandler.openUri(CROWDIN_URL) + } + .background( + MaterialTheme.colorScheme.surfaceVariant + ) + .padding(16.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = painterResource(R.drawable.ic_crowdin), + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurfaceVariant), + contentDescription = null, + modifier = Modifier.size(ButtonDefaults.IconSize.times(1.2f)) + ) + Text( + stringResource(R.string.ui_about_contribute_translation), + fontWeight = FontWeight.Bold, + ) + Icon( + Icons.Default.OpenInNew, + contentDescription = null, + modifier = Modifier.size(ButtonDefaults.IconSize) + ) + } + + var donationsOpened by rememberSaveable { + mutableStateOf(false) + } + val donationLabel = stringResource(R.string.ui_about_contribute_donatation) + Row( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .semantics { + contentDescription = donationLabel + } + .clickable { + donationsOpened = !donationsOpened + } + .background( + MaterialTheme.colorScheme.surfaceVariant + ) + .padding(16.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + listOf( + Icons.Default.CurrencyBitcoin, + Icons.Default.CurrencyFranc, + Icons.Default.CurrencyLira, + Icons.Default.CurrencyPound, + Icons.Default.CurrencyRuble, + Icons.Default.CurrencyRupee, + Icons.Default.CurrencyYen, + Icons.Default.CurrencyYuan, + ).asSequence().shuffled().first(), + contentDescription = null, + modifier = Modifier.size(ButtonDefaults.IconSize.times(1.2f)) + ) + Text( + stringResource(R.string.ui_about_contribute_donatation), + fontWeight = FontWeight.Bold, + ) + } } } } diff --git a/app/src/main/res/drawable/ic_crowdin.xml b/app/src/main/res/drawable/ic_crowdin.xml new file mode 100644 index 0000000..8326732 --- /dev/null +++ b/app/src/main/res/drawable/ic_crowdin.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 527649d..8976f4e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -92,4 +92,7 @@ Support Alibi In my free time I develop Alibi and other free open source software. It would mean the world to me if you could help me in any way :) Developing features or fixing bugs + Open link in browser: %s + Translate Alibi into your language + Make a donation \ No newline at end of file From fe9d2ef1e620df956318c83712d789934563de2a Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:44:02 +0200 Subject: [PATCH 5/9] feat: Add gpg key section to AboutScreen --- .../myzel394/alibi/ui/screens/AboutScreen.kt | 76 ++++++++++++++++++- app/src/main/res/values/strings.xml | 2 + 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt index f397944..3e87de0 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt @@ -1,5 +1,8 @@ package app.myzel394.alibi.ui.screens +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -11,7 +14,9 @@ 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.shape.CircleShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.CurrencyBitcoin @@ -22,7 +27,10 @@ import androidx.compose.material.icons.filled.CurrencyRuble import androidx.compose.material.icons.filled.CurrencyRupee import androidx.compose.material.icons.filled.CurrencyYen import androidx.compose.material.icons.filled.CurrencyYuan +import androidx.compose.material.icons.filled.Key import androidx.compose.material.icons.filled.OpenInNew +import androidx.compose.material.icons.filled.Shield +import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -43,6 +51,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -57,6 +66,21 @@ import kotlin.random.Random const val GITHUB_URL = "https://github.com/Myzel394/Alibi" const val CROWDIN_URL = "https://crowdin.com/project/alibi" +const val PUBLIC_KEY = """-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZTfvnhYJKwYBBAHaRw8BAQdAi2AiLsTaBoLhnQtY5vi3xBU/H428wbNfBSe+ +2dhz3r60Jk15emVsMzk0IDxnaXRodWIuN2Eyb3BAc2ltcGxlbG9naW4uY28+iJkE +ExYKAEEWIQR9BS8nNHwqrNgV0B3NE0dCwel5WQUCZTfvngIbAwUJEswDAAULCQgH +AgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRDNE0dCwel5WcS8AQCf9g6eEaut1suW +l6jCLIg3b1nWLckmLJaonM6PruUtigEAmVnFOxMpOZEIcILT8CD2Riy+IVN9gTNH +qOHnaFsu8AK4OARlN++eEgorBgEEAZdVAQUBAQdAe4ffDtRundKH9kam746i2TBu +P9sfb3QVi5QqfK+bek8DAQgHiH4EGBYKACYWIQR9BS8nNHwqrNgV0B3NE0dCwel5 +WQUCZTfvngIbDAUJEswDAAAKCRDNE0dCwel5WWwSAQDj4ZAl6bSqwbcptEMYQaPM +MMhMafm446MjkhQioeXw+wEAzA8mS6RBx7IZvu1dirmFHXOEYJclwjyQhNs4uEjq +/Ak= +=ICHe +-----END PGP PUBLIC KEY BLOCK-----""" +const val PUBLIC_KEY_FINGERPRINT = "7D05 2F27 347C 2AAC D815 D01D CD13 4742 C1E9 7959" @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -90,9 +114,9 @@ fun AboutScreen( ) { padding -> Column( modifier = Modifier - .fillMaxSize() .padding(padding) - .padding(horizontal = 32.dp), + .padding(horizontal = 32.dp) + .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(48.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { @@ -126,7 +150,7 @@ fun AboutScreen( ) } Column( - verticalArrangement = Arrangement.spacedBy(24.dp), + verticalArrangement = Arrangement.spacedBy(24.dp) ) { Text( stringResource(R.string.ui_about_contribute_title), @@ -248,6 +272,52 @@ fun AboutScreen( fontWeight = FontWeight.Bold, ) } + + Column( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .background( + MaterialTheme.colorScheme.primaryContainer + ) + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Icon( + Icons.Default.Key, + contentDescription = null, + modifier = Modifier.size(48.dp) + ) + + Text( + stringResource(R.string.ui_about_gpg_key_hint), + style = MaterialTheme.typography.bodyMedium, + ) + + val clipboardManager = + LocalContext.current.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + Text( + PUBLIC_KEY_FINGERPRINT, + modifier = Modifier + .clip(MaterialTheme.shapes.small) + .background( + MaterialTheme.colorScheme.surfaceVariant + ) + .padding(8.dp), + ) + Button( + onClick = { + val clip = ClipData.newPlainText("text", PUBLIC_KEY) + clipboardManager.setPrimaryClip(clip) + }, + colors = ButtonDefaults.textButtonColors(), + modifier = Modifier + .fillMaxWidth() + ) { + Text(stringResource(R.string.ui_about_gpg_key_copy)) + } + } } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8976f4e..6d76829 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,4 +95,6 @@ Open link in browser: %s Translate Alibi into your language Make a donation + You can copy my GPG key here. This key only exists once and I can use it to prove to you that I\'m really who I am. Please save it now so that you don\'t fall for a phishing attack later on. + Copy GPG Key \ No newline at end of file From b6d0501c851f04fdf459a43b854826949c5d7b43 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:59:23 +0200 Subject: [PATCH 6/9] feat: Add DonationsTile --- .../java/app/myzel394/alibi/ui/Constants.kt | 38 ++++++ .../AboutScreen/atoms/DonationsTile.kt | 127 ++++++++++++++++++ .../AboutScreen/atoms/GPGKeyOverview.kt | 77 +++++++++++ .../myzel394/alibi/ui/screens/AboutScreen.kt | 104 +------------- 4 files changed, 246 insertions(+), 100 deletions(-) create mode 100644 app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt create mode 100644 app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/GPGKeyOverview.kt diff --git a/app/src/main/java/app/myzel394/alibi/ui/Constants.kt b/app/src/main/java/app/myzel394/alibi/ui/Constants.kt index 903c212..41d5ca8 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/Constants.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/Constants.kt @@ -6,3 +6,41 @@ import androidx.compose.ui.unit.dp val BIG_PRIMARY_BUTTON_SIZE = 64.dp val MAX_AMPLITUDE = 20000 val SUPPORTS_DARK_MODE_NATIVELY = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + +const val PUBLIC_KEY = """-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZTfvnhYJKwYBBAHaRw8BAQdAi2AiLsTaBoLhnQtY5vi3xBU/H428wbNfBSe+ +2dhz3r60Jk15emVsMzk0IDxnaXRodWIuN2Eyb3BAc2ltcGxlbG9naW4uY28+iJkE +ExYKAEEWIQR9BS8nNHwqrNgV0B3NE0dCwel5WQUCZTfvngIbAwUJEswDAAULCQgH +AgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRDNE0dCwel5WcS8AQCf9g6eEaut1suW +l6jCLIg3b1nWLckmLJaonM6PruUtigEAmVnFOxMpOZEIcILT8CD2Riy+IVN9gTNH +qOHnaFsu8AK4OARlN++eEgorBgEEAZdVAQUBAQdAe4ffDtRundKH9kam746i2TBu +P9sfb3QVi5QqfK+bek8DAQgHiH4EGBYKACYWIQR9BS8nNHwqrNgV0B3NE0dCwel5 +WQUCZTfvngIbDAUJEswDAAAKCRDNE0dCwel5WWwSAQDj4ZAl6bSqwbcptEMYQaPM +MMhMafm446MjkhQioeXw+wEAzA8mS6RBx7IZvu1dirmFHXOEYJclwjyQhNs4uEjq +/Ak= +=ICHe +-----END PGP PUBLIC KEY BLOCK-----""" +const val PUBLIC_KEY_FINGERPRINT = "7D05 2F27 347C 2AAC D815 D01D CD13 4742 C1E9 7959" +val CRYPTO_DONATIONS = mapOf( + "Bitcoin" to "bc1qw054829yj8e2u8glxnfcg3w22dkek577mjt5x6", + "Bitcoin Cash" to "qr9s64vfqedvurfef9ykf7szchmt0xyvnga452fc8l", + "Ethereum" to "0xbb5E631c03C65334d1d9EfBCD926DC1265CC20D7", + "Tether USD" to "0xbb5E631c03C65334d1d9EfBCD926DC1265CC20D7", + "Monero" to "83dm5wyuckG4aPbuMREHCEgLNwVn5i7963SKBhECaA7Ueb7DKBTy639R3QfMtb3DsFHMp8u6WGiCFgbdRDBBcz5sLduUtm8", + "Zcash" to "t1ZfvNpzfdaW6csT9Kc7iJA7LUU3hmNj2sx", + "Litecoin" to "LZayhTosZ9ToRvcbeR1gEDgb76Z7ZA2drN", + "Dash" to "XcTkni8CVAXBcuc5VwvHmsYftVK4CPLetU", + "Avalanche" to "0xbb5E631c03C65334d1d9EfBCD926DC1265CC20D7", + "XRP" to "rNpfDm8UwDTumCebchBadjVW2FEPteFgNg", + "Solana" to "2h6CB3hz5Vb2nYS1RQiXZ4aWTzc5frBPR7Sp1b4muFqb", + "ADA" to "addr1q8vy2vcp6lacaw8lkc29gufuzajaytc5qc0c2mxlmw5lndxcg5esr4lm36u0lds523cnc9m96gh3gpsls4kdlkaflx6qf6qpvc", + "Dogecoin" to "DUA4j7mVoc7Rvezu8YgeRKwxNuMzKeDoxD", + "Tron" to "THWVLGhne5wDsGjd1CNenHDKQGzvGzrzLb", + "Polkadot" to "1642iaR6AoKyM6qnnMHkfCRfRqRKJ2wC6Cm3UEWEFEz6EtZR", + "Cosmos" to "cosmos1vt5z6rfj5sgnkdlddkuu8srw3xupyqxscva9hz", + "Algorand" to "QBOQ6VSLMD77QEF33P5J3HKGOM5RZLNO6P5P3FTWCMQM3ORF6QY2W34KUI", + "Tezos" to "tz1QUWNYuFqDibGCrwmkdaHSpTx3d6ZdxLMi", + "Litecoin" to "LZayhTosZ9ToRvcbeR1gEDgb76Z7ZA2drN", + "Filecoin" to "f1j6pm3chzhgadpf6iwmtux33jb5gccj5arkg4dsq", +) diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt new file mode 100644 index 0000000..c0f4010 --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt @@ -0,0 +1,127 @@ +package app.myzel394.alibi.ui.components.AboutScreen.atoms + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +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.material.icons.Icons +import androidx.compose.material.icons.filled.ContentCopy +import androidx.compose.material.icons.filled.CurrencyBitcoin +import androidx.compose.material.icons.filled.CurrencyFranc +import androidx.compose.material.icons.filled.CurrencyLira +import androidx.compose.material.icons.filled.CurrencyPound +import androidx.compose.material.icons.filled.CurrencyRuble +import androidx.compose.material.icons.filled.CurrencyRupee +import androidx.compose.material.icons.filled.CurrencyYen +import androidx.compose.material.icons.filled.CurrencyYuan +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import app.myzel394.alibi.R +import app.myzel394.alibi.ui.CRYPTO_DONATIONS +import app.myzel394.alibi.ui.PUBLIC_KEY + +@Composable +fun DonationsTile() { + var donationsOpened by rememberSaveable { + mutableStateOf(false) + } + val label = stringResource(R.string.ui_about_contribute_donatation) + + Row( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .semantics { + contentDescription = label + } + .clickable { + donationsOpened = !donationsOpened + } + .background( + MaterialTheme.colorScheme.surfaceVariant + ) + .padding(16.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + listOf( + Icons.Default.CurrencyBitcoin, + Icons.Default.CurrencyFranc, + Icons.Default.CurrencyLira, + Icons.Default.CurrencyPound, + Icons.Default.CurrencyRuble, + Icons.Default.CurrencyRupee, + Icons.Default.CurrencyYen, + Icons.Default.CurrencyYuan, + ).asSequence().shuffled().first(), + contentDescription = null, + modifier = Modifier.size(ButtonDefaults.IconSize.times(1.2f)) + ) + Text( + stringResource(R.string.ui_about_contribute_donatation), + fontWeight = FontWeight.Bold, + ) + } + + // TODO: Add LazyColumn, make expandable + Column { + val clipboardManager = + LocalContext.current.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + + for (crypto in CRYPTO_DONATIONS) { + Row( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .clickable { + val clip = ClipData.newPlainText("text", crypto.value) + clipboardManager.setPrimaryClip(clip) + } + .padding(8.dp) + .horizontalScroll(rememberScrollState()), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + Icons.Default.ContentCopy, + contentDescription = null, + ) + Text( + crypto.key, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Bold, + ) + Text( + crypto.value, + fontSize = MaterialTheme.typography.bodyMedium.fontSize.times(0.5), + ) + } + } + } +} diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/GPGKeyOverview.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/GPGKeyOverview.kt new file mode 100644 index 0000000..572f888 --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/GPGKeyOverview.kt @@ -0,0 +1,77 @@ +package app.myzel394.alibi.ui.components.AboutScreen.atoms + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +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.filled.Key +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +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.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import app.myzel394.alibi.R +import app.myzel394.alibi.ui.PUBLIC_KEY_FINGERPRINT +import app.myzel394.alibi.ui.PUBLIC_KEY + +@Composable +fun GPGKeyOverview() { + Column( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .background( + MaterialTheme.colorScheme.primaryContainer + ) + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + Icon( + Icons.Default.Key, + contentDescription = null, + modifier = Modifier.size(48.dp) + ) + + Text( + stringResource(R.string.ui_about_gpg_key_hint), + style = MaterialTheme.typography.bodyMedium, + ) + + val clipboardManager = + LocalContext.current.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + Text( + PUBLIC_KEY_FINGERPRINT, + modifier = Modifier + .clip(MaterialTheme.shapes.small) + .background( + MaterialTheme.colorScheme.surfaceVariant + ) + .padding(8.dp), + ) + Button( + onClick = { + val clip = ClipData.newPlainText("text", PUBLIC_KEY) + clipboardManager.setPrimaryClip(clip) + }, + colors = ButtonDefaults.textButtonColors(), + modifier = Modifier + .fillMaxWidth() + ) { + Text(stringResource(R.string.ui_about_gpg_key_copy)) + } + } +} diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt index 3e87de0..a23f79a 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt @@ -62,25 +62,12 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import app.myzel394.alibi.R import app.myzel394.alibi.BuildConfig +import app.myzel394.alibi.ui.components.AboutScreen.atoms.DonationsTile +import app.myzel394.alibi.ui.components.AboutScreen.atoms.GPGKeyOverview import kotlin.random.Random const val GITHUB_URL = "https://github.com/Myzel394/Alibi" const val CROWDIN_URL = "https://crowdin.com/project/alibi" -const val PUBLIC_KEY = """-----BEGIN PGP PUBLIC KEY BLOCK----- - -mDMEZTfvnhYJKwYBBAHaRw8BAQdAi2AiLsTaBoLhnQtY5vi3xBU/H428wbNfBSe+ -2dhz3r60Jk15emVsMzk0IDxnaXRodWIuN2Eyb3BAc2ltcGxlbG9naW4uY28+iJkE -ExYKAEEWIQR9BS8nNHwqrNgV0B3NE0dCwel5WQUCZTfvngIbAwUJEswDAAULCQgH -AgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRDNE0dCwel5WcS8AQCf9g6eEaut1suW -l6jCLIg3b1nWLckmLJaonM6PruUtigEAmVnFOxMpOZEIcILT8CD2Riy+IVN9gTNH -qOHnaFsu8AK4OARlN++eEgorBgEEAZdVAQUBAQdAe4ffDtRundKH9kam746i2TBu -P9sfb3QVi5QqfK+bek8DAQgHiH4EGBYKACYWIQR9BS8nNHwqrNgV0B3NE0dCwel5 -WQUCZTfvngIbDAUJEswDAAAKCRDNE0dCwel5WWwSAQDj4ZAl6bSqwbcptEMYQaPM -MMhMafm446MjkhQioeXw+wEAzA8mS6RBx7IZvu1dirmFHXOEYJclwjyQhNs4uEjq -/Ak= -=ICHe ------END PGP PUBLIC KEY BLOCK-----""" -const val PUBLIC_KEY_FINGERPRINT = "7D05 2F27 347C 2AAC D815 D01D CD13 4742 C1E9 7959" @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -232,92 +219,9 @@ fun AboutScreen( ) } - var donationsOpened by rememberSaveable { - mutableStateOf(false) - } - val donationLabel = stringResource(R.string.ui_about_contribute_donatation) - Row( - modifier = Modifier - .fillMaxWidth() - .clip(MaterialTheme.shapes.medium) - .semantics { - contentDescription = donationLabel - } - .clickable { - donationsOpened = !donationsOpened - } - .background( - MaterialTheme.colorScheme.surfaceVariant - ) - .padding(16.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - listOf( - Icons.Default.CurrencyBitcoin, - Icons.Default.CurrencyFranc, - Icons.Default.CurrencyLira, - Icons.Default.CurrencyPound, - Icons.Default.CurrencyRuble, - Icons.Default.CurrencyRupee, - Icons.Default.CurrencyYen, - Icons.Default.CurrencyYuan, - ).asSequence().shuffled().first(), - contentDescription = null, - modifier = Modifier.size(ButtonDefaults.IconSize.times(1.2f)) - ) - Text( - stringResource(R.string.ui_about_contribute_donatation), - fontWeight = FontWeight.Bold, - ) - } + DonationsTile() - Column( - modifier = Modifier - .fillMaxWidth() - .clip(MaterialTheme.shapes.medium) - .background( - MaterialTheme.colorScheme.primaryContainer - ) - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(16.dp), - ) { - Icon( - Icons.Default.Key, - contentDescription = null, - modifier = Modifier.size(48.dp) - ) - - Text( - stringResource(R.string.ui_about_gpg_key_hint), - style = MaterialTheme.typography.bodyMedium, - ) - - val clipboardManager = - LocalContext.current.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - Text( - PUBLIC_KEY_FINGERPRINT, - modifier = Modifier - .clip(MaterialTheme.shapes.small) - .background( - MaterialTheme.colorScheme.surfaceVariant - ) - .padding(8.dp), - ) - Button( - onClick = { - val clip = ClipData.newPlainText("text", PUBLIC_KEY) - clipboardManager.setPrimaryClip(clip) - }, - colors = ButtonDefaults.textButtonColors(), - modifier = Modifier - .fillMaxWidth() - ) { - Text(stringResource(R.string.ui_about_gpg_key_copy)) - } - } + GPGKeyOverview() } } } From e7bc1ac0b3e9627526c4b0f432d52036c3d36bda Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Thu, 26 Oct 2023 15:54:30 +0200 Subject: [PATCH 7/9] current stand --- .../AboutScreen/atoms/DonationsTile.kt | 69 ++++++++++--------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt index c0f4010..7e12526 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt @@ -3,6 +3,8 @@ package app.myzel394.alibi.ui.components.AboutScreen.atoms import android.content.ClipData import android.content.ClipboardManager import android.content.Context +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.expandVertically import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll @@ -12,6 +14,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ContentCopy @@ -89,38 +92,42 @@ fun DonationsTile() { ) } - // TODO: Add LazyColumn, make expandable - Column { - val clipboardManager = - LocalContext.current.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipboardManager = + LocalContext.current.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - for (crypto in CRYPTO_DONATIONS) { - Row( - modifier = Modifier - .fillMaxWidth() - .clip(MaterialTheme.shapes.medium) - .clickable { - val clip = ClipData.newPlainText("text", crypto.value) - clipboardManager.setPrimaryClip(clip) - } - .padding(8.dp) - .horizontalScroll(rememberScrollState()), - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - Icons.Default.ContentCopy, - contentDescription = null, - ) - Text( - crypto.key, - style = MaterialTheme.typography.bodyMedium, - fontWeight = FontWeight.Bold, - ) - Text( - crypto.value, - fontSize = MaterialTheme.typography.bodyMedium.fontSize.times(0.5), - ) + AnimatedVisibility( + visible = donationsOpened, + enter = expandVertically(), + ) { + Column { + for (crypto in CRYPTO_DONATIONS) { + Row( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .clickable { + val clip = ClipData.newPlainText("text", crypto.value) + clipboardManager.setPrimaryClip(clip) + } + .padding(8.dp) + .horizontalScroll(rememberScrollState()), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + Icons.Default.ContentCopy, + contentDescription = null, + ) + Text( + crypto.key, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Bold, + ) + Text( + crypto.value, + fontSize = MaterialTheme.typography.bodyMedium.fontSize.times(0.5), + ) + } } } } From cc3b0736c9cefcdc6cf3b3cf16cc29c8d8b9e3f5 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:36:16 +0200 Subject: [PATCH 8/9] fix: Improve DonationsTile --- .../AboutScreen/atoms/DonationsTile.kt | 57 +++++++++++++------ app/src/main/res/values/strings.xml | 2 +- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt index 7e12526..1cd47f6 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt @@ -4,6 +4,7 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.expandVertically import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -17,6 +18,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowDropDown import androidx.compose.material.icons.filled.ContentCopy import androidx.compose.material.icons.filled.CurrencyBitcoin import androidx.compose.material.icons.filled.CurrencyFranc @@ -38,6 +40,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.rotate import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription @@ -69,26 +72,44 @@ fun DonationsTile() { MaterialTheme.colorScheme.surfaceVariant ) .padding(16.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { - Icon( - listOf( - Icons.Default.CurrencyBitcoin, - Icons.Default.CurrencyFranc, - Icons.Default.CurrencyLira, - Icons.Default.CurrencyPound, - Icons.Default.CurrencyRuble, - Icons.Default.CurrencyRupee, - Icons.Default.CurrencyYen, - Icons.Default.CurrencyYuan, - ).asSequence().shuffled().first(), - contentDescription = null, - modifier = Modifier.size(ButtonDefaults.IconSize.times(1.2f)) + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + listOf( + Icons.Default.CurrencyBitcoin, + Icons.Default.CurrencyFranc, + Icons.Default.CurrencyLira, + Icons.Default.CurrencyPound, + Icons.Default.CurrencyRuble, + Icons.Default.CurrencyRupee, + Icons.Default.CurrencyYen, + Icons.Default.CurrencyYuan, + ).asSequence().shuffled().first(), + contentDescription = null, + modifier = Modifier.size(ButtonDefaults.IconSize.times(1.2f)) + ) + Text( + stringResource(R.string.ui_about_contribute_donatation), + fontWeight = FontWeight.Bold, + ) + } + + val rotation by animateFloatAsState( + if (donationsOpened) -180f else 0f, + label = "iconRotation" ) - Text( - stringResource(R.string.ui_about_contribute_donatation), - fontWeight = FontWeight.Bold, + + Icon( + Icons.Default.ArrowDropDown, + contentDescription = null, + modifier = Modifier + .size(ButtonDefaults.IconSize.times(1.2f)) + .rotate(rotation) ) } @@ -109,7 +130,7 @@ fun DonationsTile() { val clip = ClipData.newPlainText("text", crypto.value) clipboardManager.setPrimaryClip(clip) } - .padding(8.dp) + .padding(16.dp) .horizontalScroll(rememberScrollState()), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6d76829..42d3aca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,6 +95,6 @@ Open link in browser: %s Translate Alibi into your language Make a donation - You can copy my GPG key here. This key only exists once and I can use it to prove to you that I\'m really who I am. Please save it now so that you don\'t fall for a phishing attack later on. + You can copy my GPG key here. This key only exists once and I can use it to prove to you that I\'m really who I am. Please save it now so that you can verify my signature later. Copy GPG Key \ No newline at end of file From 3d7f053e8b1e72f6edecd88f80b8d092e80f6282 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:43:31 +0200 Subject: [PATCH 9/9] feat: Add GITHUB_SPONSORS_URL --- .../java/app/myzel394/alibi/ui/Constants.kt | 5 +++ .../AboutScreen/atoms/DonationsTile.kt | 27 +++++++++++++++ .../myzel394/alibi/ui/screens/AboutScreen.kt | 34 ++++--------------- app/src/main/res/values/strings.xml | 1 + 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/app/myzel394/alibi/ui/Constants.kt b/app/src/main/java/app/myzel394/alibi/ui/Constants.kt index 41d5ca8..bf3dce1 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/Constants.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/Constants.kt @@ -7,6 +7,11 @@ val BIG_PRIMARY_BUTTON_SIZE = 64.dp val MAX_AMPLITUDE = 20000 val SUPPORTS_DARK_MODE_NATIVELY = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q +// You are not allowed to change the constants below. +// If you do so, you will be blocked on GitHub. +const val REPO_URL = "https://github.com/Myzel394/Alibi" +const val TRANSLATION_HELP_URL = "https://crowdin.com/project/alibi" +const val GITHUB_SPONSORS_URL = "https://github.com/sponsors/Myzel394" const val PUBLIC_KEY = """-----BEGIN PGP PUBLIC KEY BLOCK----- mDMEZTfvnhYJKwYBBAHaRw8BAQdAi2AiLsTaBoLhnQtY5vi3xBU/H428wbNfBSe+ diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt index 1cd47f6..1944e38 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/AboutScreen/atoms/DonationsTile.kt @@ -6,12 +6,14 @@ import android.content.Context import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.expandVertically +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -28,6 +30,7 @@ import androidx.compose.material.icons.filled.CurrencyRuble import androidx.compose.material.icons.filled.CurrencyRupee import androidx.compose.material.icons.filled.CurrencyYen import androidx.compose.material.icons.filled.CurrencyYuan +import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -41,7 +44,10 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.rotate +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics @@ -49,6 +55,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import app.myzel394.alibi.R import app.myzel394.alibi.ui.CRYPTO_DONATIONS +import app.myzel394.alibi.ui.GITHUB_SPONSORS_URL import app.myzel394.alibi.ui.PUBLIC_KEY @Composable @@ -121,6 +128,26 @@ fun DonationsTile() { enter = expandVertically(), ) { Column { + val uriHandler = LocalUriHandler.current + + Button( + onClick = { + uriHandler.openUri(GITHUB_SPONSORS_URL) + }, + colors = ButtonDefaults.textButtonColors(), + modifier = Modifier.fillMaxWidth(), + ) { + Image( + painter = painterResource(R.drawable.ic_github), + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary), + contentDescription = null, + modifier = Modifier.size(ButtonDefaults.IconSize.times(1.2f)) + ) + Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) + Text( + stringResource(R.string.ui_about_contribute_donation_githubSponsors) + ) + } for (crypto in CRYPTO_DONATIONS) { Row( modifier = Modifier diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt index a23f79a..8082fe5 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/AboutScreen.kt @@ -1,8 +1,5 @@ package app.myzel394.alibi.ui.screens -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -10,7 +7,6 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -19,18 +15,7 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material.icons.filled.CurrencyBitcoin -import androidx.compose.material.icons.filled.CurrencyFranc -import androidx.compose.material.icons.filled.CurrencyLira -import androidx.compose.material.icons.filled.CurrencyPound -import androidx.compose.material.icons.filled.CurrencyRuble -import androidx.compose.material.icons.filled.CurrencyRupee -import androidx.compose.material.icons.filled.CurrencyYen -import androidx.compose.material.icons.filled.CurrencyYuan -import androidx.compose.material.icons.filled.Key import androidx.compose.material.icons.filled.OpenInNew -import androidx.compose.material.icons.filled.Shield -import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -42,16 +27,11 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -62,12 +42,10 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import app.myzel394.alibi.R import app.myzel394.alibi.BuildConfig +import app.myzel394.alibi.ui.TRANSLATION_HELP_URL +import app.myzel394.alibi.ui.REPO_URL import app.myzel394.alibi.ui.components.AboutScreen.atoms.DonationsTile import app.myzel394.alibi.ui.components.AboutScreen.atoms.GPGKeyOverview -import kotlin.random.Random - -const val GITHUB_URL = "https://github.com/Myzel394/Alibi" -const val CROWDIN_URL = "https://crowdin.com/project/alibi" @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -148,7 +126,7 @@ fun AboutScreen( style = MaterialTheme.typography.titleMedium, ) - val githubLabel = stringResource(R.string.accessibility_open_in_browser, GITHUB_URL) + val githubLabel = stringResource(R.string.accessibility_open_in_browser, REPO_URL) Row( modifier = Modifier .fillMaxWidth() @@ -157,7 +135,7 @@ fun AboutScreen( contentDescription = githubLabel } .clickable { - uriHandler.openUri(GITHUB_URL) + uriHandler.openUri(REPO_URL) } .background( MaterialTheme.colorScheme.surfaceVariant @@ -184,7 +162,7 @@ fun AboutScreen( } val crowdinLabel = - stringResource(R.string.accessibility_open_in_browser, CROWDIN_URL) + stringResource(R.string.accessibility_open_in_browser, TRANSLATION_HELP_URL) Row( modifier = Modifier .fillMaxWidth() @@ -193,7 +171,7 @@ fun AboutScreen( contentDescription = crowdinLabel } .clickable { - uriHandler.openUri(CROWDIN_URL) + uriHandler.openUri(TRANSLATION_HELP_URL) } .background( MaterialTheme.colorScheme.surfaceVariant diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 42d3aca..e3fd669 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -97,4 +97,5 @@ Make a donation You can copy my GPG key here. This key only exists once and I can use it to prove to you that I\'m really who I am. Please save it now so that you can verify my signature later. Copy GPG Key + Become a GitHub Sponsor \ No newline at end of file