20250723-Test Push

This commit is contained in:
weber
2025-07-23 19:07:29 +08:00
parent 9f93e6dc14
commit 6ec732b996
36 changed files with 730 additions and 155 deletions

2
.idea/compiler.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
<bytecodeTargetLevel target="21" />
</component>
</project>

2
.idea/gradle.xml generated
View File

@@ -4,6 +4,7 @@
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
@@ -12,7 +13,6 @@
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>

View File

@@ -65,6 +65,10 @@
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewParameterProviderOnFirstParameter" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />

3
.idea/misc.xml generated
View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View File

@@ -5,8 +5,12 @@
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>

View File

@@ -16,10 +16,10 @@ import com.aiosman.ravenow.entity.AccountProfileEntity
import com.aiosman.ravenow.ui.favourite.FavouriteListViewModel
import com.aiosman.ravenow.ui.favourite.FavouriteNoticeViewModel
import com.aiosman.ravenow.ui.follower.FollowerNoticeViewModel
import com.aiosman.ravenow.ui.follower.FollowingListViewModel
import com.aiosman.ravenow.ui.index.IndexViewModel
import com.aiosman.ravenow.ui.index.tabs.message.MessageListViewModel
import com.aiosman.ravenow.ui.index.tabs.moment.tabs.expolre.MomentExploreViewModel
import com.aiosman.ravenow.ui.index.tabs.moment.tabs.hot.HotMomentViewModel
import com.aiosman.ravenow.ui.index.tabs.moment.tabs.timeline.TimelineMomentViewModel
import com.aiosman.ravenow.ui.index.tabs.profile.MyProfileViewModel
import com.aiosman.ravenow.ui.index.tabs.search.DiscoverViewModel
@@ -152,6 +152,8 @@ object AppState {
// 重置动态列表页面
TimelineMomentViewModel.ResetModel()
MomentExploreViewModel.ResetModel()
HotMomentViewModel.ResetModel()
// 重置我的页面
MyProfileViewModel.ResetModel()
// 重置发现页面

View File

@@ -25,6 +25,7 @@ open class AppThemeData(
var checkedBackground: Color,
var checkedText: Color,
var chatActionColor: Color,
var brandColorsColor: Color,
)
class LightThemeColors : AppThemeData(
@@ -33,7 +34,7 @@ class LightThemeColors : AppThemeData(
basicMain = Color(0xfff0f0f0),
nonActive = Color(0xfff5f5f5),
text = Color(0xff333333),
nonActiveText = Color(0xff333333),
nonActiveText = Color(0xff3C3C43),
secondaryText = Color(0x99000000),
loadingMain = Color(0xFFD95757),
loadingText = Color(0xffffffff),
@@ -46,7 +47,8 @@ class LightThemeColors : AppThemeData(
checkedBackground = Color(0xff000000),
checkedText = Color(0xffFFFFFF),
decentBackground = Color(0xfff5f5f5),
chatActionColor = Color(0xffe0e0e0)
chatActionColor = Color(0xffe0e0e0),
brandColorsColor = Color(0xffD80264),
)
@@ -69,5 +71,6 @@ class DarkThemeColors : AppThemeData(
checkedBackground = Color(0xffffffff),
checkedText = Color(0xff000000),
decentBackground = Color(0xFF171717),
chatActionColor = Color(0xFF3D3D3D)
chatActionColor = Color(0xFF3D3D3D),
brandColorsColor = Color(0xffD80264),
)

View File

@@ -30,7 +30,7 @@ fun showLikeNotification(context: Context, title: String, message: String, postI
)
val notificationBuilder = NotificationCompat.Builder(context, channelId)
.setSmallIcon(R.drawable.rider_pro_favoriate)
.setSmallIcon(R.drawable.rider_pro_favourite)
.setContentTitle(title)
.setContentText(message)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)

View File

@@ -23,7 +23,7 @@ import com.aiosman.ravenow.ui.modifiers.noRippleClickable
@Composable
fun FollowButton(
isFollowing: Boolean,
fontSize: TextUnit = 12.sp,
fontSize: TextUnit = 14.sp,
onFollowClick: () -> Unit,
){
val AppColors = LocalAppTheme.current
@@ -45,7 +45,7 @@ fun FollowButton(
R.string.follow_upper
),
fontSize = fontSize,
color = if (isFollowing) AppColors.mainText else AppColors.nonActiveText,
color = if (isFollowing) AppColors.mainText else AppColors.text,
style = TextStyle(fontWeight = FontWeight.Bold)
)
}

View File

@@ -19,8 +19,10 @@ import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredWidth
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.DrawerValue
import androidx.compose.material3.Icon
import androidx.compose.material3.ModalNavigationDrawer
@@ -39,6 +41,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.scale
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
@@ -49,6 +52,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.aiosman.ravenow.AppState
import com.aiosman.ravenow.AppStore
import com.aiosman.ravenow.LocalAppTheme
@@ -79,7 +83,7 @@ fun IndexScreen() {
val navController = LocalNavController.current
val item = listOf(
NavigationItem.Home,
NavigationItem.Search,
NavigationItem.Ai,
NavigationItem.Add,
NavigationItem.Notification,
NavigationItem.Profile
@@ -171,6 +175,26 @@ fun IndexScreen() {
.background(AppColors.divider)
)
}
NavItem(
iconRes = R.drawable.rave_now_nav_about,
label = stringResource(R.string.blocked),
modifier = Modifier.noRippleClickable {
coroutineScope.launch {
drawerState.close()
navController.navigate(NavigationRoute.AboutScreen.route)
}
}
)
NavItem(
iconRes = R.drawable.rave_now_nav_about,
label = stringResource(R.string.feedback),
modifier = Modifier.noRippleClickable {
coroutineScope.launch {
drawerState.close()
navController.navigate(NavigationRoute.AboutScreen.route)
}
}
)
NavItem(
iconRes = R.drawable.rave_now_nav_about,
label = stringResource(R.string.about_rave_now),
@@ -233,15 +257,16 @@ fun IndexScreen() {
bottomBar = {
NavigationBar(
modifier = Modifier.height(56.dp + navigationBarHeight),
containerColor = Color.Black
containerColor = AppColors.background
) {
item.forEachIndexed { idx, it ->
val isSelected = model.tabIndex == idx
val iconTint by animateColorAsState(
targetValue = if (isSelected) Color.White else Color.White,
targetValue = if (isSelected) AppColors.brandColorsColor else AppColors.text,
animationSpec = tween(durationMillis = 250), label = ""
)
NavigationBarItem(
modifier = Modifier.padding(top = 6.dp),
selected = isSelected,
onClick = {
if (it.route === NavigationItem.Add.route) {
@@ -256,7 +281,7 @@ fun IndexScreen() {
},
colors = NavigationBarItemColors(
selectedTextColor = Color.Red,
selectedIndicatorColor = Color.Black,
selectedIndicatorColor = Color.Transparent,
unselectedTextColor = Color.Red,
disabledIconColor = Color.Red,
disabledTextColor = Color.Red,
@@ -264,6 +289,16 @@ fun IndexScreen() {
unselectedIconColor = iconTint,
),
icon = {
Box(
modifier = Modifier
.width(46.dp)
.height(30.dp)
.background(
color = if (isSelected) AppColors.brandColorsColor.copy(alpha = 0.1f) else Color.Transparent ,
shape = RoundedCornerShape(10.dp)
),
contentAlignment = Alignment.Center
) {
Icon(
modifier = Modifier.size(24.dp),
imageVector = if (isSelected) it.selectedIcon() else it.icon(),
@@ -271,6 +306,16 @@ fun IndexScreen() {
tint = iconTint
)
}
},
label = {
Text(
modifier = Modifier.padding(0.dp),
text = it.label(),
fontSize = 9.sp,
color = if (isSelected) AppColors.brandColorsColor else AppColors.text,
)
}
)
}
}

View File

@@ -1,47 +1,59 @@
package com.aiosman.ravenow.ui.index
import android.graphics.Color
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import com.aiosman.ravenow.R
sealed class NavigationItem(
val route: String,
val icon: @Composable () -> ImageVector,
val selectedIcon: @Composable () -> ImageVector = icon
val selectedIcon: @Composable () -> ImageVector = icon,
val label: @Composable () -> String
) {
data object Home : NavigationItem("Home",
icon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_home) },
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_home_hl) }
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_home_hl) },
label = { stringResource(R.string.main_home) }
)
data object Street : NavigationItem("Street",
icon = { ImageVector.vectorResource(R.drawable.rider_pro_location) },
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_location_filed) }
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_location_filed) },
label = { stringResource(R.string.main_home) }
)
data object Add : NavigationItem("Add",
icon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_post_hl) },
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_post_hl) }
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_post_hl) },
label = { "" }
)
data object Message : NavigationItem("Message",
icon = { ImageVector.vectorResource(R.drawable.rider_pro_video_outline) },
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_video) }
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_video) },
label = { stringResource(R.string.main_home) }
)
data object Notification : NavigationItem("Notification",
icon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_notification)},
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_notification_hl) }
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_notification) },
label = { stringResource(R.string.main_message) }
)
data object Profile : NavigationItem("Profile",
icon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_profile) },
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_profile_hl) }
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_profile_hl) },
label = { stringResource(R.string.main_profile) }
)
data object Search : NavigationItem("Search",
data object Ai : NavigationItem("Ai",
icon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_search) },
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_search_hl) }
selectedIcon = { ImageVector.vectorResource(R.drawable.rider_pro_nav_search_hl) },
label = { stringResource(R.string.main_ai) }
)
}

