From b4636e3098157cef649d090c9e8bae467777465d Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Thu, 12 Jun 2025 00:55:23 +0100 Subject: [PATCH 1/3] Refactor: Update Compose compiler configuration and build scripts This commit updates the Compose compiler configuration and makes minor adjustments to the build scripts. - In `instuctions`: - Added `./gradlew --rerun-tasks assembleFossReliantDebug -PenableComposeCompilerMetrics=true -PenableComposeCompilerReports=true` command. - In `build-logic/convention/src/main/kotlin/com/mshdabiola/app/AndroidCompose.kt`: - Commented out one of the lines that added `compose_compiler_config.conf` to `stabilityConfigurationFiles`. - In `compose_compiler_config.conf`: - Replaced `com.mshdabiola.modules.model.data.*` with `com.mshdabiola.model.*`. - Added `kotlin.collections.*` to the list of stable classes. --- .../src/main/kotlin/com/mshdabiola/app/AndroidCompose.kt | 6 ++++-- compose_compiler_config.conf | 3 ++- instuctions | 6 +++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/mshdabiola/app/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/com/mshdabiola/app/AndroidCompose.kt index b6fa1e82..e7525db8 100644 --- a/build-logic/convention/src/main/kotlin/com/mshdabiola/app/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/com/mshdabiola/app/AndroidCompose.kt @@ -51,7 +51,9 @@ internal fun Project.configureAndroidCompose( .relativeToRootProject("compose-reports") .let(reportsDestination::set) - stabilityConfigurationFiles - .add(isolated.rootProject.projectDirectory.file("compose_compiler_config.conf")) + stabilityConfigurationFiles.add( + isolated.rootProject.projectDirectory.file("compose_compiler_config.conf")) +// stabilityConfigurationFiles +// .add(isolated.rootProject.projectDirectory.file("compose_compiler_config.conf")) } } \ No newline at end of file diff --git a/compose_compiler_config.conf b/compose_compiler_config.conf index c957f3d8..9e70e8da 100644 --- a/compose_compiler_config.conf +++ b/compose_compiler_config.conf @@ -4,8 +4,9 @@ // We always use immutable classes for our data model, to avoid running the Compose compiler // in the module we declare it to be stable here. -com.mshdabiola.modules.model.data.* +com.mshdabiola.model.* // Java standard library classes java.time.ZoneId java.time.ZoneOffset +kotlin.collections.* diff --git a/instuctions b/instuctions index 2bd6fc9f..2c71f60b 100644 --- a/instuctions +++ b/instuctions @@ -20,4 +20,8 @@ sed -i -e '/androidx.dev/d' settings.gradle.kts sed -i -e '/with(target) {/,/^ }/d' -e '/CrashlyticsExtension/d' build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt - sed -i -e '/libs.firebase/d' build-logic/convention/build.gradle.kts \ No newline at end of file + sed -i -e '/libs.firebase/d' build-logic/convention/build.gradle.kts + + + + ./gradlew --rerun-tasks assembleFossReliantDebug -PenableComposeCompilerMetrics=true -PenableComposeCompilerReports=true From c13afcd3aba970cac6998563fe9ad0001519095b Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Thu, 12 Jun 2025 01:46:28 +0100 Subject: [PATCH 2/3] Refactor: Manage selection state using `Set` instead of `NotePad.selected` This commit refactors how item selection is managed in the main feature. It replaces the `selected` boolean property in the `NotePad` model with a `setOfSelected` (a `Set`) in `MainState.Success`. This set stores the IDs of the selected items. **Key changes:** - **`feature/main/MainState.kt`**: - Added `setOfSelected: Set = emptySet()` to `MainState.Success` to track selected item IDs. - **`feature/main/MainScreen.kt`**: - Updated logic for `navigateToSelectLevel` to use `(mainState.value as MainState.Success).setOfSelected`. - Modified `noOfSelected` to be derived from `success.setOfSelected.size`. - Updated `isAllPin` to filter `notePads` based on whether their IDs are contained in `success.setOfSelected`. - The `LazyVerticalStaggeredGrid` items now receive the `setOfSelected` and pass the selection status to `NoteCard` via a new `isSelect` parameter. - **`feature/main/MainViewModel.kt`**: - `onSelectCard(id: Long)`: Now updates `_mainState.value` by adding or removing the `id` from the `setOfSelected` in `MainState.Success`. - `clearSelected()`: Resets `setOfSelected` to an empty set in `MainState.Success`. - Functions like `setPin()`, `setAlarm()`, `deleteAlarm()`, `setAllColor()`, `setAllArchive()`, and `setAllDelete()` now use the `setOfSelected` from `getSuccess()` to determine which notes to operate on. - `copyNote()`: Now retrieves the ID of the note to copy from `getSuccess().setOfSelected.first()`. - **`feature/main/TopbarAndDialog.kt`**: - `NoteCard` composable: - Added a new `isSelect: Boolean = false` parameter. - The border of the card is now determined by the `isSelect` parameter instead of `notePad.selected`. - Removed `selected = true` from the `NoteCardPreview`. - **`modules/model/NotePad.kt`**: - Removed the `selected: Boolean` property from the `NotePad` data class. --- .../kotlin/com/mshdabiola/main/MainScreen.kt | 14 ++++--- .../kotlin/com/mshdabiola/main/MainState.kt | 1 + .../com/mshdabiola/main/MainViewModel.kt | 38 ++++++++++--------- .../com/mshdabiola/main/TopbarAndDialog.kt | 5 ++- .../main/java/com/mshdabiola/model/NotePad.kt | 1 - 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt b/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt index c6b98ae9..aa911787 100644 --- a/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt +++ b/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt @@ -156,9 +156,7 @@ internal fun MainRoute( setAllAlarm = { showDialog = true }, setAllColor = { showColor = true }, setAllLabel = { - val selectId = - (mainState.value as MainState.Success).notePads.filter { it.selected }.map { it.id } - navigateToSelectLevel(selectId.toSet()) + navigateToSelectLevel((mainState.value as MainState.Success).setOfSelected) }, onCopy = mainViewModel::copyNote, onDelete = mainViewModel::setAllDelete, @@ -383,11 +381,11 @@ fun MainContent( } } - val noOfSelected = remember(success.notePads) { - success.notePads.count { it.selected } + val noOfSelected = remember(success.setOfSelected) { + success.setOfSelected.size } val isAllPin = remember(success.notePads) { - success.notePads.filter { it.selected } + success.notePads.filter { success.setOfSelected.contains(it.id) } .all { it.isPin } } var isGrid by rememberSaveable { mutableStateOf(true) } @@ -557,6 +555,7 @@ fun MainContent( items = pinNotePad.first.toImmutableList(), onNoteClick = onNoteClick, onSelectedCard = onSelectedCard, + setOfSelected = success.setOfSelected, ) if (pinNotePad.first.isNotEmpty() && pinNotePad.second.isNotEmpty()) { @@ -574,6 +573,7 @@ fun MainContent( items = pinNotePad.second.toImmutableList(), onNoteClick = onNoteClick, onSelectedCard = onSelectedCard, + setOfSelected = success.setOfSelected, ) } } @@ -585,6 +585,7 @@ fun LazyStaggeredGridScope.noteItems( sharedTransitionScope: SharedTransitionScope, animatedContentScope: AnimatedVisibilityScope, items: List, + setOfSelected: Set, onNoteClick: (Long) -> Unit, onSelectedCard: (Long) -> Unit, ) = items( @@ -600,6 +601,7 @@ fun LazyStaggeredGridScope.noteItems( animatedVisibilityScope = animatedContentScope, ), + isSelect = setOfSelected.contains(note.id), notePad = note, onCardClick = onNoteClick, onLongClick = onSelectedCard, diff --git a/feature/main/src/main/kotlin/com/mshdabiola/main/MainState.kt b/feature/main/src/main/kotlin/com/mshdabiola/main/MainState.kt index 432d7bd8..d6f078fd 100644 --- a/feature/main/src/main/kotlin/com/mshdabiola/main/MainState.kt +++ b/feature/main/src/main/kotlin/com/mshdabiola/main/MainState.kt @@ -15,6 +15,7 @@ sealed class MainState { val label: List = emptyList(), val searchSort: SearchSort? = null, val mainData: MainData = MainData.Note, + val setOfSelected: Set = emptySet(), ) : MainState() diff --git a/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt b/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt index 71a18f34..aa0150db 100644 --- a/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt +++ b/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt @@ -173,20 +173,16 @@ internal class MainViewModel * @param id The ID of the notepad card that was selected or deselected. */ fun onSelectCard(id: Long) { - val listNOtePad = getSuccess().notePads.toMutableList() - val index = listNOtePad.indexOfFirst { it.id == id } - val notepad = listNOtePad[index] - val newNotepad = notepad.copy(selected = !notepad.selected) - - listNOtePad[index] = newNotepad - - _mainState.value = getSuccess().copy(notePads = listNOtePad.toImmutableList()) + val selected = getSuccess().setOfSelected + if (selected.contains(id)) { + _mainState.value = getSuccess().copy(setOfSelected = selected - id) + } else { + _mainState.value = getSuccess().copy(setOfSelected = selected + id) + } } fun clearSelected() { - val listNOtePad = - getSuccess().notePads.map { it.copy(selected = false) } - _mainState.value = getSuccess().copy(notePads = listNOtePad.toImmutableList()) + _mainState.value = getSuccess().copy(setOfSelected = emptySet()) } fun setNoteType(noteType: NoteType) { @@ -194,8 +190,9 @@ internal class MainViewModel } fun setPin() { + val selected = getSuccess().setOfSelected val selectedNotepad = - getSuccess().notePads.filter { it.selected } + getSuccess().notePads.filter { selected.contains(it.id) } clearSelected() @@ -215,8 +212,9 @@ internal class MainViewModel } private fun setAlarm(time: Long, interval: Long?) { + val setOfSelected = getSuccess().setOfSelected val selectedNotes = - getSuccess().notePads.filter { it.selected } + getSuccess().notePads.filter { setOfSelected.contains(it.id) } clearSelected() val notes = selectedNotes.map { it.copy(reminder = time, interval = interval ?: -1) } @@ -240,8 +238,9 @@ internal class MainViewModel } fun deleteAlarm() { + val selected = getSuccess().setOfSelected val selectedNotes = - getSuccess().notePads.filter { it.selected } + getSuccess().notePads.filter { selected.contains(it.id) } clearSelected() val notes = selectedNotes.map { it.copy(reminder = -1, interval = -1) } @@ -258,8 +257,9 @@ internal class MainViewModel } fun setAllColor(colorId: Int) { + val selected = getSuccess().setOfSelected val selectedNotes = - getSuccess().notePads.filter { it.selected } + getSuccess().notePads.filter { selected.contains(it.id) } clearSelected() val notes = selectedNotes.map { it.copy(color = colorId) } @@ -270,8 +270,9 @@ internal class MainViewModel } fun setAllArchive() { + val selected = getSuccess().setOfSelected val selectedNotes = - getSuccess().notePads.filter { it.selected } + getSuccess().notePads.filter { selected.contains(it.id) } clearSelected() val notes = selectedNotes.map { it.copy(noteType = NoteType.ARCHIVE) } @@ -282,8 +283,9 @@ internal class MainViewModel } fun setAllDelete() { + val selected = getSuccess().setOfSelected val selectedNotes = - getSuccess().notePads.filter { it.selected } + getSuccess().notePads.filter { selected.contains(it.id) } clearSelected() val notes = selectedNotes.map { it.copy(noteType = NoteType.TRASH) } @@ -295,7 +297,7 @@ internal class MainViewModel fun copyNote() { viewModelScope.launch(Dispatchers.IO) { - val id = getSuccess().notePads.single { it.selected }.id + val id = getSuccess().setOfSelected.first() val notepads = notepadRepository.getOneNotePad(id).first() if (notepads != null) { diff --git a/feature/main/src/main/kotlin/com/mshdabiola/main/TopbarAndDialog.kt b/feature/main/src/main/kotlin/com/mshdabiola/main/TopbarAndDialog.kt index f4f02553..098499d6 100644 --- a/feature/main/src/main/kotlin/com/mshdabiola/main/TopbarAndDialog.kt +++ b/feature/main/src/main/kotlin/com/mshdabiola/main/TopbarAndDialog.kt @@ -596,6 +596,7 @@ fun NoteBottomBar(modifier: Modifier = Modifier) { fun NoteCard( modifier: Modifier = Modifier, notePad: NotePad, + isSelect: Boolean = false, onCardClick: (Long) -> Unit = {}, onLongClick: (Long) -> Unit = {}, ) { @@ -638,7 +639,7 @@ fun NoteCard( onClick = { notePad.id.let { onCardClick(it) } }, onLongClick = { notePad.id.let { onLongClick(it) } }, ), - border = if (notePad.selected) { + border = if (isSelect) { BorderStroke(3.dp, Color.Blue) } else { BorderStroke( @@ -789,7 +790,7 @@ fun NoteCardPreview() { color = 2, isPin = false, background = 3, - selected = true, +// selected = true, // labels = listOf( // "ade", diff --git a/modules/model/src/main/java/com/mshdabiola/model/NotePad.kt b/modules/model/src/main/java/com/mshdabiola/model/NotePad.kt index 1e43c1ec..632940f0 100644 --- a/modules/model/src/main/java/com/mshdabiola/model/NotePad.kt +++ b/modules/model/src/main/java/com/mshdabiola/model/NotePad.kt @@ -15,7 +15,6 @@ data class NotePad( val editDateString: String = "Jul 3", val reminderString: String = "feb 1", val noteType: NoteType = NoteType.NOTE, - val selected: Boolean = false, val images: List = emptyList(), val voices: List = emptyList(), val checks: List = emptyList(), From 14567cfbbe0679ced1c737ea30f9ee493dadb081 Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Thu, 12 Jun 2025 02:04:55 +0100 Subject: [PATCH 3/3] Refactor: Rename `setAllDelete` to `setAllToTrash` in MainViewModel This commit renames the function `setAllDelete` to `setAllToTrash` in `MainViewModel.kt` for clarity. - In `MainViewModel.kt`: - Renamed `setAllDelete()` to `setAllToTrash()`. - In `MainScreen.kt`: - Updated the call from `mainViewModel::setAllDelete` to `mainViewModel::setAllToTrash` in the `onDelete` lambda. --- feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt | 2 +- .../main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt b/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt index aa911787..7e4b5ec9 100644 --- a/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt +++ b/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt @@ -159,7 +159,7 @@ internal fun MainRoute( navigateToSelectLevel((mainState.value as MainState.Success).setOfSelected) }, onCopy = mainViewModel::copyNote, - onDelete = mainViewModel::setAllDelete, + onDelete = mainViewModel::setAllToTrash, onArchive = mainViewModel::setAllArchive, onSend = { mainViewModel.clearSelected() diff --git a/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt b/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt index aa0150db..b2e45382 100644 --- a/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt +++ b/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt @@ -282,7 +282,7 @@ internal class MainViewModel } } - fun setAllDelete() { + fun setAllToTrash() { val selected = getSuccess().setOfSelected val selectedNotes = getSuccess().notePads.filter { selected.contains(it.id) }