From 78c38ff0892075aed048bec7212717b98972856f Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 16 Dec 2024 11:08:19 +0400 Subject: [PATCH] Updated on 2026-08-14 --- app/src/main/AndroidManifest.xml | 5 ----- .../feature/qrscanning/QrScanningFragment.kt | 20 ++++++++++++++++--- .../viewmodel/QrScanningClickIntents.kt | 17 ++++------------ .../viewmodel/QrScanningViewModel.kt | 2 +- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b9db373358..a41fbd9545 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,11 +10,6 @@ - - - diff --git a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/QrScanningFragment.kt b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/QrScanningFragment.kt index 5118630639..787c7bdfe9 100644 --- a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/QrScanningFragment.kt +++ b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/QrScanningFragment.kt @@ -25,6 +25,8 @@ import com.tangem.feature.qrscanning.viewmodel.QrScanningViewModel import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import timber.log.Timber +import java.io.IOException import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import javax.inject.Inject @@ -62,8 +64,15 @@ internal class QrScanningFragment : ComposeFragment() { private val galleryLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { val selectedImage = it ?: Uri.EMPTY if (selectedImage != Uri.EMPTY) { - val image = InputImage.fromFilePath(requireContext(), selectedImage) - analyzer.analyze(image) + val mimeType = requireContext().contentResolver.getType(selectedImage) + if (mimeType.isImageMimeType()) { + try { + val image = InputImage.fromFilePath(requireContext(), selectedImage) + analyzer.analyze(image) + } catch (e: IOException) { + Timber.e(e, "Unable to get image $selectedImage from gallery") + } + } } } @@ -80,7 +89,7 @@ internal class QrScanningFragment : ComposeFragment() { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.launchGalleryEvent .collect { - galleryLauncher.launch(it.imageFilter) + galleryLauncher.launch(GALLERY_IMAGE_FILTER) delay(timeMillis = 2000) } } @@ -137,8 +146,13 @@ internal class QrScanningFragment : ComposeFragment() { } } + private fun String?.isImageMimeType() = this?.startsWith(prefix = "$IMAGE_MIME_TYPE/") == true + companion object { + private const val IMAGE_MIME_TYPE = "image" + private const val GALLERY_IMAGE_FILTER = "$IMAGE_MIME_TYPE/*" + fun create() = QrScanningFragment() } } \ No newline at end of file diff --git a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/viewmodel/QrScanningClickIntents.kt b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/viewmodel/QrScanningClickIntents.kt index 5c2ab95304..57bc19b305 100644 --- a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/viewmodel/QrScanningClickIntents.kt +++ b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/viewmodel/QrScanningClickIntents.kt @@ -11,9 +11,9 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.launch import javax.inject.Inject -interface QrScanningClickIntents { +internal interface QrScanningClickIntents { - val launchGallery: SharedFlow + val launchGallery: SharedFlow fun onBackClick() @@ -22,11 +22,6 @@ interface QrScanningClickIntents { fun onGalleryClicked() } -@JvmInline -value class GalleryRequest( - val imageFilter: String, -) - @ViewModelScoped internal class QrScanningClickIntentsImplementor @Inject constructor( private val stateHolder: QrScanningStateController, @@ -36,7 +31,7 @@ internal class QrScanningClickIntentsImplementor @Inject constructor( private var isScanned = false - override val launchGallery = MutableSharedFlow( + override val launchGallery = MutableSharedFlow( extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_LATEST, ) @@ -56,13 +51,9 @@ internal class QrScanningClickIntentsImplementor @Inject constructor( } override fun onGalleryClicked() { - launchGallery.tryEmit(GalleryRequest(imageFilter = GALLERY_IMAGE_FILTER)) + launchGallery.tryEmit(Unit) if (stateHolder.value.bottomSheetConfig != null) { stateHolder.update(DismissBottomSheetTransformer()) } } - - companion object { - private const val GALLERY_IMAGE_FILTER = "image/*" - } } \ No newline at end of file diff --git a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/viewmodel/QrScanningViewModel.kt b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/viewmodel/QrScanningViewModel.kt index a504e00e9f..ceff5566d6 100644 --- a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/viewmodel/QrScanningViewModel.kt +++ b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/viewmodel/QrScanningViewModel.kt @@ -31,7 +31,7 @@ internal class QrScanningViewModel @Inject constructor( private val network: String? = savedStateHandle[AppRoute.QrScanning.NETWORK_KEY] val uiState: StateFlow = stateHolder.uiState - val launchGalleryEvent: SharedFlow = clickIntents.launchGallery + val launchGalleryEvent: SharedFlow = clickIntents.launchGallery init { // samsung for some reason disables reader mode, and then it works unstable