diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 145a01a..b87b6e8 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -87,6 +87,8 @@ dependencies {
implementation("androidx.camera:camera-view:1.5.3")
implementation("com.google.mlkit:barcode-scanning:17.3.0")
+ implementation("com.google.android.play:review:2.0.2")
+ implementation("com.google.android.play:review-ktx:2.0.2")
implementation("com.github.bitfireAT:vcard4android:main-SNAPSHOT")
implementation("androidx.room:room-runtime:2.8.4")
diff --git a/app/src/main/java/com/clean/scanner/ui/screens/SettingsScreen.kt b/app/src/main/java/com/clean/scanner/ui/screens/SettingsScreen.kt
index 0a2857b..b6328f5 100644
--- a/app/src/main/java/com/clean/scanner/ui/screens/SettingsScreen.kt
+++ b/app/src/main/java/com/clean/scanner/ui/screens/SettingsScreen.kt
@@ -1,6 +1,5 @@
package de.softwareapp_hb.privateqrscanner.ui.screens
-import android.widget.Toast
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
@@ -9,7 +8,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.AlertDialog
-import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
@@ -22,7 +20,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import de.softwareapp_hb.privateqrscanner.R
import de.softwareapp_hb.privateqrscanner.ui.UseCaseView
-import de.softwareapp_hb.privateqrscanner.util.Intents
+import de.softwareapp_hb.privateqrscanner.util.InAppReviewRequester
@Composable
fun SettingsScreen(
@@ -37,9 +35,7 @@ fun SettingsScreen(
) {
val context = LocalContext.current
val showDeleteConfirm = remember { mutableStateOf(false) }
- val showFeatureRequestForm = remember { mutableStateOf(false) }
val showUseCasePicker = remember { mutableStateOf(false) }
- val requesterNeed = remember { mutableStateOf("") }
if (showDeleteConfirm.value) {
AlertDialog(
@@ -61,51 +57,6 @@ fun SettingsScreen(
)
}
- if (showFeatureRequestForm.value) {
- AlertDialog(
- onDismissRequest = { showFeatureRequestForm.value = false },
- title = { Text(stringResource(R.string.feature_request_title)) },
- text = {
- Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
- OutlinedTextField(
- value = requesterNeed.value,
- onValueChange = { requesterNeed.value = it },
- label = { Text(stringResource(R.string.feature_request_details)) }
- )
- }
- },
- confirmButton = {
- TextButton(
- onClick = {
- val body = buildString {
- appendLine("Request:")
- append(requesterNeed.value.trim())
- }
- Intents.sendEmail(
- context = context,
- email = context.getString(R.string.support_email),
- subject = context.getString(R.string.feature_request_subject),
- body = body
- )
- showFeatureRequestForm.value = false
- requesterNeed.value = ""
- Toast.makeText(
- context,
- context.getString(R.string.feature_request_sent),
- Toast.LENGTH_SHORT
- ).show()
- },
- enabled = requesterNeed.value.isNotBlank()
- ) { Text(stringResource(R.string.send_request)) }
- },
- dismissButton = {
- TextButton(onClick = { showFeatureRequestForm.value = false }) {
- Text(stringResource(R.string.cancel))
- }
- }
- )
- }
-
if (showUseCasePicker.value) {
AlertDialog(
onDismissRequest = { showUseCasePicker.value = false },
@@ -176,8 +127,8 @@ fun SettingsScreen(
Text(text = stringResource(R.string.licenses))
Text(text = stringResource(R.string.contact))
Spacer(modifier = Modifier.height(12.dp))
- TextButton(onClick = { showFeatureRequestForm.value = true }) {
- Text(text = stringResource(R.string.feature_request))
+ TextButton(onClick = { InAppReviewRequester.requestReview(context) }) {
+ Text(text = stringResource(R.string.review_app))
}
}
}
diff --git a/app/src/main/java/com/clean/scanner/util/InAppReviewRequester.kt b/app/src/main/java/com/clean/scanner/util/InAppReviewRequester.kt
new file mode 100644
index 0000000..f882f2d
--- /dev/null
+++ b/app/src/main/java/com/clean/scanner/util/InAppReviewRequester.kt
@@ -0,0 +1,26 @@
+package de.softwareapp_hb.privateqrscanner.util
+
+import android.app.Activity
+import android.content.Context
+import android.content.ContextWrapper
+import com.google.android.play.core.review.ReviewManagerFactory
+
+object InAppReviewRequester {
+ fun requestReview(context: Context) {
+ val activity = context.findActivity() ?: return
+ val manager = ReviewManagerFactory.create(activity)
+ manager.requestReviewFlow().addOnCompleteListener { request ->
+ if (request.isSuccessful) {
+ manager.launchReviewFlow(activity, request.result)
+ }
+ }
+ }
+
+ private tailrec fun Context.findActivity(): Activity? {
+ return when (this) {
+ is Activity -> this
+ is ContextWrapper -> baseContext.findActivity()
+ else -> null
+ }
+ }
+}
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index c22d698..6fbca45 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -67,15 +67,7 @@
WLAN-Einstellungen öffnen
Kontakt hinzufügen
Kalendereintrag hinzufügen
- softwareapp.hb@gmail.com
- Feature-Request-Formular
- Feature-Request
- Dein Name
- Deine E-Mail
- Was brauchst du?
- Feature-Request von App-Nutzer
- Anfrage senden
- E-Mail-App wird geöffnet...
+ Bei Google Play bewerten
Aktive Use-Case-Ansicht
Use-Case-Ansicht wählen
Alltägliche private Nutzung
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index aab1e15..9a8a6f1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -67,15 +67,7 @@
Open Wi-Fi settings
Add contact
Add calendar event
- support@example.com
- Feature request form
- Feature request
- Your name
- Your email
- What do you need?
- Feature request from app user
- Send request
- Opening email app...
+ Review on Google Play
Active use-case view
Select use-case view
Everyday personal use