commit 369ed0a8a640bea6e3728a1ccc3bc5225c020ad7
parent 79d3bb5ba922e54f728391458932c528067cef58
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Wed, 2 Aug 2023 00:15:57 +0200
setup activity first impl
Diffstat:
9 files changed, 272 insertions(+), 0 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
@@ -47,6 +47,12 @@
</intent-filter>
</activity>
<activity
+ android:name=".manager.setup.SetupActivity"
+ android:exported="true"
+ android:theme="@style/AppTheme"
+ android:excludeFromRecents="true">
+ </activity>
+ <activity
android:name=".ui.map.MapActivity"
android:exported="true"
android:excludeFromRecents="true" />
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/Requirements.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/Requirements.kt
@@ -0,0 +1,33 @@
+package me.rhunk.snapenhance.manager.setup
+
+import android.os.Bundle
+
+data class Requirements(
+ val firstRun: Boolean = false,
+ val language: Boolean = false,
+ val mappings: Boolean = false,
+ val saveFolder: Boolean = false,
+ val ffmpeg: Boolean = false
+) {
+ companion object {
+ fun fromBundle(bundle: Bundle): Requirements {
+ return Requirements(
+ firstRun = bundle.getBoolean("firstRun"),
+ language = bundle.getBoolean("language"),
+ mappings = bundle.getBoolean("mappings"),
+ saveFolder = bundle.getBoolean("saveFolder"),
+ ffmpeg = bundle.getBoolean("ffmpeg")
+ )
+ }
+
+ fun toBundle(requirements: Requirements): Bundle {
+ return Bundle().apply {
+ putBoolean("firstRun", requirements.firstRun)
+ putBoolean("language", requirements.language)
+ putBoolean("mappings", requirements.mappings)
+ putBoolean("saveFolder", requirements.saveFolder)
+ putBoolean("ffmpeg", requirements.ffmpeg)
+ }
+ }
+ }
+}
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/SetupActivity.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/setup/SetupActivity.kt
@@ -0,0 +1,136 @@
+package me.rhunk.snapenhance.manager.setup
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ArrowForwardIos
+import androidx.compose.material3.FilledIconButton
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Scaffold
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.alpha
+import androidx.compose.ui.unit.dp
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.rememberNavController
+import me.rhunk.snapenhance.manager.AppMaterialTheme
+import me.rhunk.snapenhance.manager.setup.screens.SetupScreen
+import me.rhunk.snapenhance.manager.setup.screens.impl.FfmpegScreen
+import me.rhunk.snapenhance.manager.setup.screens.impl.LanguageScreen
+import me.rhunk.snapenhance.manager.setup.screens.impl.MappingsScreen
+import me.rhunk.snapenhance.manager.setup.screens.impl.SaveFolderScreen
+import me.rhunk.snapenhance.manager.setup.screens.impl.WelcomeScreen
+
+
+class SetupActivity : ComponentActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ val requirements = intent.getBundleExtra("requirements")?.let {
+ Requirements.fromBundle(it)
+ } ?: Requirements(firstRun = true)
+
+ val requiredScreens = mutableListOf<SetupScreen>()
+
+ 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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