Skip to content

Commit 98c0f05

Browse files
committed
cleanup flash implementation
- fix issues with brightness control - add separate classes for Android 5 and Android 6+ for simplicity - properly cleanup camera in onDestory and also when stroboscope/flashlight mode are disabled
1 parent 87b678e commit 98c0f05

File tree

5 files changed

+120
-163
lines changed

5 files changed

+120
-163
lines changed

app/src/main/kotlin/com/simplemobiletools/flashlight/activities/MainActivity.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import android.graphics.drawable.LayerDrawable
99
import android.os.Bundle
1010
import android.view.WindowManager
1111
import android.widget.ImageView
12-
import androidx.core.view.isVisible
1312
import com.simplemobiletools.commons.extensions.*
1413
import com.simplemobiletools.commons.helpers.LICENSE_EVENT_BUS
1514
import com.simplemobiletools.commons.helpers.PERMISSION_CAMERA
@@ -183,7 +182,7 @@ class MainActivity : SimpleActivity() {
183182
private fun setupCameraImpl() {
184183
mCameraImpl = MyCameraImpl.newInstance(this, object : CameraTorchListener {
185184
override fun onTorchEnabled(isEnabled: Boolean) {
186-
if (mCameraImpl?.supportsBrightnessControl() == true) {
185+
if (mCameraImpl!!.supportsBrightnessControl()) {
187186
brightness_bar.beVisibleIf(isEnabled)
188187
}
189188
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.simplemobiletools.flashlight.helpers
2+
3+
interface CameraFlash {
4+
fun initialize()
5+
fun toggleFlashlight(enable: Boolean)
6+
fun changeTorchBrightness(level: Int) {}
7+
fun getMaximumBrightnessLevel(): Int = DEFAULT_BRIGHTNESS_LEVEL
8+
fun supportsBrightnessControl(): Boolean = false
9+
fun getCurrentBrightnessLevel(): Int = DEFAULT_BRIGHTNESS_LEVEL
10+
fun unregisterListeners(){}
11+
fun release(){}
12+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
@file:Suppress("DEPRECATION")
2+
3+
package com.simplemobiletools.flashlight.helpers
4+
5+
import android.graphics.SurfaceTexture
6+
import android.hardware.Camera
7+
8+
class LollipopCameraFlash : CameraFlash {
9+
private var camera: Camera? = null
10+
private var params: Camera.Parameters? = null
11+
12+
override fun toggleFlashlight(enable: Boolean) {
13+
if (camera == null || params == null || camera!!.parameters == null) {
14+
return
15+
}
16+
val flashMode = if (enable) Camera.Parameters.FLASH_MODE_ON else Camera.Parameters.FLASH_MODE_OFF
17+
params!!.flashMode = flashMode
18+
camera!!.parameters = params
19+
if (enable) {
20+
val dummy = SurfaceTexture(1)
21+
camera!!.setPreviewTexture(dummy)
22+
camera!!.startPreview()
23+
}
24+
}
25+
26+
override fun initialize() {
27+
camera = Camera.open()
28+
params = camera!!.parameters
29+
params!!.flashMode = Camera.Parameters.FLASH_MODE_OFF
30+
camera!!.parameters = params
31+
}
32+
33+
override fun release() {
34+
camera!!.release()
35+
camera = null
36+
}
37+
}

app/src/main/kotlin/com/simplemobiletools/flashlight/helpers/PostMarshmallowCamera.kt renamed to app/src/main/kotlin/com/simplemobiletools/flashlight/helpers/MarshmallowPlusCameraFlash.kt

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ import com.simplemobiletools.flashlight.models.Events
1313
import org.greenrobot.eventbus.EventBus
1414

1515
@RequiresApi(Build.VERSION_CODES.M)
16-
internal class PostMarshmallowCamera(
16+
internal class MarshmallowPlusCameraFlash(
1717
private val context: Context,
18-
private val cameraTorchListener: CameraTorchListener? = null,
19-
) {
18+
private var cameraTorchListener: CameraTorchListener? = null,
19+
) : CameraFlash {
2020

2121
private val manager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
2222
private var cameraId: String? = null
@@ -35,12 +35,13 @@ internal class PostMarshmallowCamera(
3535
}
3636
}
3737

38-
fun toggleMarshmallowFlashlight(enable: Boolean) {
38+
override fun toggleFlashlight(enable: Boolean) {
3939
try {
40-
manager.setTorchMode(cameraId!!, enable)
41-
if (enable) {
40+
if (supportsBrightnessControl() && enable) {
4241
val brightnessLevel = getCurrentBrightnessLevel()
4342
changeTorchBrightness(brightnessLevel)
43+
} else {
44+
manager.setTorchMode(cameraId!!, enable)
4445
}
4546
} catch (e: Exception) {
4647
context.showErrorToast(e)
@@ -51,13 +52,13 @@ internal class PostMarshmallowCamera(
5152
}
5253
}
5354

54-
fun changeTorchBrightness(level: Int) {
55+
override fun changeTorchBrightness(level: Int) {
5556
if (isTiramisuPlus()) {
5657
manager.turnOnTorchWithStrengthLevel(cameraId!!, level)
5758
}
5859
}
5960

60-
fun getMaximumBrightnessLevel(): Int {
61+
override fun getMaximumBrightnessLevel(): Int {
6162
return if (isTiramisuPlus()) {
6263
val characteristics = manager.getCameraCharacteristics(cameraId!!)
6364
characteristics.get(CameraCharacteristics.FLASH_INFO_STRENGTH_MAXIMUM_LEVEL) ?: MIN_BRIGHTNESS_LEVEL
@@ -66,24 +67,28 @@ internal class PostMarshmallowCamera(
6667
}
6768
}
6869

69-
fun supportsBrightnessControl(): Boolean {
70+
override fun supportsBrightnessControl(): Boolean {
7071
val maxBrightnessLevel = getMaximumBrightnessLevel()
7172
return maxBrightnessLevel > MIN_BRIGHTNESS_LEVEL
7273
}
7374

74-
fun getCurrentBrightnessLevel(): Int {
75+
override fun getCurrentBrightnessLevel(): Int {
7576
var brightnessLevel = context.config.brightnessLevel
7677
if (brightnessLevel == DEFAULT_BRIGHTNESS_LEVEL) {
7778
brightnessLevel = getMaximumBrightnessLevel()
7879
}
7980
return brightnessLevel
8081
}
8182

82-
fun initialize() {
83+
override fun initialize() {
8384
manager.registerTorchCallback(torchCallback, Handler(context.mainLooper))
8485
}
8586

86-
fun cleanUp() {
87+
override fun unregisterListeners() {
8788
manager.unregisterTorchCallback(torchCallback)
8889
}
90+
91+
override fun release() {
92+
cameraTorchListener = null
93+
}
8994
}

0 commit comments

Comments
 (0)