diff --git a/app/src/main/java/org/mydomain/myscan/CameraScreenState.kt b/app/src/main/java/org/mydomain/myscan/LiveAnalysisState.kt similarity index 60% rename from app/src/main/java/org/mydomain/myscan/CameraScreenState.kt rename to app/src/main/java/org/mydomain/myscan/LiveAnalysisState.kt index f01dde9..97ef7f3 100644 --- a/app/src/main/java/org/mydomain/myscan/CameraScreenState.kt +++ b/app/src/main/java/org/mydomain/myscan/LiveAnalysisState.kt @@ -4,11 +4,8 @@ import android.graphics.Bitmap import androidx.compose.runtime.Immutable @Immutable -// TODO Rename to LiveAnalysisState -data class CameraScreenState( - val detectionMessage: String? = null, +data class LiveAnalysisState( val inferenceTime: Long = 0L, val binaryMask: Bitmap? = null, - val errorMessage: String? = null, val documentQuad: Quad? = null, ) diff --git a/app/src/main/java/org/mydomain/myscan/MainActivity.kt b/app/src/main/java/org/mydomain/myscan/MainActivity.kt index d7a6548..9a900a9 100644 --- a/app/src/main/java/org/mydomain/myscan/MainActivity.kt +++ b/app/src/main/java/org/mydomain/myscan/MainActivity.kt @@ -37,7 +37,7 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { val currentScreen by viewModel.currentScreen.collectAsStateWithLifecycle() - val cameraScreenState by viewModel.cameraScreenState.collectAsStateWithLifecycle() + val liveAnalysisState by viewModel.liveAnalysisState.collectAsStateWithLifecycle() val pages by viewModel.pages.collectAsStateWithLifecycle() val context = LocalContext.current MyScanTheme { @@ -45,7 +45,7 @@ class MainActivity : ComponentActivity() { Column (modifier = Modifier.padding(innerPadding)) { when (currentScreen) { is Screen.Camera -> { - CameraScreen(viewModel, cameraScreenState, + CameraScreen(viewModel, liveAnalysisState, onImageAnalyzed = { image -> viewModel.segment(image) }, onFinalizePressed = { viewModel.navigateTo(Screen.FinalizeDocument) } ) diff --git a/app/src/main/java/org/mydomain/myscan/MainViewModel.kt b/app/src/main/java/org/mydomain/myscan/MainViewModel.kt index b477df0..88a36a2 100644 --- a/app/src/main/java/org/mydomain/myscan/MainViewModel.kt +++ b/app/src/main/java/org/mydomain/myscan/MainViewModel.kt @@ -4,7 +4,6 @@ import android.content.Context import android.graphics.Bitmap import android.graphics.Matrix import androidx.camera.core.ImageProxy -import androidx.compose.runtime.mutableStateListOf import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope @@ -29,8 +28,8 @@ class MainViewModel(private val imageSegmentationService: ImageSegmentationServi } } - private var _cameraScreenState = MutableStateFlow(CameraScreenState("just started")) - val cameraScreenState: StateFlow = _cameraScreenState.asStateFlow() + private var _liveAnalysisState = MutableStateFlow(LiveAnalysisState()) + val liveAnalysisState: StateFlow = _liveAnalysisState.asStateFlow() private val _currentScreen = MutableStateFlow(Screen.Camera) val currentScreen: StateFlow = _currentScreen.asStateFlow() @@ -46,15 +45,14 @@ class MainViewModel(private val imageSegmentationService: ImageSegmentationServi .filterNotNull() .map { val binaryMask = it.segmentation.toBinaryMask() - CameraScreenState( - detectionMessage = "Inference done", + LiveAnalysisState( inferenceTime = it.inferenceTime, binaryMask = binaryMask, documentQuad = detectDocumentQuad(binaryMask) ) } .collect { - _cameraScreenState.value = it + _liveAnalysisState.value = it } } } diff --git a/app/src/main/java/org/mydomain/myscan/view/Camera.kt b/app/src/main/java/org/mydomain/myscan/view/Camera.kt index 3fb0073..38ec307 100644 --- a/app/src/main/java/org/mydomain/myscan/view/Camera.kt +++ b/app/src/main/java/org/mydomain/myscan/view/Camera.kt @@ -54,7 +54,7 @@ import androidx.core.graphics.scale import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.compose.LocalLifecycleOwner import com.google.common.util.concurrent.ListenableFuture -import org.mydomain.myscan.CameraScreenState +import org.mydomain.myscan.LiveAnalysisState import org.mydomain.myscan.MainViewModel import org.mydomain.myscan.Point import org.mydomain.myscan.scaledTo @@ -66,7 +66,7 @@ import java.util.concurrent.Executors @Composable fun CameraScreen( viewModel: MainViewModel, - uiState: CameraScreenState, + liveAnalysisState: LiveAnalysisState, onImageAnalyzed: (ImageProxy) -> Unit, onFinalizePressed: () -> Unit ) { @@ -98,8 +98,8 @@ fun CameraScreen( } Box(modifier = Modifier.fillMaxSize()) { - CameraPreviewWithOverlay(onImageAnalyzed, captureController, uiState) - MessageBox(uiState.inferenceTime) + CameraPreviewWithOverlay(onImageAnalyzed, captureController, liveAnalysisState) + MessageBox(liveAnalysisState.inferenceTime) Button( onClick = { showPageDialog.value = true @@ -148,7 +148,7 @@ fun CameraScreen( private fun CameraPreviewWithOverlay( onImageAnalyzed: (ImageProxy) -> Unit, captureController: CameraCaptureController, - uiState: CameraScreenState + liveAnalysisState: LiveAnalysisState ) { val width = LocalConfiguration.current.screenWidthDp val height = width / 3 * 4 @@ -161,7 +161,7 @@ private fun CameraPreviewWithOverlay( onImageAnalyzed = onImageAnalyzed, captureController = captureController ) - AnalysisOverlay(uiState) + AnalysisOverlay(liveAnalysisState) } } @@ -237,8 +237,8 @@ fun bindCameraUseCases( } @Composable -private fun AnalysisOverlay(cameraScreenState: CameraScreenState) { - val binaryMask = cameraScreenState.binaryMask +private fun AnalysisOverlay(liveAnalysisState: LiveAnalysisState) { + val binaryMask = liveAnalysisState.binaryMask if (binaryMask == null) { return } @@ -248,8 +248,8 @@ private fun AnalysisOverlay(cameraScreenState: CameraScreenState) { maskOverlay.scale(size.width.toInt(), size.height.toInt()).asImageBitmap(), colorFilter = ColorFilter.tint(Color(0x8000FF00), BlendMode.SrcIn) ) - if (cameraScreenState.documentQuad != null) { - val scaledQuad = cameraScreenState.documentQuad.scaledTo( + if (liveAnalysisState.documentQuad != null) { + val scaledQuad = liveAnalysisState.documentQuad.scaledTo( fromWidth = binaryMask.width, fromHeight = binaryMask.height, toWidth = size.width.toInt(),