cleanup: 提取 Activity 基类、修复 Compose 状态、精简资源
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) <noreply@anthropic.com>
This commit is contained in:
parent
5bac114c16
commit
dead12fdf4
@ -1,46 +1,19 @@
|
|||||||
package plus.rua.project
|
package plus.rua.project
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.enableEdgeToEdge
|
|
||||||
import plus.rua.project.ui.AboutScreen
|
import plus.rua.project.ui.AboutScreen
|
||||||
|
|
||||||
class AboutActivity : ComponentActivity() {
|
class AboutActivity : BaseActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
enableEdgeToEdge()
|
|
||||||
super.onCreate(savedInstanceState)
|
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 {
|
setContent {
|
||||||
AboutScreen(
|
AboutScreen(
|
||||||
onBack = {
|
onBack = { finishWithSlideBack() },
|
||||||
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)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onNavigateToLicenses = {
|
onNavigateToLicenses = {
|
||||||
startActivity(Intent(this, LicensesActivity::class.java))
|
startActivityWithSlide(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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
60
app/src/main/kotlin/plus/rua/project/BaseActivity.kt
Normal file
60
app/src/main/kotlin/plus/rua/project/BaseActivity.kt
Normal file
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,39 +1,16 @@
|
|||||||
package plus.rua.project
|
package plus.rua.project
|
||||||
|
|
||||||
import android.os.Build
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.enableEdgeToEdge
|
|
||||||
import plus.rua.project.ui.DateCheckerScreen
|
import plus.rua.project.ui.DateCheckerScreen
|
||||||
|
|
||||||
class DateCheckerActivity : ComponentActivity() {
|
class DateCheckerActivity : BaseActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
enableEdgeToEdge()
|
|
||||||
super.onCreate(savedInstanceState)
|
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 {
|
setContent {
|
||||||
DateCheckerScreen(
|
DateCheckerScreen(
|
||||||
onBack = {
|
onBack = { finishWithSlideBack() }
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,39 +1,16 @@
|
|||||||
package plus.rua.project
|
package plus.rua.project
|
||||||
|
|
||||||
import android.os.Build
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.enableEdgeToEdge
|
|
||||||
import plus.rua.project.ui.LicensesScreen
|
import plus.rua.project.ui.LicensesScreen
|
||||||
|
|
||||||
class LicensesActivity : ComponentActivity() {
|
class LicensesActivity : BaseActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
enableEdgeToEdge()
|
|
||||||
super.onCreate(savedInstanceState)
|
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 {
|
setContent {
|
||||||
LicensesScreen(
|
LicensesScreen(
|
||||||
onBack = {
|
onBack = { finishWithSlideBack() }
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,34 +1,21 @@
|
|||||||
package plus.rua.project
|
package plus.rua.project
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.enableEdgeToEdge
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import plus.rua.project.ui.CalendarMonthView
|
import plus.rua.project.ui.CalendarMonthView
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : BaseActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
enableEdgeToEdge()
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
setContent {
|
setContent {
|
||||||
CalendarMonthView(
|
CalendarMonthView(
|
||||||
onNavigateToAbout = {
|
onNavigateToAbout = {
|
||||||
startActivity(Intent(this, AboutActivity::class.java))
|
startActivityWithSlide(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)
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
onNavigateToTools = {
|
onNavigateToTools = {
|
||||||
startActivity(Intent(this, ToolsActivity::class.java))
|
startActivityWithSlide(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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,46 +1,19 @@
|
|||||||
package plus.rua.project
|
package plus.rua.project
|
||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.enableEdgeToEdge
|
|
||||||
import plus.rua.project.ui.ToolsScreen
|
import plus.rua.project.ui.ToolsScreen
|
||||||
|
|
||||||
class ToolsActivity : ComponentActivity() {
|
class ToolsActivity : BaseActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
enableEdgeToEdge()
|
|
||||||
super.onCreate(savedInstanceState)
|
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 {
|
setContent {
|
||||||
ToolsScreen(
|
ToolsScreen(
|
||||||
onBack = {
|
onBack = { finishWithSlideBack() },
|
||||||
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)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onNavigateToDateChecker = {
|
onNavigateToDateChecker = {
|
||||||
startActivity(Intent(this, DateCheckerActivity::class.java))
|
startActivityWithSlide(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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 7.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.5 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.5 KiB |
@ -66,6 +66,7 @@ import androidx.compose.ui.input.pointer.pointerInput
|
|||||||
import androidx.compose.ui.layout.onSizeChanged
|
import androidx.compose.ui.layout.onSizeChanged
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.datetime.DatePeriod
|
import kotlinx.datetime.DatePeriod
|
||||||
import kotlinx.datetime.LocalDate
|
import kotlinx.datetime.LocalDate
|
||||||
@ -568,19 +569,21 @@ private fun BottomCardArea(
|
|||||||
label = "bottomCardSlide"
|
label = "bottomCardSlide"
|
||||||
)
|
)
|
||||||
|
|
||||||
// P0-J: 延迟一帧显示 BottomCard,避免 AnimatedGif 和 lunar 计算阻塞首帧
|
// 延迟一帧显示 BottomCard,避免 AnimatedGif 和 lunar 计算阻塞首帧
|
||||||
var frameCount by remember { mutableIntStateOf(0) }
|
var hasLoaded by remember { mutableStateOf(false) }
|
||||||
androidx.compose.runtime.SideEffect { frameCount++ }
|
LaunchedEffect(Unit) {
|
||||||
val shouldShow = frameCount >= 2
|
delay(32)
|
||||||
|
hasLoaded = true
|
||||||
|
}
|
||||||
|
val shouldShow = hasLoaded
|
||||||
|
|
||||||
val selectedDate by viewModel.selectedDate.collectAsState()
|
val uiState by viewModel.uiState.collectAsState()
|
||||||
val isCollapsed by viewModel.isCollapsed.collectAsState()
|
val shiftKind = viewModel.shiftKindAt(uiState.selectedDate)
|
||||||
val shiftKind = viewModel.shiftKindAt(selectedDate)
|
|
||||||
|
|
||||||
if (shouldShow) {
|
if (shouldShow) {
|
||||||
BottomCard(
|
BottomCard(
|
||||||
isCollapsed = isCollapsed,
|
isCollapsed = uiState.isCollapsed,
|
||||||
selectedDate = selectedDate,
|
selectedDate = uiState.selectedDate,
|
||||||
today = today,
|
today = today,
|
||||||
shiftKind = shiftKind,
|
shiftKind = shiftKind,
|
||||||
onDrag = { delta -> viewModel.onDrag(delta) },
|
onDrag = { delta -> viewModel.onDrag(delta) },
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user