Skip to content

Commit 9f12a75

Browse files
committed
[feature] Support managing subscription muting in a separate page (#84)
1 parent f205d1a commit 9f12a75

File tree

21 files changed

+380
-39
lines changed

21 files changed

+380
-39
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ android {
2222
minSdk = 24
2323
targetSdk = 35
2424
versionCode = 26
25-
versionName = "3.1-alpha02"
25+
versionName = "3.1-alpha03"
2626

2727
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2828

app/src/main/java/com/skyd/anivu/ext/PreferenceExt.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import com.skyd.anivu.model.preference.appearance.feed.FeedDefaultGroupExpandPre
1919
import com.skyd.anivu.model.preference.appearance.feed.FeedListTonalElevationPreference
2020
import com.skyd.anivu.model.preference.appearance.feed.FeedNumberBadgePreference
2121
import com.skyd.anivu.model.preference.appearance.feed.FeedTopBarTonalElevationPreference
22-
import com.skyd.anivu.model.preference.appearance.feed.HideMutedFeedPreference
22+
import com.skyd.anivu.model.preference.behavior.feed.HideMutedFeedPreference
2323
import com.skyd.anivu.model.preference.appearance.media.MediaFileFilterPreference
2424
import com.skyd.anivu.model.preference.appearance.media.MediaShowGroupTabPreference
2525
import com.skyd.anivu.model.preference.appearance.media.MediaShowThumbnailPreference
@@ -93,7 +93,6 @@ fun Preferences.toSettings(): Settings {
9393
readContentTonalElevation = ReadContentTonalElevationPreference.fromPreferences(this),
9494
readTopBarTonalElevation = ReadTopBarTonalElevationPreference.fromPreferences(this),
9595
feedNumberBadge = FeedNumberBadgePreference.fromPreferences(this),
96-
hideMutedFeed = HideMutedFeedPreference.fromPreferences(this),
9796

9897
// Update
9998
ignoreUpdateVersion = IgnoreUpdateVersionPreference.fromPreferences(this),
@@ -104,6 +103,7 @@ fun Preferences.toSettings(): Settings {
104103
articleSwipeLeftAction = ArticleSwipeLeftActionPreference.fromPreferences(this),
105104
articleSwipeRightAction = ArticleSwipeRightActionPreference.fromPreferences(this),
106105
hideEmptyDefault = HideEmptyDefaultPreference.fromPreferences(this),
106+
hideMutedFeed = HideMutedFeedPreference.fromPreferences(this),
107107
pickImageMethod = PickImageMethodPreference.fromPreferences(this),
108108
mediaFileFilter = MediaFileFilterPreference.fromPreferences(this),
109109

app/src/main/java/com/skyd/anivu/model/db/dao/FeedDao.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,10 @@ interface FeedDao {
182182
@RawQuery(observedEntities = [FeedBean::class, ArticleBean::class])
183183
fun getFeedList(sql: SupportSQLiteQuery): List<FeedViewBean>
184184

185+
@Transaction
186+
@Query("SELECT * FROM $FEED_TABLE_NAME")
187+
fun getAllFeedList(): Flow<List<FeedBean>>
188+
185189
@Transaction
186190
@Query("SELECT ${FeedBean.URL_COLUMN} FROM $FEED_TABLE_NAME")
187191
fun getAllFeedUrl(): List<String>

app/src/main/java/com/skyd/anivu/model/preference/Settings.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import com.skyd.anivu.model.preference.appearance.feed.FeedDefaultGroupExpandPre
2424
import com.skyd.anivu.model.preference.appearance.feed.FeedListTonalElevationPreference
2525
import com.skyd.anivu.model.preference.appearance.feed.FeedNumberBadgePreference
2626
import com.skyd.anivu.model.preference.appearance.feed.FeedTopBarTonalElevationPreference
27-
import com.skyd.anivu.model.preference.appearance.feed.HideMutedFeedPreference
27+
import com.skyd.anivu.model.preference.behavior.feed.HideMutedFeedPreference
2828
import com.skyd.anivu.model.preference.appearance.media.MediaFileFilterPreference
2929
import com.skyd.anivu.model.preference.appearance.media.MediaShowGroupTabPreference
3030
import com.skyd.anivu.model.preference.appearance.media.MediaShowThumbnailPreference
@@ -162,7 +162,6 @@ data class Settings(
162162
val readContentTonalElevation: Float = ReadContentTonalElevationPreference.default,
163163
val readTopBarTonalElevation: Float = ReadTopBarTonalElevationPreference.default,
164164
val feedNumberBadge: Int = FeedNumberBadgePreference.default,
165-
val hideMutedFeed: Boolean = HideMutedFeedPreference.default,
166165
// Update
167166
val ignoreUpdateVersion: Long = IgnoreUpdateVersionPreference.default,
168167
// Behavior
@@ -171,6 +170,7 @@ data class Settings(
171170
val articleSwipeLeftAction: String = ArticleSwipeLeftActionPreference.default,
172171
val articleSwipeRightAction: String = ArticleSwipeRightActionPreference.default,
173172
val hideEmptyDefault: Boolean = HideEmptyDefaultPreference.default,
173+
val hideMutedFeed: Boolean = HideMutedFeedPreference.default,
174174
val pickImageMethod: String = PickImageMethodPreference.default,
175175
val mediaFileFilter: String = MediaFileFilterPreference.default,
176176
// RSS
@@ -243,7 +243,6 @@ fun SettingsProvider(
243243
LocalReadContentTonalElevation provides settings.readContentTonalElevation,
244244
LocalReadTopBarTonalElevation provides settings.readTopBarTonalElevation,
245245
LocalFeedNumberBadge provides settings.feedNumberBadge,
246-
LocalHideMutedFeed provides settings.hideMutedFeed,
247246
// Update
248247
LocalIgnoreUpdateVersion provides settings.ignoreUpdateVersion,
249248
// Behavior
@@ -252,6 +251,7 @@ fun SettingsProvider(
252251
LocalArticleSwipeLeftAction provides settings.articleSwipeLeftAction,
253252
LocalArticleSwipeRightAction provides settings.articleSwipeRightAction,
254253
LocalHideEmptyDefault provides settings.hideEmptyDefault,
254+
LocalHideMutedFeed provides settings.hideMutedFeed,
255255
LocalPickImageMethod provides settings.pickImageMethod,
256256
LocalMediaFileFilter provides settings.mediaFileFilter,
257257
// rss

app/src/main/java/com/skyd/anivu/model/preference/appearance/feed/HideMutedFeedPreference.kt renamed to app/src/main/java/com/skyd/anivu/model/preference/behavior/feed/HideMutedFeedPreference.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.skyd.anivu.model.preference.appearance.feed
1+
package com.skyd.anivu.model.preference.behavior.feed
22

33
import android.content.Context
44
import androidx.datastore.preferences.core.Preferences

app/src/main/java/com/skyd/anivu/model/repository/feed/FeedRepository.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import com.skyd.anivu.ext.dataStore
1010
import com.skyd.anivu.ext.isLocal
1111
import com.skyd.anivu.ext.isNetwork
1212
import com.skyd.anivu.ext.put
13+
import com.skyd.anivu.model.bean.feed.FeedBean
1314
import com.skyd.anivu.model.bean.feed.FeedViewBean
1415
import com.skyd.anivu.model.bean.group.GroupVo
1516
import com.skyd.anivu.model.db.dao.ArticleDao
1617
import com.skyd.anivu.model.db.dao.FeedDao
1718
import com.skyd.anivu.model.db.dao.GroupDao
1819
import com.skyd.anivu.model.preference.appearance.feed.FeedDefaultGroupExpandPreference
19-
import com.skyd.anivu.model.preference.appearance.feed.HideMutedFeedPreference
20+
import com.skyd.anivu.model.preference.behavior.feed.HideMutedFeedPreference
2021
import com.skyd.anivu.model.repository.RssHelper
2122
import kotlinx.coroutines.Dispatchers
2223
import kotlinx.coroutines.flow.Flow
@@ -54,6 +55,10 @@ class FeedRepository @Inject constructor(
5455
}
5556
}.flowOn(Dispatchers.IO)
5657

58+
fun requestAllFeedList(): Flow<List<FeedBean>> = feedDao.getAllFeedList()
59+
.map { list -> list.sortedBy { it.title } }
60+
.flowOn(Dispatchers.IO)
61+
5762
fun clearGroupArticles(groupId: String): Flow<Int> = flow {
5863
val realGroupId = if (groupId == GroupVo.DEFAULT_GROUP_ID) null else groupId
5964
emit(articleDao.deleteArticlesInGroup(realGroupId))

app/src/main/java/com/skyd/anivu/ui/activity/MainActivity.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ import com.skyd.anivu.ui.screen.download.DOWNLOAD_SCREEN_DEEP_LINK_DATA
8080
import com.skyd.anivu.ui.screen.download.DOWNLOAD_SCREEN_ROUTE
8181
import com.skyd.anivu.ui.screen.download.DownloadScreen
8282
import com.skyd.anivu.ui.screen.download.openDownloadScreen
83+
import com.skyd.anivu.ui.screen.feed.mute.MUTE_FEED_SCREEN_ROUTE
84+
import com.skyd.anivu.ui.screen.feed.mute.MuteFeedScreen
8385
import com.skyd.anivu.ui.screen.feed.reorder.REORDER_GROUP_SCREEN_ROUTE
8486
import com.skyd.anivu.ui.screen.feed.reorder.ReorderGroupScreen
8587
import com.skyd.anivu.ui.screen.feed.requestheaders.FEED_URL_KEY
@@ -292,6 +294,7 @@ private fun MainNavHost() {
292294
composable(route = PROXY_SCREEN_ROUTE) { ProxyScreen() }
293295
composable(route = TRANSMISSION_SCREEN_ROUTE) { TransmissionScreen() }
294296
composable(route = UPDATE_NOTIFICATION_SCREEN_ROUTE) { UpdateNotificationScreen() }
297+
composable(route = MUTE_FEED_SCREEN_ROUTE) { MuteFeedScreen() }
295298
composable(
296299
route = "$REQUEST_HEADERS_SCREEN_ROUTE/{$FEED_URL_KEY}",
297300
arguments = listOf(

app/src/main/java/com/skyd/anivu/ui/component/Placeholder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ fun EmptyPlaceholder(
3333

3434
@Composable
3535
fun ErrorPlaceholder(
36-
modifier: Modifier = Modifier,
3736
text: String,
3837
contentPadding: PaddingValues = PaddingValues(),
38+
modifier: Modifier = Modifier,
3939
) {
4040
AnimatedPlaceholder(
4141
modifier = modifier,
@@ -99,8 +99,8 @@ fun WithTextPlaceholder(
9999

100100
@Composable
101101
fun CircularProgressPlaceholder(
102-
modifier: Modifier = Modifier,
103102
contentPadding: PaddingValues = PaddingValues(),
103+
modifier: Modifier = Modifier,
104104
) {
105105
BasePlaceholder(
106106
modifier = modifier,

app/src/main/java/com/skyd/anivu/ui/local/LocalValue.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import com.skyd.anivu.model.preference.appearance.feed.FeedDefaultGroupExpandPre
2020
import com.skyd.anivu.model.preference.appearance.feed.FeedListTonalElevationPreference
2121
import com.skyd.anivu.model.preference.appearance.feed.FeedNumberBadgePreference
2222
import com.skyd.anivu.model.preference.appearance.feed.FeedTopBarTonalElevationPreference
23-
import com.skyd.anivu.model.preference.appearance.feed.HideMutedFeedPreference
23+
import com.skyd.anivu.model.preference.behavior.feed.HideMutedFeedPreference
2424
import com.skyd.anivu.model.preference.appearance.media.MediaFileFilterPreference
2525
import com.skyd.anivu.model.preference.appearance.media.MediaShowGroupTabPreference
2626
import com.skyd.anivu.model.preference.appearance.media.MediaShowThumbnailPreference
@@ -109,7 +109,6 @@ val LocalReadContentTonalElevation =
109109
val LocalReadTopBarTonalElevation =
110110
compositionLocalOf { ReadTopBarTonalElevationPreference.default }
111111
val LocalFeedNumberBadge = compositionLocalOf { FeedNumberBadgePreference.default }
112-
val LocalHideMutedFeed = compositionLocalOf { HideMutedFeedPreference.default }
113112

114113
// Update
115114
val LocalIgnoreUpdateVersion = compositionLocalOf { IgnoreUpdateVersionPreference.default }
@@ -120,6 +119,7 @@ val LocalArticleTapAction = compositionLocalOf { ArticleTapActionPreference.defa
120119
val LocalArticleSwipeLeftAction = compositionLocalOf { ArticleSwipeLeftActionPreference.default }
121120
val LocalArticleSwipeRightAction = compositionLocalOf { ArticleSwipeRightActionPreference.default }
122121
val LocalHideEmptyDefault = compositionLocalOf { HideEmptyDefaultPreference.default }
122+
val LocalHideMutedFeed = compositionLocalOf { HideMutedFeedPreference.default }
123123
val LocalPickImageMethod = compositionLocalOf { PickImageMethodPreference.default }
124124
val LocalMediaFileFilter = compositionLocalOf { MediaFileFilterPreference.default }
125125

app/src/main/java/com/skyd/anivu/ui/screen/feed/FeedScreen.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.compose.foundation.lazy.grid.itemsIndexed
1616
import androidx.compose.material.icons.Icons
1717
import androidx.compose.material.icons.automirrored.outlined.Article
1818
import androidx.compose.material.icons.automirrored.outlined.Sort
19+
import androidx.compose.material.icons.automirrored.outlined.VolumeOff
1920
import androidx.compose.material.icons.outlined.Add
2021
import androidx.compose.material.icons.outlined.MoreVert
2122
import androidx.compose.material.icons.outlined.RssFeed
@@ -90,6 +91,7 @@ import com.skyd.anivu.ui.screen.article.ArticleScreen
9091
import com.skyd.anivu.ui.screen.article.openArticleScreen
9192
import com.skyd.anivu.ui.screen.feed.item.Feed1Item
9293
import com.skyd.anivu.ui.screen.feed.item.Group1Item
94+
import com.skyd.anivu.ui.screen.feed.mute.MUTE_FEED_SCREEN_ROUTE
9395
import com.skyd.anivu.ui.screen.feed.reorder.REORDER_GROUP_SCREEN_ROUTE
9496
import com.skyd.anivu.ui.screen.search.SearchDomain
9597
import com.skyd.anivu.ui.screen.search.openSearchScreen
@@ -657,6 +659,19 @@ private fun MoreMenu(
657659
navController.navigate(REORDER_GROUP_SCREEN_ROUTE)
658660
},
659661
)
662+
DropdownMenuItem(
663+
text = { Text(text = stringResource(R.string.mute_feed_screen_name)) },
664+
leadingIcon = {
665+
Icon(
666+
imageVector = Icons.AutoMirrored.Outlined.VolumeOff,
667+
contentDescription = null,
668+
)
669+
},
670+
onClick = {
671+
onDismissRequest()
672+
navController.navigate(MUTE_FEED_SCREEN_ROUTE)
673+
},
674+
)
660675
DropdownMenuItem(
661676
text = { Text(text = stringResource(R.string.feed_style_screen_name)) },
662677
onClick = {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.skyd.anivu.ui.screen.feed.mute
2+
3+
import com.skyd.anivu.base.mvi.MviSingleEvent
4+
5+
sealed interface MuteFeedEvent : MviSingleEvent {
6+
sealed interface MuteResultEvent : MuteFeedEvent {
7+
data class Failed(val msg: String) : MuteResultEvent
8+
}
9+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.skyd.anivu.ui.screen.feed.mute
2+
3+
import com.skyd.anivu.base.mvi.MviIntent
4+
5+
sealed interface MuteFeedIntent : MviIntent {
6+
data object Init : MuteFeedIntent
7+
data class Mute(val feedUrl: String, val mute: Boolean) : MuteFeedIntent
8+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.skyd.anivu.ui.screen.feed.mute
2+
3+
import com.skyd.anivu.model.bean.feed.FeedBean
4+
5+
6+
internal sealed interface MuteFeedPartialStateChange {
7+
fun reduce(oldState: MuteFeedState): MuteFeedState
8+
9+
sealed interface LoadingDialog : MuteFeedPartialStateChange {
10+
data object Show : LoadingDialog {
11+
override fun reduce(oldState: MuteFeedState) = oldState.copy(loadingDialog = true)
12+
}
13+
}
14+
15+
sealed interface Init : MuteFeedPartialStateChange {
16+
override fun reduce(oldState: MuteFeedState): MuteFeedState {
17+
return when (this) {
18+
is Failed -> oldState.copy(loadingDialog = false)
19+
is Success -> oldState.copy(
20+
listState = MuteFeedState.ListState.Success(feeds),
21+
loadingDialog = false,
22+
)
23+
}
24+
}
25+
26+
data class Success(val feeds: List<FeedBean>) : Init
27+
data class Failed(val msg: String) : Init
28+
}
29+
30+
sealed interface Mute : MuteFeedPartialStateChange {
31+
override fun reduce(oldState: MuteFeedState): MuteFeedState {
32+
return when (this) {
33+
is Failed -> oldState.copy(loadingDialog = false)
34+
is Success -> oldState.copy(loadingDialog = false)
35+
}
36+
}
37+
38+
data object Success : Mute
39+
data class Failed(val msg: String) : Mute
40+
}
41+
}

0 commit comments

Comments
 (0)