Skip to content

Commit 4241163

Browse files
committed
Enable 'next article'
1 parent fa21f8f commit 4241163

5 files changed

Lines changed: 36 additions & 1 deletion

File tree

app/src/main/java/me/ash/reader/data/dao/ArticleDao.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,18 @@ interface ArticleDao {
518518
)
519519
suspend fun queryById(id: String): ArticleWithFeed?
520520

521+
@Transaction
522+
@Query(
523+
"""
524+
SELECT * FROM article
525+
WHERE feedId = :feedId
526+
AND isUnread = :isUnread
527+
AND date <= :date
528+
ORDER BY date DESC LIMIT 1
529+
"""
530+
)
531+
suspend fun queryNextByDate(feedId: String, date: Date, isUnread: Boolean): ArticleWithFeed?
532+
521533
@Insert
522534
suspend fun insertList(articles: List<Article>): List<Long>
523535

app/src/main/java/me/ash/reader/data/repository/AbstractRssRepository.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ abstract class AbstractRssRepository constructor(
127127

128128
suspend fun findArticleById(id: String): ArticleWithFeed? = articleDao.queryById(id)
129129

130+
suspend fun findNextArticleByDate(feedId: String, date: Date): ArticleWithFeed? =
131+
articleDao.queryNextByDate(feedId, date, true)
132+
130133
suspend fun isFeedExist(url: String): Boolean = feedDao.queryByLink(context.currentAccountId, url).isNotEmpty()
131134

132135
suspend fun updateGroup(group: Group) {

app/src/main/java/me/ash/reader/ui/page/home/reading/BottomBar.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ fun BottomBar(
3333
isFullContent: Boolean,
3434
onUnread: (isUnread: Boolean) -> Unit = {},
3535
onStarred: (isStarred: Boolean) -> Unit = {},
36+
onNextArticle: () -> Unit = {},
3637
onFullContent: (isFullContent: Boolean) -> Unit = {},
3738
) {
3839
val tonalElevation = LocalReadingPageTonalElevation.current
@@ -95,13 +96,14 @@ fun BottomBar(
9596
onStarred(!isStarred)
9697
}
9798
CanBeDisabledIconButton(
98-
disabled = true,
99+
disabled = false,
99100
modifier = Modifier.size(40.dp),
100101
imageVector = Icons.Rounded.ExpandMore,
101102
contentDescription = "Next Article",
102103
tint = MaterialTheme.colorScheme.outline,
103104
) {
104105
view.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP)
106+
onNextArticle()
105107
}
106108
CanBeDisabledIconButton(
107109
modifier = Modifier.size(36.dp),

app/src/main/java/me/ash/reader/ui/page/home/reading/ReadingPage.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ fun ReadingPage(
9090
onStarred = {
9191
readingViewModel.markStarred(it)
9292
},
93+
onNextArticle = {
94+
readingViewModel.nextArticle(navController)
95+
},
9396
onFullContent = {
9497
if (it) readingViewModel.renderFullContent()
9598
else readingViewModel.renderDescriptionContent()

app/src/main/java/me/ash/reader/ui/page/home/reading/ReadingViewModel.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.util.Log
44
import androidx.compose.foundation.lazy.LazyListState
55
import androidx.lifecycle.ViewModel
66
import androidx.lifecycle.viewModelScope
7+
import androidx.navigation.NavController
78
import dagger.hilt.android.lifecycle.HiltViewModel
89
import kotlinx.coroutines.Dispatchers
910
import kotlinx.coroutines.flow.MutableStateFlow
@@ -14,6 +15,7 @@ import kotlinx.coroutines.launch
1415
import me.ash.reader.data.model.article.ArticleWithFeed
1516
import me.ash.reader.data.repository.RssHelper
1617
import me.ash.reader.data.repository.RssRepository
18+
import me.ash.reader.ui.page.common.RouteName
1719
import javax.inject.Inject
1820

1921
@HiltViewModel
@@ -114,6 +116,19 @@ class ReadingViewModel @Inject constructor(
114116
}
115117
}
116118

119+
fun nextArticle(navController: NavController) {
120+
val cur = _readingUiState.value.articleWithFeed?.article
121+
if (cur != null) {
122+
viewModelScope.launch {
123+
val next = rssRepository.get().findNextArticleByDate(cur.feedId, cur.date)
124+
navController.popBackStack()
125+
if (next != null) {
126+
navController.navigate("${RouteName.READING}/${next.article.id}")
127+
}
128+
}
129+
}
130+
}
131+
117132
private fun showLoading() {
118133
_readingUiState.update {
119134
it.copy(isLoading = true)

0 commit comments

Comments
 (0)