diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 32aa740..a2968c5 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -129,5 +129,5 @@ dependencies {
testImplementation(Libs.mockk_core)
androidTestImplementation(Libs.mockk_android)
- debugImplementation(Libs.leakcanary_android)
+ debugImplementation(Libs.code_scanner)
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 123afba..90c6843 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
package="com.ericampire.android.androidstudycase">
+
diff --git a/app/src/main/java/com/ericampire/android/androidstudycase/presentation/custom/LottiePreviewDialog.kt b/app/src/main/java/com/ericampire/android/androidstudycase/presentation/custom/LottiePreviewDialog.kt
new file mode 100644
index 0000000..9c43921
--- /dev/null
+++ b/app/src/main/java/com/ericampire/android/androidstudycase/presentation/custom/LottiePreviewDialog.kt
@@ -0,0 +1,59 @@
+package com.ericampire.android.androidstudycase.presentation.custom
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.window.Dialog
+import com.airbnb.lottie.compose.*
+
+@Composable
+fun LottiePreviewDialog(
+ modifier: Modifier = Modifier,
+ url: String,
+ onDismissRequest: () -> Unit,
+ onError: (String?) -> Unit
+) {
+
+ val composition by rememberLottieComposition(
+ spec = LottieCompositionSpec.Url(url),
+ onRetry = { _, previousException ->
+ onError(previousException.localizedMessage)
+ false
+ }
+ )
+ val progress by animateLottieCompositionAsState(
+ composition = composition,
+ iterations = LottieConstants.IterateForever,
+ )
+
+ Dialog(
+ onDismissRequest = onDismissRequest,
+ content = {
+ Box(
+ modifier = modifier
+ .size(400.dp)
+ .background(color = Color.White, shape = MaterialTheme.shapes.medium),
+ contentAlignment = Alignment.Center,
+ content = {
+ LottieAnimation(
+ modifier = Modifier
+ .matchParentSize()
+ .padding(10.dp)
+ .clip(MaterialTheme.shapes.medium),
+ composition = composition,
+ progress = progress,
+ )
+ }
+ )
+ }
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ericampire/android/androidstudycase/presentation/screen/preview/ui/PreviewScreen.kt b/app/src/main/java/com/ericampire/android/androidstudycase/presentation/screen/preview/ui/PreviewScreen.kt
index 2d1e8d2..d8b5263 100644
--- a/app/src/main/java/com/ericampire/android/androidstudycase/presentation/screen/preview/ui/PreviewScreen.kt
+++ b/app/src/main/java/com/ericampire/android/androidstudycase/presentation/screen/preview/ui/PreviewScreen.kt
@@ -1,13 +1,57 @@
package com.ericampire.android.androidstudycase.presentation.screen.preview.ui
-import androidx.compose.runtime.Composable
+import android.view.LayoutInflater
+import android.widget.Toast
+import androidx.compose.material.Scaffold
+import androidx.compose.runtime.*
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.viewinterop.AndroidView
import androidx.navigation.NavController
+import com.budiyev.android.codescanner.CodeScanner
+import com.budiyev.android.codescanner.CodeScannerView
+import com.ericampire.android.androidstudycase.R
+import com.ericampire.android.androidstudycase.presentation.custom.LottiePreviewDialog
import com.ericampire.android.androidstudycase.presentation.screen.preview.business.PreviewViewModel
+
@Composable
fun PreviewScreen(
navController: NavController,
viewModel: PreviewViewModel
) {
+ var codeScanner: CodeScanner? = null
+ var lottieFileUrl by remember { mutableStateOf("") }
+ val context = LocalContext.current
+
+ Scaffold(
+ content = {
+ if (lottieFileUrl.isNotEmpty()) {
+ LottiePreviewDialog(
+ url = lottieFileUrl,
+ onError = {
+ Toast.makeText(context, it, Toast.LENGTH_LONG).show()
+ },
+ onDismissRequest = {
+ lottieFileUrl = ""
+ codeScanner?.startPreview()
+ }
+ )
+ }
+ AndroidView(
+ factory = { context ->
+ val view = LayoutInflater.from(context).inflate(R.layout.code_scanner, null, false)
+ val scannerView = view.findViewById(R.id.scanner_view)
+ codeScanner = CodeScanner(context, scannerView).apply {
+ startPreview()
+ }
+ codeScanner?.setDecodeCallback {
+ lottieFileUrl = it.text
+ }
+ view
+ },
+ update = { }
+ )
+ }
+ )
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/code_scanner.xml b/app/src/main/res/layout/code_scanner.xml
new file mode 100644
index 0000000..1ee7d7f
--- /dev/null
+++ b/app/src/main/res/layout/code_scanner.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt
index d604f28..b917ee0 100644
--- a/buildSrc/src/main/kotlin/Libs.kt
+++ b/buildSrc/src/main/kotlin/Libs.kt
@@ -147,4 +147,5 @@ object Libs {
const val orbit_mvi_test = "org.orbit-mvi:orbit-test:4.2.0"
const val joda_time = "net.danlew:android.joda:2.10.9"
+ const val code_scanner = "com.budiyev.android:code-scanner:2.1.0"
}