From cfe5ce8102ba8b6f3a963abd0558fece59069d2c Mon Sep 17 00:00:00 2001
From: zhong <2724770085@qq.com>
Date: Wed, 26 Nov 2025 18:45:17 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E7=95=8C=E9=9D=A2UI?=
=?UTF-8?q?=E8=B0=83=E6=95=B4=20=E4=BF=AE=E5=A4=8DBUG=EF=BC=9A=E9=80=9A?=
=?UTF-8?q?=E7=9F=A5=E7=95=8C=E9=9D=A2=E7=B3=BB=E7=BB=9F=E6=A0=8F=E7=A9=BA?=
=?UTF-8?q?=E7=99=BD=E5=8C=BA=E5=9F=9F=E8=B0=83=E6=95=B4=E5=90=88=E9=80=82?=
=?UTF-8?q?=E9=95=BF=E5=BA=A6=EF=BC=8C=E7=BB=9F=E4=B8=80=E7=82=B9=E8=B5=9E?=
=?UTF-8?q?/=E7=B2=89=E4=B8=9D/=E8=AF=84=E8=AE=BA3=E4=B8=AA=E9=A1=B5?=
=?UTF-8?q?=E9=9D=A2=E7=9A=84=E6=B6=88=E6=81=AF=E9=95=BF=E5=AE=BD=E5=92=8C?=
=?UTF-8?q?=E5=A4=A7=E5=B0=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ui/comment/notice/CommentNotice.kt | 94 +++----
.../ravenow/ui/follower/FollowerNotice.kt | 59 ++--
.../com/aiosman/ravenow/ui/like/LikePage.kt | 263 +++++++++---------
.../ravenow/ui/notification/Notification.kt | 2 +-
app/src/main/res/values-ja/strings.xml | 2 +
app/src/main/res/values-zh/strings.xml | 2 +
app/src/main/res/values/strings.xml | 2 +
7 files changed, 227 insertions(+), 197 deletions(-)
diff --git a/app/src/main/java/com/aiosman/ravenow/ui/comment/notice/CommentNotice.kt b/app/src/main/java/com/aiosman/ravenow/ui/comment/notice/CommentNotice.kt
index fcffc06..cbafd30 100644
--- a/app/src/main/java/com/aiosman/ravenow/ui/comment/notice/CommentNotice.kt
+++ b/app/src/main/java/com/aiosman/ravenow/ui/comment/notice/CommentNotice.kt
@@ -41,9 +41,8 @@ import com.aiosman.ravenow.R
import com.aiosman.ravenow.entity.CommentEntity
import com.aiosman.ravenow.exp.timeAgo
import com.aiosman.ravenow.ui.NavigationRoute
-import com.aiosman.ravenow.ui.comment.NoticeScreenHeader
import com.aiosman.ravenow.ui.composables.CustomAsyncImage
-import com.aiosman.ravenow.ui.composables.StatusBarSpacer
+import com.aiosman.ravenow.ui.composables.StatusBarMaskLayout
import com.aiosman.ravenow.ui.modifiers.noRippleClickable
import com.aiosman.ravenow.ui.navigateToPost
import kotlinx.coroutines.launch
@@ -68,10 +67,14 @@ fun CommentNoticeScreen(includeStatusBarPadding: Boolean = true){
val navController = LocalNavController.current
val AppColors = LocalAppTheme.current
- Column(
- modifier = Modifier.fillMaxSize().background(color = AppColors.background)
+ StatusBarMaskLayout(
+ modifier = Modifier
+ .background(color = AppColors.background)
+ .padding(horizontal = 16.dp),
+ darkIcons = !AppState.darkMode,
+ maskBoxBackgroundColor = AppColors.background,
+ includeStatusBarPadding = includeStatusBarPadding
) {
- StatusBarSpacer()
val isNetworkAvailable = NetworkUtils.isNetworkAvailable(LocalContext.current)
if (!isNetworkAvailable) {
@@ -109,7 +112,8 @@ fun CommentNoticeScreen(includeStatusBarPadding: Boolean = true){
} else {
LazyColumn(
modifier = Modifier
- .fillMaxSize().padding(horizontal = 16.dp)
+ .weight(1f)
+ .background(color = AppColors.background)
) {
items(comments.itemCount) { index ->
comments[index]?.let { comment ->
@@ -183,55 +187,58 @@ fun CommentNoticeItem(
val navController = LocalNavController.current
val context = LocalContext.current
val AppColors = LocalAppTheme.current
+ val commentPrefix = stringResource(R.string.comment_notice)
Row(
- modifier = Modifier.padding(vertical = 20.dp, horizontal = 16.dp)
+ modifier = Modifier.padding(vertical = 12.dp)
) {
- Box {
- CustomAsyncImage(
- context = context,
- imageUrl = commentItem.avatar,
- contentDescription = commentItem.name,
- modifier = Modifier
- .size(48.dp)
- .clip(CircleShape)
- .noRippleClickable {
- navController.navigate(
- NavigationRoute.AccountProfile.route.replace(
- "{id}",
- commentItem.author.toString()
- )
+ // 左侧头像区域
+ CustomAsyncImage(
+ context = context,
+ imageUrl = commentItem.avatar,
+ contentDescription = commentItem.name,
+ modifier = Modifier
+ .size(40.dp)
+ .clip(CircleShape)
+ .noRippleClickable {
+ navController.navigate(
+ NavigationRoute.AccountProfile.route.replace(
+ "{id}",
+ commentItem.author.toString()
)
- }
- )
- }
+ )
+ }
+ )
+
+ // 右侧内容区域
Row(
modifier = Modifier
.weight(1f)
- .padding(start = 12.dp)
+ .padding(start = 8.dp)
.noRippleClickable {
onPostClick()
}
) {
+ // 主要信息列
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = commentItem.name,
- fontSize = 18.sp,
- modifier = Modifier,
+ fontSize = 14.sp,
color = AppColors.text,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
Spacer(modifier = Modifier.height(4.dp))
+ // 评论内容行
Row {
var text = commentItem.comment
if (commentItem.parentCommentId != null) {
text = "Reply you: $text"
}
Text(
- text = text,
+ text = "$commentPrefix $text",
fontSize = 14.sp,
maxLines = 1,
color = AppColors.secondaryText,
@@ -245,25 +252,20 @@ fun CommentNoticeItem(
color = AppColors.secondaryText,
)
}
-
}
- Spacer(modifier = Modifier.width(24.dp))
+ Spacer(modifier = Modifier.width(4.dp))
+ // 右侧帖子图片
commentItem.post?.let {
Box {
- Box(
- modifier = Modifier.padding(4.dp)
- ) {
- CustomAsyncImage(
- context = context,
- imageUrl = it.images[0].thumbnail,
- contentDescription = "Post Image",
- modifier = Modifier
- .size(48.dp).clip(RoundedCornerShape(8.dp))
- )
- // unread indicator
-
- }
-
+ CustomAsyncImage(
+ context = context,
+ imageUrl = it.images[0].thumbnail,
+ contentDescription = "Post Image",
+ modifier = Modifier
+ .size(40.dp)
+ .clip(RoundedCornerShape(8.dp))
+ )
+ // 未读指示器
if (commentItem.unread) {
Box(
modifier = Modifier
@@ -273,11 +275,7 @@ fun CommentNoticeItem(
)
}
}
-
-
}
}
-
-
}
}
diff --git a/app/src/main/java/com/aiosman/ravenow/ui/follower/FollowerNotice.kt b/app/src/main/java/com/aiosman/ravenow/ui/follower/FollowerNotice.kt
index d4be489..c639f27 100644
--- a/app/src/main/java/com/aiosman/ravenow/ui/follower/FollowerNotice.kt
+++ b/app/src/main/java/com/aiosman/ravenow/ui/follower/FollowerNotice.kt
@@ -141,42 +141,57 @@ fun FollowItem(
val AppColors = LocalAppTheme.current
val context = LocalContext.current
val navController = LocalNavController.current
- Box(
+ val followText = stringResource(R.string.followed_you)
+
+ Row(
modifier = Modifier
- .padding(vertical = 16.dp)
- .noRippleClickable {
- navController.navigate(
- NavigationRoute.AccountProfile.route.replace(
- "{id}",
- userId.toString()
- )
- )
- }
+ .fillMaxWidth()
+ .padding(vertical = 12.dp),
+ verticalAlignment = Alignment.CenterVertically
) {
+ // 左侧头像区域
+ CustomAsyncImage(
+ context = context,
+ imageUrl = avatar,
+ contentDescription = nickname,
+ modifier = Modifier
+ .size(40.dp)
+ .clip(CircleShape)
+ .noRippleClickable {
+ navController.navigate(
+ NavigationRoute.AccountProfile.route.replace(
+ "{id}",
+ userId.toString()
+ )
+ )
+ }
+ )
+ // 右侧内容区域
Row(
- modifier = Modifier.fillMaxWidth(),
- verticalAlignment = Alignment.CenterVertically,
+ modifier = Modifier
+ .weight(1f)
+ .padding(start = 8.dp),
+ verticalAlignment = Alignment.CenterVertically
) {
- CustomAsyncImage(
- context = context,
- imageUrl = avatar,
- contentDescription = nickname,
- modifier = Modifier
- .size(40.dp)
- .clip(CircleShape)
- )
- Spacer(modifier = Modifier.width(12.dp))
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = nickname,
fontWeight = FontWeight.Bold,
- fontSize = 16.sp,
+ fontSize = 14.sp,
color = AppColors.text,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
+ Spacer(modifier = Modifier.height(4.dp))
+ Text(
+ text = followText,
+ fontSize = 14.sp,
+ color = AppColors.secondaryText,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
+ )
}
if (!isFollowing && userId != AppState.UserId) {
FollowButton(
diff --git a/app/src/main/java/com/aiosman/ravenow/ui/like/LikePage.kt b/app/src/main/java/com/aiosman/ravenow/ui/like/LikePage.kt
index 190d4cf..c3581a2 100644
--- a/app/src/main/java/com/aiosman/ravenow/ui/like/LikePage.kt
+++ b/app/src/main/java/com/aiosman/ravenow/ui/like/LikePage.kt
@@ -155,64 +155,83 @@ fun ActionPostNoticeItem(
val navController = LocalNavController.current
val AppColors = LocalAppTheme.current
- Box(
- modifier = Modifier.padding(vertical = 16.dp)
+ val actionLabel = when (action) {
+ "favourite" -> stringResource(R.string.favourite_your_post)
+ else -> stringResource(R.string.like_your_post)
+ }
+
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(vertical = 12.dp, horizontal = 0.dp),
+ verticalAlignment = Alignment.CenterVertically
) {
+ CustomAsyncImage(
+ context = context,
+ imageUrl = avatar,
+ modifier = Modifier
+ .size(40.dp)
+ .clip(CircleShape)
+ .noRippleClickable {
+ navController.navigate(
+ NavigationRoute.AccountProfile.route.replace(
+ "{id}",
+ userId.toString()
+ )
+ )
+ },
+ contentDescription = action,
+ )
Row(
- modifier = Modifier.fillMaxWidth(),
- verticalAlignment = Alignment.Top,
+ modifier = Modifier
+ .weight(1f)
+ .padding(start = 8.dp)
+ .noRippleClickable {
+ navController.navigateToPost(
+ id = postId,
+ highlightCommentId = 0,
+ initImagePagerIndex = 0
+ )
+ },
+ verticalAlignment = Alignment.CenterVertically
) {
- CustomAsyncImage(
- context,
- imageUrl = avatar,
- modifier = Modifier
- .size(48.dp)
- .clip(CircleShape)
- .noRippleClickable {
- navController.navigate(
- NavigationRoute.AccountProfile.route.replace(
- "{id}",
- userId.toString()
- )
- )
- },
- contentDescription = action,
- )
- Spacer(modifier = Modifier.width(12.dp))
Column(
- modifier = Modifier
- .weight(1f)
- .noRippleClickable {
- navController.navigateToPost(
- id = postId,
- highlightCommentId = 0,
- initImagePagerIndex = 0
- )
- }
+ modifier = Modifier.weight(1f)
) {
Text(
text = nickName,
fontWeight = FontWeight.Bold,
- fontSize = 16.sp,
+ fontSize = 14.sp,
color = AppColors.text,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
- Spacer(modifier = Modifier.height(2.dp))
- when (action) {
- "like" -> Text(stringResource(R.string.like_your_post), color = AppColors.text)
- "favourite" -> Text(stringResource(R.string.favourite_your_post), color = AppColors.text)
- }
- Spacer(modifier = Modifier.height(2.dp))
- Row {
- Text(likeTime.timeAgo(context), fontSize = 12.sp, color = AppColors.secondaryText)
+ Spacer(modifier = Modifier.height(4.dp))
+ Row(
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Text(
+ text = actionLabel,
+ fontSize = 14.sp,
+ color = AppColors.secondaryText,
+ modifier = Modifier.weight(1f),
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
+ )
+ Spacer(modifier = Modifier.width(4.dp))
+ Text(
+ text = likeTime.timeAgo(context),
+ fontSize = 14.sp,
+ color = AppColors.secondaryText
+ )
}
}
+ Spacer(modifier = Modifier.width(4.dp))
CustomAsyncImage(
- context,
+ context = context,
imageUrl = thumbnail,
modifier = Modifier
- .size(48.dp)
+ .size(40.dp)
.clip(RoundedCornerShape(8.dp)),
contentDescription = action,
)
@@ -227,10 +246,11 @@ fun LikeCommentNoticeItem(
val navController = LocalNavController.current
val context = LocalContext.current
val AppColors = LocalAppTheme.current
+ val previewPost = item.comment?.replyComment?.post ?: item.comment?.post
- Box(
+ Column(
modifier = Modifier
- .padding(vertical = 16.dp)
+ .padding(vertical = 12.dp)
.noRippleClickable {
item.comment?.postId.let {
navController.navigateToPost(
@@ -241,112 +261,103 @@ fun LikeCommentNoticeItem(
}
}
) {
- Row {
- Column(
- modifier = Modifier.weight(1f)
+ Row(
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ CustomAsyncImage(
+ imageUrl = item.user.avatar,
+ modifier = Modifier
+ .size(40.dp)
+ .clip(CircleShape),
+ contentDescription = stringResource(R.string.like_your_comment)
+ )
+ Row(
+ modifier = Modifier
+ .weight(1f)
+ .padding(start = 8.dp),
+ verticalAlignment = Alignment.CenterVertically
) {
- Row(
- modifier = Modifier.fillMaxWidth(),
- verticalAlignment = Alignment.Top,
+ Column(
+ modifier = Modifier.weight(1f)
) {
- CustomAsyncImage(
- imageUrl = item.user.avatar,
- modifier = Modifier
- .size(48.dp)
- .clip(CircleShape),
- contentDescription = stringResource(R.string.like_your_comment)
+ Text(
+ text = item.user.nickName,
+ fontWeight = FontWeight.Bold,
+ fontSize = 14.sp,
+ color = AppColors.text,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
)
- Spacer(modifier = Modifier.width(12.dp))
- Column(
- modifier = Modifier
- .weight(1f)
+ Spacer(modifier = Modifier.height(4.dp))
+ Row(
+ verticalAlignment = Alignment.CenterVertically
) {
Text(
- text = item.user.nickName,
- fontWeight = FontWeight.Bold,
- fontSize = 16.sp,
- color = AppColors.text,
+ text = stringResource(R.string.like_your_comment),
+ fontSize = 14.sp,
+ color = AppColors.secondaryText,
+ modifier = Modifier.weight(1f),
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
- Spacer(modifier = Modifier.height(2.dp))
- Text(stringResource(R.string.like_your_comment), color = AppColors.text)
- Spacer(modifier = Modifier.height(2.dp))
- Row {
- Text(
- item.likeTime.timeAgo(context),
- fontSize = 12.sp,
- color = AppColors.secondaryText
- )
- }
- }
- }
- Spacer(modifier = Modifier.height(12.dp))
- Row(
- modifier = Modifier.padding(start = 48.dp)
- ) {
- Box(
- modifier = Modifier
- .size(24.dp)
- .background(Color.Gray.copy(alpha = 0.1f))
- ) {
- CustomAsyncImage(
- context = context,
- imageUrl = AppState.profile?.avatar ?: "",
- contentDescription = "Comment Profile Picture",
- modifier = Modifier
- .size(24.dp)
- .clip(RoundedCornerShape(24.dp)),
- contentScale = ContentScale.Crop
- )
- }
- Spacer(modifier = Modifier.width(8.dp))
- Column(
- modifier = Modifier.weight(1f)
- ) {
+ Spacer(modifier = Modifier.width(4.dp))
Text(
- text = AppState.profile?.nickName ?: "",
- fontWeight = FontWeight.W600,
+ text = item.likeTime.timeAgo(context),
fontSize = 14.sp,
- color = AppColors.text
- )
- Text(
- text = item.comment?.content ?: "",
- fontSize = 12.sp,
- color = AppColors.secondaryText,
- maxLines = 2
+ color = AppColors.secondaryText
)
}
}
- }
- Spacer(modifier = Modifier.width(16.dp))
- if (item.comment?.replyComment?.post != null) {
- item.comment.replyComment.post.let {
+ Spacer(modifier = Modifier.width(4.dp))
+ previewPost?.let {
CustomAsyncImage(
context = context,
imageUrl = it.images[0].thumbnail,
contentDescription = "Post Thumbnail",
modifier = Modifier
- .size(48.dp)
- .clip(RoundedCornerShape(8.dp)),
- contentScale = ContentScale.Crop
- )
- }
- } else {
- item.comment?.post?.let {
- CustomAsyncImage(
- context = context,
- imageUrl = it.images[0].thumbnail,
- contentDescription = "Post Thumbnail",
- modifier = Modifier
- .size(48.dp)
+ .size(40.dp)
.clip(RoundedCornerShape(8.dp)),
contentScale = ContentScale.Crop
)
}
}
-
-
+ }
+ Spacer(modifier = Modifier.height(8.dp))
+ Row(
+ modifier = Modifier.padding(start = 48.dp)
+ ) {
+ Box(
+ modifier = Modifier
+ .size(24.dp)
+ .background(Color.Gray.copy(alpha = 0.1f))
+ ) {
+ CustomAsyncImage(
+ context = context,
+ imageUrl = AppState.profile?.avatar ?: "",
+ contentDescription = "Comment Profile Picture",
+ modifier = Modifier
+ .size(24.dp)
+ .clip(RoundedCornerShape(24.dp)),
+ contentScale = ContentScale.Crop
+ )
+ }
+ Spacer(modifier = Modifier.width(8.dp))
+ Column(
+ modifier = Modifier.weight(1f)
+ ) {
+ Text(
+ text = AppState.profile?.nickName ?: "",
+ fontWeight = FontWeight.W600,
+ fontSize = 14.sp,
+ color = AppColors.text
+ )
+ Text(
+ text = item.comment?.content ?: "",
+ fontSize = 12.sp,
+ color = AppColors.secondaryText,
+ maxLines = 2
+ )
+ }
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/aiosman/ravenow/ui/notification/Notification.kt b/app/src/main/java/com/aiosman/ravenow/ui/notification/Notification.kt
index 20dbf7c..7f9e39a 100644
--- a/app/src/main/java/com/aiosman/ravenow/ui/notification/Notification.kt
+++ b/app/src/main/java/com/aiosman/ravenow/ui/notification/Notification.kt
@@ -107,7 +107,7 @@ fun NotificationScreen() {
TabSpacer()
TabItem(
- text = stringResource(R.string.followers_upper),
+ text = stringResource(R.string.follow_upper),
isSelected = pagerState.currentPage == 1,
onClick = {
scope.launch {
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index c7bd3a3..5287f98 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -75,6 +75,7 @@
署名
名前
コメント
+ コメント:
デフォルト
最新
最も古い
@@ -102,6 +103,7 @@
Rave Nowのプライバシーポリシー
ギャラリー
チャット
+ フォローしました
あなたの投稿にいいねしました
あなたの投稿をお気に入りにしました
あなたのコメントにいいねしました
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 9e10ddd..1e0f616 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -80,6 +80,7 @@
个性签名
昵称
评论
+ 评论:
默认
最新
最早
@@ -107,6 +108,7 @@
用户协议
图片
私信
+ 关注了你
喜欢了你的动态
收藏了你的动态
喜欢了你的评论
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 845bec5..80bb713 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -74,6 +74,7 @@
Signature
Name
COMMENTS
+ commented:
Default
Latest
Earliest
@@ -101,6 +102,7 @@
Rave Now’s Privacy Policy
Gallery
CHAT
+ followed you
Like your post
Favourite your post
Like your comment
From 084eb7bb52550e297fa966f5db0304ada782b5a0 Mon Sep 17 00:00:00 2001
From: zhong <2724770085@qq.com>
Date: Thu, 27 Nov 2025 18:57:54 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E8=81=8A=E5=A4=A9?=
=?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=8F=91=E9=80=81=E6=8C=89=E9=92=AE=E5=9B=BE?=
=?UTF-8?q?=E6=A0=87=EF=BC=9B=20=E4=BF=AE=E5=A4=8D=E7=BE=A4=E8=81=8A?=
=?UTF-8?q?=E5=A4=A9=E7=95=8C=E9=9D=A2=E9=A1=B6=E9=83=A8=E4=B8=8D=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA=E7=BE=A4=E5=A4=B4=E5=83=8F=E4=BB=A5=E5=8F=8A=E7=BB=84?=
=?UTF-8?q?=E4=BB=B6=E5=BC=82=E5=B8=B8=E6=98=BE=E7=A4=BA=EF=BC=9B=20?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BE=A4=E8=81=8A=E4=BF=A1=E6=81=AF=E7=95=8C?=
=?UTF-8?q?=E9=9D=A2=E7=BE=A4=E8=AE=B0=E5=BF=86UI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../aiosman/ravenow/ui/chat/ChatAiScreen.kt | 2 +-
.../com/aiosman/ravenow/ui/chat/ChatScreen.kt | 2 +-
.../ravenow/ui/chat/GroupChatScreen.kt | 71 ++++++-------------
.../ravenow/ui/chat/GroupChatViewModel.kt | 53 +++++++++++---
.../ravenow/ui/group/GroupChatInfoScreen.kt | 8 ++-
5 files changed, 71 insertions(+), 65 deletions(-)
diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt
index 1dbd4f6..5ef8399 100644
--- a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt
+++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatAiScreen.kt
@@ -617,7 +617,7 @@ fun ChatAiInput(
animationSpec = tween(300)
)
Image(
- painter = painterResource(R.mipmap.rider_pro_im_send),
+ painter = painterResource(R.mipmap.btn),
modifier = Modifier
.size(24.dp)
.alpha(alpha)
diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatScreen.kt
index c8cf846..981a2fc 100644
--- a/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatScreen.kt
+++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/ChatScreen.kt
@@ -650,7 +650,7 @@ fun ChatInput(
animationSpec = tween(300)
)
Image(
- painter = painterResource(R.mipmap.rider_pro_im_send),
+ painter = painterResource(R.mipmap.btn),
modifier = Modifier
.size(24.dp)
.alpha(alpha)
diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatScreen.kt
index 6845ff6..01f1724 100644
--- a/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatScreen.kt
+++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatScreen.kt
@@ -182,46 +182,22 @@ fun GroupChatScreen(groupId: String,name: String,avatar: String,) {
colorFilter = ColorFilter.tint(AppColors.text)
)
Spacer(modifier = Modifier.width(16.dp))
-
- if (viewModel.groupAvatar.isNotEmpty()) {
+
+ if (viewModel.groupInfo?.groupAvatar?.isNotEmpty() == true) {
CustomAsyncImage(
- imageUrl = viewModel.groupAvatar,
+ imageUrl = viewModel.groupInfo!!.groupAvatar,
modifier = Modifier
- .size(32.dp)
- .clip(RoundedCornerShape(8.dp))
- .noRippleClickable {
- navController.navigateToGroupInfo(groupId)
- },
+ .size(35.dp)
+ .clip(RoundedCornerShape(15.dp)),
contentDescription = "群聊头像"
)
- } else {
- Box(
- modifier = Modifier
- .size(24.dp)
- .clip(RoundedCornerShape(8.dp))
- .background(AppColors.decentBackground)
- .noRippleClickable {
- navController.navigateToGroupInfo(groupId)
- },
- contentAlignment = Alignment.Center
- ) {
- Text(
- text = viewModel.groupName,
- style = TextStyle(
- color = AppColors.text,
- fontSize = 18.sp,
-
- fontWeight = androidx.compose.ui.text.font.FontWeight.W700
- ),
- maxLines = 1,
- overflow =TextOverflow.Ellipsis,
-
- )
- }
}
Spacer(modifier = Modifier.width(8.dp))
- Column {
+ Column(
+ modifier = Modifier.weight(1f),
+ horizontalAlignment = Alignment.Start
+ ) {
Text(
text = viewModel.groupName,
style = TextStyle(
@@ -229,24 +205,21 @@ fun GroupChatScreen(groupId: String,name: String,avatar: String,) {
fontSize = 18.sp,
fontWeight = androidx.compose.ui.text.font.FontWeight.Bold
),
- maxLines = 1,
- overflow =TextOverflow.Ellipsis,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
)
}
- Spacer(modifier = Modifier.weight(1f))
- Box {
- Image(
- painter = painterResource(R.drawable.rider_pro_more_horizon),
- modifier = Modifier
- .size(28.dp)
- .noRippleClickable {
- navController.navigateToGroupInfo(groupId)
- },
- contentDescription = null,
- colorFilter = ColorFilter.tint(AppColors.text)
- )
- }
+ Image(
+ painter = painterResource(R.drawable.rider_pro_more_horizon),
+ modifier = Modifier
+ .size(28.dp)
+ .noRippleClickable {
+ navController.navigateToGroupInfo(groupId)
+ },
+ contentDescription = "更多",
+ colorFilter = ColorFilter.tint(AppColors.text)
+ )
}
}
},
@@ -677,7 +650,7 @@ fun GroupChatInput(
animationSpec = tween(300)
)
Image(
- painter = painterResource(R.mipmap.rider_pro_im_send),
+ painter = painterResource(R.mipmap.btn),
modifier = Modifier
.size(24.dp)
.alpha(alpha)
diff --git a/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatViewModel.kt b/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatViewModel.kt
index c64a773..38abb0b 100644
--- a/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatViewModel.kt
+++ b/app/src/main/java/com/aiosman/ravenow/ui/chat/GroupChatViewModel.kt
@@ -1,11 +1,13 @@
package com.aiosman.ravenow.ui.chat
import android.content.Context
+import android.util.Base64
import android.util.Log
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.viewModelScope
+import com.aiosman.ravenow.AppStore
import com.aiosman.ravenow.data.api.ApiClient
import com.aiosman.ravenow.data.api.SendChatAiRequestBody
import io.openim.android.sdk.enums.ConversationType
@@ -50,17 +52,46 @@ class GroupChatViewModel(
}
private suspend fun getGroupInfo() {
- // 简化群组信息获取,使用默认信息
- groupInfo = GroupInfo(
- groupId = groupId,
- groupName = name,
- groupAvatar = avatar,
- memberCount = 0,
- ownerId = ""
- )
- groupName = groupInfo?.groupName ?: ""
- groupAvatar = groupInfo?.groupAvatar ?: ""
- memberCount = groupInfo?.memberCount ?: 0
+ try {
+ val response = ApiClient.api.getRoomDetail(trtcId = groupId)
+ val room = response.body()?.data
+ groupInfo = room?.let {
+ GroupInfo(
+ groupId = groupId,
+ groupName = it.name,
+ groupAvatar = if (it.avatar.isNullOrEmpty()) {
+ val groupIdBase64 = Base64.encodeToString(
+ groupId.toByteArray(),
+ Base64.NO_WRAP
+ )
+ "${ApiClient.RETROFIT_URL}group/avatar?groupIdBase64=$groupIdBase64&token=${AppStore.token}"
+ } else {
+ "${ApiClient.BASE_API_URL}/outside${it.avatar}?token=${AppStore.token}"
+ },
+ memberCount = it.userCount,
+ ownerId = it.creator.userId
+ )
+ } ?: GroupInfo(
+ groupId = groupId,
+ groupName = name,
+ groupAvatar = avatar,
+ memberCount = 0,
+ ownerId = ""
+ )
+ } catch (e: Exception) {
+ Log.e("GroupChatViewModel", "加载群信息失败: ${e.message}", e)
+ groupInfo = GroupInfo(
+ groupId = groupId,
+ groupName = name,
+ groupAvatar = avatar,
+ memberCount = 0,
+ ownerId = ""
+ )
+ } finally {
+ groupName = groupInfo?.groupName ?: ""
+ groupAvatar = groupInfo?.groupAvatar ?: ""
+ memberCount = groupInfo?.memberCount ?: 0
+ }
}
override fun getConversationParams(): Triple {
diff --git a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoScreen.kt
index 3bb6e71..fa30f92 100644
--- a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoScreen.kt
+++ b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoScreen.kt
@@ -2,6 +2,7 @@ package com.aiosman.ravenow.ui.group
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
+import androidx.compose.foundation.border
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
@@ -302,8 +303,9 @@ fun GroupChatInfoScreen(groupId: String) {
Column(
modifier = Modifier
.fillMaxWidth()
+ .border(1.dp, AppColors.decentBackground, RoundedCornerShape(12.dp))
.clip(RoundedCornerShape(12.dp))
- .background(AppColors.decentBackground.copy(alpha = 0.28f))
+ .background(AppColors.background)
.padding(12.dp)
) {
Row(verticalAlignment = Alignment.CenterVertically) {
@@ -340,7 +342,7 @@ fun GroupChatInfoScreen(groupId: String) {
modifier = Modifier
.weight(1f)
.clip(RoundedCornerShape(20.dp))
- .background(AppColors.background)
+ .background(AppColors.decentBackground)
.padding(vertical = 8.dp)
.noRippleClickable {
showAddMemoryDialog = true
@@ -359,7 +361,7 @@ fun GroupChatInfoScreen(groupId: String) {
modifier = Modifier
.weight(1f)
.clip(RoundedCornerShape(20.dp))
- .background(AppColors.background)
+ .background(AppColors.decentBackground)
.padding(vertical = 8.dp)
.noRippleClickable {
showMemoryManageDialog = true