aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ui/src/main/java/com/wireguard/android/util/QrCodeFromFileScanner.kt
diff options
context:
space:
mode:
Diffstat (limited to 'ui/src/main/java/com/wireguard/android/util/QrCodeFromFileScanner.kt')
-rw-r--r--ui/src/main/java/com/wireguard/android/util/QrCodeFromFileScanner.kt60
1 files changed, 17 insertions, 43 deletions
diff --git a/ui/src/main/java/com/wireguard/android/util/QrCodeFromFileScanner.kt b/ui/src/main/java/com/wireguard/android/util/QrCodeFromFileScanner.kt
index 3e54a52a..4ea2dc7a 100644
--- a/ui/src/main/java/com/wireguard/android/util/QrCodeFromFileScanner.kt
+++ b/ui/src/main/java/com/wireguard/android/util/QrCodeFromFileScanner.kt
@@ -1,5 +1,5 @@
/*
- * Copyright © 2017-2022 WireGuard LLC. All Rights Reserved.
+ * Copyright © 2017-2025 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
@@ -29,7 +29,6 @@ class QrCodeFromFileScanner(
private val contentResolver: ContentResolver,
private val reader: Reader,
) {
-
private fun scanBitmapForResult(source: Bitmap): Result {
val width = source.width
val height = source.height
@@ -40,53 +39,28 @@ class QrCodeFromFileScanner(
return reader.decode(bBitmap, mapOf(DecodeHintType.TRY_HARDER to true))
}
- private fun downscaleBitmap(source: Bitmap, scaledSize: Int): Bitmap {
-
- val originalWidth = source.width
- val originalHeight = source.height
-
- var newWidth = -1
- var newHeight = -1
- val multFactor: Float
-
- when {
- originalHeight > originalWidth -> {
- newHeight = scaledSize
- multFactor = originalWidth.toFloat() / originalHeight.toFloat()
- newWidth = (newHeight * multFactor).toInt()
- }
- originalWidth > originalHeight -> {
- newWidth = scaledSize
- multFactor = originalHeight.toFloat() / originalWidth.toFloat()
- newHeight = (newWidth * multFactor).toInt()
- }
- originalHeight == originalWidth -> {
- newHeight = scaledSize
- newWidth = scaledSize
- }
- }
- return Bitmap.createScaledBitmap(source, newWidth, newHeight, false)
- }
-
private fun doScan(data: Uri): Result {
Log.d(TAG, "Starting to scan an image: $data")
contentResolver.openInputStream(data).use { inputStream ->
- val originalBitmap = BitmapFactory.decodeStream(inputStream)
- ?: throw IllegalArgumentException("Can't decode stream to Bitmap")
-
- return try {
- scanBitmapForResult(originalBitmap).also {
- Log.d(TAG, "Found result in original image")
+ var bitmap: Bitmap? = null
+ var firstException: Throwable? = null
+ for (i in arrayOf(1, 2, 4, 8, 16, 32, 64, 128)) {
+ try {
+ val options = BitmapFactory.Options()
+ options.inSampleSize = i
+ bitmap = BitmapFactory.decodeStream(inputStream, null, options)
+ ?: throw IllegalArgumentException("Can't decode stream for bitmap")
+ return scanBitmapForResult(bitmap)
+ } catch (e: Throwable) {
+ bitmap?.recycle()
+ System.gc()
+ Log.e(TAG, "Original image scan at scale factor $i finished with error: $e")
+ if (firstException == null)
+ firstException = e
}
- } catch (e: Exception) {
- Log.e(TAG, "Original image scan finished with error: $e, will try downscaled image")
- val scaleBitmap = downscaleBitmap(originalBitmap, 500)
- scanBitmapForResult(originalBitmap).also { scaleBitmap.recycle() }
- } finally {
- originalBitmap.recycle()
}
+ throw Exception(firstException)
}
-
}
/**