Skip to content

Commit 2a42418

Browse files
committed
chore(scan): scan full static image at various scan qualities to improve parse success rate
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent a865756 commit 2a42418

2 files changed

Lines changed: 24 additions & 18 deletions

File tree

app/src/main/java/com/kik/kikx/kikcodes/implementation/KikCodeAnalyzer.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.getcode.media.MediaScanner
1010
import com.getcode.util.toByteArray
1111
import com.getcode.utils.ErrorUtils
1212
import com.kik.kikx.kikcodes.KikCodeScanner
13+
import com.kik.kikx.kikcodes.ScannerError
1314
import com.kik.kikx.models.ScannableKikCode
1415
import dagger.hilt.android.qualifiers.ApplicationContext
1516
import kotlinx.coroutines.CoroutineScope
@@ -55,7 +56,7 @@ class KikCodeAnalyzer @Inject constructor(
5556

5657
}.onFailure { error ->
5758
when (error) {
58-
is KikCodeScanner.NoKikCodeFoundException -> Unit
59+
is ScannerError -> Unit
5960
else -> ErrorUtils.handleError(error)
6061
}
6162
imageProxy.close()
@@ -70,7 +71,7 @@ class KikCodeAnalyzer @Inject constructor(
7071
onCodeScanned(result)
7172
}.onFailure { error ->
7273
when (error) {
73-
is KikCodeScanner.NoKikCodeFoundException -> onNoCodeFound()
74+
is ScannerError -> onNoCodeFound()
7475
else -> ErrorUtils.handleError(error)
7576
}
7677
}

app/src/main/java/com/kik/kikx/kikcodes/implementation/StaticImageHelper.kt

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ import android.icu.text.DateFormat
77
import android.icu.text.SimpleDateFormat
88
import android.net.Uri
99
import android.os.Environment
10+
import com.getcode.BuildConfig
1011
import com.getcode.analytics.AnalyticsService
1112
import com.getcode.util.save
1213
import com.getcode.util.toByteArray
1314
import com.getcode.util.uriToBitmap
1415
import com.getcode.utils.TraceType
1516
import com.getcode.utils.timedTraceSuspend
1617
import com.kik.kikx.kikcodes.KikCodeScanner
18+
import com.kik.kikx.kikcodes.ScanQuality
1719
import com.kik.kikx.models.ScannableKikCode
1820
import dagger.hilt.android.qualifiers.ApplicationContext
1921
import kotlinx.coroutines.Dispatchers
@@ -32,11 +34,12 @@ class StaticImageHelper @Inject constructor(
3234
suspend fun analyze(uri: Uri): Result<ScannableKikCode> {
3335
val bitmap = context.uriToBitmap(uri)
3436
return if (bitmap != null) {
35-
detectCodeInImage(bitmap) {
37+
detectCodeInImage(bitmap) { image, quality ->
3638
scanner.scanKikCode(
37-
it.toByteArray(),
38-
it.width,
39-
it.height,
39+
image.toByteArray(),
40+
image.width,
41+
image.height,
42+
quality
4043
)
4144
}
4245
} else {
@@ -46,7 +49,7 @@ class StaticImageHelper @Inject constructor(
4649

4750
private suspend fun detectCodeInImage(
4851
bitmap: Bitmap,
49-
scan: suspend (Bitmap) -> Result<ScannableKikCode>
52+
scan: suspend (Bitmap, ScanQuality) -> Result<ScannableKikCode>
5053
): Result<ScannableKikCode> = withContext(Dispatchers.Default) {
5154
val destinationRoot =
5255
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
@@ -63,7 +66,7 @@ class StaticImageHelper @Inject constructor(
6366
private suspend fun search(
6467
bitmap: Bitmap,
6568
destination: File,
66-
scan: suspend (Bitmap) -> Result<ScannableKikCode>,
69+
scan: suspend (Bitmap, ScanQuality) -> Result<ScannableKikCode>,
6770
): Result<ScannableKikCode> {
6871
return timedTraceSuspend(
6972
message = "analyzing image",
@@ -73,22 +76,24 @@ class StaticImageHelper @Inject constructor(
7376
analytics.photoScanned(result.isSuccess, time.inWholeMilliseconds)
7477
}
7578
) {
76-
// try scanning raw
77-
val raw = scan(bitmap)
78-
if (raw.isSuccess) {
79-
debugPrint("Code found raw")
80-
bitmap.recycle()
81-
return@timedTraceSuspend raw
82-
} else {
83-
debugPrint("No Code found via raw")
79+
// try scanning raw at various scan qualities
80+
for (quality in ScanQuality.iterator()) {
81+
val raw = scan(bitmap, quality)
82+
if (raw.isSuccess) {
83+
debugPrint("Code found raw using $quality")
84+
bitmap.recycle()
85+
return@timedTraceSuspend raw
86+
} else {
87+
debugPrint("No Code found via raw using $quality")
88+
}
8489
}
8590

8691
val zoomLevels = listOf(1.0)
8792
val result = slidingWindowSearch(
8893
bitmap = bitmap,
8994
destination = destination,
9095
zoomLevels = zoomLevels,
91-
scan = scan,
96+
scan = { scan(it, ScanQuality.Medium) },
9297
)
9398

9499
if (result.isSuccess) {
@@ -235,5 +240,5 @@ private fun debugPrint(message: String) {
235240
if (DEBUG) println(message)
236241
}
237242

238-
private const val DEBUG = true
243+
private val DEBUG = BuildConfig.DEBUG
239244
private const val SAVE_IMAGES = false

0 commit comments

Comments
 (0)