- Edge-to-edge (enableEdgeToEdge) com Scaffold/insets em todas as telas - Compose BOM 2024.12 -> 2025.06; tipografia e tema com dynamic color - SyncBanner colorido removido -> SyncStatusRow compacto com chips M3 acionáveis (sync agora / abrir config / erro em errorContainer) - Lista: busca por título/conteúdo/tag (filterNotes testado), pull-to-refresh, animateItem, contentType, estado vazio com CTA - Ícones no lugar de emoji (pasta, presença, exclusão, aviso) - Editor: chip de presença acessível; imports limpos - Teste unitário de busca (NoteSearchTest) - versionCode 5 / versionName 0.3.0
58 lines
2.1 KiB
Kotlin
58 lines
2.1 KiB
Kotlin
package com.labexposed.notas
|
|
|
|
import android.os.Bundle
|
|
import androidx.activity.ComponentActivity
|
|
import androidx.activity.compose.setContent
|
|
import androidx.activity.enableEdgeToEdge
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.collectAsState
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
import androidx.lifecycle.compose.LifecycleEventEffect
|
|
import androidx.navigation.compose.NavHost
|
|
import androidx.navigation.compose.composable
|
|
import androidx.navigation.compose.rememberNavController
|
|
import androidx.lifecycle.Lifecycle
|
|
import com.labexposed.notas.ui.EditorScreen
|
|
import com.labexposed.notas.ui.NotesListScreen
|
|
import com.labexposed.notas.ui.NotasViewModel
|
|
import com.labexposed.notas.ui.SettingsScreen
|
|
import com.labexposed.notas.ui.theme.NotasTheme
|
|
|
|
class MainActivity : ComponentActivity() {
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
enableEdgeToEdge()
|
|
setContent {
|
|
NotasTheme { NotasApp_() }
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
private fun NotasApp_(vm: NotasViewModel = viewModel()) {
|
|
val nav = rememberNavController()
|
|
val settings by vm.settings.collectAsState()
|
|
|
|
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) { vm.onResumed() }
|
|
LifecycleEventEffect(Lifecycle.Event.ON_PAUSE) { vm.onPaused() }
|
|
|
|
NavHost(navController = nav, startDestination = if (settings.configured) "list" else "settings") {
|
|
composable("settings") {
|
|
SettingsScreen(vm, onDone = { nav.navigate("list") { popUpTo("settings") { inclusive = true } } })
|
|
}
|
|
composable("list") {
|
|
NotesListScreen(
|
|
vm = vm,
|
|
onOpen = { nav.navigate("editor/$it") },
|
|
onNew = { nav.navigate("editor/" + vm.createLocal()) },
|
|
onSettings = { nav.navigate("settings") },
|
|
)
|
|
}
|
|
composable("editor/{id}") { entry ->
|
|
val id = entry.arguments?.getString("id") ?: return@composable
|
|
EditorScreen(vm = vm, noteId = id, onBack = { nav.popBackStack() })
|
|
}
|
|
}
|
|
}
|