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