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 e71f3231..d2f6c140 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt @@ -40,17 +40,11 @@ import com.simplemobiletools.camera.views.FocusCircleView import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.Release +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 kotlin.math.abs -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.layout_flash.flash_auto -import kotlinx.android.synthetic.main.layout_flash.flash_off -import kotlinx.android.synthetic.main.layout_flash.flash_on -import kotlinx.android.synthetic.main.layout_flash.flash_toggle_group -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 { @@ -352,7 +346,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() @@ -363,6 +357,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() { @@ -384,10 +379,13 @@ 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) } } @SuppressLint("ClickableViewAccessibility") - private fun initModeSwitcher(){ + private fun initModeSwitcher() { val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() { override fun onFling(event1: MotionEvent, event2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { val deltaX = event1.x - event2.x @@ -456,7 +454,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" @@ -849,6 +848,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 25de1cd6..d3c075e0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Constants.kt @@ -24,6 +24,7 @@ const val CAPTURE_MODE = "capture_mode" 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 89cf2500..50c40428 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt @@ -395,15 +395,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..1fc85f00 --- /dev/null +++ b/app/src/main/res/drawable/ic_flashlight_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/app/src/main/res/layout/layout_flash.xml b/app/src/main/res/layout/layout_flash.xml index 2f2c05b0..2babccb2 100644 --- a/app/src/main/res/layout/layout_flash.xml +++ b/app/src/main/res/layout/layout_flash.xml @@ -10,7 +10,6 @@ app:singleSelection="true" tools:visibility="visible"> - +