Skip to content

Commit 294601e

Browse files
authored
Merge pull request #6 from VladShurakov/fix-issue-5
Solve issue #5
2 parents b602f71 + 484e7d7 commit 294601e

File tree

90 files changed

+2953
-152
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+2953
-152
lines changed

.idea/deploymentTargetDropDown.xml

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,7 @@ Go to [Releases](https://github.com/VladShurakov/JetNotesApp/releases) to downlo
3434
- DataBase: Room
3535

3636
## Contribute
37-
**Want to contribute?** See **[CONTRIBUTING.md](/CONTRIBUTING.md)**
38-
39-
## Contributors Wall
40-
41-
<a href="https://github.com/VladShurakov/JetNotesApp/graphs/contributors">
42-
<img src="https://contrib.rocks/image?repo=VladShurakov/JetNotesApp" />
43-
</a>
37+
See **[CONTRIBUTING.md](/CONTRIBUTING.md)** before contributing
4438

4539
## :page_facing_up: License
4640

app/build.gradle.kts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ android {
1313
applicationId = "com.vladshurakov.jetnotesapp"
1414
minSdk = 26
1515
targetSdk = 34
16-
versionCode = 2
17-
versionName = "1.0.0"
16+
versionCode = 3
17+
versionName = "1.1.0"
18+
resourceConfigurations += listOf("en")
1819

19-
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
20-
vectorDrawables { useSupportLibrary = true }
20+
vectorDrawables {
21+
useSupportLibrary = true
22+
}
2123
}
2224

2325
buildTypes {
@@ -71,17 +73,11 @@ dependencies {
7173

7274
implementation("androidx.core:core-ktx:1.12.0")
7375
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
74-
implementation("androidx.activity:activity-compose:1.8.0")
76+
implementation("androidx.activity:activity-compose:1.8.1")
7577
implementation(platform("androidx.compose:compose-bom:2023.10.01"))
7678
implementation("androidx.compose.ui:ui:1.5.4")
7779
implementation("androidx.compose.ui:ui-graphics:1.5.4")
7880
implementation("androidx.compose.ui:ui-tooling-preview:1.5.4")
7981
implementation("androidx.compose.material3:material3:1.1.2")
80-
testImplementation("junit:junit:4.13.2")
81-
androidTestImplementation("androidx.test.ext:junit:1.1.5")
82-
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
8382
androidTestImplementation(platform("androidx.compose:compose-bom:2023.10.01"))
84-
androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.5.4")
85-
debugImplementation("androidx.compose.ui:ui-tooling:1.5.4")
86-
debugImplementation("androidx.compose.ui:ui-test-manifest:1.5.4")
8783
}

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
android:theme="@style/Theme.Notes"
1414
tools:targetApi="33">
1515
<activity
16-
android:name=".ui.screens.MainActivity"
16+
android:name=".MainActivity"
1717
android:windowSoftInputMode="adjustResize"
1818
android:exported="true"
1919
android:theme="@style/Theme.Notes"
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.vladshurakov.jetnotesapp
2+
3+
import android.os.Bundle
4+
import androidx.activity.ComponentActivity
5+
import androidx.activity.compose.setContent
6+
import androidx.compose.animation.EnterTransition
7+
import androidx.compose.animation.ExitTransition
8+
import androidx.compose.foundation.isSystemInDarkTheme
9+
import androidx.compose.runtime.SideEffect
10+
import androidx.compose.runtime.getValue
11+
import androidx.compose.runtime.mutableStateOf
12+
import androidx.compose.runtime.remember
13+
import androidx.compose.runtime.setValue
14+
import androidx.hilt.navigation.compose.hiltViewModel
15+
import androidx.navigation.NavType
16+
import androidx.navigation.compose.NavHost
17+
import androidx.navigation.compose.composable
18+
import androidx.navigation.compose.rememberNavController
19+
import androidx.navigation.navArgument
20+
import com.google.accompanist.systemuicontroller.rememberSystemUiController
21+
import com.vladshurakov.jetnotesapp.feature_notes.presenter.screen.EditScreen
22+
import com.vladshurakov.jetnotesapp.feature_notes.presenter.screen.ArchivedScreen
23+
import com.vladshurakov.jetnotesapp.feature_notes.presenter.screen.DeletedScreen
24+
import com.vladshurakov.jetnotesapp.feature_notes.presenter.screen.NotesScreen
25+
import com.vladshurakov.jetnotesapp.feature_settings.presenter.screen.SettingsScreen
26+
import com.vladshurakov.jetnotesapp.feature_settings.presenter.viewmodel.SettingsEvent
27+
import com.vladshurakov.jetnotesapp.feature_settings.presenter.viewmodel.SettingsViewModel
28+
import com.vladshurakov.jetnotesapp.theme.JetNotesTheme
29+
import com.vladshurakov.jetnotesapp.theme.darkPalette
30+
import com.vladshurakov.jetnotesapp.theme.lightPalette
31+
import com.vladshurakov.jetnotesapp.util.JetNotesTheme.Dark
32+
import com.vladshurakov.jetnotesapp.util.JetNotesTheme.Default
33+
import com.vladshurakov.jetnotesapp.util.Screen
34+
import dagger.hilt.android.AndroidEntryPoint
35+
36+
@AndroidEntryPoint
37+
class MainActivity : ComponentActivity() {
38+
override fun onCreate(savedInstanceState: Bundle?) {
39+
super.onCreate(savedInstanceState)
40+
setContent {
41+
val settingsViewModel = hiltViewModel<SettingsViewModel>()
42+
var settingsBundle by remember {
43+
mutableStateOf(settingsViewModel.settingsBundle.value)
44+
}
45+
46+
// System Theme if theme by Default
47+
if (settingsBundle.theme == Default) {
48+
settingsBundle = settingsBundle.copy(isDarkMode = isSystemInDarkTheme())
49+
}
50+
51+
JetNotesTheme(settingsBundle = settingsBundle) {
52+
val navController = rememberNavController()
53+
val systemUiController = rememberSystemUiController()
54+
55+
// Set status bar color
56+
SideEffect {
57+
systemUiController.setSystemBarsColor(
58+
color = when {
59+
settingsBundle.isDarkMode || settingsBundle.theme == Dark -> darkPalette.primaryBackground
60+
else -> lightPalette.primaryBackground
61+
}
62+
)
63+
}
64+
65+
NavHost(
66+
navController = navController,
67+
startDestination = Screen.Notes.route,
68+
enterTransition = { EnterTransition.None },
69+
exitTransition = { ExitTransition.None }
70+
) {
71+
composable(route = Screen.Notes.route) {
72+
NotesScreen(navController = navController)
73+
}
74+
75+
composable(
76+
route = Screen.AddEditNote.route + "?id={id}",
77+
arguments = listOf(navArgument("id") {
78+
type = NavType.LongType; defaultValue = -1
79+
})
80+
) {
81+
EditScreen(navController = navController)
82+
}
83+
84+
composable(route = Screen.DeletedNotes.route) {
85+
DeletedScreen(navController = navController)
86+
}
87+
88+
composable(route = Screen.ArchivedNotes.route) {
89+
ArchivedScreen(navController = navController)
90+
}
91+
92+
composable(route = Screen.Settings.route) {
93+
SettingsScreen(
94+
navController = navController,
95+
settingsBundle = settingsBundle,
96+
onSettingsChanged = { newSettingsBundle ->
97+
settingsBundle = newSettingsBundle
98+
settingsViewModel.onEvent(SettingsEvent.SaveSettings(settingsBundle))
99+
}
100+
)
101+
}
102+
}
103+
}
104+
}
105+
}
106+
}

app/src/main/java/com/vladshurakov/jetnotesapp/di/AppModule.kt

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,22 @@ package com.vladshurakov.jetnotesapp.di
22

33
import android.content.Context
44
import androidx.room.Room
5-
import com.vladshurakov.jetnotesapp.data.database.NoteDatabase
6-
import com.vladshurakov.jetnotesapp.data.repository.NoteRepositoryImpl
7-
import com.vladshurakov.jetnotesapp.data.repository.SettingsRepositoryImpl
8-
import com.vladshurakov.jetnotesapp.domain.repository.NoteRepository
9-
import com.vladshurakov.jetnotesapp.domain.repository.SettingsRepository
10-
import com.vladshurakov.jetnotesapp.domain.usecase.DeleteNote
11-
import com.vladshurakov.jetnotesapp.domain.usecase.GetNoteById
12-
import com.vladshurakov.jetnotesapp.domain.usecase.GetNotes
13-
import com.vladshurakov.jetnotesapp.domain.usecase.GetSettings
14-
import com.vladshurakov.jetnotesapp.domain.usecase.InsertNote
15-
import com.vladshurakov.jetnotesapp.domain.usecase.SaveSettings
16-
import com.vladshurakov.jetnotesapp.domain.usecase.UseCases
5+
import com.vladshurakov.jetnotesapp.feature_notes.data.data_source.NoteDatabase
6+
import com.vladshurakov.jetnotesapp.feature_notes.data.repository.NotesRepositoryImpl
7+
import com.vladshurakov.jetnotesapp.feature_notes.domain.repository.NotesRepository
8+
import com.vladshurakov.jetnotesapp.feature_notes.domain.usecase.DeleteNote
9+
import com.vladshurakov.jetnotesapp.feature_notes.domain.usecase.GetNote
10+
import com.vladshurakov.jetnotesapp.feature_notes.domain.usecase.GetNotes
11+
import com.vladshurakov.jetnotesapp.feature_notes.domain.usecase.InsertNote
12+
import com.vladshurakov.jetnotesapp.feature_notes.domain.usecase.MoveNoteToFolder
13+
import com.vladshurakov.jetnotesapp.feature_notes.domain.usecase.NotesUseCases
14+
import com.vladshurakov.jetnotesapp.feature_notes.domain.usecase.SearchNotes
15+
import com.vladshurakov.jetnotesapp.feature_notes.domain.usecase.UpdatePinned
16+
import com.vladshurakov.jetnotesapp.feature_settings.data.repository.SettingsRepositoryImpl
17+
import com.vladshurakov.jetnotesapp.feature_settings.domain.repository.SettingsRepository
18+
import com.vladshurakov.jetnotesapp.feature_settings.domain.usecase.GetSettings
19+
import com.vladshurakov.jetnotesapp.feature_settings.domain.usecase.SaveSettings
20+
import com.vladshurakov.jetnotesapp.feature_settings.domain.usecase.SettingsUseCases
1721
import dagger.Module
1822
import dagger.Provides
1923
import dagger.hilt.InstallIn
@@ -27,6 +31,7 @@ object AppModule {
2731

2832
@Provides
2933
@Singleton
34+
fun provideNoteDatabase(@ApplicationContext context: Context): NoteDatabase {
3035
fun provideNoteDatabase(@ApplicationContext context: Context): NoteDatabase{
3136
return Room.databaseBuilder(
3237
context = context,
@@ -37,8 +42,22 @@ object AppModule {
3742

3843
@Provides
3944
@Singleton
40-
fun provideNoteRepository(database: NoteDatabase): NoteRepository {
41-
return NoteRepositoryImpl(noteDao = database.noteDao)
45+
fun provideNoteRepository(database: NoteDatabase): NotesRepository {
46+
return NotesRepositoryImpl(noteDao = database.noteDao)
47+
}
48+
49+
@Provides
50+
@Singleton
51+
fun provideNotesUseCases(notesRepository: NotesRepository): NotesUseCases {
52+
return NotesUseCases(
53+
insertNote = InsertNote(notesRepository),
54+
getNote = GetNote(notesRepository),
55+
deleteNote = DeleteNote(notesRepository),
56+
moveTo = MoveNoteToFolder(notesRepository),
57+
updatePinned = UpdatePinned(notesRepository),
58+
getNotes = GetNotes(notesRepository),
59+
searchNotes = SearchNotes(notesRepository)
60+
)
4261
}
4362

4463
@Provides
@@ -49,15 +68,10 @@ object AppModule {
4968

5069
@Provides
5170
@Singleton
52-
fun provideUseCases(noteRepository: NoteRepository, settingsRepository: SettingsRepository): UseCases{
53-
return UseCases(
54-
insertNote = InsertNote(repository = noteRepository),
55-
getNoteById = GetNoteById(repository = noteRepository),
56-
deleteNote = DeleteNote(repository = noteRepository),
57-
getNotes = GetNotes(repository = noteRepository),
71+
fun provideSettingsUseCases(settingsRepository: SettingsRepository): SettingsUseCases {
72+
return SettingsUseCases(
5873
getSettings = GetSettings(repository = settingsRepository),
5974
saveSettings = SaveSettings(repository = settingsRepository),
60-
)
75+
)
6176
}
62-
6377
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.vladshurakov.jetnotesapp.feature_notes.data.data_source
2+
3+
import androidx.room.Dao
4+
import androidx.room.Delete
5+
import androidx.room.Insert
6+
import androidx.room.OnConflictStrategy
7+
import androidx.room.Query
8+
import com.vladshurakov.jetnotesapp.feature_notes.domain.models.Folder
9+
import com.vladshurakov.jetnotesapp.feature_notes.domain.models.NoteEntity
10+
import kotlinx.coroutines.flow.Flow
11+
12+
@Dao
13+
interface NoteDao {
14+
@Insert(onConflict = OnConflictStrategy.REPLACE)
15+
suspend fun insert(noteEntity: NoteEntity): Long
16+
17+
@Query("SELECT * FROM note WHERE id = :id")
18+
suspend fun get(id: Long): NoteEntity?
19+
20+
@Delete
21+
suspend fun delete(noteEntity: NoteEntity)
22+
23+
@Query("UPDATE Note SET folder = :folder WHERE id = :id")
24+
suspend fun moveTo(id: Long, folder: Folder)
25+
26+
@Query("UPDATE Note SET pinned = :pinned WHERE id = :id")
27+
suspend fun updatePinned(id: Long, pinned: Boolean)
28+
29+
@Query("SELECT * FROM note ORDER BY pinned DESC, timestamp DESC")
30+
fun getDesc(): Flow<List<NoteEntity>>
31+
32+
@Query("SELECT * FROM note ORDER BY pinned ASC, timestamp ASC")
33+
fun getAsc(): Flow<List<NoteEntity>>
34+
35+
@Query("SELECT * FROM note WHERE (title LIKE '%' || :query || '%' OR content LIKE '%' || :query || '%') ORDER BY pinned DESC, timestamp DESC")
36+
fun getDesc(query: String): Flow<List<NoteEntity>>
37+
38+
@Query("SELECT * FROM note WHERE (title LIKE '%' || :query || '%' OR content LIKE '%' || :query || '%') ORDER BY pinned ASC, timestamp ASC")
39+
fun getAsc(query: String): Flow<List<NoteEntity>>
40+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.vladshurakov.jetnotesapp.feature_notes.data.data_source
2+
3+
import androidx.room.Database
4+
import androidx.room.RoomDatabase
5+
import com.vladshurakov.jetnotesapp.feature_notes.domain.models.NoteEntity
6+
7+
@Database(
8+
entities = [NoteEntity::class],
9+
version = 2,
10+
exportSchema = false
11+
)
12+
abstract class NoteDatabase : RoomDatabase() {
13+
14+
abstract val noteDao: NoteDao
15+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.vladshurakov.jetnotesapp.feature_notes.data.repository
2+
3+
import com.vladshurakov.jetnotesapp.feature_notes.data.data_source.NoteDao
4+
import com.vladshurakov.jetnotesapp.feature_notes.domain.models.Folder
5+
import com.vladshurakov.jetnotesapp.feature_notes.domain.models.Note
6+
import com.vladshurakov.jetnotesapp.feature_notes.domain.models.toNote
7+
import com.vladshurakov.jetnotesapp.feature_notes.domain.models.toNoteEntity
8+
import com.vladshurakov.jetnotesapp.feature_notes.domain.repository.NotesRepository
9+
import kotlinx.coroutines.flow.Flow
10+
import kotlinx.coroutines.flow.map
11+
12+
class NotesRepositoryImpl(private val noteDao: NoteDao) : NotesRepository {
13+
override suspend fun insert(note: Note): Long {
14+
15+
return noteDao.insert(note.toNoteEntity())
16+
}
17+
18+
override suspend fun get(id: Long): Note? {
19+
return noteDao.get(id)?.toNote()
20+
}
21+
22+
override suspend fun delete(note: Note) {
23+
noteDao.delete(note.toNoteEntity())
24+
}
25+
26+
override suspend fun moveTo(id: Long, folder: Folder) {
27+
noteDao.moveTo(id, folder)
28+
}
29+
30+
override suspend fun updatePinned(id: Long, pinned: Boolean) {
31+
noteDao.updatePinned(id, pinned)
32+
}
33+
34+
override fun getDesc(): Flow<List<Note>> {
35+
return noteDao.getDesc().map { listOfNoteEntity ->
36+
listOfNoteEntity.map { noteEntity ->
37+
noteEntity.toNote()
38+
}
39+
}
40+
}
41+
42+
override fun getAsc(): Flow<List<Note>> {
43+
return noteDao.getAsc().map { listOfNoteEntity ->
44+
listOfNoteEntity.map { noteEntity ->
45+
noteEntity.toNote()
46+
}
47+
}
48+
}
49+
50+
override fun getDesc(query: String): Flow<List<Note>> {
51+
return noteDao.getDesc(query).map { listOfNoteEntity ->
52+
listOfNoteEntity.map { noteEntity ->
53+
noteEntity.toNote()
54+
}
55+
}
56+
}
57+
58+
override fun getAsc(query: String): Flow<List<Note>> {
59+
return noteDao.getAsc(query).map { listOfNoteEntity ->
60+
listOfNoteEntity.map { noteEntity ->
61+
noteEntity.toNote()
62+
}
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)