Skip to content

Commit

Permalink
Add setting in settings screen to toggle mark as read type
Browse files Browse the repository at this point in the history
  • Loading branch information
msasikanth committed Feb 28, 2025
1 parent c68aa10 commit 67afa7b
Show file tree
Hide file tree
Showing 8 changed files with 125 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -179,4 +179,7 @@ val DeTwineStrings =
blockedWordsDesc =
"Post can be hidden from home screen based on their text. We recommend avoiding common words that appear in many posts, since it can result in no posts being shown or negatively impacting app performance. \n\nHidden posts will still be displayed in search & bookmarks.",
blockedWordsEmpty = "You haven't blocked any words yet",
markArticleAsRead = "Mark article as read",
markArticleAsReadOnOpen = "On Open",
markArticleAsReadOnScroll = "On Scroll",
)
Original file line number Diff line number Diff line change
Expand Up @@ -186,4 +186,7 @@ val EnTwineStrings =
blockedWordsDesc =
"Post can be hidden from the home screen based on their text. We recommend avoiding common words that appear in many posts, since it can result in no posts being shown or negatively impacting app performance. \n\nHidden posts will still be displayed in search & bookmarks.",
blockedWordsEmpty = "You haven't blocked any words yet",
markArticleAsRead = "Mark article as read",
markArticleAsReadOnOpen = "On Open",
markArticleAsReadOnScroll = "On Scroll",
)
Original file line number Diff line number Diff line change
Expand Up @@ -175,4 +175,7 @@ val TrTwineStrings =
blockedWordsDesc =
"Post can be hidden from the home screen based on their text. We recommend avoiding common words that appear in many posts, since it can result in no posts being shown or negatively impacting app performance. \n\nHidden posts will still be displayed in search & bookmarks.",
blockedWordsEmpty = "You haven't blocked any words yet",
markArticleAsRead = "Mark article as read",
markArticleAsReadOnOpen = "On Open",
markArticleAsReadOnScroll = "On Scroll",
)
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,9 @@ data class TwineStrings(
val blockedWordsHint: String,
val blockedWordsDesc: String,
val blockedWordsEmpty: String,
val markArticleAsRead: String,
val markArticleAsReadOnOpen: String,
val markArticleAsReadOnScroll: String,
)

object Locales {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,4 +166,7 @@ val ZhTwineStrings =
blockedWordsDesc =
"Post can be hidden from the home screen based on their text. We recommend avoiding common words that appear in many posts, since it can result in no posts being shown or negatively impacting app performance. \n\nHidden posts will still be displayed in search & bookmarks.",
blockedWordsEmpty = "You haven't blocked any words yet",
markArticleAsRead = "Mark article as read",
markArticleAsReadOnOpen = "On Open",
markArticleAsReadOnScroll = "On Scroll",
)
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package dev.sasikanth.rss.reader.settings

import dev.sasikanth.rss.reader.data.repository.AppThemeMode
import dev.sasikanth.rss.reader.data.repository.BrowserType
import dev.sasikanth.rss.reader.data.repository.MarkAsReadOn
import dev.sasikanth.rss.reader.data.repository.Period

sealed interface SettingsEvent {
Expand Down Expand Up @@ -46,4 +47,6 @@ sealed interface SettingsEvent {
data class OnAppThemeModeChanged(val appThemeMode: AppThemeMode) : SettingsEvent

data object BlockedWordsClicked : SettingsEvent

data class MarkAsReadOnChanged(val newMarkAsReadOn: MarkAsReadOn) : SettingsEvent
}
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ class SettingsPresenter(
appThemeMode = settings.appThemeMode,
enableAutoSync = settings.enableAutoSync,
showFeedFavIcon = settings.showFeedFavIcon,
markAsReadOn = settings.markAsReadOn,
markAsReadOn = settings.markAsReadOn
)
}
}
Expand Down Expand Up @@ -184,9 +184,14 @@ class SettingsPresenter(
SettingsEvent.BlockedWordsClicked -> {
// no-op
}
is SettingsEvent.MarkAsReadOnChanged -> markAsReadOnChanged(event.newMarkAsReadOn)
}
}

private fun markAsReadOnChanged(markAsReadOn: MarkAsReadOn) {
coroutineScope.launch { settingsRepository.updateMarkAsReadOn(markAsReadOn) }
}

