-
-
Notifications
You must be signed in to change notification settings - Fork 233
/
Copy pathScanPreviewViewModel.kt
102 lines (91 loc) · 4.23 KB
/
ScanPreviewViewModel.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package org.totschnig.ocr
import android.app.Activity
import android.app.Application
import android.content.Intent
import android.net.Uri
import androidx.exifinterface.media.ExifInterface
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.totschnig.myexpenses.MyApplication
import org.totschnig.myexpenses.activity.OCR_REQUEST
import org.totschnig.myexpenses.feature.OcrFeatureProvider.Companion.ACTION
import org.totschnig.myexpenses.feature.OcrFeatureProvider.Companion.MIME_TYPE
import org.totschnig.myexpenses.feature.OcrResult
import org.totschnig.myexpenses.util.AppDirHelper
import java.io.File
import javax.inject.Inject
class ScanPreviewViewModel(application: Application) : AndroidViewModel(application) {
var running: Boolean = false
var orientation = 0
@Inject
lateinit var ocrFeature: OcrFeature
private val result = MutableLiveData<Result<OcrResult>>()
fun getResult(): LiveData<Result<OcrResult>> = result
init {
DaggerOcrComponent.builder().appComponent((application as MyApplication).appComponent).build().inject(this)
}
fun rotate(right: Boolean, scanFilePath: String, action: () -> Unit) {
viewModelScope.launch {
withContext(Dispatchers.Default) {
val exif = ExifInterface(scanFilePath)
when (exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)) {
ExifInterface.ORIENTATION_NORMAL -> if (right) ExifInterface.ORIENTATION_ROTATE_90 else ExifInterface.ORIENTATION_ROTATE_270
ExifInterface.ORIENTATION_ROTATE_90 -> if (right) ExifInterface.ORIENTATION_ROTATE_180 else ExifInterface.ORIENTATION_NORMAL
ExifInterface.ORIENTATION_ROTATE_180 -> if (right) ExifInterface.ORIENTATION_ROTATE_270 else ExifInterface.ORIENTATION_ROTATE_90
ExifInterface.ORIENTATION_ROTATE_270 -> if (right) ExifInterface.ORIENTATION_NORMAL else ExifInterface.ORIENTATION_ROTATE_180
else -> 0
}.also {
orientation = it
}.takeIf { it != 0 }?.also {
exif.setAttribute(ExifInterface.TAG_ORIENTATION, it.toString())
exif.saveAttributes()
}
}?.run { action() }
}
}
fun runTextRecognition(scanFile: File, activity: Activity) {
if (!running) {
running = true
if (BuildConfig.FLAVOR.equals("extern")) {
if (orientation == 0) {
viewModelScope.launch {
withContext(Dispatchers.Default) {
orientation = ExifInterface(scanFile.path).getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
}
runExternal(scanFile, activity)
}
} else {
runExternal(scanFile, activity)
}
} else {
viewModelScope.launch {
result.postValue(runCatching { ocrFeature.runTextRecognition(scanFile, activity) })
}
}
}
}
private fun runExternal(scanFile: File, activity: Activity) {
activity.startActivityForResult(
Intent(ACTION).apply {
putExtra("orientation", when (orientation) {
ExifInterface.ORIENTATION_NORMAL -> 0
ExifInterface.ORIENTATION_ROTATE_90 -> 90
ExifInterface.ORIENTATION_ROTATE_180 -> 180
ExifInterface.ORIENTATION_ROTATE_270 -> 270
else -> 0
})
setDataAndType(AppDirHelper.ensureContentUri(Uri.fromFile(scanFile)), MIME_TYPE)
setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}, OCR_REQUEST)
}
fun handleData(intent: Intent) {
viewModelScope.launch {
result.postValue(runCatching { ocrFeature.handleData(intent) })
}
}
}