diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8fdad634..2fb6b7ba 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -95,4 +95,4 @@ dependencies { implementation(timber) implementation(ossLicense) } -} \ No newline at end of file +} diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index a339734b..e7642c2a 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -64,6 +64,8 @@ object ThirdPartyDependencies { const val circleIndicator = "me.relex:circleindicator:${Versions.circleIndicatorVersion}" const val shimmer = "com.facebook.shimmer:shimmer:${Versions.shimmerVersion}" + const val mlkit = "com.google.mlkit:text-recognition-korean:${Versions.mlkitVersion}" + const val kakaoLogin = "com.kakao.sdk:v2-user:${Versions.kakaoVersion}" const val kakaoAuth = "com.kakao.sdk:v2-auth:${Versions.kakaoVersion}" const val kakaoTalk = "com.kakao.sdk:v2-talk:${Versions.kakaoVersion}" @@ -88,4 +90,4 @@ object FirebaseDependencies { object KakaoDependencies { const val user = "com.kakao.sdk:v2-user:${Versions.kakaoVersion}" const val share = "com.kakao.sdk:v2-share:${Versions.kakaoVersion}" -} \ No newline at end of file +} diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 532c17d8..fe3b2324 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -34,6 +34,8 @@ object Versions { const val kakaoVersion = "2.19.0" const val circleIndicatorVersion = "2.1.6" const val shimmerVersion = "0.5.0" + const val mlkitVersion = "16.0.0" + const val junitVersion = "4.13.2" const val espressoVersion = "3.5.1" const val androidTestVersion = "1.1.2" diff --git a/presentation/build.gradle.kts b/presentation/build.gradle.kts index 0dcce328..4234e62a 100644 --- a/presentation/build.gradle.kts +++ b/presentation/build.gradle.kts @@ -19,7 +19,7 @@ android { compileOptions { sourceCompatibility = Versions.javaVersion - targetCompatibility= Versions.javaVersion + targetCompatibility = Versions.javaVersion } kotlinOptions { @@ -84,5 +84,6 @@ dependencies { implementation(lottie) implementation(circularProgressBar) implementation(circleIndicator) + implementation(mlkit) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/co/orange/presentation/main/home/HomeFragment.kt b/presentation/src/main/java/co/orange/presentation/main/home/HomeFragment.kt index 9396ab1a..ff6bc0cc 100644 --- a/presentation/src/main/java/co/orange/presentation/main/home/HomeFragment.kt +++ b/presentation/src/main/java/co/orange/presentation/main/home/HomeFragment.kt @@ -56,6 +56,7 @@ class HomeFragment() : BaseFragment(R.layout.fragment_home) setRecyclerViewDeco() observeCheckedAgainState() observeGetHomeDataState() + observeGetProductIdState() } private fun initView() { @@ -115,10 +116,8 @@ class HomeFragment() : BaseFragment(R.layout.fragment_home) activityResult = registerForActivityResult(PickVisualMedia()) { uri -> if (uri != null) { - // TODO : OCR 진행 후 실 상품 이미지 대체 viewModel.selectedImageUri = uri - sellProductDialog = SellProductDialog() - sellProductDialog?.show(parentFragmentManager, SELL_PRODUCT_DIALOG) + viewModel.showCaptureImage(uri, requireContext()) } } } @@ -171,6 +170,20 @@ class HomeFragment() : BaseFragment(R.layout.fragment_home) }.launchIn(lifecycleScope) } + private fun observeGetProductIdState() { + viewModel.getProductIdState.flowWithLifecycle(lifecycle).onEach { state -> + when (state) { + is UiState.Success -> { + sellProductDialog = SellProductDialog() + sellProductDialog?.show(parentFragmentManager, SELL_PRODUCT_DIALOG) + } + + is UiState.Failure -> toast(stringOf(R.string.error_msg)) + else -> return@onEach + } + }.launchIn(lifecycleScope) + } + override fun onDestroyView() { super.onDestroyView() _adapter = null diff --git a/presentation/src/main/java/co/orange/presentation/main/home/HomeViewModel.kt b/presentation/src/main/java/co/orange/presentation/main/home/HomeViewModel.kt index 76ed12c6..25d0fc16 100644 --- a/presentation/src/main/java/co/orange/presentation/main/home/HomeViewModel.kt +++ b/presentation/src/main/java/co/orange/presentation/main/home/HomeViewModel.kt @@ -1,11 +1,15 @@ package co.orange.presentation.main.home +import android.content.Context import android.net.Uri import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import co.orange.core.state.UiState import co.orange.domain.entity.response.HomeModel import co.orange.domain.repository.HomeRepository +import com.google.mlkit.vision.common.InputImage +import com.google.mlkit.vision.text.TextRecognition +import com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -25,6 +29,7 @@ class HomeViewModel } var selectedImageUri = Uri.EMPTY + var productId = "" private val _isCheckedAgain = MutableSharedFlow() val isCheckedAgain: SharedFlow = _isCheckedAgain @@ -32,6 +37,9 @@ class HomeViewModel private val _getHomeDataState = MutableStateFlow>(UiState.Empty) val getHomeDataState: StateFlow> = _getHomeDataState + private val _getProductIdState = MutableStateFlow>(UiState.Empty) + val getProductIdState: StateFlow> = _getProductIdState + fun setCheckedState(state: Boolean) { viewModelScope.launch { _isCheckedAgain.emit(state) @@ -49,4 +57,23 @@ class HomeViewModel } } } + + fun showCaptureImage( + img: Uri, + context: Context, + ) { + runCatching { + val image = InputImage.fromFilePath(context, img) + val recognizer = + TextRecognition.getClient(KoreanTextRecognizerOptions.Builder().build()) + recognizer.process(image) + .addOnSuccessListener { + // TODO 서버통신으로 ID값 가져오기 + _getProductIdState.value = UiState.Success(it.text) + } + .addOnFailureListener { + _getProductIdState.value = UiState.Failure(it.message.toString()) + } + } + } }