Pith - kerf
kerf/app/src/main/java/com/vgmlr/kerf/MainActivity.kt [4.8 kb]
Modified: 23:09:02 55 026 (13 May 026)
17 Days Ago
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))
                }
            }
        }
    }
}
Updates
Shim - Android 70.026.1
Wedge - Linux 68.026.1
Wedge - Android 68.026.1
Taper - Linux 64.026.1
Ayh Extension - Chrome 63.026.1
Dev
TVShow (227) 'CSA'
TVShow (228) 'APT'
TVProgram (83) 'BXT'
Miter Update(s)
Shim (Dictation)

Menu
Calendar
Project Tin (024/029)
Miter
RSS Feed
User Avatar
@vgmlr
=SUM(parts)