Skip to content

Commit bb00071

Browse files
committed
#1585 fix: Track changes when editing key maps and only prompt to discard changes if there were indeed changes.
1 parent 2642226 commit bb00071

File tree

4 files changed

+52
-27
lines changed

4 files changed

+52
-27
lines changed

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1-
## [3.0 Beta 1](https://github.com/sds100/KeyMapper/releases/tag/v3.0.0-beta.1)
1+
## [3.0 Beta 2](https://github.com/sds100/KeyMapper/releases/tag/v3.0.0-beta.2)
22

33
#### TO BE RELEASED
44

5+
## Bug fixes
6+
7+
- #1585 Track changes when editing key maps and only prompt to discard changes if there were indeed changes.
8+
9+
## [3.0 Beta 1](https://github.com/sds100/KeyMapper/releases/tag/v3.0.0-beta.1)
10+
11+
#### 26 March 2025
12+
513
Most of the codebase has been touched and most of the user interface has been rewritten
614
in Jetpack Compose, resulting in many improvements to the user experience.
715

app/src/main/java/io/github/sds100/keymapper/mappings/keymaps/ConfigKeyMapScreen.kt

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,18 @@ fun ConfigKeyMapScreen(
6969
val isKeyMapEnabled by viewModel.isEnabled.collectAsStateWithLifecycle()
7070
val snackbarHostState = remember { SnackbarHostState() }
7171

72+
var showBackDialog by rememberSaveable { mutableStateOf(false) }
73+
74+
if (showBackDialog) {
75+
BackDialog(
76+
onDismiss = { showBackDialog = false },
77+
onDiscardClick = {
78+
showBackDialog = false
79+
navigateBack()
80+
},
81+
)
82+
}
83+
7284
ConfigKeyMapScreen(
7385
modifier = modifier,
7486
isKeyMapEnabled = isKeyMapEnabled,
@@ -92,7 +104,13 @@ fun ConfigKeyMapScreen(
92104
viewModel.configTriggerViewModel.optionsViewModel,
93105
)
94106
},
95-
navigateBack = navigateBack,
107+
onBackClick = {
108+
if (viewModel.isKeyMapEdited) {
109+
showBackDialog = true
110+
} else {
111+
navigateBack()
112+
}
113+
},
96114
onDoneClick = {
97115
viewModel.save()
98116
navigateBack()
@@ -111,7 +129,7 @@ private fun ConfigKeyMapScreen(
111129
actionScreen: @Composable () -> Unit,
112130
constraintsScreen: @Composable () -> Unit,
113131
optionsScreen: @Composable () -> Unit,
114-
navigateBack: () -> Unit = {},
132+
onBackClick: () -> Unit = {},
115133
onDoneClick: () -> Unit = {},
116134
snackbarHostState: SnackbarHostState = SnackbarHostState(),
117135
) {
@@ -124,21 +142,7 @@ private fun ConfigKeyMapScreen(
124142
var currentTab: ConfigKeyMapTab? by remember { mutableStateOf(null) }
125143
val uriHandler = LocalUriHandler.current
126144

127-
var showBackDialog by rememberSaveable { mutableStateOf(false) }
128-
129-
if (showBackDialog) {
130-
BackDialog(
131-
onDismiss = { showBackDialog = false },
132-
onDiscardClick = {
133-
showBackDialog = false
134-
navigateBack()
135-
},
136-
)
137-
}
138-
139-
BackHandler {
140-
showBackDialog = true
141-
}
145+
BackHandler(onBack = onBackClick)
142146

143147
Scaffold(
144148
modifier.displayCutoutPadding(),
@@ -147,9 +151,7 @@ private fun ConfigKeyMapScreen(
147151
KeyMapAppBar(
148152
isKeyMapEnabled = isKeyMapEnabled,
149153
onKeyMapEnabledChange = onKeyMapEnabledChange,
150-
onBackClick = {
151-
showBackDialog = true
152-
},
154+
onBackClick = onBackClick,
153155
onDoneClick = onDoneClick,
154156
showHelpButton = currentTab == ConfigKeyMapTab.TRIGGER ||
155157
currentTab == ConfigKeyMapTab.ACTIONS ||
@@ -602,7 +604,6 @@ private fun SmallScreenPreview() {
602604
actionScreen = {},
603605
constraintsScreen = {},
604606
optionsScreen = {},
605-
navigateBack = {},
606607
)
607608
}
608609
}
@@ -618,7 +619,6 @@ private fun MediumScreenPreview() {
618619
actionScreen = {},
619620
constraintsScreen = {},
620621
optionsScreen = {},
621-
navigateBack = {},
622622
)
623623
}
624624
}
@@ -634,7 +634,6 @@ private fun MediumScreenLandscapePreview() {
634634
actionScreen = {},
635635
constraintsScreen = {},
636636
optionsScreen = {},
637-
navigateBack = {},
638637
)
639638
}
640639
}
@@ -650,7 +649,6 @@ private fun LargeScreenPreview() {
650649
actionScreen = {},
651650
constraintsScreen = {},
652651
optionsScreen = {},
653-
navigateBack = {},
654652
)
655653
}
656654
}

