20250723-Test Push
2
.idea/compiler.xml
generated
@@ -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
@@ -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>
|
||||
|
||||
4
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -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
@@ -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">
|
||||
|
||||
4
.idea/runConfigurations.xml
generated
@@ -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>
|
||||
|
||||
@@ -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()
|
||||
// 重置发现页面
|
||||
|
||||
@@ -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),
|
||||
)
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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,13 +289,33 @@ fun IndexScreen() {
|
||||
unselectedIconColor = iconTint,
|
||||
),
|
||||
icon = {
|
||||
Icon(
|
||||
modifier = Modifier.size(24.dp),
|
||||
imageVector = if (isSelected) it.selectedIcon() else it.icon(),
|
||||
contentDescription = null,
|
||||
tint = iconTint
|
||||
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(),
|
||||
contentDescription = null,
|
||||
tint = iconTint
|
||||
)
|
||||
}
|
||||
},
|
||||
label = {
|
||||
Text(
|
||||
modifier = Modifier.padding(0.dp),
|
||||
text = it.label(),
|
||||
fontSize = 9.sp,
|
||||
color = if (isSelected) AppColors.brandColorsColor else AppColors.text,
|
||||
)
|
||||
}
|
||||
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) }
|
||||
)
|
||||
}
|
||||
@@ -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
|
||||
) {
|
||||
// 左侧 Column:label 居中显示
|
||||
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)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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 = "",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
34
app/src/main/res/drawable/rider_pro_nav_ai.xml
Normal 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>
|
||||
BIN
app/src/main/res/drawable/rider_pro_nav_ai_hl.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
@@ -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">
|
||||
<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"/>
|
||||
|
||||
<group
|
||||
android:translateX="-28"
|
||||
android:translateY="-943">
|
||||
<group
|
||||
android:translateY="937">
|
||||
<group
|
||||
android:translateX="28"
|
||||
android:translateY="6">
|
||||
<path
|
||||
android:fillType="evenOdd"
|
||||
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>
|
||||
@@ -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">
|
||||
<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:strokeWidth="1"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:strokeColor="#00000000"/>
|
||||
<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"/>
|
||||
|
||||
<group
|
||||
android:translateX="-28"
|
||||
android:translateY="-943">
|
||||
<group
|
||||
android:translateY="937">
|
||||
<group
|
||||
android:translateX="28"
|
||||
android:translateY="6">
|
||||
<path
|
||||
android:fillType="evenOdd"
|
||||
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>
|
||||
@@ -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">
|
||||
<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"/>
|
||||
|
||||
<group
|
||||
android:translateX="-270"
|
||||
android:translateY="-797">
|
||||
<group
|
||||
android:translateY="791">
|
||||
<group
|
||||
android:translateX="270"
|
||||
android:translateY="6">
|
||||
<path
|
||||
android:fillType="evenOdd"
|
||||
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>
|
||||
@@ -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">
|
||||
<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:fillType="evenOdd"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M11,8h2v8h-2z"
|
||||
android:strokeWidth="1"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="evenOdd"
|
||||
android:strokeColor="#00000000"/>
|
||||
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:fillColor="#000000"
|
||||
android:fillType="evenOdd"
|
||||
android:strokeWidth="1"
|
||||
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>
|
||||
BIN
app/src/main/res/mipmap-xhdpi/rider_pro_comment.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
app/src/main/res/mipmap-xhdpi/rider_pro_followers.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
app/src/main/res/mipmap-xhdpi/rider_pro_like.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
app/src/main/res/mipmap-xhdpi/rider_pro_nav_ai_hl.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
app/src/main/res/mipmap-xhdpi/rider_pro_nav_home_hl.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
app/src/main/res/mipmap-xhdpi/rider_pro_nav_message_hl.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
app/src/main/res/mipmap-xhdpi/rider_pro_nav_profile_hl.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
@@ -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>
|
||||
@@ -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>
|
||||