Skip to content

Commit 5e82357

Browse files
committed
#114 feat: action to force stop app, and an action to clear an app from recents
1 parent ae49941 commit 5e82357

File tree

17 files changed

+211
-44
lines changed

17 files changed

+211
-44
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
- #397 enable/disable all key maps in a group
1414
- #1773 Option to show floating buttons on top of keyboard or notification panel.
1515
- #1335 Intent API to enable/disable/toggle a key map.
16+
- #114 action to force stop app, and an action to clear an app from recents
1617

1718
## Removed
1819

app/version.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
VERSION_NAME=4.0.0-beta.1
2-
VERSION_CODE=167
2+
VERSION_CODE=169
33
VERSION_NUM=01

base/src/main/assets/whats-new.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
📲 You can now remap buttons when the screen is off for FREE using PRO mode!
1+
📲 You can now remap buttons when the screen is off for FREE using PRO mode! Also your power button.
22

3-
Remap your power button and more!
3+
Action to force stop an app or clear it from recents.
44

55
Enable/disable all the key maps in a group. Intent API to enable/disable/toggle a key map.
66

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,4 +925,14 @@ sealed class ActionData : Comparable<ActionData> {
925925
) : ActionData() {
926926
override val id: ActionId = ActionId.INTERACT_UI_ELEMENT
927927
}
928+
929+
@Serializable
930+
data object ForceStopApp : ActionData() {
931+
override val id: ActionId = ActionId.FORCE_STOP_APP
932+
}
933+
934+
@Serializable
935+
data object ClearRecentApp : ActionData() {
936+
override val id: ActionId = ActionId.CLEAR_RECENT_APP
937+
}
928938
}

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ object ActionDataEntityMapper {
252252

253253
ActionId.VOLUME_INCREASE_STREAM,
254254
ActionId.VOLUME_DECREASE_STREAM,
255-
-> {
255+
-> {
256256
val stream =
257257
entity.extras.getData(ActionEntity.EXTRA_STREAM_TYPE).then {
258258
VOLUME_STREAM_MAP.getKey(it)!!.success()
@@ -277,7 +277,7 @@ object ActionDataEntityMapper {
277277
ActionId.VOLUME_TOGGLE_MUTE,
278278
ActionId.VOLUME_UNMUTE,
279279
ActionId.VOLUME_MUTE,
280-
-> {
280+
-> {
281281
val showVolumeUi =
282282
entity.flags.hasFlag(ActionEntity.ACTION_FLAG_SHOW_VOLUME_UI)
283283

@@ -298,7 +298,7 @@ object ActionDataEntityMapper {
298298
ActionId.TOGGLE_FLASHLIGHT,
299299
ActionId.ENABLE_FLASHLIGHT,
300300
ActionId.CHANGE_FLASHLIGHT_STRENGTH,
301-
-> {
301+
-> {
302302
val lens = entity.extras.getData(ActionEntity.EXTRA_LENS).then {
303303
LENS_MAP.getKey(it)!!.success()
304304
}.valueOrNull() ?: return null
@@ -324,7 +324,7 @@ object ActionDataEntityMapper {
324324
}
325325

326326
ActionId.DISABLE_FLASHLIGHT,
327-
-> {
327+
-> {
328328
val lens = entity.extras.getData(ActionEntity.EXTRA_LENS).then {
329329
LENS_MAP.getKey(it)!!.success()
330330
}.valueOrNull() ?: return null
@@ -333,7 +333,7 @@ object ActionDataEntityMapper {
333333

334334
ActionId.TOGGLE_DND_MODE,
335335
ActionId.ENABLE_DND_MODE,
336-
-> {
336+
-> {
337337
val dndMode = entity.extras.getData(ActionEntity.EXTRA_DND_MODE).then {
338338
DND_MODE_MAP.getKey(it)!!.success()
339339
}.valueOrNull() ?: return null
@@ -363,7 +363,7 @@ object ActionDataEntityMapper {
363363
ActionId.STOP_MEDIA_PACKAGE,
364364
ActionId.STEP_FORWARD_PACKAGE,
365365
ActionId.STEP_BACKWARD_PACKAGE,
366-
-> {
366+
-> {
367367
val packageName =
368368
entity.extras.getData(ActionEntity.EXTRA_PACKAGE_NAME).valueOrNull()
369369
?: return null
@@ -632,6 +632,9 @@ object ActionDataEntityMapper {
632632

633633
ActionData.MoveCursor(moveType = type, direction = direction)
634634
}
635+
636+
ActionId.FORCE_STOP_APP -> ActionData.ForceStopApp
637+
ActionId.CLEAR_RECENT_APP -> ActionData.ClearRecentApp
635638
}
636639
}
637640

@@ -1121,5 +1124,7 @@ object ActionDataEntityMapper {
11211124
ActionId.END_PHONE_CALL to "end_phone_call",
11221125
ActionId.DEVICE_CONTROLS to "device_controls",
11231126
ActionId.HTTP_REQUEST to "http_request",
1127+
ActionId.FORCE_STOP_APP to "force_stop_app",
1128+
ActionId.CLEAR_RECENT_APP to "clear_recent_app",
11241129
)
11251130
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,7 @@ enum class ActionId {
134134
ANSWER_PHONE_CALL,
135135
END_PHONE_CALL,
136136
DEVICE_CONTROLS,
137+
138+
FORCE_STOP_APP,
139+
CLEAR_RECENT_APP
137140
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ class ActionUiHelper(
259259
R.string.action_toggle_front_flashlight_with_strength,
260260
action.strengthPercent.toPercentString(),
261261

262-
)
262+
)
263263
} else {
264264
getString(
265265
R.string.action_toggle_flashlight_with_strength,
@@ -574,6 +574,9 @@ class ActionUiHelper(
574574
is ActionData.HttpRequest -> action.description
575575

576576
is ActionData.InteractUiElement -> action.description
577+
578+
ActionData.ClearRecentApp -> getString(R.string.action_clear_recent_app)
579+
ActionData.ForceStopApp -> getString(R.string.action_force_stop_app)
577580
}
578581

579582
fun getIcon(action: ActionData): ComposeIconInfo = when (action) {

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

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import androidx.compose.material.icons.outlined.CallEnd
2424
import androidx.compose.material.icons.outlined.CameraAlt
2525
import androidx.compose.material.icons.outlined.Cancel
2626
import androidx.compose.material.icons.outlined.ClearAll
27+
import androidx.compose.material.icons.outlined.Dangerous
2728
import androidx.compose.material.icons.outlined.DataObject
2829
import androidx.compose.material.icons.outlined.DoNotDisturb
2930
import androidx.compose.material.icons.outlined.DoNotDisturbOff
@@ -61,6 +62,7 @@ import androidx.compose.material.icons.outlined.StayCurrentPortrait
6162
import androidx.compose.material.icons.outlined.StopCircle
6263
import androidx.compose.material.icons.outlined.Swipe
6364
import androidx.compose.material.icons.outlined.TouchApp
65+
import androidx.compose.material.icons.outlined.VerticalSplit
6466
import androidx.compose.material.icons.outlined.ViewArray
6567
import androidx.compose.material.icons.rounded.Abc
6668
import androidx.compose.material.icons.rounded.Android
@@ -239,6 +241,8 @@ object ActionUtils {
239241
ActionId.DEVICE_CONTROLS -> ActionCategory.APPS
240242

241243
ActionId.INTERACT_UI_ELEMENT -> ActionCategory.APPS
244+
ActionId.FORCE_STOP_APP -> ActionCategory.APPS
245+
ActionId.CLEAR_RECENT_APP -> ActionCategory.APPS
242246

243247
ActionId.CONSUME_KEY_EVENT -> ActionCategory.SPECIAL
244248
}
@@ -360,6 +364,8 @@ object ActionUtils {
360364
ActionId.DEVICE_CONTROLS -> R.string.action_device_controls
361365
ActionId.HTTP_REQUEST -> R.string.action_http_request
362366
ActionId.INTERACT_UI_ELEMENT -> R.string.action_interact_ui_element_title
367+
ActionId.FORCE_STOP_APP -> R.string.action_force_stop_app
368+
ActionId.CLEAR_RECENT_APP -> R.string.action_clear_recent_app
363369
}
364370

365371
@DrawableRes
@@ -477,8 +483,7 @@ object ActionUtils {
477483
ActionId.ANSWER_PHONE_CALL -> R.drawable.ic_outline_call_24
478484
ActionId.END_PHONE_CALL -> R.drawable.ic_outline_call_end_24
479485
ActionId.DEVICE_CONTROLS -> R.drawable.ic_home_automation
480-
ActionId.HTTP_REQUEST -> null
481-
ActionId.INTERACT_UI_ELEMENT -> null
486+
else -> null
482487
}
483488

484489
fun getMinApi(id: ActionId): Int = when (id) {
@@ -495,26 +500,26 @@ object ActionUtils {
495500
ActionId.TOGGLE_DND_MODE,
496501
ActionId.ENABLE_DND_MODE,
497502
ActionId.DISABLE_DND_MODE,
498-
-> Build.VERSION_CODES.M
503+
-> Build.VERSION_CODES.M
499504

500505
ActionId.DISABLE_FLASHLIGHT,
501506
ActionId.ENABLE_FLASHLIGHT,
502507
ActionId.TOGGLE_FLASHLIGHT,
503-
-> Build.VERSION_CODES.M
508+
-> Build.VERSION_CODES.M
504509

505510
ActionId.CHANGE_FLASHLIGHT_STRENGTH,
506-
-> Build.VERSION_CODES.TIRAMISU
511+
-> Build.VERSION_CODES.TIRAMISU
507512

508513
ActionId.TOGGLE_KEYBOARD,
509514
ActionId.SHOW_KEYBOARD,
510515
ActionId.HIDE_KEYBOARD,
511-
-> Build.VERSION_CODES.N
516+
-> Build.VERSION_CODES.N
512517

513518
ActionId.TEXT_CUT,
514519
ActionId.TEXT_COPY,
515520
ActionId.TEXT_PASTE,
516521
ActionId.SELECT_WORD_AT_CURSOR,
517-
-> Build.VERSION_CODES.JELLY_BEAN_MR2
522+
-> Build.VERSION_CODES.JELLY_BEAN_MR2
518523

519524
ActionId.SHOW_POWER_MENU -> Build.VERSION_CODES.LOLLIPOP
520525
ActionId.DEVICE_CONTROLS -> Build.VERSION_CODES.S
@@ -539,20 +544,20 @@ object ActionUtils {
539544
ActionId.END_PHONE_CALL,
540545
ActionId.ANSWER_PHONE_CALL,
541546
ActionId.PHONE_CALL,
542-
-> listOf(PackageManager.FEATURE_TELEPHONY)
547+
-> listOf(PackageManager.FEATURE_TELEPHONY)
543548

544549
ActionId.SECURE_LOCK_DEVICE,
545-
-> listOf(PackageManager.FEATURE_DEVICE_ADMIN)
550+
-> listOf(PackageManager.FEATURE_DEVICE_ADMIN)
546551

547552
ActionId.TOGGLE_WIFI,
548553
ActionId.ENABLE_WIFI,
549554
ActionId.DISABLE_WIFI,
550-
-> listOf(PackageManager.FEATURE_WIFI)
555+
-> listOf(PackageManager.FEATURE_WIFI)
551556

552557
ActionId.TOGGLE_MOBILE_DATA,
553558
ActionId.ENABLE_MOBILE_DATA,
554559
ActionId.DISABLE_MOBILE_DATA,
555-
-> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
560+
-> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
556561
listOf(PackageManager.FEATURE_TELEPHONY_DATA)
557562
} else {
558563
listOf(PackageManager.FEATURE_TELEPHONY)
@@ -561,18 +566,18 @@ object ActionUtils {
561566
ActionId.TOGGLE_NFC,
562567
ActionId.ENABLE_NFC,
563568
ActionId.DISABLE_NFC,
564-
-> listOf(PackageManager.FEATURE_NFC)
569+
-> listOf(PackageManager.FEATURE_NFC)
565570

566571
ActionId.TOGGLE_BLUETOOTH,
567572
ActionId.ENABLE_BLUETOOTH,
568573
ActionId.DISABLE_BLUETOOTH,
569-
-> listOf(PackageManager.FEATURE_BLUETOOTH)
574+
-> listOf(PackageManager.FEATURE_BLUETOOTH)
570575

571576
ActionId.TOGGLE_FLASHLIGHT,
572577
ActionId.ENABLE_FLASHLIGHT,
573578
ActionId.DISABLE_FLASHLIGHT,
574579
ActionId.CHANGE_FLASHLIGHT_STRENGTH,
575-
-> listOf(PackageManager.FEATURE_CAMERA_FLASH)
580+
-> listOf(PackageManager.FEATURE_CAMERA_FLASH)
576581

577582
else -> emptyList()
578583
}
@@ -583,30 +588,32 @@ object ActionUtils {
583588
ActionId.ENABLE_WIFI,
584589
ActionId.DISABLE_WIFI,
585590
ActionId.TOGGLE_WIFI,
586-
-> true
591+
-> true
587592

588593
ActionId.TOGGLE_MOBILE_DATA,
589594
ActionId.ENABLE_MOBILE_DATA,
590595
ActionId.DISABLE_MOBILE_DATA,
591-
-> true
596+
-> true
592597

593598
ActionId.ENABLE_NFC,
594599
ActionId.DISABLE_NFC,
595600
ActionId.TOGGLE_NFC,
596-
-> true
601+
-> true
597602

598603
ActionId.TOGGLE_AIRPLANE_MODE,
599604
ActionId.ENABLE_AIRPLANE_MODE,
600605
ActionId.DISABLE_AIRPLANE_MODE,
601-
-> true
606+
-> true
602607

603608
ActionId.TOGGLE_BLUETOOTH,
604609
ActionId.ENABLE_BLUETOOTH,
605610
ActionId.DISABLE_BLUETOOTH,
606-
-> Build.VERSION.SDK_INT >= Build.VERSION_CODES.S_V2
611+
-> Build.VERSION.SDK_INT >= Build.VERSION_CODES.S_V2
607612

608613
ActionId.POWER_ON_OFF_DEVICE -> true
609614

615+
ActionId.FORCE_STOP_APP, ActionId.CLEAR_RECENT_APP -> true
616+
610617
else -> false
611618
}
612619
}
@@ -616,7 +623,7 @@ object ActionUtils {
616623
ActionId.TOGGLE_MOBILE_DATA,
617624
ActionId.ENABLE_MOBILE_DATA,
618625
ActionId.DISABLE_MOBILE_DATA,
619-
-> return if (isSystemBridgeSupported) {
626+
-> return if (isSystemBridgeSupported) {
620627
emptyList()
621628
} else {
622629
listOf(Permission.ROOT)
@@ -629,7 +636,7 @@ object ActionUtils {
629636
ActionId.PREVIOUS_TRACK_PACKAGE,
630637
ActionId.FAST_FORWARD_PACKAGE,
631638
ActionId.REWIND_PACKAGE,
632-
-> return listOf(Permission.NOTIFICATION_LISTENER)
639+
-> return listOf(Permission.NOTIFICATION_LISTENER)
633640

634641
ActionId.VOLUME_UP,
635642
ActionId.VOLUME_DOWN,
@@ -645,7 +652,7 @@ object ActionUtils {
645652
ActionId.TOGGLE_DND_MODE,
646653
ActionId.DISABLE_DND_MODE,
647654
ActionId.ENABLE_DND_MODE,
648-
-> return listOf(Permission.ACCESS_NOTIFICATION_POLICY)
655+
-> return listOf(Permission.ACCESS_NOTIFICATION_POLICY)
649656

650657
ActionId.TOGGLE_AUTO_ROTATE,
651658
ActionId.ENABLE_AUTO_ROTATE,
@@ -654,25 +661,25 @@ object ActionUtils {
654661
ActionId.LANDSCAPE_MODE,
655662
ActionId.SWITCH_ORIENTATION,
656663
ActionId.CYCLE_ROTATIONS,
657-
-> return listOf(Permission.WRITE_SETTINGS)
664+
-> return listOf(Permission.WRITE_SETTINGS)
658665

659666
ActionId.TOGGLE_AUTO_BRIGHTNESS,
660667
ActionId.ENABLE_AUTO_BRIGHTNESS,
661668
ActionId.DISABLE_AUTO_BRIGHTNESS,
662669
ActionId.INCREASE_BRIGHTNESS,
663670
ActionId.DECREASE_BRIGHTNESS,
664-
-> return listOf(Permission.WRITE_SETTINGS)
671+
-> return listOf(Permission.WRITE_SETTINGS)
665672

666673
ActionId.TOGGLE_FLASHLIGHT,
667674
ActionId.ENABLE_FLASHLIGHT,
668675
ActionId.DISABLE_FLASHLIGHT,
669676
ActionId.CHANGE_FLASHLIGHT_STRENGTH,
670-
-> return listOf(Permission.CAMERA)
677+
-> return listOf(Permission.CAMERA)
671678

672679
ActionId.ENABLE_NFC,
673680
ActionId.DISABLE_NFC,
674681
ActionId.TOGGLE_NFC,
675-
-> return if (isSystemBridgeSupported) {
682+
-> return if (isSystemBridgeSupported) {
676683
emptyList()
677684
} else {
678685
listOf(Permission.ROOT)
@@ -690,7 +697,7 @@ object ActionUtils {
690697
ActionId.TOGGLE_AIRPLANE_MODE,
691698
ActionId.ENABLE_AIRPLANE_MODE,
692699
ActionId.DISABLE_AIRPLANE_MODE,
693-
-> return if (isSystemBridgeSupported) {
700+
-> return if (isSystemBridgeSupported) {
694701
emptyList()
695702
} else {
696703
listOf(Permission.ROOT)
@@ -713,11 +720,11 @@ object ActionUtils {
713720

714721
ActionId.DISMISS_ALL_NOTIFICATIONS,
715722
ActionId.DISMISS_MOST_RECENT_NOTIFICATION,
716-
-> return listOf(Permission.NOTIFICATION_LISTENER)
723+
-> return listOf(Permission.NOTIFICATION_LISTENER)
717724

718725
ActionId.ANSWER_PHONE_CALL,
719726
ActionId.END_PHONE_CALL,
720-
-> return listOf(Permission.ANSWER_PHONE_CALL)
727+
-> return listOf(Permission.ANSWER_PHONE_CALL)
721728

722729
ActionId.PHONE_CALL -> return listOf(Permission.CALL_PHONE)
723730

@@ -849,6 +856,8 @@ object ActionUtils {
849856
ActionId.DEVICE_CONTROLS -> KeyMapperIcons.HomeIotDevice
850857
ActionId.HTTP_REQUEST -> Icons.Outlined.Http
851858
ActionId.INTERACT_UI_ELEMENT -> KeyMapperIcons.JumpToElement
859+
ActionId.FORCE_STOP_APP -> Icons.Outlined.Dangerous
860+
ActionId.CLEAR_RECENT_APP -> Icons.Outlined.VerticalSplit
852861
}
853862
}
854863

@@ -894,7 +903,7 @@ fun ActionData.isEditable(): Boolean = when (this) {
894903
is ActionData.HttpRequest,
895904
is ActionData.InteractUiElement,
896905
is ActionData.MoveCursor,
897-
-> true
906+
-> true
898907

899908
else -> false
900909
}

0 commit comments

Comments
 (0)