diff --git a/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/screen/CameraScreen.kt b/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/screen/CameraScreen.kt index fac0a2b..e428db8 100644 --- a/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/screen/CameraScreen.kt +++ b/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/screen/CameraScreen.kt @@ -93,7 +93,9 @@ import com.tomsksoft.videoeffectsrecorder.ui.entity.SecondaryFiltersMode import com.tomsksoft.videoeffectsrecorder.ui.viewmodel.CameraViewModel import com.tomsksoft.videoeffectsrecorder.ui.viewmodel.CameraViewModelImpl import com.tomsksoft.videoeffectsrecorder.ui.viewmodel.CameraViewModelStub +import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlin.math.max private const val REQUEST_PICK_PHOTO_BACKGROUND = 1 private const val REQUEST_PICK_PHOTO_GRADING_SOURCE = 2 @@ -251,13 +253,17 @@ fun CameraUi(viewModel: CameraViewModel, onGalleryClick: () -> Unit) { cameraUiState = cameraUiState, onFlipCameraClick = viewModel::flipCamera, onCaptureClick = { + val animDurMs = 200 + val delayBeforeShotMs = viewModel.captureImage() + val delayBeforeAnimMs = max(0, delayBeforeShotMs - animDurMs) scope.launch { - val durationMs = 200 + if (delayBeforeAnimMs > 0) + delay(delayBeforeAnimMs.toLong()) + alphaAnimation.animateTo(0f, snap()) - alphaAnimation.animateTo(1f, tween(durationMs / 2)) - alphaAnimation.animateTo(0f, tween(durationMs / 2)) + alphaAnimation.animateTo(1f, tween(animDurMs / 2)) + alphaAnimation.animateTo(0f, tween(animDurMs / 2)) } - viewModel.captureImage() }, onLongPress = viewModel::startVideoRecording, onRelease = viewModel::stopVideoRecording, diff --git a/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/viewmodel/CameraViewModel.kt b/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/viewmodel/CameraViewModel.kt index 43c22ff..4bad488 100644 --- a/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/viewmodel/CameraViewModel.kt +++ b/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/viewmodel/CameraViewModel.kt @@ -20,7 +20,11 @@ interface CameraViewModel { fun setBackground(bitmapStream: InputStream) fun removeBackground() fun flipCamera() - fun captureImage() + + /** + * @return delay before actual shot + */ + fun captureImage(): Int fun startVideoRecording() fun stopVideoRecording() fun setBlurPower(value: Float) diff --git a/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/viewmodel/CameraViewModelImpl.kt b/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/viewmodel/CameraViewModelImpl.kt index 96fbb3d..b109e46 100644 --- a/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/viewmodel/CameraViewModelImpl.kt +++ b/app/src/main/java/com/tomsksoft/videoeffectsrecorder/ui/viewmodel/CameraViewModelImpl.kt @@ -219,9 +219,9 @@ class CameraViewModelImpl @Inject constructor( } } - override fun captureImage() { + override fun captureImage(): Int { Log.d(TAG, "Capture image") - cameraRecordManager.takePhoto(camera!!.frame) + return cameraRecordManager.takePhoto(camera!!.frame) } override fun startVideoRecording() { diff --git a/domain/src/main/java/com/tomsksoft/videoeffectsrecorder/domain/usecase/CameraRecordManager.kt b/domain/src/main/java/com/tomsksoft/videoeffectsrecorder/domain/usecase/CameraRecordManager.kt index 03e5f0f..44fbf7e 100644 --- a/domain/src/main/java/com/tomsksoft/videoeffectsrecorder/domain/usecase/CameraRecordManager.kt +++ b/domain/src/main/java/com/tomsksoft/videoeffectsrecorder/domain/usecase/CameraRecordManager.kt @@ -26,17 +26,24 @@ class CameraRecordManager( val isRecording: Boolean get() = record != null - fun takePhoto(frameSource: Observable) { + fun takePhoto(frameSource: Observable): Int { + val flashDuration = + if (cameraManager.flashMode.blockingFirst() == FlashMode.AUTO) + 1000 + else + 0 + scope.launch { val frame: Any - if (cameraManager.flashMode.blockingFirst() == FlashMode.AUTO) { + + if (flashDuration > 0) { cameraManager.setFlashEnabled(true) - delay(1000L) + delay(flashDuration.toLong()) frame = frameSource.blockingFirst() cameraManager.setFlashEnabled(false) - } else { + } else frame = frameSource.blockingFirst() - } + photoPicker.takePhoto( frame, cameraManager.orientation.blockingFirst(), @@ -44,6 +51,8 @@ class CameraRecordManager( PHOTO_MIME_TYPE ) } + + return flashDuration } fun startRecord(frameSource: Observable) {