View File

@@ -86,9 +86,41 @@ fun NotificationsScreen() {
.weight(1f)
.pullRefresh(state)
) {
Column(
modifier = Modifier.fillMaxSize(),
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically
) {
// 左侧 Columnlabel 居中显示
Column(
modifier = Modifier
.weight(1f)
.align(Alignment.CenterVertically),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = stringResource(R.string.main_message),
fontSize = 16.sp,
color = AppColors.text
)
}
// 右侧图片按钮:靠右显示
Image(
painter = painterResource(id = R.drawable.rider_pro_favourite),
contentDescription = stringResource(R.string.main_message),
modifier = Modifier
.size(24.dp)
.noRippleClickable {
// 点击事件
}
)
}
Row(
modifier = Modifier
.fillMaxWidth()
@@ -97,8 +129,9 @@ fun NotificationsScreen() {
) {
NotificationIndicator(
MessageListViewModel.likeNoticeCount,
R.drawable.rider_pro_moment_like,
stringResource(R.string.like_upper)
R.mipmap.rider_pro_like,
stringResource(R.string.like_upper),
Color(0xFFFAFD5D)
) {
if (MessageListViewModel.likeNoticeCount > 0) {
// 刷新点赞消息列表
@@ -110,8 +143,9 @@ fun NotificationsScreen() {
}
NotificationIndicator(
MessageListViewModel.followNoticeCount,
R.drawable.rider_pro_followers,
stringResource(R.string.followers_upper)
R.mipmap.rider_pro_followers,
stringResource(R.string.followers_upper),
Color(0xFFF470FE)
) {
if (MessageListViewModel.followNoticeCount > 0) {
// 刷新关注消息列表
@@ -122,8 +156,9 @@ fun NotificationsScreen() {
}
NotificationIndicator(
MessageListViewModel.commentNoticeCount,
R.drawable.rider_pro_comment,
stringResource(R.string.comment).uppercase()
R.mipmap.rider_pro_comment,
stringResource(R.string.comment).uppercase(),
Color(0xFF6246FF)
) {
navController.navigate(NavigationRoute.CommentNoticeScreen.route)
}
@@ -170,6 +205,7 @@ fun NotificationIndicator(
notificationCount: Int,
iconRes: Int,
label: String,
backgroundColor: Color = Color.Transparent,
onClick: () -> Unit
) {
val AppColors = LocalAppTheme.current
@@ -204,19 +240,22 @@ fun NotificationIndicator(
horizontalAlignment = Alignment.CenterHorizontally,
) {
Box(
modifier = Modifier.padding(16.dp)
modifier = Modifier
.size(64.dp)
.background(color = backgroundColor,
shape = RoundedCornerShape(16.dp)),
contentAlignment = Alignment.Center
) {
Image(
painter = painterResource(id = iconRes),
contentDescription = label,
modifier = Modifier.size(24.dp),
colorFilter = ColorFilter.tint(AppColors.text)
modifier = Modifier.size(24.dp)
)
}
Box(
modifier = Modifier
) {
Text(label, modifier = Modifier.align(Alignment.Center), color = AppColors.text)
Text(label, modifier = Modifier.align(Alignment.Center).padding(top = 8.dp), color = AppColors.text)
}
}

View File

@@ -14,26 +14,36 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.aiosman.ravenow.LocalAppTheme
import com.aiosman.ravenow.LocalNavController
import com.aiosman.ravenow.R
import com.aiosman.ravenow.ui.NavigationRoute
import com.aiosman.ravenow.ui.index.tabs.moment.tabs.expolre.ExploreMomentsList
import com.aiosman.ravenow.ui.index.tabs.moment.tabs.hot.HotMomentsList
import com.aiosman.ravenow.ui.index.tabs.moment.tabs.timeline.TimelineMomentsList
import com.aiosman.ravenow.ui.index.tabs.search.SearchViewModel
import com.aiosman.ravenow.ui.modifiers.noRippleClickable
import kotlinx.coroutines.launch
@@ -44,10 +54,11 @@ import kotlinx.coroutines.launch
@Composable
fun MomentsList() {
val AppColors = LocalAppTheme.current
val navController = LocalNavController.current
val navigationBarPaddings =
WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + 48.dp
val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues()
var pagerState = rememberPagerState { 2 }
var pagerState = rememberPagerState { 3 }
var scope = rememberCoroutineScope()
Column(
modifier = Modifier
@@ -63,7 +74,7 @@ fun MomentsList() {
.fillMaxWidth()
.height(44.dp),
// center the tabs
horizontalArrangement = Arrangement.Center,
horizontalArrangement = Arrangement.Start,
verticalAlignment = Alignment.CenterVertically
) {
Column(
@@ -72,24 +83,28 @@ fun MomentsList() {
scope.launch {
pagerState.animateScrollToPage(0)
}
},
}.padding(start = 16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = stringResource(R.string.index_worldwide), fontSize = 16.sp, color = AppColors.text,fontWeight = FontWeight.W600)
Text(
text = stringResource(R.string.index_worldwide),
fontSize = 16.sp,
color = if (pagerState.currentPage == 0) AppColors.text else AppColors.nonActiveText,
fontWeight = FontWeight.W600)
Spacer(modifier = Modifier.height(4.dp))
Box(
modifier = Modifier
.width(48.dp)
.width(34.dp)
.height(4.dp)
.clip(RoundedCornerShape(16.dp))
.background(if (pagerState.currentPage == 0) AppColors.text else AppColors.background)
.background(if (pagerState.currentPage == 0) AppColors.brandColorsColor else AppColors.background)
)
}
Spacer(modifier = Modifier.width(32.dp))
Spacer(modifier = Modifier.width(16.dp))
Column(
modifier = Modifier
.noRippleClickable {
@@ -100,18 +115,67 @@ fun MomentsList() {
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = stringResource(R.string.index_following), fontSize = 16.sp, color = AppColors.text, fontWeight = FontWeight.W600)
Text(
text = stringResource(R.string.index_following),
fontSize = 16.sp,
color = if (pagerState.currentPage == 1) AppColors.text else AppColors.nonActiveText,
fontWeight = FontWeight.W600)
Spacer(modifier = Modifier.height(4.dp))
Box(
modifier = Modifier
.width(48.dp)
.width(34.dp)
.height(4.dp)
.clip(RoundedCornerShape(16.dp))
.background(if (pagerState.currentPage == 1) AppColors.text else AppColors.background)
.background(if (pagerState.currentPage == 1) AppColors.brandColorsColor else AppColors.background)
)
}
//热门tab
Spacer(modifier = Modifier.width(16.dp))
Column(
modifier = Modifier
.noRippleClickable {
scope.launch {
pagerState.animateScrollToPage(2)
}
},
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = stringResource(R.string.index_hot),
fontSize = 16.sp,
color = if (pagerState.currentPage == 2) AppColors.text else AppColors.nonActiveText,
fontWeight = FontWeight.W600)
Spacer(modifier = Modifier.height(4.dp))
Box(
modifier = Modifier
.width(34.dp)
.height(4.dp)
.clip(RoundedCornerShape(16.dp))
.background(if (pagerState.currentPage == 2) AppColors.brandColorsColor else AppColors.background)
)
}
//搜索按钮
Column(
modifier = Modifier
.padding(bottom = 8.dp, end = 16.dp)
.fillMaxWidth(),
horizontalAlignment = Alignment.End
) {
Icon(
ImageVector.vectorResource(R.drawable.rider_pro_nav_search),
contentDescription = "Clickable Icon",
tint = AppColors.text,
modifier = Modifier.size(24.dp)
.noRippleClickable {
navController.navigate(NavigationRoute.Search.route)
}
)
}
}
HorizontalPager(
@@ -128,6 +192,11 @@ fun MomentsList() {
1 -> {
TimelineMomentsList()
}
2 -> {
HotMomentsList()
}
}
}
}

View File

@@ -0,0 +1,52 @@
package com.aiosman.ravenow.ui.index.tabs.moment.tabs.hot
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import androidx.paging.cachedIn
import com.aiosman.ravenow.AppState
import com.aiosman.ravenow.data.MomentService
import com.aiosman.ravenow.entity.MomentEntity
import com.aiosman.ravenow.entity.MomentLoaderExtraArgs
import com.aiosman.ravenow.entity.MomentPagingSource
import com.aiosman.ravenow.entity.MomentRemoteDataSource
import com.aiosman.ravenow.entity.MomentServiceImpl
import com.aiosman.ravenow.ui.index.tabs.moment.BaseMomentModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
object HotMomentViewModel : ViewModel() {
private val momentService: MomentService = MomentServiceImpl()
private val _discoverMomentsFlow =
MutableStateFlow<PagingData<MomentEntity>>(PagingData.empty())
val discoverMomentsFlow = _discoverMomentsFlow.asStateFlow()
var firstLoad = true
fun refreshPager() {
if (!firstLoad) {
return
}
firstLoad = false
viewModelScope.launch {
Pager(
config = PagingConfig(pageSize = 5, enablePlaceholders = false),
pagingSourceFactory = {
MomentPagingSource(
MomentRemoteDataSource(momentService),
trend = true
)
}
).flow.cachedIn(viewModelScope).collectLatest {
_discoverMomentsFlow.value = it
}
}
}
fun ResetModel(){
firstLoad = true
}
}

View File

@@ -0,0 +1,145 @@
package com.aiosman.ravenow.ui.index.tabs.moment.tabs.hot
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.paging.compose.collectAsLazyPagingItems
import com.aiosman.ravenow.LocalAppTheme
import com.aiosman.ravenow.LocalNavController
import com.aiosman.ravenow.R
import com.aiosman.ravenow.ui.NavigationRoute
import com.aiosman.ravenow.ui.composables.CustomAsyncImage
import com.aiosman.ravenow.ui.composables.StatusBarSpacer
import com.aiosman.ravenow.ui.index.tabs.search.SearchViewModel
import com.aiosman.ravenow.ui.modifiers.noRippleClickable
import com.aiosman.ravenow.ui.navigateToPost
/**
* 动态列表
*/
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun HotMomentsList() {
val model = HotMomentViewModel
val AppColors = LocalAppTheme.current
val navController = LocalNavController.current
val navigationBarPaddings =
WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + 48.dp
LaunchedEffect(Unit) {
HotMomentViewModel.refreshPager()
}
var refreshing by remember { mutableStateOf(false) }
val state = rememberPullRefreshState(refreshing, onRefresh = {
model.refreshPager()
})
Column(
modifier = Modifier
.fillMaxSize()
.pullRefresh(state)
) {
Column(
modifier = Modifier.fillMaxWidth().background(
AppColors.background).padding(bottom = 0.dp)
) {
}
Box(
modifier = Modifier
.fillMaxWidth()
.weight(1f)
) {
DiscoverView()
PullRefreshIndicator(refreshing, state, Modifier.align(Alignment.TopCenter))
}
}
}
@Composable
fun DiscoverView() {
val model = HotMomentViewModel
var dataFlow = model.discoverMomentsFlow
var moments = dataFlow.collectAsLazyPagingItems()
val context = LocalContext.current
val navController = LocalNavController.current
LazyVerticalGrid(
columns = GridCells.Fixed(3),
modifier = Modifier.fillMaxSize().padding(bottom = 8.dp),
// contentPadding = PaddingValues(8.dp)
) {
items(moments.itemCount) { idx ->
val momentItem = moments[idx] ?: return@items
Box(
modifier = Modifier
.fillMaxWidth()
.aspectRatio(1f)
.padding(2.dp)
.clip(RoundedCornerShape(8.dp))
.noRippleClickable {
navController.navigateToPost(
id = momentItem.id,
highlightCommentId = 0,
initImagePagerIndex = 0
)
}
) {
CustomAsyncImage(
imageUrl = momentItem.images[0].thumbnail,
contentDescription = "",
modifier = Modifier
.fillMaxSize(),
context = context
)
if (momentItem.images.size > 1) {
Box(
modifier = Modifier
.padding(top = 8.dp, end = 8.dp)
.align(Alignment.TopEnd)
) {
Image(
modifier = Modifier.size(24.dp),
painter = painterResource(R.drawable.rider_pro_picture_more),
contentDescription = "",
)
}
}
}
}
}
}

View File

@@ -1,22 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25dp"
android:height="24dp"
android:viewportWidth="25"
android:viewportHeight="24">
<path
android:pathData="M5.657,14.7C5.657,14.7 6.558,13.8 9.26,13.8C11.962,13.8 13.763,15.6 16.464,15.6C19.166,15.6 20.067,14.7 20.067,14.7L20.067,3.9C20.067,3.9 19.166,4.8 16.464,4.8C13.763,4.8 11.962,3 9.26,3C6.558,3 5.657,3.9 5.657,3.9L5.657,14.7Z"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
<path
android:pathData="M5.657,21L5.657,14.7"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
</vector>

View File

@@ -1,7 +1,36 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:alpha="0.77" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="#00000000" android:fillType="evenOdd" android:pathData="M5.45,14.7C5.45,14.7 6.35,13.8 9.05,13.8C11.75,13.8 13.55,15.6 16.25,15.6C18.95,15.6 19.85,14.7 19.85,14.7L19.85,3.9C19.85,3.9 18.95,4.8 16.25,4.8C13.55,4.8 11.75,3 9.05,3C6.35,3 5.45,3.9 5.45,3.9L5.45,14.7Z" android:strokeColor="#000000" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="2"/>
<path android:fillColor="#00000000" android:fillType="evenOdd" android:pathData="M5.45,21L5.45,14.7" android:strokeColor="#000000" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="2"/>
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="25dp"
android:viewportWidth="24"
android:viewportHeight="25">
<group
android:translateX="-333"
android:translateY="-578">
<group
android:translateY="98">
<group
android:translateY="111">
<group
android:translateX="16"
android:translateY="369.2336">
<group
android:translateX="317">
<path
android:fillType="evenOdd"
android:strokeWidth="1"
android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
<path
android:fillType="evenOdd"
android:strokeColor="#000000"
android:strokeWidth="2"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:pathData="M12,13.44 L4,21 L4,5 C4,3.8954305 4.8954305,3 6,3 L18,3 C19.1045695,3 20,3.8954305 20,5 L20,21 L20,21 L12,13.44 Z" />
</group>
</group>
</group>
</group>
</group>
</vector>

View File

@@ -1,7 +1,37 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:alpha="0.77" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="#000000" android:fillType="evenOdd" android:pathData="M5.45,14.7C5.45,14.7 6.35,13.8 9.05,13.8C11.75,13.8 13.55,15.6 16.25,15.6C18.95,15.6 19.85,14.7 19.85,14.7L19.85,3.9C19.85,3.9 18.95,4.8 16.25,4.8C13.55,4.8 11.75,3 9.05,3C6.35,3 5.45,3.9 5.45,3.9L5.45,14.7Z" android:strokeColor="#000000" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="2"/>
<path android:fillColor="#00000000" android:fillType="evenOdd" android:pathData="M5.45,21L5.45,14.7" android:strokeColor="#000000" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="2"/>
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group
android:translateX="-333"
android:translateY="-582">
<group
android:translateY="98">
<group
android:translateY="111">
<group
android:translateX="16"
android:translateY="373">
<group
android:translateX="317">
<path
android:fillType="evenOdd"
android:strokeWidth="1"
android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
<path
android:fillColor="#FFFFFF"
android:fillType="evenOdd"
android:strokeColor="#FFFFFF"
android:strokeWidth="2"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:pathData="M12,13.44 L4,21 L4,5 C4,3.8954305 4.8954305,3 6,3 L18,3 C19.1045695,3 20,3.8954305 20,5 L20,21 L20,21 L12,13.44 Z" />
</group>
</group>
</group>
</group>
</group>
</vector>

View File

@@ -1,5 +1,34 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:alpha="0.77" android:height="24dp" android:viewportHeight="24" android:viewportWidth="25" android:width="25dp">
<path android:fillColor="#00000000" android:fillType="evenOdd" android:pathData="M12.542,19.866L20.141,12.272C22.008,10.397 22.28,7.331 20.516,5.372C19.622,4.374 18.357,3.788 17.017,3.75C15.678,3.713 14.382,4.228 13.434,5.175L12.008,6.609L10.779,5.372C8.903,3.506 5.835,3.234 3.874,4.997C2.876,5.89 2.289,7.155 2.252,8.494C2.214,9.832 2.73,11.128 3.677,12.075L11.473,19.866C11.769,20.159 12.246,20.159 12.542,19.866Z" android:strokeColor="#000000" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="2"/>
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="25dp"
android:viewportWidth="24"
android:viewportHeight="25">
<group
android:translateX="-16"
android:translateY="-578">
<group
android:translateY="98">
<group
android:translateY="111">
<group
android:translateX="16"
android:translateY="369.2336">
<group>
<group>
<path
android:fillType="evenOdd"
android:strokeWidth="1"
android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
<path
android:fillColor="#000000"
android:strokeWidth="1"
android:pathData="M16.9985461,4.08291673 C19.8524933,4.24019901 22.0450285,6.66265939 21.9094717,9.50883773 C21.9094717,12.7032473 19.1431644,14.6654384 16.4884691,17.0186119 C13.8681962,19.3509884 12.4568788,20.6258407 12,20.9201173 C11.5024402,20.5988047 9.76463181,19.0244765 7.51153088,17.0186119 C4.84536144,14.6560798 2.09052831,12.6751715 2.09052831,9.50883773 C1.9549715,6.66265939 4.14750667,4.24019901 7.00145386,4.08291673 C8.54653682,4.03623541 10.0024519,4.80279641 10.8348547,6.10125951 C11.7110607,7.32307959 11.857095,7.93450955 12.0031293,7.93450955 C12.1491636,7.93450955 12.2931117,7.32307959 13.1609728,6.09813997 C13.9889834,4.79316262 15.4506637,4.0255911 16.9985461,4.08291673 M16.9985461,2.00322297 C15.0797054,1.94198005 13.2375548,2.75624436 11.9947845,4.21497728 C10.7531976,2.76064256 8.91631993,1.94701287 7.00145386,2.00322297 C2.99462723,2.15941686 -0.132497191,5.51379084 0.00432374408,9.50883773 C0.00432374408,13.2626849 2.66423457,15.5680255 5.23548169,17.7964173 C5.53067964,18.0522197 5.82900689,18.3101017 6.12524794,18.5731829 L7.19651399,19.5277624 C8.36483083,20.635999 9.58966664,21.6834743 10.8661478,22.6660202 C11.5560548,23.1113266 12.4439452,23.1113266 13.1338522,22.6660202 C14.4509681,21.6534802 15.7134913,20.5722651 16.9161411,19.4268972 L17.8778814,18.5700634 C18.1835103,18.2997032 18.4933117,18.0303829 18.8010269,17.7652219 C21.2356276,15.659532 23.9956763,13.2730834 23.9956763,9.50883773 C24.1324972,5.51379084 21.0053728,2.15941686 16.9985461,2.00322297 L16.9985461,2.00322297 Z" />
</group>
</group>
</group>
</group>
</group>
</group>
</vector>

View File

@@ -1,5 +1,26 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:alpha="0.77" android:height="24dp" android:viewportHeight="24" android:viewportWidth="25" android:width="25dp">
<path android:fillColor="#ED1C24" android:fillType="evenOdd" android:pathData="M12.542,19.866L20.141,12.272C22.008,10.397 22.28,7.331 20.516,5.372C19.622,4.374 18.357,3.788 17.017,3.75C15.678,3.713 14.382,4.228 13.434,5.175L12.008,6.609L10.779,5.372C8.903,3.506 5.835,3.234 3.874,4.997C2.876,5.89 2.289,7.155 2.252,8.494C2.214,9.832 2.73,11.128 3.677,12.075L11.473,19.866C11.769,20.159 12.246,20.159 12.542,19.866Z" android:strokeColor="#ED1C24" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="2"/>
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group
android:translateX="-16"
android:translateY="-582">
<group
android:translateY="98">
<group
android:translateY="111">
<group
android:translateX="16"
android:translateY="373">
<path
android:fillColor="#D80264"
android:strokeWidth="1"
android:pathData="M16.9985461,2.00322297 C15.0797054,1.94198005 13.2375548,2.75624436 11.9947845,4.21497728 C10.7531976,2.76064256 8.91631993,1.94701287 7.00145386,2.00322297 C2.99462723,2.15941686 -0.132497191,5.51379084 0.00432374408,9.50883773 C0.00432374408,13.2626849 2.66423457,15.5680255 5.23548169,17.7964173 C5.53067964,18.0522197 5.82900689,18.3101017 6.12524794,18.5731829 L7.19651399,19.5277624 C8.36483083,20.635999 9.58966664,21.6834743 10.8661478,22.6660202 C11.5560548,23.1113266 12.4439452,23.1113266 13.1338522,22.6660202 C14.4509681,21.6534802 15.7134913,20.5722651 16.9161411,19.4268972 L17.8778814,18.5700634 C18.1835103,18.2997032 18.4933117,18.0303829 18.8010269,17.7652219 C21.2356276,15.659532 23.9956763,13.2730834 23.9956763,9.50883773 C24.1324972,5.51379084 21.0053728,2.15941686 16.9985461,2.00322297 L16.9985461,2.00322297 Z" />
</group>
</group>
</group>
</group>
</vector>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="27dp"
android:height="24dp"
android:viewportWidth="27"
android:viewportHeight="24">
<group
android:translateX="-107"
android:translateY="-797">
<group
android:translateY="791">
<group
android:translateX="107.4898"
android:translateY="6">
<group
android:translateX="0.0102">
<group
android:translateX="4.3333"
android:translateY="4">
<path
android:fillColor="#000000"
android:strokeWidth="1"
android:pathData="M14.1094658,14.6812969 C14.2002288,14.9232344 14.1859509,15.1331797 14.0666318,15.3111328 C13.9473128,15.4890859 13.7518643,15.5780625 13.4802861,15.5780625 L12.9829854,15.5780625 C12.7159098,15.5780625 12.5006735,15.5063672 12.3372764,15.3629766 C12.1738792,15.2195859 12.0419411,15.0101875 11.9414619,14.7347813 L6.64746583,1.8230625 L7.52085255,1.8230625 L2.22685645,14.7347813 C2.11903093,15.0101875 1.98525619,15.2195859 1.82553223,15.3629766 C1.66580827,15.5063672 1.45240854,15.5780625 1.18533301,15.5780625 L0.695497077,15.5780625 C0.41870541,15.5780625 0.220709317,15.4890859 0.101508796,15.3111328 C-0.0176917252,15.1331797 -0.0319104752,14.9232344 0.0588525457,14.6812969 L5.8117588,0.651984375 C5.98593848,0.217328125 6.33666765,0 6.8639463,0 L7.30437208,0 C7.83165072,0 8.18237989,0.217328125 8.35655958,0.651984375 L14.1094658,14.6812969 Z M11.0471025,9.11826563 L11.0471025,10.9580625 L3.12121583,10.9580625 L3.12121583,9.11826563 L11.0471025,9.11826563 Z" />
<path
android:fillColor="#000000"
android:strokeWidth="1"
android:pathData="M18.3971021,14.8253438 C18.3971021,15.064875 18.3261269,15.2502109 18.1841763,15.3813516 C18.0422258,15.5124922 17.8415045,15.5780625 17.5820123,15.5780625 L17.1469185,15.5780625 C16.8871894,15.5780625 16.6863495,15.5124922 16.544399,15.3813516 C16.4024485,15.2502109 16.3314732,15.064875 16.3314732,14.8253438 L16.3314732,0.75271875 C16.3314732,0.5131875 16.4024485,0.327851562 16.544399,0.196710937 C16.6863495,0.0655703125 16.8871894,0 17.1469185,0 L17.5820123,0 C17.8415045,0 18.0422258,0.0655703125 18.1841763,0.196710937 C18.3261269,0.327851562 18.3971021,0.5131875 18.3971021,0.75271875 L18.3971021,14.8253438 Z" />
</group>
</group>
</group>
</group>
</group>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,14 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group
android:translateX="-28"
android:translateY="-943">
<group
android:translateY="937">
<group
android:translateX="28"
android:translateY="6">
<path
android:pathData="M14.25,19.5L14.25,15C14.25,14.586 13.914,14.25 13.5,14.25L10.5,14.25C10.086,14.25 9.75,14.586 9.75,15L9.75,19.5C9.75,19.914 9.414,20.25 9,20.25L4.5,20.25C4.086,20.25 3.75,19.914 3.75,19.5L3.75,10.828C3.753,10.618 3.841,10.419 3.994,10.275L11.494,3.459C11.78,3.197 12.22,3.197 12.506,3.459L20.006,10.275C20.159,10.419 20.247,10.618 20.25,10.828L20.25,19.5C20.25,19.914 19.914,20.25 19.5,20.25L15,20.25C14.586,20.25 14.25,19.914 14.25,19.5Z"
android:strokeLineJoin="round"
android:strokeWidth="1.93476923"
android:fillColor="#00000000"
android:strokeColor="#FFFFFF"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
android:strokeWidth="1"
android:pathData="M 0 0 L 24 0 L 24 24 L 0 24 Z" />
<path
android:fillType="evenOdd"
android:strokeColor="#000000"
android:strokeWidth="1.93476923"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:pathData="M19,8.71 L13.667,4.562 C12.7041882,3.81297432 11.3558118,3.81297432 10.393,4.562 L5.059,8.71 C4.40940319,9.21516662 4.02961152,9.9920971 4.0299997,10.815 L4.0299997,18.015 C4.0299997,19.1195695 4.9254305,20.015 6.0299997,20.015 L18.0299997,20.015 C19.1345695,20.015 20.0299997,19.1195695 20.0299997,18.015 L20.0299997,10.815 C20.0299997,9.992 19.65,9.215 19,8.71" />
<path
android:fillType="evenOdd"
android:strokeColor="#000000"
android:strokeWidth="1.93476923"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:pathData="M16,15 C13.79,16.333 10.208,16.333 8,15" />
</group>
</group>
</group>
</vector>

View File

@@ -1,18 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group
android:translateX="-28"
android:translateY="-943">
<group
android:translateY="937">
<group
android:translateX="28"
android:translateY="6">
<path
android:pathData="M10.819,2.722C11.487,2.11 12.513,2.11 13.179,2.719L20.693,9.548C21.041,9.877 21.242,10.333 21.25,10.828L21.25,19.5C21.25,20.466 20.466,21.25 19.5,21.25L15,21.25C14.034,21.25 13.25,20.466 13.25,19.5L13.25,15.25L10.75,15.25L10.75,19.5C10.75,20.418 10.043,21.171 9.144,21.244L9,21.25L4.5,21.25C3.534,21.25 2.75,20.466 2.75,19.5L2.75,10.812C2.758,10.333 2.959,9.877 3.321,9.535L10.819,2.722Z"
android:fillType="evenOdd"
android:strokeWidth="1"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
android:pathData="M 0 0 L 24 0 L 24 24 L 0 24 Z" />
<path
android:pathData="M12,4.35L4.75,10.938L4.75,19.25L8.75,19.25L8.75,15C8.75,14.082 9.457,13.329 10.356,13.256L10.5,13.25L13.5,13.25C14.466,13.25 15.25,14.034 15.25,15L15.25,19.25L19.25,19.25L19.25,10.94L12,4.35Z"
android:strokeWidth="1"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
android:fillType="evenOdd"
android:strokeColor="#000000"
android:strokeWidth="1.93476923"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:pathData="M19,8.71 L13.667,4.562 C12.7041882,3.81297432 11.3558118,3.81297432 10.393,4.562 L5.059,8.71 C4.40940319,9.21516662 4.02961152,9.9920971 4.0299997,10.815 L4.0299997,18.015 C4.0299997,19.1195695 4.9254305,20.015 6.0299997,20.015 L18.0299997,20.015 C19.1345695,20.015 20.0299997,19.1195695 20.0299997,18.015 L20.0299997,10.815 C20.0299997,9.992 19.65,9.215 19,8.71" />
<path
android:fillType="evenOdd"
android:strokeColor="#000000"
android:strokeWidth="1.93476923"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:pathData="M16,15 C13.79,16.333 10.208,16.333 8,15" />
</group>
</group>
</group>
</vector>

View File

@@ -1,14 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25dp"
android:width="24dp"
android:height="24dp"
android:viewportWidth="25"
android:viewportWidth="24"
android:viewportHeight="24">
<group
android:translateX="-270"
android:translateY="-797">
<group
android:translateY="791">
<group
android:translateX="270"
android:translateY="6">
<path
android:pathData="M21.5,16.5L3.5,16.5C4.991,16.5 6.2,15.291 6.2,13.8L6.2,9.3C6.2,5.821 9.02,3 12.5,3C15.979,3 18.8,5.821 18.8,9.3L18.8,13.8C18.8,15.291 20.009,16.5 21.5,16.5L21.5,16.5ZM14.057,20.1C13.735,20.655 13.142,20.996 12.5,20.996C11.858,20.996 11.265,20.655 10.943,20.1"
android:strokeLineJoin="round"
android:strokeWidth="1.93476923"
android:fillColor="#00000000"
android:strokeColor="#FFFFFF"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
android:strokeWidth="1"
android:pathData="M 0 0 L 24 0 L 24 24 L 0 24 Z" />
<path
android:fillType="evenOdd"
android:strokeColor="#000000"
android:strokeWidth="1.93476923"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:pathData="M17.802,17.292 C17.802,17.292 17.879,17.237 18.002,17.143 C19.845,15.718 21,13.653 21,11.354 C21,7.068 16.97,3.59 12.002,3.59 C7.032,3.59 3,7.068 3,11.354 C3,15.642 7.03,19 12,19 C12.424,19 13.12,18.972 14.088,18.916 C15.35,19.736 17.192,20.409 18.804,20.409 C19.303,20.409 19.538,19.999 19.218,19.581 C18.732,18.985 18.062,18.03 17.802,17.291 L17.802,17.292 Z" />
<path
android:fillType="evenOdd"
android:strokeColor="#000000"
android:strokeWidth="1.93476923"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:pathData="M7.5,13.5 C10,16 14,16 16.5,13.5" />
</group>
</group>
</group>
</vector>

View File

@@ -1,25 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<group
android:translateX="-185"
android:translateY="-800">
<group
android:translateY="791">
<group
android:translateX="185"
android:translateY="9">
<path
android:pathData="M3,4h18v16h-18z"
android:strokeLineJoin="round"
android:strokeWidth="1.93476923"
android:fillColor="#00000000"
android:strokeColor="#FFFFFF"
android:fillType="evenOdd"/>
<path
android:pathData="M8,11h8v2h-8z"
android:strokeWidth="1"
android:fillColor="#FFFFFF"
android:fillColor="#000000"
android:fillType="evenOdd"
android:strokeColor="#00000000"/>
<path
android:pathData="M11,8h2v8h-2z"
android:strokeWidth="1"
android:fillColor="#FFFFFF"
android:fillType="evenOdd"
android:strokeColor="#00000000"/>
android:pathData="M16.5218462,0 C25.0701945,-1.57030611e-15 32,6.92980552 32,15.4781538 L32,16.5218462 C32,25.0701945 25.0701945,32 16.5218462,32 L15.4781538,32 C6.92980552,32 5.23435371e-16,25.0701945 0,16.5218462 L0,15.4781538 C-1.04687074e-15,6.92980552 6.92980552,1.04687074e-15 15.4781538,0 L16.5218462,0 Z M16.0434872,9.33333333 L15.9565128,9.33333333 C15.2441505,9.33333333 14.6666667,9.91081713 14.6666667,10.6231795 L14.6663333,14.6663333 L10.6231795,14.6666667 C9.91081713,14.6666667 9.33333333,15.2441505 9.33333333,15.9565128 L9.33333333,16.0434872 C9.33333333,16.7558495 9.91081713,17.3333333 10.6231795,17.3333333 L14.6663333,17.3323333 L14.6666667,21.3768205 C14.6666667,22.0891829 15.2441505,22.6666667 15.9565128,22.6666667 L16.0434872,22.6666667 C16.7558495,22.6666667 17.3333333,22.0891829 17.3333333,21.3768205 L17.3333333,17.3323333 L21.3768205,17.3333333 C22.0891829,17.3333333 22.6666667,16.7558495 22.6666667,16.0434872 L22.6666667,15.9565128 C22.6666667,15.2441505 22.0891829,14.6666667 21.3768205,14.6666667 L17.3333333,14.6663333 L17.3333333,10.6231795 C17.3333333,9.91081713 16.7558495,9.33333333 16.0434872,9.33333333 Z" />
</group>
</group>
</group>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -11,7 +11,7 @@
<string name="moment">动态</string>
<string name="users">用户</string>
<string name="like_upper">点赞</string>
<string name="followers_upper">关注者</string>
<string name="followers_upper">粉丝</string>
<string name="favourites_upper">收藏</string>
<string name="notifications_upper">消息</string>
<string name="following_upper">关注中</string>
@@ -101,11 +101,18 @@
<string name="report_title">举报这篇帖子的原因是?</string>
<string name="close">关闭</string>
<string name="about_rave_now">关于Rave Now</string>
<string name="blocked">已拉黑</string>
<string name="feedback">反馈</string>
<string name="account_and_security">账户与安全</string>
<string name="remove_account">删除账户</string>
<string name="remove_account_desc">注销账号为不可逆的操作,请确认</string>
<string name="remove_account_password_hint">输入密码以确认</string>
<string name="version_text">版本 %1$s</string>
<string name="index_worldwide">发现</string>
<string name="index_worldwide">探索</string>
<string name="index_following">关注</string>
<string name="index_hot">热门</string>
<string name="main_home">首页</string>
<string name="main_ai">智能体</string>
<string name="main_message">消息</string>
<string name="main_profile">我的</string>
</resources>

View File

@@ -99,6 +99,8 @@
<string name="report_fail_desc">Failed to report, please try again</string>
<string name="report_title">Reason for reporting this post?</string>
<string name="close">Close</string>
<string name="blocked">Blocked</string>
<string name="feedback">Feedback</string>
<string name="about_rave_now">About Rave Now</string>
<string name="account_and_security">Account and security</string>
<string name="remove_account">Remove Account</string>
@@ -107,4 +109,9 @@
<string name="version_text">Version %1$s</string>
<string name="index_worldwide">Worldwide</string>
<string name="index_following">Following</string>
<string name="index_hot">Hot</string>
<string name="main_home">Home</string>
<string name="main_ai">Agent</string>
<string name="main_message">Message</string>
<string name="main_profile">Profile</string>
</resources>