package at.lockstep.player import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Surface import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.core.util.Consumer import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.compose.rememberNavController import at.lockstep.player.auth.OAuthCallbackParser import at.lockstep.player.ui.LockstepAppNavHost import at.lockstep.player.ui.theme.LockstepTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { LockstepTheme { val viewModel: LockstepViewModel = viewModel( factory = LockstepViewModelFactory(application), ) val context = LocalContext.current val onboardingDone by viewModel.onboardingComplete.collectAsStateWithLifecycle() LaunchedEffect(Unit) { intent?.data?.let { uri -> OAuthCallbackParser.parseAccessToken(uri)?.let { token -> viewModel.saveSpotifyAccessToken(token) } } } DisposableEffect(viewModel) { val listener = Consumer { newIntent -> newIntent.data?.let { uri -> OAuthCallbackParser.parseAccessToken(uri)?.let { token -> viewModel.saveSpotifyAccessToken(token) } } } addOnNewIntentListener(listener) onDispose { removeOnNewIntentListener(listener) } } Surface(modifier = Modifier.fillMaxSize()) { if (!onboardingDone) { at.lockstep.player.ui.onboarding.OnboardingScreen( viewModel = viewModel, onFinished = { }, ) } else { val navController = rememberNavController() LockstepAppNavHost( activity = this@MainActivity, navController = navController, viewModel = viewModel, ) } } } } } }