From 2e490d59928be8c78c40e82a86bea393662bffdf Mon Sep 17 00:00:00 2001 From: Eric Ampire Date: Sat, 4 Sep 2021 19:54:16 +0200 Subject: [PATCH] Preview Lottie by scanning QR Code --- app/build.gradle.kts | 2 +- app/src/main/AndroidManifest.xml | 1 + .../custom/LottiePreviewDialog.kt | 59 +++++++++++++++++++ .../screen/preview/ui/PreviewScreen.kt | 46 ++++++++++++++- app/src/main/res/layout/code_scanner.xml | 23 ++++++++ buildSrc/src/main/kotlin/Libs.kt | 1 + 6 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/ericampire/android/androidstudycase/presentation/custom/LottiePreviewDialog.kt create mode 100644 app/src/main/res/layout/code_scanner.xml 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" }