From dead12fdf485f543172ad61b0c71a66106d4adbd Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 25 May 2026 15:08:00 +0800 Subject: [PATCH] =?UTF-8?q?cleanup:=20=E6=8F=90=E5=8F=96=20Activity=20?= =?UTF-8?q?=E5=9F=BA=E7=B1=BB=E3=80=81=E4=BF=AE=E5=A4=8D=20Compose=20?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E3=80=81=E7=B2=BE=E7=AE=80=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A. 提取 Activity 共用代码: - 新增 BaseActivity 基类,统一处理 enableEdgeToEdge 和 slide 转场动画 - 5 个子 Activity 从 ~212 行简化为 ~50 行,减少 150+ 行重复代码 B. 修复 Compose 状态问题: - BottomCardArea: 移除对 selectedDate/isCollapsed 的独立 StateFlow 订阅, 统一使用 uiState 聚合流 - 替换脆弱的 SideEffect 帧计数器为显式 LaunchedEffect + delay(32) C. 资源精简: - 删除 mipmap-mdpi 和 mipmap-hdpi 密度(现代设备已被覆盖) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../kotlin/plus/rua/project/AboutActivity.kt | 33 +--------- .../kotlin/plus/rua/project/BaseActivity.kt | 60 ++++++++++++++++++ .../plus/rua/project/DateCheckerActivity.kt | 27 +------- .../plus/rua/project/LicensesActivity.kt | 27 +------- .../kotlin/plus/rua/project/MainActivity.kt | 19 +----- .../kotlin/plus/rua/project/ToolsActivity.kt | 33 +--------- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 7150 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 7150 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 3559 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 3559 -> 0 bytes .../plus/rua/project/ui/CalendarMonthView.kt | 21 +++--- 11 files changed, 85 insertions(+), 135 deletions(-) create mode 100644 app/src/main/kotlin/plus/rua/project/BaseActivity.kt delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/app/src/main/kotlin/plus/rua/project/AboutActivity.kt b/app/src/main/kotlin/plus/rua/project/AboutActivity.kt index 50a6839..ccb49b2 100644 --- a/app/src/main/kotlin/plus/rua/project/AboutActivity.kt +++ b/app/src/main/kotlin/plus/rua/project/AboutActivity.kt @@ -1,46 +1,19 @@ package plus.rua.project import android.content.Intent -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.AboutScreen -class AboutActivity : ComponentActivity() { +class AboutActivity : BaseActivity() { 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 { AboutScreen( - 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) - } - }, + onBack = { finishWithSlideBack() }, onNavigateToLicenses = { - startActivity(Intent(this, LicensesActivity::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) - } + startActivityWithSlide(Intent(this, LicensesActivity::class.java)) } ) } diff --git a/app/src/main/kotlin/plus/rua/project/BaseActivity.kt b/app/src/main/kotlin/plus/rua/project/BaseActivity.kt new file mode 100644 index 0000000..b55df0f --- /dev/null +++ b/app/src/main/kotlin/plus/rua/project/BaseActivity.kt @@ -0,0 +1,60 @@ +package plus.rua.project + +import android.os.Build +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.enableEdgeToEdge +import androidx.annotation.AnimRes + +/** + * 提供 edge-to-edge 和 slide 转场动画的 Activity 基类。 + */ +abstract class BaseActivity : 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 + ) + } + } + + /** + * 带 slide 返回动画的 finish。 + */ + protected fun finishWithSlideBack( + @AnimRes enterAnim: Int = R.anim.slide_in_left, + @AnimRes exitAnim: Int = R.anim.slide_out_right + ) { + finish() + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + @Suppress("DEPRECATION") + overridePendingTransition(enterAnim, exitAnim) + } + } + + /** + * 带 slide 进入动画的 startActivity。 + */ + protected fun startActivityWithSlide( + intent: android.content.Intent, + @AnimRes enterAnim: Int = R.anim.slide_in_right, + @AnimRes exitAnim: Int = R.anim.slide_out_left + ) { + startActivity(intent) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + @Suppress("DEPRECATION") + overridePendingTransition(enterAnim, exitAnim) + } + } +} diff --git a/app/src/main/kotlin/plus/rua/project/DateCheckerActivity.kt b/app/src/main/kotlin/plus/rua/project/DateCheckerActivity.kt index da23fe8..4251318 100644 --- a/app/src/main/kotlin/plus/rua/project/DateCheckerActivity.kt +++ b/app/src/main/kotlin/plus/rua/project/DateCheckerActivity.kt @@ -1,39 +1,16 @@ 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() { +class DateCheckerActivity : BaseActivity() { 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) - } - } + onBack = { finishWithSlideBack() } ) } } diff --git a/app/src/main/kotlin/plus/rua/project/LicensesActivity.kt b/app/src/main/kotlin/plus/rua/project/LicensesActivity.kt index 4e25155..cafcaf8 100644 --- a/app/src/main/kotlin/plus/rua/project/LicensesActivity.kt +++ b/app/src/main/kotlin/plus/rua/project/LicensesActivity.kt @@ -1,39 +1,16 @@ 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.LicensesScreen -class LicensesActivity : ComponentActivity() { +class LicensesActivity : BaseActivity() { 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 { LicensesScreen( - 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) - } - } + onBack = { finishWithSlideBack() } ) } } diff --git a/app/src/main/kotlin/plus/rua/project/MainActivity.kt b/app/src/main/kotlin/plus/rua/project/MainActivity.kt index fd0c63a..5851be4 100644 --- a/app/src/main/kotlin/plus/rua/project/MainActivity.kt +++ b/app/src/main/kotlin/plus/rua/project/MainActivity.kt @@ -1,34 +1,21 @@ package plus.rua.project import android.content.Intent -import android.os.Build import android.os.Bundle -import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.compose.runtime.Composable import plus.rua.project.ui.CalendarMonthView -class MainActivity : ComponentActivity() { +class MainActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { - enableEdgeToEdge() super.onCreate(savedInstanceState) setContent { CalendarMonthView( onNavigateToAbout = { - startActivity(Intent(this, AboutActivity::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) - } + startActivityWithSlide(Intent(this, AboutActivity::class.java)) }, onNavigateToTools = { - startActivity(Intent(this, ToolsActivity::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) - } + startActivityWithSlide(Intent(this, ToolsActivity::class.java)) } ) } diff --git a/app/src/main/kotlin/plus/rua/project/ToolsActivity.kt b/app/src/main/kotlin/plus/rua/project/ToolsActivity.kt index b35b370..6aac5c5 100644 --- a/app/src/main/kotlin/plus/rua/project/ToolsActivity.kt +++ b/app/src/main/kotlin/plus/rua/project/ToolsActivity.kt @@ -1,46 +1,19 @@ package plus.rua.project import android.content.Intent -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.ToolsScreen -class ToolsActivity : ComponentActivity() { +class ToolsActivity : BaseActivity() { 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 { ToolsScreen( - 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) - } - }, + onBack = { finishWithSlideBack() }, 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) - } + startActivityWithSlide(Intent(this, DateCheckerActivity::class.java)) } ) } diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 99710cbc5e3a6e116fbaf9288012e7d19e6e9ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7150 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 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 99710cbc5e3a6e116fbaf9288012e7d19e6e9ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7150 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 2b7d06b55e7e1c4e4a481db1336f584529a80804..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3559 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 hU7HI+R~LZe~{8cDkqgzFQTYs{4AE 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 hU7HI+R~LZe~= 2 + // 延迟一帧显示 BottomCard,避免 AnimatedGif 和 lunar 计算阻塞首帧 + var hasLoaded by remember { mutableStateOf(false) } + LaunchedEffect(Unit) { + delay(32) + hasLoaded = true + } + val shouldShow = hasLoaded - val selectedDate by viewModel.selectedDate.collectAsState() - val isCollapsed by viewModel.isCollapsed.collectAsState() - val shiftKind = viewModel.shiftKindAt(selectedDate) + val uiState by viewModel.uiState.collectAsState() + val shiftKind = viewModel.shiftKindAt(uiState.selectedDate) if (shouldShow) { BottomCard( - isCollapsed = isCollapsed, - selectedDate = selectedDate, + isCollapsed = uiState.isCollapsed, + selectedDate = uiState.selectedDate, today = today, shiftKind = shiftKind, onDrag = { delta -> viewModel.onDrag(delta) },