From 703beb8d43904c0eb9200681e96d9d07ad1d9578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E5=B8=86?= <3031465419@qq.com> Date: Thu, 6 Nov 2025 21:23:51 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=88=91=E7=9A=84=EF=BC=88=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F=EF=BC=89ui=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/aiosman/ravenow/ui/index/Index.kt | 512 +++++++++++++----- app/src/main/res/mipmap-hdpi/bi.png | Bin 0 -> 331 bytes app/src/main/res/mipmap-hdpi/collect.png | Bin 0 -> 438 bytes .../main/res/mipmap-hdpi/feedback_icon.png | Bin 0 -> 434 bytes app/src/main/res/mipmap-hdpi/fengm.png | Bin 0 -> 331 bytes app/src/main/res/mipmap-hdpi/icons_about.png | Bin 0 -> 465 bytes .../icons_account_and_security.png | Bin 0 -> 390 bytes app/src/main/res/mipmap-hdpi/icons_bell.png | Bin 0 -> 425 bytes .../main/res/mipmap-hdpi/icons_dark_mode.png | Bin 0 -> 381 bytes .../res/mipmap-hdpi/icons_edited_data.png | Bin 0 -> 428 bytes app/src/main/res/mipmap-hdpi/log_out_icon.png | Bin 0 -> 402 bytes app/src/main/res/mipmap-hdpi/menu_ico.png | Bin 0 -> 156 bytes app/src/main/res/mipmap-hdpi/menu_icon.png | Bin 0 -> 283 bytes app/src/main/res/mipmap-hdpi/naoz.png | Bin 0 -> 551 bytes .../main/res/mipmap-hdpi/paip_coin_img.png | Bin 0 -> 1498 bytes app/src/main/res/mipmap-hdpi/qr_code_icon.png | Bin 0 -> 490 bytes app/src/main/res/mipmap-hdpi/sao.png | Bin 0 -> 367 bytes app/src/main/res/mipmap-hdpi/xingzuo.png | Bin 0 -> 593 bytes app/src/main/res/mipmap-mdpi/bi.png | Bin 0 -> 283 bytes app/src/main/res/mipmap-mdpi/collect.png | Bin 0 -> 348 bytes .../main/res/mipmap-mdpi/feedback_icon.png | Bin 0 -> 326 bytes app/src/main/res/mipmap-mdpi/fengm.png | Bin 0 -> 283 bytes app/src/main/res/mipmap-mdpi/icons_about.png | Bin 0 -> 347 bytes .../icons_account_and_security.png | Bin 0 -> 325 bytes app/src/main/res/mipmap-mdpi/icons_bell.png | Bin 0 -> 328 bytes .../main/res/mipmap-mdpi/icons_dark_mode.png | Bin 0 -> 329 bytes .../res/mipmap-mdpi/icons_edited_data.png | Bin 0 -> 361 bytes app/src/main/res/mipmap-mdpi/log_out_icon.png | Bin 0 -> 301 bytes app/src/main/res/mipmap-mdpi/menu_ico.png | Bin 0 -> 143 bytes app/src/main/res/mipmap-mdpi/menu_icon.png | Bin 0 -> 229 bytes app/src/main/res/mipmap-mdpi/naoz.png | Bin 0 -> 419 bytes .../main/res/mipmap-mdpi/paip_coin_img.png | Bin 0 -> 873 bytes app/src/main/res/mipmap-mdpi/qr_code_icon.png | Bin 0 -> 390 bytes app/src/main/res/mipmap-mdpi/sao.png | Bin 0 -> 290 bytes app/src/main/res/mipmap-mdpi/xingzuo.png | Bin 0 -> 473 bytes app/src/main/res/mipmap-xhdpi/bi.png | Bin 0 -> 415 bytes app/src/main/res/mipmap-xhdpi/collect.png | Bin 0 -> 548 bytes .../main/res/mipmap-xhdpi/feedback_icon.png | Bin 0 -> 516 bytes app/src/main/res/mipmap-xhdpi/fengm.png | Bin 0 -> 415 bytes app/src/main/res/mipmap-xhdpi/icons_about.png | Bin 0 -> 552 bytes .../icons_account_and_security.png | Bin 0 -> 479 bytes app/src/main/res/mipmap-xhdpi/icons_bell.png | Bin 0 -> 523 bytes .../main/res/mipmap-xhdpi/icons_dark_mode.png | Bin 0 -> 455 bytes .../res/mipmap-xhdpi/icons_edited_data.png | Bin 0 -> 544 bytes .../main/res/mipmap-xhdpi/log_out_icon.png | Bin 0 -> 497 bytes app/src/main/res/mipmap-xhdpi/menu_ico.png | Bin 0 -> 167 bytes app/src/main/res/mipmap-xhdpi/menu_icon.png | Bin 0 -> 328 bytes app/src/main/res/mipmap-xhdpi/naoz.png | Bin 0 -> 718 bytes .../main/res/mipmap-xhdpi/paip_coin_img.png | Bin 0 -> 2034 bytes .../main/res/mipmap-xhdpi/qr_code_icon.png | Bin 0 -> 595 bytes app/src/main/res/mipmap-xhdpi/sao.png | Bin 0 -> 421 bytes app/src/main/res/mipmap-xhdpi/xingzuo.png | Bin 0 -> 705 bytes app/src/main/res/mipmap-xxhdpi/bi.png | Bin 0 -> 550 bytes app/src/main/res/mipmap-xxhdpi/collect.png | Bin 0 -> 779 bytes .../main/res/mipmap-xxhdpi/feedback_icon.png | Bin 0 -> 685 bytes app/src/main/res/mipmap-xxhdpi/fengm.png | Bin 0 -> 550 bytes .../main/res/mipmap-xxhdpi/icons_about.png | Bin 0 -> 787 bytes .../icons_account_and_security.png | Bin 0 -> 656 bytes app/src/main/res/mipmap-xxhdpi/icons_bell.png | Bin 0 -> 687 bytes .../res/mipmap-xxhdpi/icons_dark_mode.png | Bin 0 -> 613 bytes .../res/mipmap-xxhdpi/icons_edited_data.png | Bin 0 -> 746 bytes .../main/res/mipmap-xxhdpi/log_out_icon.png | Bin 0 -> 652 bytes app/src/main/res/mipmap-xxhdpi/menu_ico.png | Bin 0 -> 171 bytes app/src/main/res/mipmap-xxhdpi/menu_icon.png | Bin 0 -> 418 bytes app/src/main/res/mipmap-xxhdpi/naoz.png | Bin 0 -> 980 bytes .../main/res/mipmap-xxhdpi/paip_coin_img.png | Bin 0 -> 3012 bytes .../main/res/mipmap-xxhdpi/qr_code_icon.png | Bin 0 -> 786 bytes app/src/main/res/mipmap-xxhdpi/sao.png | Bin 0 -> 597 bytes app/src/main/res/mipmap-xxhdpi/xingzuo.png | Bin 0 -> 992 bytes app/src/main/res/mipmap-xxxhdpi/bi.png | Bin 0 -> 688 bytes app/src/main/res/mipmap-xxxhdpi/collect.png | Bin 0 -> 952 bytes .../main/res/mipmap-xxxhdpi/feedback_icon.png | Bin 0 -> 828 bytes app/src/main/res/mipmap-xxxhdpi/fengm.png | Bin 0 -> 688 bytes .../main/res/mipmap-xxxhdpi/icons_about.png | Bin 0 -> 1009 bytes .../icons_account_and_security.png | Bin 0 -> 766 bytes .../main/res/mipmap-xxxhdpi/icons_bell.png | Bin 0 -> 877 bytes .../res/mipmap-xxxhdpi/icons_dark_mode.png | Bin 0 -> 794 bytes .../res/mipmap-xxxhdpi/icons_edited_data.png | Bin 0 -> 923 bytes .../main/res/mipmap-xxxhdpi/log_out_icon.png | Bin 0 -> 812 bytes app/src/main/res/mipmap-xxxhdpi/menu_ico.png | Bin 0 -> 216 bytes app/src/main/res/mipmap-xxxhdpi/menu_icon.png | Bin 0 -> 482 bytes app/src/main/res/mipmap-xxxhdpi/naoz.png | Bin 0 -> 1276 bytes .../main/res/mipmap-xxxhdpi/paip_coin_img.png | Bin 0 -> 4211 bytes .../main/res/mipmap-xxxhdpi/qr_code_icon.png | Bin 0 -> 1014 bytes app/src/main/res/mipmap-xxxhdpi/sao.png | Bin 0 -> 725 bytes app/src/main/res/mipmap-xxxhdpi/xingzuo.png | Bin 0 -> 1259 bytes app/src/main/res/values-ja/strings.xml | 14 + app/src/main/res/values-zh/strings.xml | 10 +- app/src/main/res/values/strings.xml | 8 + 89 files changed, 398 insertions(+), 146 deletions(-) create mode 100644 app/src/main/res/mipmap-hdpi/bi.png create mode 100644 app/src/main/res/mipmap-hdpi/collect.png create mode 100644 app/src/main/res/mipmap-hdpi/feedback_icon.png create mode 100644 app/src/main/res/mipmap-hdpi/fengm.png create mode 100644 app/src/main/res/mipmap-hdpi/icons_about.png create mode 100644 app/src/main/res/mipmap-hdpi/icons_account_and_security.png create mode 100644 app/src/main/res/mipmap-hdpi/icons_bell.png create mode 100644 app/src/main/res/mipmap-hdpi/icons_dark_mode.png create mode 100644 app/src/main/res/mipmap-hdpi/icons_edited_data.png create mode 100644 app/src/main/res/mipmap-hdpi/log_out_icon.png create mode 100644 app/src/main/res/mipmap-hdpi/menu_ico.png create mode 100644 app/src/main/res/mipmap-hdpi/menu_icon.png create mode 100644 app/src/main/res/mipmap-hdpi/naoz.png create mode 100644 app/src/main/res/mipmap-hdpi/paip_coin_img.png create mode 100644 app/src/main/res/mipmap-hdpi/qr_code_icon.png create mode 100644 app/src/main/res/mipmap-hdpi/sao.png create mode 100644 app/src/main/res/mipmap-hdpi/xingzuo.png create mode 100644 app/src/main/res/mipmap-mdpi/bi.png create mode 100644 app/src/main/res/mipmap-mdpi/collect.png create mode 100644 app/src/main/res/mipmap-mdpi/feedback_icon.png create mode 100644 app/src/main/res/mipmap-mdpi/fengm.png create mode 100644 app/src/main/res/mipmap-mdpi/icons_about.png create mode 100644 app/src/main/res/mipmap-mdpi/icons_account_and_security.png create mode 100644 app/src/main/res/mipmap-mdpi/icons_bell.png create mode 100644 app/src/main/res/mipmap-mdpi/icons_dark_mode.png create mode 100644 app/src/main/res/mipmap-mdpi/icons_edited_data.png create mode 100644 app/src/main/res/mipmap-mdpi/log_out_icon.png create mode 100644 app/src/main/res/mipmap-mdpi/menu_ico.png create mode 100644 app/src/main/res/mipmap-mdpi/menu_icon.png create mode 100644 app/src/main/res/mipmap-mdpi/naoz.png create mode 100644 app/src/main/res/mipmap-mdpi/paip_coin_img.png create mode 100644 app/src/main/res/mipmap-mdpi/qr_code_icon.png create mode 100644 app/src/main/res/mipmap-mdpi/sao.png create mode 100644 app/src/main/res/mipmap-mdpi/xingzuo.png create mode 100644 app/src/main/res/mipmap-xhdpi/bi.png create mode 100644 app/src/main/res/mipmap-xhdpi/collect.png create mode 100644 app/src/main/res/mipmap-xhdpi/feedback_icon.png create mode 100644 app/src/main/res/mipmap-xhdpi/fengm.png create mode 100644 app/src/main/res/mipmap-xhdpi/icons_about.png create mode 100644 app/src/main/res/mipmap-xhdpi/icons_account_and_security.png create mode 100644 app/src/main/res/mipmap-xhdpi/icons_bell.png create mode 100644 app/src/main/res/mipmap-xhdpi/icons_dark_mode.png create mode 100644 app/src/main/res/mipmap-xhdpi/icons_edited_data.png create mode 100644 app/src/main/res/mipmap-xhdpi/log_out_icon.png create mode 100644 app/src/main/res/mipmap-xhdpi/menu_ico.png create mode 100644 app/src/main/res/mipmap-xhdpi/menu_icon.png create mode 100644 app/src/main/res/mipmap-xhdpi/naoz.png create mode 100644 app/src/main/res/mipmap-xhdpi/paip_coin_img.png create mode 100644 app/src/main/res/mipmap-xhdpi/qr_code_icon.png create mode 100644 app/src/main/res/mipmap-xhdpi/sao.png create mode 100644 app/src/main/res/mipmap-xhdpi/xingzuo.png create mode 100644 app/src/main/res/mipmap-xxhdpi/bi.png create mode 100644 app/src/main/res/mipmap-xxhdpi/collect.png create mode 100644 app/src/main/res/mipmap-xxhdpi/feedback_icon.png create mode 100644 app/src/main/res/mipmap-xxhdpi/fengm.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icons_about.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icons_account_and_security.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icons_bell.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icons_dark_mode.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icons_edited_data.png create mode 100644 app/src/main/res/mipmap-xxhdpi/log_out_icon.png create mode 100644 app/src/main/res/mipmap-xxhdpi/menu_ico.png create mode 100644 app/src/main/res/mipmap-xxhdpi/menu_icon.png create mode 100644 app/src/main/res/mipmap-xxhdpi/naoz.png create mode 100644 app/src/main/res/mipmap-xxhdpi/paip_coin_img.png create mode 100644 app/src/main/res/mipmap-xxhdpi/qr_code_icon.png create mode 100644 app/src/main/res/mipmap-xxhdpi/sao.png create mode 100644 app/src/main/res/mipmap-xxhdpi/xingzuo.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/bi.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/collect.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/feedback_icon.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/fengm.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icons_about.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icons_account_and_security.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icons_bell.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icons_dark_mode.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icons_edited_data.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/log_out_icon.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/menu_ico.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/menu_icon.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/naoz.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/paip_coin_img.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/qr_code_icon.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/sao.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/xingzuo.png diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt index bbf07a2..6f3b64a 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/Index.kt @@ -1,6 +1,12 @@ package com.aiosman.ravenow.ui.index import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.FastOutLinearInEasing +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.updateTransition +import androidx.compose.animation.core.animateFloat +import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.tween import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image @@ -11,15 +17,21 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.requiredWidth import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState @@ -42,8 +54,10 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect 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.alpha @@ -59,7 +73,11 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.compose.ui.zIndex import com.aiosman.ravenow.AppState +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale import com.aiosman.ravenow.AppStore import com.aiosman.ravenow.GuestLoginCheckOut import com.aiosman.ravenow.GuestLoginCheckOutScene @@ -123,151 +141,16 @@ fun IndexScreen() { gesturesEnabled = drawerState.isOpen, drawerContent = { CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) { - Column( - modifier = Modifier - .requiredWidth(250.dp) - .fillMaxHeight() - .background( - AppColors.background - ) - ) { - Spacer(modifier = Modifier.height(88.dp)) - NavItem( - iconRes = R.drawable.rave_now_nav_account, - label = stringResource(R.string.account_and_security), - modifier = Modifier.noRippleClickable { - coroutineScope.launch { - drawerState.close() - navController.navigate(NavigationRoute.AccountSetting.route) - } - + SideMenuContent( + onClose = { + coroutineScope.launch { + drawerState.close() } - ) - Spacer(modifier = Modifier.height(16.dp)) - NavItem( - iconRes = R.drawable.rider_pro_favourited, - label = stringResource(R.string.favourites), - modifier = Modifier.noRippleClickable { - coroutineScope.launch { - drawerState.close() - navController.navigate(NavigationRoute.FavouriteList.route) - } - - } - ) - - NavItem( - iconRes = R.drawable.rave_now_nav_night, - label = stringResource(R.string.dark_mode), - rightContent = { - Switch( - checked = AppState.darkMode, - onCheckedChange = { - AppState.switchTheme() - }, - - colors = SwitchDefaults.colors( - checkedThumbColor = Color.White, - checkedTrackColor = AppColors.main, - uncheckedThumbColor = Color.White, - uncheckedTrackColor = AppColors.main.copy(alpha = 0.5f), - uncheckedBorderColor = Color.Transparent - ), - modifier = Modifier.scale(0.8f) - ) - } - ) - // divider - Box( - modifier = Modifier - .fillMaxWidth() - .padding(top = 16.dp, bottom = 16.dp, start = 16.dp, end = 16.dp) - ) { - Box( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .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), - modifier = Modifier.noRippleClickable { - coroutineScope.launch { - drawerState.close() - navController.navigate(NavigationRoute.AboutScreen.route) - } - } - ) - // divider - Box( - modifier = Modifier - .fillMaxWidth() - .padding(top = 16.dp, bottom = 16.dp, start = 16.dp, end = 16.dp) - ) { - Box( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(AppColors.divider) - ) - } - -// NavItem( -// iconRes = R.drawable.rave_now_nav_switch, -// label = "Switch Account" -// ) -// Spacer(modifier = Modifier.height(16.dp)) - NavItem( - iconRes = R.drawable.rave_now_nav_logout, - label = stringResource(R.string.logout), - modifier = Modifier.noRippleClickable { - coroutineScope.launch { - drawerState.close() - // 只有非游客用户才需要取消注册推送设备 - if (!AppStore.isGuest) { - Messaging.unregisterDevice(context) - } - AppStore.apply { - token = null - rememberMe = false - isGuest = false // 清除游客状态 - saveData() - } - // 删除推送渠道 - - navController.navigate(NavigationRoute.Login.route) { - popUpTo(NavigationRoute.Login.route) { - inclusive = true - } - } - AppState.ReloadAppState(context) - } - } - ) - - } + }, + navController = navController, + context = context, + isDrawerOpen = drawerState.isOpen + ) } } ) { @@ -447,7 +330,6 @@ fun IndexScreen() { ) } } - } @Composable @@ -623,4 +505,344 @@ fun NavItem( } } +} + +@Composable +fun SideMenuContent( + onClose: () -> Unit, + navController: androidx.navigation.NavController, + context: android.content.Context, + isDrawerOpen: Boolean +) { + val appColors = LocalAppTheme.current + val coroutineScope = rememberCoroutineScope() + var messageNotificationEnabled by remember { mutableStateOf(true) } + var darkModeEnabled by remember { mutableStateOf(AppState.darkMode) } + + // 菜单背景色 #FAF9FB + val menuBackgroundColor = Color(0xFFFAF9FB) + // 遮罩颜色 黑色透明度0.6 + val overlayColor = Color.Black.copy(alpha = 0.6f) + // 卡片背景色 白色 + val cardBackgroundColor = Color.White + // 跟随系统文字颜色 #979499 + val followSystemTextColor = Color(0xFF979499) + // 开关开启颜色 #7C45ED + val switchActiveColor = Color(0xFF7C45ED) + + Box( + modifier = Modifier + .fillMaxSize() + ) { + // 左侧半透明遮罩(平滑淡入淡出) + val overlayTransition = updateTransition(targetState = isDrawerOpen, label = "overlay") + val overlayAlpha by overlayTransition.animateFloat( + transitionSpec = { + if (targetState) { + tween(durationMillis = 400, easing = LinearOutSlowInEasing) + } else { + tween(durationMillis = 300, easing = FastOutLinearInEasing) + } + }, + label = "overlayAlpha" + ) { open -> if (open) 0.6f else 0f } + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black.copy(alpha = overlayAlpha)) + ) + + // 右侧菜单面板 + Box( + modifier = Modifier + .requiredWidth(302.dp) + .requiredHeight(874.dp) + .align(Alignment.CenterEnd) + .background(menuBackgroundColor) + ) { + // 顶部状态栏间距 + val statusBarHeight = WindowInsets.systemBars.asPaddingValues().calculateTopPadding() + + // 扫一扫功能入口 - 右边距离右边66pt + Row( + modifier = Modifier + .align(Alignment.TopEnd) + .offset(x = (-112).dp, y = 88.dp) + .noRippleClickable { + // TODO: 实现扫一扫功能 + }, + horizontalArrangement = Arrangement.spacedBy(16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + // 扫一扫图标(使用现有图标或占位) + Image( + painter = painterResource(id = R.mipmap.sao), + contentDescription = null, + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(Color.Black) + ) + } +// 绝对定位的"扫一扫"文字:上方71.5dp,右侧66dp + Text( + text = stringResource(R.string.scan_qr), + fontSize = 14.sp, + color = Color.Black, + modifier = Modifier + .align(Alignment.TopEnd) + .offset(x = (-66).dp, y = 91.5.dp) + ) +// QR码图标 - 右边距离右边112dp,上边距离上边68pt + Image( + painter = painterResource(id = R.mipmap.qr_code_icon), + contentDescription = null, + modifier = Modifier + .size(24.dp) + .align(Alignment.TopEnd) + .offset(x = (-26).dp, y = 88.dp) + .noRippleClickable { + // TODO: 实现QR码功能 + }, + colorFilter = ColorFilter.tint(Color.Black) + ) + + // 菜单选项卡片组 - 第一组卡片上方距离上方108pt(绝对定位) + Column( + modifier = Modifier + .fillMaxWidth() + .offset(y = 128.dp) // 直接距离顶部128dp(整体下移20dp) + .padding(horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + // 第一组卡片:编辑资料、账号安全、收藏 + MenuCard( + backgroundColor = cardBackgroundColor, + width = 270.dp, + height = 164.dp, + items = listOf( + MenuItem( + icon = R.mipmap.icons_edited_data, + label = stringResource(R.string.edit_profile_info), + onClick = { + coroutineScope.launch { + onClose() + navController.navigate(NavigationRoute.AccountEdit.route) + } + } + ), + MenuItem( + icon = R.mipmap.icons_account_and_security, + label = stringResource(R.string.account_and_security), + onClick = { + coroutineScope.launch { + onClose() + navController.navigate(NavigationRoute.AccountSetting.route) + } + } + ), + MenuItem( + icon = R.mipmap.collect, + label = stringResource(R.string.favourites), + onClick = { + coroutineScope.launch { + onClose() + navController.navigate(NavigationRoute.FavouriteList.route) + } + } + ) + ) + ) + + // 第二组卡片:暗色模式、消息通知 + MenuCard( + backgroundColor = cardBackgroundColor, + width = 270.dp, + height = 112.dp, // 根据设计图,第二组卡片高度为112dp + items = listOf( + MenuItem( + icon = R.mipmap.icons_dark_mode, + label = stringResource(R.string.dark_mode), + rightContent = { + Switch( + checked = darkModeEnabled, + onCheckedChange = { + darkModeEnabled = it + AppState.darkMode = it + AppState.appTheme = if (it) { + com.aiosman.ravenow.DarkThemeColors() + } else { + com.aiosman.ravenow.LightThemeColors() + } + AppStore.saveDarkMode(it) + }, + colors = SwitchDefaults.colors( + checkedThumbColor = Color.White, + checkedTrackColor = switchActiveColor, + uncheckedThumbColor = Color.White, + uncheckedTrackColor = switchActiveColor.copy(alpha = 0.5f), + uncheckedBorderColor = Color.Transparent + ), + modifier = Modifier.size(width = 64.dp, height = 28.dp) + ) + } + ), + MenuItem( + icon = R.mipmap.icons_bell, + label = stringResource(R.string.message_notification), + rightContent = { + Switch( + checked = messageNotificationEnabled, + onCheckedChange = { messageNotificationEnabled = it }, + colors = SwitchDefaults.colors( + checkedThumbColor = Color.White, + checkedTrackColor = switchActiveColor, + uncheckedThumbColor = Color.White, + uncheckedTrackColor = switchActiveColor.copy(alpha = 0.5f), + uncheckedBorderColor = Color.Transparent + ), + modifier = Modifier.size(width = 64.dp, height = 28.dp) + ) + } + ) + ) + ) + + // 第三组卡片:关于派派、反馈、退出登录 + MenuCard( + backgroundColor = cardBackgroundColor, + width = 270.dp, + height = 164.dp, + items = listOf( + MenuItem( + icon = R.mipmap.icons_about, + label = stringResource(R.string.about_paipai), + onClick = { + coroutineScope.launch { + onClose() + navController.navigate(NavigationRoute.AboutScreen.route) + } + } + ), + MenuItem( + icon = R.mipmap.feedback_icon, + label = stringResource(R.string.feedback), + onClick = { + coroutineScope.launch { + onClose() + navController.navigate(NavigationRoute.AboutScreen.route) + } + } + ), + MenuItem( + icon = R.mipmap.log_out_icon, + label = stringResource(R.string.logout_confirm), + onClick = { + coroutineScope.launch { + onClose() + // 只有非游客用户才需要取消注册推送设备 + if (!AppStore.isGuest) { + Messaging.unregisterDevice(context) + } + AppStore.apply { + token = null + rememberMe = false + isGuest = false + saveData() + } + navController.navigate(NavigationRoute.Login.route) { + popUpTo(NavigationRoute.Login.route) { + inclusive = true + } + } + AppState.ReloadAppState(context) + } + }, + showRightArrow = false + ) + ) + ) + } + } + } +} + +data class MenuItem( + val icon: Int, + val label: String, + val onClick: (() -> Unit)? = null, + val rightContent: @Composable (() -> Unit)? = null, + val showRightArrow: Boolean = true +) + +@Composable +fun MenuCard( + backgroundColor: Color, + items: List, + width: androidx.compose.ui.unit.Dp? = null, + height: androidx.compose.ui.unit.Dp? = null +) { + Column( + modifier = Modifier + .then(if (width != null) Modifier.requiredWidth(width) else Modifier.fillMaxWidth()) + .then(if (height != null) Modifier.requiredHeight(height) else Modifier) + .background(backgroundColor, RoundedCornerShape(16.dp)) + .padding(horizontal = 16.dp), + verticalArrangement = if (height != null) Arrangement.SpaceEvenly else Arrangement.spacedBy(8.dp) // 固定高度时均匀分布 + ) { + items.forEachIndexed { index, item -> + Box( + modifier = Modifier + .then(if (height != null) Modifier.weight(1f) else Modifier), + contentAlignment = Alignment.Center + ) { + MenuItemRow(item = item, compact = height != null) // 传递compact参数 + } + } + } +} + +@Composable +fun MenuItemRow(item: MenuItem, compact: Boolean = false) { + Row( + modifier = Modifier + .fillMaxWidth() + .then( + if (item.onClick != null) { + Modifier.noRippleClickable { item.onClick?.invoke() } + } else { + Modifier + } + ) + .padding(vertical = if (compact) 4.dp else 8.dp), // 紧凑模式下减少垂直padding + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.weight(1f) + ) { + Image( + painter = painterResource(id = item.icon), + contentDescription = null, + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(Color.Black) + ) + Text( + text = item.label, + fontSize = 14.sp, + color = Color.Black + ) + } + + if (item.rightContent != null) { + item.rightContent?.invoke() + } else if (item.showRightArrow) { + Image( + painter = painterResource(id = R.drawable.rave_now_nav_right), + contentDescription = null, + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(Color(0xFF111213)) + ) + } + } } \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/bi.png b/app/src/main/res/mipmap-hdpi/bi.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ac2f7289fb3d91f4c7fb71e2ed3f72103c6693 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc*oi3Vrm?lJ*2@|6Vn1v4zTUn`JsUcs~f{eFY>zQXPc1+910kNm&sQ3SY>fFEEKR#*-mv@%YwYdQ zwkZFpcv!97H^Hx3^#Wfmo2J0=*LSTK1eP63_|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skg2l#}zx)=BWnIwVRj(S=^4FV-We!&d!4f^&EF3c3z|2|*AUw-}C+g++a zYgj#9978Nl9}T`ct5t#HOo+gy-tYCdzUsd{Jo$Ov^lmRHxAY0QzwdKgt34{CbLh9! zX75f_t*(R)jZd2y7XJA2smWVu^8GZ|s~ut?2WPp3tnd>TIiOe&_Vj(rd2O{VlMDFM z*DHmkMF?8;@K*gU_HWt#|N0F#_EJ`bce7lQuwHs;@5b5dlGn~xPj1VW zkNPyvvvm5YFaIn*J==E4f5Bd-O}SdWFVdQ&MBb@03h|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(TCXrz6wz%a$rF~Wb@vYZ-K^h zdb&7)-@u?o1pKhi7a5TRDo ze~{;1J6C~m*nXDaJLd(zZP>>UT+=V;bmsj5w>8c}NmcA-N8Sle;=V80&?=|E`Bj!- z;&UkpiD^3;7y>5GVfN7QYiLZAyYW$4LgJg~ffg=SM+HWW=?p@vZa1WexoG4wwFS&& zXbX@jTj;Xj;U$Ir4mm74U(21~RS0*w!&nXH|?Q3P3$lPqC;xwiIv~5#{KD%4);x9P|?GkF5<{tgb$0(=P7`l0Xbw%ju o8zwfkUp9zcaanhTmFEg01Mlx5wJkF(@<1W$>FVdQ&MBb@0LUMag#Z8m literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/fengm.png b/app/src/main/res/mipmap-hdpi/fengm.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ac2f7289fb3d91f4c7fb71e2ed3f72103c6693 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc*oi3Vrm?lJ*2@|6Vn1v4zTUn`JsUcs~f{eFY>zQXPc1+910kNm&sQ3SY>fFEEKR#*-mv@%YwYdQ zwkZFpcv!97H^Hx3^#Wfmo2J0=*LSTK1eP63_|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(TCXrz6wz%a$rFSAY&od&UF^_}|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(TCXrz6wz%a$rF#O&%Em`&Wt~T=u zf#bVR3$)$d%{IgH{DZVZKGE#urjNN-1in{0(EMU9BNy+q(gv=^w-yXa_j4Jz4Q*K` z*7-Z6%wb|&c-+J3&iR8v34B+I#8RZy9~6l@%OCo>{zC1s3Ew&7gfs=(bZt~-T;Kbe uq4oMotBQ(5&QLbC*CrEIWuKa&YRb?$IqdgBD_<#4XnDH&xvX|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm01^9%xx)=BWnWTaP?nzgHdIU>?{DK+!-}~FkFMF_GA--N;Apb(b=c1GT zK*=wjE{-7jk0<%t8YXKePobh&bwc#+&BmCyBF6Zf`NH7rUqQ83&yk8j(pT}xT+gjz=M zM(mJ&*}9;yp?V|NDz>cGkGpPge>G^zvPX7@Xyozj)s@=|F3z< YZ>YetV{^{Y98iFIy85}Sb4q9e0Ep|Ji~s-t literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/icons_dark_mode.png b/app/src/main/res/mipmap-hdpi/icons_dark_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab67d25b50496d6cc816082c868f9c72416e65a GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc(TCNY40-L!0=I^L2XzhDLd`S&&FANcq0w~t@&Aa~;fpu`PN z7sn8d^T`PdL<-mvI9|pb64}+EcqF#rOfqNF#t_*BJlC?B1lW@G&hRZunK5A|lh0lS z=Eck3K9%HhU}Lhl&)TG|A$Di$il}>K*BNgHmNzUjoM-AH^vaiE;-M2(&&?V<`c@n4 zQ(|t`z47wRbV-RR2l)0zA1Eki>^NFFz47-umVgy^?luS{?dLArFSN-`aYo_B1o6T< zE}JfjzfsyK?csDtV0oO=#{jphpVCD54SzK4$!$_mIC0=gW_4v3gHpi;7R6}|$An}P o4(wx8mP^$aoXilR9x&$;gVsi?9aZtKazTOQ>FVdQ&MBb@0I{Zj7ytkO literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/icons_edited_data.png b/app/src/main/res/mipmap-hdpi/icons_edited_data.png new file mode 100644 index 0000000000000000000000000000000000000000..37dd5bdf9022f608e023b87c6665d8e92cfb8ca8 GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skg2l#}zx)=BWnIwVRj(S=^4FV-We!&d;a}B zx2KC^h{frvQ*Mj3C~&y$eX!N!-~a66EYfpw*2cAq2bNa~1gx|-Pi9cy%)XqYp3=W# z%Zzq+_z=D?9XqX-c2i1PHf1SudrKjLe`osOqMNQoLzl%Jh^{f z^qG*R$z%G{O2$Jtd)C}@2Ll#ZD5nW!{9@sJe%4UQbBW{r#wq#B-U-M~e_=7Phx65; ztsY0XK1ru$KVP-rMcRq&4X=JKudC+2nAx*DDZYA}RS4^o4*{zRLejUD^_}~7ui{XJ zs-4cIOW$+#7I)3r(|oG&z>1lnD>+1eau$WJHPsi{{6gWxqKx|{PM7~(3HrTe!=2fe df7jO++5PGj5-q#C|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA=0X`wF?gc(TChy?~WSa2w*Wbp|n_WWlTtorZGsCDGmenzDupX_C{p8RJ| zyY};ZK<$6o1Sg&UidHx46mw$o8N?p_X%=`jpHFNT|Fe)f_K9EX4?6v2Ob}*uP`S>( zA>bcd%i^2+8dp{@w+MXB@0h^s)bUhXZ{gn=Qg0{rJa7B4qMp%-<5kCRk4AO=LapcG zEdh2e?5EE&RV1uyKO+4556h0ni3e}-U+3iW*^vBC-BIGw|A&5G{?F%Lq<8*5&-V88 zzyDX>-lY8hzfHr2+3Nr71!_v&`(lo%r=6^26|n3?%2|6>tM7mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc*oVSsJ^1(0dXB|(0{3=IiA?zU%vTzO9y#}J9j$q5Vi0(e;) pITW)0*9-h;Kjd_xk7u$WBSVV3sj2(?CPAQ522WQ%mvv4FO#pr~E$aXP literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/menu_icon.png b/app/src/main/res/mipmap-hdpi/menu_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ca7055e8ab693a9563a90685c71b6c2775310560 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wF?gc*ou>o1{(0xEP>?J{d!3_5s6zT;Qq$D1_1r+M@ba4#PIG>!b zKtzITakoLYxYPn|Eq!sf@Q}E^Wjrf5d?ha|`C=4undfxt)oz}NQybR=>pN|nBB-%G zjwM99L4e7Nxpl@-L8mjPcoY=blta=RS}riiwnlhOXuTubz*23wDWH?-a}%+prNuxc>0MjV~!%Ej!^)jZ({SE!~(Cc{e$lmEK|j!px*jKR~@&t;uc GLK6V6CT4U1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/naoz.png b/app/src/main/res/mipmap-hdpi/naoz.png new file mode 100644 index 0000000000000000000000000000000000000000..0e45348ad585839973a9400d57a7278f204e5d3d GIT binary patch literal 551 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skg2l#}z*0{W>c6;04^}fdSEfl%EbuaKia9yC{wQg@9g0CmYgDes#3Gxfp zjF)JfwBQ`WBj=9+>vK)_?O2c(0<@;g)5S5w;`G)jw%=he9J|Nqw63|u>| zUD?OO9~|iKJIRmz*U#e%^&QfR?;W!)`N(>Tv+73A1{+20C7(GyMVs(QCB-k~{m|N> z)ZDna{iKe-;{{cVmOQfFVl2{lW8Vb!ZE{v0c;0&aWlnv-Repfy#D}R(8PXG4-nF$z zzEtzLl{3XDh)sEl`W35QUZaMoUKZ;oct4ORFguay$j8C0!drZ0dBj47_4;@Bm8Gv0 z6A006Y%{3p`+D(lz=@u7QPbvq7y9ytS#+-U9qBFcQa{s#Hb@7rn!t1Y*n+K-Yy5&H zmvjXOpT51IXi}EsuZTY{ySxPYC)|D$V=5ZT-P7|q;)-DDv5>PRJ6|%2YF_+)^W^Px%sZdN*MMrQ<(3xT1kY>`dfacAWyRVGy(wX7Ipxei* z(_TiziE_=NVcV8Z>Cl$ity$mJ*3_`4Q#Cdb( zn@HVoIO5vc>(ZOmVl&gLmhsh{-pR(`w|V5vk=dnjnq1Ljj_1>rN(3kM#y!hg*@z}EZ@W}V-$@%Zf z@Yd|uj8^10->LP!echB}^4q2V^2zO$X6l?%@6M6xzkB=Uw*K|d^w+-ct%uyYW#qY3 z)2nFc&yD)ThT4ir>dT4Vom%+Gh~sf3?WjietWNT_Z}72a)KoI+n>g>riS^T;^w5z0 z@yO$PH``7Y&}2B?ctG;nxbVxg?V@}2+p+Z8#@@eY=dE7Ik7NDKjN!U_=DB9TbZp|2 zH`RkMz-nvl#&X}1TGV<)`nr6-W`WwlfZmi-_|S{iX=C2Mcj2Rh=9Wy_mxk$pKJ>hc z=<;I!I&ZSu~y>Aj`jcTeo5UH9O=^31K`fK~6endF*j(PmKTo06lb4PE!CdIvjQfo)07b z9Q}cl&^tIjn%Zr8fbUIy?SQz!y^`|r^H$*P-{Rk&gzxXjPMuuSpY!&8&UW*azu)Xd z#HGLh00M?dL_t(I%VS^|Hh@`~g_n(&MUWk*3U(G*XJnrzHO)PZ=+h#vE$t6Yw z&0*|jp(`sUFLQPFu(!7ZgV3ay3G%3FghQ{^mSj3RdwAH|+5u5&gKK3Q?JX{Qou?;YV2+8?WOYMsa6%lGUEaI!?bhU4A zigHNp%5{p0s&CIt3~_Z0Il6}fuE@w|SzUv>(?)lvNA3R6x&F~@P92NSW|q#My;lHk zkZ)3D_y+gRmJa_d-O(%V`{%9mkFLnd44FS|0^B6?rp7wQfbLCO+@tflAGStCZMx~7 z*PIoSHT&d5R+u8IrkeG>0RaK-9b30{J2^S6xski(!osZZxVRI1a3|TgU8;`^Si3oI z-QDB|o6|cxTb87ss|l~3K4S_GTv4RkrOW{L)vawyy&W6xHLq{J6uvkkxjJQD>kKZ0 zqMTc|H{Pjj@b!recJvAh@}65>oLrrL`Z%X1BABfGR+VM9txQPp^vMo(j1LO}Dw=s} z)~v%C2!j|bBXSbE+}xTHd_8?2MwQP@pL%T4R0*U=5sdU}%F51hOH1(d^l|hG^6oEQ zdZ6#nBuSJsAmr!gmXx&It;yFj*egEBJGqRzaA%(wT4EB8jL30Yp6wY61YX|T@_X_N zxkb>ECBO07ixCliZfU;32d8Z>DCo)O!;-)aOwOENv|vF>Nnl`LU1fo|C@Z#{!eO{* z^*qknBP(`Q1WNJX%ya_!y4swa>T=Rd!=|7C02VFg8!TE(rT_o{07*qoM6N<$f>o$j Aw*UYD literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/qr_code_icon.png b/app/src/main/res/mipmap-hdpi/qr_code_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..337b6641d6f58b7ff3ae24b0d16eeb088f331b87 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm01^9%xx)=Be@Cpd<2=Ma=^7HWXa|;Oo5sv^6@Nx0+gQSGPNDwS8D99rW zMEox{CjdC*Kc`XFCd@xe*e<*`}e1<`_%!o%GA@vF~s8Z(cp{IS`;{Z zgC`_gef)2~+i6+a**Eiy`A<8m#y%-(O#La(o#G?WCl)(HVMpP{t=3_d``>hYeALx& z_wlA3H~7CBy!S9?Dyr?jEitb%?@yMZX~PADxEs?%p5J__uKC^T@bW2p+IIKppI5n) z-Miw$C;Lq+6;4MsUt4^k=FSqC1&vMR&r5{_`PVnyu`1rPXZprJ+ZRm9KXp||RkkLh z;7Q8Gh=9LLg01XVPF?j9>k4g}eN%QuqWCUG7n5JPd+sgyJv)@kZf&8f8hYm+=K zRGEvVZOL4(woK^ywjYyc2L5#m$o5XV?ND=W=X{6S5D(T6!-ZRxZ&MXZe-XQG{!#_W zd&PG-^dDQF`@M&wQbzc|>;o#=smq@}vEgtw&`;l)JwGPunBDobf{f!m$7(Jzo literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/sao.png b/app/src/main/res/mipmap-hdpi/sao.png new file mode 100644 index 0000000000000000000000000000000000000000..e24ca838dbdea3d70c56aaf68067f4679676c667 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc&q+(H6Cz#{-;@bd`r@bC!m2np~AgT#S|R}jSI6%gbR&NQ91 z0jQC$B*-tApB!^NDYi<|+1 zJImkmIPg3xe?PDJsYJ-Vts+gSGgHF$6f<#OwGC~UE%;p^=g@A3mW^xPJ6yV>KVj`F z=9#B{aYbgxdT>9MPFZNhIN^eGilXHNf!Tta0yZ%*e`Q?EEurHq^r(WJZT-ZS8$Aaf zFfH9?I8*WS6k&tCu?#|0eL5w4B0_8Y4VotWW-Y4tlFK03FD3in#pLR)4Yqtq8?NmR zXIJEOxWg>9)u*(B<%2+$-tDUn9!vr~OEsP_{##)6doKIY6+j;`c)I$ztaD0e0sv~T Bct8LE literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/xingzuo.png b/app/src/main/res/mipmap-hdpi/xingzuo.png new file mode 100644 index 0000000000000000000000000000000000000000..cea7570596b131f8c27d19304d79b3be5066317d GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sl%2l#}zx)=ETKhN<048#8(jsM&E|DR>}e+tY7iU8TY8VCdw0do5^K#C#a z{a`jw8BheG9ww`E)%Y~f3h9y{zhDN1_bvkS4U8M^zq*q!dwWCQf=y=?CM28>=-=Nq zD`G#;RfV1|jv*GOkA}E!Yc}9v5x-*~P?dD||D5<85BXDMbt|0YdQ(KhuktUAQ+@tN z_xm&HCeNpvG~(=?`iwUz24A1(T)#P5Aw|*1J(Dji^uB@1zwcARMS}fQ#iniGmGa)d zy_oYd^A}FnIXX={|EM#x&J*<4dKVI;enGe<=*c9n)VWMsay_T+ojpNtakFVc%Zvj( zw!P{vn|3Szn0t02UxebC@H0JbkFNRLdRXr8J408rDazW9fmv$%oD)KhQjDG}zAc#k zSWsk3Wb;XlEQj;_3%K%^-fqY&-Sdz)(y5goVBUu*rAw39U~NnnPY_Nka{smB;+^jZ0J%+b$voGa6(GsQ+^4r_kh zxfmJIIZOHP&8d6jb8>TO<0{SNla}^O(|J%2BiWy@1vi%8i8@d;OXk;vd$@?2>=5g B1F8T3 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/bi.png b/app/src/main/res/mipmap-mdpi/bi.png new file mode 100644 index 0000000000000000000000000000000000000000..de27731a0a7810c9a08227b0e13a8fb03d0fdfba GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFV;1lBd|NnpY0v{kr3~n_&!5|!hFZ`4FVHBuisx_!22*K z7bsQe>Eal|aXnd}g^5idaV1A0$L9QO7Gs`Cs{Bn7hkRJuDizuq7YWE4Pf$FgqVZxW zM~Z|-(@ma3a}+!koTn@dn4x(>;Dp7Q>;=1KF`w|@OAykx(K?|p@xTI&T`VhNojg4~ o&9j3Qnp?O9Sp0XMU?^r|;A;_i?*II6HqdegPgg&ebxsLQ0PU=GlK=n! literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/collect.png b/app/src/main/res/mipmap-mdpi/collect.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8944eccd1570fcd692a22a217462cf7efa44f8 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgB04)6(abuaJ%GD!lr9rd(;8U#v${DK)21md0F=ReplU*A7pfBpF>yLdc- za;rUE978nDFAcgac36SqFn3#(_W%D|FYl6zeSY~_Gy8=JEULefZwmCq?%kj@{VZdF z#EJ5|E0sUJGH=*7|I^7?+Exo5E4;jx5b^U&qRK)p?KZZ9&PyL&6!>{E+)&_;%bxX8 zJ#p_AbbmYd{)8FtUAKczOr~>AF4|tcF3RPbVd1R8M@M(H&19Lo_Sl;}2QEKXSi3AN z%wg$`T?!gm)k`u?E@UkNS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(TCXrz6wz%a$rF9AK{Kb)GUMq)ENO^7cJjVG)t)?;99Sq}3bCsvODFU{Hyi=NwYJk3}ek zT|wsCafhbGj9C|g6`n;hJYB+IxR~j%lcVE7ULGe0zIcYiYO1PBISu$&5(*ls8cvxV zuykM+bMR@F{ws1a=-YLNrn8JEb3gMa%!z*KaOhmra!*s2m4^H(FTVRN3Vb&+VY0f% dts`?94S>OvsnRk-CypEBTTfR%mvv4FO#o8EUL literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/fengm.png b/app/src/main/res/mipmap-mdpi/fengm.png new file mode 100644 index 0000000000000000000000000000000000000000..de27731a0a7810c9a08227b0e13a8fb03d0fdfba GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFV;1lBd|NnpY0v{kr3~n_&!5|!hFZ`4FVHBuisx_!22*K z7bsQe>Eal|aXnd}g^5idaV1A0$L9QO7Gs`Cs{Bn7hkRJuDizuq7YWE4Pf$FgqVZxW zM~Z|-(@ma3a}+!koTn@dn4x(>;Dp7Q>;=1KF`w|@OAykx(K?|p@xTI&T`VhNojg4~ o&9j3Qnp?O9Sp0XMU?^r|;A;_i?*II6HqdegPgg&ebxsLQ0PU=GlK=n! literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/icons_about.png b/app/src/main/res/mipmap-mdpi/icons_about.png new file mode 100644 index 0000000000000000000000000000000000000000..82958f6181a798d32828e3f592ac568c57da0229 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc(TCNY40-L!0=I^L2XzhDOWef{t2A0#^qoY$XkEX(-{D6!4c z#W6(Ua&p1}c8fJN>oxKlHb|Dv^=U4B&(UBR9iz_RdTP@_q09usV7fFE-4X_&tSRDA@dxYLK$0;7~@N~33|E;`_3FVP-D(;!hrG7YKOmP%^Q0n zIM{O-W<2J3e8Y*Sp}>J{hEKwSfZa<@9^f$PTxj0V80+advGK3jgu_ob3isS#oWOmT zWx}1^y0T9e2;_G>KNn}j8@5x0;p?iaceT5vKeX{MsB5a;agqEy1r!9Hu6{1-oD!M< DDC26j literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/icons_account_and_security.png b/app/src/main/res/mipmap-mdpi/icons_account_and_security.png new file mode 100644 index 0000000000000000000000000000000000000000..eaea4ad1a49237b79351e6ab03f12287832c6fef GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(TCXrz6wz%a$rFNS%G}U;vjb? zhIQv;UIIA=0X`wF?gc(TChFPLK|pvZgmpSa62 ze}>{2_RSvE%m(e>)jPg`xciz;{9rOrXUfq^=I(fMlQ-<_ALb?J;#rbbD4&?~S$IL; zFJ_})(LWpD&kMe#?a`5ZF dc(Z!`N5+WnEWNgDY*`==d%F6$taD0e0su5RYi9re literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/icons_edited_data.png b/app/src/main/res/mipmap-mdpi/icons_edited_data.png new file mode 100644 index 0000000000000000000000000000000000000000..9729324a8eb44384fef600eefb2878d7e07ddeab GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgB04)6(a1=5(ny}$=k5H8|Z@%Ar}BTy3L7i=%!AHRRGJcB|@!oB?W`UbD~ zer5yZc6hothG?8$I`O91VFeDCScgE9hyV9)ThQsdYtNR?4^Dn;lXRHA|HNO8pj&rV zP7%|H&3k0zD7eOSO;=Q47o$+kSN%t#7KYaMqoNdEOubyZ*+0~p(K95#wLVqt&^u#A zhuuuwn}hfn9y0h&E;=r0`Sj{n2G@r9cYPDWjvP{$bI<5P)H1%x-6;|YHqWJQsrE2_ zl{x&gAg_$)#oDX81ALzeCC6Cv7|MBv9QwZX`zE=rjLI%`p+= NSx;9#mvv4FO#liDd4d1{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/log_out_icon.png b/app/src/main/res/mipmap-mdpi/log_out_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e10ff620798fec0cee4dd11537fe15ecc0e89f32 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc(TCNY40-L!0=I^L2XzhH*__3;8vDAD2R z;us=vIXU3~{|2C%{OEW1#B1bIq-cp!K9rm>)kyMe`9q$PMZ zgVOgVQ^VM%7kjb}9eAM0ZF>C6JI9N=CmP)Mjnatgw2xuv@t4lh6}uM#@|35mpUXO@ GgeCw!MpS+P literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/menu_ico.png b/app/src/main/res/mipmap-mdpi/menu_ico.png new file mode 100644 index 0000000000000000000000000000000000000000..d018831cf1237ae06bbaa88c6845e8c6b52a22f1 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xsFgTb=`R|B9RQ%R6tFvIFVdQ&MBb@0OU|8RsaA1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/menu_icon.png b/app/src/main/res/mipmap-mdpi/menu_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc29fe8539e41a0e91b0f6c6d83609194499441 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV_vF_=LE+7x?@~1s#$$^*~wHk|4iehWiTdJN8ZCT@MsU@N{tuk+__kaDZQ= zRUk+0q62G-OU4QTCnpmDy`>T>q*S;j3yCK22Jo~Lv4}=6&tQ3|wt-FIrn8p2z%fQc zr^Xq945v6+R~|iY*t%=Fri90iHYZ1p35S!o64|XEaEddqtPog}(YHkzXcvR0tDnm{ Hr-UW|j@(M4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/naoz.png b/app/src/main/res/mipmap-mdpi/naoz.png new file mode 100644 index 0000000000000000000000000000000000000000..61c25293d6d261e65fd9855389999d332572feb6 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgCh5AX?bbuaL#aeZ6u`W8q+k=xrEmp5>3gU9qVI8D9uc{*kAPV~EE2xk0xl zwJPvzc33DXQ2Ocr{avhk-o8G`Y|*xbGc~gA$f~KIHnFUFWxv0;#bty2fj|fSg&#Cq zc`r;7N~~qMkis!x-_jd-N+pesuWoSs6f(G@(q^D}%dSIB>7lC4qc`=3SPxbTYj1OS zA(Zrb_qWY5xti;4zevpT5$2Ow=Px6Fh<{9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/paip_coin_img.png b/app/src/main/res/mipmap-mdpi/paip_coin_img.png new file mode 100644 index 0000000000000000000000000000000000000000..285be2a07233e6f8dd5055303b58290ff1f94ad2 GIT binary patch literal 873 zcmV-v1D5=WP)Px$l2A-kMMrQ<@6(yhYiQ86vDIHh&wyasw4vX+ee2MZ z)wGWA)0phfmEqRH*J3u;YB$b|gY(y)=FXVtm^|gIQ`w@G+opHr#EICrp4_#4-pRt} zuYljZq2auI#-CT+xnsw;kl ztn<{Y-E~0PYDC_WXX&qP@5G(sh+*c1RN;G6<)T~FUqaP=dE1dr=d)1r;l1geJl3<1 z-L|IJvx45TW8RNV^xLGQchC^+SMM0V&Rls^--6#dcnKH)00BKoL_t(2&tqVq31AcC;NWJ*5EfwMa&k5_cM?OD zVrMk-3-I^Padk6y5k(T`;Bw9P3pD`(Gba-XPPn*wO;U-Ofq{;>xw)Z%fr~gyoZBKe z*+56fP{+{R(7M9Oxqt^E&Z+6(qpPc18l|h75M`I?>{28Nk4FQH&l#mY%D#1T1>sH>tkaT*kBS;O2!^~dLRk6;_@b`)5N?JW(Ah00000NkvXXu0mjf`90b~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/qr_code_icon.png b/app/src/main/res/mipmap-mdpi/qr_code_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cc65ba35b6f58f06c9f9ea1995facc6159630fcc GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgCh4DbnYbuaMY;ouSA5fApsx&GI#|ActLD_AcGqy zD=f$(B*-JY=W3xf&=8@LAirP+`S9NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc&qJVJupLIOa*BM2loI5-4&g!zGNUO_%?KA@}sP?lR*kVly5 zLe3+gM!u3DzhH*>_XQ3r$gj^`Z(4tUf`O?=4p64j)5S4F;&O7r0p_p{2?K)-=kBm2 z74Hf5Pe@28tJ=g$_Ll66!M;?H>rSG_h&4 zJ9Bc#aJ(>ZPOCU%q0lB^^n4y;%h_L29&2W^J(RFxu71aHVtMhs#_4w;`zSug@JPBZ-P(EuSJ8zO$5;r|A)|GgUj`&B?B1ogob z0M(ph00{z3fM^6t^=N|h_G*;=6!HaHBwG^X7tGKw;r@GvCZql5=L;x&6j*U@=H7ty z1@YOb4hzl)u>D;79jNf5r;B5V#`(E{o|6tM@ElpgB;EWm%ung>|Cxs$DXx@R-0V{7 z?7c(@-sU~O;}Im~Vo$zpnKaZ$!{zlh2yM(0)EUn-Nm^V(Y8cP0D3 z)tuqpU3OQQPpIu)q-7AQZ>GOYs=?#FzT7QH_8GV_K;rRugjI+bhvll}JoxUiK` z;_{XmQrs`w?yyt`Wc+9@J=8gA{zd`AYxTKnE9ahTzjKf!ULfb}>k?z#Mh(_k+!xl! zq)wY-`}AN(()D%IQdTcBzCSna=7GJ@lYH;o50lRq?tbfc_ji;3?ai|swlFBY&;D`i i;VE;5NS%G}U;vjb? zhIQv;UIIA=0X`wF?gc*oNdYc)ZC4E$>{`_gv2#xjU7x9 ztl}tao62 zGk@_@<^@b=?l-Ef5pSsK`{|vr!sbHP*C3vMYy#Ph3>mDq@1OfW;lqt-)28w8`1V!( zJikJ4juG^FfOsCvw7MqN=*t8E`qPOdT6=`yk1dz zz-dE|y}}RnsGDs^&Z-%nD13LfW#-+U+GRV|A3nEpeWaq><24qx*G2qA8z0oBq@>>-2qh+I`HUB3{TM_Qd!1+wP@(Z}8uCdPncGj}3gUy^QBAyqo&8-<`4Mz*kSK&_5Gd4CjSsj3^XjOzVKM*+0FA2eW&GltR(9uIej?9yZLIsrW;cy z?NW4JeXB-z!I5nZ-d>*blV*HOo0qb7b-#b{n`s8tthSYVW1r4rtGIvaUY@pfuklkK zC*2P`Wg-S`Av>unZLyOBxj`A07+-t)0ztcW)-q!d@e-a;p;?mRA&t;ucLK6Vb CRMzAG literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/feedback_icon.png b/app/src/main/res/mipmap-xhdpi/feedback_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..245f6e2bba4b79e85f6f12d8382092ccb5057786 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?nV(;1lBNUf=^{5)V{;zE}cP^Opqq1vBioe<0sJKR#dI|NVM_^LGogm4H@+ zd%8G=Se#BySfE}IsHLwT^vP8;g-iI}e|aW5?l$WKM=hWJS8iTk(0Ns1-NuBds6`7* zJ7zM7rf>W&yRL}w*u|`W|Cvvv{mySnO8%3-LhIdsE)Aic|I!LQKj#PDJ;Auy<-hVO zmh1nS1>F9chj593&{kL~`@#lSp(C`0F89)6qguca3P}`HCZEHHK5|bIOqlyOfOA6gx&Ka+9)vVCaC@w4yvfQQGUY(hPNuH@ga10% zt-rB%vCOdJpZ238fK!P1rm3Kef_k9NQI6P%4U64H^nDin*RHxEm2mywmw1M1mxIA4 z|Lddw&G+5%pZ}};=l^_} zQ+hsEGrAo5Z?E-3mdUi(c0%$s!LknNS%G}U;vjb? zhIQv;UIIA=0X`wF?gc*oNdYc)ZC4E$>{`_gv2#xjU7x9 ztl}tao62 zGk@_@<^@b=?l-Ef5pSsK`{|vr!sbHP*C3vMYy#Ph3>mDq@1OfW;lqt-)28w8`1V!( zJikJ4!lvI6;x#X;^) z4C~IxyaaNL1AIbU-3xqxOp?HDM?Ec|27!_wzhH*>@|h0=-q-K9SJ1!Ezuy1B)W@Pg zYsx)c978;gUky9m)T+R7_Q;2cH~-ha%`oLvxHk7`X?j70+``OX(;h$jnS3|F{6_!g zJc+oipEqr0es(hS)BY;%1HF>YAFiA=+o{|ia)#5{_Wa>J;(_eNHKkquZn3NsKa!U5 zRcV$JuvgFIchq@xM5Ygj1mpZ^m)w%!n~b zNxl2`n}4*P)C2FrlkdAl{#NB);J@}Rwo&5o^*^nD7<5vkE}neh{S*|Rp00i_>zopr E0Jm)2@c;k- literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icons_account_and_security.png b/app/src/main/res/mipmap-xhdpi/icons_account_and_security.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e2bc410374221afbc5a95a81dc655e7c8724c8 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm`2Ka=yx)=BWnM8uM+v1i3mGYGY`2{o7KZsu{@LoaRLq321`FP)?4M5|~ zJY5_^EKVmUEYN;nFeT@J+PT{IcXzw9&3N?2p>V+&CZ5hk<>zHwKi$hr%(zgkcIv=^ zAMXMgX0e>!%_DI2n;(PkqIa@4;?9-(UsU+@^t`+6yw;j51 zrs};w)QkztTVKp&I;8R>BjJ2?ub`ZO!gsb~Nwwd(B9-3B>iAjQk9C;#p!N2-pXV4C z88b+w8`v8;tNw~x|qbvwi>o literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icons_bell.png b/app/src/main/res/mipmap-xhdpi/icons_bell.png new file mode 100644 index 0000000000000000000000000000000000000000..c4111addf084a0e9bb16da3839251f1e98525cee GIT binary patch literal 523 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?nV(;1lBNUf=^{5)V{;zE}cP^Opqq1v5N&-{L;*dH@NoazJ}2M{f8rd z&Yz&0_`9C**pt8W8&nQ9ZI~pPCOsv+p|x{W536evcVrUdB$ns@*$ve0|L64(>iIAI zpz(7&|8IJ*=RZq1$Ll};nNEEB+vGY;*lQ2t;~>^& zegDl)FiL&>AIx~ATJ`sl*{`?D_;vmZI^U|#QaAkFj5|Nq7tqVGTV dy8o$}kzu<0e0TppCeuJs=IQF^vd$@?2>=xa)@lF% literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icons_dark_mode.png b/app/src/main/res/mipmap-xhdpi/icons_dark_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..6ede1dcaa730f3dd0a868a7cad35e60dfd70d3c0 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slb1^9%xx)=BWnZyA0bUc|n{DK+kEwh3`W|LS6&0%|hH&2Zwos8^HE5YL!P1LE?Q*Qj)}C_N2`UqOuJ2vl@I+39 zGd^XzA!F(1jL_NMYz#NKR(vbIagVj>HRFtVJGj{->QeSpU-#PV`9p8gWCexqdKN5` z-`{hXe4|>@>2{o(X!`DI(Pf_*x>%maGIKQl)LWIkGokTNMLA=PL10H?qwKN?FY_3g zn-^;wv0IS!Y&Wlgu{lF&Y@2t%{kaUh3=2{XI$Z=y7K^xkjOGjED1XNy!YS9ne({jF zn8>#47Z0rx7wZVWs1ot+p6QhtTYkKY?NL$T?p&cQVR#~pTWJ5C1}!cxh8*GU?fOh@ zmfS@jPASb?P(87+pefnWcM(^_Wkcp>F2kD)S-(VAJ$0OOb7mL=L(8s=FJ7GoxFVdQ&MBb@0H5NR^#A|> literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icons_edited_data.png b/app/src/main/res/mipmap-xhdpi/icons_edited_data.png new file mode 100644 index 0000000000000000000000000000000000000000..4138ab787694644bc505eefbdf940ba1262c4004 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNL1AIbU-3xqxOp?HDM?Ec|27!_wzhDM|`2P9w_VxSk=Ig)rPgpC+?Bja-v!(OSe%f3vDd+nwa8mV#FfYw>nw*;a*@~~5%={N z)_jp*lsL8CD|3a;hC3RX`_xpW7`*a$Bny}BN_oZ8P_*~K)ty?G8AT@Y|2%!jU~wbc zydbZS>J1W&S5@>w&ogWbcb(=^Y3yg$$?e)x#eJYwcwLF(wS#*Zax#6E zSk$nLH}f7dh4+`lx;;Sg=;`X`vd$@?2>>5p)9wHO literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/log_out_icon.png b/app/src/main/res/mipmap-xhdpi/log_out_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e32a698364b86b6a54574918fcbb9f7c26f6ccfa GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?nV(;1lBNUf=^{5)V{;zE}cP^Opqq1vAv&iMJP!f4_fzzkj~|`o6piZa^zs zJY5_^EKcv8a^CB(gTS%v+dQ+o5^O3yEK;ZtQi@|0t!;S1*wVJg;p+l*#l2OlelQ8f zFWA>v%W_cNU~BI+`}s4@<)uj#O@5cTd4J-*{IvANSCYbO*E7lVY8`m?y1rraLbl%0 zx_ceRrAjU(zhh@*_}s^-gM4s zhP(e*T@7cNy3*^B)Q!&zJavOUMl|u2c-yId_}a>|Oi1O|?ek2Gd(4%$X{FtsvGU=h zW{#>?y6>GmmbCKDTYXIJ+`%g+qM7BUCPe4^ANXu_Ag|8yn^eJh*6)pPj@{kS-IyIX z`7cA1_`y4uEqng=ZJxg1%Zf0+*zXE4FaAFkPipK|=eOA)42l>}S3j3^P6T*FHBj-QVPx#Fi=cXMSMi;M{rDhMeTe=?tDef%V59a2G8En?o>_ z!f9zCr;S!3hgevM7h9WDHWrG7tq6jRpziIt7s=)8%`_7W{ zmqGs=xL=l6#6DSi{Tpx}072bx@&IaCaG3)LcFc;wu@uY!iw`}_`{>_3fqr)ka;Om% z+5v(l(Iea&gN_8~GqAv>fFB8PvB?3N1cZ~>NWdKCB~WgU#84whz&_m6h^Gr_0$mH9 z;jTu^Kur$kV&EFP!h$Jm#-IvZ&jKGf98us6eY{V>dDPmWfN3o32F@m6 zC$R2ET?Tt`iaPvQki!kli=5|t-r{0UfSjXpvd1;J#h}$EJK7u8DdG@=HzWI6KxDl# zzBBNXc{%8pbnVY9_yBBK*ZU@0#iyeSa;^7cU$^?&ru3T9QRdk1v}2cQ~At2@bCt}&S5O(+Yz2$5U;wRmbg!jXtJ5 zc!}SyagNi5<7cw%Tv>Xhoww)H@|FMf%h*1C0Vb_1D|1NIG5`Po07*qoM6N<$f-E9I Awg3PC literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/paip_coin_img.png b/app/src/main/res/mipmap-xhdpi/paip_coin_img.png new file mode 100644 index 0000000000000000000000000000000000000000..050108b541d702c767e099eb6b6f037a49ff52b9 GIT binary patch literal 2034 zcmVPx&08mU+MMrQ<;Mu|I(U#w}i_Dc~%6neb#KORQUfIT- z%A9`m>crQ9Z`OQv$g-T?zLx3EmGj}Y=gOJFZEM+#M%9;V;k|>|v5?@ea@@PD_T01E zytdrJz3a`H>&cb%;l#zDg@$5Q_0^fqo@2?DVZ?`5*P~#>f@IZ?QP-d~6#(3R)TmFm))`tQZ`>o9w}S?97h-^v?X|u>0Yu{_w~9+@SvR%JSB~_2A9++M)jS(DT^B^3#|6)|LMG z-ucRl`{b7H5cuZ!%mfzz>P+PP=JY;et- zU(H)f>eiU*)RXMioZ`oV>d}w+=)dZ&OZU5V@TO+yj#THbYT9Z{&tW9wk}%|bT;OLQ z$vG10iC*TXW$Lt>>Y#G+#*V{%YRHjf>Ze2To@Cg+eCN}X+LS)_vT@XETi~Qc@!YcA ztC#J)a_zHc_R_1lHrg>*k&~Es(tgM zF~*5w$6RIo#)ZgQS>bRdw`Y#gZ$8G5Qq+4s<+xn-(SzX2jQ;Y()wyuqwvpMOSM|7T zOVMRZb5Qvf~0BQ8oFBsUPHKK%!1m5fW|%39O%aQyz~ z{b{@X7z**2)8TUPV%VDLce>u^!sp?`w1>CM{lJOK;+^G;vc>Y#*WbNt=;Z(a1V2ec zK~zY`V_+BsbOanScJ@q6OtSoZEX1hhw@pd$bDcij6^H{xMF=PtbVx~YO-d;Y3{1(* zb@!V-HBg@&pXp3KKCyu<8-F}_uyEnRwvt@$>C>kf;B*%+e{5`F=axl_+V)*|9vyBF=e`|pP%1!@6Jm=9W_SSU9T9sYTxTcvpX9b zQ(WD_>iwoq&u`A1x}lN}i+aA;=KiBg+O`8#C;7O0yZgDj`++pM@}< z?b&64K0dClZb=Xg?(VIvt6Za8H(Xw0jNyJo|Ngh_Z(@Ct+(5wF+Z&|bd;iW&y@B2v zW}Y`^L{%^E61M8?t^+=9Fy%lE-`(AlZtVS8H`8a@%*oOws2T)9!g{;k_~hrew&v%1 zySe4&dV9CJyMIrpcsak(XJ%fdgc)jl1t)eMFKhMalJoHBO3KfThyj9#-AP_Cze)mQ zWAkdRUXw!6;N%CSAVspK@3>~SC;SWg0NX0X%$QRyvkR4 z#Pl6H>XFv>GA8X{#gY2L`hfN6>7q#L6&ypoU+wUW^oTfmz$0cwheyoeg^wb7I_`U= z9bU3Lpg!Q{vNwIcOc`TvT#fPn4u4_s*5h@8Z^lEdd834In> zzF_gP)I-nx{X3R*Kb_aTw0Cdn)82rRlCs6;E(oLeIXS50NcgkJJxj~VdUuB;h9t~; zICsv&xutXV&dr!p((!T1{c|Fy8lnr^Lc8`X{FLVF{IkxKd!1Np|rF#W7E1X zpQlXGMNJp+$)1mkcc(609$H-N=?l~n66WvU4AhVSRR8Jh$4_Z|i z8X5}KP#xyq474I+&fL>yCrvu3iJI~_<#Lie_sxn93JML)@&xICXh=AfvF`o5)srR( zaiV1g+4$t>kom!lvI6;x#X;^) z4C~IxyaaMA1AIbU-3xs9xcPWEcm#leTS$OMh@S^U3IGLwh!-pfl;RPF$qEW^2ng~B zf0JEZ2sA{fB*-tAL0?|s!TkFD_VNDx0`JeS&sX4m&bkt4-7HTR#}JR>cf$e~wJ30$ zIbv{n&Aa*=?OiJ~cmLh@boB{AnSu<7x^u@q?pB{UN8sG&JK693^bRa-jyjhSv0HZc z^xwa9e=)kg6<5@`xy|hNV#{AA<=pNjdldQ1KQSYtaUJuD^IsBWo8ow%+f0_c%V08h zQN_|`)<-?5K?;wKKFRI#yv^j`edw3*>}S1uI(MY#p3nKYyVOh5Kh@(vT7j1mQ+{z8gRM40$Sup{c!sWA)(63+ zouS`t`*$sVQ}OlMuSffS%H0-lOy6+xigefI#~QY?R&JHs|GoGl ZyNi}wX!lvI6;x#X;^) z4C~IxyaaNL1AIbU-3xs9c?AS`g!p-c1bBqOYyo~AK|T&X0d64ypcIezOU*ewJL?d%myX zbZ*Y8?H5;uZFHQNDZEgSy3s zo^1GU89Tw`_`-`7Md!Wwh83G&GhT zyW2F$`@-KVtE9vyiO%HPxZTw6gTe~ HDWM4fWQC=Y literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/xingzuo.png b/app/src/main/res/mipmap-xhdpi/xingzuo.png new file mode 100644 index 0000000000000000000000000000000000000000..83fbb1a02490e8d2f3b31ac3701d8ade8dedee1e GIT binary patch literal 705 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN*1AIbU-3xsFpJDjlr}2M<1c-4KjCwTwAL0Ce8qDt1_zy%tDWKpf1`r#F zfNUTMQ~(t32Fvzpq}zR64K!A~B*-tA;r%gz{qqxy6&mh8%y4lqn7g+5Q^9(_2hSOq zfUfxH>EamTar|!B$!*OFJgEXpc+T1V{jXok$k@DS`RlZc%#&t!dIvex1y7kQFYxl0 z{*<4WF6eUSE~yGFKU*gJk>}x~fQzd?D0V)1&3P%i{+7;*h?5V3!Y5C>cdyEL*`8=E z?Qf3rcdb(W;FE7BQgii0&F#2zKUfvGYL9-qJ4cIaPj@#nhsaUOHwwyH<}$liGp8JS z=eXdb;m+SWfx2lXd3fXDikpi`?}>U&6G<@HL~D*ukdW(jtrJ z0arM$?A|uPe#aqAv44A3oZnU(RJlyZ;AdCjTqcKO+J|2AKamvJB)4goe!-&$kCStSrkA?9oQ>qsY;5M?3-(@a%6+|t<4(6@%8U0`7(Q-c zyLyx1%=DjIJUx56PkmMjIUdgKwIHj;Erz8*QmOllNxDPu9*;wxnIBCo>^aK1e(#2a zgtMN`AqUK*JIt@lEBJWo=YdDU3e#qGF6S{T%{KnB@%67`D(iZGTsm=Y)}5PLTi2Xp zh{~S2QS!d^?kM?Lg?ZmAo~?Mg^zQLEak-aeD6*L+`^5BFE!}*Mth@9DG#L@<>5!iQXa(NtT0}8b26!arj+&rC`y~WbqB-pg~%T;{vG zCr#D+CvLOm#8Z8%$>)Bzn?LkbdX{b1x4CrD@v40m^DaLYf6RJg^VH3z#lR?H@O1Ta JS?83{1OTb9{iFZ@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/collect.png b/app/src/main/res/mipmap-xxhdpi/collect.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdb01122a4ddba6db90e338aee359548944438b GIT binary patch literal 779 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xZ3?!EyURMI7SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skg1o(uwx)=BWnZyHCpD&g`)%+zve!&b6eD&rLz6Snprf3(9m=R$@-@ZUOO|31$w#BPMI`$bAyyMLQq zu$($Iw&b=$E?3Cb>wh}4){B3e75*Xkp!DmLGjbwdDZS`(Ke-@0aemq-vG6#{Nsd+u z>*rOvx8LLU*fdf5MOKGr(2~W)FA`t-9m%WEjIA`O@K~_?(#5A0y&Ke785xz_Kh6?U zC<^6T>UMfgT;97?#uqLmU*y?k!4+hAytxJIwk%w}T1R_bcWFD{Cnrs8H5dNYOhWqH(Jo^w}J)gm+g%(kc_@yRFt z8q9W>{%@nw2AiZUlLb%NTuA5s5n=M8X2F!ihcD*~<_9M>Slc|rkkgTo2Ycb9b|G@%g>!X}0s~3s^R< zOxB&mJfS~>|Kr6}^VI#^eme84EZ7AWUfdTF;!))pbZM1f%#I-cq>VQwtlBEo$bTsC zhRbK>ZEM+<2YuIJ75c=Szx!QETO*%c6tj_1U{T3llY1?fZa(VQ;P4Esc-kDd%gmAW zQ;mS@-U&y99{psfbqZ1qxZ=QgEpj zUc07dBws$mwy20Tu4nH`8PCme&&5urPt)+7^(nZ&<>DKaR?e59Zi|d-UrsbW6RDy< zuUAK3*_G$jM3#ATRLuYJoOGX?%q)0W>8Gyh`nBdubQEi>PhEPh7PbZoOX45Abr97TF$=%;0%`fY1RAl4J>+Q=L zV?In;pZ-x#?d=RVv#8Yy-s>FB^`!~Adp68DWqD`g^E1yx>`zUZ`thH1*>v5>k=Li5 z%=@c%*(y@lX_1R2@qX>ncU@P=t8#+Bs$<%tOucQMVx?7UQnU4UFU*QPqw{u_ ul>E%HxCn>a5uN+n9KMu2`hWjr`5y*@kGo&;Eak-aeD6*L+`^5BFE!}*Mth@9DG#L@<>5!iQXa(NtT0}8b26!arj+&rC`y~WbqB-pg~%T;{vG zCr#D+CvLOm#8Z8%$>)Bzn?LkbdX{b1x4CrD@v40m^DaLYf6RJg^VH3z#lR?H@O1Ta JS?83{1OTb9{iFZ@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/icons_about.png b/app/src/main/res/mipmap-xxhdpi/icons_about.png new file mode 100644 index 0000000000000000000000000000000000000000..0049cd3e49a4c0b5c9ac5376dcdd558c145e0dea GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xZ3?!EyURMI7SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skg1o(uwx)=BWnZyHCpD&g`)%+zve!&d!4-^*H%L}~E*Wd4Yp`Sr}e+UBu zQ<|rXV~EG`yJ5EZ!j1yAMUG`Y6KaAM@Pst{n9%sA!6J}Lz@@Bx#hg=HSzQ)6E?ThY zfS%J-rLa{cOFSlqn0453Cn9DV!m#C~5DF}sokwf)XFRxdrX*vcTso_XqP*Z(~G{%|yH?>2mO zW8Z=H6Z%n4ktOVsu7tw9to;7wlV-dD`_{ z%RfwdA+gIL`-gA2MNwl#J-@x?tJcFR0>%>GI zu1`>(c=6J?^!e)<=lA@Ixa6cMRrRL3=mcBk?nwgT9;+VwchnW{VETSW$;82>QN@@y z$>_U^vDyonl`EVUZFHEEAlA#8v~tEGV~0KV`cI5dGcPR#``qZ|Ic1t17F!gY z+{K@BSy@>8;9WI;!QDR$SEalTf4*h1v%38KEj^_d(M1dQtG)mCe((RI2LD1WW_MpL zJX6D`U?X)_=YWEro1wWukF9O8X|l$h3r^SHJioemX>D2LWhdT-?f**o7A#I)#%Q-V zRBpkF#%+^YB3QW4KkmPhR!k zJNZp3Ip3*f%r;flT6yx;mNi>E6;!jrk3{iVKkz#D!1Eo8nY!+x{RRBfk4*X?_s{7& z>yLniQgS-%55ii57()O2n#OgLVNsA|&1vbq9ij?zP6sYX`FrLpC->B*vQOV*0-mM{ zY@hs0)Sz|akz!S!$sD2&etchGa(}Ms4L4y`J&%MZ`aDrgfj){GW^7xhBjmDUcX#z+ zRb9(w+rmZ5lDh=q`n(IK0oDIDWz9@JTI)p2}#`p181YTa0pTpHKYy zW6M{cl%%%M=`;BPHFs+oJ~4bM7h)kaC#`h8!act!JD&Ic75QoXk(VuFp{bVc99>Yl N@pScbS?83{1OS&|2bcf= literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/icons_bell.png b/app/src/main/res/mipmap-xxhdpi/icons_bell.png new file mode 100644 index 0000000000000000000000000000000000000000..80aaf285469e3ce1f5ef45ecccdf388b4a7e299d GIT binary patch literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xZ3?!EyURMI7SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm`2Ka=yx)=BWnM8uM+v1i3mGYGY`2{mPNS0sn-hRJ8y}p0{g^ZBPix?P~ z*gRbvLp+YZopx5+B~aqnddc386OWvF)+V&5b3%~Ik+zfJQ;znwMw^Lw+|1C)(eO-E z_T9K4a8hrt&dIh`mr03vlRy07J-2s8wcS1I%}GyVeV)(xZN2?_?flqc7UL8~tfPH$#T{ydM*=CY4o^}(Ol zH#G7d_gKLv@lUd!xmjh2^0YN~)+;+M)17jKV~RjP+lDhjZKz-J)mfva zrgC(0Ss1pOS2~L3yWiWf)IaOuE_4u;Qe{`t)0KdgI5!n*IW#c+kW@JittBpKJZtS{Hcz*xxrnF~Ac*3eepDYZ@z2o`4m;1~4 zb?>Y12Ay428Im^Z>(=_>LbJO!_b-*zT*&(S@`sDzY~=xb8MjtGa{T$^&>yiUpMAQH ynoNH^{mL%o>{(`(LFbobAKI8$`uBf(&?8}U`KV7jxBb-tB`Z%?KbLh*2~7aSiYEd9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/icons_dark_mode.png b/app/src/main/res/mipmap-xxhdpi/icons_dark_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..0b77746703cdc89541dc306ba67ad29fcd72d74e GIT binary patch literal 613 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xZ3?!EyURMI7SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slb1^9%xx)=BWnZyA0bUc|n{DK+mYafKnS9&jSet-Y^sfKd(K%)S>wVZk!q3!qb*Vx34iPW4iDEJ=v0SX|fdYS+S^qLRIf}PCtgb)cSfJIh z!}DOIj>q*!374dje*Y1_{Mucw{QI`XCXT&|J9pdc?SEc*@B7+ix?$G)=Jy&t2u*Ji zI`B)r>C%ClZzjvXJ$L-vrO7ti|7!V|6lx_+DrlL>wo7S6k9^`Xg}XKn4o$q~=E>x# zuJKzb@$0%XU(~9feQ$Uzwm4XQ#{QMfrrS+iw=21wUHVl!;gZaxuMZYq-?qlw`o$BD z3!E2HZ>yX-AkL_DNOtEDj$K*8uMhm&QSbeB`C++4LJWXS3aV5Ndq9+)}1Wv*>lhUq$V?C+*&ta9!Y16U$>L z&kAsuE1%_-Uv9eWddj*ji`nHHwiIvHdi7h7FYKXkN?3*B?-rdoG2$&ckzam%2<4vB zBp$`OXF_22=Vig}p;lS(haN}T30PfrdUbTuz2&VTYaaB7KbvLe^fUU1)|*pq{}^}V zY%IgTe~DWM4f^nw32 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/icons_edited_data.png b/app/src/main/res/mipmap-xxhdpi/icons_edited_data.png new file mode 100644 index 0000000000000000000000000000000000000000..77cf523a9f34c22077a04d12327fb332ceac37ec GIT binary patch literal 746 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAifOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%Ah0G|+7_W~avlT>iPJ?Sb?k6=lVUoeAwyuhM*h5Zlg6Z|LWzrT>rZ#{i7 z0|S$(r;B4q#NoH$?u%L#c&6}qUHl#YZS@Ot#wB~UZk}wkOx@>lJHPxdN1ml290$u+ z2s_U2kbf0%f4gQZPjz~tQ$F*BIa4ZI?z<^+nHc5RJES{#uDO~lCbv+o`(g9Sl|OdA zIjXcY=eLVjdQM76Mf<$&X}mil=1kX!x}3i(+n9AnQlF@uT-mD~=?9u@#qL;K)NJsb z@l}830%2dLyt-%KY%;h`3M(%?A{^Rl!r&4h+8;WVtL09VvQ^LPgXU#*LQk``85(Rq zRL)ZgIU4kO9#vHZzhW?@rm?C8BGyZpQbd?kx^=a zI?o^W4R=+aHiaH{(TI}#;_TOw|HyxhI+x+E^N;TuOl;qH>Itja)=sTedsE&zxA-nw zcwDm}kdd#ue{P2H_x;ajuMs@j@Z`z_)v^^{M^_7_Y6fXC@MX`N(epD+d`{J#X5Nq7>VVeH*mUOV>@V+K6xM(K&he)^P*uJYhvwsD(jn9%j}$a*LLzTC!?!IHk*IHyL0A^_LVJZ5xe--GikzvSN#c?H1QQkHv4o^HsEx)iUN0=4GdZa6%LLb3!949feViBPaeZK0d@$wJ&7kYM&CaGw z`N}#qMcnI>(sI?f=ab!yiqRvLWsdsiR^K9~P2re_ZvTQQ*>H~b= z*EnU~WIm9n)oeC}r`^|2RA<4|>7pHso$s1o^VxUT7Oai?5whcARji-NxoKF^hYNS%G}U;vjb? zhIQv;UIIBh0X`wF?gc*oVSsJ^1(0dXB|(0{3?1(+XKI!Jxq6;1jv*GOlM^IZe=yvx zS21AJQR&zD!m6_bNHR|s5bKTTk>|a7F+i60>Oww-Q%_%TKDXC>2Gq&m>FVdQ&MBb@ E0QibFHvj+t literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/menu_icon.png b/app/src/main/res/mipmap-xxhdpi/menu_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6eff62c09aefe242842c746cd6620c3f71c60e7d GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xZ3?!EyURMI7SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smm1^9%xx)=ET#|=(08Y~2=+XDaU28>BSTd!#;_*LJQd@u2j3CU^KO3f{RV4)&zYgp^qW!+!&R-dzA#U0_Rp~ zUN~c2GI39cfA^Np?#iy)#Dh7ePkLv4-+jlE^7!X=hnD_&-n@M|L-w9SOXW5(CMhQ^ z=QUn@@6Sd47pu(p7Kt=ibidNyG)eyT=ZzuD=5YAGV$XP{doiZ{T<+E7zW?qXpX+9Q qC&6pxs?QGHdvC?$DgU_tmGQz1r7L^)d^QAz7K5j&pUXO@geCxhJiJ%{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/naoz.png b/app/src/main/res/mipmap-xxhdpi/naoz.png new file mode 100644 index 0000000000000000000000000000000000000000..1555215d5d92ae60233fb3ff21494e34d464f591 GIT binary patch literal 980 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 QtpET307*qoM6N<$f>Oy)D*ylh literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/sao.png b/app/src/main/res/mipmap-xxhdpi/sao.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f4c77742323c87caa592620acf011422112a9a GIT binary patch literal 597 zcmV-b0;>IqP)Px#Fi=cXMMrQ<5DXF!5D*Xy6Aug$5DO9w3=I$s5D*Ly z4hs$t3la|u5D*Iz5DXF!3=$Cx6G!R9i~s-t4|GyaQvkmZ?|ad;>ygCDt z!q*MV=aMpK%s>TU5ooi0D@r*b(~jZ9LxM%myr_l>WcyHcYkY`Epc1ieVq0|cjr4u0 z!V+6`0L4iCV**)V#r5Ly;eutN=sG6e)u}r|p>~1}+^I=^;M_60fi*SB2V~rwl(?@- z;o7k}@ywAPvFupwD08GNW*w`SJk*0rjNfL(+28t1hlu?s5>7525txx(3^g*_7g6>iRb9{5=-ClnExy=*& zz}R*N#>{U%50e|4aX!kpG-fPk|=6>->oLAxs3%`{Zwl1xoVfGQu9L8Q(a5_UNv9M j?I_Z_E2;TFYDm9huctVri37>%YlM zC11VG_Klb26>FvJvE6dK^B0HM)-$@DdL=9}w>$g_$FAPb57v9{<}@u?uCwTjVAPRg z8v54UU9}F&PcvJty8P6gOa1dKxg;S-r`(gEE;(d>f zS;{JlaD=>Z(A5Z*Q+{IICf;*s!PUA9izP4IMAepvc&uz+a%0A?k88wRIxmSWN{PGM zJdf37siMoug(`pZrHG1jj=WTCb=O_p`l zn-|g>rFkAcI3~86tNV!MrM0@74Tk898NBeElZzj7L zlH#^qo;q20_sQcY3vL+JEI7OS8e3NE{s${k9Y0=g^m0>_nPPvT@6>~D1*Wt9RY2(-HEc>dW-rx4G>uJ8pb-h`K76n{y_(`p#=# zGxs8?n{NKEAN+g1ZvWR?-$JWREVhd2l$NSSKAIL)?fLr4sgrxBuvOgol&6`ceBIV{2Wl)!AFC9=w&Gzm4hc+#`C58IP{rS-NY>?=&l$l}ld+ zt`kwQa}?6{&wABkf9u~FkDd$DK3-VBG_ymv>iA^!=jr8g>75@fc4lNuj8d-4O8CE1 z^if1s+|vm+bUr_swN*ceDQfe#xxMz67!$8K-PtQ{zelI;#oiyC#T(ze%RSiNS%G}U;vjb? zhIQv;UIIC~0X`wF?gc*oi3Vrm?lJ*2@|6Vn1v4}VoWHLSwd8%leuoJL!XE`}7#Nt? zJzX3_JdR(Ty5CDVP~=#@v(WWk!R046`AP_^ad8n?t0H!~?6An8sMgSs4T7RB+=AL~ zo6N+-4ytpA-Of?gTXW;B@r<(>$KHIhZGL`kZ{fS1;^Tf_M0Rq1Ka+p%=ehX;d;PWb z)}`DNk4dn8eD4;!fXr-JH-$B+Y-f~ip>2i_N5>Hih^k_;}Y4{p_ledKTmY3xtokZRC4p0!oh*x|&A zzg2t-{%|uabTK((l03_3(A^j>|GFn?u9rMmWv3x6k0S zEO~SJ>egkiT)1}#OuTojOVu}Q;YlfxuNSqyz1tmh-#ad#_r?p|)4v_wPI0UYkIBwH zyYJ@B-+M%QCH#1w)^GWwL9A)SiAM@rfWr<){~Bhu8;71U15J{ z^DGgsn{(WM#`Y%Y9!t_V{eR2+K%V@2a*Q4u=ZYSFqj(#bSQtEA{an^LB{Ts59@jvY literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/collect.png b/app/src/main/res/mipmap-xxxhdpi/collect.png new file mode 100644 index 0000000000000000000000000000000000000000..5be481e3675eb56f31ef7702174001b2a8afaf2d GIT binary patch literal 952 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(TCXrz6wz%a$rFP3}g4mxo=E^_oKRbh12 zvNS2v(wq`;a$&+uw~#Fyj2kx!tZ7Yncg}aw$G^Pi-n=`rZ|Cgo)*F4}gv*}Qet)+2 zdu_hjw5_?(H{UQ`pI><9ukrWB$kQ?(*_fowzrJreVdH$DiQ$jgnFFE>^+z~1Oy1dd zR#fZF`3-^#_!m5EX$MWR0Cl$%X-V#v)?YJE_^ zHrHY0EY*wcU71r{Sht>5>Euy!sS+}en}7W7qZgkZSbI&IpT^HFldJhWx$OI){&N=J zl09FEE@cwDxPRNkBX-P}+OA5um$|TtJeKv@!4qY-L|pQK;hsXHxO|IQ487<5Z=H*( zFno~Z#Bx<*{@-=$?;mduuBkVTJNfzib5Gt=pXbk+JpX3Nw2zUdiu?1V3eq?pO#c(X z_QIbzhWUrK{X8ijg=>dRWzHE(>^S?MUFQLpz_g>Ae=a>3ka8q;y8K-)>95Zod3{<} zx)1l(8QoLux?UD~Z?oHhy($Mn15O^8I#oo8qoF!GTx8$-{bz4~S{Qh|DzlX5 zL`0C@{>8??CKI1Z*qyz6naih4U%q%rRiWO5o+QzcXjoTH_@%@yy z0>^_)RaGaK;B*^J2MMQ?Ylj7s1NY=ldDQ-BQ^e1k-Ob8{jI%`^UoUyxW9}`I5WC&4 zuj6h@&x{hctqrb8i)UYYY_#x=Y=zR+(39SCJ#Iwo&EEA@<||Lp#~Qb5r!5wHT}z9$B?RkAdL&_mj~6T?`6_> zD4lDSM*@;N<)t zuL@KbdDyOubpEUTZS#fw_k@-7qVrdaM1Mc({&8={6_>KpN)`Hl{MkK^c1WF+e3Bno zeWYipoRa0$_$T~zy}M>QwR^wip8O@YEJ5m2|A#{dH7%-=e#gJn&HT@xab{cP#%AGJ Pp#0_O>gTe~DWM4f%MF+7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/feedback_icon.png b/app/src/main/res/mipmap-xxxhdpi/feedback_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bb4212b9a1c1f581a2560bb3aee07479ede42a29 GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy#B(j9#r85lP9bN@+X1@ak-gWR1M z)}51i3FH_D_=LE+7x(~~B!SzGdRjmY0wqCy!3_24{re>z#Lu^1fBwCH{seWKEu{<$ zOx>O?jv*QM-bUV>bVq?_%MRAIkN@l6-s*ntA;v9vG}QCdUz5;zLCqPl2EOKbcYbIu z5UGlHXctX$j;Uu5nICwwaI;wL#e+L47aFPym!7QX<4QjN&VNTk%;$T$$p!PCN^kCQ z{%*VUj*{c1=WngIzj9;#A-W^+H{F7l|&Jz546+GfMEByKuMZrC#Gb=TZlYf6n(iO}wriFKk<}NknCXR1YkV%eMWi8?>2!EfaMG@1c{Rm@U+!wkF`YjWB-$f%l+jZ` zpM7pkneZQZmYG?6lXqlGa&4*aR4}u4fAW;W&n!1g`Rp2##Vj+UIV|3mcFW%AoE11Z zI`-&IS(hxP46O$nUhMwtmD8UQXD&T0={)=Er+Z&My}NbNdG=}Z64%WuSU3OToE>Ww zP9MD7I7#+GvC*l}FAC~^mG*HjeBS?e^^;YLf;XpCy3W>|sZl9WVHEQJfXHhP;V7Gw zLr(KH{@BJL7WKSar|+W97q$=InKyAoil6a%`iWz`cd4`c&wn=;nSFlEshSi1UNU@N zR~0kA)sgxB2Inq0?r__A){1w(yv*(Ut6v_Eb5F=wFV<-=Jx@)1t(=bYk^MR=zP4N{ zsE!JKusQYV!T#`#i^>F(zA=0iybyZj`T^gl6*me$Uv#y8n|iszI%bvmq;qAv*tA>@ htnRtLqwuj;4deaQ#s4R7N{R=iaZgu2mvv4FO#o9BSw{c> literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/fengm.png b/app/src/main/res/mipmap-xxxhdpi/fengm.png new file mode 100644 index 0000000000000000000000000000000000000000..028e23bf2ecd4c1d0ebb84880f0ce5fc9c40ae89 GIT binary patch literal 688 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc*oi3Vrm?lJ*2@|6Vn1v4}VoWHLSwd8%leuoJL!XE`}7#Nt? zJzX3_JdR(Ty5CDVP~=#@v(WWk!R046`AP_^ad8n?t0H!~?6An8sMgSs4T7RB+=AL~ zo6N+-4ytpA-Of?gTXW;B@r<(>$KHIhZGL`kZ{fS1;^Tf_M0Rq1Ka+p%=ehX;d;PWb z)}`DNk4dn8eD4;!fXr-JH-$B+Y-f~ip>2i_N5>Hih^k_;}Y4{p_ledKTmY3xtokZRC4p0!oh*x|&A zzg2t-{%|uabTK((l03_3(A^j>|GFn?u9rMmWv3x6k0S zEO~SJ>egkiT)1}#OuTojOVu}Q;YlfxuNSqyz1tmh-#ad#_r?p|)4v_wPI0UYkIBwH zyYJ@B-+M%QCH#1w)^GWwL9A)SiAM@rfWr<){~Bhu8;71U15J{ z^DGgsn{(WM#`Y%Y9!t_V{eR2+K%V@2a*Q4u=ZYSFqj(#bSQtEA{an^LB{Ts59@jvY literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/icons_about.png b/app/src/main/res/mipmap-xxxhdpi/icons_about.png new file mode 100644 index 0000000000000000000000000000000000000000..fe99270bc168e098fcde4a54032910e3a7099e9e GIT binary patch literal 1009 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA=0X`wF?gc(TCh9EM#C{ zcJXv^42d}WHvD|HaG=1wl;EUUOGFeGa4d^mQQ@7vM*V2T#(x@H1gkVS8ZR|3*kt=9 z$R>sVo=XSo#d$ps0ynU4bhi!pxMXR&+@2riCMFlNZkOJBXEw9)^S!)B3zwhEeSUU( z{=GAMD(_1i+bA>lPQ|ZJh1ZXDZjCv}nmJ{<*WDTWzpbgwoYUFj6B46z*8JhO>AB&P zuB|lqT^O#Y*l}{(#XBeF7GLa0d2s&2;_gSrzm>#g_O9#nzZYHiVc+6iwU>f(t-TJg z<`+)WnqPV9v)1o51uM2{tUkUcAXkGSIw^JTYuh8vXW2Geg^NaWe4V#TVAY0_{#K8W z3r%Wwl(u}@pR{1ldhZMD5r0%(-fLX9j`_>sNAatS4la)WHLEdr%L;$VZ7+r0qn5Gn z(URBpG!s$$>B|t{_S@y-snYB(#j|A?x5-S|8#kfpMN5rwL+0i8JGLk@cf7Bh#agBI zc<~gmj#KhqA}97IeA(&yQd(Q6pe0l@Jpbick48`RcbO-gLJn`**l$>trdRoV z@s2|RdQ4o)+l z_wzGP__Xd5dmE$Cjz^;5Qy5Q(hMF+4%{X+|N9Y(K~NM6sl&XFQzp6q`4U2w;~x612hf2qA0$W#`nz%TH?>YNvo;c3N^XO*+u zzFf*Li&(w5GR@bErK{a&Rc)HKO{r1v0{?UVH|%=Sj9*O%G*IeHx|km3qBiHBiOjjz zSyt5_8DzeAJ!Gp^?d^WMh+hizR$Key;HS+T6f@{6Do&a-^_a!Tde!s@|sq?^xLXs`!;O~(vdt~l=6vR Xd09~BVzYA@pp5D1>gTe~DWM4fs$RY8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/icons_account_and_security.png b/app/src/main/res/mipmap-xxxhdpi/icons_account_and_security.png new file mode 100644 index 0000000000000000000000000000000000000000..0f78135c6a3d752a160d7074d93ead9061e7325f GIT binary patch literal 766 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA=0X`wF?gc(TCh1UZ=*A`N-BEv_>jSdNJV~*_BK>q&A?+Ydvm_(u_>NkJMU@l?TA@*{)pei9~a#iZ;4*AJHfXx zasNd<&JRY@qe`FMGU4oCwu$^&*&r?yz$~%-l{3S7E%lp8)=VE9nfi8kvxUB#^3dt^ z<2e`DOBlsZrktvo-x((m#((Guxfgg=eqyb z(!|$o>olw$U0${RZlT@!uGWVqr|sItGFSX^{sF!Zw{#!Hh#D|nb7*Ij%VbDDxbk&b zC@;r<(F5Ju49~;F+LOZzKPmUn5ep6O>O?`FJ*rlV(bI2s|aXZ zHer^S7~1)4d#7d7BCm_jSDQ#)mo2Kw_j+=dAvQqi#fCj8wvTnSZ>dWBb%_cqb8Y$P z-V$E6dBgo1+`qT&*|0lb_KdE9<j=vFN$qdrHIVmH4QN4Kj`sHhVAH95-_CNez a{RwfC;(KTHW``SqQmLn_pUXO@geCyNd_ge) literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/icons_bell.png b/app/src/main/res/mipmap-xxxhdpi/icons_bell.png new file mode 100644 index 0000000000000000000000000000000000000000..9196797628d3e4ed731c7c68b760d24a9a95bf1c GIT binary patch literal 877 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(TCXrz6wz%a$rFB{Cc)!+L>WP8fq zPdK2=*d(>;-ol2bEmw*grrPqAduz5vTy=18miL(WlV!u>ISy~cT_O_L9$N}-Tf~3$ zrUJk1@#XWxbrU4MHZc8IlrI!;Pax7kLSsRv`(e8;6P{l={5scdL1otpryvK#I}?v{ zO>y<+$#Gc7Fh}aiy}i|4dSc(--SwU$^$N)8&{JzYFI*L|<~ds%^S+1!9~7kJ;x{t{ z%P!L};1zpt;lSs2ceB?NHfztAaer@ho93(U@8&Y{@y0|r3rJk!F36YxG>X|L(C&^P zqlq_T@Dxt(Cl`DV+pc-Y$g_L9g~^kLmp-txvn6!MADH!Q{sTQmvjkm_xW^X?__9|W zoOdYUqz+@YR9&mJyZ-^DeSG1+j-{HP`*ODDaQW{7)o{x-E2U*@Ba-<-bhI9Le2sW5 zsvn~&u)-z$pvXQRk-An>6AQB%7cgEuR zi_|=r&I)W)3rYn>bUM)5jx=U>A;tiTa&sMbq1eNj^J1NF5`Wgmq|?W zc1x4vhK)j#45HEstK1n@EZluXa(|Vu&;HKa55xBD5XgS8RQ}ky7}4q%jh`3&mRnqU zA}e0geY%HG)@!b1OLsIhMz4D?;q8TvSxu99A3t+=bcNa5)Yn7!!9|uuCL5fM!{y&C zlSsRHn;}nD=#7oStk(W08;-4)1GOtSD!fuOe48=@QWUIabi7ScoO;zE!L#Oy<>Hdo l4#w-v{nz@wJ!}_cV9>M6kd^%$xe=5pJYD@<);T3K0RW>1Z1(^F literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/icons_dark_mode.png b/app/src/main/res/mipmap-xxxhdpi/icons_dark_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..bd67d43bf75c4951a5dd47cb49bf3b07dbdc29c7 GIT binary patch literal 794 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA=0X`wF?gc(TChIR{Q1bFn(TIY3+3SI75A{esrL zYG!3($08(uGO9)0da2m-=y)+d-;LdO=k7KZ$(qx(_x5)A&uRD02y*UH>E#|ztxdV`j8TC2ieyM=u+;W+Z-b8`{DfxlFd zgVVdm1|rcVj(i65?N2j!zd72Kl&+Z&QW{paeM?hmtGQXc)SIm5E3ce&oLuUBw8gZ( zP}Fp`Zp8V`Ce72WbhP;^5^Ln`r25@o zx6^yJ0i%E3%wx~in7Vli`=-k!OBb(w$Z@A=_EFyXXP&jaS7~5Pm?$sLC~D+8H!smo zJGfCWmEpFk^O^0*U*_^Y?9twGs-9!dl1xusuAiQrZzcw~A37vtwwrBRi?dh9i_0Iw ziqEZe$hpv^rrUpMp6;Vd*ZOD394I@K{yB4A?<$jqyL|fh*==^nue?1?%2x7G)|Mk11I}?7-t*E&$ z`_6AYjmAD6`~5Km`bC~{22Ymus70riA6|NNQ4H#9YxR+Qf39!2F>&i^{c}qW_+E)@Xh$)?vG$dG1w2@ENftu{9cz(q}g;WNnz0 zY+Gq1y^eR|`CTlJlMhFP?3UyGcJ4Z}#Ie(j{kmHd?U}!cI3&Djt2q*CXvjIEc2y-? zgW~&LCU5@VyL&stIPjIkyfvSWoXMJX(s;oP&Ghc9h7&67OV&wQKX(q;mEODMrOByN zGt%o;)+fdHZJVF4-Op$r$Ac5$jMRu^Ka8kbtBgp)oDs?Oc!eWnH5zS zeu*?J?Qtz)HJ&<;S>fdI3Bo7KxM$lj=N3)=XXh|;{YD;z75qE8W7#8;0tD@MhB4S~ ztO!5tR?1+wu+4n?tuO}fVuPkxe-a)~+Gd*TD0|@6V&B~N%dc;J%fNCyCp>hH7lRXP zsb>KHfj(}(7?uU8CLfI1@?JMSUfIOFAZ7aOM1ydCJ7;&^*>yHOh7r%;T-!xt~(Z;6FdZ6Zg?@rbKV^$Eu#ayGC0;Ucx^ai#jZ*YO-G z|GpbNdHs6M)*2q)cjt3$@0={0?R|Kw#=(n01-C@9*H7W9R!h5fbN%!!*A74Eo7NN` zpIujPXnod2_silHku`Dq|6OEQ_dp+TB$?fbQVr2ZZKbV9k` d=F^GDpRBq8?X0VVr*(s}kf*Dk%Q~loCIEuoiA4Ya literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/log_out_icon.png b/app/src/main/res/mipmap-xxxhdpi/log_out_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdb56feaa3623b8e1efb893dc3009d7e077a885 GIT binary patch literal 812 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(TCXrz6wz%a$rF37pUK#Z{NS(-|lU=5d#BL zv!{z=NW|f{;pe@j0|oBoUNT)7;&d>HUu`SIDRxcGNd z*3@|{x99j^D*8b2K#bM_fdiTHALcXsEI7;7b7b@ATwD)08RirmNRE-2 z{`GGvufXYWp4qym+ZB#HEq}%Oc-!S;7t$O*J}6hY5EZt^AUxlz@Wf-c)7Rt=Jl!R; zW9Du5(x;Y@str7Ob0Zt14zx~_N|3ZxD5}!)9S^9SyB&AlodCOK1&(PedQ_F7gW4c93MC+}fMHBtbEzSB~ zxXbf<$xW$<+IIU5F^XGu>k6(;$htJy@$>&#mtzVUi);dJOc#q`xc9??D^&J_}a_oeU7Ht?AzAxh}<>bIdP9m@cT3SLi)FU+@P_;^r5BN`lbLy zUG|k_$$wb3aAY!af9~J-*-6)5taWx7_wh;p(x0xFW5oL_?b9z!(NK+fA`;DyJe2w4 zK3vrdV88xN^uweG(KSs~j_r0m$HMZTx^LZEvVb*X*Ir)l_G*9I_m5wkb9?@K@4RoS z0!yA&95i0I;Qbr>nORn~TVCm2jlbjj$G39Z#o+i`|5nQ{xS0R?#pyq*Z(jd9|Hp3S ZdWPfb#;2vWZ+`(w)1Iz=F6*2UngAnxTY3Nh literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/menu_ico.png b/app/src/main/res/mipmap-xxxhdpi/menu_ico.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3b25a2d6b1ef6c449f1f610ecaf924e93b81b9 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc*ok$~_6Ln)BHk|4iehV2UPuWb%>0rJB=T^vIq4!^x}kh8%+ zz~y3UbO)C%l7}XY~E)o?R;6EZf_`XjOPG*rFWtm=ea5Cgk-E{s9w1LJho|L wz?;99UVHDhS;XGYpD_J~YC~)ikbF=tms4_IQ6eg47SIX?Pgg&ebxsLQ0DFv25dZ)H literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/menu_icon.png b/app/src/main/res/mipmap-xxxhdpi/menu_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a1670ef86e129261d1cc6a853a41ec6ab559ecf9 GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wF?gc*ou>o1{(0xEP>?J{d!3^&VWVe@j?BEaj?aro`@ zy?KWfMBLWyco}CdnEjdU+@*DI11f!&dPV-`TG3bWcglY5AIClzhMYPeJ3*#iz1^Ed zDfarSzSaL{9M^iV;7Y*c`y5N3c+XwnwU9NGOL;{=gk$R=&V*L+16)E4T?!1M6B&Yz zFnJ`h1o1NkMI2nv&b*{R(>70_mH*{NXA!$(1_wt$W(F>=hy^P+7`a76-K*X+{N_Es z`hbgZK||=7)ebWn*n6DTF*QYfX$XC??1|Nq8DVF3E^F6g-IBETW!g_J^P=3k~ckG_C~ksU0kB~-2e0DZR!fQ?c}!Ir@5kzv*JL*_YI1ylcryE znkV=`=<62OhTuJ1@lXHM6|R}`>GbEl|IeA}*}wj$yZzVuT})COQ{-8mzv2akIfJLG KpUXO@geCy<>&>Px#Fi=cXMSMi;M{rDhMeTe=?R-V;d`0biMeTq{?|en= zd`0YjM(lh>?tDe=eMaqmMeTe=?G3Q7bN~PV4|GyaQz-!IM}3*y8?RqB%fD_g6%XjW z000C}Nklv> zhadY7{DnaCr}KQziGmVGPUZRKV=Dkx@*KZPhQywf5HA+ufDRe}gcvd^CH^f2Xe+4^ z{0D9?rNzN$;3_v?Uotshq#zRowB;?JlH6cPyc`9H1zwD^eK*AtpK<0l>BQby{4o~+ zpaw4)e2Js*YY{a#iDF&R(Lw{8a3f57byD5kB-V>9h5+2rVH&}nlB#Jbc7sp|0TX%w z*pygehm_Xg5=TM+oKdF&*aQN-TFi02(+8Si#9cjNE$&E5Y>KYZ0pQq|&4@-c2qQLd zzTgAx&IkrdlpVh61FdlM764~|)<_BKm=v&$^Cb%aHD9?4`oMM0=dBT7c{eN(jxgf_ zZL_}uhFk#ec_|)%Ed}>%K$!MoEKp~eI5VbQi3RF~X%#G>=oniFSY0|`}GgPw5!@>YAa1j1pE1(U8&IZ)tKm?FD1U(B#l@-teEorA&7{Cox(`e$to)~#&S-O5_7$}jqqTBXKph&&b+?c4l!g8Aa zpOXNvZ?Wq`qz+R&5Z(>P_?>`e?Y|HDt&`Np`ks7!HCP(~9gaKGH*3cb?bsCpT3owR z=DFy#HNm_Dw1+$EdE_Jk0j*Ai(B>ITdX01u0IYYNO&*eov~DC|B4EsWtBcs`?=v3{ zOmW|#R$d_?lh=h9Af)t|%7wkZ1tcEnT)5oN+;~aHy3vi)DLZ}cnzZksYTtC-xb5&M z@?z~E_r*=u2-t+Slqd#o)%Cyxa1pmDLrbr_VA;}Eyj8HpE)4{|Xx?K6$kT|j@rS!P zbx~la!AbIm{mKPV-x=c%=yAvOWYc_CzjB~YdEslqJ-3**$*j8{wd8_z!vWwLb0`x;-m&zya2w2hZ|}(u-U2jWWKW-vg#UC zHRIh}&MOS?kiI*>fD_)E=-J?g|051C?AUiV_Y6L3iar*qyeW8B?Ijvh=9$8*+Wwa8 z$7nHFvN8m!bj|~?psCUxL~NZKHqm&@lvf52MO<(v&GsFoM-ZC4)liOn4ww%N?Tam| z643&jC(sVRVJPBBGithPg~$f~S@u=0PnMs2s2Zx7=$B%TobID)cq|(-ac|L)(|LaB mjP>-qh7BhQ|DX8(0PqtPoZ?O|G`O4q00002vFDn literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/paip_coin_img.png b/app/src/main/res/mipmap-xxxhdpi/paip_coin_img.png new file mode 100644 index 0000000000000000000000000000000000000000..d85c0460f7dd374efc78ad2d080337d6392e6615 GIT binary patch literal 4211 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 JPDHLkV1lGvkm~>d literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/qr_code_icon.png b/app/src/main/res/mipmap-xxxhdpi/qr_code_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e390d33449f2336f6c5146873db0b0d330ef4232 GIT binary patch literal 1014 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「適用」を選択してこのテーマを使用 「キャンセル」をタップして他のテーマをプレビュー + + MBTIタイプ + 星座 + 保存 + MBTIを選択 + 星座を選択 + + + さっと動かす + データの編集 + パイパイについて + フォローアップシステム + メッセージ通知 + ログアウト diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index addcf44..460c656 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -75,7 +75,7 @@ 下载 原始图片 收藏 - 暗黑模式 + 暗色模式 明亮模式 发现新版本 立即更新 @@ -257,4 +257,12 @@ 保存 选择 MBTI 选择星座 + + + 扫一扫 + 编辑资料 + 关于派派 + 跟随系统 + 消息通知 + 退出登录 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index de4cc53..f076573 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -254,4 +254,12 @@ Choose MBTI Choose Zodiac + + Scan QR + Edit Profile + About Paipai + Follow System + Message Notification + Logout + \ No newline at end of file From e714f567b94ef5100e142ec5ba3a79b2e3ae61f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E5=B8=86?= <3031465419@qq.com> Date: Thu, 6 Nov 2025 21:34:08 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=88=91=E7=9A=84-=E7=BC=96=E8=BE=91-ui?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/aiosman/ravenow/ui/account/edit2.kt | 665 +++++++++++++----- 1 file changed, 474 insertions(+), 191 deletions(-) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/account/edit2.kt b/app/src/main/java/com/aiosman/ravenow/ui/account/edit2.kt index 1e28a55..c6d2179 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/account/edit2.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/account/edit2.kt @@ -4,19 +4,26 @@ import android.content.Context import android.content.Intent import android.net.Uri import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.ArrowForward import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Edit as EditIcon import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -28,10 +35,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.lifecycle.viewModelScope import com.aiosman.ravenow.AppState import com.aiosman.ravenow.AppStore @@ -39,26 +50,26 @@ 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.comment.NoticeScreenHeader import com.aiosman.ravenow.ui.composables.CustomAsyncImage import com.aiosman.ravenow.ui.composables.StatusBarMaskLayout -import com.aiosman.ravenow.ui.composables.StatusBarSpacer -import com.aiosman.ravenow.ui.composables.form.FormTextInput import com.aiosman.ravenow.ui.composables.debouncedClickable import com.aiosman.ravenow.ui.composables.rememberDebouncedNavigation +import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.aiosman.ravenow.ui.modifiers.noRippleClickable import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import android.util.Log import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.text.BasicTextField import androidx.compose.material3.Text import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.sp +import androidx.compose.ui.graphics.SolidColor import com.aiosman.ravenow.ConstVars import com.aiosman.ravenow.ui.composables.pickupAndCompressLauncher import java.io.File @@ -134,192 +145,28 @@ fun AccountEditScreen2(onUpdateBanner: ((Uri, File, Context) -> Unit)? = null,) // 确保显示的是当前登录用户的信息,而不是之前用户的缓存数据 model.reloadProfile() } + + // 设置状态栏为透明,使用浅色图标(因为顶部背景是深色图片) + val systemUiController = rememberSystemUiController() + LaunchedEffect(Unit) { + systemUiController.setStatusBarColor(Color.Transparent, darkIcons = false) + } + StatusBarMaskLayout( - modifier = Modifier.background(color = appColors.background).padding(horizontal = 16.dp), - darkIcons = !AppState.darkMode, - maskBoxBackgroundColor = appColors.background + modifier = Modifier.background(Color(0xFFFAF9FB)), + darkIcons = false, // 浅色图标(白色),因为顶部背景是深色 + maskBoxBackgroundColor = Color.Transparent ) { - Column( + Box( modifier = Modifier .fillMaxSize() - .background(color = appColors.background), - horizontalAlignment = Alignment.CenterHorizontally + .background(Color(0xFFFAF9FB)) ) { - //StatusBarSpacer() - Box( - modifier = Modifier.padding(horizontal = 0.dp, vertical = 16.dp) - ) { - NoticeScreenHeader( - title = stringResource(R.string.edit_profile), - moreIcon = false - ) { - - Icon( - modifier = Modifier - .size(24.dp) - .debouncedClickable( - enabled = validate() && !model.isUpdating, - debounceTime = 1000L - ) { - if (validate() && !model.isUpdating) { - model.viewModelScope.launch { - model.isUpdating = true - model.updateUserProfile(context) - model.viewModelScope.launch(Dispatchers.Main) { - debouncedNavigation { - navController.navigateUp() - } - model.isUpdating = false - } - } - } - }, - imageVector = Icons.Default.Check, - contentDescription = "保存", - tint = if (validate() && !model.isUpdating) appColors.text else appColors.nonActiveText - ) - } - } - - - // 添加横幅图片区域 - val banner = model.profile?.banner - - Box( - modifier = Modifier - .fillMaxWidth() - .height(300.dp) - .clip(RoundedCornerShape(12.dp)) - ) { - if (banner != null) { - CustomAsyncImage( - context = LocalContext.current, - imageUrl = banner, - modifier = Modifier.fillMaxSize(), - contentDescription = "Banner", - contentScale = ContentScale.Crop - ) - } else { - Box( - modifier = Modifier - .fillMaxSize() - .background(Color.Gray.copy(alpha = 0.1f)) - ) - } - Box( - modifier = Modifier - .width(120.dp) - .height(42.dp) - .align(Alignment.BottomEnd) - .padding(end = 12.dp, bottom = 12.dp) - .background( - color = Color.Black.copy(alpha = 0.4f), - shape = RoundedCornerShape(9.dp) - ) - .noRippleClickable { - Intent(Intent.ACTION_PICK).apply { - type = "image/*" - pickBannerImageLauncher.launch(this) - } - } - ){ - Text( - text = "change", - fontSize = 14.sp, - fontWeight = FontWeight.W600, - color = Color.White, - modifier = Modifier.align(Alignment.Center) - ) - } - } - - Spacer(modifier = Modifier.height(20.dp)) - - // 显示内容或加载状态 - Log.d("AccountEditScreen2", "UI状态 - profile: ${model.profile?.nickName}, isLoading: ${model.isLoading}") when { - model.profile != null -> { - Log.d("AccountEditScreen2", "显示用户资料内容") - // 有数据时显示内容 - val it = model.profile!! - Box( - modifier = Modifier.size(88.dp), - contentAlignment = Alignment.Center - ) { - CustomAsyncImage( - context, - model.croppedBitmap ?: it.avatar, - modifier = Modifier - .size(88.dp) - .clip( - RoundedCornerShape(88.dp) - ), - contentDescription = "", - contentScale = ContentScale.Crop - ) - Box( - modifier = Modifier - .size(32.dp) - .clip(CircleShape) - .background( - brush = Brush.linearGradient( - colors = listOf( - Color(0xFF7c45ed), - Color(0x997c68ef), - Color(0xFF7bd8f8) - ) - ), - ) - .align(Alignment.BottomEnd) - .debouncedClickable( - debounceTime = 800L - ) { - debouncedNavigation { - navController.navigate(NavigationRoute.ImageCrop.route) - } - }, - contentAlignment = Alignment.Center - ) { - Icon( - Icons.Default.Add, - contentDescription = "Add", - tint = Color.White, - ) - } - } - Spacer(modifier = Modifier.height(18.dp)) - Column( - modifier = Modifier - .weight(1f) - .padding(horizontal = 16.dp) - ) { - FormTextInput( - value = model.name, - label = stringResource(R.string.nickname), - hint = "Input nickname", - modifier = Modifier.fillMaxWidth(), - error = usernameError - ) { value -> - onNicknameChange(value) - } - FormTextInput( - value = model.bio, - label = stringResource(R.string.bio), - hint = "Input bio", - modifier = Modifier.fillMaxWidth(), - error = bioError - ) { value -> - onBioChange(value) - } - } - } model.isLoading -> { - Log.d("AccountEditScreen2", "显示加载指示器") // 加载中状态 Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp), + modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center ) { androidx.compose.material3.CircularProgressIndicator( @@ -327,24 +174,460 @@ fun AccountEditScreen2(onUpdateBanner: ((Uri, File, Context) -> Unit)? = null,) ) } } + model.profile != null -> { + Column( + modifier = Modifier.fillMaxSize() + ) { + // 顶部背景区域(圆角在底部,覆盖状态栏) + val banner = model.profile?.banner + val statusBarPadding = WindowInsets.systemBars.asPaddingValues().calculateTopPadding() + Box( + modifier = Modifier + .fillMaxWidth() + .offset(y = -statusBarPadding) + ) { + Box( + modifier = Modifier + .width(402.dp) + .height(206.dp) + .align(Alignment.TopCenter) + .clip(RoundedCornerShape(bottomStart = 32.dp, bottomEnd = 32.dp)) + ) { + if (banner != null) { + CustomAsyncImage( + context = context, + imageUrl = banner, + modifier = Modifier.fillMaxSize(), + contentDescription = "Banner", + contentScale = ContentScale.Crop + ) + } else { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Gray.copy(alpha = 0.2f)) + ) + } + + // 更换封面按钮(位于壁纸右下方) + Box( + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(end = 16.dp, bottom = 20.dp) + .clip(RoundedCornerShape(12.dp)) + .background(Color(0x5C7D7C80)) // RGB(125, 120, 128, 0.36) + .padding(horizontal = 8.dp, vertical = 4.dp) + .noRippleClickable { + Intent(Intent.ACTION_PICK).apply { + type = "image/*" + pickBannerImageLauncher.launch(this) + } + } + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + // 更换封面图标 + Icon( + painter = painterResource( + id = if (AppState.darkMode) { + // TODO: 添加更换封面暗色模式图标 + R.mipmap.frame_4 // 临时占位,需替换为实际图标 + } else { + // TODO: 添加更换封面亮色模式图标 + R.mipmap.fengm // 临时占位,需替换为实际图标 + } + ), + contentDescription = null, + modifier = Modifier.size(16.dp), + tint = Color.White + ) + Text( + text = "更换封面", + fontSize = 12.sp, + color = Color.White + ) + } + } + + // 状态栏区域(时间、信号、电池) + // 这里使用系统状态栏,不单独实现 + + // 导航栏区域 + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + ) { + Spacer(modifier = Modifier.height(statusBarPadding + 12.dp)) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 12.dp) + ) { + // 返回按钮 + Box( + modifier = Modifier + .size(44.dp) + .clip(CircleShape) + .background(Color.White.copy(alpha = 0.3f)) + .noRippleClickable { + navController.navigateUp() + } + .align(Alignment.CenterStart), + contentAlignment = Alignment.Center + ) { + Image( + painter = painterResource(id = R.drawable.rider_pro_back_icon), + contentDescription = "Back", + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(Color.White) + ) + } + + // 标题 + Text( + text = "编辑资料", + fontSize = 17.sp, + fontWeight = FontWeight.SemiBold, + color = Color.White, + modifier = Modifier.align(Alignment.Center) + ) + } + } + } + } + + // 用户头像区域(距离顶部-50dp,包含状态栏高度,左右居中) + Box( + modifier = Modifier + .fillMaxWidth() + .offset(y = (-50).dp - statusBarPadding), + contentAlignment = Alignment.Center + ) { + val it = model.profile!! + Box( + modifier = Modifier.size(96.dp), + contentAlignment = Alignment.BottomEnd + ) { + // 头像 + CustomAsyncImage( + context, + model.croppedBitmap ?: it.avatar, + modifier = Modifier + .size(96.dp) + .clip(CircleShape) + .border(2.4.dp, Color(0xFFFAF9FB), CircleShape), + contentDescription = "", + contentScale = ContentScale.Crop + ) + + // 编辑头像按钮 + Box( + modifier = Modifier + .size(28.dp) + .clip(CircleShape) + .background(Color(0xFF110C13)) + .border(2.dp, Color.White, CircleShape) + .debouncedClickable(debounceTime = 800L) { + debouncedNavigation { + navController.navigate(NavigationRoute.ImageCrop.route) + } + }, + contentAlignment = Alignment.Center + ) { + Icon( + painter = painterResource( + id = if (AppState.darkMode) { + // TODO: 添加编辑头像暗色模式图标 + R.mipmap.frame_4 // 临时占位,需替换为实际图标 + } else { + // TODO: 添加编辑头像亮色模式图标 + R.mipmap.bi // 临时占位,需替换为实际图标 + } + ), + contentDescription = "Edit Avatar", + modifier = Modifier.size(16.dp), + tint = Color.White + ) + } + } + } + + + Column( + modifier = Modifier + .fillMaxWidth() + .weight(1f) + .padding(horizontal = 16.dp) + .offset(y = (-74).dp)// + ) { + // 昵称输入框 + ProfileInfoCard( + label = "昵称", + value = model.name, + placeholder = "Value", + onValueChange = { onNicknameChange(it) }, + isMultiline = false + ) + + Spacer(modifier = Modifier.height(16.dp)) + + // 个人简介输入框 + ProfileInfoCard( + label = "个人简介", + value = model.bio, + placeholder = "Welcome to my fantiac word i will show you something about magic", + onValueChange = { onBioChange(it) }, + isMultiline = true + ) + + Spacer(modifier = Modifier.height(16.dp)) + + // MBTI 类型和星座 + Column( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(16.dp)) + .background(Color.White) + ) { + // MBTI 类型 + ProfileSelectItem( + label = "MBTI 类型", + value = model.mbti ?: "ENFP", + iconColor = Color(0xFF7C45ED), + iconResDark = null, // TODO: 添加MBTI暗色模式图标 + iconResLight = null, // TODO: 添加MBTI亮色模式图标 + onClick = { + debouncedNavigation { + navController.navigate(NavigationRoute.MbtiSelect.route) + } + } + ) + + // 分隔线 + Box( + modifier = Modifier + .fillMaxWidth() + .height(0.3.dp) + .background(Color(0x41413C43).copy(alpha = 0.2f)) + .padding(horizontal = 16.dp) + ) + + // 星座(使用当前图标) + ProfileSelectItem( + label = "星座", + value = model.zodiac ?: "白羊座", + iconColor = Color(0xFFFFCC00), + iconResDark = R.mipmap.frame_4, // 星座暗色模式图标 + iconResLight = R.mipmap.xingzuo, // 星座亮色模式图标 + onClick = { + debouncedNavigation { + navController.navigate(NavigationRoute.ZodiacSelect.route) + } + } + ) + } + + Spacer(modifier = Modifier.weight(1f)) + + // 保存按钮 + Box( + modifier = Modifier + .fillMaxWidth() + .height(50.dp) + .clip(RoundedCornerShape(1000.dp)) + .background( + brush = Brush.horizontalGradient( + colors = listOf( + Color(0xFF7C45ED), // RGB(124, 69, 237) - 左侧 + Color(0xFF7C57EE), // RGB(124, 87, 238) - 中间 + Color(0xFF7BD8F8) // RGB(123, 216, 248) - 右侧 + ) + ) + ) + .debouncedClickable( + enabled = validate() && !model.isUpdating, + debounceTime = 1000L + ) { + if (validate() && !model.isUpdating) { + model.viewModelScope.launch { + model.isUpdating = true + model.updateUserProfile(context) + model.viewModelScope.launch(Dispatchers.Main) { + debouncedNavigation { + navController.navigateUp() + } + model.isUpdating = false + } + } + } + }, + contentAlignment = Alignment.Center + ) { + Text( + text = "保存", + fontSize = 17.sp, + fontWeight = FontWeight.Normal, + color = Color.White + ) + } + } + } + } else -> { - Log.d("AccountEditScreen2", "显示错误信息 - 没有数据且不在加载中") // 没有数据且不在加载中,显示错误信息 Box( - modifier = Modifier - .fillMaxSize() - .padding(16.dp), + modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center ) { - androidx.compose.material3.Text( + Text( text = "加载用户资料失败,请重试", color = appColors.text ) } } } + } + } +} - }} - +/** + * 信息输入卡片组件 + */ +@Composable +fun ProfileInfoCard( + label: String, + value: String, + placeholder: String, + onValueChange: (String) -> Unit, + isMultiline: Boolean = false +) { + val appColors = LocalAppTheme.current + + Box( + modifier = Modifier + .fillMaxWidth() + .height(if (isMultiline) 66.dp else 56.dp) // 昵称框高度56dp,个人简介66dp + .clip(RoundedCornerShape(16.dp)) + .background(Color.White), + contentAlignment = if (isMultiline) Alignment.TopStart else Alignment.CenterStart + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .padding(vertical = if (isMultiline) 11.dp else 0.dp), + verticalAlignment = if (isMultiline) Alignment.Top else Alignment.CenterVertically + ) { + // 标签 + Text( + text = label, + fontSize = 17.sp, + fontWeight = FontWeight.Normal, + color = Color.Black, + modifier = Modifier.width(100.dp) + ) + + Spacer(modifier = Modifier.width(16.dp)) + + // 输入框 + Box( + modifier = Modifier.weight(1f) + ) { + if (value.isEmpty()) { + Text( + text = placeholder, + fontSize = if (isMultiline) 15.sp else 17.sp, + fontWeight = FontWeight.Normal, + color = Color(0x993C3C43), + modifier = Modifier.fillMaxWidth() + ) + } + + BasicTextField( + value = value, + onValueChange = onValueChange, + modifier = Modifier.fillMaxWidth(), + textStyle = androidx.compose.ui.text.TextStyle( + fontSize = if (isMultiline) 15.sp else 17.sp, + fontWeight = FontWeight.Normal, + color = Color.Black + ), + cursorBrush = SolidColor(Color.Black), + maxLines = if (isMultiline) Int.MAX_VALUE else 1, + singleLine = !isMultiline + ) + } + } + } +} +/** + * 选择项组件(MBTI、星座) + */ +@Composable +fun ProfileSelectItem( + label: String, + value: String, + iconColor: Color, + onClick: () -> Unit, + iconResDark: Int? = null, + iconResLight: Int? = null +) { + Row( + modifier = Modifier + .fillMaxWidth() + .height(56.dp) + .clickable(onClick = onClick) + .padding(horizontal = 16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + // 自定义图标 + Icon( + painter = painterResource( + id = if (AppState.darkMode) { + iconResDark ?: R.mipmap.frame_4 // 使用传入的暗色模式图标,或默认占位 + } else { + iconResLight ?: R.mipmap.naoz // 使用传入的亮色模式图标,或默认占位 + } + ), + contentDescription = null, + modifier = Modifier.size(24.dp), + tint = iconColor + ) + + Text( + text = label, + fontSize = 17.sp, + fontWeight = FontWeight.Normal, + color = Color.Black + ) + } + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + Text( + text = value, + fontSize = 17.sp, + fontWeight = FontWeight.Normal, + color = Color(0x993C3C43) + ) + + Icon( + imageVector = Icons.Default.ArrowForward, + contentDescription = null, + modifier = Modifier.size(8.dp), + tint = Color(0x4D3C3C43) + ) + } + } } \ No newline at end of file From 0bc442762d15c06fd5551ac7d69467787a9d7bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E5=B8=86?= <3031465419@qq.com> Date: Fri, 7 Nov 2025 14:36:25 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=88=91=E7=9A=84-=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E9=A1=B6=E9=83=A8=E5=AF=BC=E8=88=AA=E6=A0=8Fui=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=B8=8B=E6=BB=91=E6=97=B6?= =?UTF-8?q?=E9=A1=B6=E9=83=A8=E5=AF=BC=E8=88=AA=E6=A0=8F=E7=9A=84=E5=8F=98?= =?UTF-8?q?=E5=8C=96=E6=95=88=E6=9E=9C=E4=BB=A5=E5=8F=8A=E5=A3=81=E7=BA=B8?= =?UTF-8?q?=E5=A4=B4=E5=83=8F=E5=A4=A7=E5=B0=8F=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/index/tabs/profile/ProfileV3.kt | 367 +++++++++++++----- 1 file changed, 272 insertions(+), 95 deletions(-) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/ProfileV3.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/ProfileV3.kt index 8ee1612..e7832a1 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/ProfileV3.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/ProfileV3.kt @@ -7,6 +7,7 @@ import android.util.Log import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -100,6 +101,13 @@ import kotlinx.coroutines.launch import java.io.File import androidx.compose.foundation.rememberScrollState import androidx.compose.ui.res.stringResource +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.border +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.graphics.Brush +import java.text.NumberFormat +import java.util.Locale @OptIn(ExperimentalFoundationApi::class, ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) @Composable @@ -134,7 +142,8 @@ fun ProfileV3( val context = LocalContext.current val scope = rememberCoroutineScope() val navController = LocalNavController.current - val bannerHeight = 400 + val bannerWidth = 402 + val bannerHeight = 206 val pickBannerImageLauncher = pickupAndCompressLauncher( context, scope, @@ -156,12 +165,13 @@ fun ProfileV3( val gridState = rememberLazyGridState() val scrollState = rememberScrollState() - val toolbarAlpha by remember { + // 计算导航栏背景透明度,根据滚动位置从0到1 + val toolbarBackgroundAlpha by remember { derivedStateOf { if (!isSelf) { 1f } else { - val maxScroll = 500f // 最大滚动距离,可调整 + val maxScroll = 600f // 增加最大滚动距离,让渐变更平缓 val progress = (scrollState.value.coerceAtMost(maxScroll.toInt()) / maxScroll).coerceIn(0f, 1f) progress } @@ -308,12 +318,19 @@ fun ProfileV3( modifier = Modifier .fillMaxWidth() .height(bannerHeight.dp) - .background(AppColors.profileBackground) + .background(AppColors.profileBackground), + contentAlignment = Alignment.Center ) { Box( modifier = Modifier - .fillMaxWidth() - .height(bannerHeight.dp - 24.dp) + .width(bannerWidth.dp) + .height(bannerHeight.dp) + .clip( + RoundedCornerShape( + bottomStart = 32.dp, + bottomEnd = 32.dp + ) + ) .let { if (isSelf && isMain) { it.noRippleClickable { @@ -326,13 +343,6 @@ fun ProfileV3( it } } - .shadow( - elevation = 6.dp, - shape = RoundedCornerShape( - bottomStart = 32.dp, - bottomEnd = 32.dp - ), - ) ) { CustomAsyncImage( LocalContext.current, @@ -347,6 +357,9 @@ fun ProfileV3( Spacer(modifier = Modifier.height(100.dp)) } + // 壁纸下方间距 + Spacer(modifier = Modifier.height(16.dp)) + // 用户信息 Box( modifier = Modifier @@ -478,6 +491,9 @@ fun ProfileV3( } } } + + // 底部间距,增加滚动距离 + Spacer(modifier = Modifier.height(100.dp)) } // 顶部导航栏 @@ -486,9 +502,13 @@ fun ProfileV3( isSelf = isSelf, profile = profile, navController = navController, - alpha = toolbarAlpha, + backgroundAlpha = toolbarBackgroundAlpha, + interactionCount = moments.sumOf { it.likeCount }, // 计算总点赞数作为互动数据 onMenuClick = { showOtherUserMenu = true + }, + onShareClick = { + // TODO: 实现分享功能 } ) @@ -569,107 +589,264 @@ fun TopNavigationBar( isSelf: Boolean, profile: AccountProfileEntity?, navController: androidx.navigation.NavController, - alpha: Float, - onMenuClick: () -> Unit = {} + backgroundAlpha: Float, + interactionCount: Int = 0, + onMenuClick: () -> Unit = {}, + onShareClick: () -> Unit = {} ) { val appColors = LocalAppTheme.current + val numberFormat = remember { NumberFormat.getNumberInstance(Locale.getDefault()) } + + // 根据背景透明度决定图标颜色:透明度为1时变黑,否则为白色 + val iconColor = if (backgroundAlpha >= 1f) Color.Black else Color.White + val cardBorderColor = if (backgroundAlpha >= 1f) Color.Black else Color.White + Box( modifier = Modifier .fillMaxWidth() - .graphicsLayer { this.alpha = alpha } ) { - Column( + val statusBarPadding = WindowInsets.systemBars.asPaddingValues() + val statusBarHeight = statusBarPadding.calculateTopPadding() + val navigationBarHeight = 56.dp // 增加导航栏高度,包括图标和额外空间 + + // 导航栏背景层,包括状态栏区域,根据滚动位置逐渐变白 + val totalHeight = statusBarHeight + navigationBarHeight + val density = LocalDensity.current + val totalHeightPx = with(density) { totalHeight.toPx() } + + // 根据滚动位置计算基础颜色,从深色平滑过渡到白色,透明度从初始值逐渐减到0 + val baseColor = remember(backgroundAlpha) { + val smoothProgress = backgroundAlpha.coerceIn(0f, 1f) + + // 初始状态:半透明深色,让白色图标清晰可见 + val initialDarkAlpha = 0.12f + + // 使用平滑的插值函数,让整个过渡更自然 + val easedProgress = smoothProgress * smoothProgress * (3f - 2f * smoothProgress) // smoothstep + + // 颜色值:从黑色(0)平滑过渡到白色(1) + val colorValue = easedProgress + + // 透明度:从初始值(0.12f)逐渐减少到0 + // 当smoothProgress从0到1时,alpha从initialDarkAlpha减少到0 + val alpha = initialDarkAlpha * (1f - easedProgress) + + Color( + red = colorValue, + green = colorValue, + blue = colorValue, + alpha = alpha.coerceIn(0f, initialDarkAlpha) + ) + } + + Box( modifier = Modifier .fillMaxWidth() - .background(appColors.profileBackground) + .height(totalHeight) // 状态栏高度 + 导航栏高度 + .align(Alignment.TopCenter) + .background( + brush = Brush.verticalGradient( + colors = listOf( + baseColor, // 顶部保持基础颜色 + baseColor, // 中间保持基础颜色 + baseColor.copy(alpha = baseColor.alpha * 0.5f), // 底部过渡,逐渐变透明 + Color.Transparent // 最底部完全透明 + ), + startY = 0f, + endY = totalHeightPx + ) + ) + ) + + // 功能按钮区域,图标和文字根据背景透明度改变颜色 + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp, bottom = 16.dp, end = 16.dp) // 增加上下内边距 + .align(Alignment.TopEnd) + .padding(top = statusBarHeight), // 从状态栏下方开始 + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically ) { - StatusBarSpacer() + // 左侧:互动数据卡片 Row( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 8.dp) + .height(24.dp) + .background( + color = Color.White.copy(alpha = 0.52f), + shape = RoundedCornerShape(16.dp) + ) + .border( + width = 0.5.dp, + color = cardBorderColor, // 根据背景透明度改变边框颜色 + shape = RoundedCornerShape(16.dp) + ) + .padding(horizontal = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + // 互动图标 + Image( + painter = painterResource(id = R.mipmap.paip_coin_img), + contentDescription = "互动", + modifier = Modifier.size(24.dp), + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = numberFormat.format(interactionCount), + fontSize = 14.sp, + fontWeight = FontWeight.W500, + color = Color.Black, // 文字始终为黑色 + textAlign = TextAlign.Center + ) + } + + Spacer(modifier = Modifier.width(16.dp)) + + // 中间:分享图标 + Image( + painter = painterResource(id = R.mipmap.menu_icon), + contentDescription = "分享", + modifier = Modifier + .size(24.dp) .noRippleClickable { + onShareClick() }, + colorFilter = ColorFilter.tint(iconColor) // 根据背景透明度改变颜色 + ) + + Spacer(modifier = Modifier.width(16.dp)) + + // 右侧:菜单图标 + Image( + painter = painterResource(id = R.mipmap.menu_ico), + contentDescription = "菜单", + modifier = Modifier + .size(24.dp) + .noRippleClickable { + if (isSelf && isMain) { + IndexViewModel.openDrawer = true + } else { + onMenuClick() + } + }, + colorFilter = ColorFilter.tint(iconColor) // 根据背景透明度改变颜色 + ) + } + + // 如果不是主页面,显示返回按钮和用户信息 + if (!isMain) { + val statusBarPadding = WindowInsets.systemBars.asPaddingValues() + Row( + modifier = Modifier + .align(Alignment.TopStart) + .padding(horizontal = 16.dp, vertical = 8.dp) + .padding(top = statusBarPadding.calculateTopPadding()), verticalAlignment = Alignment.CenterVertically ) { - if (!isMain) { - Image( - painter = painterResource(id = R.drawable.rider_pro_back_icon), - contentDescription = "Back", - modifier = Modifier - .noRippleClickable { - navController.navigateUp() - } - .size(24.dp), - colorFilter = ColorFilter.tint(appColors.text) - ) - Spacer(modifier = Modifier.width(8.dp)) - CustomAsyncImage( - LocalContext.current, - profile?.avatar, - modifier = Modifier - .size(32.dp) - .clip(CircleShape), - contentDescription = "", - contentScale = ContentScale.Crop - ) - Spacer(modifier = Modifier.width(16.dp)) - Text( - text = profile?.nickName ?: "", - fontSize = 16.sp, - fontWeight = FontWeight.W600, - color = appColors.text - ) - } - Spacer(modifier = Modifier.weight(1f)) - if (isSelf && isMain) { - Box( - modifier = Modifier - .size(24.dp) - .padding(16.dp) - ) - } else if (!isSelf) { - Box( - modifier = Modifier - .noRippleClickable { - onMenuClick() - } - .padding(16.dp) - ) { - Icon( - painter = painterResource(id = R.drawable.rider_pro_more_horizon), - contentDescription = "菜单", - tint = appColors.text, - modifier = Modifier.size(24.dp) - ) - } - } - } - Spacer(modifier = Modifier.height(8.dp)) - } - if (isSelf && isMain) { - Box( - modifier = Modifier - .align(Alignment.TopEnd) - .padding(top = 32.dp, end = 16.dp) - .noRippleClickable { - IndexViewModel.openDrawer = true - } - ) { - Box( - modifier = Modifier.padding(16.dp) - ) { - Icon( - painter = painterResource(id = R.drawable.rider_pro_more_horizon), - contentDescription = "", - tint = appColors.text - ) - } + Image( + painter = painterResource(id = R.drawable.rider_pro_back_icon), + contentDescription = "Back", + modifier = Modifier + .noRippleClickable { + navController.navigateUp() + } + .size(24.dp), + colorFilter = ColorFilter.tint(Color.White) + ) + Spacer(modifier = Modifier.width(8.dp)) + CustomAsyncImage( + LocalContext.current, + profile?.avatar, + modifier = Modifier + .size(32.dp) + .clip(CircleShape), + contentDescription = "", + contentScale = ContentScale.Crop + ) + Spacer(modifier = Modifier.width(16.dp)) + Text( + text = profile?.nickName ?: "", + fontSize = 16.sp, + fontWeight = FontWeight.W600, + color = Color.White + ) } } } } +// 分享图标(向上箭头) +@Composable +fun ShareIcon( + color: Color, + modifier: Modifier = Modifier +) { + Canvas(modifier = modifier) { + val strokeWidth = 2.dp.toPx() + val centerX = size.width / 2 + val centerY = size.height / 2 + + // 绘制向上的箭头 + // 底部横线 + drawLine( + color = color, + start = Offset(centerX - 9.dp.toPx(), centerY + 6.dp.toPx()), + end = Offset(centerX + 9.dp.toPx(), centerY + 6.dp.toPx()), + strokeWidth = strokeWidth + ) + // 顶部横线 + drawLine( + color = color, + start = Offset(centerX - 5.dp.toPx(), centerY - 6.5.dp.toPx()), + end = Offset(centerX + 5.dp.toPx(), centerY - 6.5.dp.toPx()), + strokeWidth = strokeWidth + ) + // 中间竖线 + drawLine( + color = color, + start = Offset(centerX, centerY - 3.dp.toPx()), + end = Offset(centerX, centerY + 6.dp.toPx()), + strokeWidth = strokeWidth + ) + } +} + +// 菜单图标(三条横线) +@Composable +fun MenuIcon( + color: Color, + modifier: Modifier = Modifier +) { + Canvas(modifier = modifier) { + val strokeWidth = 2.dp.toPx() + val centerX = size.width / 2 + val centerY = size.height / 2 + val lineLength = 16.dp.toPx() + val spacing = 6.dp.toPx() + + // 绘制三条横线 + drawLine( + color = color, + start = Offset(centerX - lineLength / 2, centerY - spacing), + end = Offset(centerX + lineLength / 2, centerY - spacing), + strokeWidth = strokeWidth + ) + drawLine( + color = color, + start = Offset(centerX - lineLength / 2, centerY), + end = Offset(centerX + lineLength / 2, centerY), + strokeWidth = strokeWidth + ) + drawLine( + color = color, + start = Offset(centerX - lineLength / 2, centerY + spacing), + end = Offset(centerX + lineLength / 2, centerY + spacing), + strokeWidth = strokeWidth + ) + } +} + /** * Agent菜单弹窗 */ From 75eb38b188f9e07973485e51fd44c1a37b41448e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E5=B8=86?= <3031465419@qq.com> Date: Fri, 7 Nov 2025 21:19:17 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=88=91=E7=9A=84=E7=95=8C=E9=9D=A2ui?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=EF=BC=8C=E6=96=B0=E5=8A=A0=E7=BE=A4=E8=81=8A?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E4=BB=A5=E5=8F=8A=E7=BC=BA=E7=9C=81=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/index/tabs/profile/ProfileV3.kt | 109 +++---- .../composable/GroupChatEmptyContent.kt | 167 +++++++++++ .../tabs/profile/composable/UserAgentsList.kt | 200 ++++++++++++- .../index/tabs/profile/composable/UserItem.kt | 274 ++++++++++++++---- .../main/res/drawable/icons_circle_camera.png | Bin 0 -> 1434 bytes app/src/main/res/mipmap-hdpi/icons_block.png | Bin 0 -> 476 bytes .../main/res/mipmap-hdpi/icons_padlock.png | Bin 0 -> 391 bytes app/src/main/res/mipmap-hdpi/icons_remove.png | Bin 0 -> 396 bytes app/src/main/res/mipmap-hdpi/l_empty_img.png | Bin 0 -> 2551 bytes .../main/res/mipmap-mdpi/icon_email_light.png | Bin 0 -> 354 bytes .../mipmap-mdpi/icon_eyes_closed_light.png | Bin 0 -> 268 bytes .../main/res/mipmap-mdpi/icon_lock_light.png | Bin 0 -> 319 bytes app/src/main/res/mipmap-mdpi/icons_block.png | Bin 0 -> 404 bytes .../main/res/mipmap-mdpi/icons_padlock.png | Bin 0 -> 323 bytes app/src/main/res/mipmap-mdpi/icons_remove.png | Bin 0 -> 289 bytes app/src/main/res/mipmap-mdpi/l_empty_img.png | Bin 0 -> 1925 bytes .../res/mipmap-xhdpi/icon_email_light.png | Bin 0 -> 563 bytes .../mipmap-xhdpi/icon_eyes_closed_light.png | Bin 0 -> 393 bytes .../main/res/mipmap-xhdpi/icon_lock_light.png | Bin 0 -> 456 bytes app/src/main/res/mipmap-xhdpi/icons_block.png | Bin 0 -> 588 bytes .../main/res/mipmap-xhdpi/icons_padlock.png | Bin 0 -> 473 bytes .../main/res/mipmap-xhdpi/icons_remove.png | Bin 0 -> 457 bytes app/src/main/res/mipmap-xhdpi/l_empty_img.png | Bin 0 -> 3301 bytes .../res/mipmap-xxhdpi/icon_email_light.png | Bin 0 -> 729 bytes .../mipmap-xxhdpi/icon_eyes_closed_light.png | Bin 0 -> 524 bytes .../res/mipmap-xxhdpi/icon_lock_light.png | Bin 0 -> 643 bytes .../main/res/mipmap-xxhdpi/icons_block.png | Bin 0 -> 779 bytes .../main/res/mipmap-xxhdpi/icons_padlock.png | Bin 0 -> 660 bytes .../main/res/mipmap-xxhdpi/icons_remove.png | Bin 0 -> 648 bytes .../main/res/mipmap-xxhdpi/l_empty_img.png | Bin 0 -> 4642 bytes .../main/res/mipmap-xxxhdpi/icons_block.png | Bin 0 -> 978 bytes .../main/res/mipmap-xxxhdpi/icons_padlock.png | Bin 0 -> 806 bytes .../main/res/mipmap-xxxhdpi/icons_remove.png | Bin 0 -> 755 bytes .../main/res/mipmap-xxxhdpi/l_empty_img.png | Bin 0 -> 5970 bytes app/src/main/res/values-ja/strings.xml | 8 +- app/src/main/res/values-zh/strings.xml | 8 +- app/src/main/res/values/strings.xml | 8 +- 37 files changed, 647 insertions(+), 127 deletions(-) create mode 100644 app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/GroupChatEmptyContent.kt create mode 100644 app/src/main/res/drawable/icons_circle_camera.png create mode 100644 app/src/main/res/mipmap-hdpi/icons_block.png create mode 100644 app/src/main/res/mipmap-hdpi/icons_padlock.png create mode 100644 app/src/main/res/mipmap-hdpi/icons_remove.png create mode 100644 app/src/main/res/mipmap-hdpi/l_empty_img.png create mode 100644 app/src/main/res/mipmap-mdpi/icon_email_light.png create mode 100644 app/src/main/res/mipmap-mdpi/icon_eyes_closed_light.png create mode 100644 app/src/main/res/mipmap-mdpi/icon_lock_light.png create mode 100644 app/src/main/res/mipmap-mdpi/icons_block.png create mode 100644 app/src/main/res/mipmap-mdpi/icons_padlock.png create mode 100644 app/src/main/res/mipmap-mdpi/icons_remove.png create mode 100644 app/src/main/res/mipmap-mdpi/l_empty_img.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_email_light.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_eyes_closed_light.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_lock_light.png create mode 100644 app/src/main/res/mipmap-xhdpi/icons_block.png create mode 100644 app/src/main/res/mipmap-xhdpi/icons_padlock.png create mode 100644 app/src/main/res/mipmap-xhdpi/icons_remove.png create mode 100644 app/src/main/res/mipmap-xhdpi/l_empty_img.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_email_light.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_eyes_closed_light.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_lock_light.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icons_block.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icons_padlock.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icons_remove.png create mode 100644 app/src/main/res/mipmap-xxhdpi/l_empty_img.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icons_block.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icons_padlock.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icons_remove.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/l_empty_img.png diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/ProfileV3.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/ProfileV3.kt index 58827ef..31a4d70 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/ProfileV3.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/ProfileV3.kt @@ -87,8 +87,8 @@ import com.aiosman.ravenow.ui.composables.toolbar.rememberCollapsingToolbarScaff import com.aiosman.ravenow.ui.index.IndexViewModel import com.aiosman.ravenow.ui.index.tabs.profile.composable.GalleryGrid import com.aiosman.ravenow.ui.post.MenuActionItem +import com.aiosman.ravenow.ui.index.tabs.profile.composable.GroupChatEmptyContent import com.aiosman.ravenow.ui.index.tabs.profile.composable.OtherProfileAction -import com.aiosman.ravenow.ui.index.tabs.profile.composable.SelfProfileAction import com.aiosman.ravenow.ui.index.tabs.profile.composable.UserAgentsList import com.aiosman.ravenow.ui.index.tabs.profile.composable.UserAgentsRow import com.aiosman.ravenow.ui.index.tabs.profile.composable.UserContentPageIndicator @@ -129,7 +129,8 @@ fun ProfileV3( postCount: Long? = null, // 新增参数用于传递帖子总数 ) { val model = MyProfileViewModel - val pagerState = rememberPagerState(pageCount = { if (isAiAccount) 1 else 2 }) + // Tabs: 动态、(可选)智能体、群聊 + val pagerState = rememberPagerState(pageCount = { if (isAiAccount) 2 else 3 }) val enabled by remember { mutableStateOf(true) } val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues() var expanded by remember { mutableStateOf(false) } @@ -370,41 +371,34 @@ fun ProfileV3( profile?.let { UserItem( accountProfileEntity = it, - postCount = postCount ?: if (isSelf) MyProfileViewModel.momentLoader.total else moments.size.toLong() + postCount = postCount ?: if (isSelf) MyProfileViewModel.momentLoader.total else moments.size.toLong(), + isSelf = isSelf, + onEditClick = { + navController.navigate(NavigationRoute.AccountEdit.route) + } ) } } Spacer(modifier = Modifier.height(20.dp)) - // 操作按钮 + // 操作按钮(仅其他用户显示) profile?.let { - Box( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - if (isSelf) { - SelfProfileAction( - onEditProfile = { - navController.navigate(NavigationRoute.AccountEdit.route) + if (!isSelf && it.id != AppState.UserId) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + ) { + OtherProfileAction( + it, + onFollow = { + onFollowClick() }, - onPremiumClick = { - navController.navigate(NavigationRoute.VipSelPage.route) + onChat = { + onChatClick() } ) - } else { - if (it.id != AppState.UserId) { - OtherProfileAction( - it, - onFollow = { - onFollowClick() - }, - onChat = { - onChatClick() - } - ) - } } } } @@ -458,36 +452,44 @@ fun ProfileV3( pagerState = pagerState, showAgentTab = !isAiAccount ) - Spacer(modifier = Modifier.height(8.dp)) HorizontalPager( state = pagerState, modifier = Modifier.height(500.dp) // 固定滚动高度 ) { idx -> when (idx) { - 0 -> - GalleryGrid(moments = moments) - 1 -> - UserAgentsList( - agents = agents, - onAgentClick = onAgentClick, - onAvatarClick = { agent -> - // 导航到智能体个人主页,需要通过openId获取用户ID - scope.launch { - try { - val userService = com.aiosman.ravenow.data.UserServiceImpl() - val profile = userService.getUserProfileByOpenId(agent.openId) - navController.navigate( - NavigationRoute.AccountProfile.route - .replace("{id}", profile.id.toString()) - .replace("{isAiAccount}", "true") - ) - } catch (e: Exception) { - // 处理错误 + 0 -> GalleryGrid(moments = moments) + 1 -> { + if (!isAiAccount) { + UserAgentsList( + agents = agents, + onAgentClick = onAgentClick, + onAvatarClick = { agent -> + // 导航到智能体个人主页,需要通过openId获取用户ID + scope.launch { + try { + val userService = com.aiosman.ravenow.data.UserServiceImpl() + val profile = userService.getUserProfileByOpenId(agent.openId) + navController.navigate( + NavigationRoute.AccountProfile.route + .replace("{id}", profile.id.toString()) + .replace("{isAiAccount}", "true") + ) + } catch (e: Exception) { + // 处理错误 + } } - } - }, - modifier = Modifier.fillMaxSize() - ) + }, + modifier = Modifier.fillMaxSize() + ) + } else { + GroupChatPlaceholder() + } + } + 2 -> { + if (!isAiAccount) { + GroupChatPlaceholder() + } + } } } } @@ -582,6 +584,11 @@ fun ProfileV3( } } +@Composable +private fun GroupChatPlaceholder() { + GroupChatEmptyContent() +} + //顶部导航栏组件 @Composable fun TopNavigationBar( diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/GroupChatEmptyContent.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/GroupChatEmptyContent.kt new file mode 100644 index 0000000..2c5fa48 --- /dev/null +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/GroupChatEmptyContent.kt @@ -0,0 +1,167 @@ +package com.aiosman.ravenow.ui.index.tabs.profile.composable + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Divider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.aiosman.ravenow.R + +@Composable +fun GroupChatEmptyContent() { + var selectedSegment by remember { mutableStateOf(0) } // 0: 全部, 1: 公开, 2: 私有 + + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 16.dp) + ) { + // 分割线(紧贴上方栏) + Divider( + color = Color(0xFFF0F0F0), // 更浅的灰色 + thickness = 1.dp, + modifier = Modifier.fillMaxWidth() + ) + + Spacer(modifier = Modifier.height(16.dp)) + + // 分段控制器 + SegmentedControl( + selectedIndex = selectedSegment, + onSegmentSelected = { selectedSegment = it }, + modifier = Modifier.fillMaxWidth() + ) + + Spacer(modifier = Modifier.height(8.dp)) + + // 空状态内容(居中) + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + // 空状态插图 + EmptyStateIllustration() + + Spacer(modifier = Modifier.height(9.dp)) + + // 空状态文本 + Text( + text = "空空如也~", + fontSize = 16.sp, + fontWeight = FontWeight.SemiBold, + color = Color(0xFF000000) + ) + } + } +} + +@Composable +private fun SegmentedControl( + selectedIndex: Int, + onSegmentSelected: (Int) -> Unit, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier + .height(32.dp), + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.CenterVertically + ) { + // 全部 + SegmentButton( + text = "全部", + isSelected = selectedIndex == 0, + onClick = { onSegmentSelected(0) }, + width = 54.dp + ) + + Spacer(modifier = Modifier.width(8.dp)) + + // 公开 + SegmentButton( + text = "公开", + isSelected = selectedIndex == 1, + onClick = { onSegmentSelected(1) }, + width = 59.dp + ) + + Spacer(modifier = Modifier.width(8.dp)) + + // 私有 + SegmentButton( + text = "私有", + isSelected = selectedIndex == 2, + onClick = { onSegmentSelected(2) }, + width = 54.dp + ) + } +} + +@Composable +private fun SegmentButton( + text: String, + isSelected: Boolean, + onClick: () -> Unit, + width: androidx.compose.ui.unit.Dp +) { + Box( + modifier = Modifier + .width(width) + .height(32.dp) + .background( + color = if (isSelected) { + Color(0xFF110C13) // RGB(17, 12, 19) + } else { + Color(0x147C7480) // RGB(124, 116, 128, alpha 0.08) + }, + shape = RoundedCornerShape(1000.dp) + ) + .clickable(onClick = onClick), + contentAlignment = Alignment.Center + ) { + Text( + text = text, + fontSize = 13.sp, + fontWeight = FontWeight.Normal, + color = if (isSelected) Color(0xFFFFFFFF) else Color(0xFF000000) + ) + } +} + +@Composable +private fun EmptyStateIllustration() { + Image( + painter = painterResource(id = R.mipmap.l_empty_img), + contentDescription = "空状态", + modifier = Modifier + .width(181.dp) + .height(153.dp), + contentScale = ContentScale.Fit + ) +} + diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserAgentsList.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserAgentsList.kt index 30884d2..d91db42 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserAgentsList.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserAgentsList.kt @@ -17,6 +17,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Divider import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -60,15 +61,14 @@ fun UserAgentsList( ) { val AppColors = LocalAppTheme.current - LazyColumn( - modifier = modifier.fillMaxSize(), - verticalArrangement = Arrangement.spacedBy(8.dp) - ) { - if (agents.isEmpty()) { - item { - EmptyAgentsView() - } - } else { + if (agents.isEmpty()) { + // 使用带分段控制器的空状态布局 + AgentEmptyContentWithSegments() + } else { + LazyColumn( + modifier = modifier.fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { items(agents) { agent -> UserAgentCard( agent = agent, @@ -76,11 +76,11 @@ fun UserAgentsList( onAvatarClick = onAvatarClick ) } - } - - // 底部间距 - item { - Spacer(modifier = Modifier.height(120.dp)) + + // 底部间距 + item { + Spacer(modifier = Modifier.height(120.dp)) + } } } } @@ -198,6 +198,178 @@ fun UserAgentCard( } } +@Composable +fun AgentEmptyContentWithSegments() { + var selectedSegment by remember { mutableStateOf(0) } // 0: 全部, 1: 公开, 2: 私有 + val AppColors = LocalAppTheme.current + val isNetworkAvailable = NetworkUtils.isNetworkAvailable(LocalContext.current) + + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 16.dp) + ) { + // 分割线(紧贴上方栏) + Divider( + color = Color(0xFFF0F0F0), // 更浅的灰色 + thickness = 1.dp, + modifier = Modifier.fillMaxWidth() + ) + + Spacer(modifier = Modifier.height(16.dp)) + + // 分段控制器 + AgentSegmentedControl( + selectedIndex = selectedSegment, + onSegmentSelected = { selectedSegment = it }, + modifier = Modifier.fillMaxWidth() + ) + + Spacer(modifier = Modifier.height(8.dp)) + + // 空状态内容(使用智能体原本的图标和文字) + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + if (isNetworkAvailable) { + Image( + painter = painterResource( + id = if(AppState.darkMode) R.mipmap.ai_dark + else R.mipmap.ai), + contentDescription = "暂无Agent", + modifier = Modifier + .size(width = 181.dp, height = 153.dp) + .align(Alignment.CenterHorizontally), + ) + + // 根据是否为深色模式调整间距 + Spacer(modifier = Modifier.height(if(AppState.darkMode) 9.dp else 24.dp)) + + Text( + text = "专属AI等你召唤", + fontSize = 16.sp, + color = AppColors.text, + fontWeight = FontWeight.W600 + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = "AI将成为你的伙伴,而不是工具", + fontSize = 14.sp, + color = AppColors.secondaryText, + fontWeight = FontWeight.W400 + ) + } else { + Image( + painter = painterResource(id = R.mipmap.invalid_name_10), + contentDescription = "network error", + modifier = Modifier.size(181.dp), + ) + + Spacer(modifier = Modifier.height(24.dp)) + + Text( + text = stringResource(R.string.friend_chat_no_network_title), + fontSize = 16.sp, + color = AppColors.text, + fontWeight = FontWeight.W600 + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = stringResource(R.string.friend_chat_no_network_subtitle), + fontSize = 14.sp, + color = AppColors.secondaryText, + fontWeight = FontWeight.W400 + ) + Spacer(modifier = Modifier.height(16.dp)) + ReloadButton( + onClick = { + MyProfileViewModel.ResetModel() + MyProfileViewModel.loadProfile(pullRefresh = true) + } + ) + } + } + } +} + +@Composable +private fun AgentSegmentedControl( + selectedIndex: Int, + onSegmentSelected: (Int) -> Unit, + modifier: Modifier = Modifier +) { + Row( + modifier = modifier + .height(32.dp), + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.CenterVertically + ) { + // 全部 + AgentSegmentButton( + text = "全部", + isSelected = selectedIndex == 0, + onClick = { onSegmentSelected(0) }, + width = 54.dp + ) + + Spacer(modifier = Modifier.width(8.dp)) + + // 公开 + AgentSegmentButton( + text = "公开", + isSelected = selectedIndex == 1, + onClick = { onSegmentSelected(1) }, + width = 59.dp + ) + + Spacer(modifier = Modifier.width(8.dp)) + + // 私有 + AgentSegmentButton( + text = "私有", + isSelected = selectedIndex == 2, + onClick = { onSegmentSelected(2) }, + width = 54.dp + ) + } +} + +@Composable +private fun AgentSegmentButton( + text: String, + isSelected: Boolean, + onClick: () -> Unit, + width: androidx.compose.ui.unit.Dp +) { + Box( + modifier = Modifier + .width(width) + .height(32.dp) + .background( + color = if (isSelected) { + Color(0xFF110C13) // RGB(17, 12, 19) + } else { + Color(0x147C7480) // RGB(124, 116, 128, alpha 0.08) + }, + shape = RoundedCornerShape(1000.dp) + ) + .clickable(onClick = onClick), + contentAlignment = Alignment.Center + ) { + Text( + text = text, + fontSize = 13.sp, + fontWeight = FontWeight.Normal, + color = if (isSelected) Color(0xFFFFFFFF) else Color(0xFF000000) + ) + } +} + @Composable fun EmptyAgentsView() { val AppColors = LocalAppTheme.current diff --git a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserItem.kt b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserItem.kt index ec7b99a..75a3583 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserItem.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/index/tabs/profile/composable/UserItem.kt @@ -1,26 +1,38 @@ package com.aiosman.ravenow.ui.index.tabs.profile.composable +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.aiosman.ravenow.AppStore import com.aiosman.ravenow.LocalAppTheme import com.aiosman.ravenow.LocalNavController import com.aiosman.ravenow.R @@ -29,23 +41,52 @@ import com.aiosman.ravenow.ui.NavigationRoute import com.aiosman.ravenow.ui.composables.CustomAsyncImage import com.aiosman.ravenow.ui.composables.rememberDebouncer import com.aiosman.ravenow.ui.modifiers.noRippleClickable +import java.text.NumberFormat +import java.util.Locale @Composable fun UserItem( accountProfileEntity: AccountProfileEntity, - postCount: Long = 0 + postCount: Long = 0, + isSelf: Boolean = false, + onEditClick: () -> Unit = {} ) { val navController = LocalNavController.current val AppColors = LocalAppTheme.current val followerDebouncer = rememberDebouncer() val followingDebouncer = rememberDebouncer() + + // 获取 MBTI 和星座信息 + val mbti = remember(accountProfileEntity.id) { + AppStore.getUserMbti(accountProfileEntity.id) + } + val zodiac = remember(accountProfileEntity.id) { + AppStore.getUserZodiac(accountProfileEntity.id) + } + + // 格式化粉丝数 + val numberFormat = remember { NumberFormat.getNumberInstance(Locale.getDefault()) } + val formattedFollowerCount = remember(accountProfileEntity.followerCount) { + if (accountProfileEntity.followerCount >= 10000) { + val wan = accountProfileEntity.followerCount / 10000.0 + if (wan >= 100) { + "${wan.toInt()}万" + } else { + String.format("%.1f万", wan) + } + } else { + numberFormat.format(accountProfileEntity.followerCount) + } + } Column( modifier = Modifier .fillMaxWidth() ) { + // 顶部:头像和统计数据 Row( - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp) ) { // 头像 CustomAsyncImage( @@ -53,39 +94,47 @@ fun UserItem( accountProfileEntity.avatar, modifier = Modifier .clip(CircleShape) - .size(48.dp), + .size(96.dp), contentDescription = "", contentScale = ContentScale.Crop ) - Spacer(modifier = Modifier.width(32.dp)) - //个人统计 + + // 统计数据 Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.weight(1f) + modifier = Modifier.weight(1f), + horizontalArrangement = Arrangement.spacedBy(0.dp), + verticalAlignment = Alignment.CenterVertically ) { // 帖子数 Column( + modifier = Modifier + .width(80.dp) + .height(40.dp), horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.weight(1f) + verticalArrangement = Arrangement.Center ) { Text( text = postCount.toString(), - fontWeight = FontWeight.W600, - fontSize = 16.sp, - color = AppColors.text + fontWeight = FontWeight.Medium, + fontSize = 15.sp, + color = Color(0xFF000000), + textAlign = TextAlign.Center ) - Spacer(modifier = Modifier.height(8.dp)) + Spacer(modifier = Modifier.height(2.dp)) Text( text = "帖子", - color = AppColors.text + fontWeight = FontWeight.Normal, + fontSize = 11.sp, + color = Color(0xFF000000), + textAlign = TextAlign.Center ) } // 粉丝数 Column( - horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier - .weight(1f) + .width(80.dp) + .height(40.dp) .noRippleClickable { followerDebouncer { navController.navigate( @@ -95,26 +144,33 @@ fun UserItem( ) ) } - } + }, + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center ) { Text( - text = accountProfileEntity.followerCount.toString(), - fontWeight = FontWeight.W600, - fontSize = 16.sp, - color = AppColors.text + text = formattedFollowerCount, + fontWeight = FontWeight.Medium, + fontSize = 15.sp, + color = Color(0xFF000000), + textAlign = TextAlign.Center ) - Spacer(modifier = Modifier.height(8.dp)) + Spacer(modifier = Modifier.height(2.dp)) Text( text = "粉丝", - color = AppColors.text + fontWeight = FontWeight.Normal, + fontSize = 11.sp, + color = Color(0xFF000000), + textAlign = TextAlign.Center ) } // 关注数 Column( - horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier - .weight(1f) + .width(80.dp) + .height(40.dp) + .offset(x = 6.dp) .noRippleClickable { followingDebouncer { navController.navigate( @@ -124,49 +180,161 @@ fun UserItem( ) ) } - } + }, + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center ) { Text( text = accountProfileEntity.followingCount.toString(), - fontWeight = FontWeight.W600, - fontSize = 16.sp, - color = AppColors.text + fontWeight = FontWeight.Medium, + fontSize = 15.sp, + color = Color(0xFF000000), + textAlign = TextAlign.Center ) - Spacer(modifier = Modifier.height(8.dp)) + Spacer(modifier = Modifier.height(2.dp)) Text( text = "关注", - color = AppColors.text + fontWeight = FontWeight.Normal, + fontSize = 11.sp, + color = Color(0xFF000000), + textAlign = TextAlign.Center ) } } } + Spacer(modifier = Modifier.height(12.dp)) - // 昵称 - Text( - text = accountProfileEntity.nickName, - fontWeight = FontWeight.W600, - fontSize = 16.sp, - color = AppColors.text - ) - Spacer(modifier = Modifier.height(4.dp)) - // 个人简介 - if (accountProfileEntity.bio.isNotEmpty()){ + + // 中间:昵称、简介、创建者信息 + Column( + modifier = Modifier + .fillMaxWidth() + ) { + // 昵称 Text( - text = accountProfileEntity.bio, - fontSize = 14.sp, - color = AppColors.secondaryText, - maxLines = 1, - overflow = TextOverflow.Ellipsis + text = accountProfileEntity.nickName, + fontWeight = FontWeight.Bold, + fontSize = 22.sp, + letterSpacing = (-0.3).sp, + color = Color(0xFF000000) ) - }else{ + + Spacer(modifier = Modifier.height(4.dp)) + + // 个人简介 + if (accountProfileEntity.bio.isNotEmpty()) { + Text( + text = accountProfileEntity.bio, + fontSize = 13.sp, + color = Color(0x993C3C43), // 60/255, 60/255, 67/255, alpha 0.6 + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + } else { + Text( + text = "Welcome to my fantiac word i will show you something about magic", + fontSize = 13.sp, + color = Color(0x993C3C43), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + } + + // 创建者信息(如果是 AI 账户,可以显示创建者) + // 注意:当前 AccountProfileEntity 没有创建者字段,这里暂时留空 + // 如果需要显示,需要从其他地方获取创建者信息 + } + + Spacer(modifier = Modifier.height(12.dp)) + + // 底部:标签按钮 + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + // MBTI 标签 + if (!mbti.isNullOrEmpty()) { + ProfileTag( + text = mbti, + backgroundColor = Color(0x33FF8D28), // 255/255, 141/255, 40/255, alpha 0.2 + textColor = Color(0xFF000000) + ) + } + + // 星座标签 + if (!zodiac.isNullOrEmpty()) { + ProfileTag( + text = zodiac, + backgroundColor = Color(0x33FFCC00), // 255/255, 204/255, 0/255, alpha 0.2 + textColor = Color(0xFF000000) + ) + } + + // 编辑标签(仅自己可见) + if (isSelf) { + ProfileTag( + text = "编辑", + backgroundColor = Color(0x14947A80), // 124/255, 116/255, 128/255, alpha 0.08 + textColor = Color(0xFF9284BD), // 146/255, 132/255, 189/255 + leadingIcon = { + EditIcon( + color = Color(0xFF9284BD), + modifier = Modifier.size(16.dp) + ) + }, + onClick = onEditClick + ) + } + } + } +} + +@Composable +private fun ProfileTag( + text: String, + backgroundColor: Color, + textColor: Color, + leadingIcon: (@Composable () -> Unit)? = null, + onClick: (() -> Unit)? = null +) { + Box( + modifier = Modifier + .height(25.dp) + .clip(RoundedCornerShape(12.dp)) + .background(backgroundColor) + .then( + if (onClick != null) { + Modifier.clickable(onClick = onClick) + } else { + Modifier + } + ) + .padding(horizontal = 8.dp, vertical = 4.dp), + contentAlignment = Alignment.Center + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + leadingIcon?.invoke() Text( - text = "No bio here.", - fontSize = 14.sp, - color = AppColors.secondaryText, - maxLines = 1, - overflow = TextOverflow.Ellipsis + text = text, + fontSize = 12.sp, + color = textColor ) } } - +} + +@Composable +private fun EditIcon( + color: Color, + modifier: Modifier = Modifier +) { + Image( + painter = painterResource(id = R.mipmap.bi), + contentDescription = "编辑", + modifier = modifier, + colorFilter = ColorFilter.tint(color) + ) } diff --git a/app/src/main/res/drawable/icons_circle_camera.png b/app/src/main/res/drawable/icons_circle_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..16046301c61ad26fc4ccffa66c1cdb7a739c23df GIT binary patch literal 1434 zcmV;L1!ek)P)Px#Bv4FLMRPO%M{rDXH2Fi zYLiv`ss8%AJnrc(Jmf{I+ihbK?QXZj{Ach;SO^}E0b3&FJOx+90j==pxx{m@l$UPmaaIHx0&6Prs7ii>Qii$Gh&SskIR;;fEP zS8+y1sH-@mBh*!#(GmJ8-s%W_6>oKfW?x+Fk1$Yisv`_koazVz6{k8v-S{)+hegSX zqQRnMMbThUvZ83PC|OZ7n3OCp8ca%-7Y!yQn}xOYVd-jMp`Xy$db!PU2qOHk)_2Z5 zVH6GF{%DL@&b^{9YlN3`WN8=IUZY7Ist%yO4$TYhkCNuzD3)J`#$l(ANy{NvD8amBKb;&3IJ{+n0hJxmid#?31wbbI7O^b}j|$EyBKrF0?jr znT=szt6?Xku1|(t=IcutmVZtE{8eQ5BdmpxVDlgQ`DO*!z}y#S2y@}ErX7s*tlz(% zuoiWl#XnzBetD)nLzw45pWYigl&y(%0*uo2N&6sc1lW!gEF-}7X|T449SP4M#9cXp zLk2WhQ=(|3HBH<}?Mpa6A#O+?Ntltk``z%tj)^eRhGQ?jWb`){j|6^G(_j1yqg7Do>h)KJ!ZhDo9$UIW_t(Bm*UxG%w7`v4g81j zZHbhBkfE^|3QIzcXdJ!>gLOgu$#VOk>VWyYeOt10j^vC2bT)i~CRBC%&Rz9`V@``hES1xZ$ zyFa-*7w%l6Oox$3c_g`e17vJR|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm$1o(uwx)=EHaPYCSalrz{kx8R3^wH3}ky&xpM<4p^_lKV1@_l`yb@Lm!H2s-cg|bfr9>p%#GDRMT`ob zE{-7^;N$3<{8Z_4KX|Krizw<+P=oIh3SJ6{>6n1=QVObJ4 z;dzhhrxn_jKAH+eym1}VZZ258^rZg+50x(Ai~r2GOqhDzN5tMKi)*L%3BM_7ZgF#G z@45f<=)5F}b2UXS*OuDq*4eG_n%?FAJNNYGs{a$3ZCn2zQL|uvW@~nkF{*lj=G>k; z-0vdFEJ~!eu00ditk?gw%lFIH>V`;$?g9;;7tedP>j)nEcs5L8)7&J!!wVnp(> PkYw<5^>bP0l+XkKrTexD literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/icons_padlock.png b/app/src/main/res/mipmap-hdpi/icons_padlock.png new file mode 100644 index 0000000000000000000000000000000000000000..9b66dec01bf7a16fb984a7957bbd22f5c57cfe81 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skg2l#}zx)=BWnIwVRj(S=^4FV-We!&d+0{!w2-q+9HAAf$my}rMqZSHiS z+%-=Z#}JFtM?*aMS`2s=d+!qe^Z&YEYuc{1hfOX1oJN^%CAPiw^?10)|DpbK0}IFc z3^9Xqw?Z-=buDgOabC$OcA}C;-Dw?t3+oB_Q#mi}t>OMJadHQjsLAuKhgh~>FcDP_ zo;}6OU)WpdOv)yMv)gt}sQq~M03UzGt9q|rX3RYjmVNfe%5VKK$WhrARU$3E=jJZ! zoBZareOK;#ZVl*La=<+^B-}~!=9%w-Q`?GdeBMpvU31W&pqT3!ztQDMQ};em*NR?f qv*Tf=-?HaSb3#9fdOp4WFG`-Pl6!qplX@8_xIA6`T-G@yGywoh%7^Fx literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/icons_remove.png b/app/src/main/res/mipmap-hdpi/icons_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..b597232db186777cec412c1858043bc6650dfa7e GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm01^9%xx)=ETx3B>rOPl`=4*xBzL2N6l{}vYi&29gi1Es(sKv^rGELf$5 z4U=sF$T-20AirRS{r&X<=k?_kg6$v7&sTWAe(JYA4xr?9PZ!4!i_=#_Zi_W5@I0;) z6#4Yu-a5og^HJaJ*_GN)W=z;-^o>Cy`)c?hm6AhTy34q`_%j6lc&JU6*4tZnuHvM( zp#LT>@h;0(s$v)Cg`P{RGGgBOx%g3z&MR$&dAUU_pUMu*^JL4IEbw4)fQ3tN<_SSh zC-cz!kDupUX<=C-7}<39is02vKgAR#yf1c|G)2WKXlgObUK#K3V;{3wwjY{P7Az}v zYucp;2bU}5e%KqBSZPvHXs~air1)X>$EQQqbSLD-wygOVy>izaX~kIm^r@wOwhzm{ ZFa~d{!PC{xWt~$(695rTotXdt literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/l_empty_img.png b/app/src/main/res/mipmap-hdpi/l_empty_img.png new file mode 100644 index 0000000000000000000000000000000000000000..eca7860433f6f9266aa51a30b7253cde372f68e5 GIT binary patch literal 2551 zcmb7GS5y<&77a}zD1=@FV`w5G-AHH?LI}MW5h=dp*s(obA+PJ5P;fYnKd?9x3_jMH4C<8EN$T9 z7MknJj+W~F>h5GD8e~r%4!4mGmqu7vZPxbGP9`c6waHwruC1-5@2;}8Czx?M`^g3; zw7-~G9k#faVi<*@WlgYZMwv&el@X>?wiszj-EH2@nmRn8b)2leWaqSv6}HHv)Da@a z>gwv4@j3^SR2EieZD47qd1tacXo3{PHnKKacUyKDyA-yOebLD(;Xg;6u(AG{@|7@2 z3Sw+V%#(2mAo8b65ugM-)SXNORxYd-QM4JGmJ@v`?7HX`9cPpyeLqha9(- zKfy1xRc_F-X(1G$8UO$oV1YDtcr-;Vx*L}7BAO5a5bV`N*pz z0Mvk*q6T_1PL6IXS+i_Z`;S}oU3wPxWYXs1hd$1cD|qW29e6e*D`3{ zVLwj12?YQAORGUTa2nen5S4cp@%@>a@gQMG_2pOUAA`%7rs-;|WOcmG3h%nndF^jp z9kgmkmB2Bgeo@5`P-Xh!Czks7z};~x#TViHj*7-= zh3fM!L z=-F>3>2-aD+<}D=#dr)SHY=FB04jzC8^mcmi)oDt6#w{$7`u20RF1@ZRyrJ9?miFs zXo78nj|;ansN2YT`U=|CLiIS!RQSr^S;AFQmV|XleR|UzQ!KqmpjSiKns@q$GIx@z zftB$$eCO6u_xI+sI>%BMsjU?%JU?Y(nhufQD*HSpc3U|o0U!OC;@OLhBISK!df$@b zu}R<*NyVGF{Py7n;q?h~BD?r_x$ATDR3n_MCEB_5Q9ILuTC<1gkALq<`tSkKS6-eT zY4qjvEu5BrZR`NB&ht^UoTp}eYNkH5pqb}z(t6dmExbeai`J*yOHrLE*+!?QRx7M<`pDWCyLROX~?m%7iR?8h)#H=&ewe{3MUaWh_49 zYZ`MS-VUCUO;&WnIbQgecLj#4NaF6!1Jhnuhd&9MUE>RpzoKB|Qih7Z(RR$%npy&tCka9rn80 zI(7OjJ(nRO=ht_199<&?ihfP|OeV|L(MOyw=z+mziNa$`WV(#>y8B5~CgY9D^`N<9 z=%y3QZHuy(MjmrFahTnM7#sN|r^VYrLK&rByK=&FqRf*7kM;`!`kej9N_VblVfR=o z8S+d0a#+vEb9uFCCpL*GioU?dtidZyS1j0%eP3iJEh4t9K;{`0{Of zfcN*~wZLo!9i*#&7MjPixSH4UM_oWqxK~H?z#+4-<;@JSvDHx~0i}gHdv79)tOxet z&#Yl!#0RvZQ$;$jid+lTMCHa)joq*2_>2ME^ z=n+7C$jPHz7z{81h2Z%epn)DM4L! z2roH+a6^v0k@5Cf;j0EMRwTO9>u+Zva0NamUDsZi=2e~!hZK`o=i5hB2eNMBl(0Ie zd{|a|-sLc|3(z9v=M2g#S*ykK48+)zum$Qf70U95zF3nqF)x*DF-!`aQ5(toeqH`B zbrLuULwPh3|HKGai;l{9sVW%i-kzc$L7f|tnRrQ`>5n}Z(vmlQB6EKILcBhrG=bxjFNc>wR4V-Scz5Cc}grQ^_cVz(t8T-q^>Wp`mMFF^90;^gj=TwTE_X4A_`}C_ZdqF<0CTW zo2k&PU^R*LCMOY)%ume#|QsEwguDEv8)pM|5h^T)} z`f(ZmXb$xh7pPwC`KwnSf5*QRaO=PDf{}rNaPeVt<9D4w9;&7<^mgoOK;DYNGhr!c zWvs`DTpPLs1=)%`!-0SUfgF$v+}I}|5a)jheQCuYq+=l=X|C2&7<1z?`V-a=);jwE zKNVgdGoNNyb%$nWj!Ev~JSuOIfHbOKV(#@VhHJY(u2D=?yh}4nVfw?4A$ZD9-OwKQ z=UJI9xd^nY3^!X12yqJCcg?gnhbDF9ziXHCE@UiDX!>d*?p@3~zH{&*Y&cc6$N0wN ztJUInKTK2vT!-C)gfOAey3p^T-$3ZgXx>Ca-#%U!nfK+cLvl;@$y^ah21dUYgWZz2 k1>c)<@c!?o0DtM2_oNS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(mr%sm1|prfigQiT^vIsE+;1(V2=ou zalON&aOUOndyNj$nIZK0ncCmCMZJX|}D4(h2@J}WWnflcX*KUO~ ztHiz2W-7eo|DHP`q3T4)=Elax-xW=Bn3z8cv+*vtR_e=B#Hqk{c#lwLI1f)5Ujkq9 zU1>&x_P2@w=H6P&GY)?dc;>Qzan1U~Ih79E=QR~xV<=?rVNN>JY$=jq<^1FJO{F}o wzTNK{V~%cNdb8bpYQX+w7F`ys4|pXRwqLYflKD_i9_R@MPgg&ebxsLQ0DR_)wEzGB literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/icon_eyes_closed_light.png b/app/src/main/res/mipmap-mdpi/icon_eyes_closed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0a985c38ff24c02dbe869fa3fcb95a836cba7afb GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc(TCNY40-L!0=I^L2XzhDM|2lDT$to-Ls*neUD-S&U;ffDJS zE{-7*my;6~=xMYV9+8xgh)tXm!N}Goz|1lGr`iO8TO1ELG?_Tf_!$Lef8_9B-Mr4I zBe_;u<=Dz)w~rl|@G|5I!z958J6NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc*6r_7u-W!BWGKyv2v=`&_bnK5b7{OMC?Or0`o&YU^ZfdD8q zbtX`m}&zDy?zg{XzQwS(C&C|s(MB;LC!U66GS2?Kz zmQ_ib{Ruf~3f}x`M;{+Ja6p6M=?6^%0|VQJqHl~-4GvqBvB%c9%yYWoW3r!U_tcIW-&@8@wm=9OURlu(`#o5wp7=t2fhS3j3^ HP6fWd%@A^%POa=C@Y%k?sETB!#ZU*7A@{PS;HS&Ql8dSt(h$x zwnSVxr&xJUR5-&-vug)m{C|*U>&a>+dazgH^2}f-`QxdD8>R)#U9-{TYR|p7ff@HJ$LFufxyqMw#~<`aEs(R<#F!xdVA!AbJy98U)LrDyx5qc$-lfb_VD`B h_Yqq;rS{eK%Wr?h@l9>5UN_J`44$rjF6*2UngH-dhW`Kn literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/icons_padlock.png b/app/src/main/res/mipmap-mdpi/icons_padlock.png new file mode 100644 index 0000000000000000000000000000000000000000..e5852c69f05ea6dfca4ed96f58f8e3ffbd3d561e GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgB03-AeXbuaJ%GD!so+>@>X^$3;(`2{od>-)>w$M2v2;Qe`l`iA`VdM1Ar zfRcTlE{-7@=jR4RiZv*3Oo?Hb-t{|v+flDg&;36yHafwx!tnpYPT`&Tdpwp*O?~-z za)6l{^B0y+4vq;fQyNth*Dzd<^b%Jz+Fl`W;`_bEO=n)F8f=qmQfu1be)Bp@xoqzA zrijpaOwNZ+g@pfJ^+$03=Q5WoEL$t}R^8_LRd>_fRsGru_o6-8pE_Osy}y5hVb*z8 Uo%^AZYd~K0boFyt=akR{0Q)X#9RL6T literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/icons_remove.png b/app/src/main/res/mipmap-mdpi/icons_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..523091bdf23d3dd5282920b56237c666718640e8 GIT binary patch literal 289 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 B?f?J) literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icon_eyes_closed_light.png b/app/src/main/res/mipmap-xhdpi/icon_eyes_closed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..eff9952f9e67ff4a739a9055bfb2111589fa069e GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slb1^9%xx)=BWnZyA0bUc|n{DK+o$?snp-}XM=Ucg`9{q^g+K#3=w zE{-7Gx&}jxt;b z-FU#^sav;fpAlOJi*pron#}RIqk=!Xd)qW)Wus8Eak-aXL9+fqFv8<-K#8d=EX= z6IhYZwfR14GZRnet=*@X=J=JbU({`Uf3F_HG&6_E0! z7q(r$pz^?(1E8Jo#FdP{?UHx3vIVCg!08O^IqyPW_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icons_block.png b/app/src/main/res/mipmap-xhdpi/icons_block.png new file mode 100644 index 0000000000000000000000000000000000000000..317e8d003ddbbb1e672b5b8397f0a025021cda66 GIT binary patch literal 588 zcmV-S0<-;zP)Px#LQqUpMMrQ<0000D2@eJY2M7iU2?q%e3K0zn4G9Pd z4-66z5D)+W01yll4+{|x4G;$f2o4Jm5DgFz3=t3w5D^R$0000)Wp)7o000zpQchC< zfA7z4Kj5Dqe-IGAk6*90Promk($FdZ00D?eL_t(Y$K6!ha)lralxw)^Sn>aVwZWqh ztUd71=}em^oY^(Wvdc96yE1bGu&Wt_tB}ruA&O14_&kW$01$XSsqXk0exhciXxAYC zV#?$S*|I~xpUw^aqoWZ1(>0&`Jz>R(ZX3OqcD~IpLZBU7m$0@&Z%BB*gKO_frX)JD z2D*gNDa8%}mnaw`x+}a|pp{mo=9tZ7yXJG6xHZ9myL@2`5yxQbP#BT8~7#qR&MoQj&`#xhO-V<7UW)$M|F9YWANcQ6^X zTu#9=nd)#tNJYW>+*1=RcNq{Nj;HEmU<*a!`_&03 z5ln;ub?xT|g1wY13|5uh+6Sg36b2zUlvJ4Kkt&0Xl=F*QL#b%4r3r&9eY}fJUc|n{DK+k=iBd(Rm{KhUZ8({YgF4>pwT9t zE{-7_8GNi}JEJKZ&x0~~hiM7Bq#05T?}<80b0|pk3c96m^3gh`SuJl$O*q9? zoT&W8u7t+(66RAN>%&ZribyS6WU zf@+Pv;z~h>ZNH_2ehb-nZvLsX`qJL&zopr07;Fk$N&HU literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/icons_remove.png b/app/src/main/res/mipmap-xhdpi/icons_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..a33ec95aa75e82049f9b0ee53a5d6cfafac690f2 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slb1^9%xx)=ETx3KwdVg29S=D!V)0Y>JwU=iE@4h|p@OOT+aZ`DDdF5Z$L zzhH*?2X^xB=f|J&7wFHoS~V#gXtau_i(`nz>Er~7I}NG379@OR@+maFyW62aQ!@6? zg;8ph<%P_P3c@(&bvTo+iuPiLOlg~ z!ZDn)7_-+eVsm~Ys&V)m+bWm$zB97dFZ6nH=#L(E$=ZbqA|1vCZ}xUfNZ7~C&X&;1 zqLOE9AabZjD9yp+!Im1mUB&v&lKWoB?Qzxcxbcol!CT?bl%IJbn^-0>?ojG__$Ktp z3Rf>RnH8OmjRl_=)r4p0#w;q&SGsvzvO1i1l8fv6I9-RbPGOBeZm(vcQtm7Rk%LaL o?KgUuw_J+}*l;Ov!gO|qc*FL+X}8^*fC0(i>FVdQ&MBb@0CYyS0RR91 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/l_empty_img.png b/app/src/main/res/mipmap-xhdpi/l_empty_img.png new file mode 100644 index 0000000000000000000000000000000000000000..55906f28569893ea589ddb5892c450e009b07b8a GIT binary patch literal 3301 zcmb`J`8yQe+sE~do+2c&WoaXdl&m8&$yOLyX2>#B8q1J<9hy*LkR`k9#F#N-C!@iK zD0|V^YDmHuX2e*UVffDH4|uNUm*-sPocp}b{d(W$I@kH-psg%T1^K1xp}1lgG0;USF3tZ)V0$^v3+>Tkh* zc@xvt6JC_O$6*y3GA1e1Og$-h{4*TZoS`PFZO27 zaM&+2Sj-jH)-rbyWy(096X{W!doMJ&WNmHj=6p5tJ@atAGs>9GmD$rA?wmEl*=pV5 z&>AL4{#=stD>1K!OLDVwpW|3eDz_ll#jSZrt>AjO#~mIXE|V*!NPb+)MaeV! z>qC1R)4S=WZ00<>*mbWflUieK|N;u2Ry0w z#nJxfQ{FY5W)^eQ^J0y!djlAlbXB?VW1rdIBXcNkHNZD)ZbVkRw?7ARckJ?mCWIh zcLmZGetQIWQ6J0<4QffxJh|g7&j?2e+dE6CWd+C7#A9U6y(J{_D|E>yi<|koiJ9QhUo&ZJuMHM3-GyiO>E#p&si&2B-{Pig;D05RXw6QZg~H}XFd@>y)p6#Gxx6y-|HD1{uyNh*XBcH)#iecFH1 zCNePiZay?BV^2=c*J>#Jv;et}(OjyrPzEq-w`5c*6WnvfnpB_aV%#UeHN2R+8kQ@54^Me8UbDMd?%oPE~Fm!^&$4=-4V z$7o0ICyz<5Vqa|yjnyp&tX%~Q)f}=C+Tto3c%T&Y{bzfLyCa}pWA(ZwUb~M4&22nG z=+@CH)FCC6)EO>}McXp(_pwUxBb|i_z)A7AF5_Xk5YR1X9U(Z}%Qw8nG_;n}WZbI# z1q_zYUo02}yN&6N3h?f&{*J#rHUtET!E4%4EJlEQ!uBHzZI_L%UANd|UgerH)>{}e z(shATXpT}cD}FHH#FQ3K7M5(3z<=?{9$YMV^(0BSNFvC-UwB?V-hG(q+#UIIpPFha z`uc0QCkRj=SCIVbStqXphUyd$AakYIRc=%bfwn6Ri(?6NZ@XRDFs{2oFHKi z$^PUYinGF^Mk3B4iZN_^;Mo6JnTwu zttjE1-@w#63>{b4pIg1&kwcSAiPF@?tcq+5Vly`UMWM2t>G%B)txY&Qm4f>-3ZmqI zvn+%hC=pOJC};N!%4s(5+U#9D3S zJUuir?at(WlB1m_`M!^(?8=Rb5fI2RA7K)pY8rlWx~pRHE!KB8x8PRyMc1cCS&uO8 zVw35zEUo$|uRN?&Z-}6={;066W;t37>vk6|%6e4I1-=Fs&fP@~K|uBB)w?d4)3>dK zeXtG|QCay3Wktr@&YIir3CkA&(cczd8#RM9$>`b+*=Z69Y=K0grl7V-tH&cJL|PAB zr*CuRIC^y;REF?R0?RQj2&Dt51#K8Ni4ZT{>*%}M;$)7UOjLekm_mB_FBh(xFaIYxr|Vm4ztt)jXT_kBn>mi91!(g;#VV^>xfZMdD( z)goGykqvZQ3JeJ&14WC^e6fI-^C>^ZPOfLE3X|mmz<(@kLr}Hjy0439&B4OApzSJO z`iqpY;u_L#q#`z#6}5QvJnOU z8N*0BwSYqgXh=0(fRPI=ffHCd$>wzmB4&*ZWMEY(cq%3|h;;d*>-L4WcKS{!YQzyk zO^$*^k@HlQ75I5G_4I|)ka5@C3|NxY@I&F>($Hb^ZT*J)9GdNSq0igfD_+1+CPj7y zLTW`H@@YY_%(ISfsvc~69mBFPvxB!ay~%tBXXU-1s!x|(-fCb+#C8CYRZ^Ixpx#>< zF$f^`rj;Q1|L*il6UFE1 zN5beiVnyx0q)^2>QRqb4OYx?Q#FemtKSiLVyv&l20ooE|y|Sdl!C0Fg5Y4DW#3+m@BIg_wzHv|6HLmnM|0zx)6w@FO`?p($k;Kbw~i zOtL*4mSOcprRC_qIXJt;RC_|%wsCG$mxy!0T7OB_Q{c~csxmUTnZk(RhM<*9WH6|- jq|I1c<$wM6MrZz!ce`)XV~i^3{TI4tY-vQe^Dy?mU7(#Y literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/icon_email_light.png b/app/src/main/res/mipmap-xxhdpi/icon_email_light.png new file mode 100644 index 0000000000000000000000000000000000000000..27551c028b2e727e17114482a440c19294de4ac0 GIT binary patch literal 729 zcmV;~0w(>5P)Px#Bv4FLMMrQ6n3tEFm6e&7l$n;6n3j~8 zm6e~Dl$n>5nWp$XP5=M^3v^OWQvl_^rXyyLM1K&_FQ`ch0006!Nkl-cI4sGE*Ejg2Ka@1|ZU(y0Z}a|!U&MDkq)co(@VZ9T|r zu0#Uh42RNk>$4CT^v&2Xz?!EJtl&_}hBwx%0(|1o9temu;SpozK&DitG9i8@siZIL zW0Gq77Kf^#=Iq0Ul5SHJccjx7i4&Qs@dcB_m3$X~5PXF$->*aabY6-}-U(0(6VYTR z!!RC=F~|#TdQnWyl*8=lDtwL?iVJ-bnuX8?0kO@|?iy!0`4qm1bd)At;8Qsx(c(6f zCc(7mk|+OKq+!F921QA8Kl&{V>VRkIRh}K&FOOSR(4o)>vfv^4vul|kx?gx0Qtd{d zB)e}?3j_+?Au(e82GKpU-Rn?7yDZ1U&bIOy(+LX>rGJOERD<#0_N3&6k6#%5JQ<;y zJidkyW8z<8#elDpF;*TmDXs+)Qp2_xl9rXB*93Kog0W|YdPM1|!m9~d7RT=tt2=!D z2WwqH&@}qn8!yChnWm&c=ECYJ?L1b+Pt@5Rv^F~0V|lYsakHfR9(l?h9QWeFb+M<+ z{3!0K%g^J?n7+vcf9NMMSlUF6YQ5qQx5#d@gHEY&Uc|n{DK+eQ}5RAfA21^e!hOcaqjiSK%>(= zT^vI^j=!B^?|s-o;+XLN3sdwMR~9dHUf!_dh0u!&u8tQ%PbOS13V4&XVD)@QZmUk` z1FrjB*{jupUVe_<^K9M8yHEXMT5X(*cK&&H@B7~BcQVVv*4FEmXZ?Sk`|qrHnMTCN za_*U>TINTz^BHQTw=n5=d&R&o++P`9R z$C}KxqS7+muN!ZjJAGBbU|l-HtLgC@4Zn(gSbENSmDBquG0qDsulR2Wvf9?@FKflj z_l3`9UcdcLVXTlt`@}3)u&efF-tlq*eBhohcHTX0+g+*7(eze>^ zzx=e@gQmCoQx|M^{`TToXDlC^ex;T3HPfA|B1-u@?~8f68%>Fl{id+v%askxhZ3)R z&-0VGHM{D_qu(muyHB5Y&*^(!WY4`Ka*pa(hsk#mnUX&CJT2{?BUGez_+W literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/icon_lock_light.png b/app/src/main/res/mipmap-xxhdpi/icon_lock_light.png new file mode 100644 index 0000000000000000000000000000000000000000..1355549c565447c71d1e45a478404b7c781d8278 GIT binary patch literal 643 zcmV-}0(||6P)Px#Cs0gOMMrQNoztB&wOcSn!0005vNklc5$iB?x=yjW3~7_BHyu`#ib%7#Kaiz|qQ4UJmUT9{Y} z=L6*Xqg?QDv%52N+Bgk6%WrpQ_r953$N5ioIPZoRH=~&Y7s|riC?+vv6ty8U<8^#l zTZWF+-@RHUP(Rlqq$XPN9VeLu-Xtal^!-62sc0#x3XuN6*TmJ@QBzni39Ns&tANiR z5(y+B1(iY=otTSr78;{*)UnJ$CwPvWGG2rec#oWx02R@p&hJBQ&)du>oAo>?@G>;( zaLghMyJvM`TG~=>U_)J>QSQp!-u{;$_Lj1Yh97||y=P15)QZSTki03ET_(&J5uq&C zygs|q7$f{DLSIm>wjS-B0Ct$HcX3MGNp!g{6`-NXo2?LeP3W4usV-gxc^~A2Y@nia zqkU^yrCuB;@DQ1oLKQ94KZaU7RHTWoZ6oMA(h)>M;spV!NS}qC_>A;{pQIv3Q;4cy znv_dodf|+beMc78Q%Jc?v7Io623(~nqh}Pb(8`3QYaC39xp7ohH_TDyl{)2Gv$xd6 zyG=WeRKa?;Zy%s}R?7@+?(AXUTUoteSGraEwyT>=pUM2VL3Io4tKjysRQh~jluFH6 d|G&JvJ^Px#JWxzjMMrQ<3kM7g2@VJc2nhxW2n7iY2@VYk4G;_x z2nPrd5D*Lr3<(Dc5DO6i0000001F5V4hj$v3=;qV0DF0wZ2$lO5_D2dQvl$9Z$Iz9 zU!NZkFHesUpRdqBf~5@r00K`*L_t(o!|j&YlB^&MhCy}#MScHwJ+ib4M0-%{TueEAlFLUVWBhF1*XZO&6$~)tKI{l_q zkD}^#st|D3tdL|=Nb*P_-_z{(w#eGZIOo{=>z2xmHFXcSwx;Vk68a(K|C}kBQaU_@ z41}{K7~|q6t)&dH(sAx&NA?p*jZ0?ZHA=1jnwLK*kzh+km<28vl{h&mgqOFJ`pg!G@1T&OX)Z`1|D;yfQw&1frz8DpCk@`EOw4Ia>iJdX zzi_A`je%b}G@VcS@QI-y5&y2rv*@DXssF&Bie&t|E>=E9UqBR9q{I8w$_GIisRD)5 z(O$^q7Ftd+CCJRz_lC+EW+#!VBV#{eNkneuQ2r5BBv+O{o>GwULqiS~scOh{0Yj$u zhUv;lm>?lh_zE+ITSN-Ph)!SB z-St4NG*E^mmgV5m|BkyYEHlL^5Qm${V4;QMonoBNW zn!9wlX36OV7H5jWdf6|1F{!C|S1J+lxkajh(ch!>W$hNbKNZezPh3?`8jK?;QuOB#Zrs#r-#Zwmc_RZe0^L4$h&o@p<>S@etyv&jsyy=Vi zsskbwLLtxM|yH($`=%AKl~xckfHFcs0M&lWNW zEdBp?Zu_&DC65+;x$*4%;^Z|F_J@vTY)sv7bgID4@ZUS5uRP)w-0OU<;ulxVK{n&1 z$4W0bUJ0)H=h?AKVzHs!L(6HAVzSQ-u13ABJ-PNrio{9YMZSkSTwgys{92qbw&nP7 SPm>T(+VOPtb6Mw<&;$Sl!xVS` literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/icons_remove.png b/app/src/main/res/mipmap-xxhdpi/icons_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..73a03ceccfa8b5a22219e826bbf46f6ef2ce27f5 GIT binary patch literal 648 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/icons_block.png b/app/src/main/res/mipmap-xxxhdpi/icons_block.png new file mode 100644 index 0000000000000000000000000000000000000000..e13dcb36e0624899b89b99a470aa17db32a99762 GIT binary patch literal 978 zcmV;@11Px#IZ#YgMMrQ<3kVAg3=9kj4hjYf3kVGe1_=%d5DWh!ZJykAkZ9-A-;mma36ekNw zNH#c4H*Vax#yo31(;wM3iZ2mNI6K4w2`(N(=7489N zFq<`HtS3ZUxrKyx=Pb#&DfIr^axB+NppcX)#GOte$&5Lz&@ki(61Ot57@58(gi69E zay!673S6YDve*b42{gPKvz7OUfYq-E?M_lrKi}LzAgW#_RR{hDg6SWeKvfC+C<6Yw zEUIUEsuf+`zTqZ|9)eVEL@maB^;%Spp!#E6f)FSg;;vd(d<0~wX9L>7PE@@29K%M* zijeh#+MG>IZuv{U3Qnyzs%j;rbVX&4P%T?9L4+Z*f@PR}F=!Sc9JcSKVUPfY(9=N7 z_BewuH`IJ|l$A>G6-t@$)^Ch}H!ASQ3ND24qpefP9tUvw*7T+wFXIJ?b^{qV5L}RLnmF3Baei^9DL7& z(Qi8;@iQs*PYmg7@R+L()-B$+W+5-{4P$fQYk|>ZN zt$IXKue&#wvMlE3cIG34fbT+1Pj{^uMDa4n5F?~uRnA&8o7gTB#9&{`0al}?r4I6) zlL3a9#2gH9n<|e{e9OI!fgaY|o)0Pn00T(ist+JFf-?h1U_a31(EvpmKmz)~lV}Vw znGgmK207n@mOKqF3wA;nbiRkkP3F#O2=uMm$O&PPFhS+9`u!2r02X!(NU11KqBwM| zoD~Lw6uVWdUon(CWKgxq3=EDj+%S>ZMuM$9F;sh|7cDMY2lcp10x+a*il)1F7{|U( zNLa+FV!!@wOF-=V1m&O-^;xX;{|&PjUiz6Zbe*-Dgje%xMol^n`KL;LD^1(I)Fa>9 zCR_!Wzfe@4Qb_(w^JxeaA`XE;jUNJU+_=$-Kkhkw;qSTc9RL6T07*qoM6N<$f*stM A0ssI2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/icons_padlock.png b/app/src/main/res/mipmap-xxxhdpi/icons_padlock.png new file mode 100644 index 0000000000000000000000000000000000000000..492b16a553d7c4fa994d8c9475badb3fe4100a2e GIT binary patch literal 806 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wF?gc(TCXrz6wz%a$rF$uNyVSnlpD&=lexgC>B?bnj zT2B|pkch*{2@+u=7dvr4wKjtRv7j8@cMWKEO408X7|MAuhS)#_3L8a8yxgzzw>J6 zuMHU$-vyTQ$?YtUU_5sz^Qg7V1JSatYYK!}7dr6OPn2Yzl;!8NasKZaiXLAy!{nP& zmL+znHysgAI6wFOt_?GvFixpx-rI0cPG-TO4~pNI+&HQ;G?KoWDZl%W#&j&*eA_3c zbjHnm(IE`7R*e21zX=_Vs+r0z9T3EL`8@wev5VXWuUn6+OwFI8an#1@#9Gp3Wj<@STmRlfVAc zF{SRKJR!fO4T@zlBd18FZ)Maysh1%3P5+}=k(fYW*hBrNzdo3(ow0FhQDMa?N!y&I zG8=AG>|iYS{K=6meT$*|vs7@`ZvOO_S?zn*MYd;LTg>Du6KZ|pQ9E}*N#_R3Y0@F@ z?MsLRH!Zas?d8i|IYUUQ@?w83Ky&#*|`gju23uc zT3oRFluyp9bP0l+XkKzlcFJ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/icons_remove.png b/app/src/main/res/mipmap-xxxhdpi/icons_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..da1adc6354458c18b8a742fb67dd3cd863ac7a7b GIT binary patch literal 755 zcmVPx#Do{*RMMrQ<|2RAUKtTUFJpVX6|2RDVH$4A0J^wg7 z|2{weIy(P2JpVX5|2RAh+$E{b3w2udJe;{!n?f*=P<&_)6Q6|2A%f+7f7C@2ID1$!;D5`vAb zuQva|Gr0sK`(NC>lQWr}+4YEpMW(ym`DS*$nVX$8jIMO$AIU>@b)2!Mt&9C%sZXr4 zNJh@I>gED#lkJQ~e~AGZDaX@itg1pBF+@gb{mD?n&z)Qw#?)@M7=E8q`l&$S^D>Il z+)0ZSk2=&8jnvf;bZBu1m~C~n{T+t zdWo;kVSrw~(ZEBl;%smiUIw+};s6WveTSNf=y;Y^Ip1}v1P+kX3M@v(-Lj@=yfVv8B2UFd{SW^QShN*lfdS%clXBm5J z0}L_t_MHw%oS%IOU||6FF98V*P{shUgN{wBE^!AiaeeyIkN~>kb2}^Vr2YqTq*fK{ z7d0xnCg913bZJ1J9HI?V3G)hBpVhU>54jopN>&TVjYYP5@n0Q6;wrL{)|ln%%vN7n zavjX5FU4l(*RH9)*vp-d4)KQ*vq+CWI2~~ZtZ;;@f#?Q`iYYM|5^L>4Vo@<9hAx=5 z_A`d=RTwfjVuS9zVNB}>-T0%lk+Nm|7v+N>wGvOC$9deYzmd_tQEpqDyw3mX6?C(> lB_2(ixzp|gvMc{dz5wR^Z$ShF8SVf8002ovPDHLkV1mw|M9KgF literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/l_empty_img.png b/app/src/main/res/mipmap-xxxhdpi/l_empty_img.png new file mode 100644 index 0000000000000000000000000000000000000000..412d54dc08f12836db87e105e4eeaa48ccd63565 GIT binary patch literal 5970 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 79684f9..2cd8e9d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -23,10 +23,11 @@ ログイン レッツ・レヴ・ナウ または - ログイン状態を保持する + ログインを記憶 パスワードをお忘れですか? パスワード メールアドレス + パスワードの確認 メールアドレスは必須です パスワードは必須です メールアドレスを入力してください @@ -91,7 +92,7 @@ メールの送信に失敗しました。ネットワーク接続を確認するか、後でもう一度お試しください。 %1d秒前 %1d分前 - 同意する + パイパイに同意する Rave Nowのプライバシーポリシー ギャラリー チャット @@ -114,9 +115,10 @@ この投稿を報告する理由は? 閉じる ブロック済み + ブロック済みユーザー フィードバック Rave Nowについて - アカウントとセキュリティ + アカウントセキュリティ アカウントを削除 本当にアカウントを削除しますか?この操作は元に戻せません。 確認のためパスワードを入力してください diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index cf26ca3..13398da 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -22,10 +22,11 @@ 登录 确认 其他账号登录 - 记住我 + 记住登录 忘记密码 密码 邮箱 + 确认密码 邮箱是必填项 密码是必填项 输入邮箱 @@ -92,7 +93,7 @@ 邮件发送失败,请检查您的网络连接或稍后重试。 %1d秒前 %1d分钟前 - 同意 + 我同意派派的 用户协议 图片 私信 @@ -116,8 +117,9 @@ 关闭 关于Rave Now 已拉黑 + 被屏蔽的用户 反馈 - 账户与安全 + 账号安全 删除账户 注销账号为不可逆的操作,请确认 输入密码以确认 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9a3cf4f..f2bcb18 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,10 +22,11 @@ Log in Let\'s Rave Now or - Remember me. + Remember login Forgot password? What\'s your password What\'s your email + Confirm password Email is required Password is required Enter your email @@ -90,7 +91,7 @@ Failed to send email. Please check your network connection or try again later. %1d seconds ago %1d minutes ago - I agree to the + I agree to Paipai\'s Rave Now’s Privacy Policy Gallery CHAT @@ -113,9 +114,10 @@ Reason for reporting this post? Close Blocked + Blocked Users Feedback About Rave Now - Account and security + Account Security Remove Account Are you sure you want to remove your account? This action cannot be undone. Please enter your password to confirm From f86b5e1d39b2fe675ea9c9d9c5facc57a16f643a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E5=B8=86?= <3031465419@qq.com> Date: Fri, 7 Nov 2025 21:22:10 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E7=95=8C=E9=9D=A2ui=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ravenow/ui/account/AccountSetting.kt | 198 ++++++++++++------ .../ui/group/GroupChatInfoViewModel.kt | 28 +-- .../ui/group/GroupMemoryManageScreen.kt | 4 +- 3 files changed, 145 insertions(+), 85 deletions(-) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/account/AccountSetting.kt b/app/src/main/java/com/aiosman/ravenow/ui/account/AccountSetting.kt index f6baafc..2b527ad 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/account/AccountSetting.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/account/AccountSetting.kt @@ -1,117 +1,177 @@ package com.aiosman.ravenow.ui.account -import android.widget.Toast +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.Spacer -import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.BasicTextField import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.text.TextStyle import androidx.compose.runtime.Composable -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.platform.LocalContext +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign 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 import com.aiosman.ravenow.LocalNavController -import com.aiosman.ravenow.Messaging import com.aiosman.ravenow.R -import com.aiosman.ravenow.data.AccountServiceImpl import com.aiosman.ravenow.ui.NavigationRoute -import com.aiosman.ravenow.ui.comment.NoticeScreenHeader -import com.aiosman.ravenow.ui.composables.ActionButton import com.aiosman.ravenow.ui.composables.StatusBarSpacer -import com.aiosman.ravenow.ui.index.NavItem import com.aiosman.ravenow.ui.modifiers.noRippleClickable -import kotlinx.coroutines.launch + +private object AccountSettingConstants { + const val BACK_BUTTON_SIZE = 36 + const val BACK_BUTTON_ICON_SIZE = 24 + const val BACK_BUTTON_START_PADDING = 19 + const val OPTION_ITEM_HEIGHT = 56 + const val OPTION_ITEM_ICON_SIZE = 24 + const val OPTION_ITEM_HORIZONTAL_PADDING = 16 + const val OPTION_ITEM_ICON_TEXT_SPACING = 12 + const val OPTION_ITEM_TEXT_SIZE = 17 + const val HEADER_VERTICAL_PADDING = 16 + const val TITLE_OFFSET_X = 19 + const val CARD_CORNER_RADIUS = 16 +} + +@Composable +private fun CircularBackButton( + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + val appColors = LocalAppTheme.current + Box( + modifier = modifier + .size(AccountSettingConstants.BACK_BUTTON_SIZE.dp) + .background( + color = appColors.secondaryBackground, + shape = CircleShape + ) + .noRippleClickable { onClick() }, + contentAlignment = Alignment.Center + ) { + Image( + painter = painterResource(id = R.drawable.rider_pro_back_icon), + contentDescription = "返回", + modifier = Modifier.size(AccountSettingConstants.BACK_BUTTON_ICON_SIZE.dp), + colorFilter = ColorFilter.tint(appColors.text) + ) + } +} + +@Composable +private fun SecurityOptionItem( + iconRes: Int, + label: String, + onClick: () -> Unit, + applyColorFilter: Boolean = true +) { + val appColors = LocalAppTheme.current + Row( + modifier = Modifier + .fillMaxWidth() + .height(AccountSettingConstants.OPTION_ITEM_HEIGHT.dp) + .padding(horizontal = AccountSettingConstants.OPTION_ITEM_HORIZONTAL_PADDING.dp) + .noRippleClickable { onClick() }, + verticalAlignment = Alignment.CenterVertically + ) { + Image( + painter = painterResource(id = iconRes), + contentDescription = null, + modifier = Modifier.size(AccountSettingConstants.OPTION_ITEM_ICON_SIZE.dp), + colorFilter = if (applyColorFilter) ColorFilter.tint(appColors.text) else null + ) + Text( + text = label, + modifier = Modifier + .padding(start = AccountSettingConstants.OPTION_ITEM_ICON_TEXT_SPACING.dp) + .weight(1f), + color = appColors.text, + fontSize = AccountSettingConstants.OPTION_ITEM_TEXT_SIZE.sp, + fontWeight = FontWeight.Medium + ) + Image( + painter = painterResource(id = R.drawable.rave_now_nav_right), + contentDescription = null, + modifier = Modifier.size(AccountSettingConstants.OPTION_ITEM_ICON_SIZE.dp), + colorFilter = ColorFilter.tint(appColors.secondaryText) + ) + } +} @OptIn(ExperimentalMaterial3Api::class) @Composable fun AccountSetting() { val appColors = LocalAppTheme.current val navController = LocalNavController.current - val scope = rememberCoroutineScope() - val context = LocalContext.current Column( modifier = Modifier .fillMaxSize() .background(appColors.background), ) { StatusBarSpacer() + + // 顶部标题栏 Box( - modifier = Modifier.padding(horizontal = 24.dp, vertical = 16.dp) + modifier = Modifier + .fillMaxWidth() + .padding(vertical = AccountSettingConstants.HEADER_VERTICAL_PADDING.dp) ) { - NoticeScreenHeader( - title = stringResource(R.string.account_and_security), - moreIcon = false + CircularBackButton( + onClick = { navController.navigateUp() }, + modifier = Modifier.padding(start = AccountSettingConstants.BACK_BUTTON_START_PADDING.dp) + ) + Text( + text = stringResource(R.string.account_and_security), + fontWeight = FontWeight.W800, + fontSize = AccountSettingConstants.OPTION_ITEM_TEXT_SIZE.sp, + color = appColors.text, + modifier = Modifier + .align(Alignment.Center) + .offset(x = AccountSettingConstants.TITLE_OFFSET_X.dp) ) } + + // 安全选项卡片 Column( - modifier = Modifier.padding(start = 24.dp) + modifier = Modifier + .fillMaxWidth() + .background( + color = appColors.background, + shape = RoundedCornerShape(AccountSettingConstants.CARD_CORNER_RADIUS.dp) + ) ) { - Box( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 8.dp) - ) { - NavItem( - iconRes = R.mipmap.rider_pro_change_password, - label = stringResource(R.string.change_password), - modifier = Modifier.noRippleClickable { - navController.navigate(NavigationRoute.ChangePasswordScreen.route) - } - ) - } - - // 分割线 - Box( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(appColors.divider) + SecurityOptionItem( + iconRes = R.mipmap.icons_padlock, + label = stringResource(R.string.change_password), + onClick = { navController.navigate(NavigationRoute.ChangePasswordScreen.route) } ) - Box( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 8.dp) - ) { - NavItem( - iconRes = R.drawable.rider_pro_moment_delete, - label = stringResource(R.string.remove_account), - modifier = Modifier.noRippleClickable { - navController.navigate(NavigationRoute.RemoveAccountScreen.route) - } - ) - } - Box( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(appColors.divider) + + SecurityOptionItem( + iconRes = R.mipmap.icons_block, + label = stringResource(R.string.blocked_users), + onClick = { + // TODO: 导航到屏蔽用户页面 + } + ) + + SecurityOptionItem( + iconRes = R.mipmap.icons_remove, + label = stringResource(R.string.remove_account), + onClick = { navController.navigate(NavigationRoute.RemoveAccountScreen.route) }, + applyColorFilter = false ) } - } } \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoViewModel.kt b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoViewModel.kt index 2dd62b2..a989194 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoViewModel.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupChatInfoViewModel.kt @@ -9,9 +9,9 @@ import androidx.lifecycle.viewModelScope import com.aiosman.ravenow.AppStore import com.aiosman.ravenow.ChatState import com.aiosman.ravenow.data.api.ApiClient -import com.aiosman.ravenow.data.api.CreatePromptRuleRequestBody -import com.aiosman.ravenow.data.api.PromptRule -import com.aiosman.ravenow.data.api.PromptRuleQuota +import com.aiosman.ravenow.data.api.CreateAgentRuleRequestBody +import com.aiosman.ravenow.data.api.AgentRule +import com.aiosman.ravenow.data.api.AgentRuleQuota import com.aiosman.ravenow.data.parseErrorResponse import com.aiosman.ravenow.entity.ChatNotification import com.aiosman.ravenow.entity.GroupInfo @@ -33,8 +33,8 @@ class GroupChatInfoViewModel( val notificationStrategy get() = chatNotification?.strategy ?: "default" // 记忆管理相关状态 - var memoryQuota by mutableStateOf(null) - var memoryList by mutableStateOf>(emptyList()) + var memoryQuota by mutableStateOf(null) + var memoryList by mutableStateOf>(emptyList()) var isLoadingMemory by mutableStateOf(false) var memoryError by mutableStateOf(null) var promptOpenId by mutableStateOf(null) @@ -137,12 +137,12 @@ class GroupChatInfoViewModel( } // 创建智能体规则(群记忆) - val requestBody = CreatePromptRuleRequestBody( + val requestBody = CreateAgentRuleRequestBody( rule = memoryText, openId = openId ) - val response = ApiClient.api.createPromptRule(requestBody) + val response = ApiClient.api.createAgentRule(requestBody) if (response.isSuccessful) { addMemorySuccess = true @@ -184,14 +184,14 @@ class GroupChatInfoViewModel( ?: throw Exception("无法获取智能体信息") promptOpenId = fetchedOpenId - val quotaResponse = ApiClient.api.getPromptRuleQuota(fetchedOpenId) + val quotaResponse = ApiClient.api.getAgentRuleQuota(fetchedOpenId) if (quotaResponse.isSuccessful) { memoryQuota = quotaResponse.body()?.data } else { throw Exception("获取配额信息失败: ${quotaResponse.code()}") } } else { - val quotaResponse = ApiClient.api.getPromptRuleQuota(targetOpenId) + val quotaResponse = ApiClient.api.getAgentRuleQuota(targetOpenId) if (quotaResponse.isSuccessful) { memoryQuota = quotaResponse.body()?.data } else { @@ -226,14 +226,14 @@ class GroupChatInfoViewModel( ?: throw Exception("无法获取智能体信息") promptOpenId = fetchedOpenId - val listResponse = ApiClient.api.getPromptRuleList(fetchedOpenId, page = page, pageSize = pageSize) + val listResponse = ApiClient.api.getAgentRuleList(fetchedOpenId, page = page, pageSize = pageSize) if (listResponse.isSuccessful) { memoryList = listResponse.body()?.data?.list ?: emptyList() } else { throw Exception("获取记忆列表失败: ${listResponse.code()}") } } else { - val listResponse = ApiClient.api.getPromptRuleList(targetOpenId, page = page, pageSize = pageSize) + val listResponse = ApiClient.api.getAgentRuleList(targetOpenId, page = page, pageSize = pageSize) if (listResponse.isSuccessful) { memoryList = listResponse.body()?.data?.list ?: emptyList() } else { @@ -258,7 +258,7 @@ class GroupChatInfoViewModel( isLoadingMemory = true memoryError = null - val response = ApiClient.api.deletePromptRule(ruleId) + val response = ApiClient.api.deleteAgentRule(ruleId) if (response.isSuccessful) { // 刷新记忆列表和配额 promptOpenId?.let { openId -> @@ -292,13 +292,13 @@ class GroupChatInfoViewModel( val openId = targetOpenId ?: promptOpenId ?: throw Exception("无法获取智能体ID") - val requestBody = com.aiosman.ravenow.data.api.UpdatePromptRuleRequestBody( + val requestBody = com.aiosman.ravenow.data.api.UpdateAgentRuleRequestBody( id = ruleId, rule = newRuleText, openId = openId ) - val response = ApiClient.api.updatePromptRule(requestBody) + val response = ApiClient.api.updateAgentRule(requestBody) if (response.isSuccessful) { // 刷新记忆列表和配额 loadMemoryQuota(openId) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupMemoryManageScreen.kt b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupMemoryManageScreen.kt index 47af95c..3c19423 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/group/GroupMemoryManageScreen.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/group/GroupMemoryManageScreen.kt @@ -257,7 +257,7 @@ fun GroupMemoryManageContent( @OptIn(ExperimentalMaterial3Api::class) @Composable fun EditGroupMemoryDialog( - memory: com.aiosman.ravenow.data.api.PromptRule, + memory: com.aiosman.ravenow.data.api.AgentRule, viewModel: GroupChatInfoViewModel, onDismiss: () -> Unit, onUpdateMemory: (String) -> Unit @@ -403,7 +403,7 @@ fun EditGroupMemoryDialog( */ @Composable fun MemoryItem( - memory: com.aiosman.ravenow.data.api.PromptRule, + memory: com.aiosman.ravenow.data.api.AgentRule, isEditing: Boolean = false, onEdit: () -> Unit = {}, onCancel: () -> Unit = {}, From c100a8ceefc4c5f845e6f06c81f202cfb0864152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E5=B8=86?= <3031465419@qq.com> Date: Fri, 7 Nov 2025 21:25:02 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E7=95=8C=E9=9D=A2ui=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ravenow/ui/composables/TextInputField.kt | 105 +++++++---- .../aiosman/ravenow/ui/login/emailsignup.kt | 169 +++++++++++------- 2 files changed, 177 insertions(+), 97 deletions(-) diff --git a/app/src/main/java/com/aiosman/ravenow/ui/composables/TextInputField.kt b/app/src/main/java/com/aiosman/ravenow/ui/composables/TextInputField.kt index 3bcb007..3b4df82 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/composables/TextInputField.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/composables/TextInputField.kt @@ -43,6 +43,10 @@ import com.aiosman.ravenow.LocalAppTheme import com.aiosman.ravenow.R import com.aiosman.ravenow.ui.modifiers.noRippleClickable +private val LabelTextColor = Color(red = 60f / 255f, green = 60f / 255f, blue = 67f / 255f, alpha = 0.6f) +private val HintTextColor = Color(red = 60f / 255f, green = 60f / 255f, blue = 67f / 255f, alpha = 0.3f) +private val PasswordIconColor = Color(red = 17f / 255f, green = 12f / 255f, blue = 19f / 255f) + @Composable fun TextInputField( modifier: Modifier = Modifier, @@ -52,69 +56,96 @@ fun TextInputField( label: String? = null, hint: String? = null, error: String? = null, - enabled: Boolean = true + enabled: Boolean = true, + leadingIcon: @Composable (() -> Unit)? = null, + customBackgroundColor: Color? = null, + customCornerRadius: Float = 24f ) { val AppColors = LocalAppTheme.current var showPassword by remember { mutableStateOf(!password) } var isFocused by remember { mutableStateOf(false) } + val backgroundColor = customBackgroundColor ?: AppColors.inputBackground Column(modifier = modifier) { label?.let { - Text(it, color = AppColors.secondaryText) - Spacer(modifier = Modifier.height(16.dp)) + Text( + text = it, + color = LabelTextColor, + fontSize = 13.sp, + modifier = Modifier.padding(start = 8.dp, top = 8.dp, bottom = 8.dp) + ) } Box( contentAlignment = Alignment.CenterStart, modifier = Modifier - .clip(RoundedCornerShape(24.dp)) - .background(AppColors.inputBackground) + .clip(RoundedCornerShape(customCornerRadius.dp)) + .background(backgroundColor) .border( width = 2.dp, color = if (error == null) Color.Transparent else AppColors.error, - shape = RoundedCornerShape(24.dp) + shape = RoundedCornerShape(customCornerRadius.dp) ) .padding(horizontal = 16.dp, vertical = 16.dp) ) { - Row(verticalAlignment = Alignment.CenterVertically){ - BasicTextField( - value = text, - onValueChange = onValueChange, - modifier = Modifier - .weight(1f) - .onFocusChanged { focusState -> - isFocused = focusState.isFocused - }, - textStyle = TextStyle( - fontSize = 16.sp, - fontWeight = FontWeight.W500, - color = AppColors.text - ), - keyboardOptions = KeyboardOptions( - keyboardType = if (password) KeyboardType.Password else KeyboardType.Text - ), - visualTransformation = if (showPassword) VisualTransformation.None else PasswordVisualTransformation(), - singleLine = true, - enabled = enabled, - cursorBrush = SolidColor(AppColors.text), - ) + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ){ + leadingIcon?.let { + Box(modifier = Modifier.size(24.dp)) { + it() + } + Spacer(modifier = Modifier.size(12.dp)) + } + Box(modifier = Modifier.weight(1f)) { + BasicTextField( + value = text, + onValueChange = onValueChange, + modifier = Modifier + .fillMaxWidth() + .onFocusChanged { focusState -> + isFocused = focusState.isFocused + }, + textStyle = TextStyle( + fontSize = 16.sp, + fontWeight = FontWeight.W400, + color = AppColors.text + ), + keyboardOptions = KeyboardOptions( + keyboardType = if (password) KeyboardType.Password else KeyboardType.Email + ), + visualTransformation = if (showPassword) VisualTransformation.None else PasswordVisualTransformation(), + singleLine = true, + enabled = enabled, + cursorBrush = SolidColor(AppColors.text), + ) + if (text.isEmpty() && hint != null) { + Text( + text = hint, + color = HintTextColor, + fontSize = 16.sp, + fontWeight = FontWeight.W400 + ) + } + } if (password) { Image( - painter = painterResource(id = R.drawable.rider_pro_eye), + painter = painterResource( + id = if (showPassword) { + R.drawable.rider_pro_eye + } else { + R.mipmap.icon_eyes_closed_light + } + ), contentDescription = "Password", modifier = Modifier - .size(18.dp) + .size(24.dp) .noRippleClickable { showPassword = !showPassword }, - colorFilter = ColorFilter.tint(AppColors.text) + colorFilter = ColorFilter.tint(PasswordIconColor) ) } } - - if (text.isEmpty()) { - hint?.let { - Text(it, modifier = Modifier.padding(start = 5.dp), color = AppColors.inputHint, fontWeight = FontWeight.W600) - } - } } Spacer(modifier = Modifier.height(8.dp)) Row( diff --git a/app/src/main/java/com/aiosman/ravenow/ui/login/emailsignup.kt b/app/src/main/java/com/aiosman/ravenow/ui/login/emailsignup.kt index e0c6450..6ea5a26 100644 --- a/app/src/main/java/com/aiosman/ravenow/ui/login/emailsignup.kt +++ b/app/src/main/java/com/aiosman/ravenow/ui/login/emailsignup.kt @@ -1,15 +1,19 @@ package com.aiosman.ravenow.ui.login import android.widget.Toast +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.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -19,9 +23,13 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.aiosman.ravenow.AppState import com.aiosman.ravenow.AppStore import com.aiosman.ravenow.LocalAppTheme @@ -33,25 +41,28 @@ import com.aiosman.ravenow.data.ServiceException import com.aiosman.ravenow.data.AccountServiceImpl import com.aiosman.ravenow.data.api.getErrorMessageCode import com.aiosman.ravenow.ui.NavigationRoute -import com.aiosman.ravenow.ui.comment.NoticeScreenHeader import com.aiosman.ravenow.ui.composables.ActionButton import com.aiosman.ravenow.ui.composables.CheckboxWithLabel import com.aiosman.ravenow.ui.composables.PolicyCheckbox import com.aiosman.ravenow.ui.composables.StatusBarSpacer import com.aiosman.ravenow.ui.composables.TextInputField +import com.aiosman.ravenow.ui.modifiers.noRippleClickable import com.aiosman.ravenow.utils.PasswordValidator import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +private val LightGrayBackground = Color(red = 250f / 255f, green = 249f / 255f, blue = 251f / 255f) +private val IconGray = Color(red = 151f / 255f, green = 148f / 255f, blue = 153f / 255f) +private val PurpleButton = Color(0xFF7C45ED) + @Composable fun EmailSignupScreen() { - var appColor = LocalAppTheme.current + val appColor = LocalAppTheme.current var email by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } var confirmPassword by remember { mutableStateOf("") } var rememberMe by remember { mutableStateOf(false) } var acceptTerms by remember { mutableStateOf(false) } - var acceptPromotions by remember { mutableStateOf(false) } val scope = rememberCoroutineScope() val navController = LocalNavController.current val context = LocalContext.current @@ -60,7 +71,6 @@ fun EmailSignupScreen() { var passwordError by remember { mutableStateOf(null) } var confirmPasswordError by remember { mutableStateOf(null) } var termsError by remember { mutableStateOf(false) } - var promotionsError by remember { mutableStateOf(false) } fun validateForm(): Boolean { emailError = when { // 非空 @@ -88,22 +98,8 @@ fun EmailSignupScreen() { } termsError = true return false - } else { - termsError = false - } - if (!acceptPromotions) { - scope.launch(Dispatchers.Main) { - Toast.makeText( - context, - context.getString(R.string.error_not_accept_recive_notice), - Toast.LENGTH_SHORT - ).show() - } - promotionsError = true - return false - } else { - promotionsError = false } + termsError = false return emailError == null && passwordError == null && confirmPasswordError == null } @@ -158,63 +154,127 @@ fun EmailSignupScreen() { } Column( - horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier .fillMaxSize() .background(appColor.background) ) { StatusBarSpacer() - Box( + // 顶部导航栏:返回箭头 + "注册"标题,左对齐 + Row( modifier = Modifier .fillMaxWidth() - .padding(top = 16.dp, start = 16.dp, end = 16.dp) + .padding(top = 15.dp, start = 16.dp, bottom = 15.dp, end = 16.dp), + verticalAlignment = Alignment.CenterVertically ) { - NoticeScreenHeader(stringResource(R.string.sign_up_upper), moreIcon = false) + Image( + painter = painterResource(id = R.drawable.rider_pro_back_icon), + contentDescription = "Back", + modifier = Modifier + .size(24.dp) + .noRippleClickable { + navController.navigateUp() + }, + colorFilter = ColorFilter.tint(Color.Black) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = stringResource(R.string.sign_up_upper), + fontSize = 20.sp, + fontWeight = FontWeight.W600, + color = Color.Black + ) } - Spacer(modifier = Modifier.padding(32.dp)) + + // 输入区域 Column( modifier = Modifier .fillMaxWidth() .weight(1f) - .padding(horizontal = 24.dp) + .padding(horizontal = 0.dp) ) { + Spacer(modifier = Modifier.height(16.dp)) + + // 邮箱输入框 TextInputField( modifier = Modifier - .fillMaxWidth(), + .fillMaxWidth() + .padding(horizontal = 24.dp), text = email, onValueChange = { email = it }, - hint = stringResource(R.string.text_hint_email), - error = emailError + label = stringResource(R.string.login_email_label), + hint = "输入电子邮件", + error = emailError, + leadingIcon = { + Image( + painter = painterResource(id = R.mipmap.icon_email_light), + contentDescription = "Email", + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(IconGray) + ) + }, + customBackgroundColor = LightGrayBackground, + customCornerRadius = 16f ) - Spacer(modifier = Modifier.padding(4.dp)) + + // 密码输入框 TextInputField( modifier = Modifier - .fillMaxWidth(), + .fillMaxWidth() + .padding(horizontal = 24.dp), text = password, onValueChange = { password = it }, password = true, + label = stringResource(R.string.text_hint_password).replace("输入", ""), hint = stringResource(R.string.text_hint_password), - error = passwordError + error = passwordError, + leadingIcon = { + Image( + painter = painterResource(id = R.mipmap.icon_lock_light), + contentDescription = "Lock", + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(IconGray) + ) + }, + customBackgroundColor = LightGrayBackground, + customCornerRadius = 16f ) - Spacer(modifier = Modifier.padding(4.dp)) + + // 确认密码输入框 TextInputField( modifier = Modifier - .fillMaxWidth(), + .fillMaxWidth() + .padding(horizontal = 24.dp), text = confirmPassword, onValueChange = { confirmPassword = it }, password = true, - hint = stringResource(R.string.text_hint_confirm_password), - error = confirmPasswordError + label = stringResource(R.string.confirm_password_label), + hint = stringResource(R.string.text_hint_password), + error = confirmPasswordError, + leadingIcon = { + Image( + painter = painterResource(id = R.mipmap.icon_lock_light), + contentDescription = "Lock", + modifier = Modifier.size(24.dp), + colorFilter = ColorFilter.tint(IconGray) + ) + }, + customBackgroundColor = LightGrayBackground, + customCornerRadius = 16f ) - Spacer(modifier = Modifier.height(8.dp)) + + Spacer(modifier = Modifier.height(16.dp)) + + // 功能选项区域 Column( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp), horizontalAlignment = Alignment.Start, ) { CheckboxWithLabel( @@ -236,42 +296,31 @@ fun EmailSignupScreen() { termsError = false } } - Spacer(modifier = Modifier.height(16.dp)) - CheckboxWithLabel( - checked = acceptPromotions, - checkSize = 16, - fontSize = 12, - label = stringResource(R.string.agree_promotion), - error = promotionsError - ) { - acceptPromotions = it - // 当用户勾选时,立即清除错误状态 - if (it) { - promotionsError = false - } - } } - Spacer(modifier = Modifier.height(32.dp)) + Spacer(modifier = Modifier.height(76.dp)) + + // 底部注册按钮 Box( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp), contentAlignment = Alignment.Center ) { ActionButton( - modifier = Modifier - .width(345.dp), - text = stringResource(R.string.lets_ride_upper), - backgroundColor = Color(0xffda3832), - color = Color.White + modifier = Modifier.fillMaxWidth(), + text = stringResource(R.string.sign_up_upper), + backgroundColor = PurpleButton, + color = Color.White, + fontSize = 17.sp, + fontWeight = FontWeight.W600 ) { scope.launch(Dispatchers.IO) { registerUser() } } } - } - } } \ No newline at end of file