private fun toggleShowFeedFavIcon(value: Boolean) {
coroutineScope.launch { settingsRepository.toggleShowFeedFavIcon(value) }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ import dev.sasikanth.rss.reader.components.ToggleableButtonItem
import dev.sasikanth.rss.reader.components.image.AsyncImage
import dev.sasikanth.rss.reader.data.repository.AppThemeMode
import dev.sasikanth.rss.reader.data.repository.BrowserType
import dev.sasikanth.rss.reader.data.repository.MarkAsReadOn
import dev.sasikanth.rss.reader.data.repository.Period
import dev.sasikanth.rss.reader.data.repository.Period.ONE_MONTH
import dev.sasikanth.rss.reader.data.repository.Period.ONE_WEEK
Expand Down Expand Up @@ -248,6 +249,14 @@ internal fun SettingsScreen(

item { Divider(24.dp) }

item {
MarkArticleAsReadOnSetting(articleMarkAsReadOn = state.markAsReadOn) {
settingsPresenter.dispatch(SettingsEvent.MarkAsReadOnChanged(it))
}
}

item { Divider(24.dp) }

item {
PostsDeletionPeriodSettingItem(
postsDeletionPeriod = state.postsDeletionPeriod,
Expand Down Expand Up @@ -301,6 +310,98 @@ internal fun SettingsScreen(
)
}

@Composable
private fun MarkArticleAsReadOnSetting(
articleMarkAsReadOn: MarkAsReadOn,
onMarkAsReadOnChanged: (MarkAsReadOn) -> Unit
) {
var showDropdown by remember { mutableStateOf(false) }

Row(
modifier = Modifier.padding(horizontal = 24.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
modifier = Modifier.weight(1f),
text = LocalStrings.current.markArticleAsRead,
style = MaterialTheme.typography.titleMedium,
color = AppTheme.colorScheme.textEmphasisHigh
)

Box {
val density = LocalDensity.current
var buttonHeight by remember { mutableStateOf(Dp.Unspecified) }

TextButton(
modifier =
Modifier.onGloballyPositioned { coordinates ->
buttonHeight = with(density) { coordinates.size.height.toDp() }
},
onClick = { showDropdown = true },
shape = MaterialTheme.shapes.medium
) {
val markAsReadOnLabel =
when (articleMarkAsReadOn) {
MarkAsReadOn.Open -> LocalStrings.current.markArticleAsReadOnOpen
MarkAsReadOn.Scroll -> LocalStrings.current.markArticleAsReadOnScroll
}

Text(
text = markAsReadOnLabel,
style = MaterialTheme.typography.labelLarge,
color = AppTheme.colorScheme.tintedForeground
)

Spacer(Modifier.requiredWidth(8.dp))

Icon(
imageVector = Icons.Filled.ExpandMore,
contentDescription = null,
tint = AppTheme.colorScheme.tintedForeground
)
}

DropdownMenu(
offset = DpOffset(0.dp, buttonHeight.unaryMinus()),
expanded = showDropdown,
onDismissRequest = { showDropdown = false },
) {
MarkAsReadOn.entries.forEach { markAsReadOn ->
val label =
when (markAsReadOn) {
MarkAsReadOn.Open -> LocalStrings.current.markArticleAsReadOnOpen
MarkAsReadOn.Scroll -> LocalStrings.current.markArticleAsReadOnScroll
}

val backgroundColor =
if (markAsReadOn == articleMarkAsReadOn) {
AppTheme.colorScheme.tintedHighlight
} else {
Color.Unspecified
}

DropdownMenuItem(
onClick = {
onMarkAsReadOnChanged(markAsReadOn)
showDropdown = false
},
modifier = Modifier.background(backgroundColor)
) {
val textColor =
if (markAsReadOn == articleMarkAsReadOn) {
AppTheme.colorScheme.onSurface
} else {
AppTheme.colorScheme.textEmphasisHigh
}

Text(text = label, style = MaterialTheme.typography.bodyLarge, color = textColor)
}
}
}
}
}
}

@Composable
private fun BlockedWordsSettingItem(onClick: () -> Unit) {
Row(
Expand Down

0 comments on commit 67afa7b

Please sign in to comment.