@@ -7,13 +7,15 @@ import android.icu.text.DateFormat
77import android.icu.text.SimpleDateFormat
88import android.net.Uri
99import android.os.Environment
10+ import com.getcode.BuildConfig
1011import com.getcode.analytics.AnalyticsService
1112import com.getcode.util.save
1213import com.getcode.util.toByteArray
1314import com.getcode.util.uriToBitmap
1415import com.getcode.utils.TraceType
1516import com.getcode.utils.timedTraceSuspend
1617import com.kik.kikx.kikcodes.KikCodeScanner
18+ import com.kik.kikx.kikcodes.ScanQuality
1719import com.kik.kikx.models.ScannableKikCode
1820import dagger.hilt.android.qualifiers.ApplicationContext
1921import 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
239244private const val SAVE_IMAGES = false
0 commit comments