From 7b5de0ee0ff015ccda394a23d244cd666700789d Mon Sep 17 00:00:00 2001 From: septs Date: Sat, 8 Mar 2025 17:23:58 +0800 Subject: [PATCH 1/2] feat: improve QR code decoding from gallery with better resource management --- .../DownloadWizardMethodSelectFragment.kt | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt index 8ebc7ee..b2177d2 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt @@ -54,16 +54,23 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard } private suspend fun onGalleryResult(result: Uri?) { - var bmp: Bitmap? = null - try { - bmp = requireContext().contentResolver.openInputStream(result ?: return) + fun Bitmap.use(block: Bitmap.() -> T): T = try { + block() + } finally { + recycle() + } + + val decoded = try { + requireContext().contentResolver.openInputStream(result ?: return) .use(BitmapFactory::decodeStream) - val decoded = decodeQrFromBitmap(bmp) - withContext(Dispatchers.Main) { processLpaString(decoded) } + .use(::decodeQrFromBitmap) } catch (e: Exception) { Log.e(TAG, "Failed to decode QR code from gallery", e) - } finally { - bmp?.recycle() + return + } + + withContext(Dispatchers.Main) { + processLpaString(decoded) } } From d490d6f2396495ea4a6e2ae51b8cd14b13ffe1ed Mon Sep 17 00:00:00 2001 From: septs Date: Sat, 8 Mar 2025 17:23:58 +0800 Subject: [PATCH 2/2] feat: improve QR code decoding from gallery with better resource management --- .../DownloadWizardMethodSelectFragment.kt | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt index 8ebc7ee..794109c 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardMethodSelectFragment.kt @@ -50,21 +50,19 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard private val gallerySelectorLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { - lifecycleScope.launch(Dispatchers.IO) { onGalleryResult(it) } + lifecycleScope.launch(Dispatchers.IO) { + val decoded = onGalleryResult(it ?: return@launch) ?: return@launch + withContext(Dispatchers.Main) { processLpaString(decoded) } + } } - private suspend fun onGalleryResult(result: Uri?) { - var bmp: Bitmap? = null - try { - bmp = requireContext().contentResolver.openInputStream(result ?: return) - .use(BitmapFactory::decodeStream) - val decoded = decodeQrFromBitmap(bmp) - withContext(Dispatchers.Main) { processLpaString(decoded) } - } catch (e: Exception) { - Log.e(TAG, "Failed to decode QR code from gallery", e) - } finally { - bmp?.recycle() - } + private fun onGalleryResult(result: Uri) = try { + requireContext().contentResolver.openInputStream(result) + .use(BitmapFactory::decodeStream) + .use(::decodeQrFromBitmap) + } catch (e: Exception) { + Log.e(TAG, "Failed to decode QR code from gallery", e) + null } val downloadMethods = arrayOf( @@ -192,4 +190,10 @@ class DownloadWizardMethodSelectFragment : DownloadWizardActivity.DownloadWizard } } +} + +private fun Bitmap.use(block: Bitmap.() -> T): T = try { + block() +} finally { + recycle() } \ No newline at end of file