From 775c6a3c1483a85ea887d2cf7b4f85e5276e8ed1 Mon Sep 17 00:00:00 2001 From: AllenTom Date: Thu, 3 Oct 2024 16:38:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=AA=E4=BA=BA=E4=B8=BB?= =?UTF-8?q?=E9=A1=B5=E5=8F=8A=E5=85=B6=E4=BB=96=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 个人主页UI更新,支持工具栏滚动 - 调整个人主页背景颜色 - 更新个人主页为空时的 UI - 更新用户信息编辑页面样式 - 更新点赞和收藏通知页面的文案 - 更新点赞和收藏通知页面的国际化 - 修复 UserContentPageIndicator 的滚动问题 - 更新评论通知页面的标题文案 - 更新评论通知页面的国际化 --- .../com/aiosman/riderpro/ui/account/edit2.kt | 33 ++++++----- .../ui/comment/notice/CommentNotice.kt | 4 +- .../toolbar/CollapsingToolbarScaffold.kt | 34 ++++++++++++ .../toolbar/ToolbarWithFabScaffold.kt | 4 +- .../ui/index/tabs/profile/ProfileV3.kt | 55 +++++++++---------- .../composable/UserContentPageIndicator.kt | 3 + .../com/aiosman/riderpro/ui/like/LikePage.kt | 29 +++++----- app/src/main/res/values-zh/strings.xml | 3 + app/src/main/res/values/strings.xml | 3 + 9 files changed, 107 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/com/aiosman/riderpro/ui/account/edit2.kt b/app/src/main/java/com/aiosman/riderpro/ui/account/edit2.kt index 792d834..8d6b0cb 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/account/edit2.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/account/edit2.kt @@ -161,7 +161,7 @@ fun AccountEditScreen2() { } Column( modifier = Modifier - .fillMaxSize(), + .fillMaxSize().background(Color.White), horizontalAlignment = Alignment.CenterHorizontally ) { StatusBarSpacer() @@ -210,13 +210,13 @@ fun AccountEditScreen2() { .size(32.dp) .clip(CircleShape) .background(AppColors.mainColor) - .align(Alignment.BottomEnd).noRippleClickable { + .align(Alignment.BottomEnd) + .noRippleClickable { Intent(Intent.ACTION_PICK).apply { type = "image/*" pickImageLauncher.launch(this) } - } - , + }, contentAlignment = Alignment.Center ) { Icon( @@ -229,14 +229,16 @@ fun AccountEditScreen2() { } Spacer(modifier = Modifier.height(46.dp)) Column( - modifier = Modifier.padding(horizontal = 24.dp).border( - width = 1.dp, - color = Color(0xFFEBEBEB), - ) + modifier = Modifier + .padding(horizontal = 16.dp) ) { Row( - modifier = Modifier.padding(16.dp), + modifier = Modifier + .clip(RoundedCornerShape(24.dp)) + .background(Color(0xfff8f8f8)) + .padding(16.dp), verticalAlignment = Alignment.CenterVertically + ) { Text( text = stringResource(R.string.nickname), @@ -263,15 +265,12 @@ fun AccountEditScreen2() { .padding(start = 16.dp) ) } - Box( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .padding(horizontal = 16.dp) - .background(Color(0xFFEBEBEB)) - ) + Spacer(modifier = Modifier.height(16.dp)) Row( - modifier = Modifier.padding(16.dp), + modifier = Modifier + .clip(RoundedCornerShape(16.dp)) + .background(Color(0xfff8f8f8)) + .padding(16.dp), verticalAlignment = Alignment.CenterVertically ) { Text( diff --git a/app/src/main/java/com/aiosman/riderpro/ui/comment/notice/CommentNotice.kt b/app/src/main/java/com/aiosman/riderpro/ui/comment/notice/CommentNotice.kt index 66d8115..bf5ca0c 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/comment/notice/CommentNotice.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/comment/notice/CommentNotice.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -32,6 +33,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import androidx.paging.LoadState import androidx.paging.compose.collectAsLazyPagingItems import com.aiosman.riderpro.LocalNavController +import com.aiosman.riderpro.R import com.aiosman.riderpro.entity.CommentEntity import com.aiosman.riderpro.exp.timeAgo import com.aiosman.riderpro.ui.NavigationRoute @@ -68,7 +70,7 @@ fun CommentNoticeScreen() { .fillMaxWidth() .padding(16.dp) ) { - NoticeScreenHeader("Comment", moreIcon = false) + NoticeScreenHeader(stringResource(R.string.comment), moreIcon = false) } LazyColumn( diff --git a/app/src/main/java/com/aiosman/riderpro/ui/composables/toolbar/CollapsingToolbarScaffold.kt b/app/src/main/java/com/aiosman/riderpro/ui/composables/toolbar/CollapsingToolbarScaffold.kt index 1805abc..a93d3c0 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/composables/toolbar/CollapsingToolbarScaffold.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/composables/toolbar/CollapsingToolbarScaffold.kt @@ -22,7 +22,13 @@ package com.aiosman.riderpro.ui.composables.toolbar +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.gestures.ScrollableDefaults +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.mutableStateOf @@ -35,7 +41,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.layout.Layout import androidx.compose.ui.layout.ParentDataModifier +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.IntSize import kotlin.math.max @@ -87,6 +95,7 @@ fun CollapsingToolbarScaffold( enabled: Boolean = true, toolbarModifier: Modifier = Modifier, toolbarClipToBounds: Boolean = true, + toolbarScrollable: Boolean = false, toolbar: @Composable CollapsingToolbarScope.() -> Unit, body: @Composable CollapsingToolbarScaffoldScope.() -> Unit ) { @@ -98,6 +107,7 @@ fun CollapsingToolbarScaffold( } val toolbarState = state.toolbarState + val toolbarScrollState = rememberScrollState() Layout( content = { @@ -106,6 +116,12 @@ fun CollapsingToolbarScaffold( clipToBounds = toolbarClipToBounds, collapsingToolbarState = toolbarState, ) { + ToolbarScrollableBox( + enabled, + toolbarScrollable, + toolbarState, + toolbarScrollState + ) toolbar() } @@ -181,6 +197,24 @@ fun CollapsingToolbarScaffold( } } +@Composable +private fun ToolbarScrollableBox( + enabled: Boolean, + toolbarScrollable: Boolean, + toolbarState: CollapsingToolbarState, + toolbarScrollState: ScrollState +) { + val toolbarScrollableEnabled = enabled && toolbarScrollable + if (toolbarScrollableEnabled && toolbarState.height != Constraints.Infinity) { + Box( + modifier = Modifier + .fillMaxWidth() + .height(with(LocalDensity.current) { toolbarState.height.toDp() }) + .verticalScroll(state = toolbarScrollState) + ) + } +} + internal object CollapsingToolbarScaffoldScopeInstance: CollapsingToolbarScaffoldScope { @ExperimentalToolbarApi override fun Modifier.align(alignment: Alignment): Modifier = diff --git a/app/src/main/java/com/aiosman/riderpro/ui/composables/toolbar/ToolbarWithFabScaffold.kt b/app/src/main/java/com/aiosman/riderpro/ui/composables/toolbar/ToolbarWithFabScaffold.kt index 581a12b..4034204 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/composables/toolbar/ToolbarWithFabScaffold.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/composables/toolbar/ToolbarWithFabScaffold.kt @@ -15,6 +15,7 @@ fun ToolbarWithFabScaffold( toolbarModifier: Modifier = Modifier, toolbarClipToBounds: Boolean = true, toolbar: @Composable CollapsingToolbarScope.() -> Unit, + toolbarScrollable: Boolean = false, fab: @Composable () -> Unit, fabPosition: FabPosition = FabPosition.End, body: @Composable CollapsingToolbarScaffoldScope.() -> Unit @@ -37,7 +38,8 @@ fun ToolbarWithFabScaffold( toolbarModifier = toolbarModifier, toolbarClipToBounds = toolbarClipToBounds, toolbar = toolbar, - body = body + body = body, + toolbarScrollable = toolbarScrollable ) }.map { it.measure(toolbarScaffoldConstraints) } diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/ProfileV3.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/ProfileV3.kt index 11b46d3..0d48f50 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/ProfileV3.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/ProfileV3.kt @@ -8,6 +8,7 @@ import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -33,6 +34,7 @@ import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add @@ -48,8 +50,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow +import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalContext @@ -58,8 +64,11 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.media3.common.util.Log +import androidx.media3.common.util.UnstableApi import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems +import com.aiosman.riderpro.AppState import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.R import com.aiosman.riderpro.entity.AccountProfileEntity @@ -122,9 +131,12 @@ fun ProfileV3( Box { CollapsingToolbarScaffold( - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize() + .background(Color(0xfff8f8f8)), state = state, scrollStrategy = ScrollStrategy.ExitUntilCollapsed, + toolbarScrollable = true, enabled = enabled, toolbar = { Column( @@ -133,8 +145,6 @@ fun ProfileV3( // 保持在最低高度和当前高度之间 .background(Color(0xfff8f8f8)) .padding(horizontal = 16.dp) - - ) { StatusBarSpacer() @@ -161,20 +171,6 @@ fun ProfileV3( } Spacer(modifier = Modifier.height(8.dp)) } -// Column( -// modifier = Modifier.fillMaxWidth() -// -// ) { -// StatusBarSpacer() -// Box( -// modifier = Modifier -// .background(Color.White) -// .fillMaxWidth() -// .height(64.dp) -// ) { -// -// } -// } Box( modifier = Modifier .parallax(0.5f) @@ -333,15 +329,18 @@ fun ProfileV3( navController.navigate(NavigationRoute.AccountEdit.route) } } else { - OtherProfileAction( - it, - onFollow = { - onFollowClick() - }, - onChat = { - onChatClick() - } - ) + if (it.id != AppState.UserId) { + OtherProfileAction( + it, + onFollow = { + onFollowClick() + }, + onChat = { + onChatClick() + } + ) + } + } } @@ -414,7 +413,7 @@ fun ProfileV3( } items(moments.itemCount) { idx -> val moment = moments[idx] ?: return@items - GalleryItem(moment,idx) + GalleryItem(moment, idx) } items(2) { Spacer(modifier = Modifier.height(120.dp)) @@ -426,7 +425,7 @@ fun ProfileV3( modifier = Modifier .fillMaxSize() ) { - if (moments.itemCount == 0) { + if (moments.itemCount == 0 && isSelf) { item { EmptyMomentPostUnit() } diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/composable/UserContentPageIndicator.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/composable/UserContentPageIndicator.kt index bba2652..ac88ada 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/composable/UserContentPageIndicator.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/composable/UserContentPageIndicator.kt @@ -9,7 +9,9 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.pager.PagerState +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope @@ -33,6 +35,7 @@ fun UserContentPageIndicator( val scope = rememberCoroutineScope() Row( modifier = Modifier + .verticalScroll(rememberScrollState()) .fillMaxWidth() .padding(horizontal = 16.dp), ) { diff --git a/app/src/main/java/com/aiosman/riderpro/ui/like/LikePage.kt b/app/src/main/java/com/aiosman/riderpro/ui/like/LikePage.kt index bfea935..d3067ef 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/like/LikePage.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/like/LikePage.kt @@ -114,7 +114,6 @@ fun LikeNoticeScreen() { } } - @Composable fun ActionPostNoticeItem( avatar: String, @@ -165,8 +164,8 @@ fun ActionPostNoticeItem( Text(nickName, fontWeight = FontWeight.Bold, fontSize = 16.sp) Spacer(modifier = Modifier.height(2.dp)) when (action) { - "like" -> Text("Like your post") - "favourite" -> Text("Favourite your post") + "like" -> Text(stringResource(R.string.like_your_post)) + "favourite" -> Text(stringResource(R.string.favourite_your_post)) } Spacer(modifier = Modifier.height(2.dp)) Row { @@ -190,16 +189,18 @@ fun LikeCommentNoticeItem( val navController = LocalNavController.current val context = LocalContext.current Box( - modifier = Modifier.padding(vertical = 16.dp).noRippleClickable { - item.comment?.postId.let { - navController.navigateToPost( - id = it ?: 0, - highlightCommentId = item.comment?.id ?: 0, - initImagePagerIndex = 0 - ) - } + modifier = Modifier + .padding(vertical = 16.dp) + .noRippleClickable { + item.comment?.postId.let { + navController.navigateToPost( + id = it ?: 0, + highlightCommentId = item.comment?.id ?: 0, + initImagePagerIndex = 0 + ) + } - } + } ) { Column( @@ -213,7 +214,7 @@ fun LikeCommentNoticeItem( modifier = Modifier .size(48.dp) .clip(CircleShape), - contentDescription = "Like your comment" + contentDescription = stringResource(R.string.like_your_comment) ) Spacer(modifier = Modifier.width(12.dp)) Column( @@ -222,7 +223,7 @@ fun LikeCommentNoticeItem( ) { Text(item.user.nickName, fontWeight = FontWeight.Bold, fontSize = 16.sp) Spacer(modifier = Modifier.height(2.dp)) - Text("Like your comment") + Text(stringResource(R.string.like_your_comment)) Spacer(modifier = Modifier.height(2.dp)) Row { Text( diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 680d3cd..b70f712 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -76,4 +76,7 @@ 用户协议 图片 私信 + 喜欢了你的动态 + 收藏了你的动态 + 喜欢了你的评论 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c968e96..56b3f40 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -75,4 +75,7 @@ Rider Pro’s Privacy Policy Gallery CHAT + Like your post + Favourite your post + Like your comment \ No newline at end of file