From 93c02810bf99db0038046ce32259ace2ab50972a Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 25 May 2026 10:24:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B7=A5=E5=85=B7=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0"=E6=97=A5=E6=9C=9F=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E5=99=A8"=E5=85=A5=E5=8F=A3=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E8=AF=A6=E6=83=85=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- app/src/main/AndroidManifest.xml | 4 + .../plus/rua/project/DateCheckerActivity.kt | 40 ++++++++++ .../kotlin/plus/rua/project/ToolsActivity.kt | 8 ++ .../plus/rua/project/ui/DateCheckerScreen.kt | 76 +++++++++++++++++++ .../kotlin/plus/rua/project/ui/ToolsScreen.kt | 50 +++++++++--- 5 files changed, 169 insertions(+), 9 deletions(-) create mode 100644 app/src/main/kotlin/plus/rua/project/DateCheckerActivity.kt create mode 100644 core/src/main/kotlin/plus/rua/project/ui/DateCheckerScreen.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fc9ccde..48d759b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,6 +30,10 @@ + + \ No newline at end of file diff --git a/app/src/main/kotlin/plus/rua/project/DateCheckerActivity.kt b/app/src/main/kotlin/plus/rua/project/DateCheckerActivity.kt new file mode 100644 index 0000000..da23fe8 --- /dev/null +++ b/app/src/main/kotlin/plus/rua/project/DateCheckerActivity.kt @@ -0,0 +1,40 @@ +package plus.rua.project + +import android.os.Build +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import plus.rua.project.ui.DateCheckerScreen + +class DateCheckerActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() + super.onCreate(savedInstanceState) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + overrideActivityTransition( + OVERRIDE_TRANSITION_OPEN, + R.anim.slide_in_right, + R.anim.slide_out_left + ) + overrideActivityTransition( + OVERRIDE_TRANSITION_CLOSE, + R.anim.slide_in_left, + R.anim.slide_out_right + ) + } + + setContent { + DateCheckerScreen( + onBack = { + finish() + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + @Suppress("DEPRECATION") + overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right) + } + } + ) + } + } +} diff --git a/app/src/main/kotlin/plus/rua/project/ToolsActivity.kt b/app/src/main/kotlin/plus/rua/project/ToolsActivity.kt index e7b451d..b35b370 100644 --- a/app/src/main/kotlin/plus/rua/project/ToolsActivity.kt +++ b/app/src/main/kotlin/plus/rua/project/ToolsActivity.kt @@ -1,5 +1,6 @@ package plus.rua.project +import android.content.Intent import android.os.Build import android.os.Bundle import androidx.activity.ComponentActivity @@ -33,6 +34,13 @@ class ToolsActivity : ComponentActivity() { @Suppress("DEPRECATION") overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right) } + }, + onNavigateToDateChecker = { + startActivity(Intent(this, DateCheckerActivity::class.java)) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + @Suppress("DEPRECATION") + overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left) + } } ) } diff --git a/core/src/main/kotlin/plus/rua/project/ui/DateCheckerScreen.kt b/core/src/main/kotlin/plus/rua/project/ui/DateCheckerScreen.kt new file mode 100644 index 0000000..c97e73d --- /dev/null +++ b/core/src/main/kotlin/plus/rua/project/ui/DateCheckerScreen.kt @@ -0,0 +1,76 @@ +package plus.rua.project.ui + +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.StrokeCap +import androidx.compose.ui.unit.dp + +/** + * 日期检查器页面。 + * + * @param onBack 返回回调 + * @param modifier 布局修饰符 + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DateCheckerScreen( + onBack: () -> Unit, + modifier: Modifier = Modifier +) { + Scaffold( + topBar = { + TopAppBar( + title = { Text("日期检查器") }, + navigationIcon = { + IconButton(onClick = onBack) { + val arrowColor = MaterialTheme.colorScheme.onSurface + Canvas(modifier = Modifier.size(24.dp)) { + val strokeWidth = 2.dp.toPx() + drawLine( + color = arrowColor, + start = Offset(size.width * 0.75f, size.height * 0.15f), + end = Offset(size.width * 0.25f, size.height * 0.5f), + strokeWidth = strokeWidth, + cap = StrokeCap.Round + ) + drawLine( + color = arrowColor, + start = Offset(size.width * 0.25f, size.height * 0.5f), + end = Offset(size.width * 0.75f, size.height * 0.85f), + strokeWidth = strokeWidth, + cap = StrokeCap.Round + ) + } + } + } + ) + }, + modifier = modifier + ) { innerPadding -> + Box( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding), + contentAlignment = Alignment.Center + ) { + Text( + text = "日期检查器", + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } +} diff --git a/core/src/main/kotlin/plus/rua/project/ui/ToolsScreen.kt b/core/src/main/kotlin/plus/rua/project/ui/ToolsScreen.kt index f8e5658..8335906 100644 --- a/core/src/main/kotlin/plus/rua/project/ui/ToolsScreen.kt +++ b/core/src/main/kotlin/plus/rua/project/ui/ToolsScreen.kt @@ -1,10 +1,17 @@ package plus.rua.project.ui import androidx.compose.foundation.Canvas -import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +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.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -12,7 +19,6 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.StrokeCap @@ -22,12 +28,14 @@ import androidx.compose.ui.unit.dp * 工具页面,提供实用工具功能入口。 * * @param onBack 返回回调 + * @param onNavigateToDateChecker 跳转到日期检查器回调 * @param modifier 布局修饰符 */ @OptIn(ExperimentalMaterial3Api::class) @Composable fun ToolsScreen( onBack: () -> Unit, + onNavigateToDateChecker: () -> Unit, modifier: Modifier = Modifier ) { Scaffold( @@ -60,17 +68,41 @@ fun ToolsScreen( }, modifier = modifier ) { innerPadding -> - Box( + Column( modifier = Modifier .fillMaxSize() - .padding(innerPadding), - contentAlignment = Alignment.Center + .padding(innerPadding) + .padding(horizontal = 16.dp, vertical = 12.dp) ) { - Text( - text = "敬请期待", - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurfaceVariant + ToolItem( + title = "日期检查器", + onClick = onNavigateToDateChecker ) } } } + +@Composable +private fun ToolItem( + title: String, + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + Card( + shape = RoundedCornerShape(16.dp), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surfaceContainerHigh + ), + elevation = CardDefaults.cardElevation(defaultElevation = 0.dp), + modifier = modifier + .fillMaxWidth() + .clickable(onClick = onClick) + ) { + Text( + text = title, + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier.padding(horizontal = 20.dp, vertical = 18.dp) + ) + } +}