Add ImportAccountScreen with basic functionality.
- Make HomeScreen the default navigator destination - Create reusable TopAppBar component
This commit is contained in:
parent
ce79a8fc4d
commit
d87431bce2
11 changed files with 157 additions and 152 deletions
|
@ -4,14 +4,14 @@ import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import cafe.adriel.voyager.navigator.Navigator
|
import cafe.adriel.voyager.navigator.Navigator
|
||||||
import net.agorise.kee.ui.screen.license.LicenseScreen
|
import net.agorise.kee.ui.screen.home.HomeScreen
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
setContent {
|
setContent {
|
||||||
Navigator(LicenseScreen())
|
Navigator(HomeScreen())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="600dp"
|
|
||||||
android:height="600dp"
|
|
||||||
android:viewportWidth="600"
|
|
||||||
android:viewportHeight="600">
|
|
||||||
<path
|
|
||||||
android:pathData="M301.21,418.53C300.97,418.54 300.73,418.56 300.49,418.56C297.09,418.59 293.74,417.72 290.79,416.05L222.6,377.54C220.63,376.43 219,374.82 217.85,372.88C216.7,370.94 216.09,368.73 216.07,366.47L216.07,288.16C216.06,287.32 216.09,286.49 216.17,285.67C216.38,283.54 216.91,281.5 217.71,279.6L199.29,268.27L177.74,256.19C175.72,260.43 174.73,265.23 174.78,270.22L174.79,387.05C174.85,393.89 178.57,400.2 184.53,403.56L286.26,461.02C290.67,463.51 295.66,464.8 300.73,464.76C300.91,464.76 301.09,464.74 301.27,464.74C301.24,449.84 301.22,439.23 301.22,439.23L301.21,418.53Z"
|
|
||||||
android:fillColor="#041619"
|
|
||||||
android:fillType="nonZero"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M409.45,242.91L312.64,188.23C303.64,183.15 292.58,183.26 283.68,188.51L187.92,245C183.31,247.73 179.93,251.62 177.75,256.17L177.74,256.19L199.29,268.27L217.71,279.6C217.83,279.32 217.92,279.02 218.05,278.74C218.24,278.36 218.43,277.98 218.64,277.62C219.06,276.88 219.52,276.18 220.04,275.51C221.37,273.8 223.01,272.35 224.87,271.25L289.06,233.39C290.42,232.59 291.87,231.96 293.39,231.51C295.53,230.87 297.77,230.6 300,230.72C302.98,230.88 305.88,231.73 308.47,233.2L373.37,269.85C375.54,271.08 377.49,272.68 379.13,274.57C379.68,275.19 380.18,275.85 380.65,276.53C380.86,276.84 381.05,277.15 381.24,277.47L397.79,266.39L420.34,252.93L420.31,252.88C417.55,248.8 413.77,245.35 409.45,242.91Z"
|
|
||||||
android:fillColor="#37BF6E"
|
|
||||||
android:fillType="nonZero"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M381.24,277.47C381.51,277.92 381.77,278.38 382.01,278.84C382.21,279.24 382.39,279.65 382.57,280.06C382.91,280.88 383.19,281.73 383.41,282.59C383.74,283.88 383.92,285.21 383.93,286.57L383.93,361.1C383.96,363.95 383.35,366.77 382.16,369.36C381.93,369.86 381.69,370.35 381.42,370.83C379.75,373.79 377.32,376.27 374.39,378L310.2,415.87C307.47,417.48 304.38,418.39 301.21,418.53L301.22,439.23C301.22,439.23 301.24,449.84 301.27,464.74C306.1,464.61 310.91,463.3 315.21,460.75L410.98,404.25C419.88,399 425.31,389.37 425.22,379.03L425.22,267.85C425.17,262.48 423.34,257.34 420.34,252.93L397.79,266.39L381.24,277.47Z"
|
|
||||||
android:fillColor="#3870B2"
|
|
||||||
android:fillType="nonZero"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M177.75,256.17C179.93,251.62 183.31,247.73 187.92,245L283.68,188.51C292.58,183.26 303.64,183.15 312.64,188.23L409.45,242.91C413.77,245.35 417.55,248.8 420.31,252.88L420.34,252.93L498.59,206.19C494.03,199.46 487.79,193.78 480.67,189.75L320.86,99.49C306.01,91.1 287.75,91.27 273.07,99.95L114.99,193.2C107.39,197.69 101.81,204.11 98.21,211.63L177.74,256.19L177.75,256.17ZM301.27,464.74C301.09,464.74 300.91,464.76 300.73,464.76C295.66,464.8 290.67,463.51 286.26,461.02L184.53,403.56C178.57,400.2 174.85,393.89 174.79,387.05L174.78,270.22C174.73,265.23 175.72,260.43 177.74,256.19L98.21,211.63C94.86,218.63 93.23,226.58 93.31,234.82L93.31,427.67C93.42,438.97 99.54,449.37 109.4,454.92L277.31,549.77C284.6,553.88 292.84,556.01 301.2,555.94L301.2,555.8C301.39,543.78 301.33,495.26 301.27,464.74Z"
|
|
||||||
android:strokeWidth="10"
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:strokeColor="#083042"
|
|
||||||
android:fillType="nonZero"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M498.59,206.19L420.34,252.93C423.34,257.34 425.17,262.48 425.22,267.85L425.22,379.03C425.31,389.37 419.88,399 410.98,404.25L315.21,460.75C310.91,463.3 306.1,464.61 301.27,464.74C301.33,495.26 301.39,543.78 301.2,555.8L301.2,555.94C309.48,555.87 317.74,553.68 325.11,549.32L483.18,456.06C497.87,447.39 506.85,431.49 506.69,414.43L506.69,230.91C506.6,222.02 503.57,213.5 498.59,206.19Z"
|
|
||||||
android:strokeWidth="10"
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:strokeColor="#083042"
|
|
||||||
android:fillType="nonZero"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M301.2,555.94C292.84,556.01 284.6,553.88 277.31,549.76L109.4,454.92C99.54,449.37 93.42,438.97 93.31,427.67L93.31,234.82C93.23,226.58 94.86,218.63 98.21,211.63C101.81,204.11 107.39,197.69 114.99,193.2L273.07,99.95C287.75,91.27 306.01,91.1 320.86,99.49L480.67,189.75C487.79,193.78 494.03,199.46 498.59,206.19C503.57,213.5 506.6,222.02 506.69,230.91L506.69,414.43C506.85,431.49 497.87,447.39 483.18,456.06L325.11,549.32C317.74,553.68 309.48,555.87 301.2,555.94Z"
|
|
||||||
android:strokeWidth="10"
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:strokeColor="#083042"
|
|
||||||
android:fillType="nonZero"/>
|
|
||||||
</vector>
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="912dp"
|
||||||
|
android:height="1053.1dp"
|
||||||
|
android:viewportWidth="912"
|
||||||
|
android:viewportHeight="1053.1">
|
||||||
|
<path
|
||||||
|
android:pathData="M841.2,748.6v0.4l-385.2,222.4 -385.2,-222.4V304.2l385.2,-222.4 385.2,222.4v0.4l70.8,-40.9v-0.4L456,0 0,263.3v526.6l456,263.3 456,-263.3v-0.4l-70.8,-40.9z"
|
||||||
|
android:fillColor="#fff"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M841.2,748.6v0.4l-385.2,222.4 -385.2,-222.4V304.2l385.2,-222.4 385.2,222.4v0.4l70.8,-40.9v-0.4L456,0 0,263.3v526.6l456,263.3 456,-263.3v-0.4l-70.8,-40.9z"
|
||||||
|
android:fillColor="#fff"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M699.2,488H464.5a38.2,38.2 0,0 0,-13.4 2.5,140.8 140.8,0 1,0 0,72.3 38.2,38.2 0,0 0,13.4 2.5H553v46.9a38.6,38.6 0,0 0,77.2 0v-46.9h9.1v32.8a38.6,38.6 0,0 0,77.2 0v-37a38.6,38.6 0,0 0,-17.4 -73ZM315,599.3a72.7,72.7 0,1 1,72.7 -72.7A72.7,72.7 0,0 1,315 599.3Z"
|
||||||
|
android:fillColor="#fff"/>
|
||||||
|
</vector>
|
|
@ -1,60 +0,0 @@
|
||||||
package net.agorise.kee
|
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
|
||||||
import androidx.compose.foundation.layout.padding
|
|
||||||
import androidx.compose.material3.Button
|
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.material3.TextField
|
|
||||||
import androidx.compose.runtime.*
|
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
|
||||||
import androidx.compose.ui.text.TextStyle
|
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
import androidx.compose.ui.unit.sp
|
|
||||||
import kotlinx.datetime.*
|
|
||||||
import org.jetbrains.compose.ui.tooling.preview.Preview
|
|
||||||
import ui.theme.KeeTheme
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
@Preview
|
|
||||||
fun App() {
|
|
||||||
KeeTheme {
|
|
||||||
var location by remember { mutableStateOf("Europe/Paris") }
|
|
||||||
var timeAtLocation by remember { mutableStateOf("No location selected") }
|
|
||||||
|
|
||||||
Column(modifier = Modifier.padding(20.dp)) {
|
|
||||||
Text(
|
|
||||||
timeAtLocation,
|
|
||||||
style = TextStyle(fontSize = 20.sp),
|
|
||||||
textAlign = TextAlign.Center,
|
|
||||||
modifier = Modifier.fillMaxWidth().align(Alignment.CenterHorizontally)
|
|
||||||
)
|
|
||||||
TextField(
|
|
||||||
value = location,
|
|
||||||
modifier = Modifier.padding(top = 10.dp),
|
|
||||||
onValueChange = { location = it }
|
|
||||||
)
|
|
||||||
Button(
|
|
||||||
modifier = Modifier.padding(top = 10.dp),
|
|
||||||
onClick = { timeAtLocation = currentTimeAt(location) ?: "Invalid Location" }
|
|
||||||
) {
|
|
||||||
Text("Show Time At Location")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun currentTimeAt(location: String): String? {
|
|
||||||
fun LocalTime.formatted() = "$hour:$minute:$second"
|
|
||||||
|
|
||||||
return try {
|
|
||||||
val time = Clock.System.now()
|
|
||||||
val zone = TimeZone.of(location)
|
|
||||||
val localTime = time.toLocalDateTime(zone).time
|
|
||||||
"The time in $location is ${localTime.formatted()}"
|
|
||||||
} catch (ex: IllegalTimeZoneException) {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
package net.agorise.kee
|
|
||||||
|
|
||||||
class Greeting {
|
|
||||||
private val platform = getPlatform()
|
|
||||||
|
|
||||||
fun greet(): String {
|
|
||||||
return "Kee on ${platform.name}!"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
package net.agorise.kee.ui.component.topappbar
|
||||||
|
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.TopAppBar
|
||||||
|
import androidx.compose.material3.TopAppBarDefaults.topAppBarColors
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun KeeTopAppBar(
|
||||||
|
title: String,
|
||||||
|
) {
|
||||||
|
TopAppBar(
|
||||||
|
colors = topAppBarColors(
|
||||||
|
containerColor = MaterialTheme.colorScheme.primaryContainer,
|
||||||
|
titleContentColor = MaterialTheme.colorScheme.primary
|
||||||
|
),
|
||||||
|
title = {
|
||||||
|
Text(title)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
|
@ -1,13 +1,51 @@
|
||||||
package net.agorise.kee.ui.screen.home
|
package net.agorise.kee.ui.screen.home
|
||||||
|
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
import cafe.adriel.voyager.core.screen.Screen
|
import cafe.adriel.voyager.core.screen.Screen
|
||||||
|
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||||
|
import net.agorise.kee.getPlatform
|
||||||
|
import net.agorise.kee.ui.component.topappbar.KeeTopAppBar
|
||||||
|
import net.agorise.kee.ui.screen.importaccount.ImportAccountScreen
|
||||||
|
import org.jetbrains.compose.ui.tooling.preview.Preview
|
||||||
|
|
||||||
class HomeScreen : Screen {
|
class HomeScreen : Screen {
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun Content() {
|
override fun Content() {
|
||||||
Text("Welcome to Home Screen")
|
HomeScreenContent()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun HomeScreenContent() {
|
||||||
|
val navigator = LocalNavigator.current
|
||||||
|
|
||||||
|
Scaffold(
|
||||||
|
topBar = { KeeTopAppBar("Kee Wallet") }
|
||||||
|
) { innerPadding ->
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(innerPadding).padding(16.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(16.dp)
|
||||||
|
) {
|
||||||
|
Text("Welcome to Kee from ${getPlatform().name}")
|
||||||
|
|
||||||
|
Button(
|
||||||
|
onClick = { navigator?.replace(ImportAccountScreen()) }
|
||||||
|
) {
|
||||||
|
Text("Import Account")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
private fun HomeScreenContentPreview() {
|
||||||
|
HomeScreenContent()
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
package net.agorise.kee.ui.screen.importaccount
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material3.*
|
||||||
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import cafe.adriel.voyager.core.screen.Screen
|
||||||
|
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||||
|
import kee.composeapp.generated.resources.Res
|
||||||
|
import kee.composeapp.generated.resources.logo_dero
|
||||||
|
import net.agorise.kee.ui.component.topappbar.KeeTopAppBar
|
||||||
|
import net.agorise.kee.ui.screen.home.HomeScreen
|
||||||
|
import org.jetbrains.compose.resources.ExperimentalResourceApi
|
||||||
|
import org.jetbrains.compose.resources.vectorResource
|
||||||
|
import org.jetbrains.compose.ui.tooling.preview.Preview
|
||||||
|
|
||||||
|
class ImportAccountScreen : Screen {
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
override fun Content() {
|
||||||
|
ImportAccountScreenContent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalResourceApi::class)
|
||||||
|
@Composable
|
||||||
|
private fun ImportAccountScreenContent() {
|
||||||
|
val navigator = LocalNavigator.current
|
||||||
|
|
||||||
|
Scaffold(
|
||||||
|
topBar = { KeeTopAppBar("Import Account") }
|
||||||
|
) { innerPadding ->
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(innerPadding).padding(16.dp),
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
|
verticalArrangement = Arrangement.spacedBy(16.dp)
|
||||||
|
) {
|
||||||
|
var recoveryText by remember { mutableStateOf("") }
|
||||||
|
val recoveryWords = recoveryText.split(" ").filter { it.isNotBlank() }
|
||||||
|
|
||||||
|
Icon(
|
||||||
|
imageVector = vectorResource(Res.drawable.logo_dero),
|
||||||
|
contentDescription = null,
|
||||||
|
tint = MaterialTheme.colorScheme.primary,
|
||||||
|
modifier = Modifier.size(60.dp)
|
||||||
|
)
|
||||||
|
Text("Enter your recovery words below")
|
||||||
|
OutlinedTextField(
|
||||||
|
value = recoveryText,
|
||||||
|
onValueChange = { recoveryText = it },
|
||||||
|
minLines = 3,
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
)
|
||||||
|
Button(
|
||||||
|
enabled = recoveryWords.size == 2,
|
||||||
|
onClick = { navigator?.replace(HomeScreen()) }
|
||||||
|
) {
|
||||||
|
Text("Import Account")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
private fun ImportAccountScreenContentPreview() {
|
||||||
|
ImportAccountScreenContent()
|
||||||
|
}
|
|
@ -1,37 +0,0 @@
|
||||||
package net.agorise.kee.ui.screen.license
|
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.material3.Button
|
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import cafe.adriel.voyager.core.screen.Screen
|
|
||||||
import cafe.adriel.voyager.navigator.LocalNavigator
|
|
||||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
|
||||||
import net.agorise.kee.ui.screen.home.HomeScreen
|
|
||||||
import org.jetbrains.compose.ui.tooling.preview.Preview
|
|
||||||
|
|
||||||
class LicenseScreen : Screen {
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
override fun Content() {
|
|
||||||
HomeScreenContent()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun HomeScreenContent() {
|
|
||||||
val navigator = LocalNavigator.currentOrThrow
|
|
||||||
|
|
||||||
Column {
|
|
||||||
Text("Welcome to License Screen")
|
|
||||||
Button(onClick = { navigator.replace(HomeScreen()) }) {
|
|
||||||
Text("Accept")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview
|
|
||||||
@Composable
|
|
||||||
fun HomeScreenContentPreview() {
|
|
||||||
HomeScreenContent()
|
|
||||||
}
|
|
|
@ -7,14 +7,14 @@ import androidx.compose.ui.window.WindowPosition
|
||||||
import androidx.compose.ui.window.application
|
import androidx.compose.ui.window.application
|
||||||
import androidx.compose.ui.window.rememberWindowState
|
import androidx.compose.ui.window.rememberWindowState
|
||||||
import cafe.adriel.voyager.navigator.Navigator
|
import cafe.adriel.voyager.navigator.Navigator
|
||||||
import net.agorise.kee.ui.screen.license.LicenseScreen
|
import net.agorise.kee.ui.screen.home.HomeScreen
|
||||||
|
|
||||||
fun main() = application {
|
fun main() = application {
|
||||||
val state = rememberWindowState(
|
val state = rememberWindowState(
|
||||||
size = DpSize(400.dp, 250.dp),
|
size = DpSize(420.dp, 880.dp),
|
||||||
position = WindowPosition(300.dp, 300.dp)
|
position = WindowPosition(300.dp, 300.dp)
|
||||||
)
|
)
|
||||||
Window(title = "Kee", onCloseRequest = ::exitApplication, state = state) {
|
Window(title = "", onCloseRequest = ::exitApplication, state = state) {
|
||||||
Navigator(LicenseScreen())
|
Navigator(HomeScreen())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import androidx.compose.ui.window.ComposeUIViewController
|
import androidx.compose.ui.window.ComposeUIViewController
|
||||||
import cafe.adriel.voyager.navigator.Navigator
|
import cafe.adriel.voyager.navigator.Navigator
|
||||||
import net.agorise.kee.ui.screen.license.LicenseScreen
|
import net.agorise.kee.ui.screen.home.HomeScreen
|
||||||
|
|
||||||
fun MainViewController() = ComposeUIViewController { Navigator(LicenseScreen()) }
|
fun MainViewController() = ComposeUIViewController { Navigator(HomeScreen()) }
|
||||||
|
|
Loading…
Reference in a new issue