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 05aeea9..3942fa5 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,9 +121,8 @@ class MainActivity : ComponentActivity() { private enum class Tab(val label: String, val icon: String) { People("人物", "👤"), // 通讯录 + 联系人档案(CRM 核心,放第一位) - Recording("录音", "⏺"), // 顶部子页:录音 / 时间轴 + Recording("录音", "⏺"), // 顶部子页:录音 / 时间轴 / 声纹 / 纪要 Chat("对话", "💬"), - Memo("纪要", "✎"), // 顶部子页:声纹 / 纪要 Album("相册", "🖼"), Settings("设置", "⚙"), } @@ -151,9 +150,8 @@ private fun MainScreen() { 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=纪要。 + // 录音页顶部子 tab:0=录音 1=时间轴 2=声纹 3=纪要(声纹/纪要原是「纪要」菜单,已并入此处)。 var recordingSub by remember { mutableStateOf(0) } - var memoSub by remember { mutableStateOf(0) } val speakers by repo.speakers.observeAll().collectAsState(initial = emptyList()) @@ -181,14 +179,9 @@ private fun MainScreen() { sub = recordingSub, onSub = { recordingSub = it }, filterSpeakerId = filterSpeakerId, onFilterSpeakerId = { filterSpeakerId = it }, jumpToTs = jumpToTs, onJumpConsumed = { jumpToTs = null }, + onJumpTo = { ts -> jumpToTs = ts }, ) Tab.Chat -> ChatTab(repo) - 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.Album -> AlbumTab(repo) Tab.Settings -> SettingsScreen(activity) } @@ -209,17 +202,19 @@ private fun RecordingScreen( onFilterSpeakerId: (Long?) -> Unit, jumpToTs: Long?, onJumpConsumed: () -> Unit, + onJumpTo: (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("时间轴") }) + androidx.compose.material3.Tab(selected = sub == 2, onClick = { onSub(2) }, text = { Text("声纹") }) + androidx.compose.material3.Tab(selected = sub == 3, onClick = { onSub(3) }, text = { Text("纪要") }) } Box(modifier = Modifier.weight(1f)) { - if (sub == 0) { - HomeTab(activity, repo, onOpenTimeline = { onSub(1) }) - } else { - TimelineTab( + when (sub) { + 0 -> HomeTab(activity, repo, onOpenTimeline = { onSub(1) }) + 1 -> TimelineTab( repo = repo, speakers = speakers, filterSpeakerId = filterSpeakerId, @@ -227,31 +222,16 @@ private fun RecordingScreen( jumpToTs = jumpToTs, onJumpConsumed = onJumpConsumed, ) - } - } - } -} - -@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) + 2 -> SpeakersTab( + repo = repo, speakers = speakers, + // 点声纹 → 按 TA 筛选时间轴 + onFilterBySpeaker = { id -> onFilterSpeakerId(id); onSub(1) }, + ) + else -> SummariesTab( + repo = repo, activity = activity, + // 点纪要时间戳 → 跳时间轴对应段 + onJumpToTime = { ts -> onFilterSpeakerId(null); onJumpTo(ts); onSub(1) }, + ) } } }