app/src/main/java/io/github/sds100/keymapper/mappings/keymaps/ConfigKeyMapUseCase.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ class ConfigKeyMapUseCaseController(
7272
coroutineScope,
7373
preferenceRepository,
7474
) {
75+
76+
private var originalKeyMap: KeyMap? = null
7577
override val keyMap = MutableStateFlow<State<KeyMap>>(State.Loading)
7678

7779
override val floatingButtonToUse: MutableStateFlow<String?> = MutableStateFlow(null)
@@ -111,6 +113,15 @@ class ConfigKeyMapUseCaseController(
111113
emptyList(),
112114
)
113115

116+
/**
117+
* Whether any changes were made to the key map.
118+
*/
119+
override val isEdited: Boolean
120+
get() = when (val keyMap = keyMap.value) {
121+
is State.Data<KeyMap> -> originalKeyMap?.let { it != keyMap.data } ?: false
122+
State.Loading -> false
123+
}
124+
114125
init {
115126
// Update button data in the key map whenever the floating buttons changes.
116127
coroutineScope.launch {
@@ -822,11 +833,15 @@ class ConfigKeyMapUseCaseController(
822833
.map { it.data }
823834
.first()
824835

825-
keyMap.update { State.Data(KeyMapEntityMapper.fromEntity(entity, floatingButtons)) }
836+
val keyMap = KeyMapEntityMapper.fromEntity(entity, floatingButtons)
837+
this.keyMap.update { State.Data(keyMap) }
838+
originalKeyMap = keyMap
826839
}
827840

828841
override fun loadNewKeyMap() {
829-
keyMap.update { State.Data(KeyMap()) }
842+
val keyMap = KeyMap()
843+
this.keyMap.update { State.Data(keyMap) }
844+
originalKeyMap = keyMap
830845
}
831846

832847
override fun save() {
@@ -933,6 +948,7 @@ class ConfigKeyMapUseCaseController(
933948

934949
interface ConfigKeyMapUseCase : GetDefaultKeyMapOptionsUseCase {
935950
val keyMap: Flow<State<KeyMap>>
951+
val isEdited: Boolean
936952

937953
fun save()
938954

app/src/main/java/io/github/sds100/keymapper/mappings/keymaps/ConfigKeyMapViewModel.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ class ConfigKeyMapViewModel(
8383
.map { state -> state.dataOrNull()?.isEnabled ?: true }
8484
.stateIn(viewModelScope, SharingStarted.Eagerly, true)
8585

86+
val isKeyMapEdited: Boolean
87+
get() = config.isEdited
88+
8689
fun save() = config.save()
8790

8891
fun saveState(outState: Bundle) {

0 commit comments

Comments
 (0)