diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 63e45933..0532e0b4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -46,6 +46,12 @@
+
+
()
+
+ with(requiredScreens) {
+ with(requirements) {
+ if (firstRun || language) add(LanguageScreen().apply { route = "language" })
+ if (firstRun) add(WelcomeScreen().apply { route = "welcome" })
+ if (firstRun || saveFolder) add(SaveFolderScreen().apply { route = "saveFolder" })
+ if (firstRun || mappings) add(MappingsScreen().apply { route = "mappings" })
+ if (firstRun || ffmpeg) add(FfmpegScreen().apply { route = "ffmpeg" })
+ }
+ }
+
+ if (requiredScreens.isEmpty()) {
+ finish()
+ return
+ }
+
+ setContent {
+ val navController = rememberNavController()
+ val canGoNext = remember { mutableStateOf(false) }
+
+ fun nextScreen() {
+ if (!canGoNext.value) return
+ canGoNext.value = false
+ if (requiredScreens.size > 1) {
+ requiredScreens.removeFirst()
+ navController.navigate(requiredScreens.first().route)
+ } else {
+ finish()
+ }
+ }
+
+ AppMaterialTheme {
+ Scaffold(
+ containerColor = MaterialTheme.colorScheme.background,
+ bottomBar = {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth(),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ val alpha: Float by animateFloatAsState(if (canGoNext.value) 1f else 0f,
+ label = "NextButton"
+ )
+
+ FilledIconButton(
+ onClick = { nextScreen() },
+ modifier = Modifier.padding(50.dp)
+ .width(60.dp)
+ .height(60.dp)
+ .alpha(alpha)
+ ) {
+ Icon(
+ imageVector = Icons.Default.ArrowForwardIos,
+ contentDescription = null
+ )
+ }
+ }
+ },
+ ) { paddingValues ->
+ Column(
+ modifier = Modifier
+ .background(MaterialTheme.colorScheme.background)
+ .fillMaxSize()
+ .padding(paddingValues)
+ ) {
+ NavHost(
+ navController = navController,
+ startDestination = requiredScreens.first().route
+ ) {
+ requiredScreens.forEach { screen ->
+ screen.allowNext = { canGoNext.value = it }
+ composable(screen.route) {
+ Column(
+ modifier = Modifier.fillMaxSize(),
+ verticalArrangement = Arrangement.Center,
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ screen.Content()
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/SetupScreen.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/SetupScreen.kt
new file mode 100644
index 00000000..d1600f8d
--- /dev/null
+++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/SetupScreen.kt
@@ -0,0 +1,11 @@
+package me.rhunk.snapenhance.manager.setup.screens
+
+import androidx.compose.runtime.Composable
+
+abstract class SetupScreen {
+ lateinit var allowNext: (Boolean) -> Unit
+ lateinit var route: String
+
+ @Composable
+ abstract fun Content()
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/FfmpegScreen.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/FfmpegScreen.kt
new file mode 100644
index 00000000..3e9693b6
--- /dev/null
+++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/FfmpegScreen.kt
@@ -0,0 +1,17 @@
+package me.rhunk.snapenhance.manager.setup.screens.impl
+
+import androidx.compose.material3.Button
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import me.rhunk.snapenhance.manager.setup.screens.SetupScreen
+
+class FfmpegScreen : SetupScreen() {
+
+ @Composable
+ override fun Content() {
+ Text(text = "FFmpeg")
+ Button(onClick = { allowNext(true) }) {
+ Text(text = "Next")
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/LanguageScreen.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/LanguageScreen.kt
new file mode 100644
index 00000000..f574b115
--- /dev/null
+++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/LanguageScreen.kt
@@ -0,0 +1,12 @@
+package me.rhunk.snapenhance.manager.setup.screens.impl
+
+import androidx.compose.runtime.Composable
+import me.rhunk.snapenhance.manager.setup.screens.SetupScreen
+
+class LanguageScreen : SetupScreen(){
+
+ @Composable
+ override fun Content() {
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/MappingsScreen.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/MappingsScreen.kt
new file mode 100644
index 00000000..1b5d1748
--- /dev/null
+++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/MappingsScreen.kt
@@ -0,0 +1,16 @@
+package me.rhunk.snapenhance.manager.setup.screens.impl
+
+import androidx.compose.material3.Button
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import me.rhunk.snapenhance.manager.setup.screens.SetupScreen
+
+class MappingsScreen : SetupScreen() {
+ @Composable
+ override fun Content() {
+ Text(text = "Mappings")
+ Button(onClick = { allowNext(true) }) {
+ Text(text = "Next")
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/SaveFolderScreen.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/SaveFolderScreen.kt
new file mode 100644
index 00000000..62df1980
--- /dev/null
+++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/SaveFolderScreen.kt
@@ -0,0 +1,17 @@
+package me.rhunk.snapenhance.manager.setup.screens.impl
+
+import androidx.compose.material3.Button
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import me.rhunk.snapenhance.manager.setup.screens.SetupScreen
+
+class SaveFolderScreen : SetupScreen() {
+
+ @Composable
+ override fun Content() {
+ Text(text = "SaveFolder")
+ Button(onClick = {allowNext(true)}) {
+ Text(text = "Next")
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/WelcomeScreen.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/WelcomeScreen.kt
new file mode 100644
index 00000000..64c348ef
--- /dev/null
+++ b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/screens/impl/WelcomeScreen.kt
@@ -0,0 +1,17 @@
+package me.rhunk.snapenhance.manager.setup.screens.impl
+
+import androidx.compose.material3.Button
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import me.rhunk.snapenhance.manager.setup.screens.SetupScreen
+
+class WelcomeScreen : SetupScreen() {
+
+ @Composable
+ override fun Content() {
+ Text(text = "Welcome")
+ Button(onClick = { allowNext(true) }) {
+ Text(text = "Next")
+ }
+ }
+}
\ No newline at end of file