Skip to content

Commit 9c41fb8

Browse files
committed
[optimize] Optimize FeedView SQL; optimize media group name display
1 parent d4a5659 commit 9c41fb8

File tree

8 files changed

+92
-47
lines changed

8 files changed

+92
-47
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ android {
2121
applicationId = "com.skyd.anivu"
2222
minSdk = 24
2323
targetSdk = 35
24-
versionCode = 24
25-
versionName = "2.1-rc02"
24+
versionCode = 25
25+
versionName = "2.1-rc03"
2626

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

app/src/main/java/com/skyd/anivu/model/bean/feed/FeedViewBean.kt

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,23 @@ const val FEED_VIEW_NAME = "FeedView"
1515
@Parcelize
1616
@Serializable
1717
@DatabaseView(
18-
value = "SELECT $FEED_TABLE_NAME.*, IFNULL(ArticleCount.`count`, 0) AS ${FeedViewBean.ARTICLE_COUNT_COLUMN}, " +
19-
"IFNULL(UnreadArticleCount.`count`, 0) AS ${FeedViewBean.UNREAD_ARTICLE_COUNT_COLUMN} " +
20-
"FROM $FEED_TABLE_NAME LEFT JOIN (SELECT ${ArticleBean.FEED_URL_COLUMN}, COUNT(1) AS `count` " +
21-
"FROM $ARTICLE_TABLE_NAME GROUP BY ${ArticleBean.FEED_URL_COLUMN}) AS ArticleCount " +
22-
"ON $FEED_TABLE_NAME.${FeedBean.URL_COLUMN} = ArticleCount.${ArticleBean.FEED_URL_COLUMN} " +
23-
24-
"LEFT JOIN (SELECT ${ArticleBean.FEED_URL_COLUMN}, COUNT(1) AS `count` " +
25-
"FROM $ARTICLE_TABLE_NAME WHERE ${ArticleBean.IS_READ_COLUMN} = 0 " +
26-
"GROUP BY ${ArticleBean.FEED_URL_COLUMN}) AS UnreadArticleCount " +
27-
"ON $FEED_TABLE_NAME.${FeedBean.URL_COLUMN} = UnreadArticleCount.${ArticleBean.FEED_URL_COLUMN}",
18+
value = "SELECT " +
19+
" $FEED_TABLE_NAME.*, " +
20+
" IFNULL(ArticleCount.totalCount, 0) AS ${FeedViewBean.ARTICLE_COUNT_COLUMN}, " +
21+
" IFNULL(ArticleCount.unreadCount, 0) AS ${FeedViewBean.UNREAD_ARTICLE_COUNT_COLUMN} " +
22+
"FROM " +
23+
" $FEED_TABLE_NAME " +
24+
"LEFT JOIN (" +
25+
" SELECT " +
26+
" ${ArticleBean.FEED_URL_COLUMN}, " +
27+
" COUNT(1) AS totalCount, " +
28+
" COUNT(CASE WHEN ${ArticleBean.IS_READ_COLUMN} = 0 THEN 1 END) AS unreadCount " +
29+
" FROM " +
30+
" $ARTICLE_TABLE_NAME " +
31+
" GROUP BY " +
32+
" ${ArticleBean.FEED_URL_COLUMN}" +
33+
") AS ArticleCount " +
34+
" ON $FEED_TABLE_NAME.${FeedBean.URL_COLUMN} = ArticleCount.${ArticleBean.FEED_URL_COLUMN}",
2835
viewName = FEED_VIEW_NAME
2936
)
3037
data class FeedViewBean(

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import com.skyd.anivu.model.db.migration.Migration11To12
3434
import com.skyd.anivu.model.db.migration.Migration12To13
3535
import com.skyd.anivu.model.db.migration.Migration13To14
3636
import com.skyd.anivu.model.db.migration.Migration14To15
37+
import com.skyd.anivu.model.db.migration.Migration15To16
3738
import com.skyd.anivu.model.db.migration.Migration1To2
3839
import com.skyd.anivu.model.db.migration.Migration2To3
3940
import com.skyd.anivu.model.db.migration.Migration3To4
@@ -61,7 +62,7 @@ const val APP_DATA_BASE_FILE_NAME = "app.db"
6162
RssMediaBean::class,
6263
],
6364
views = [FeedViewBean::class],
64-
version = 15,
65+
version = 16,
6566
)
6667
@TypeConverters(
6768
value = [CategoriesConverter::class, RequestHeadersConverter::class]
@@ -86,7 +87,7 @@ abstract class AppDatabase : RoomDatabase() {
8687
Migration1To2(), Migration2To3(), Migration3To4(), Migration4To5(),
8788
Migration5To6(), Migration6To7(), Migration7To8(), Migration8To9(),
8889
Migration9To10(), Migration10To11(), Migration11To12(), Migration12To13(),
89-
Migration13To14(), Migration14To15(),
90+
Migration13To14(), Migration14To15(), Migration15To16(),
9091
)
9192

9293
fun getInstance(context: Context): AppDatabase {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.skyd.anivu.model.db.migration
2+
3+
import androidx.room.migration.Migration
4+
import androidx.sqlite.db.SupportSQLiteDatabase
5+
import com.skyd.anivu.model.bean.article.ARTICLE_TABLE_NAME
6+
import com.skyd.anivu.model.bean.article.ArticleBean
7+
import com.skyd.anivu.model.bean.feed.FEED_TABLE_NAME
8+
import com.skyd.anivu.model.bean.feed.FEED_VIEW_NAME
9+
import com.skyd.anivu.model.bean.feed.FeedBean
10+
import com.skyd.anivu.model.bean.feed.FeedViewBean
11+
12+
class Migration15To16 : Migration(15, 16) {
13+
override fun migrate(db: SupportSQLiteDatabase) {
14+
db.execSQL("DROP VIEW IF EXISTS `$FEED_VIEW_NAME`")
15+
db.execSQL(
16+
"CREATE VIEW `$FEED_VIEW_NAME` AS " +
17+
"SELECT " +
18+
" $FEED_TABLE_NAME.*, " +
19+
" IFNULL(ArticleCount.totalCount, 0) AS ${FeedViewBean.ARTICLE_COUNT_COLUMN}, " +
20+
" IFNULL(ArticleCount.unreadCount, 0) AS ${FeedViewBean.UNREAD_ARTICLE_COUNT_COLUMN} " +
21+
"FROM " +
22+
" $FEED_TABLE_NAME " +
23+
"LEFT JOIN (" +
24+
" SELECT " +
25+
" ${ArticleBean.FEED_URL_COLUMN}, " +
26+
" COUNT(1) AS totalCount, " +
27+
" COUNT(CASE WHEN ${ArticleBean.IS_READ_COLUMN} = 0 THEN 1 END) AS unreadCount " +
28+
" FROM " +
29+
" $ARTICLE_TABLE_NAME " +
30+
" GROUP BY " +
31+
" ${ArticleBean.FEED_URL_COLUMN}" +
32+
") AS ArticleCount " +
33+
" ON $FEED_TABLE_NAME.${FeedBean.URL_COLUMN} = ArticleCount.${ArticleBean.FEED_URL_COLUMN}"
34+
)
35+
}
36+
}

app/src/main/java/com/skyd/anivu/ui/screen/media/MediaIntent.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package com.skyd.anivu.ui.screen.media
22

33
import com.skyd.anivu.base.mvi.MviIntent
4-
import com.skyd.anivu.model.bean.MediaGroupBean
54
import com.skyd.anivu.model.bean.MediaBean
5+
import com.skyd.anivu.model.bean.MediaGroupBean
66

77
sealed interface MediaIntent : MviIntent {
8-
data class Init(val path: String?) : MediaIntent
9-
data class Refresh(val path: String?) : MediaIntent
8+
data class Init(val path: String) : MediaIntent
9+
data class Refresh(val path: String) : MediaIntent
1010
data class ChangeMediaGroup(
11-
val path: String?,
11+
val path: String,
1212
val mediaBean: MediaBean,
1313
val group: MediaGroupBean
1414
) : MediaIntent
1515

16-
data class CreateGroup(val path: String?, val group: MediaGroupBean) : MediaIntent
17-
data class DeleteGroup(val path: String?, val group: MediaGroupBean) : MediaIntent
18-
data class RenameGroup(val path: String?, val group: MediaGroupBean, val newName: String) :
16+
data class CreateGroup(val path: String, val group: MediaGroupBean) : MediaIntent
17+
data class DeleteGroup(val path: String, val group: MediaGroupBean) : MediaIntent
18+
data class RenameGroup(val path: String, val group: MediaGroupBean, val newName: String) :
1919
MediaIntent
2020

2121
data class MoveFilesToGroup(
22-
val path: String?,
22+
val path: String,
2323
val from: MediaGroupBean,
2424
val to: MediaGroupBean
2525
) : MediaIntent

app/src/main/java/com/skyd/anivu/ui/screen/media/MediaScreen.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,18 @@ fun MediaScreen(path: String, viewModel: MediaViewModel = hiltViewModel()) {
113113
topBar = {
114114
AniVuTopBar(
115115
style = AniVuTopBarStyle.Small,
116-
title = { Text(text = stringResource(R.string.media_screen_name)) },
116+
title = {
117+
val title = stringResource(R.string.media_screen_name)
118+
Text(
119+
modifier = Modifier.basicMarquee(),
120+
text = if (LocalMediaShowGroupTab.current) title else {
121+
val groupName = uiState.groups
122+
.getOrNull(pagerState.currentPage)?.first?.name
123+
if (groupName.isNullOrBlank()) title else "$title - $groupName"
124+
},
125+
maxLines = 1,
126+
)
127+
},
117128
colors = TopAppBarDefaults.topAppBarColors(
118129
navigationIconContentColor = TopAppBarDefaults.topAppBarColors().actionIconContentColor
119130
),

app/src/main/java/com/skyd/anivu/ui/screen/media/MediaViewModel.kt

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -81,53 +81,43 @@ class MediaViewModel @Inject constructor(
8181
private fun Flow<MediaIntent>.toMediaPartialStateChangeFlow(): Flow<MediaPartialStateChange> {
8282
return merge(
8383
merge(
84-
filterIsInstance<MediaIntent.Init>().filterNot { it.path.isNullOrBlank() },
85-
filterIsInstance<MediaIntent.Refresh>().filterNot { it.path.isNullOrBlank() },
84+
filterIsInstance<MediaIntent.Init>(),
85+
filterIsInstance<MediaIntent.Refresh>(),
8686
).flatMapConcat { intent ->
8787
val path = if (intent is MediaIntent.Init) intent.path
8888
else (intent as MediaIntent.Refresh).path
89-
mediaRepo.requestGroups(path = path!!).map {
89+
mediaRepo.requestGroups(path = path).map {
9090
MediaPartialStateChange.GroupsResult.Success(groups = it)
9191
}.startWith(MediaPartialStateChange.LoadingDialog.Show)
9292
.catchMap { MediaPartialStateChange.GroupsResult.Failed(it.message.toString()) }
9393
},
94-
filterIsInstance<MediaIntent.ChangeMediaGroup>().filterNot {
95-
it.path.isNullOrBlank()
96-
}.flatMapConcat { intent ->
97-
mediaRepo.changeMediaGroup(intent.path!!, intent.mediaBean, intent.group)
94+
filterIsInstance<MediaIntent.ChangeMediaGroup>().flatMapConcat { intent ->
95+
mediaRepo.changeMediaGroup(intent.path, intent.mediaBean, intent.group)
9896
.map {
9997
MediaPartialStateChange.ChangeMediaGroup.Success
10098
}.startWith(MediaPartialStateChange.LoadingDialog.Show)
10199
.catchMap { MediaPartialStateChange.ChangeMediaGroup.Failed(it.message.toString()) }
102100
},
103-
filterIsInstance<MediaIntent.DeleteGroup>().filterNot {
104-
it.path.isNullOrBlank()
105-
}.flatMapConcat { intent ->
106-
mediaRepo.deleteGroup(intent.path!!, intent.group).map {
101+
filterIsInstance<MediaIntent.DeleteGroup>().flatMapConcat { intent ->
102+
mediaRepo.deleteGroup(intent.path, intent.group).map {
107103
MediaPartialStateChange.DeleteGroup.Success(intent.group)
108104
}.startWith(MediaPartialStateChange.LoadingDialog.Show)
109105
.catchMap { MediaPartialStateChange.DeleteGroup.Failed(it.message.toString()) }
110106
},
111-
filterIsInstance<MediaIntent.CreateGroup>().filterNot {
112-
it.path.isNullOrBlank()
113-
}.flatMapConcat { intent ->
114-
mediaRepo.createGroup(intent.path!!, intent.group).map {
107+
filterIsInstance<MediaIntent.CreateGroup>().flatMapConcat { intent ->
108+
mediaRepo.createGroup(intent.path, intent.group).map {
115109
MediaPartialStateChange.CreateGroup.Success
116110
}.startWith(MediaPartialStateChange.LoadingDialog.Show)
117111
.catchMap { MediaPartialStateChange.CreateGroup.Failed(it.message.toString()) }
118112
},
119-
filterIsInstance<MediaIntent.MoveFilesToGroup>().filterNot {
120-
it.path.isNullOrBlank()
121-
}.flatMapConcat { intent ->
122-
mediaRepo.moveFilesToGroup(intent.path!!, intent.from, intent.to).map {
113+
filterIsInstance<MediaIntent.MoveFilesToGroup>().flatMapConcat { intent ->
114+
mediaRepo.moveFilesToGroup(intent.path, intent.from, intent.to).map {
123115
MediaPartialStateChange.MoveFilesToGroup.Success
124116
}.startWith(MediaPartialStateChange.LoadingDialog.Show)
125117
.catchMap { MediaPartialStateChange.MoveFilesToGroup.Failed(it.message.toString()) }
126118
},
127-
filterIsInstance<MediaIntent.RenameGroup>().filterNot {
128-
it.path.isNullOrBlank()
129-
}.flatMapConcat { intent ->
130-
mediaRepo.renameGroup(intent.path!!, intent.group, intent.newName).map {
119+
filterIsInstance<MediaIntent.RenameGroup>().flatMapConcat { intent ->
120+
mediaRepo.renameGroup(intent.path, intent.group, intent.newName).map {
131121
MediaPartialStateChange.EditGroup.Success(it)
132122
}.startWith(MediaPartialStateChange.LoadingDialog.Show)
133123
.catchMap { MediaPartialStateChange.EditGroup.Failed(it.message.toString()) }

app/src/main/java/com/skyd/anivu/ui/screen/media/list/MediaListIntent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ sealed interface MediaListIntent : MviIntent {
99
data class Init(val path: String, val group: MediaGroupBean?, val version: Long?) :
1010
MediaListIntent
1111

12-
data class Refresh(val path: String?, val group: MediaGroupBean?) : MediaListIntent
12+
data class Refresh(val path: String, val group: MediaGroupBean?) : MediaListIntent
1313
data class DeleteFile(val file: File) : MediaListIntent
1414
data class RenameFile(val file: File, val newName: String) : MediaListIntent
1515
data class SetFileDisplayName(val media: MediaBean, val displayName: String?) : MediaListIntent

0 commit comments

Comments
 (0)