package com.vgmlr.kerf
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.compose.runtime.*
import androidx.navigation.compose.*
class MainActivity : ComponentActivity() {
private val vm: NoteViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
KerfUtils.cleanupCache(this)
handleIntent(intent)
setContent {
KerfTheme {
val nav = rememberNavController()
NavHost(nav, startDestination = KerfScreen.Home.route) {
composable(KerfScreen.Home.route) { HomeScreen(vm, nav) }
composable(KerfScreen.Edit.route, KerfScreen.Edit.arguments) { backStack ->
val id = backStack.arguments?.getInt("noteId") ?: 0
EditScreen(id, vm) { nav.popBackStack() }
}
}
val sharedText by vm.sharedText.collectAsState()
val sharedFile by vm.sharedFile.collectAsState()
val kerfImport by vm.kerfImport.collectAsState()
kerfImport?.let { (title, content) ->
LaunchedEffect(kerfImport) {
vm.addNote(isImported = true) { id ->
vm.updateNoteImmediate(id, title, content, true)
vm.setKerfImport(null)
nav.navigate(KerfScreen.Edit.createRoute(id))
}
}
}
sharedText?.let { text ->
val notes by vm.allNotes.collectAsState()
ShareDialog(
notes = notes,
onSelect = { vm.appendContent(it, text); vm.setSharedText(null) },
onAddNew = {
vm.addNote(isImported = false) { id ->
val urlMatch = KerfUtils.UrlRegex.find(text)
val cleanText = if (urlMatch != null) text.replace(urlMatch.value, "").trim() else text
val urlPart = urlMatch?.value ?: ""
val initialContent = if (urlPart.isNotEmpty()) {
"1. $urlPart\n$cleanText\n"
} else {
"1. \n$text\n"
}
vm.updateNoteImmediate(id, "", initialContent, false)
vm.setSharedText(null)
}
},
onDismiss = { vm.setSharedText(null) }
)
}
sharedFile?.let { fileData ->
LaunchedEffect(fileData) {
vm.addNote(isImported = true) { id ->
vm.updateNoteImmediate(id, fileData.first, fileData.second, true)
vm.setSharedFile(null)
nav.navigate(KerfScreen.Edit.createRoute(id))
}
}
}
}
}
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
if (intent == null) return
when (intent.action) {
Intent.ACTION_SEND -> {
val streamUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java)
} else {
@Suppress("DEPRECATION")
intent.getParcelableExtra(Intent.EXTRA_STREAM)
}
if (streamUri != null) {
vm.setSharedFile(KerfUtils.importNoteFromUri(this, streamUri))
} else if ("text/plain" == intent.type) {
val text = intent.getStringExtra(Intent.EXTRA_TEXT)
if (text != null) {
val kerfData = KerfUtils.parseKerfText(text)
if (kerfData != null) {
vm.setKerfImport(kerfData)
} else {
vm.setSharedText(text)
}
}
}
}
Intent.ACTION_VIEW -> {
intent.data?.let { uri ->
vm.setSharedFile(KerfUtils.importNoteFromUri(this, uri))
}
}
}
}
}