From 4d7bade5ae5fb9f8ef856253006c7d0b6ee660c1 Mon Sep 17 00:00:00 2001 From: yibo Date: Fri, 5 Jun 2026 17:51:57 +0800 Subject: [PATCH] refactor(lifelog): 底部精简为 5 tab,录音/时间轴、声纹/纪要 各并为顶部子 tab --- lifelog-recorder/app/src/main/kotlin/com/lemon/lifelog/MainActivity.kt | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 77 insertions(+), 29 deletions(-) diff --git a/lifelog-recorder/app/src/main/kotlin/com/lemon/lifelog/MainActivity.kt b/lifelog-recorder/app/src/main/kotlin/com/lemon/lifelog/MainActivity.kt index c66703b..078f70f 100644 --- a/lifelog-recorder/app/src/main/kotlin/com/lemon/lifelog/MainActivity.kt +++ b/lifelog-recorder/app/src/main/kotlin/com/lemon/lifelog/MainActivity.kt @@ -121,11 +121,9 @@ class MainActivity : ComponentActivity() { } private enum class Tab(val label: String, val icon: String) { - Home("录音", "⏺"), + Recording("录音", "⏺"), // 顶部子页:录音 / 时间轴 Chat("对话", "💬"), - Timeline("时间轴", "≣"), - Speakers("声纹", "👤"), - Summaries("纪要", "✎"), + Memo("纪要", "✎"), // 顶部子页:声纹 / 纪要 Photolog("相册", "🖼"), Settings("设置", "⚙"), } @@ -145,14 +143,17 @@ enum class TimeFilter(val label: String) { @Composable private fun MainScreen() { - var tab by remember { mutableStateOf(Tab.Home) } + var tab by remember { mutableStateOf(Tab.Recording) } val activity = androidx.compose.ui.platform.LocalContext.current val repo = remember(activity) { Repository(activity) } - // Cross-tab state: speaker filter is settable from the Speakers tab. + // Cross-tab state: speaker filter is settable from the Speakers sub-tab. var filterSpeakerId by remember { mutableStateOf(null) } // Cross-tab jump: a summary bullet sets an absolute timestamp to scroll the timeline to. var jumpToTs by remember { mutableStateOf(null) } + // 合并页的顶部子 tab:录音页 0=录音 1=时间轴;纪要页 0=声纹 1=纪要。 + var recordingSub by remember { mutableStateOf(0) } + var memoSub by remember { mutableStateOf(0) } val speakers by repo.speakers.observeAll().collectAsState(initial = emptyList()) @@ -174,35 +175,82 @@ private fun MainScreen() { ) { inner -> Box(modifier = Modifier.padding(inner)) { when (tab) { - Tab.Home -> HomeTab(activity, repo, onOpenTimeline = { tab = Tab.Timeline }) + Tab.Recording -> RecordingScreen( + activity = activity, repo = repo, speakers = speakers, + sub = recordingSub, onSub = { recordingSub = it }, + filterSpeakerId = filterSpeakerId, onFilterSpeakerId = { filterSpeakerId = it }, + jumpToTs = jumpToTs, onJumpConsumed = { jumpToTs = null }, + ) Tab.Chat -> ChatTab(repo) - Tab.Timeline -> TimelineTab( + Tab.Memo -> MemoScreen( + repo = repo, activity = activity, speakers = speakers, + sub = memoSub, onSub = { memoSub = it }, + onFilterBySpeaker = { id -> filterSpeakerId = id; recordingSub = 1; tab = Tab.Recording }, + onJumpToTime = { ts -> filterSpeakerId = null; jumpToTs = ts; recordingSub = 1; tab = Tab.Recording }, + ) + Tab.Photolog -> PhotologTab(repo) + Tab.Settings -> SettingsScreen(activity) + } + } + } +} + +// ============================================================ 合并页(顶部子 tab 切换) + +@Composable +private fun RecordingScreen( + activity: Context, + repo: Repository, + speakers: List, + sub: Int, + onSub: (Int) -> Unit, + filterSpeakerId: Long?, + onFilterSpeakerId: (Long?) -> Unit, + jumpToTs: Long?, + onJumpConsumed: () -> Unit, +) { + Column(modifier = Modifier.fillMaxSize()) { + androidx.compose.material3.TabRow(selectedTabIndex = sub) { + androidx.compose.material3.Tab(selected = sub == 0, onClick = { onSub(0) }, text = { Text("录音") }) + androidx.compose.material3.Tab(selected = sub == 1, onClick = { onSub(1) }, text = { Text("时间轴") }) + } + Box(modifier = Modifier.weight(1f)) { + if (sub == 0) { + HomeTab(activity, repo, onOpenTimeline = { onSub(1) }) + } else { + TimelineTab( repo = repo, speakers = speakers, filterSpeakerId = filterSpeakerId, - onFilterSpeakerId = { filterSpeakerId = it }, + onFilterSpeakerId = onFilterSpeakerId, jumpToTs = jumpToTs, - onJumpConsumed = { jumpToTs = null }, + onJumpConsumed = onJumpConsumed, ) - Tab.Speakers -> SpeakersTab( - repo = repo, - speakers = speakers, - onFilterBySpeaker = { id -> - filterSpeakerId = id - tab = Tab.Timeline - }, - ) - Tab.Summaries -> SummariesTab( - repo = repo, - activity = activity, - onJumpToTime = { ts -> - filterSpeakerId = null - jumpToTs = ts - tab = Tab.Timeline - }, - ) - Tab.Photolog -> PhotologTab(repo) - Tab.Settings -> SettingsScreen(activity) + } + } + } +} + +@Composable +private fun MemoScreen( + repo: Repository, + activity: Context, + speakers: List, + sub: Int, + onSub: (Int) -> Unit, + onFilterBySpeaker: (Long) -> Unit, + onJumpToTime: (Long) -> Unit, +) { + Column(modifier = Modifier.fillMaxSize()) { + androidx.compose.material3.TabRow(selectedTabIndex = sub) { + androidx.compose.material3.Tab(selected = sub == 0, onClick = { onSub(0) }, text = { Text("声纹") }) + androidx.compose.material3.Tab(selected = sub == 1, onClick = { onSub(1) }, text = { Text("纪要") }) + } + Box(modifier = Modifier.weight(1f)) { + if (sub == 0) { + SpeakersTab(repo = repo, speakers = speakers, onFilterBySpeaker = onFilterBySpeaker) + } else { + SummariesTab(repo = repo, activity = activity, onJumpToTime = onJumpToTime) } } } -- libgit2 0.21.4