Skip to content

Commit

Permalink
[feature] Support managing subscription muting in a separate page (#84)
Browse files Browse the repository at this point in the history
  • Loading branch information
SkyD666 committed Feb 13, 2025
1 parent f205d1a commit 9f12a75
Show file tree
Hide file tree
Showing 21 changed files with 380 additions and 39 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ android {
minSdk = 24
targetSdk = 35
versionCode = 26
versionName = "3.1-alpha02"
versionName = "3.1-alpha03"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/skyd/anivu/ext/PreferenceExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import com.skyd.anivu.model.preference.appearance.feed.FeedDefaultGroupExpandPre
import com.skyd.anivu.model.preference.appearance.feed.FeedListTonalElevationPreference
import com.skyd.anivu.model.preference.appearance.feed.FeedNumberBadgePreference
import com.skyd.anivu.model.preference.appearance.feed.FeedTopBarTonalElevationPreference
import com.skyd.anivu.model.preference.appearance.feed.HideMutedFeedPreference
import com.skyd.anivu.model.preference.behavior.feed.HideMutedFeedPreference
import com.skyd.anivu.model.preference.appearance.media.MediaFileFilterPreference
import com.skyd.anivu.model.preference.appearance.media.MediaShowGroupTabPreference
import com.skyd.anivu.model.preference.appearance.media.MediaShowThumbnailPreference
Expand Down Expand Up @@ -93,7 +93,6 @@ fun Preferences.toSettings(): Settings {
readContentTonalElevation = ReadContentTonalElevationPreference.fromPreferences(this),
readTopBarTonalElevation = ReadTopBarTonalElevationPreference.fromPreferences(this),
feedNumberBadge = FeedNumberBadgePreference.fromPreferences(this),
hideMutedFeed = HideMutedFeedPreference.fromPreferences(this),

// Update
ignoreUpdateVersion = IgnoreUpdateVersionPreference.fromPreferences(this),
Expand All @@ -104,6 +103,7 @@ fun Preferences.toSettings(): Settings {
articleSwipeLeftAction = ArticleSwipeLeftActionPreference.fromPreferences(this),
articleSwipeRightAction = ArticleSwipeRightActionPreference.fromPreferences(this),
hideEmptyDefault = HideEmptyDefaultPreference.fromPreferences(this),
hideMutedFeed = HideMutedFeedPreference.fromPreferences(this),
pickImageMethod = PickImageMethodPreference.fromPreferences(this),
mediaFileFilter = MediaFileFilterPreference.fromPreferences(this),

Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/skyd/anivu/model/db/dao/FeedDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,10 @@ interface FeedDao {
@RawQuery(observedEntities = [FeedBean::class, ArticleBean::class])
fun getFeedList(sql: SupportSQLiteQuery): List<FeedViewBean>

@Transaction
@Query("SELECT * FROM $FEED_TABLE_NAME")
fun getAllFeedList(): Flow<List<FeedBean>>

@Transaction
@Query("SELECT ${FeedBean.URL_COLUMN} FROM $FEED_TABLE_NAME")
fun getAllFeedUrl(): List<String>
Expand Down
6 changes: 3 additions & 3 deletions app/src/main/java/com/skyd/anivu/model/preference/Settings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import com.skyd.anivu.model.preference.appearance.feed.FeedDefaultGroupExpandPre
import com.skyd.anivu.model.preference.appearance.feed.FeedListTonalElevationPreference
import com.skyd.anivu.model.preference.appearance.feed.FeedNumberBadgePreference
import com.skyd.anivu.model.preference.appearance.feed.FeedTopBarTonalElevationPreference
import com.skyd.anivu.model.preference.appearance.feed.HideMutedFeedPreference
import com.skyd.anivu.model.preference.behavior.feed.HideMutedFeedPreference
import com.skyd.anivu.model.preference.appearance.media.MediaFileFilterPreference
import com.skyd.anivu.model.preference.appearance.media.MediaShowGroupTabPreference
import com.skyd.anivu.model.preference.appearance.media.MediaShowThumbnailPreference
Expand Down Expand Up @@ -162,7 +162,6 @@ data class Settings(
val readContentTonalElevation: Float = ReadContentTonalElevationPreference.default,
val readTopBarTonalElevation: Float = ReadTopBarTonalElevationPreference.default,
val feedNumberBadge: Int = FeedNumberBadgePreference.default,
val hideMutedFeed: Boolean = HideMutedFeedPreference.default,
// Update
val ignoreUpdateVersion: Long = IgnoreUpdateVersionPreference.default,
// Behavior
Expand All @@ -171,6 +170,7 @@ data class Settings(
val articleSwipeLeftAction: String = ArticleSwipeLeftActionPreference.default,
val articleSwipeRightAction: String = ArticleSwipeRightActionPreference.default,
val hideEmptyDefault: Boolean = HideEmptyDefaultPreference.default,
val hideMutedFeed: Boolean = HideMutedFeedPreference.default,
val pickImageMethod: String = PickImageMethodPreference.default,
val mediaFileFilter: String = MediaFileFilterPreference.default,
// RSS
Expand Down Expand Up @@ -243,7 +243,6 @@ fun SettingsProvider(
LocalReadContentTonalElevation provides settings.readContentTonalElevation,
LocalReadTopBarTonalElevation provides settings.readTopBarTonalElevation,
LocalFeedNumberBadge provides settings.feedNumberBadge,
LocalHideMutedFeed provides settings.hideMutedFeed,
// Update
LocalIgnoreUpdateVersion provides settings.ignoreUpdateVersion,
// Behavior
Expand All @@ -252,6 +251,7 @@ fun SettingsProvider(
LocalArticleSwipeLeftAction provides settings.articleSwipeLeftAction,
LocalArticleSwipeRightAction provides settings.articleSwipeRightAction,
LocalHideEmptyDefault provides settings.hideEmptyDefault,
LocalHideMutedFeed provides settings.hideMutedFeed,
LocalPickImageMethod provides settings.pickImageMethod,
LocalMediaFileFilter provides settings.mediaFileFilter,
// rss
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.skyd.anivu.model.preference.appearance.feed
package com.skyd.anivu.model.preference.behavior.feed

import android.content.Context
import androidx.datastore.preferences.core.Preferences
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ import com.skyd.anivu.ext.dataStore
import com.skyd.anivu.ext.isLocal
import com.skyd.anivu.ext.isNetwork
import com.skyd.anivu.ext.put
import com.skyd.anivu.model.bean.feed.FeedBean
import com.skyd.anivu.model.bean.feed.FeedViewBean
import com.skyd.anivu.model.bean.group.GroupVo
import com.skyd.anivu.model.db.dao.ArticleDao
import com.skyd.anivu.model.db.dao.FeedDao
import com.skyd.anivu.model.db.dao.GroupDao
import com.skyd.anivu.model.preference.appearance.feed.FeedDefaultGroupExpandPreference
import com.skyd.anivu.model.preference.appearance.feed.HideMutedFeedPreference
import com.skyd.anivu.model.preference.behavior.feed.HideMutedFeedPreference
import com.skyd.anivu.model.repository.RssHelper
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
Expand Down Expand Up @@ -54,6 +55,10 @@ class FeedRepository @Inject constructor(
}
}.flowOn(Dispatchers.IO)

fun requestAllFeedList(): Flow<List<FeedBean>> = feedDao.getAllFeedList()
.map { list -> list.sortedBy { it.title } }
.flowOn(Dispatchers.IO)

fun clearGroupArticles(groupId: String): Flow<Int> = flow {
val realGroupId = if (groupId == GroupVo.DEFAULT_GROUP_ID) null else groupId
emit(articleDao.deleteArticlesInGroup(realGroupId))
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/com/skyd/anivu/ui/activity/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ import com.skyd.anivu.ui.screen.download.DOWNLOAD_SCREEN_DEEP_LINK_DATA
import com.skyd.anivu.ui.screen.download.DOWNLOAD_SCREEN_ROUTE
import com.skyd.anivu.ui.screen.download.DownloadScreen
import com.skyd.anivu.ui.screen.download.openDownloadScreen
import com.skyd.anivu.ui.screen.feed.mute.MUTE_FEED_SCREEN_ROUTE
import com.skyd.anivu.ui.screen.feed.mute.MuteFeedScreen
import com.skyd.anivu.ui.screen.feed.reorder.REORDER_GROUP_SCREEN_ROUTE
import com.skyd.anivu.ui.screen.feed.reorder.ReorderGroupScreen
import com.skyd.anivu.ui.screen.feed.requestheaders.FEED_URL_KEY
Expand Down Expand Up @@ -292,6 +294,7 @@ private fun MainNavHost() {
composable(route = PROXY_SCREEN_ROUTE) { ProxyScreen() }
composable(route = TRANSMISSION_SCREEN_ROUTE) { TransmissionScreen() }
composable(route = UPDATE_NOTIFICATION_SCREEN_ROUTE) { UpdateNotificationScreen() }
composable(route = MUTE_FEED_SCREEN_ROUTE) { MuteFeedScreen() }
composable(
route = "$REQUEST_HEADERS_SCREEN_ROUTE/{$FEED_URL_KEY}",
arguments = listOf(
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/skyd/anivu/ui/component/Placeholder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ fun EmptyPlaceholder(

@Composable
fun ErrorPlaceholder(
modifier: Modifier = Modifier,
text: String,
contentPadding: PaddingValues = PaddingValues(),
modifier: Modifier = Modifier,
) {
AnimatedPlaceholder(
modifier = modifier,
Expand Down Expand Up @@ -99,8 +99,8 @@ fun WithTextPlaceholder(

@Composable
fun CircularProgressPlaceholder(
modifier: Modifier = Modifier,
contentPadding: PaddingValues = PaddingValues(),
modifier: Modifier = Modifier,
) {
BasePlaceholder(
modifier = modifier,
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/skyd/anivu/ui/local/LocalValue.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import com.skyd.anivu.model.preference.appearance.feed.FeedDefaultGroupExpandPre
import com.skyd.anivu.model.preference.appearance.feed.FeedListTonalElevationPreference
import com.skyd.anivu.model.preference.appearance.feed.FeedNumberBadgePreference
import com.skyd.anivu.model.preference.appearance.feed.FeedTopBarTonalElevationPreference
import com.skyd.anivu.model.preference.appearance.feed.HideMutedFeedPreference
import com.skyd.anivu.model.preference.behavior.feed.HideMutedFeedPreference
import com.skyd.anivu.model.preference.appearance.media.MediaFileFilterPreference
import com.skyd.anivu.model.preference.appearance.media.MediaShowGroupTabPreference
import com.skyd.anivu.model.preference.appearance.media.MediaShowThumbnailPreference
Expand Down Expand Up @@ -109,7 +109,6 @@ val LocalReadContentTonalElevation =
val LocalReadTopBarTonalElevation =
compositionLocalOf { ReadTopBarTonalElevationPreference.default }
val LocalFeedNumberBadge = compositionLocalOf { FeedNumberBadgePreference.default }
val LocalHideMutedFeed = compositionLocalOf { HideMutedFeedPreference.default }

// Update
val LocalIgnoreUpdateVersion = compositionLocalOf { IgnoreUpdateVersionPreference.default }
Expand All @@ -120,6 +119,7 @@ val LocalArticleTapAction = compositionLocalOf { ArticleTapActionPreference.defa
val LocalArticleSwipeLeftAction = compositionLocalOf { ArticleSwipeLeftActionPreference.default }
val LocalArticleSwipeRightAction = compositionLocalOf { ArticleSwipeRightActionPreference.default }
val LocalHideEmptyDefault = compositionLocalOf { HideEmptyDefaultPreference.default }
val LocalHideMutedFeed = compositionLocalOf { HideMutedFeedPreference.default }
val LocalPickImageMethod = compositionLocalOf { PickImageMethodPreference.default }
val LocalMediaFileFilter = compositionLocalOf { MediaFileFilterPreference.default }

Expand Down
15 changes: 15 additions & 0 deletions app/src/main/java/com/skyd/anivu/ui/screen/feed/FeedScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import androidx.compose.foundation.lazy.grid.itemsIndexed
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.Article
import androidx.compose.material.icons.automirrored.outlined.Sort
import androidx.compose.material.icons.automirrored.outlined.VolumeOff
import androidx.compose.material.icons.outlined.Add
import androidx.compose.material.icons.outlined.MoreVert
import androidx.compose.material.icons.outlined.RssFeed
Expand Down Expand Up @@ -90,6 +91,7 @@ import com.skyd.anivu.ui.screen.article.ArticleScreen
import com.skyd.anivu.ui.screen.article.openArticleScreen
import com.skyd.anivu.ui.screen.feed.item.Feed1Item
import com.skyd.anivu.ui.screen.feed.item.Group1Item
import com.skyd.anivu.ui.screen.feed.mute.MUTE_FEED_SCREEN_ROUTE
import com.skyd.anivu.ui.screen.feed.reorder.REORDER_GROUP_SCREEN_ROUTE
import com.skyd.anivu.ui.screen.search.SearchDomain
import com.skyd.anivu.ui.screen.search.openSearchScreen
Expand Down Expand Up @@ -657,6 +659,19 @@ private fun MoreMenu(
navController.navigate(REORDER_GROUP_SCREEN_ROUTE)
},
)
DropdownMenuItem(
text = { Text(text = stringResource(R.string.mute_feed_screen_name)) },
leadingIcon = {
Icon(
imageVector = Icons.AutoMirrored.Outlined.VolumeOff,
contentDescription = null,
)
},
onClick = {
onDismissRequest()
navController.navigate(MUTE_FEED_SCREEN_ROUTE)
},
)
DropdownMenuItem(
text = { Text(text = stringResource(R.string.feed_style_screen_name)) },
onClick = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.skyd.anivu.ui.screen.feed.mute

import com.skyd.anivu.base.mvi.MviSingleEvent

sealed interface MuteFeedEvent : MviSingleEvent {
sealed interface MuteResultEvent : MuteFeedEvent {
data class Failed(val msg: String) : MuteResultEvent
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.skyd.anivu.ui.screen.feed.mute

import com.skyd.anivu.base.mvi.MviIntent

sealed interface MuteFeedIntent : MviIntent {
data object Init : MuteFeedIntent
data class Mute(val feedUrl: String, val mute: Boolean) : MuteFeedIntent
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.skyd.anivu.ui.screen.feed.mute

import com.skyd.anivu.model.bean.feed.FeedBean


internal sealed interface MuteFeedPartialStateChange {
fun reduce(oldState: MuteFeedState): MuteFeedState

sealed interface LoadingDialog : MuteFeedPartialStateChange {
data object Show : LoadingDialog {
override fun reduce(oldState: MuteFeedState) = oldState.copy(loadingDialog = true)
}
}

sealed interface Init : MuteFeedPartialStateChange {
override fun reduce(oldState: MuteFeedState): MuteFeedState {
return when (this) {
is Failed -> oldState.copy(loadingDialog = false)
is Success -> oldState.copy(
listState = MuteFeedState.ListState.Success(feeds),
loadingDialog = false,
)
}
}

data class Success(val feeds: List<FeedBean>) : Init
data class Failed(val msg: String) : Init
}

sealed interface Mute : MuteFeedPartialStateChange {
override fun reduce(oldState: MuteFeedState): MuteFeedState {
return when (this) {
is Failed -> oldState.copy(loadingDialog = false)
is Success -> oldState.copy(loadingDialog = false)
}
}

data object Success : Mute
data class Failed(val msg: String) : Mute
}
}
Loading

0 comments on commit 9f12a75

Please sign in to comment.