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