Skip to content

Commit 8401ae4

Browse files
committed
使用单独的 Activity 显示动态详情
1 parent 510dd84 commit 8401ae4

File tree

24 files changed

+1165
-526
lines changed

24 files changed

+1165
-526
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,11 @@
203203
android:exported="false"
204204
android:label="@string/title_mobile_activity_settings"
205205
android:theme="@style/Theme.BVMobile" />
206+
<activity
207+
android:name=".mobile.activities.DynamicDetailActivity"
208+
android:exported="false"
209+
android:label="@string/title_mobile_activity_dynamic_detail"
210+
android:theme="@style/Theme.BVMobile" />
206211
</application>
207212

208213
</manifest>

app/src/main/kotlin/com/origeek/imageViewer/previewer/ImagePreviewer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import androidx.compose.foundation.background
1616
import androidx.compose.foundation.gestures.detectTapGestures
1717
import androidx.compose.foundation.layout.Box
1818
import androidx.compose.foundation.layout.fillMaxSize
19-
import androidx.compose.material.CircularProgressIndicator
19+
import androidx.compose.material3.CircularProgressIndicator
2020
import androidx.compose.runtime.Composable
2121
import androidx.compose.runtime.LaunchedEffect
2222
import androidx.compose.runtime.remember

app/src/main/kotlin/com/origeek/imageViewer/viewer/ImageViewer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import androidx.compose.foundation.layout.Box
1717
import androidx.compose.foundation.layout.fillMaxSize
1818
import androidx.compose.foundation.layout.size
1919
import androidx.compose.foundation.shape.CircleShape
20-
import androidx.compose.material.Text
20+
import androidx.compose.material3.Text
2121
import androidx.compose.runtime.Composable
2222
import androidx.compose.runtime.LaunchedEffect
2323
import androidx.compose.runtime.derivedStateOf
@@ -598,7 +598,7 @@ fun ImageViewer(
598598
is ImageVector,
599599
is ImageBitmap,
600600
is ComposeModel,
601-
-> {
601+
-> {
602602
ImageComposeOrigin(
603603
model = model,
604604
scale = state.scale.value,

app/src/main/kotlin/dev/aaa1115910/bv/BVApp.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import dev.aaa1115910.bv.dao.AppDatabase
2727
import dev.aaa1115910.bv.entity.AuthData
2828
import dev.aaa1115910.bv.entity.db.UserDB
2929
import dev.aaa1115910.bv.mobile.viewmodel.CommentViewModel
30+
import dev.aaa1115910.bv.mobile.viewmodel.DynamicDetailViewModel
3031
import dev.aaa1115910.bv.mobile.viewmodel.MobileVideoPlayerViewModel
3132
import dev.aaa1115910.bv.network.HttpServer
3233
import dev.aaa1115910.bv.repository.UserRepository
@@ -199,6 +200,7 @@ val appModule = module {
199200
viewModel { PgcTvViewModel(get()) }
200201
viewModel { PgcVarietyViewModel(get()) }
201202
viewModel { CommentViewModel(get()) }
203+
viewModel { DynamicDetailViewModel(get()) }
202204
}
203205

204206
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "Settings")
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package dev.aaa1115910.bv.mobile.activities
2+
3+
import android.content.Context
4+
import android.content.Intent
5+
import android.os.Bundle
6+
import androidx.activity.ComponentActivity
7+
import androidx.activity.compose.setContent
8+
import dev.aaa1115910.bv.mobile.screen.DynamicDetailScreen
9+
import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
10+
import io.github.oshai.kotlinlogging.KotlinLogging
11+
12+
class DynamicDetailActivity : ComponentActivity() {
13+
companion object {
14+
private val logger = KotlinLogging.logger { }
15+
16+
fun actionStart(context: Context, dynamicId: String) {
17+
logger.info { "actionStart: dynamicId=$dynamicId" }
18+
context.startActivity(
19+
Intent(context, DynamicDetailActivity::class.java).apply {
20+
putExtra("dynamicId", dynamicId)
21+
}
22+
)
23+
}
24+
}
25+
26+
override fun onCreate(savedInstanceState: Bundle?) {
27+
super.onCreate(savedInstanceState)
28+
setContent {
29+
BVMobileTheme {
30+
DynamicDetailScreen()
31+
}
32+
}
33+
}
34+
}

app/src/main/kotlin/dev/aaa1115910/bv/mobile/component/reply/CommentItem.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ fun CommentItem(
141141
onShowPreviewer = onShowPreviewer
142142
)
143143
}
144-
if (showReplies && comment.replies.isNotEmpty()) {
144+
if (showReplies && (comment.repliesCount != 0 || comment.replies.isNotEmpty())) {
145145
CommentReplies(
146146
replies = comment.replies,
147147
repliesCount = comment.repliesCount,
@@ -403,6 +403,7 @@ private class CommentItemPreviewParameterProvider :
403403
mid = 0,
404404
oid = 0,
405405
parent = 0,
406+
type = 0,
406407
content = listOf("单行文字。你好", "[doge]", "World!"),
407408
member = Comment.Member(mid = 0, avatar = "", name = "username"),
408409
timeDesc = "4小时前",
@@ -422,6 +423,7 @@ private class CommentItemPreviewParameterProvider :
422423
mid = 0,
423424
oid = 0,
424425
parent = 0,
426+
type = 0,
425427
content = listOf("超长评论。If you were a web designer in the early days of the Internet, you might remember that there were few “web safe” typefaces, such as Arial and Georgia. As a result, many websites looked similar. To use a new typeface, you had to embed small Flash files for each heading in your layout."),
426428
member = Comment.Member(
427429
mid = 0,
@@ -445,6 +447,7 @@ private class CommentItemPreviewParameterProvider :
445447
mid = 0,
446448
oid = 0,
447449
parent = 0,
450+
type = 0,
448451
content = listOf("单图片, 1 picture."),
449452
member = Comment.Member(mid = 0, avatar = "", name = "username"),
450453
timeDesc = "4小时前",
@@ -465,6 +468,7 @@ private class CommentItemPreviewParameterProvider :
465468
mid = 0,
466469
oid = 0,
467470
parent = 0,
471+
type = 0,
468472
content = listOf("双图片, 2 pictures."),
469473
member = Comment.Member(mid = 0, avatar = "", name = "username"),
470474
timeDesc = "4小时前",
@@ -481,6 +485,7 @@ private class CommentItemPreviewParameterProvider :
481485
mid = 0,
482486
oid = 0,
483487
parent = 0,
488+
type = 0,
484489
content = listOf("三图片, 3 pictures."),
485490
member = Comment.Member(mid = 0, avatar = "", name = "username"),
486491
timeDesc = "4小时前",
@@ -498,6 +503,7 @@ private class CommentItemPreviewParameterProvider :
498503
mid = 0,
499504
oid = 0,
500505
parent = 0,
506+
type = 0,
501507
content = listOf("四图片, four pictures."),
502508
member = Comment.Member(mid = 0, avatar = "", name = "username"),
503509
timeDesc = "4小时前",
@@ -516,6 +522,7 @@ private class CommentItemPreviewParameterProvider :
516522
mid = 0,
517523
oid = 0,
518524
parent = 0,
525+
type = 0,
519526
content = listOf("先兼容后慢慢过渡到完全自主,虽然看起来像安卓套壳,但能避免跨度太大扯到蛋。"),
520527
member = Comment.Member(mid = 0, avatar = "", name = "username"),
521528
timeDesc = "4小时前",
@@ -532,6 +539,7 @@ private class CommentItemPreviewParameterProvider :
532539
mid = 0,
533540
oid = 0,
534541
parent = 0,
542+
type = 0,
535543
content = listOf("其他视频的置顶:美国商务部的源文件里写的很清楚,对于消费用途的产品(consumer application)是exemption(豁免)。但是基于AD102的产品不得在中国大陆生产,也就是说未来国内销售的RTX 4090将会是在境外生产再运输回国内卖,这是唯一的不同点。估计后续也会是商家炒作显卡涨价的理由。"),
536544
member = Comment.Member(mid = 0, avatar = "", name = "余Mercury"),
537545
timeDesc = "4小时前",
@@ -545,6 +553,7 @@ private class CommentItemPreviewParameterProvider :
545553
mid = 0,
546554
oid = 0,
547555
parent = 0,
556+
type = 0,
548557
content = listOf("回复 @余Mercury : 中东佬禁酒,用的泡沫水"),
549558
member = Comment.Member(mid = 0, avatar = "", name = "铭轩-T"),
550559
timeDesc = "4小时前",
@@ -558,6 +567,7 @@ private class CommentItemPreviewParameterProvider :
558567
mid = 0,
559568
oid = 0,
560569
parent = 0,
570+
type = 0,
561571
content = listOf("澄清完更好笑了"),
562572
member = Comment.Member(mid = 0, avatar = "", name = "Gemini好辣辣"),
563573
timeDesc = "4小时前",

app/src/main/kotlin/dev/aaa1115910/bv/mobile/component/reply/Comments.kt

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ import androidx.compose.foundation.layout.padding
1414
import androidx.compose.foundation.lazy.LazyColumn
1515
import androidx.compose.foundation.lazy.itemsIndexed
1616
import androidx.compose.foundation.lazy.rememberLazyListState
17-
import androidx.compose.material.ExperimentalMaterialApi
18-
import androidx.compose.material.pullrefresh.PullRefreshIndicator
19-
import androidx.compose.material.pullrefresh.pullRefresh
20-
import androidx.compose.material.pullrefresh.rememberPullRefreshState
17+
import androidx.compose.material3.CircularProgressIndicator
18+
import androidx.compose.material3.ExperimentalMaterial3Api
2119
import androidx.compose.material3.MaterialTheme
2220
import androidx.compose.material3.Text
2321
import androidx.compose.material3.TextButton
22+
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
23+
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
2424
import androidx.compose.runtime.Composable
2525
import androidx.compose.runtime.LaunchedEffect
2626
import androidx.compose.runtime.derivedStateOf
@@ -34,23 +34,24 @@ import dev.aaa1115910.biliapi.entity.Picture
3434
import dev.aaa1115910.biliapi.entity.reply.Comment
3535
import dev.aaa1115910.biliapi.entity.reply.CommentSort
3636

37-
@OptIn(ExperimentalMaterialApi::class, ExperimentalFoundationApi::class)
37+
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
3838
@Composable
3939
fun Comments(
4040
modifier: Modifier = Modifier,
41-
header: (@Composable () -> Unit)? = null,
4241
previewerState: ImagePreviewerState,
42+
header: (@Composable () -> Unit)? = null,
4343
comments: List<Comment>,
4444
commentSort: CommentSort,
45-
refreshingComments: Boolean,
45+
isLoading: Boolean,
46+
isRefreshing: Boolean,
4647
onLoadMoreComments: () -> Unit,
4748
onRefreshComments: () -> Unit,
4849
onSwitchCommentSort: (CommentSort) -> Unit,
4950
onShowPreviewer: (newPictures: List<Picture>, afterSetPictures: () -> Unit) -> Unit,
50-
onShowReplies: (rpId: Long, repliesCount: Int) -> Unit
51+
onShowReplies: (comment: Comment) -> Unit
5152
) {
5253
val listState = rememberLazyListState()
53-
val pullRefreshState = rememberPullRefreshState(refreshingComments, { onRefreshComments() })
54+
val pullToRefreshState = rememberPullToRefreshState()
5455

5556
val shouldLoadMore by remember {
5657
derivedStateOf {
@@ -65,12 +66,13 @@ fun Comments(
6566
if (shouldLoadMore) onLoadMoreComments()
6667
}
6768

68-
Box(
69-
modifier = modifier
70-
.fillMaxSize()
71-
.pullRefresh(state = pullRefreshState)
69+
PullToRefreshBox(
70+
isRefreshing = isRefreshing,
71+
state = pullToRefreshState,
72+
onRefresh = onRefreshComments
7273
) {
7374
LazyColumn(
75+
modifier = modifier.fillMaxSize(),
7476
state = listState
7577
) {
7678
item {
@@ -119,29 +121,42 @@ fun Comments(
119121
comment = comment,
120122
previewerState = previewerState,
121123
onShowPreviewer = onShowPreviewer,
122-
onShowReply = { rpId ->
123-
onShowReplies(rpId, comment.repliesCount)
124+
onShowReply = { _ ->
125+
onShowReplies(comment)
124126
}
125127
)
126128
}
127129
}
128-
if (comments.isEmpty()) {
130+
131+
if (comments.isEmpty() && !(isLoading || isRefreshing)) {
129132
item {
130133
Box(
131-
modifier = Modifier.height(400.dp)
134+
modifier = Modifier
135+
.fillMaxWidth()
136+
.height(300.dp),
137+
contentAlignment = Alignment.Center
132138
) {
133-
//Text(text="Empty")
139+
Text(text = "啥都没有")
134140
}
135141
}
136142
}
143+
144+
if (isLoading) {
145+
item {
146+
Box(
147+
modifier = Modifier
148+
.fillMaxWidth()
149+
.height(100.dp),
150+
contentAlignment = Alignment.Center
151+
) {
152+
CircularProgressIndicator()
153+
}
154+
}
155+
}
156+
137157
item {
138158
Spacer(modifier = Modifier.navigationBarsPadding())
139159
}
140160
}
141-
PullRefreshIndicator(
142-
refreshingComments,
143-
pullRefreshState,
144-
Modifier.align(Alignment.TopCenter)
145-
)
146161
}
147162
}

0 commit comments

Comments
 (0)