Skip to content

Commit 66a4b96

Browse files
authored
Merge pull request #1565 from keymapperorg/feature/1507-flashlight-brightness
feature/1507-flashlight-brightness
2 parents 2366068 + 0082cac commit 66a4b96

30 files changed

+1338
-133
lines changed

app/src/main/java/io/github/sds100/keymapper/UseCases.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ object UseCases {
194194
fun createAction(ctx: Context) = CreateActionUseCaseImpl(
195195
ServiceLocator.inputMethodAdapter(ctx),
196196
ServiceLocator.systemFeatureAdapter(ctx),
197+
ServiceLocator.cameraAdapter(ctx),
197198
)
198199

199200
private fun keyMapperImeMessenger(

app/src/main/java/io/github/sds100/keymapper/actions/ActionData.kt

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,19 +180,46 @@ sealed class ActionData : Comparable<ActionData> {
180180
}
181181

182182
@Serializable
183-
data class Toggle(override val lens: CameraLens) : Flashlight() {
183+
data class Toggle(
184+
override val lens: CameraLens,
185+
/**
186+
* Strength is null if the default strength should be used. This is a percentage
187+
* of the flash strength so key maps can be exported to other devices with potentially
188+
* different strength levels.
189+
*/
190+
val strengthPercent: Float?,
191+
) : Flashlight() {
184192
override val id = ActionId.TOGGLE_FLASHLIGHT
185193
}
186194

187195
@Serializable
188-
data class Enable(override val lens: CameraLens) : Flashlight() {
196+
data class Enable(
197+
override val lens: CameraLens,
198+
/**
199+
* Strength is null if the default strength should be used. This is a percentage
200+
* of the flash strength so key maps can be exported to other devices with potentially
201+
* different strength levels.
202+
*/
203+
val strengthPercent: Float?,
204+
) : Flashlight() {
189205
override val id = ActionId.ENABLE_FLASHLIGHT
190206
}
191207

192208
@Serializable
193209
data class Disable(override val lens: CameraLens) : Flashlight() {
194210
override val id = ActionId.DISABLE_FLASHLIGHT
195211
}
212+
213+
@Serializable
214+
data class ChangeStrength(
215+
override val lens: CameraLens,
216+
/**
217+
* This can be positive or negative to increase/decrease respectively.
218+
*/
219+
val percent: Float,
220+
) : Flashlight() {
221+
override val id = ActionId.CHANGE_FLASHLIGHT_STRENGTH
222+
}
196223
}
197224

198225
@Serializable

app/src/main/java/io/github/sds100/keymapper/actions/ActionDataEntityMapper.kt

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -286,26 +286,40 @@ object ActionDataEntityMapper {
286286

287287
ActionId.TOGGLE_FLASHLIGHT,
288288
ActionId.ENABLE_FLASHLIGHT,
289-
ActionId.DISABLE_FLASHLIGHT,
289+
ActionId.CHANGE_FLASHLIGHT_STRENGTH,
290290
-> {
291291
val lens = entity.extras.getData(ActionEntity.EXTRA_LENS).then {
292292
LENS_MAP.getKey(it)!!.success()
293293
}.valueOrNull() ?: return null
294294

295-
when (actionId) {
296-
ActionId.TOGGLE_FLASHLIGHT ->
297-
ActionData.Flashlight.Toggle(lens)
298-
299-
ActionId.ENABLE_FLASHLIGHT ->
300-
ActionData.Flashlight.Enable(lens)
295+
val flashStrength = entity.extras.getData(ActionEntity.EXTRA_FLASH_STRENGTH).then {
296+
it.toFloatOrNull().success()
297+
}.valueOrNull()
301298

302-
ActionId.DISABLE_FLASHLIGHT ->
303-
ActionData.Flashlight.Disable(lens)
299+
when (actionId) {
300+
ActionId.TOGGLE_FLASHLIGHT -> ActionData.Flashlight.Toggle(lens, flashStrength)
301+
ActionId.ENABLE_FLASHLIGHT -> ActionData.Flashlight.Enable(lens, flashStrength)
302+
303+
ActionId.CHANGE_FLASHLIGHT_STRENGTH -> {
304+
flashStrength ?: return null
305+
ActionData.Flashlight.ChangeStrength(
306+
lens,
307+
flashStrength,
308+
)
309+
}
304310

305311
else -> throw Exception("don't know how to create system action for $actionId")
306312
}
307313
}
308314

315+
ActionId.DISABLE_FLASHLIGHT,
316+
-> {
317+
val lens = entity.extras.getData(ActionEntity.EXTRA_LENS).then {
318+
LENS_MAP.getKey(it)!!.success()
319+
}.valueOrNull() ?: return null
320+
ActionData.Flashlight.Disable(lens)
321+
}
322+
309323
ActionId.TOGGLE_DND_MODE,
310324
ActionId.ENABLE_DND_MODE,
311325
-> {
@@ -614,9 +628,48 @@ object ActionDataEntityMapper {
614628
),
615629
)
616630

617-
is ActionData.Flashlight -> listOf(
618-
EntityExtra(ActionEntity.EXTRA_LENS, LENS_MAP[data.lens]!!),
619-
)
631+
is ActionData.Flashlight -> {
632+
val lensExtra = EntityExtra(ActionEntity.EXTRA_LENS, LENS_MAP[data.lens]!!)
633+
634+
when (data) {
635+
is ActionData.Flashlight.Toggle -> buildList {
636+
add(lensExtra)
637+
638+
if (data.strengthPercent != null) {
639+
add(
640+
EntityExtra(
641+
ActionEntity.EXTRA_FLASH_STRENGTH,
642+
data.strengthPercent.toString(),
643+
),
644+
)
645+
}
646+
}
647+
648+
is ActionData.Flashlight.Enable -> buildList {
649+
add(lensExtra)
650+
651+
if (data.strengthPercent != null) {
652+
add(
653+
EntityExtra(
654+
ActionEntity.EXTRA_FLASH_STRENGTH,
655+
data.strengthPercent.toString(),
656+
),
657+
)
658+
}
659+
}
660+
661+
is ActionData.Flashlight.Disable -> listOf(lensExtra)
662+
is ActionData.Flashlight.ChangeStrength -> buildList {
663+
add(lensExtra)
664+
add(
665+
EntityExtra(
666+
ActionEntity.EXTRA_FLASH_STRENGTH,
667+
data.percent.toString(),
668+
),
669+
)
670+
}
671+
}
672+
}
620673

621674
is ActionData.SwitchKeyboard -> listOf(
622675
EntityExtra(ActionEntity.EXTRA_IME_ID, data.imeId),
@@ -773,6 +826,7 @@ object ActionDataEntityMapper {
773826
ActionId.TOGGLE_FLASHLIGHT to "toggle_flashlight",
774827
ActionId.ENABLE_FLASHLIGHT to "enable_flashlight",
775828
ActionId.DISABLE_FLASHLIGHT to "disable_flashlight",
829+
ActionId.CHANGE_FLASHLIGHT_STRENGTH to "change_flashlight_strength",
776830

777831
ActionId.ENABLE_NFC to "nfc_enable",
778832
ActionId.DISABLE_NFC to "nfc_disable",

app/src/main/java/io/github/sds100/keymapper/actions/ActionErrorSnapshot.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class LazyActionErrorSnapshot(
2323
private val soundsManager: SoundsManager,
2424
shizukuAdapter: ShizukuAdapter,
2525
) : ActionErrorSnapshot,
26-
IsActionSupportedUseCase by IsActionSupportedUseCaseImpl(systemFeatureAdapter) {
26+
IsActionSupportedUseCase by IsActionSupportedUseCaseImpl(systemFeatureAdapter, cameraAdapter) {
2727
private val keyMapperImeHelper = KeyMapperImeHelper(inputMethodAdapter)
2828

2929
private val isCompatibleImeEnabled by lazy { keyMapperImeHelper.isCompatibleImeEnabled() }
@@ -34,11 +34,11 @@ class LazyActionErrorSnapshot(
3434
private val grantedPermissions: MutableMap<Permission, Boolean> = mutableMapOf()
3535
private val flashLenses by lazy {
3636
buildSet {
37-
if (cameraAdapter.hasFlashFacing(CameraLens.FRONT)) {
37+
if (cameraAdapter.getFlashInfo(CameraLens.FRONT) != null) {
3838
add(CameraLens.FRONT)
3939
}
4040

41-
if (cameraAdapter.hasFlashFacing(CameraLens.BACK)) {
41+
if (cameraAdapter.getFlashInfo(CameraLens.BACK) != null) {
4242
add(CameraLens.BACK)
4343
}
4444
}

app/src/main/java/io/github/sds100/keymapper/actions/ActionId.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ enum class ActionId {
8989
TOGGLE_FLASHLIGHT,
9090
ENABLE_FLASHLIGHT,
9191
DISABLE_FLASHLIGHT,
92+
CHANGE_FLASHLIGHT_STRENGTH,
9293

9394
ENABLE_NFC,
9495
DISABLE_NFC,

app/src/main/java/io/github/sds100/keymapper/actions/ActionUiHelper.kt

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.sds100.keymapper.actions
22

3+
import android.os.Build
34
import android.view.KeyEvent
45
import androidx.compose.material.icons.Icons
56
import androidx.compose.material.icons.outlined.Android
@@ -240,15 +241,56 @@ class ActionUiHelper(
240241
)
241242

242243
is ActionData.Flashlight -> {
243-
val resId = when (action) {
244-
is ActionData.Flashlight.Toggle -> R.string.action_toggle_flashlight_formatted
245-
is ActionData.Flashlight.Enable -> R.string.action_enable_flashlight_formatted
246-
is ActionData.Flashlight.Disable -> R.string.action_disable_flashlight_formatted
247-
}
248-
249244
val lensString = getString(CameraLensUtils.getLabel(action.lens))
250245

251-
getString(resId, lensString)
246+
when (action) {
247+
is ActionData.Flashlight.Toggle -> {
248+
if (action.strengthPercent == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
249+
getString(R.string.action_toggle_flashlight_formatted, lensString)
250+
} else {
251+
getString(
252+
R.string.action_toggle_flashlight_with_strength,
253+
arrayOf(
254+
lensString,
255+
(action.strengthPercent * 100).toInt(),
256+
),
257+
)
258+
}
259+
}
260+
261+
is ActionData.Flashlight.Enable -> {
262+
if (action.strengthPercent == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
263+
getString(R.string.action_enable_flashlight_formatted, lensString)
264+
} else {
265+
getString(
266+
R.string.action_enable_flashlight_with_strength,
267+
arrayOf(
268+
lensString,
269+
(action.strengthPercent * 100).toInt(),
270+
),
271+
)
272+
}
273+
}
274+
275+
is ActionData.Flashlight.Disable -> getString(
276+
R.string.action_disable_flashlight_formatted,
277+
lensString,
278+
)
279+
280+
is ActionData.Flashlight.ChangeStrength -> {
281+
if (action.percent > 0) {
282+
getString(
283+
R.string.action_flashlight_increase_strength_formatted,
284+
arrayOf(lensString, (action.percent * 100).toInt()),
285+
)
286+
} else {
287+
getString(
288+
R.string.action_flashlight_decrease_strength_formatted,
289+
arrayOf(lensString, (action.percent * 100).toInt()),
290+
)
291+
}
292+
}
293+
}
252294
}
253295

254296
is ActionData.SwitchKeyboard -> getInputMethodLabel(action.imeId).handle(

app/src/main/java/io/github/sds100/keymapper/actions/ActionUtils.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ object ActionUtils {
191191
ActionId.TOGGLE_FLASHLIGHT -> ActionCategory.CAMERA_SOUND
192192
ActionId.ENABLE_FLASHLIGHT -> ActionCategory.CAMERA_SOUND
193193
ActionId.DISABLE_FLASHLIGHT -> ActionCategory.CAMERA_SOUND
194+
ActionId.CHANGE_FLASHLIGHT_STRENGTH -> ActionCategory.CAMERA_SOUND
194195
ActionId.SOUND -> ActionCategory.CAMERA_SOUND
195196

196197
ActionId.ENABLE_NFC -> ActionCategory.CONNECTIVITY
@@ -294,6 +295,7 @@ object ActionUtils {
294295
ActionId.TOGGLE_FLASHLIGHT -> R.string.action_toggle_flashlight
295296
ActionId.ENABLE_FLASHLIGHT -> R.string.action_enable_flashlight
296297
ActionId.DISABLE_FLASHLIGHT -> R.string.action_disable_flashlight
298+
ActionId.CHANGE_FLASHLIGHT_STRENGTH -> R.string.action_flashlight_change_strength
297299
ActionId.ENABLE_NFC -> R.string.action_nfc_enable
298300
ActionId.DISABLE_NFC -> R.string.action_nfc_disable
299301
ActionId.TOGGLE_NFC -> R.string.action_nfc_toggle
@@ -404,6 +406,7 @@ object ActionUtils {
404406
ActionId.TOGGLE_FLASHLIGHT -> R.drawable.ic_flashlight
405407
ActionId.ENABLE_FLASHLIGHT -> R.drawable.ic_flashlight
406408
ActionId.DISABLE_FLASHLIGHT -> R.drawable.ic_flashlight_off
409+
ActionId.CHANGE_FLASHLIGHT_STRENGTH -> R.drawable.ic_flashlight
407410
ActionId.ENABLE_NFC -> R.drawable.ic_outline_nfc_24
408411
ActionId.DISABLE_NFC -> R.drawable.ic_nfc_off
409412
ActionId.TOGGLE_NFC -> R.drawable.ic_outline_nfc_24
@@ -471,6 +474,9 @@ object ActionUtils {
471474
ActionId.TOGGLE_FLASHLIGHT,
472475
-> Build.VERSION_CODES.M
473476

477+
ActionId.CHANGE_FLASHLIGHT_STRENGTH,
478+
-> Build.VERSION_CODES.TIRAMISU
479+
474480
ActionId.TOGGLE_KEYBOARD,
475481
ActionId.SHOW_KEYBOARD,
476482
ActionId.HIDE_KEYBOARD,
@@ -533,6 +539,7 @@ object ActionUtils {
533539
ActionId.TOGGLE_FLASHLIGHT,
534540
ActionId.ENABLE_FLASHLIGHT,
535541
ActionId.DISABLE_FLASHLIGHT,
542+
ActionId.CHANGE_FLASHLIGHT_STRENGTH,
536543
-> listOf(PackageManager.FEATURE_CAMERA_FLASH)
537544

538545
else -> emptyList()
@@ -596,6 +603,7 @@ object ActionUtils {
596603
ActionId.TOGGLE_FLASHLIGHT,
597604
ActionId.ENABLE_FLASHLIGHT,
598605
ActionId.DISABLE_FLASHLIGHT,
606+
ActionId.CHANGE_FLASHLIGHT_STRENGTH,
599607
-> return listOf(Permission.CAMERA)
600608

601609
ActionId.ENABLE_NFC,
@@ -714,6 +722,7 @@ object ActionUtils {
714722
ActionId.TOGGLE_FLASHLIGHT -> Icons.Outlined.FlashlightOn
715723
ActionId.ENABLE_FLASHLIGHT -> Icons.Outlined.FlashlightOn
716724
ActionId.DISABLE_FLASHLIGHT -> Icons.Outlined.FlashlightOff
725+
ActionId.CHANGE_FLASHLIGHT_STRENGTH -> Icons.Outlined.FlashlightOn
717726
ActionId.ENABLE_NFC -> Icons.Outlined.Nfc
718727
ActionId.DISABLE_NFC -> KeyMapperIcons.NfcOff
719728
ActionId.TOGGLE_NFC -> Icons.Outlined.Nfc
@@ -800,7 +809,7 @@ fun ActionData.isEditable(): Boolean = when (this) {
800809
is ActionData.Rotation.CycleRotations,
801810
is ActionData.Flashlight.Toggle,
802811
is ActionData.Flashlight.Enable,
803-
is ActionData.Flashlight.Disable,
812+
is ActionData.Flashlight.ChangeStrength,
804813
is ActionData.TapScreen,
805814
is ActionData.SwipeScreen,
806815
is ActionData.PinchScreen,

app/src/main/java/io/github/sds100/keymapper/actions/ActionsScreen.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ fun ActionsScreen(modifier: Modifier = Modifier, viewModel: ConfigActionsViewMod
6565
)
6666
}
6767

68+
EnableFlashlightActionBottomSheet(viewModel.createActionDelegate)
69+
ChangeFlashlightStrengthActionBottomSheet(viewModel.createActionDelegate)
70+
6871
ActionsScreen(
6972
modifier = modifier,
7073
state = state,
@@ -300,7 +303,10 @@ private fun EmptyPreview() {
300303
ShortcutModel(
301304
icon = ComposeIconInfo.Vector(Icons.Rounded.FlashlightOn),
302305
text = "Toggle Back flashlight",
303-
data = ActionData.Flashlight.Toggle(lens = CameraLens.BACK),
306+
data = ActionData.Flashlight.Toggle(
307+
lens = CameraLens.BACK,
308+
strengthPercent = null,
309+
),
304310
),
305311
),
306312
),
@@ -339,7 +345,10 @@ private fun LoadedPreview() {
339345
ShortcutModel(
340346
icon = ComposeIconInfo.Vector(Icons.Rounded.FlashlightOn),
341347
text = "Toggle Back flashlight",
342-
data = ActionData.Flashlight.Toggle(lens = CameraLens.BACK),
348+
data = ActionData.Flashlight.Toggle(
349+
lens = CameraLens.BACK,
350+
strengthPercent = null,
351+
),
343352
),
344353
),
345354
isReorderingEnabled = true,

app/src/main/java/io/github/sds100/keymapper/actions/ChooseActionScreen.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ fun ChooseActionScreen(
6666
val state by viewModel.groups.collectAsStateWithLifecycle()
6767
val query by viewModel.searchQuery.collectAsStateWithLifecycle()
6868

69+
EnableFlashlightActionBottomSheet(viewModel.createActionDelegate)
70+
ChangeFlashlightStrengthActionBottomSheet(viewModel.createActionDelegate)
71+
6972
ChooseActionScreen(
7073
modifier = modifier,
7174
state = state,

0 commit comments

Comments
 (0)