From ffadcda99c643a2979283a5b7e992e7ee410d40f Mon Sep 17 00:00:00 2001 From: Narek Torosyan Date: Thu, 17 Mar 2022 23:49:16 +0400 Subject: [PATCH 01/18] Setup wizard: initial config page --- .idea/misc.xml | 1 + app/src/main/AndroidManifest.xml | 7 +- .../com/porg/gugal/Material3SetupWizard.kt | 81 +++++++++++++++ .../com/porg/gugal/providers/DummySerp.kt | 10 +- .../com/porg/gugal/providers/SerpProvider.kt | 10 +- .../porg/gugal/providers/cse/GoogleCseSerp.kt | 23 +++-- .../gugal/setup/SetupConfigureSerpActivity.kt | 98 +++++++++++++++++++ .../porg/gugal/setup/SetupStartActivity.kt | 7 +- app/src/main/res/drawable/ic_back.xml | 24 +++++ app/src/main/res/values/strings.xml | 1 - 10 files changed, 249 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/porg/gugal/Material3SetupWizard.kt create mode 100644 app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt create mode 100644 app/src/main/res/drawable/ic_back.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 8af44db9..c4f46d89 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -7,6 +7,7 @@ + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 26242c61..0d8682bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,7 +34,12 @@ + + diff --git a/app/src/main/java/com/porg/gugal/Material3SetupWizard.kt b/app/src/main/java/com/porg/gugal/Material3SetupWizard.kt new file mode 100644 index 00000000..87f3bc43 --- /dev/null +++ b/app/src/main/java/com/porg/gugal/Material3SetupWizard.kt @@ -0,0 +1,81 @@ +/* + * Material3SetupWizard.kt + * Gugal + * Copyright (c) 2022 thegreatporg + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.porg.gugal + +import androidx.compose.foundation.layout.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp + +class Material3SetupWizard { + companion object { + @Composable + fun Header(text: String, doFinish: () -> Unit) { + IconButton( + onClick =doFinish, + modifier = Modifier. + then(Modifier.padding(start = 16.dp, top = 16.dp, bottom = 0.dp, end = 16.dp)) + ) { + Icon( + imageVector = Icons.Filled.ArrowBack, + contentDescription = "Go back", + ) + } + Text( + text = text, + modifier = Modifier + .padding(start = 24.dp, top = 72.dp, bottom = 24.dp, end = 24.dp) + .fillMaxWidth(), + style = MaterialTheme.typography.displaySmall + ) + } + + @Composable + fun TwoButtons(positive: () -> Unit, positiveText: String, negative: () -> Unit, negativeText: String = "Back") { + Box( + modifier = Modifier.fillMaxSize().then(PaddingModifier), + Alignment.BottomCenter + ) { + Surface(modifier = Modifier.fillMaxWidth(),color = MaterialTheme.colorScheme.background, tonalElevation = 0.dp) { + Box (modifier = Modifier.fillMaxWidth()) { + Button( + modifier = Modifier.padding(all = 4.dp).align(Alignment.BottomEnd), + onClick = positive + ) { + Text(positiveText) + } + OutlinedButton( + modifier = Modifier.padding(all = 4.dp).align(Alignment.BottomStart), + onClick = negative + ) { + Text(negativeText) + } + } + } + } + } + + val PaddingModifier: Modifier = Modifier.padding(16.dp) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/porg/gugal/providers/DummySerp.kt b/app/src/main/java/com/porg/gugal/providers/DummySerp.kt index 57bafa37..232b3389 100644 --- a/app/src/main/java/com/porg/gugal/providers/DummySerp.kt +++ b/app/src/main/java/com/porg/gugal/providers/DummySerp.kt @@ -19,6 +19,8 @@ package com.porg.gugal.providers +import android.content.Context +import android.widget.Toast import androidx.compose.foundation.layout.padding import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -31,13 +33,17 @@ class DummySerp: SerpProvider { get() = "225fa1a8022149648dd989f7a803360c-dummy" @Composable - override fun ConfigCardContents() { + override fun ConfigComposable(modifier: Modifier) { Text( text = "This is a dummy provider. Please change the provider to search the web.", - modifier = Modifier.padding(all = 4.dp), + modifier = Modifier.padding(all = 4.dp).then(modifier) ) } + override fun getSensitiveCredentials(): Map { + return mapOf("token" to "123456789abcdef") + } + override fun search(query: String): Array { return Array(20,){Result("Dummy result $it", "A search was performed using the dummy provider. Please change the provider to search the web.", diff --git a/app/src/main/java/com/porg/gugal/providers/SerpProvider.kt b/app/src/main/java/com/porg/gugal/providers/SerpProvider.kt index ec9e7a08..21a8c7c3 100644 --- a/app/src/main/java/com/porg/gugal/providers/SerpProvider.kt +++ b/app/src/main/java/com/porg/gugal/providers/SerpProvider.kt @@ -19,19 +19,27 @@ package com.porg.gugal.providers +import android.content.Context import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import com.porg.gugal.Result +import java.util.* interface SerpProvider { - @Composable fun ConfigCardContents() {} + @Composable fun ConfigComposable(modifier: Modifier) {} fun search(query: String): Array { return Array(0){null} } + fun getSensitiveCredentials(): Map { + return mapOf("key" to "value") + } + companion object val Companion.id: String get() = "" + val id: String get() = Companion.id val providerInfo: ProviderInfo? } \ No newline at end of file diff --git a/app/src/main/java/com/porg/gugal/providers/cse/GoogleCseSerp.kt b/app/src/main/java/com/porg/gugal/providers/cse/GoogleCseSerp.kt index e2e78d2c..a22473dd 100644 --- a/app/src/main/java/com/porg/gugal/providers/cse/GoogleCseSerp.kt +++ b/app/src/main/java/com/porg/gugal/providers/cse/GoogleCseSerp.kt @@ -19,13 +19,15 @@ package com.porg.gugal.providers.cse +import android.content.Context +import android.widget.Toast import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.material.TextField import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf @@ -36,19 +38,22 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import com.porg.gugal.providers.ProviderInfo import com.porg.gugal.providers.SerpProvider +import java.util.* class GoogleCseSerp: SerpProvider { @Composable - override fun ConfigCardContents() { + override fun ConfigComposable(modifier: Modifier) { val _cx = remember { mutableStateOf(TextFieldValue()) } val _ak = remember { mutableStateOf(TextFieldValue()) } - Column { + Column( + modifier = Modifier.padding(all = 4.dp).then(modifier) + ) { Text( text = "Go to cse.google.com. Click Add, name your engine," + " select \"Search the entire web\" and enable image search. Click Customize," + " copy the search engine ID and paste it here:", modifier = Modifier.padding(all = 4.dp), - style = MaterialTheme.typography.caption + style = MaterialTheme.typography.bodyMedium ) TextField( placeholder = { Text(text = "CSE ID") }, @@ -73,7 +78,7 @@ class GoogleCseSerp: SerpProvider { text = "Now scroll down to \"Programmatic access\", then tap \"Get started\"" + " next to \"Custom Search JSON API\". Click \"Get a key\", go through the setup and paste the API key here:", modifier = Modifier.padding(all = 4.dp), - style = MaterialTheme.typography.caption + style = MaterialTheme.typography.bodyMedium ) TextField( placeholder = { Text(text = "API key") }, @@ -97,11 +102,15 @@ class GoogleCseSerp: SerpProvider { Text( text = "I recommend tapping the \"API Console\" link, and restricting the API key to Custom Search API.", modifier = Modifier.padding(all = 4.dp), - style = MaterialTheme.typography.caption + style = MaterialTheme.typography.bodyMedium ) } } + override fun getSensitiveCredentials(): Map { + return mapOf("ak" to apikey, "cx" to cx) + } + private var apikey = "" private var cx = "" diff --git a/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt b/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt new file mode 100644 index 00000000..eebf92d2 --- /dev/null +++ b/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt @@ -0,0 +1,98 @@ +/* + * SetupConfigureSerpActivity.kt + * Gugal + * Copyright (c) 2022 thegreatporg + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.porg.gugal.setup + +import android.content.SharedPreferences +import android.os.Bundle +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.* +import androidx.compose.material3.* +import androidx.compose.ui.Modifier +import androidx.security.crypto.EncryptedSharedPreferences +import androidx.security.crypto.MasterKeys +import com.porg.gugal.Material3SetupWizard +import com.porg.gugal.R +import com.porg.gugal.providers.SerpProvider +import com.porg.gugal.providers.cse.GoogleCseSerp +import com.porg.gugal.ui.theme.GugalTheme + +class SetupConfigureSerpActivity : ComponentActivity() { + + // TODO SPFW: make SERP provider selectable + val serpProvider: SerpProvider = GoogleCseSerp() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + GugalTheme { + // A surface container using the 'background' color from the theme + Surface(color = MaterialTheme.colorScheme.background) { + Material3SetupWizard.TwoButtons( + positive = { saveSensitive(serpProvider) }, + positiveText = "Save", + negative = { finish() } + ) + Column( + modifier = Modifier.fillMaxSize() + ) { + Material3SetupWizard.Header( + text = getText(R.string.setup_p3_title).toString(), + doFinish = { finish() } + ) + serpProvider.ConfigComposable( + modifier = Material3SetupWizard.PaddingModifier + ) + } + } + } + } + } + + private fun saveSensitive(serpProvider: SerpProvider) { + // Get the sensitive data + val sensitive = serpProvider.getSensitiveCredentials() + Log.d("gugal", sensitive.size.toString()) + + // Although you can define your own key generation parameter specification, it's + // recommended that you use the value specified here. + val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC + val mainKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec) + + val sharedPrefsFile = "gugalprefs" + val sharedPreferences: SharedPreferences = EncryptedSharedPreferences.create( + sharedPrefsFile, + mainKeyAlias, + applicationContext, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ) + + with (sharedPreferences.edit()) { + // Edit the user's shared preferences... + for (i in sensitive) { + this.putString("serp_${serpProvider.id}_${i.key}}", i.value) + } + apply() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/porg/gugal/setup/SetupStartActivity.kt b/app/src/main/java/com/porg/gugal/setup/SetupStartActivity.kt index beda7e6a..0f7a5854 100644 --- a/app/src/main/java/com/porg/gugal/setup/SetupStartActivity.kt +++ b/app/src/main/java/com/porg/gugal/setup/SetupStartActivity.kt @@ -19,6 +19,8 @@ package com.porg.gugal.setup +import android.content.ComponentName +import android.content.Intent import android.os.Bundle import android.widget.Toast import androidx.activity.ComponentActivity @@ -82,7 +84,10 @@ class SetupStartActivity : ComponentActivity() { .fillMaxWidth() .padding(all = 16.dp), onClick = { - Toast.makeText(applicationContext, "Not implemented", Toast.LENGTH_LONG).show() + val intent = Intent(applicationContext, SetupConfigureSerpActivity::class.java) + intent.component = + ComponentName("com.porg.gugal", "com.porg.gugal.setup.SetupConfigureSerpActivity") + startActivity(intent) } ) { Text(getText(R.string.setup_p1_button).toString()) diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml new file mode 100644 index 00000000..51f9b5d3 --- /dev/null +++ b/app/src/main/res/drawable/ic_back.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9184284..95f629ea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -33,5 +33,4 @@ Select search engine Set up search Gugal is FOSS! - Gugal is FOSS! \ No newline at end of file -- GitLab From 7dd649fc99decb5c8348c321203eef5d156dddd4 Mon Sep 17 00:00:00 2001 From: Narek Torosyan Date: Sun, 10 Apr 2022 18:02:38 +0400 Subject: [PATCH 02/18] Setup wizard: fix a small bug --- .../java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt b/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt index eebf92d2..b4300265 100644 --- a/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt +++ b/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt @@ -89,7 +89,7 @@ class SetupConfigureSerpActivity : ComponentActivity() { with (sharedPreferences.edit()) { // Edit the user's shared preferences... for (i in sensitive) { - this.putString("serp_${serpProvider.id}_${i.key}}", i.value) + this.putString("serp_${serpProvider.id}_${i.key}", i.value) } apply() } -- GitLab From 9dfde9d049739626dabd2d17a7026c8b138bc9ad Mon Sep 17 00:00:00 2001 From: Narek Torosyan Date: Sun, 10 Apr 2022 18:05:59 +0400 Subject: [PATCH 03/18] Setup wizard: auto update API key and cx values --- app/src/main/java/com/porg/gugal/providers/cse/GoogleCseSerp.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/porg/gugal/providers/cse/GoogleCseSerp.kt b/app/src/main/java/com/porg/gugal/providers/cse/GoogleCseSerp.kt index a22473dd..c0decb26 100644 --- a/app/src/main/java/com/porg/gugal/providers/cse/GoogleCseSerp.kt +++ b/app/src/main/java/com/porg/gugal/providers/cse/GoogleCseSerp.kt @@ -63,6 +63,7 @@ class GoogleCseSerp: SerpProvider { .fillMaxWidth(), onValueChange = { nv -> _cx.value = nv + cx = _cx.value.text }, keyboardActions = KeyboardActions( onDone = { @@ -88,6 +89,7 @@ class GoogleCseSerp: SerpProvider { .fillMaxWidth(), onValueChange = { nv -> _ak.value = nv + apikey = nv.text }, keyboardActions = KeyboardActions( onDone = { -- GitLab From d3ad24ce5c1f17c791c10077b9b0657fcdf3e5e3 Mon Sep 17 00:00:00 2001 From: Narek Torosyan Date: Sun, 10 Apr 2022 18:15:22 +0400 Subject: [PATCH 04/18] Make status bar and navbar transparent --- app/src/main/res/values-night/themes.xml | 3 ++- app/src/main/res/values/themes.xml | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 5b6b1cc6..35f66508 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -10,7 +10,8 @@ @color/teal_200 @color/black - ?attr/colorPrimaryVariant + false + false \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 77ee1759..21e9b56f 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -10,7 +10,10 @@ @color/teal_700 @color/black - уни + #00000000 + #00000000 + true + true -- GitLab From 73b03f8d6b7a2f1c2270157966e88a0616e2ae9b Mon Sep 17 00:00:00 2001 From: Narek Torosyan Date: Sun, 10 Apr 2022 20:28:33 +0400 Subject: [PATCH 05/18] Setup wizard: add FOSS page --- WHY_OFFICIAL.md | 5 + app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 22 ++-- .../com/porg/gugal/Material3SetupWizard.kt | 42 ++++++- .../gugal/setup/SetupConfigureSerpActivity.kt | 7 ++ .../com/porg/gugal/setup/SetupFOSSActivity.kt | 105 ++++++++++++++++++ app/src/main/res/drawable/ic_donate.xml | 5 +- app/src/main/res/values-night/themes.xml | 10 +- app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/themes.xml | 10 +- build.gradle | 2 +- 11 files changed, 178 insertions(+), 36 deletions(-) create mode 100644 WHY_OFFICIAL.md create mode 100644 app/src/main/java/com/porg/gugal/setup/SetupFOSSActivity.kt diff --git a/WHY_OFFICIAL.md b/WHY_OFFICIAL.md new file mode 100644 index 00000000..072b8bb3 --- /dev/null +++ b/WHY_OFFICIAL.md @@ -0,0 +1,5 @@ +# Only download Gugal from official sources! + +Unofficial versions of Gugal can contain malware. + +Also, Gugal saves credentials which are used to search Google. An unofficial, malicious version of Gugal might steal those credentials and potentially cost you money, as the Custom Search Engine API is only free for 100 queries per day. \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 6d5ca49b..ef877ddd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,7 +51,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.6.0' implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'com.google.android.material:material:1.4.0' + implementation 'com.google.android.material:material:1.5.0' implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.material:material:$compose_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0d8682bd..12ec609b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,8 @@ - + + + - - @@ -31,17 +40,14 @@ - - + android:theme="@style/Theme.Gugal.NoActionBar"> - + android:theme="@style/Theme.Gugal.NoActionBar"> \ No newline at end of file diff --git a/app/src/main/java/com/porg/gugal/Material3SetupWizard.kt b/app/src/main/java/com/porg/gugal/Material3SetupWizard.kt index 87f3bc43..ecaaaf57 100644 --- a/app/src/main/java/com/porg/gugal/Material3SetupWizard.kt +++ b/app/src/main/java/com/porg/gugal/Material3SetupWizard.kt @@ -19,16 +19,21 @@ package com.porg.gugal +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp +import com.google.android.material.color.MaterialColors class Material3SetupWizard { + companion object { @Composable fun Header(text: String, doFinish: () -> Unit) { @@ -65,17 +70,44 @@ class Material3SetupWizard { ) { Text(positiveText) } - OutlinedButton( - modifier = Modifier.padding(all = 4.dp).align(Alignment.BottomStart), - onClick = negative - ) { - Text(negativeText) + if (negative != null) { + OutlinedButton( + modifier = Modifier.padding(all = 4.dp).align(Alignment.BottomStart), + onClick = negative + ) { + Text(negativeText) + } } } } } } + @Composable + fun Tip(text: String, modifier: Modifier, image: Int) { + Surface( + modifier = modifier, + shape = RoundedCornerShape(20.dp), + tonalElevation = 2.dp + ) { + Row( + modifier = Modifier.padding(all = 14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Image( + painterResource(image), + modifier = Modifier.size(36.dp), + contentDescription = "" + ) + Text( + text = text, + modifier = Modifier.padding(start = 14.dp), + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + val PaddingModifier: Modifier = Modifier.padding(16.dp) } } \ No newline at end of file diff --git a/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt b/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt index b4300265..aca163a2 100644 --- a/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt +++ b/app/src/main/java/com/porg/gugal/setup/SetupConfigureSerpActivity.kt @@ -19,6 +19,8 @@ package com.porg.gugal.setup +import android.content.ComponentName +import android.content.Intent import android.content.SharedPreferences import android.os.Bundle import android.util.Log @@ -93,6 +95,11 @@ class SetupConfigureSerpActivity : ComponentActivity() { } apply() } + + val intent = Intent(applicationContext, SetupFOSSActivity::class.java) + intent.component = + ComponentName("com.porg.gugal", "com.porg.gugal.setup.SetupFOSSActivity") + startActivity(intent) } } \ No newline at end of file diff --git a/app/src/main/java/com/porg/gugal/setup/SetupFOSSActivity.kt b/app/src/main/java/com/porg/gugal/setup/SetupFOSSActivity.kt new file mode 100644 index 00000000..93f59912 --- /dev/null +++ b/app/src/main/java/com/porg/gugal/setup/SetupFOSSActivity.kt @@ -0,0 +1,105 @@ +/* + * SetupFOSSActivity.kt + * Gugal + * Copyright (c) 2022 thegreatporg + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.porg.gugal.setup + +import android.content.ComponentName +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material3.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import com.porg.gugal.MainActivity +import com.porg.gugal.Material3SetupWizard +import com.porg.gugal.Material3SetupWizard.Companion.Tip +import com.porg.gugal.R +import com.porg.gugal.ui.theme.GugalTheme +import com.porg.gugal.ui.theme.shapeScheme + +class SetupFOSSActivity : ComponentActivity() { + @OptIn(ExperimentalMaterialApi::class) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + GugalTheme { + // A surface container using the 'background' color from the theme + Surface(color = MaterialTheme.colorScheme.background) { + Material3SetupWizard.TwoButtons( + positive = { + val intent = Intent(applicationContext, MainActivity::class.java) + intent.component = + ComponentName("com.porg.gugal", "com.porg.gugal.MainActivity") + startActivity(intent) + }, + positiveText = "Next", + negative = { + val intent = Intent(applicationContext, MainActivity::class.java) + intent.component = + ComponentName("com.porg.gugal", "com.porg.gugal.MainActivity") + startActivity(intent) + } + ) + Column( + modifier = Modifier.fillMaxSize() + ) { + Material3SetupWizard.Header( + text = getText(R.string.setup_p4_title).toString(), + doFinish = { finish() } + ) + Text( + text = getText(R.string.setup_p4_description).toString(), + modifier = Modifier + .padding(start = 24.dp, top = 0.dp, bottom = 24.dp, end = 24.dp) + .fillMaxWidth(), + style = MaterialTheme.typography.bodyLarge + ) + Tip( + text = getText(R.string.setup_p4_tip_1).toString(), + modifier = Modifier.padding(start = 24.dp, top = 0.dp, bottom = 24.dp, end = 24.dp) + .clickable(onClick = { + val intent = Intent(Intent.ACTION_VIEW, + Uri.parse("https://gitlab.com/narektor/gugal/-/blob/setup-wizard/WHY_OFFICIAL.md")) + // Note the Chooser below. If no applications match, + // Android displays a system message.So here there is no need for try-catch. + startActivity(Intent.createChooser(intent, "Open result in")) + }), + image = R.drawable.ic_warning + ) + Tip( + text = getText(R.string.setup_p4_tip_2).toString(), + modifier = Modifier.padding(start = 24.dp, top = 0.dp, bottom = 24.dp, end = 24.dp), + image = R.drawable.ic_donate + ) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_donate.xml b/app/src/main/res/drawable/ic_donate.xml index 1ce9c892..4bbc95de 100644 --- a/app/src/main/res/drawable/ic_donate.xml +++ b/app/src/main/res/drawable/ic_donate.xml @@ -21,9 +21,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorOnPrimary"> + android:viewportHeight="24"> diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 35f66508..ffdcc02c 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,14 +1,6 @@ -