diff --git a/app/src/main/java/org/fairscan/app/view/CameraPreview.kt b/app/src/main/java/org/fairscan/app/view/CameraPreview.kt index 96b6e3f..402a2b4 100644 --- a/app/src/main/java/org/fairscan/app/view/CameraPreview.kt +++ b/app/src/main/java/org/fairscan/app/view/CameraPreview.kt @@ -18,6 +18,7 @@ import android.graphics.Bitmap import android.util.Log import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.widget.LinearLayout +import androidx.camera.core.CameraControl import androidx.camera.core.CameraSelector import androidx.camera.core.ImageAnalysis import androidx.camera.core.ImageCapture @@ -136,7 +137,9 @@ fun bindCameraUseCases( captureController.imageCapture = imageCapture val cameraProvider = cameraProviderFuture.get() - cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageAnalysis, preview, imageCapture) + val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, + imageAnalysis, preview, imageCapture) + captureController.cameraControl = camera.cameraControl } @Composable @@ -197,6 +200,7 @@ fun replaceColor(bitmap: Bitmap, toReplace: Color, replacement: Color): Bitmap { fun Point.toOffset() = Offset(x.toFloat(), y.toFloat()) class CameraCaptureController { + var cameraControl: CameraControl? = null var imageCapture: ImageCapture? = null private val executor = Executors.newSingleThreadExecutor() diff --git a/app/src/main/java/org/fairscan/app/view/CameraScreen.kt b/app/src/main/java/org/fairscan/app/view/CameraScreen.kt index 9e26182..52824b9 100644 --- a/app/src/main/java/org/fairscan/app/view/CameraScreen.kt +++ b/app/src/main/java/org/fairscan/app/view/CameraScreen.kt @@ -45,6 +45,10 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Done +import androidx.compose.material.icons.filled.FlashOff +import androidx.compose.material.icons.filled.FlashOn +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -93,7 +97,8 @@ data class CameraUiState( val captureState: CaptureState, val showDetectionError: Boolean, val isLandscape: Boolean, - val isDebugMode: Boolean + val isDebugMode: Boolean, + val isTorchEnabled: Boolean, ) const val CAPTURED_IMAGE_DISPLAY_DURATION = 1500L @@ -112,6 +117,7 @@ fun CameraScreen( val document by viewModel.documentUiModel.collectAsStateWithLifecycle() val thumbnailCoords = remember { mutableStateOf(Offset.Zero) } var isDebugMode by remember { mutableStateOf(false) } + var isTorchEnabled by remember { mutableStateOf(false) } BackHandler { navigation.back() } @@ -168,7 +174,8 @@ fun CameraScreen( captureState, showDetectionError, isLandscape = isLandscape, - isDebugMode), + isDebugMode, + isTorchEnabled), onCapture = { previewView?.bitmap?.let { Log.i("FairScan", "Pressed ") @@ -180,6 +187,9 @@ fun CameraScreen( }, onFinalizePressed = onFinalizePressed, onDebugModeSwitched = { isDebugMode = !isDebugMode }, + onTorchSwitched = { + isTorchEnabled = !isTorchEnabled + captureController.cameraControl?.enableTorch(isTorchEnabled) }, thumbnailCoords = thumbnailCoords, navigation = navigation ) @@ -193,6 +203,7 @@ private fun CameraScreenScaffold( onCapture: () -> Unit, onFinalizePressed: () -> Unit, onDebugModeSwitched: () -> Unit, + onTorchSwitched: () -> Unit, thumbnailCoords: MutableState, navigation: Navigation, ) { @@ -225,6 +236,7 @@ private fun CameraScreenScaffold( cameraPreview, cameraUiState, onCapture, + onTorchSwitched, modifier.clickable(onClick = onPageCountClick)) } if (cameraUiState.captureState is CaptureState.CapturePreview) { @@ -238,6 +250,7 @@ private fun CameraPreviewBox( cameraPreview: @Composable (() -> Unit), cameraUiState: CameraUiState, onCapture: () -> Unit, + onTorchSwitched: () -> Unit, modifier: Modifier, ) { Box( @@ -257,6 +270,20 @@ private fun CameraPreviewBox( .align(Alignment.BottomCenter) .padding(16.dp) ) + IconButton( + onClick = onTorchSwitched, + modifier = Modifier.align(Alignment.BottomStart) + ) { + val torchEnabled = cameraUiState.isTorchEnabled + val icon = if (torchEnabled) Icons.Default.FlashOn else Icons.Default.FlashOff + Icon( + imageVector = icon, + contentDescription = + stringResource( + if (torchEnabled) R.string.turn_off_torch else R.string.turn_on_torch), + tint = Color.White + ) + } } } @@ -479,10 +506,11 @@ private fun ScreenPreview(captureState: CaptureState, rotationDegrees: Float = 0 listState = LazyListState(), ), cameraUiState = CameraUiState(pageCount = 4, LiveAnalysisState(), captureState, - false, rotationDegrees > 0, false), + false, rotationDegrees > 0, false, false), onCapture = {}, onFinalizePressed = {}, onDebugModeSwitched = {}, + onTorchSwitched = {}, thumbnailCoords = thumbnailCoords, navigation = dummyNavigation() ) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 5af979f..40b1907 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -40,6 +40,8 @@ Sdílet Sdílet PDF Nelze uložit PDF: přístup zakázán + Vypnout svítilnu + Zapnout svítilnu Neznámá velikost Verze Zobrazit úplnou licenci diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2bccc37..a03ce65 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -39,6 +39,8 @@ Teilen PDF teilen PDF-Datei kann nicht gespeichert werden: Berechtigung verweigert + Taschenlampe ausschalten + Taschenlampe einschalten Unbekannte Größe Version Vollständige Lizenz anzeigen diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index a0a607b..f650e92 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -39,6 +39,8 @@ Compartir Compartir PDF No se puede guardar el archivo PDF: permiso denegado + Apagar linterna + Encender linterna Tamaño desconocido Versión Ver la licencia completa diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3becac4..255f026 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -39,6 +39,8 @@ Partager Partager le PDF Impossible d’enregistrer le fichier PDF : permission refusée + Éteindre la torche + Allumer la torche Taille inconnue Version Voir la licence complète diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4ba9d5d..90da1de 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -39,6 +39,8 @@ Condividi Condividi PDF Impossibile salvare il file PDF: autorizzazione negata + Spegni la torcia + Accendi la torcia Dimensione sconosciuta Versione Vedi la licenza completa diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ef79fb1..5e8a816 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -39,6 +39,8 @@ Compartilhar Compartilhar PDF Não foi possível salvar o arquivo PDF: permissão negada + Desligar lanterna + Ligar lanterna Tamanho desconhecido Versão Ver licença completa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ed02e4c..49a9daf 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -39,6 +39,8 @@ Поделиться Поделиться PDF Не удается сохранить файл PDF: в разрешении отказано + Выключить фонарик + Включить фонарик Неизвестный размер Версия Просмотреть полную лицензию diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index bf5dfe7..53f501e 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -39,6 +39,8 @@ 共享 共享 PDF 无法保存PDF文件:权限被拒绝 + 关闭手电筒 + 打开手电筒 未知大小 版本 查看完整许可证 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2a3c5f0..bc8e481 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,6 +40,8 @@ Share Share PDF Cannot save PDF file: permission was denied + Turn off torch + Turn on torch Unknown size Version View the full license