package io.oxygenhub.android import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf import io.oxygenhub.android.alerts.LandAlerts import io.oxygenhub.android.ui.nav.ProposalRoute import androidx.lifecycle.compose.collectAsStateWithLifecycle import io.oxygenhub.android.ui.nav.SignedInApp import io.oxygenhub.android.ui.nav.rememberViewModel import io.oxygenhub.android.ui.signin.SignInScreen import io.oxygenhub.android.ui.signin.SignInViewModel import io.oxygenhub.android.ui.theme.OxygenHubTheme import uniffi.rust_core.oxygenGreeting class MainActivity : ComponentActivity() { /** A proposal a notification asked to open (#20), until it is shown. */ private val opening = mutableStateOf(null) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) opening.value = proposalIn(intent) enableEdgeToEdge() val container = (application as OxygenHubApp).container val sessions = container.sessions setContent { OxygenHubTheme { val session by sessions.session.collectAsStateWithLifecycle() val signedIn = session val api = signedIn?.let { sessions.api() } if (signedIn == null || api == null) { SignInScreen( rememberViewModel { SignInViewModel(sessions, container::deviceAuth, container.clientName, DEFAULT_HUB) }, ) } else { // A new session starts the signed-in app afresh: nothing of the last account's is kept. key(signedIn) { SignedInApp( session = signedIn, api = api, nativeCore = { oxygenGreeting(signedIn.username) }, onSignOut = { sessions.signOut() }, open = opening.value, onOpened = { opening.value = null }, ) } } } } } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) proposalIn(intent)?.let { opening.value = it } } private fun proposalIn(intent: Intent?): ProposalRoute? { val repository = intent?.getStringExtra(LandAlerts.EXTRA_REPOSITORY) ?: return null val number = intent.getLongExtra(LandAlerts.EXTRA_NUMBER, 0) if ('/' !in repository || number <= 0) return null return ProposalRoute(repository.substringBefore('/'), repository.substringAfter('/'), number) } }