From 06f4396e82cfa89bd23798607d909a4ca5e1b873 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 11:09:43 +0000 Subject: [PATCH 001/744] chore(deps): Bump peter-evans/create-pull-request from 7.0.6 to 7.0.8 Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.6 to 7.0.8. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v7.0.6...v7.0.8) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/generate_baselineprofile.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_baselineprofile.yml b/.github/workflows/generate_baselineprofile.yml index 75c07eb6..9248243a 100644 --- a/.github/workflows/generate_baselineprofile.yml +++ b/.github/workflows/generate_baselineprofile.yml @@ -49,7 +49,7 @@ jobs: -Pandroid.experimental.testOptions.managedDevices.maxConcurrentDevices=1 - name: Create Pull Request - uses: peter-evans/create-pull-request@v7.0.6 + uses: peter-evans/create-pull-request@v7.0.8 with: commit-message: Update baseline committer: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> From f269166527e8f12f04c45451be82dd5ecfc893c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 11:47:41 +0000 Subject: [PATCH 002/744] Chore(deps): Bump androidTools from 31.9.2 to 31.10.1 Bumps `androidTools` from 31.9.2 to 31.10.1. Updates `com.android.tools.lint:lint-api` from 31.9.2 to 31.10.1 Updates `com.android.tools.lint:lint-checks` from 31.9.2 to 31.10.1 Updates `com.android.tools.lint:lint-tests` from 31.9.2 to 31.10.1 Updates `com.android.tools:common` from 31.9.2 to 31.10.1 --- updated-dependencies: - dependency-name: com.android.tools.lint:lint-api dependency-version: 31.10.1 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.android.tools.lint:lint-checks dependency-version: 31.10.1 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.android.tools.lint:lint-tests dependency-version: 31.10.1 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.android.tools:common dependency-version: 31.10.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 869b07ff..8f5bd99a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ accompanist = "0.37.3" androidDesugarJdkLibs = "2.1.5" androidGradlePlugin = "8.8.1" -androidTools = "31.9.2" +androidTools = "31.10.1" androidxActivity = "1.10.1" androidxAppCompat = "1.7.1" androidxBrowser = "1.8.0" From 4cc8737e0666a5b05cd9a7d17cd6ed4ef339a396 Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Fri, 13 Jun 2025 23:29:09 +0100 Subject: [PATCH 003/744] Refactor: Update `setMainData` and `getNotePads` to use `MainData` enum This commit modifies the `setMainData` and `getNotePads` (renamed to `getNotePadsWithMainData`) functions in user data and notepad repositories to use the `MainData` enum instead of a `Long` or `NoteType`. - In `FakeUserDataRepository.kt`: - Changed the parameter type of `setMainData` from `Long` to `MainData`. - In `TestNotePadRepository.kt`: - Renamed `getNotePads` to `getNotePadsWithMainData`. - Changed the parameter type from `NoteType` to `MainData`. - In `FakeNotePadRepository.kt`: - Renamed `getNotePads` to `getNotePadsWithMainData`. - Changed the parameter type from `NoteType` to `MainData`. - The implementation now throws `NotImplementedError`. - In `TestUserDataRepository.kt`: - Changed the parameter type of `setMainData` from `Long` to `MainData`. - Updated the implementation to use `MainData.Note` when setting the main data in `currentUserData`. --- .../testing/fake/repository/FakeNotePadRepository.kt | 6 +++--- .../testing/fake/repository/FakeUserDataRepository.kt | 3 ++- .../mshdabiola/testing/repository/TestNotePadRepository.kt | 4 ++-- .../mshdabiola/testing/repository/TestUserDataRepository.kt | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/testing/src/main/java/com/mshdabiola/testing/fake/repository/FakeNotePadRepository.kt b/modules/testing/src/main/java/com/mshdabiola/testing/fake/repository/FakeNotePadRepository.kt index 412aa076..a2c11179 100644 --- a/modules/testing/src/main/java/com/mshdabiola/testing/fake/repository/FakeNotePadRepository.kt +++ b/modules/testing/src/main/java/com/mshdabiola/testing/fake/repository/FakeNotePadRepository.kt @@ -1,8 +1,8 @@ package com.mshdabiola.testing.fake.repository import com.mshdabiola.data.repository.INotePadRepository +import com.mshdabiola.model.MainData import com.mshdabiola.model.NotePad -import com.mshdabiola.model.NoteType import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.datetime.LocalDate @@ -23,8 +23,8 @@ class FakeNotePadRepository @Inject constructor() : INotePadRepository { override suspend fun deleteNoteCheckByNoteId(noteId: Long) { } - override fun getNotePads(noteType: NoteType): Flow> { - return flow { emptyList() } + override fun getNotePadsWithMainData(mainData: MainData): Flow> { + TODO("Not yet implemented") } override fun getNotePads(): Flow> { diff --git a/modules/testing/src/main/java/com/mshdabiola/testing/fake/repository/FakeUserDataRepository.kt b/modules/testing/src/main/java/com/mshdabiola/testing/fake/repository/FakeUserDataRepository.kt index 0ee979e7..17c66930 100644 --- a/modules/testing/src/main/java/com/mshdabiola/testing/fake/repository/FakeUserDataRepository.kt +++ b/modules/testing/src/main/java/com/mshdabiola/testing/fake/repository/FakeUserDataRepository.kt @@ -8,6 +8,7 @@ import com.mshdabiola.data.repository.UserDataRepository import com.mshdabiola.datastore.UserPreferencesRepository import com.mshdabiola.model.Contrast import com.mshdabiola.model.DarkThemeConfig +import com.mshdabiola.model.MainData import com.mshdabiola.model.ThemeBrand import com.mshdabiola.model.UserData import kotlinx.coroutines.flow.Flow @@ -46,7 +47,7 @@ class FakeUserDataRepository @Inject constructor( userPreferencesRepository.setShouldHideOnboarding(shouldHideOnboarding) } - override suspend fun setMainData(mainData: Long) { + override suspend fun setMainData(mainData: MainData) { userPreferencesRepository.setMainData(mainData) } } diff --git a/modules/testing/src/main/java/com/mshdabiola/testing/repository/TestNotePadRepository.kt b/modules/testing/src/main/java/com/mshdabiola/testing/repository/TestNotePadRepository.kt index 0eddaf35..52b09b88 100644 --- a/modules/testing/src/main/java/com/mshdabiola/testing/repository/TestNotePadRepository.kt +++ b/modules/testing/src/main/java/com/mshdabiola/testing/repository/TestNotePadRepository.kt @@ -1,8 +1,8 @@ package com.mshdabiola.testing.repository import com.mshdabiola.data.repository.INotePadRepository +import com.mshdabiola.model.MainData import com.mshdabiola.model.NotePad -import com.mshdabiola.model.NoteType import kotlinx.coroutines.flow.Flow import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalTime @@ -24,7 +24,7 @@ class TestNotePadRepository : INotePadRepository { TODO("Not yet implemented") } - override fun getNotePads(noteType: NoteType): Flow> { + override fun getNotePadsWithMainData(mainData: MainData): Flow> { TODO("Not yet implemented") } diff --git a/modules/testing/src/main/java/com/mshdabiola/testing/repository/TestUserDataRepository.kt b/modules/testing/src/main/java/com/mshdabiola/testing/repository/TestUserDataRepository.kt index 83fa144f..f4724c46 100644 --- a/modules/testing/src/main/java/com/mshdabiola/testing/repository/TestUserDataRepository.kt +++ b/modules/testing/src/main/java/com/mshdabiola/testing/repository/TestUserDataRepository.kt @@ -61,7 +61,7 @@ class TestUserDataRepository : UserDataRepository { } } - override suspend fun setMainData(mainData: Long) { + override suspend fun setMainData(mainData: MainData) { currentUserData.let { current -> _userData.tryEmit(current.copy(mainData = MainData.Note)) } From d750ceb11ca3ab014532e29b7ad1f8e27eae384c Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Fri, 13 Jun 2025 23:29:38 +0100 Subject: [PATCH 004/744] Refactor: Simplify `MainData` to a data class and introduce `NoteType` This commit refactors the `MainData` sealed class into a simple data class. It introduces a `noteType` property that derives its value from the `index` property. This change aims to simplify the structure and improve the readability of how different main data types are handled. - **`modules/model/src/main/java/com/mshdabiola/model/MainData.kt`**: - Changed `MainData` from a `sealed class` to a `data class` with a default `index` value corresponding to `NoteType.NOTE`. - Removed the individual object/data class declarations for `Note`, `Achieve`, `Trash`, `Label`, and `Remainder`. - Added a `noteType` read-only property of type `NoteType` (enum assumed to be defined elsewhere) which is determined by the value of `index`. - `index == -1L` maps to `NoteType.NOTE` - `index == -2L` maps to `NoteType.ARCHIVE` - `index == -3L` maps to `NoteType.TRASH` - `index == -4L` maps to `NoteType.REMAINDER` - Any other `index` value maps to `NoteType.LABEL` --- .../main/java/com/mshdabiola/model/MainData.kt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/model/src/main/java/com/mshdabiola/model/MainData.kt b/modules/model/src/main/java/com/mshdabiola/model/MainData.kt index 4431ff9e..ec5895a3 100644 --- a/modules/model/src/main/java/com/mshdabiola/model/MainData.kt +++ b/modules/model/src/main/java/com/mshdabiola/model/MainData.kt @@ -1,9 +1,12 @@ package com.mshdabiola.model -sealed class MainData(val index: Long) { - object Note : MainData(-1L) - object Achieve : MainData(-2L) - object Trash : MainData(-3L) - data class Label(val id: Long) : MainData(index = id) // Assigning a default index like in the original enum - object Remainder : MainData(-4L) +data class MainData(val index: Long = NoteType.NOTE.index) { + val noteType: NoteType + get() = when (index) { + -1L -> NoteType.NOTE + -2L -> NoteType.ARCHIVE + -3L -> NoteType.TRASH + -4L -> NoteType.REMAINDER + else -> NoteType.LABEL + } } From df5d2c99b1ee54ae23a65eefa8ada2f5b65556ad Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Fri, 13 Jun 2025 23:29:49 +0100 Subject: [PATCH 005/744] Feat: Add DateUseCase and update domain module dependencies This commit introduces a new `DateUseCase` class in the domain module and updates its dependencies. - In `modules/domain/src/main/kotlin/com/mshdabiola/domain/DateUseCase.kt`: - Added a new class `DateUseCase` with an invoke operator that currently returns an empty string. - In `modules/domain/build.gradle.kts`: - Added `api` dependencies for `projects.modules.data` and `projects.modules.model`. - Added `testImplementation` dependency for `projects.modules.testing`. --- modules/domain/build.gradle.kts | 7 +++++++ .../src/main/kotlin/com/mshdabiola/domain/DateUseCase.kt | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 modules/domain/src/main/kotlin/com/mshdabiola/domain/DateUseCase.kt diff --git a/modules/domain/build.gradle.kts b/modules/domain/build.gradle.kts index dec052fc..70185652 100644 --- a/modules/domain/build.gradle.kts +++ b/modules/domain/build.gradle.kts @@ -9,4 +9,11 @@ plugins { android { namespace = "com.mshdabiola.domain" +} +dependencies { + api(projects.modules.data) + api(projects.modules.model) + + + testImplementation(projects.modules.testing) } \ No newline at end of file diff --git a/modules/domain/src/main/kotlin/com/mshdabiola/domain/DateUseCase.kt b/modules/domain/src/main/kotlin/com/mshdabiola/domain/DateUseCase.kt new file mode 100644 index 00000000..8940058e --- /dev/null +++ b/modules/domain/src/main/kotlin/com/mshdabiola/domain/DateUseCase.kt @@ -0,0 +1,7 @@ +package com.mshdabiola.domain + +class DateUseCase { + operator fun invoke(limit: Int = 10): String { + return "" + } +} From a0caac6aceff219edfed30f89a1aecdec1bd4dac Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Fri, 13 Jun 2025 23:29:58 +0100 Subject: [PATCH 006/744] Refactor: Simplify `MainData` handling in `UserPreferencesRepository` This commit refactors how `MainData` is handled in `UserPreferencesRepository.kt`. - The mapping of `it.mainScreenType` to `MainData` enum values has been replaced with a direct instantiation of `MainData(it.mainScreenType)`. - The `setMainData` function now accepts a `MainData` object as a parameter instead of a `Long` index. The `mainScreenType` in `UserPreferences` is updated using `mainData.index`. --- .../datastore/UserPreferencesRepository.kt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/datastore/src/main/kotlin/com/mshdabiola/datastore/UserPreferencesRepository.kt b/modules/datastore/src/main/kotlin/com/mshdabiola/datastore/UserPreferencesRepository.kt index c3665404..1a4a30e8 100644 --- a/modules/datastore/src/main/kotlin/com/mshdabiola/datastore/UserPreferencesRepository.kt +++ b/modules/datastore/src/main/kotlin/com/mshdabiola/datastore/UserPreferencesRepository.kt @@ -54,13 +54,7 @@ class UserPreferencesRepository @Inject constructor( ThemeContrastProto.THEME_CONTRAST_MEDIUM -> Contrast.Medium }, - mainData = when (it.mainScreenType) { - MainData.Note.index -> MainData.Note - MainData.Achieve.index -> MainData.Achieve - MainData.Trash.index -> MainData.Trash - MainData.Remainder.index -> MainData.Remainder - else -> MainData.Label(it.mainScreenType) - }, + mainData = MainData(it.mainScreenType), ) } @@ -112,9 +106,9 @@ class UserPreferencesRepository @Inject constructor( it.copy { this.shouldHideOnboarding = shouldHideOnboarding } } } - suspend fun setMainData(index: Long) { + suspend fun setMainData(mainData: MainData) { userPreferences.updateData { - it.copy { this.mainScreenType = index } + it.copy { this.mainScreenType = mainData.index } } } } From 0e244055b2e4eb31f5d014f89a3b1ed31083d127 Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Fri, 13 Jun 2025 23:30:09 +0100 Subject: [PATCH 007/744] Refactor: Update `NotepadDao` to include `getListOfNotePadByReminder` This commit updates `NotepadDao.kt` to enhance functionality for retrieving notes. - Renamed `getListOfNotePad` to `getListOfNotePadByNoteType` for clarity. - Added a new function `getListOfNotePadByReminder` to fetch notes that have a reminder set (`reminder > 0`), ordered by ID in descending order. --- .../src/main/java/com/mshdabiola/database/dao/NotepadDao.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/database/src/main/java/com/mshdabiola/database/dao/NotepadDao.kt b/modules/database/src/main/java/com/mshdabiola/database/dao/NotepadDao.kt index d8772924..7aee3f2d 100644 --- a/modules/database/src/main/java/com/mshdabiola/database/dao/NotepadDao.kt +++ b/modules/database/src/main/java/com/mshdabiola/database/dao/NotepadDao.kt @@ -11,7 +11,11 @@ import kotlinx.coroutines.flow.Flow interface NotepadDao { @Transaction @Query("SELECT * FROM note_table WHERE noteType = :noteType ORDER BY id DESC") - fun getListOfNotePad(noteType: NoteType): Flow> + fun getListOfNotePadByNoteType(noteType: NoteType): Flow> + + @Transaction + @Query("SELECT * FROM note_table WHERE reminder > 0 ORDER BY id DESC") + fun getListOfNotePadByReminder(): Flow> @Transaction @Query("SELECT * FROM note_table ORDER BY id DESC") From 6cbdd660b50536bf301db20da2dfb8be88a8c45e Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Fri, 13 Jun 2025 23:30:20 +0100 Subject: [PATCH 008/744] Refactor: Update NotePadRepository and UserDataRepository to use `MainData` This commit updates `NotePadRepository` and `UserDataRepository` to utilize the `MainData` model class for managing note types and user preferences, enhancing type safety and clarity. **Key changes:** - **`NotePadRepository.kt`**: - Replaced `getNotePads(noteType: NoteType)` with `getNotePadsWithMainData(mainData: MainData)`. - The new method `getNotePadsWithMainData` now filters notes based on `mainData.noteType`. - For `NoteType.LABEL`, it filters notes where any label ID matches `mainData.index`. - For `NoteType.REMAINDER`, it fetches notes by reminder. - For other `NoteType`s, it fetches notes by `mainData.noteType`. - Updated `deleteTrashType()` to use `getNotePadsWithMainData(MainData(NoteType.TRASH.index))` to fetch trash items. - **`INotePadRepository.kt`**: - Updated the interface to reflect the change from `getNotePads(noteType: NoteType)` to `getNotePadsWithMainData(mainData: MainData)`. - **`UserDataRepository.kt`**: - Modified `setMainData(mainData: Long)` to `setMainData(mainData: MainData)`. - **`OfflineFirstUserDataRepository.kt`**: - Updated the implementation of `setMainData` to accept a `MainData` object. --- .../data/repository/INotePadRepository.kt | 5 +-- .../data/repository/NotePadRepository.kt | 31 ++++++++++++++++--- .../OfflineFirstUserDataRepository.kt | 3 +- .../data/repository/UserDataRepository.kt | 3 +- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/modules/data/src/main/kotlin/com/mshdabiola/data/repository/INotePadRepository.kt b/modules/data/src/main/kotlin/com/mshdabiola/data/repository/INotePadRepository.kt index 417c7701..bc4ee004 100644 --- a/modules/data/src/main/kotlin/com/mshdabiola/data/repository/INotePadRepository.kt +++ b/modules/data/src/main/kotlin/com/mshdabiola/data/repository/INotePadRepository.kt @@ -1,7 +1,7 @@ package com.mshdabiola.data.repository +import com.mshdabiola.model.MainData import com.mshdabiola.model.NotePad -import com.mshdabiola.model.NoteType import kotlinx.coroutines.flow.Flow import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalTime @@ -14,7 +14,8 @@ interface INotePadRepository { suspend fun deleteCheckNote(id: Long, noteId: Long) suspend fun deleteNoteCheckByNoteId(noteId: Long) - fun getNotePads(noteType: NoteType): Flow> + + fun getNotePadsWithMainData(mainData: MainData): Flow> fun getNotePads(): Flow> // fun getNote() = generalDao.getNote().map { noteEntities -> noteEntities.map { it.toNote() } } diff --git a/modules/data/src/main/kotlin/com/mshdabiola/data/repository/NotePadRepository.kt b/modules/data/src/main/kotlin/com/mshdabiola/data/repository/NotePadRepository.kt index 346b198c..6e746aa8 100644 --- a/modules/data/src/main/kotlin/com/mshdabiola/data/repository/NotePadRepository.kt +++ b/modules/data/src/main/kotlin/com/mshdabiola/data/repository/NotePadRepository.kt @@ -16,11 +16,13 @@ import com.mshdabiola.database.dao.NoteVoiceDao import com.mshdabiola.database.dao.NotepadDao import com.mshdabiola.database.dao.PathDao import com.mshdabiola.database.model.NoteLabelEntity +import com.mshdabiola.model.MainData import com.mshdabiola.model.NotePad import com.mshdabiola.model.NoteType import com.mshdabiola.model.NoteUri import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext @@ -76,9 +78,30 @@ internal class NotePadRepository noteCheckDao.deleteByNoteId(noteId) } - override fun getNotePads(noteType: NoteType) = notePadDao - .getListOfNotePad(noteType) - .map { entities -> entities.map { transform(it.toNotePad()) } } + override fun getNotePadsWithMainData(mainData: MainData): Flow> { + return when (mainData.noteType) { + NoteType.LABEL -> { + notePadDao.getListOfNotePad() + .map { + it.filter { + it.labels + .any { it.label.id == mainData.index } + } + } + } + + NoteType.REMAINDER -> { + notePadDao.getListOfNotePadByReminder() + } + + else -> notePadDao.getListOfNotePadByNoteType(mainData.noteType) + } + .map { entities -> entities.map { transform(it.toNotePad()) } } + } +// +// override fun getNotePads(noteType: NoteType) = notePadDao +// .getListOfNotePad(noteType) +// .map { entities -> entities.map { transform(it.toNotePad()) } } override fun getNotePads() = notePadDao .getListOfNotePad().map { entities -> entities.map { transform(it.toNotePad()) } } @@ -97,7 +120,7 @@ internal class NotePadRepository } override suspend fun deleteTrashType() = withContext(Dispatchers.IO) { - val list = getNotePads(NoteType.TRASH).first() + val list = getNotePadsWithMainData(MainData(NoteType.TRASH.index)).first() delete(list) } diff --git a/modules/data/src/main/kotlin/com/mshdabiola/data/repository/OfflineFirstUserDataRepository.kt b/modules/data/src/main/kotlin/com/mshdabiola/data/repository/OfflineFirstUserDataRepository.kt index ed22518e..83f5119c 100644 --- a/modules/data/src/main/kotlin/com/mshdabiola/data/repository/OfflineFirstUserDataRepository.kt +++ b/modules/data/src/main/kotlin/com/mshdabiola/data/repository/OfflineFirstUserDataRepository.kt @@ -8,6 +8,7 @@ import com.mshdabiola.analytics.AnalyticsHelper import com.mshdabiola.datastore.UserPreferencesRepository import com.mshdabiola.model.Contrast import com.mshdabiola.model.DarkThemeConfig +import com.mshdabiola.model.MainData import com.mshdabiola.model.ThemeBrand import com.mshdabiola.model.UserData import kotlinx.coroutines.flow.Flow @@ -46,7 +47,7 @@ internal class OfflineFirstUserDataRepository @Inject constructor( analyticsHelper.logOnboardingStateChanged(shouldHideOnboarding) } - override suspend fun setMainData(mainData: Long) { + override suspend fun setMainData(mainData: MainData) { userPreferencesRepository.setMainData(mainData) } } diff --git a/modules/data/src/main/kotlin/com/mshdabiola/data/repository/UserDataRepository.kt b/modules/data/src/main/kotlin/com/mshdabiola/data/repository/UserDataRepository.kt index 1a91e468..be446d5a 100644 --- a/modules/data/src/main/kotlin/com/mshdabiola/data/repository/UserDataRepository.kt +++ b/modules/data/src/main/kotlin/com/mshdabiola/data/repository/UserDataRepository.kt @@ -6,6 +6,7 @@ package com.mshdabiola.data.repository import com.mshdabiola.model.Contrast import com.mshdabiola.model.DarkThemeConfig +import com.mshdabiola.model.MainData import com.mshdabiola.model.ThemeBrand import com.mshdabiola.model.UserData import kotlinx.coroutines.flow.Flow @@ -35,5 +36,5 @@ interface UserDataRepository { * Sets whether the user has completed the onboarding process. */ suspend fun setShouldHideOnboarding(shouldHideOnboarding: Boolean) - suspend fun setMainData(mainData: Long) + suspend fun setMainData(mainData: MainData) } From 2e1516c0507a9142dce996d78d796685610f9461 Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Fri, 13 Jun 2025 23:30:45 +0100 Subject: [PATCH 009/744] Refactor: Simplify MainState and remove search functionality This commit refactors the `MainState` and related logic in `MainViewModel` and `MainScreen`. The primary change is the removal of search-specific properties and logic from `MainState` and the direct handling of notepad filtering based on `MainData` within `MainViewModel`. **Key changes:** - **`feature/main/MainState.kt`**: - Removed `isSearch`, `noteType`, `types`, `color`, `label`, and `searchSort` properties from `MainState.Success`. - Removed `Empty` and `Finish` sealed class instances. - The `mainData` property in `MainState.Success` now defaults to `MainData()` instead of `MainData.Note`. - **`feature/main/MainScreen.kt`**: - Removed parameters related to search functionality: `searchState`, `toggleSearch`, and `onSetSearch` from `MainRoute`, `MainScreen`, and `SuccessState` composables. - Removed `SearchTopBar` usage. - `MainTopAppBar`'s `navigateToSearch` parameter is now a no-op lambda. - Removed the logic for displaying search filter options (Types, Labels, Colors) when `isSearch` was true and `notePads` were empty. - `EmptyState` now takes `mainData: MainData` instead of `noteType: NoteType`. - The condition for displaying `EmptyState` in `SuccessState` now checks `success.notePads.isEmpty()` instead of `!success.isSearch && success.notePads.isEmpty()`. - TopAppBar selection logic (`LabelTopAppBar`, `MainTopAppBar`, etc.) now directly uses `success.mainData.noteType` instead of `success.noteType`. - **`feature/main/MainViewModel.kt`**: - Removed `searchState` (`TextFieldState`). - The `mainState` is now a `StateFlow` derived from combining `currentNotepads` (filtered by `MainData` from `userDataRepository`), `userDataRepository.userData.mainData`, and `setOfSelected` (a new `MutableStateFlow>`). This simplifies state management by removing the complex `combine` logic that handled search and notepad filtering. - Removed `toggleSearch` and `onSetSearch` functions. - `onSelectCard` and `clearSelected` now update the `setOfSelected` `MutableStateFlow` directly. - `setNoteType` function's body is cleared as `noteType` is no longer part of `MainState`. - Removed the initial `viewModelScope.launch` blocks that were collecting `userData` and combining `mainState`, `searchState.text`, and `notepadRepository.getNotePads()` to update `_mainState`. The new `mainState` flow handles this reactively. --- .../kotlin/com/mshdabiola/main/MainScreen.kt | 160 +++++------ .../kotlin/com/mshdabiola/main/MainState.kt | 17 +- .../com/mshdabiola/main/MainViewModel.kt | 262 ++++-------------- 3 files changed, 121 insertions(+), 318 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 7e4b5ec9..da889660 100644 --- a/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt +++ b/feature/main/src/main/kotlin/com/mshdabiola/main/MainScreen.kt @@ -8,7 +8,6 @@ import ArchiveTopAppBar import LabelTopAppBar import MainTopAppBar import NoteCard -import SearchTopBar import SelectTopBar import TrashTopAppBar import androidx.compose.animation.AnimatedVisibility @@ -37,7 +36,6 @@ import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan import androidx.compose.foundation.lazy.staggeredgrid.items import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api @@ -78,6 +76,7 @@ import com.mshdabiola.analytics.LocalAnalyticsHelper import com.mshdabiola.common.result.Result import com.mshdabiola.designsystem.component.NoteLoadingWheel import com.mshdabiola.designsystem.icon.NoteIcon +import com.mshdabiola.model.MainData import com.mshdabiola.model.Note import com.mshdabiola.model.NotePad import com.mshdabiola.model.NoteType @@ -149,7 +148,6 @@ internal fun MainRoute( modifier = modifier, mainState = mainState.value, navigateToEdit = navigateToDetail, - searchState = mainViewModel.searchState, onSelectedCard = mainViewModel::onSelectCard, onClearSelected = mainViewModel::clearSelected, setAllPin = mainViewModel::setPin, @@ -168,8 +166,6 @@ internal fun MainRoute( onDeleteLabel = { showDeleteLabel = true }, onEmptyTrash = mainViewModel::emptyTrash, onOpenDrawer = onOpenDrawer, - toggleSearch = mainViewModel::toggleSearch, - onSetSearch = mainViewModel::onSetSearch, // items = timeline, ) @@ -230,7 +226,6 @@ internal fun MainScreen( sharedTransitionScope: SharedTransitionScope, animatedContentScope: AnimatedVisibilityScope, mainState: MainState, - searchState: TextFieldState, navigateToEdit: (Long) -> Unit = {}, onOpenDrawer: () -> Unit = {}, onSelectedCard: (Long) -> Unit = {}, @@ -246,8 +241,6 @@ internal fun MainScreen( onRenameLabel: () -> Unit = {}, onDeleteLabel: () -> Unit = {}, onEmptyTrash: () -> Unit = {}, - toggleSearch: () -> Unit = {}, - onSetSearch: (SearchSort?) -> Unit = {}, ) { val state = rememberLazyListState() TrackScrollJank(scrollableState = state, stateName = "topic:screen") @@ -259,7 +252,6 @@ internal fun MainScreen( sharedTransitionScope = sharedTransitionScope, animatedContentScope = animatedContentScope, success = mainState, - searchState = searchState, navigateToEdit = navigateToEdit, onSelectedCard = onSelectedCard, onClearSelected = onClearSelected, @@ -275,20 +267,12 @@ internal fun MainScreen( onDeleteLabel = onDeleteLabel, onEmptyTrash = onEmptyTrash, onOpenDrawer = onOpenDrawer, - toggleSearch = toggleSearch, - onSetSearch = onSetSearch, ) } is MainState.Loading -> { LoadingState() } - - is MainState.Empty -> { - EmptyState() - } - - is MainState.Finish -> {} } // with(sharedTransitionScope) { @@ -317,7 +301,7 @@ private fun LoadingState(modifier: Modifier = Modifier) { } @Composable -private fun EmptyState(modifier: Modifier = Modifier, noteType: NoteType = NoteType.NOTE) { +private fun EmptyState(modifier: Modifier = Modifier, mainData: MainData = MainData()) { Column( modifier = modifier .padding(16.dp) @@ -353,7 +337,6 @@ fun MainContent( sharedTransitionScope: SharedTransitionScope, animatedContentScope: AnimatedVisibilityScope, success: MainState.Success, - searchState: TextFieldState, navigateToEdit: (Long) -> Unit = {}, onSelectedCard: (Long) -> Unit = {}, onClearSelected: () -> Unit = {}, @@ -369,8 +352,6 @@ fun MainContent( onDeleteLabel: () -> Unit = {}, onEmptyTrash: () -> Unit = {}, onOpenDrawer: () -> Unit = {}, - toggleSearch: () -> Unit = {}, - onSetSearch: (SearchSort?) -> Unit, // ={} ) { val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() val pinScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() @@ -420,7 +401,7 @@ fun MainContent( ) } - success.noteType == NoteType.LABEL -> { + success.mainData.noteType == NoteType.LABEL -> { LabelTopAppBar( label = "Label Name", // labels.single { it.id == currentNoteType.id }.label, onNavigate = { }, @@ -430,24 +411,17 @@ fun MainContent( ) } - success.noteType == NoteType.NOTE -> { - if (success.isSearch) { - SearchTopBar( - state = searchState, - toggleSearch = toggleSearch, - ) - } else { - MainTopAppBar( - onNavigate = onOpenDrawer, - scrollBehavior = scrollBehavior, - isGrid = isGrid, - navigateToSearch = toggleSearch, - onToggleGrid = { isGrid = !isGrid }, - ) - } + success.mainData.noteType == NoteType.NOTE -> { + MainTopAppBar( + onNavigate = onOpenDrawer, + scrollBehavior = scrollBehavior, + isGrid = isGrid, + navigateToSearch = {}, + onToggleGrid = { isGrid = !isGrid }, + ) } - success.noteType == NoteType.TRASH -> { + success.mainData.noteType == NoteType.TRASH -> { TrashTopAppBar( onNavigate = { }, scrollBehavior = scrollBehavior, @@ -455,7 +429,7 @@ fun MainContent( ) } - success.noteType == NoteType.REMAINDER -> { + success.mainData.noteType == NoteType.REMAINDER -> { ArchiveTopAppBar( name = "Remainder", onNavigate = { }, @@ -464,7 +438,7 @@ fun MainContent( ) } - success.noteType == NoteType.ARCHIVE -> { + success.mainData.noteType == NoteType.ARCHIVE -> { ArchiveTopAppBar( onNavigate = { }, scrollBehavior = scrollBehavior, @@ -484,60 +458,60 @@ fun MainContent( verticalItemSpacing = 8.dp, ) { - if (success.isSearch && success.notePads.isEmpty()) { - item(span = StaggeredGridItemSpan.FullLine) { - LabelBox( - title = stringResource(Rd.string.modules_designsystem_types), - success.types, - onItemClick = onSetSearch, - ) - } - - item(span = StaggeredGridItemSpan.FullLine) { - LabelBox( - title = stringResource(Rd.string.modules_designsystem_labels), - success.label, - onItemClick = onSetSearch, - ) - } - item(span = StaggeredGridItemSpan.FullLine) { - Text(text = stringResource(Rd.string.modules_designsystem_colors)) - } - - item(span = StaggeredGridItemSpan.FullLine) { - FlowRow( - verticalArrangement = Arrangement.spacedBy(4.dp), - - horizontalArrangement = Arrangement.spacedBy(4.dp), - ) { - success.color.forEach { - Surface( - onClick = { - onSetSearch(it) - }, - shape = CircleShape, - color = if (it.colorIndex == -1) Color.White else NoteIcon.noteColors[it.colorIndex], - modifier = Modifier - .width(40.dp) - .aspectRatio(1f), - - ) { - if (it.colorIndex == -1) { - Icon( - imageVector = NoteIcon.FormatColorReset, - contentDescription = "done", - tint = Color.Gray, - modifier = Modifier.padding(4.dp), - ) - } - } - } - } - } - } - if (!success.isSearch && success.notePads.isEmpty()) { +// if (success.isSearch && success.notePads.isEmpty()) { +// item(span = StaggeredGridItemSpan.FullLine) { +// LabelBox( +// title = stringResource(Rd.string.modules_designsystem_types), +// success.types, +// onItemClick = onSetSearch, +// ) +// } +// +// item(span = StaggeredGridItemSpan.FullLine) { +// LabelBox( +// title = stringResource(Rd.string.modules_designsystem_labels), +// success.label, +// onItemClick = onSetSearch, +// ) +// } +// item(span = StaggeredGridItemSpan.FullLine) { +// Text(text = stringResource(Rd.string.modules_designsystem_colors)) +// } +// +// item(span = StaggeredGridItemSpan.FullLine) { +// FlowRow( +// verticalArrangement = Arrangement.spacedBy(4.dp), +// +// horizontalArrangement = Arrangement.spacedBy(4.dp), +// ) { +// success.color.forEach { +// Surface( +// onClick = { +// onSetSearch(it) +// }, +// shape = CircleShape, +// color = if (it.colorIndex == -1) Color.White else NoteIcon.noteColors[it.colorIndex], +// modifier = Modifier +// .width(40.dp) +// .aspectRatio(1f), +// +// ) { +// if (it.colorIndex == -1) { +// Icon( +// imageVector = NoteIcon.FormatColorReset, +// contentDescription = "done", +// tint = Color.Gray, +// modifier = Modifier.padding(4.dp), +// ) +// } +// } +// } +// } +// } +// } + if (success.notePads.isEmpty()) { item(span = StaggeredGridItemSpan.FullLine) { - EmptyState(noteType = success.noteType) + EmptyState(mainData = success.mainData) } } if (pinNotePad.first.isNotEmpty()) { 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 d6f078fd..0a97051d 100644 --- a/feature/main/src/main/kotlin/com/mshdabiola/main/MainState.kt +++ b/feature/main/src/main/kotlin/com/mshdabiola/main/MainState.kt @@ -2,24 +2,21 @@ package com.mshdabiola.main import com.mshdabiola.model.MainData import com.mshdabiola.model.NotePad -import com.mshdabiola.model.NoteType sealed class MainState { data object Loading : MainState() data class Success( - val isSearch: Boolean = false, - val noteType: NoteType = NoteType.NOTE, +// val isSearch: Boolean = false, +// val noteType: NoteType = NoteType.NOTE, val notePads: List = emptyList(), - val types: List = emptyList(), - val color: List = emptyList(), - val label: List = emptyList(), - val searchSort: SearchSort? = null, - val mainData: MainData = MainData.Note, +// val types: List = emptyList(), +// val color: List = emptyList(), +// val label: List = emptyList(), +// val searchSort: SearchSort? = null, + val mainData: MainData = MainData(), val setOfSelected: Set = emptySet(), ) : MainState() // data class Error(val message: String) : MainStateN() - data object Empty : MainState() - data class Finish(val id: Long) : 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 b2e45382..4dcb4343 100644 --- a/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt +++ b/feature/main/src/main/kotlin/com/mshdabiola/main/MainViewModel.kt @@ -1,18 +1,15 @@ package com.mshdabiola.main import android.util.Log -import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.material3.DatePickerState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.TimePickerState -import androidx.compose.runtime.snapshotFlow import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.mshdabiola.common.IAlarmManager import com.mshdabiola.data.repository.INotePadRepository import com.mshdabiola.data.repository.UserDataRepository -import com.mshdabiola.model.MainData import com.mshdabiola.model.NoteType import com.mshdabiola.ui.state.DateDialogUiData import com.mshdabiola.ui.state.DateListUiState @@ -21,13 +18,13 @@ import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.datetime.Clock @@ -55,138 +52,66 @@ internal class MainViewModel userDataRepository: UserDataRepository, ) : ViewModel() { - val searchState = TextFieldState() + private val _dateTimeState = MutableStateFlow(DateDialogUiData()) + val dateTimeState = _dateTimeState.asStateFlow() + private lateinit var currentDateTime: LocalDateTime + private lateinit var today: LocalDateTime + private val timeListDefault = mutableListOf( + LocalTime(7, 0, 0), + LocalTime(13, 0, 0), + LocalTime(19, 0, 0), + LocalTime(20, 0, 0), + LocalTime(20, 0, 0), + ) - private val _mainState = MutableStateFlow(MainState.Loading) - val mainState = _mainState.asStateFlow() + @OptIn(ExperimentalMaterial3Api::class) + var datePicker: DatePickerState = DatePickerState( + initialSelectedDateMillis = System.currentTimeMillis(), + locale = Locale.getDefault(), + ) - init { - viewModelScope.launch { - userDataRepository.userData.collectLatest { - if (mainState.value is MainState.Success) { - _mainState.value = getSuccess().copy(mainData = it.mainData) - } - } - } + @OptIn(ExperimentalMaterial3Api::class) + var timePicker: TimePickerState = TimePickerState(12, 4, is24Hour = false) + private lateinit var currentLocalDate: LocalDate - viewModelScope.launch { - combine( - mainState, - snapshotFlow { searchState.text } - .debounce(500), - notepadRepository.getNotePads(), - ) { mainState, search, notepad -> - Triple(mainState, search, notepad) - }.collectLatest { triple -> - - val (mainState, search, notepad) = triple - if (mainState is MainState.Success) { - if (mainState.isSearch) { - when { - mainState.searchSort != null -> { - var list = when (val searchsort = mainState.searchSort) { - is SearchSort.Color -> { - notepad.filter { it.color == searchsort.colorIndex } - } - is SearchSort.Label -> { - notepad.filter { it.labels.any { it.id == searchsort.id } } - } - is SearchSort.Type -> { - when (searchsort.index) { - 0 -> notepad.filter { it.reminder > 0 } - 1 -> notepad.filter { it.isCheck } - 2 -> notepad.filter { it.images.isNotEmpty() } - 3 -> notepad.filter { it.voices.isNotEmpty() } - 4 -> notepad.filter { it.images.any { it.isDrawing } } - 5 -> notepad.filter { it.uris.isNotEmpty() } - else -> notepad - } - } - - null -> TODO() - } - - if (search.isNotBlank()) { - list = list.filter { it.toString().contains(search, true) } - } - - _mainState.update { - getSuccess().copy(notePads = list) - } - } - search.isNotBlank() -> { - - val list = notepad.filter { it.toString().contains(search, true) } - _mainState.update { - getSuccess().copy(notePads = list) - } - } - - else -> { - _mainState.value = getSuccess().copy( - notePads = emptyList(), - ) - } - } - } else { - - val list = - when (mainState.mainData) { - is MainData.Label -> { - notepad.filter { it.labels.any { it.id == mainState.mainData.index } } - } - - is MainData.Remainder -> { - notepad.filter { it.reminder > 0 } - } - - else -> { - notepad.filter { - it.noteType.index == mainState.mainData.index - } - } - } - _mainState.value = getSuccess().copy( - notePads = list, - ) - } - } else { - val mainData = userDataRepository.userData.mapLatest { it.mainData }.firstOrNull() ?: MainData.Note - _mainState.value = MainState.Success( - notePads = emptyList(), - mainData = mainData, - ) - - initDate() - } - } + private val setOfSelected = MutableStateFlow>(setOf()) + private val currentNotepads = userDataRepository + .userData + .mapLatest { it.mainData } + .flatMapLatest { + notepadRepository.getNotePadsWithMainData(it) } - } + val mainState = combine( + currentNotepads, + userDataRepository.userData.mapLatest { it.mainData }, + setOfSelected, + ) { notepad, mainData, setOfSelected -> + + MainState.Success( + notePads = notepad, + mainData = mainData, + setOfSelected = setOfSelected, + ) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(), + initialValue = MainState.Loading, + ) - /** - * Handles the selection/deselection of a notepad card. - * - * This function is triggered when a user selects or deselects a notepad card. - * It updates the selected state of the corresponding notepad in the list and - * updates the UI state accordingly. - * - * @param id The ID of the notepad card that was selected or deselected. - */ fun onSelectCard(id: Long) { val selected = getSuccess().setOfSelected if (selected.contains(id)) { - _mainState.value = getSuccess().copy(setOfSelected = selected - id) + setOfSelected.value = selected - id } else { - _mainState.value = getSuccess().copy(setOfSelected = selected + id) + setOfSelected.value = selected + id } } fun clearSelected() { - _mainState.value = getSuccess().copy(setOfSelected = emptySet()) + setOfSelected.value = emptySet() } fun setNoteType(noteType: NoteType) { - _mainState.value = MainState.Success(noteType = noteType) } fun setPin() { @@ -344,28 +269,6 @@ internal class MainViewModel } } - private val _dateTimeState = MutableStateFlow(DateDialogUiData()) - val dateTimeState = _dateTimeState.asStateFlow() - private lateinit var currentDateTime: LocalDateTime - private lateinit var today: LocalDateTime - private val timeListDefault = mutableListOf( - LocalTime(7, 0, 0), - LocalTime(13, 0, 0), - LocalTime(19, 0, 0), - LocalTime(20, 0, 0), - LocalTime(20, 0, 0), - ) - - @OptIn(ExperimentalMaterial3Api::class) - var datePicker: DatePickerState = DatePickerState( - initialSelectedDateMillis = System.currentTimeMillis(), - locale = Locale.getDefault(), - ) - - @OptIn(ExperimentalMaterial3Api::class) - var timePicker: TimePickerState = TimePickerState(12, 4, is24Hour = false) - private lateinit var currentLocalDate: LocalDate - // date and time dialog logic private fun initDate() { @@ -656,75 +559,4 @@ internal class MainViewModel } private fun getSuccess() = mainState.value as MainState.Success - - fun toggleSearch() { - viewModelScope.launch { - val isSearch = getSuccess().isSearch - - if (isSearch) { - _mainState.update { - getSuccess().copy( - isSearch = false, - types = emptyList(), - color = emptyList(), - label = emptyList(), - searchSort = null, - ) - } - } else { - val notes = notepadRepository.getNotePads().first() - - val labels = notes.asSequence().filter { it.labels.isEmpty().not() } - .map { it.labels } - .flatten() - .distinct() - .map { SearchSort.Label(it.label, 6, it.id) }.toList() - - val colors = notes.asSequence() - .map { it.color } - .distinct() - .map { SearchSort.Color(it) }.toList() - - val type = ArrayList(6) - if (notes.any { it.reminder > 0 }) { - type.add(SearchSort.Type(0)) - } - if (notes.any { it.isCheck }) { - type.add(SearchSort.Type(1)) - } - if (notes.any { it.images.isNotEmpty() }) { - type.add(SearchSort.Type(2)) - } - if (notes.any { it.voices.isNotEmpty() }) { - type.add(SearchSort.Type(3)) - } - - if (notes.any { it.images.any { it.isDrawing } }) { - type.add(SearchSort.Type(4)) - } - - if (notes.any { it.uris.isNotEmpty() }) { - type.add(SearchSort.Type(5)) - } - - _mainState.update { - getSuccess().copy( - isSearch = true, - searchSort = null, - types = type, - color = colors, - label = labels, - ) - } - } - } - } - - fun onSetSearch(searchSort: SearchSort?) { - _mainState.update { - getSuccess().copy( - searchSort = searchSort, - ) - } - } } From 34473d03b54be81472526cc5c9d02c089f5d2f43 Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Fri, 13 Jun 2025 23:30:56 +0100 Subject: [PATCH 010/744] Refactor: Update `setMainData` call in `LabelViewModel` This commit updates the `LabelViewModel.kt` to call `userDataRepository.setMainData(MainData())` instead of `userDataRepository.setMainData(MainData.Note.index)` when a label is deleted. - In `feature/labelscreen/src/main/java/com/mshdabiola/labelscreen/LabelViewModel.kt`: - Changed the argument passed to `userDataRepository.setMainData` from `MainData.Note.index` to `MainData()` within the `deleteLabel` function. --- .../src/main/java/com/mshdabiola/labelscreen/LabelViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/labelscreen/src/main/java/com/mshdabiola/labelscreen/LabelViewModel.kt b/feature/labelscreen/src/main/java/com/mshdabiola/labelscreen/LabelViewModel.kt index 106a7137..a1d254a1 100644 --- a/feature/labelscreen/src/main/java/com/mshdabiola/labelscreen/LabelViewModel.kt +++ b/feature/labelscreen/src/main/java/com/mshdabiola/labelscreen/LabelViewModel.kt @@ -61,7 +61,7 @@ class LabelViewModel @Inject constructor( labels.removeAt(index) labelScreenUiState = labelScreenUiState.copy(labels = labels.toImmutableList()) viewModelScope.launch { - userDataRepository.setMainData(MainData.Note.index) + userDataRepository.setMainData(MainData()) labelRepository.delete(id) } } From c521ce9f9058df9ed05d538ac930500e8b89048b Mon Sep 17 00:00:00 2001 From: mshdabiola Date: Fri, 13 Jun 2025 23:31:16 +0100 Subject: [PATCH 011/744] Refactor: Use `MainData` object for main navigation argument This commit updates the main navigation logic to use a `MainData` object instead of a `Long` to represent the current navigation argument. This improves type safety and clarity. **Key changes:** - **`SharedActivityViewModel.kt`**: - Updated the default `mainData` in `UiState` to be a `MainData()` object. - **`MainActivityViewModel.kt`**: - Modified `setMainData` function to accept a `MainData` object. - **`MainNavigatin.kt`**: - Changed the type of `currentMainArg` from `Long` to `MainData`. - Updated `onNavigation` lambda to accept a `MainData` object. - Modified selection logic for `NavigationDrawerItem`s to compare with `currentMainArg.noteType` or `currentMainArg.index` based on the item type. - Updated `onClick` handlers to pass `MainData` objects. - **`NoteApp.kt`**: - Updated the `currentMainArg` in `MainNavigation` to use `userData.mainData` directly, providing a `MainData()` default. --- .../playnotepad/MainActivityViewModel.kt | 3 ++- .../playnotepad/SharedActivityViewModel.kt | 2 +- .../playnotepad/ui/MainNavigatin.kt | 25 ++++++++++--------- .../com/mshdabiola/playnotepad/ui/NoteApp.kt | 2 +- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/mshdabiola/playnotepad/MainActivityViewModel.kt b/app/src/main/java/com/mshdabiola/playnotepad/MainActivityViewModel.kt index 9254b7ef..c1c906f4 100644 --- a/app/src/main/java/com/mshdabiola/playnotepad/MainActivityViewModel.kt +++ b/app/src/main/java/com/mshdabiola/playnotepad/MainActivityViewModel.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.viewModelScope import com.mshdabiola.data.repository.ILabelRepository import com.mshdabiola.data.repository.INotePadRepository import com.mshdabiola.data.repository.UserDataRepository +import com.mshdabiola.model.MainData import com.mshdabiola.model.NoteCheck import com.mshdabiola.model.NoteImage import com.mshdabiola.model.NotePad @@ -115,7 +116,7 @@ class MainActivityViewModel @Inject constructor( return notePadRepository.upsert(notePad) } - fun setMainData(mainData: Long) { + fun setMainData(mainData: MainData) { viewModelScope.launch { userDataRepository.setMainData(mainData) } diff --git a/app/src/main/java/com/mshdabiola/playnotepad/SharedActivityViewModel.kt b/app/src/main/java/com/mshdabiola/playnotepad/SharedActivityViewModel.kt index 50667fb0..f1b9475e 100644 --- a/app/src/main/java/com/mshdabiola/playnotepad/SharedActivityViewModel.kt +++ b/app/src/main/java/com/mshdabiola/playnotepad/SharedActivityViewModel.kt @@ -157,7 +157,7 @@ sealed interface SharedActivityUiState { useDynamicColor = false, shouldHideOnboarding = false, contrast = Contrast.High, - mainData = MainData.Note, + mainData = MainData(), ), val notepad: NotePad = NotePad(), val labels: List