setup activity first impl

This commit is contained in:
rhunk
2023-08-02 00:15:57 +02:00
parent 79d3bb5ba9
commit 369ed0a8a6
9 changed files with 265 additions and 0 deletions

View File

@@ -46,6 +46,12 @@
<category android:name="android.intent.category.LAUNCHER" />
</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"

View File

@@ -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)
}
}
}
}

View File

@@ -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()
}
}
}
}
}
}
}
}
}
}

View File

@@ -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()
}

View File

@@ -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")
}
}
}

View File

@@ -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() {
}
}

View File

@@ -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")
}
}
}

View File

@@ -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")
}
}
}

View File

@@ -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")
}
}
}