@@ -52,24 +52,20 @@ import androidx.compose.ui.unit.Dp
5252import androidx.compose.ui.unit.dp
5353import androidx.core.net.toUri
5454import androidx.lifecycle.compose.collectAsStateWithLifecycle
55- import com.canopas.lib.showcase.IntroShowcase
5655import io.github.sds100.keymapper.base.R
5756import io.github.sds100.keymapper.base.actions.keyevent.FixKeyEventActionBottomSheet
5857import io.github.sds100.keymapper.base.backup.ImportExportState
5958import io.github.sds100.keymapper.base.backup.RestoreType
6059import io.github.sds100.keymapper.base.compose.KeyMapperTheme
6160import io.github.sds100.keymapper.base.constraints.ConstraintMode
6261import io.github.sds100.keymapper.base.groups.GroupListItemModel
63- import io.github.sds100.keymapper.base.onboarding.OnboardingTapTarget
6462import io.github.sds100.keymapper.base.sorting.SortBottomSheet
6563import io.github.sds100.keymapper.base.trigger.KeyMapListItemModel
6664import io.github.sds100.keymapper.base.trigger.TriggerError
6765import io.github.sds100.keymapper.base.utils.ShareUtils
6866import io.github.sds100.keymapper.base.utils.ui.compose.CollapsableFloatingActionButton
6967import io.github.sds100.keymapper.base.utils.ui.compose.ComposeChipModel
7068import io.github.sds100.keymapper.base.utils.ui.compose.ComposeIconInfo
71- import io.github.sds100.keymapper.base.utils.ui.compose.KeyMapperTapTarget
72- import io.github.sds100.keymapper.base.utils.ui.compose.keyMapperShowcaseStyle
7369import io.github.sds100.keymapper.base.utils.ui.compose.openUriSafe
7470import io.github.sds100.keymapper.base.utils.ui.drawable
7571import io.github.sds100.keymapper.common.utils.KMError
@@ -156,125 +152,113 @@ fun HomeKeyMapListScreen(
156152
157153 var keyMapListBottomPadding by remember { mutableStateOf(100 .dp) }
158154
159- IntroShowcase (
160- showIntroShowCase = state.showCreateKeyMapTapTarget,
161- onShowCaseCompleted = {
162- viewModel.onTapTargetsCompleted()
155+ // Check if the list is empty to trigger pulsing animation
156+ val isListEmpty = state.listItems is State .Data &&
157+ (state.listItems as State .Data <List <KeyMapListItemModel >>).data.isEmpty()
158+
159+ HomeKeyMapListScreen (
160+ modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
161+ snackbarState = snackbarState,
162+ floatingActionButton = {
163+ AnimatedVisibility (
164+ state.appBarState !is KeyMapAppBarState .Selecting ,
165+ enter = fadeIn() + slideInHorizontally(initialOffsetX = { it }),
166+ exit = fadeOut() + slideOutHorizontally(targetOffsetX = { it }),
167+ ) {
168+ AnimatedFloatingActionButton (
169+ modifier = Modifier
170+ .padding(bottom = fabBottomPadding)
171+ .windowInsetsPadding(WindowInsets .safeDrawing.only(WindowInsetsSides .End )),
172+ pulse = isListEmpty,
173+ showFabText = viewModel.showFabText,
174+ text = stringResource(R .string.home_fab_new_key_map),
175+ onClick = viewModel::onNewKeyMapClick,
176+ )
177+ }
163178 },
164- dismissOnClickOutside = true ,
165- ) {
166- HomeKeyMapListScreen (
167- modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
168- snackbarState = snackbarState,
169- floatingActionButton = {
170- AnimatedVisibility (
171- state.appBarState !is KeyMapAppBarState .Selecting ,
172- enter = fadeIn() + slideInHorizontally(initialOffsetX = { it }),
173- exit = fadeOut() + slideOutHorizontally(targetOffsetX = { it }),
174- ) {
175- CollapsableFloatingActionButton (
176- modifier = Modifier
177- .padding(bottom = fabBottomPadding)
178- .windowInsetsPadding(WindowInsets .safeDrawing.only(WindowInsetsSides .End ))
179- .introShowCaseTarget(
180- index = 0 ,
181- style = keyMapperShowcaseStyle(),
182- ) {
183- KeyMapperTapTarget (
184- OnboardingTapTarget .CREATE_KEY_MAP ,
185- onSkipClick = viewModel::onSkipTapTargetClick,
186- )
187- },
188- onClick = viewModel::onNewKeyMapClick,
189- showText = viewModel.showFabText,
190- text = stringResource(R .string.home_fab_new_key_map),
179+ listContent = {
180+ KeyMapList (
181+ modifier = Modifier .animateContentSize(),
182+ lazyListState = rememberLazyListState(),
183+ listItems = state.listItems,
184+ footerText = stringResource(R .string.home_key_map_list_footer_text),
185+ isSelectable = state.appBarState is KeyMapAppBarState .Selecting ,
186+ onClickKeyMap = viewModel::onKeyMapCardClick,
187+ onLongClickKeyMap = viewModel::onKeyMapCardLongClick,
188+ onSelectedChange = viewModel::onKeyMapSelectedChanged,
189+ onFixClick = viewModel::onFixClick,
190+ onTriggerErrorClick = viewModel::onFixTriggerError,
191+ bottomListPadding = keyMapListBottomPadding,
192+ )
193+ },
194+ appBarContent = {
195+ KeyMapListAppBar (
196+ state = state.appBarState,
197+ scrollBehavior = scrollBehavior,
198+ onSettingsClick = onSettingsClick,
199+ onAboutClick = onAboutClick,
200+ onSortClick = { viewModel.showSortBottomSheet = true },
201+ onHelpClick = { uriHandler.openUriSafe(ctx, helpUrl) },
202+ onExportClick = viewModel::onExportClick,
203+ onImportClick = { importFileLauncher.launch(FileUtils .MIME_TYPE_ALL ) },
204+ onInputMethodPickerClick = viewModel::showInputMethodPicker,
205+ onTogglePausedClick = viewModel::onTogglePausedClick,
206+ onFixWarningClick = viewModel::onFixWarningClick,
207+ onBackClick = {
208+ if (! viewModel.onBackClick()) {
209+ finishActivity()
210+ }
211+ },
212+ onSelectAllClick = viewModel::onSelectAllClick,
213+ onNewGroupClick = viewModel::onNewGroupClick,
214+ onRenameGroupClick = viewModel::onRenameGroupClick,
215+ onEditGroupNameClick = viewModel::onEditGroupNameClick,
216+ onGroupClick = viewModel::onGroupClick,
217+ onDeleteGroupClick = viewModel::onDeleteGroupClick,
218+ onNewConstraintClick = viewModel::onNewGroupConstraintClick,
219+ onRemoveConstraintClick = viewModel::onRemoveGroupConstraintClick,
220+ onConstraintModeChanged = viewModel::onGroupConstraintModeChanged,
221+ onFixConstraintClick = viewModel::onFixClick,
222+ onKeyMapsEnabledChange = viewModel::onGroupKeyMapsEnabledChanged,
223+ )
224+ },
225+ selectionBottomSheet = {
226+ AnimatedVisibility (
227+ visible = state.appBarState is KeyMapAppBarState .Selecting ,
228+ enter = slideInVertically { it },
229+ exit = slideOutVertically { it },
230+ ) {
231+ val selectionState = (state.appBarState as ? KeyMapAppBarState .Selecting )
232+ ? : KeyMapAppBarState .Selecting (
233+ selectionCount = 0 ,
234+ selectedKeyMapsEnabled = SelectedKeyMapsEnabled .NONE ,
235+ isAllSelected = false ,
236+ groups = emptyList(),
237+ breadcrumbs = emptyList(),
238+ showThisGroup = false ,
191239 )
192- }
193- },
194- listContent = {
195- KeyMapList (
196- modifier = Modifier .animateContentSize(),
197- lazyListState = rememberLazyListState(),
198- listItems = state.listItems,
199- footerText = stringResource(R .string.home_key_map_list_footer_text),
200- isSelectable = state.appBarState is KeyMapAppBarState .Selecting ,
201- onClickKeyMap = viewModel::onKeyMapCardClick,
202- onLongClickKeyMap = viewModel::onKeyMapCardLongClick,
203- onSelectedChange = viewModel::onKeyMapSelectedChanged,
204- onFixClick = viewModel::onFixClick,
205- onTriggerErrorClick = viewModel::onFixTriggerError,
206- bottomListPadding = keyMapListBottomPadding,
207- )
208- },
209- appBarContent = {
210- KeyMapListAppBar (
211- state = state.appBarState,
212- scrollBehavior = scrollBehavior,
213- onSettingsClick = onSettingsClick,
214- onAboutClick = onAboutClick,
215- onSortClick = { viewModel.showSortBottomSheet = true },
216- onHelpClick = { uriHandler.openUriSafe(ctx, helpUrl) },
217- onExportClick = viewModel::onExportClick,
218- onImportClick = { importFileLauncher.launch(FileUtils .MIME_TYPE_ALL ) },
219- onInputMethodPickerClick = viewModel::showInputMethodPicker,
220- onTogglePausedClick = viewModel::onTogglePausedClick,
221- onFixWarningClick = viewModel::onFixWarningClick,
222- onBackClick = {
223- if (! viewModel.onBackClick()) {
224- finishActivity()
225- }
240+
241+ SelectionBottomSheet (
242+ modifier = Modifier .onSizeChanged { size ->
243+ keyMapListBottomPadding =
244+ ((size.height.dp / 2 ) - 100 .dp).coerceAtLeast(0 .dp)
226245 },
227- onSelectAllClick = viewModel::onSelectAllClick,
246+ enabled = selectionState.selectionCount > 0 ,
247+ groups = selectionState.groups,
248+ breadcrumbs = selectionState.breadcrumbs,
249+ selectedKeyMapsEnabled = selectionState.selectedKeyMapsEnabled,
250+ onEnabledKeyMapsChange = viewModel::onEnabledKeyMapsChange,
251+ onDuplicateClick = viewModel::onDuplicateSelectedKeyMapsClick,
252+ onExportClick = viewModel::onExportSelectedKeyMaps,
253+ onDeleteClick = { showDeleteDialog = true },
254+ onGroupClick = viewModel::onSelectionGroupClick,
228255 onNewGroupClick = viewModel::onNewGroupClick,
229- onRenameGroupClick = viewModel::onRenameGroupClick,
230- onEditGroupNameClick = viewModel::onEditGroupNameClick,
231- onGroupClick = viewModel::onGroupClick,
232- onDeleteGroupClick = viewModel::onDeleteGroupClick,
233- onNewConstraintClick = viewModel::onNewGroupConstraintClick,
234- onRemoveConstraintClick = viewModel::onRemoveGroupConstraintClick,
235- onConstraintModeChanged = viewModel::onGroupConstraintModeChanged,
236- onFixConstraintClick = viewModel::onFixClick,
237- onKeyMapsEnabledChange = viewModel::onGroupKeyMapsEnabledChanged,
256+ showThisGroup = selectionState.showThisGroup,
257+ onThisGroupClick = viewModel::onMoveToThisGroupClick,
238258 )
239- },
240- selectionBottomSheet = {
241- AnimatedVisibility (
242- visible = state.appBarState is KeyMapAppBarState .Selecting ,
243- enter = slideInVertically { it },
244- exit = slideOutVertically { it },
245- ) {
246- val selectionState = (state.appBarState as ? KeyMapAppBarState .Selecting )
247- ? : KeyMapAppBarState .Selecting (
248- selectionCount = 0 ,
249- selectedKeyMapsEnabled = SelectedKeyMapsEnabled .NONE ,
250- isAllSelected = false ,
251- groups = emptyList(),
252- breadcrumbs = emptyList(),
253- showThisGroup = false ,
254- )
255-
256- SelectionBottomSheet (
257- modifier = Modifier .onSizeChanged { size ->
258- keyMapListBottomPadding =
259- ((size.height.dp / 2 ) - 100 .dp).coerceAtLeast(0 .dp)
260- },
261- enabled = selectionState.selectionCount > 0 ,
262- groups = selectionState.groups,
263- breadcrumbs = selectionState.breadcrumbs,
264- selectedKeyMapsEnabled = selectionState.selectedKeyMapsEnabled,
265- onEnabledKeyMapsChange = viewModel::onEnabledKeyMapsChange,
266- onDuplicateClick = viewModel::onDuplicateSelectedKeyMapsClick,
267- onExportClick = viewModel::onExportSelectedKeyMaps,
268- onDeleteClick = { showDeleteDialog = true },
269- onGroupClick = viewModel::onSelectionGroupClick,
270- onNewGroupClick = viewModel::onNewGroupClick,
271- showThisGroup = selectionState.showThisGroup,
272- onThisGroupClick = viewModel::onMoveToThisGroupClick,
273- )
274- }
275- },
276- )
277- }
259+ }
260+ },
261+ )
278262}
279263
280264@Composable
0 commit comments