From 532a6131794ea73bf070fd4fb119a2b160280068 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 20 Mar 2023 13:10:24 -0400 Subject: [PATCH] fully working --- .idea/inspectionProfiles/Project_Default.xml | 32 ++++++++ .idea/vcs.xml | 6 ++ app/build.gradle.kts | 2 +- .../com/henryhiles/qscan/LabeledCheckbox.kt | 41 +++++++++++ .../java/com/henryhiles/qscan/MainActivity.kt | 73 +++++++++++++++---- .../com/henryhiles/qscan/QrCodeAnalyzer.kt | 2 +- .../com/henryhiles/qscan/ui/theme/Theme.kt | 2 - app/src/main/res/values/strings.xml | 1 + build.gradle.kts | 2 +- 9 files changed, 142 insertions(+), 19 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/vcs.xml create mode 100644 app/src/main/java/com/henryhiles/qscan/LabeledCheckbox.kt diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..103e00c --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,32 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3171d6d..8b1de3a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -43,7 +43,7 @@ android { buildConfig = true } composeOptions { - kotlinCompilerExtensionVersion = "1.2.0" + kotlinCompilerExtensionVersion = "1.4.3" } packagingOptions { resources { diff --git a/app/src/main/java/com/henryhiles/qscan/LabeledCheckbox.kt b/app/src/main/java/com/henryhiles/qscan/LabeledCheckbox.kt new file mode 100644 index 0000000..6c111df --- /dev/null +++ b/app/src/main/java/com/henryhiles/qscan/LabeledCheckbox.kt @@ -0,0 +1,41 @@ +package com.henryhiles.qscan + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Checkbox +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp + +@Composable +fun LabelledCheckBox( + checked: Boolean, + onCheckedChange: ((Boolean) -> Unit), + label: String, + modifier: Modifier = Modifier +) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = modifier + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = { onCheckedChange(!checked) } + ) + ) { + Checkbox( + checked = checked, + onCheckedChange = null + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = label, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/henryhiles/qscan/MainActivity.kt b/app/src/main/java/com/henryhiles/qscan/MainActivity.kt index 52b8e5f..a871aa9 100644 --- a/app/src/main/java/com/henryhiles/qscan/MainActivity.kt +++ b/app/src/main/java/com/henryhiles/qscan/MainActivity.kt @@ -3,10 +3,13 @@ package com.henryhiles.qscan import android.Manifest +import android.app.Activity +import android.content.Context import android.content.pm.PackageManager import android.os.Bundle import android.util.Size import android.webkit.URLUtil +import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.setContent @@ -20,6 +23,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material3.* import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -47,13 +51,26 @@ class MainActivity : ComponentActivity() { } } -//@OptIn(ExperimentalMaterial3Api::class) -@ExperimentalMaterial3Api @Composable fun Screen() { var code by remember { mutableStateOf("") } + val context = LocalContext.current val lifeCycleOwner = LocalLifecycleOwner.current + val activity = lifeCycleOwner as Activity + val sharedPref = activity.getPreferences(Context.MODE_PRIVATE) + var doNotAsk by remember { + mutableStateOf( + sharedPref.getBoolean( + R.string.should_auto_open_key.toString(), + false + ) + ) + } + var prompted by remember { + mutableStateOf(false) + } + val uriHandler = LocalUriHandler.current val cameraProviderFuture = remember { ProcessCameraProvider.getInstance(context) } @@ -67,12 +84,31 @@ fun Screen() { } val launcher = rememberLauncherForActivityResult( contract = ActivityResultContracts.RequestPermission(), - onResult = { granted -> hasCamPermission = granted } + onResult = { granted -> + hasCamPermission = granted + prompted = true + } ) + LaunchedEffect(key1 = true) { launcher.launch(Manifest.permission.CAMERA) } + LaunchedEffect(key1 = code) { + Toast.makeText(context, "Test $doNotAsk $code", Toast.LENGTH_LONG).show() + if (doNotAsk && URLUtil.isValidUrl(code)) { + uriHandler.openUri(code) + code = "" + } + } + + LaunchedEffect(key1 = doNotAsk) { + with(sharedPref.edit()) { + putBoolean(R.string.should_auto_open_key.toString(), doNotAsk) + apply() + } + } + Column(modifier = Modifier.fillMaxSize()) { if (hasCamPermission) { AndroidView( @@ -102,15 +138,10 @@ fun Screen() { }, modifier = Modifier .fillMaxSize() ) - if (code != "") { - val uriHandler = LocalUriHandler.current + if (code != "" && !doNotAsk) { val isURL = URLUtil.isValidUrl(code) -// val sharedPref = -// activity.getPreferences(Context.MODE_PRIVATE) -// with(sharedPref.edit()) { -// putBoolean("", true) -// apply() -// } + + var tempDoNotAsk by remember { mutableStateOf(false) } AlertDialog(onDismissRequest = { code = "" }) { Surface( @@ -130,6 +161,14 @@ fun Screen() { ) } + Row(verticalAlignment = Alignment.CenterVertically) { + LabelledCheckBox( + checked = tempDoNotAsk, + onCheckedChange = { tempDoNotAsk = it }, + label = "Don't ask again" + ) + } + Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End @@ -141,7 +180,11 @@ fun Screen() { ) } if (isURL) - TextButton(onClick = { uriHandler.openUri(code) }) { + TextButton(onClick = { + uriHandler.openUri(code) + doNotAsk = tempDoNotAsk + code = "" + }) { Text( text = "Open URL", style = MaterialTheme.typography.labelLarge @@ -152,7 +195,7 @@ fun Screen() { } } } - } else AlertDialog(onDismissRequest = {}) { + } else if (prompted) AlertDialog(onDismissRequest = {}) { Surface( shape = MaterialTheme.shapes.large ) { @@ -174,7 +217,9 @@ fun Screen() { modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End ) { - TextButton(onClick = { }) { + TextButton(onClick = { + launcher.launch(Manifest.permission.CAMERA) + }) { Text( text = "Grant Permission", style = MaterialTheme.typography.labelLarge diff --git a/app/src/main/java/com/henryhiles/qscan/QrCodeAnalyzer.kt b/app/src/main/java/com/henryhiles/qscan/QrCodeAnalyzer.kt index baaeb47..46afd8b 100644 --- a/app/src/main/java/com/henryhiles/qscan/QrCodeAnalyzer.kt +++ b/app/src/main/java/com/henryhiles/qscan/QrCodeAnalyzer.kt @@ -37,7 +37,7 @@ class QrCodeAnalyzer(private val onQrCodeScanned: (String) -> Unit) : ImageAnaly }.decode(binaryBmp) onQrCodeScanned(result.text) } catch (e: Exception) { - // Don't print anything + // Don't do anything } finally { image.close() } diff --git a/app/src/main/java/com/henryhiles/qscan/ui/theme/Theme.kt b/app/src/main/java/com/henryhiles/qscan/ui/theme/Theme.kt index 8f93521..36e9dd1 100644 --- a/app/src/main/java/com/henryhiles/qscan/ui/theme/Theme.kt +++ b/app/src/main/java/com/henryhiles/qscan/ui/theme/Theme.kt @@ -9,7 +9,6 @@ import androidx.compose.runtime.SideEffect import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView -import androidx.core.view.ViewCompat private val DarkColorScheme = darkColorScheme( primary = Purple80, @@ -52,7 +51,6 @@ fun QScanTheme( if (!view.isInEditMode) { SideEffect { (view.context as Activity).window.statusBarColor = colorScheme.primary.toArgb() - ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = darkTheme } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b956e11..6fb72f6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ QScan + AUTO_OPEN \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index a22a3e8..2db84d6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ plugins { id("com.android.application") version "7.4.1" apply false id("com.android.library") version "7.4.1" apply false - id("org.jetbrains.kotlin.android") version "1.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.10" apply false } \ No newline at end of file