From 3d4c38de040b20e2f07a540586c6f88b45eba700 Mon Sep 17 00:00:00 2001 From: darthpaul Date: Sun, 23 Oct 2022 00:00:22 +0100 Subject: [PATCH] add always on torch mode for image capture --- .../camera/activities/MainActivity.kt | 17 +++++++++++++---- .../simplemobiletools/camera/extensions/Int.kt | 3 +++ .../camera/helpers/Constants.kt | 1 + .../camera/implementations/CameraXPreview.kt | 14 ++++++++------ .../main/res/drawable/ic_flashlight_vector.xml | 18 ++++++++++++++++++ app/src/main/res/layout/layout_flash.xml | 9 +++++++++ 6 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable/ic_flashlight_vector.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt index 097a4ae7..8f4dde4e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt @@ -39,10 +39,13 @@ import com.simplemobiletools.camera.views.FocusCircleView import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.Release +import java.util.concurrent.TimeUnit import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.layout_flash.* -import kotlinx.android.synthetic.main.layout_top.* -import java.util.concurrent.TimeUnit +import kotlinx.android.synthetic.main.layout_top.change_resolution +import kotlinx.android.synthetic.main.layout_top.default_icons +import kotlinx.android.synthetic.main.layout_top.settings +import kotlinx.android.synthetic.main.layout_top.toggle_flash class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, CameraXPreviewListener { private companion object { @@ -342,7 +345,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera mTimerHandler = Handler(Looper.getMainLooper()) setupPreviewImage(true) - val initialFlashlightState = if (mIsInPhotoMode) config.flashlightState else FLASH_OFF + val initialFlashlightState = if (mIsInPhotoMode && config.flashlightState != FLASH_ALWAYS_ON) config.flashlightState else FLASH_OFF mPreview!!.setFlashlightState(initialFlashlightState) updateFlashlightState(initialFlashlightState) initFlashModeTransitionNames() @@ -353,6 +356,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera flash_auto.transitionName = "$baseName$FLASH_AUTO" flash_off.transitionName = "$baseName$FLASH_OFF" flash_on.transitionName = "$baseName$FLASH_ON" + flash_always_on.transitionName = "$baseName$FLASH_ALWAYS_ON" } private fun initButtons() { @@ -374,6 +378,9 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera flash_auto.setShadowIcon(R.drawable.ic_flash_auto_vector) flash_auto.setOnClickListener { selectFlashMode(FLASH_AUTO) } + + flash_always_on.setShadowIcon(R.drawable.ic_flashlight_vector) + flash_always_on.setOnClickListener { selectFlashMode(FLASH_ALWAYS_ON) } } private fun selectFlashMode(flashMode: Int) { @@ -409,7 +416,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera val flashDrawable = when (state) { FLASH_OFF -> R.drawable.ic_flash_off_vector FLASH_ON -> R.drawable.ic_flash_on_vector - else -> R.drawable.ic_flash_auto_vector + FLASH_AUTO -> R.drawable.ic_flash_auto_vector + else -> R.drawable.ic_flashlight_vector } toggle_flash.setShadowIcon(flashDrawable) toggle_flash.transitionName = "${getString(R.string.toggle_flash)}$state" @@ -814,6 +822,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera val transitionSet = createTransition() TransitionManager.go(flashModeScene, transitionSet) flash_auto.beVisibleIf(photoCapture) + flash_always_on.beVisibleIf(photoCapture) flash_toggle_group.check(config.flashlightState.toFlashModeId()) flash_toggle_group.beVisible() diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Int.kt b/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Int.kt index 78767ee3..5a2f9877 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Int.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Int.kt @@ -3,6 +3,7 @@ package com.simplemobiletools.camera.extensions import androidx.camera.core.CameraSelector import androidx.camera.core.ImageCapture import com.simplemobiletools.camera.R +import com.simplemobiletools.camera.helpers.FLASH_ALWAYS_ON import com.simplemobiletools.camera.helpers.FLASH_AUTO import com.simplemobiletools.camera.helpers.FLASH_OFF import com.simplemobiletools.camera.helpers.FLASH_ON @@ -12,6 +13,7 @@ fun Int.toCameraXFlashMode(): Int { FLASH_ON -> ImageCapture.FLASH_MODE_ON FLASH_OFF -> ImageCapture.FLASH_MODE_OFF FLASH_AUTO -> ImageCapture.FLASH_MODE_AUTO + FLASH_ALWAYS_ON -> ImageCapture.FLASH_MODE_OFF else -> throw IllegalArgumentException("Unknown mode: $this") } } @@ -30,6 +32,7 @@ fun Int.toFlashModeId(): Int { FLASH_ON -> R.id.flash_on FLASH_OFF -> R.id.flash_off FLASH_AUTO -> R.id.flash_auto + FLASH_ALWAYS_ON -> R.id.flash_always_on else -> throw IllegalArgumentException("Unknown mode: $this") } } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Constants.kt index 012a8765..28b94db7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Constants.kt @@ -23,6 +23,7 @@ const val PHOTO_QUALITY = "photo_quality" const val FLASH_OFF = 0 const val FLASH_ON = 1 const val FLASH_AUTO = 2 +const val FLASH_ALWAYS_ON = 3 fun compensateDeviceRotation(orientation: Int) = when (orientation) { ORIENT_LANDSCAPE_LEFT -> 270 diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt b/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt index c6262a65..17e5b8b8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt @@ -402,15 +402,17 @@ class CameraXPreview( } override fun setFlashlightState(state: Int) { - val newFlashMode = state.toCameraXFlashMode() - if (!isPhotoCapture) { - camera?.cameraControl?.enableTorch(newFlashMode == FLASH_MODE_ON) + if (isPhotoCapture) { + camera?.cameraControl?.enableTorch(state == FLASH_ALWAYS_ON) + } else { + camera?.cameraControl?.enableTorch(state == FLASH_ON || state == FLASH_ALWAYS_ON) } + val newFlashMode = state.toCameraXFlashMode() flashMode = newFlashMode imageCapture?.flashMode = newFlashMode - val appFlashMode = flashMode.toAppFlashMode() - config.flashlightState = appFlashMode - listener.onChangeFlashMode(appFlashMode) + + config.flashlightState = state + listener.onChangeFlashMode(state) } override fun tryTakePicture() { diff --git a/app/src/main/res/drawable/ic_flashlight_vector.xml b/app/src/main/res/drawable/ic_flashlight_vector.xml new file mode 100644 index 00000000..29283afd --- /dev/null +++ b/app/src/main/res/drawable/ic_flashlight_vector.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/layout/layout_flash.xml b/app/src/main/res/layout/layout_flash.xml index 2f2c05b0..94a261a1 100644 --- a/app/src/main/res/layout/layout_flash.xml +++ b/app/src/main/res/layout/layout_flash.xml @@ -36,4 +36,13 @@ app:icon="@drawable/ic_flash_on_vector" /> + + +