Skip to content

Commit e53d4bf

Browse files
committed
[BOOK-275] refactor: 파일 읽기 및 인코딩을 CloudOcrRecognizer에서 처리
1 parent f772c15 commit e53d4bf

File tree

4 files changed

+33
-21
lines changed

4 files changed

+33
-21
lines changed
Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.ninecraft.booket.core.ocr.analyzer
22

3+
import android.net.Uri
4+
import android.util.Base64
35
import com.ninecraft.booket.core.common.utils.runSuspendCatching
46
import com.ninecraft.booket.core.ocr.BuildConfig
57
import com.ninecraft.booket.core.ocr.model.AnnotateImageRequest
@@ -9,25 +11,35 @@ import com.ninecraft.booket.core.ocr.model.Feature
911
import com.ninecraft.booket.core.ocr.model.ImageContext
1012
import com.ninecraft.booket.core.ocr.model.VisionImage
1113
import com.ninecraft.booket.core.ocr.service.CloudVisionService
14+
import kotlinx.coroutines.Dispatchers
15+
import kotlinx.coroutines.withContext
16+
import java.io.File
1217
import javax.inject.Inject
1318

1419
class CloudOcrRecognizer @Inject constructor(
1520
private val service: CloudVisionService,
1621
) {
17-
suspend fun recognizeText(base64Image: String): Result<CloudVisionResponse> = runSuspendCatching {
18-
val request = CloudVisionRequest(
19-
requests = listOf(
20-
AnnotateImageRequest(
21-
image = VisionImage(base64Image),
22-
features = listOf(Feature(type = "TEXT_DETECTION")),
23-
imageContext = ImageContext(languageHints = null),
22+
suspend fun recognizeText(imageUri: Uri): Result<CloudVisionResponse> = runSuspendCatching {
23+
withContext(Dispatchers.IO) {
24+
val filePath = imageUri.path ?: throw IllegalArgumentException("URI does not have a valid path.")
25+
val file = File(filePath)
26+
val byte = file.readBytes()
27+
val base64Image = Base64.encodeToString(byte, Base64.NO_WRAP)
28+
29+
val request = CloudVisionRequest(
30+
requests = listOf(
31+
AnnotateImageRequest(
32+
image = VisionImage(base64Image),
33+
features = listOf(Feature(type = "TEXT_DETECTION")),
34+
imageContext = ImageContext(languageHints = null),
35+
),
2436
),
25-
),
26-
)
37+
)
2738

28-
service.batchAnnotateImage(
29-
apiKey = BuildConfig.CLOUD_VISION_API_KEY,
30-
body = request,
31-
)
39+
service.batchAnnotateImage(
40+
apiKey = BuildConfig.CLOUD_VISION_API_KEY,
41+
body = request,
42+
)
43+
}
3244
}
3345
}

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/ocr/OcrPresenter.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.ninecraft.booket.feature.record.ocr
22

3-
import android.util.Base64
3+
import android.net.Uri
44
import androidx.compose.runtime.Composable
55
import androidx.compose.runtime.getValue
66
import androidx.compose.runtime.mutableStateOf
@@ -41,11 +41,11 @@ class OcrPresenter @AssistedInject constructor(
4141
var isLoading by rememberRetained { mutableStateOf(false) }
4242
var sideEffect by rememberRetained { mutableStateOf<OcrSideEffect?>(null) }
4343

44-
fun recognizeText(base64Image: String) {
44+
fun recognizeText(imageUri: Uri) {
4545
scope.launch {
4646
try {
4747
isLoading = true
48-
recognizer.recognizeText(base64Image)
48+
recognizer.recognizeText(imageUri)
4949
.onSuccess {
5050
val text = it.responses.firstOrNull()?.fullTextAnnotation?.text.orEmpty()
5151
recognizedText = text
@@ -100,8 +100,7 @@ class OcrPresenter @AssistedInject constructor(
100100
is OcrUiEvent.OnCaptureButtonClick -> {
101101
isTextDetectionFailed = false
102102

103-
val base64Image = Base64.encodeToString(event.imageData, Base64.NO_WRAP)
104-
recognizeText(base64Image)
103+
recognizeText(event.imageUri)
105104
}
106105

107106
is OcrUiEvent.OnReCaptureButtonClick -> {

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/ocr/OcrUi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import androidx.compose.ui.text.style.TextAlign
5151
import androidx.compose.ui.unit.dp
5252
import androidx.compose.ui.viewinterop.AndroidView
5353
import androidx.core.content.ContextCompat
54+
import androidx.core.net.toUri
5455
import androidx.lifecycle.Lifecycle
5556
import androidx.lifecycle.LifecycleEventObserver
5657
import androidx.lifecycle.compose.LocalLifecycleOwner
@@ -260,8 +261,7 @@ private fun CameraPreview(
260261
executor,
261262
object : ImageCapture.OnImageSavedCallback {
262263
override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
263-
val bytes = photoFile.readBytes()
264-
state.eventSink(OcrUiEvent.OnCaptureButtonClick(bytes))
264+
state.eventSink(OcrUiEvent.OnCaptureButtonClick(photoFile.toUri()))
265265
}
266266

267267
override fun onError(exception: ImageCaptureException) {

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/ocr/OcrUiState.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.ninecraft.booket.feature.record.ocr
22

3+
import android.net.Uri
34
import androidx.compose.runtime.Immutable
45
import com.slack.circuit.runtime.CircuitUiEvent
56
import com.slack.circuit.runtime.CircuitUiState
@@ -31,7 +32,7 @@ sealed interface OcrUiEvent : CircuitUiEvent {
3132
data object OnCloseClick : OcrUiEvent
3233
data object OnShowPermissionDialog : OcrUiEvent
3334
data object OnHidePermissionDialog : OcrUiEvent
34-
data class OnCaptureButtonClick(val imageData: ByteArray) : OcrUiEvent
35+
data class OnCaptureButtonClick(val imageUri: Uri) : OcrUiEvent
3536
data object OnReCaptureButtonClick : OcrUiEvent
3637
data object OnSelectionConfirmed : OcrUiEvent
3738
data object OnRecaptureDialogConfirmed : OcrUiEvent

0 commit comments

Comments
 (0)