Skip to content

Commit 3050c4d

Browse files
authored
Merge pull request #8 from VladShurakov/fix-issue-3
Fix issue 3
2 parents 2c8290d + 4fff753 commit 3050c4d

File tree

14 files changed

+98
-44
lines changed

14 files changed

+98
-44
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ android {
1313
applicationId = "com.vladshurakov.jetnotesapp"
1414
minSdk = 26
1515
targetSdk = 34
16-
versionCode = 4
17-
versionName = "1.1.1"
16+
versionCode = 5
17+
versionName = "1.1.2"
1818
resourceConfigurations += listOf("en")
1919

2020
vectorDrawables {

app/src/main/java/com/vladshurakov/jetnotesapp/feature_notes/data/data_source/NoteDao.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ interface NoteDao {
2929
@Query("SELECT * FROM note WHERE folder = :folder ORDER BY pinned DESC, timestamp DESC")
3030
fun getDesc(folder: Folder): Flow<List<NoteEntity>>
3131

32-
@Query("SELECT * FROM note WHERE folder = :folder ORDER BY pinned ASC, timestamp ASC")
32+
@Query("SELECT * FROM note WHERE folder = :folder ORDER BY pinned DESC, timestamp ASC")
3333
fun getAsc(folder: Folder): Flow<List<NoteEntity>>
3434

3535
@Query("SELECT * FROM note WHERE (title LIKE '%' || :query || '%' OR content LIKE '%' || :query || '%') ORDER BY pinned DESC, timestamp DESC")

app/src/main/java/com/vladshurakov/jetnotesapp/feature_notes/domain/usecase/UpdatePinned.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ package com.vladshurakov.jetnotesapp.feature_notes.domain.usecase
33
import com.vladshurakov.jetnotesapp.feature_notes.domain.repository.NotesRepository
44

55
class UpdatePinned(private val repository: NotesRepository) {
6-
suspend operator fun invoke(id: Long, pinned: Boolean) = repository.updatePinned(id, pinned)
6+
suspend operator fun invoke(id: Long, pinned: Boolean) = repository.updatePinned(id, !pinned)
77
}

app/src/main/java/com/vladshurakov/jetnotesapp/feature_notes/presenter/components/NoteView.kt

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,27 @@ import androidx.compose.foundation.layout.height
99
import androidx.compose.foundation.layout.padding
1010
import androidx.compose.material3.Button
1111
import androidx.compose.material3.ButtonDefaults
12+
import androidx.compose.material3.Icon
13+
import androidx.compose.material3.IconButton
1214
import androidx.compose.material3.Text
1315
import androidx.compose.runtime.Composable
16+
import androidx.compose.ui.Alignment
1417
import androidx.compose.ui.Modifier
1518
import androidx.compose.ui.graphics.Color
19+
import androidx.compose.ui.res.painterResource
1620
import androidx.compose.ui.res.stringResource
1721
import androidx.compose.ui.text.style.TextOverflow
1822
import androidx.compose.ui.unit.dp
1923
import com.vladshurakov.jetnotesapp.R
24+
import com.vladshurakov.jetnotesapp.feature_notes.domain.models.Note
2025
import com.vladshurakov.jetnotesapp.theme.MainTheme
2126
import org.ocpsoft.prettytime.PrettyTime
2227
import java.util.Date
2328

2429
@Composable
2530
fun NoteView(
26-
title: String = "ㅤ", content: String = "ㅤ", timestamp: Long = 0,
27-
onClick: () -> Unit = {}, color: Color = MainTheme.colors.secondaryBackground
31+
note: Note = Note(title = "ㅤ", content = "ㅤ", timestamp = 0), onClick: () -> Unit = {},
32+
onPin: (() -> Unit)? = null, color: Color = MainTheme.colors.secondaryBackground
2833
) {
2934
fun isContentBlank(content: String): Boolean = content.isBlank() || content.isEmpty()
3035

@@ -39,13 +44,15 @@ fun NoteView(
3944
.fillMaxWidth()
4045
.padding(vertical = 8.dp)
4146
) {
42-
Row {
47+
Row(
48+
verticalAlignment = Alignment.Top
49+
) {
4350
Column(
4451
modifier = Modifier.weight(1f)
4552
) {
4653

4754
Text(
48-
text = title,
55+
text = note.title,
4956
maxLines = 1,
5057
overflow = TextOverflow.Ellipsis,
5158
style = MainTheme.typography.title,
@@ -57,10 +64,10 @@ fun NoteView(
5764
Spacer(modifier = Modifier.height(6.dp))
5865

5966
Text(
60-
text = if (isContentBlank(content = content))
67+
text = if (isContentBlank(content = note.content))
6168
stringResource(id = R.string.hint_no_content)
6269
else
63-
content,
70+
note.content,
6471
maxLines = 1,
6572
style = MainTheme.typography.body,
6673
color = MainTheme.colors.secondaryTextColor
@@ -69,11 +76,26 @@ fun NoteView(
6976
Spacer(modifier = Modifier.height(6.dp))
7077

7178
Text(
72-
text = if (timestamp == 0.toLong()) " " else PrettyTime().format(Date(timestamp)),
79+
text = if (note.timestamp == 0.toLong()) " " else PrettyTime().format(Date(note.timestamp)),
7380
style = MainTheme.typography.caption,
7481
color = MainTheme.colors.secondaryTextColor
7582
)
83+
}
7684

85+
if (onPin != null){
86+
IconButton(
87+
onClick = (onPin)
88+
) {
89+
Icon(
90+
painter = painterResource(
91+
id = if (note.pinned) R.drawable.ic_pinned else R.drawable.ic_unpinned
92+
),
93+
contentDescription = stringResource(
94+
id = if (note.pinned) R.string.pinned else R.string.unpinned
95+
),
96+
tint = MainTheme.colors.invertColor
97+
)
98+
}
7799
}
78100
}
79101
}

app/src/main/java/com/vladshurakov/jetnotesapp/feature_notes/presenter/components/SwipeToDismissNote.kt

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,15 @@ import androidx.compose.ui.Modifier
1515
import androidx.compose.ui.graphics.Color
1616
import androidx.compose.ui.res.painterResource
1717
import androidx.compose.ui.unit.dp
18-
import androidx.navigation.NavController
1918
import com.vladshurakov.jetnotesapp.R
2019
import com.vladshurakov.jetnotesapp.feature_notes.domain.models.Note
2120
import com.vladshurakov.jetnotesapp.theme.MainTheme
22-
import com.vladshurakov.jetnotesapp.util.Screen
2321

2422
@OptIn(ExperimentalMaterial3Api::class)
2523
@Composable
2624
fun SwipeToDismissNote(
27-
dismissState: DismissState,
28-
@DrawableRes starDrawable: Int,
29-
note: Note,
30-
navController: NavController
25+
note: Note, onClick: () -> Unit = {}, onPin: (() -> Unit)? = null,
26+
dismissState: DismissState, @DrawableRes starDrawable: Int,
3127
) {
3228
SwipeToDismiss(
3329
state = dismissState,
@@ -66,14 +62,9 @@ fun SwipeToDismissNote(
6662
},
6763
dismissContent = {
6864
NoteView(
69-
title = note.title,
70-
content = note.content,
71-
timestamp = note.timestamp,
72-
onClick = {
73-
navController.navigate(
74-
Screen.AddEditNote.route + "?id=${note.id}"
75-
)
76-
}
65+
note = note,
66+
onClick = (onClick),
67+
onPin = (onPin)
7768
)
7869
}
7970
)

app/src/main/java/com/vladshurakov/jetnotesapp/feature_notes/presenter/screen/ArchivedScreen.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.vladshurakov.jetnotesapp.feature_notes.presenter.viewmodel.ArchivedVi
2323
import com.vladshurakov.jetnotesapp.feature_notes.presenter.viewmodel.events.ArchivedEvent
2424
import com.vladshurakov.jetnotesapp.feature_settings.presenter.components.ArchivedNotesTopBar
2525
import com.vladshurakov.jetnotesapp.theme.MainTheme
26+
import com.vladshurakov.jetnotesapp.util.Screen
2627

2728
@OptIn(ExperimentalMaterial3Api::class)
2829
@Composable
@@ -49,8 +50,8 @@ fun ArchivedScreen(
4950
items(
5051
items = archivedViewModel.state.value,
5152
key = { archivedNote -> archivedNote.id.hashCode() }
52-
) { archivedNotes ->
53-
val currentNote by rememberUpdatedState(archivedNotes)
53+
) { archivedNote ->
54+
val currentNote by rememberUpdatedState(archivedNote)
5455
val dismissState = rememberDismissState(
5556
confirmValueChange = {
5657
if (it == DismissValue.DismissedToStart) {
@@ -65,10 +66,12 @@ fun ArchivedScreen(
6566
)
6667

6768
SwipeToDismissNote(
69+
note = currentNote,
70+
onClick = {
71+
navController.navigate(Screen.AddEditNote.route + "?id=${currentNote.id}")
72+
},
6873
dismissState = dismissState,
6974
starDrawable = R.drawable.ic_unarchive,
70-
note = archivedNotes,
71-
navController = navController
7275
)
7376
}
7477
}

app/src/main/java/com/vladshurakov/jetnotesapp/feature_notes/presenter/screen/DeletedScreen.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.vladshurakov.jetnotesapp.feature_notes.presenter.viewmodel.events.Del
2626
import com.vladshurakov.jetnotesapp.feature_settings.presenter.components.DeleteAlertDialog
2727
import com.vladshurakov.jetnotesapp.feature_settings.presenter.components.DeletedNotesTopBar
2828
import com.vladshurakov.jetnotesapp.theme.MainTheme
29+
import com.vladshurakov.jetnotesapp.util.Screen
2930

3031
@OptIn(ExperimentalMaterial3Api::class)
3132
@Composable
@@ -84,10 +85,12 @@ fun DeletedScreen(
8485
)
8586

8687
SwipeToDismissNote(
88+
note = currentNote,
89+
onClick = {
90+
navController.navigate(Screen.AddEditNote.route + "?id=${currentNote.id}")
91+
},
8792
dismissState = dismissState,
8893
starDrawable = R.drawable.ic_restore,
89-
note = deletedNote,
90-
navController = navController
9194
)
9295
}
9396
}

app/src/main/java/com/vladshurakov/jetnotesapp/feature_notes/presenter/screen/NotesScreen.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import com.vladshurakov.jetnotesapp.feature_settings.presenter.components.NotesT
4242
import com.vladshurakov.jetnotesapp.theme.MainTheme
4343
import com.vladshurakov.jetnotesapp.util.Screen
4444

45-
@OptIn(ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class,)
45+
@OptIn(ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class)
4646
@Composable
4747
fun NotesScreen(
4848
navController: NavController, notesViewModel: NotesViewModel = hiltViewModel()
@@ -53,8 +53,9 @@ fun NotesScreen(
5353
Scaffold(
5454
topBar = {
5555
NotesTopBar(
56+
orderType = notesViewModel.notesState.value.orderType,
5657
onSort = {
57-
notesViewModel.onEvent(NotesEvent.ChangeOrderType)
58+
notesViewModel.onEvent(NotesEvent.ToggleOrderType)
5859
}
5960
) {
6061
navController.navigate(Screen.Settings.route)
@@ -146,8 +147,7 @@ fun NotesScreen(
146147
confirmValueChange = {
147148
if (it == DismissValue.DismissedToStart) {
148149
notesViewModel.onEvent(NotesEvent.Delete(currentNote))
149-
}
150-
else if (it == DismissValue.DismissedToEnd) {
150+
} else if (it == DismissValue.DismissedToEnd) {
151151
notesViewModel.onEvent(NotesEvent.Archive(currentNote))
152152
}
153153
true
@@ -156,10 +156,15 @@ fun NotesScreen(
156156
)
157157

158158
SwipeToDismissNote(
159+
note = currentNote,
160+
onClick = {
161+
navController.navigate(Screen.AddEditNote.route + "?id=${currentNote.id}")
162+
},
163+
onPin = {
164+
notesViewModel.onEvent(NotesEvent.TogglePin(currentNote))
165+
},
159166
dismissState = dismissState,
160167
starDrawable = R.drawable.ic_archive,
161-
note = note,
162-
navController = navController
163168
)
164169
}
165170
}

app/src/main/java/com/vladshurakov/jetnotesapp/feature_notes/presenter/viewmodel/NotesViewModel.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class NotesViewModel @Inject constructor(
4343

4444
fun onEvent(event: NotesEvent) {
4545
when (event) {
46-
NotesEvent.ChangeOrderType -> {
46+
NotesEvent.ToggleOrderType -> {
4747
_notesState.value.orderType = when (_notesState.value.orderType) {
4848
OrderType.Descending -> OrderType.Ascending
4949
OrderType.Ascending -> OrderType.Descending
@@ -88,6 +88,14 @@ class NotesViewModel @Inject constructor(
8888
notesUseCases.moveTo(event.note.id, Folder.ARCHIVED)
8989
}
9090
}
91+
92+
is NotesEvent.TogglePin -> {
93+
viewModelScope.launch {
94+
if (event.note.id == null)
95+
return@launch
96+
notesUseCases.updatePinned(event.note.id, event.note.pinned)
97+
}
98+
}
9199
}
92100
}
93101

app/src/main/java/com/vladshurakov/jetnotesapp/feature_notes/presenter/viewmodel/events/NotesEvent.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import com.vladshurakov.jetnotesapp.feature_notes.domain.models.Note
66
* Event for the Notes screen
77
*/
88
sealed interface NotesEvent {
9-
data object ChangeOrderType: NotesEvent
9+
data object ToggleOrderType: NotesEvent
10+
data class Archive(val note: Note): NotesEvent
1011
data class Delete(val note: Note): NotesEvent
1112
data object GetNotes : NotesEvent
1213
data class Search(val value: String): NotesEvent
13-
data class Archive(val note: Note): NotesEvent
14+
data class TogglePin(val note: Note): NotesEvent
1415
}

0 commit comments

Comments
 (0)