Add module for managing user preferences.

- Navigate to Import Account screen if there is no active account.
- Add basic node status placeholder in Import Account screen.
This commit is contained in:
Severiano Jaramillo 2024-03-09 19:06:33 -06:00
parent ca86caa72e
commit 34c82ba8f6
8 changed files with 105 additions and 6 deletions

View file

@ -36,6 +36,8 @@ kotlin {
implementation(libs.androidx.activity.compose) implementation(libs.androidx.activity.compose)
} }
commonMain.dependencies { commonMain.dependencies {
implementation(projects.shared.preferences)
implementation(compose.components.resources) implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview) implementation(compose.components.uiToolingPreview)
implementation(compose.foundation) implementation(compose.foundation)

View file

@ -0,0 +1,24 @@
package net.agorise.kee.ui.component.nodestatus
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import org.jetbrains.compose.ui.tooling.preview.Preview
import ui.theme.KeeTheme
@Composable
fun NodeStatus() {
Text("Connected to X.X.X.X", color = MaterialTheme.colorScheme.onBackground)
}
@Preview
@Composable
private fun NodeStatusLightPreview() = KeeTheme(useDarkTheme = false) {
NodeStatus()
}
@Preview
@Composable
private fun NodeStatusDarkPreview() = KeeTheme(useDarkTheme = true) {
NodeStatus()
}

View file

@ -12,6 +12,7 @@ import cafe.adriel.voyager.navigator.LocalNavigator
import net.agorise.kee.getPlatform import net.agorise.kee.getPlatform
import net.agorise.kee.ui.component.topappbar.KeeTopAppBar import net.agorise.kee.ui.component.topappbar.KeeTopAppBar
import net.agorise.kee.ui.screen.importaccount.ImportAccountScreen import net.agorise.kee.ui.screen.importaccount.ImportAccountScreen
import net.agorise.shared.preferences.KeePreferences
import org.jetbrains.compose.ui.tooling.preview.Preview import org.jetbrains.compose.ui.tooling.preview.Preview
import ui.theme.KeeTheme import ui.theme.KeeTheme
@ -27,6 +28,11 @@ class HomeScreen : Screen {
private fun HomeScreenContent() { private fun HomeScreenContent() {
val navigator = LocalNavigator.current val navigator = LocalNavigator.current
// Navigate to Import Account screen immediately if there is no active account
if (KeePreferences.isAccountActive().not()) {
navigator?.replace(ImportAccountScreen())
}
Scaffold( Scaffold(
topBar = { KeeTopAppBar("Kee Wallet") } topBar = { KeeTopAppBar("Kee Wallet") }
) { innerPadding -> ) { innerPadding ->

View file

@ -11,6 +11,7 @@ import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.LocalNavigator
import kee.composeapp.generated.resources.Res import kee.composeapp.generated.resources.Res
import kee.composeapp.generated.resources.logo_kee import kee.composeapp.generated.resources.logo_kee
import net.agorise.kee.ui.component.nodestatus.NodeStatus
import net.agorise.kee.ui.component.topappbar.KeeTopAppBar import net.agorise.kee.ui.component.topappbar.KeeTopAppBar
import net.agorise.kee.ui.screen.home.HomeScreen import net.agorise.kee.ui.screen.home.HomeScreen
import org.jetbrains.compose.resources.ExperimentalResourceApi import org.jetbrains.compose.resources.ExperimentalResourceApi
@ -37,7 +38,10 @@ private fun ImportAccountScreenContent() {
topBar = { KeeTopAppBar("Import Account") } topBar = { KeeTopAppBar("Import Account") }
) { innerPadding -> ) { innerPadding ->
Column( Column(
modifier = Modifier.padding(innerPadding).padding(16.dp), modifier = Modifier
.padding(innerPadding)
.consumeWindowInsets(innerPadding)
.padding(top = 16.dp, start = 16.dp, end = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(16.dp) verticalArrangement = Arrangement.spacedBy(16.dp)
) { ) {
@ -72,6 +76,8 @@ private fun ImportAccountScreenContent() {
) { ) {
Text("Import Account") Text("Import Account")
} }
Spacer(modifier = Modifier.weight(1f))
NodeStatus()
} }
} }
} }

View file

@ -7,13 +7,15 @@ androidx-activityCompose = "1.8.2"
compose = "1.6.2" compose = "1.6.2"
compose-plugin = "1.6.0" compose-plugin = "1.6.0"
kotlin = "1.9.22" kotlin = "1.9.22"
multiplatform-settings = "1.1.1"
voyager = "1.0.0" voyager = "1.0.0"
[libraries] [libraries]
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activityCompose" } androidx-activity-compose = { group = "androidx.activity", name ="activity-compose", version.ref = "androidx-activityCompose" }
compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" } compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "compose" }
compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose" } compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "compose" }
voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } multiplatform-settings = { group="com.russhwolf", name = "multiplatform-settings-no-arg", version.ref = "multiplatform-settings" }
voyager-navigator = { group = "cafe.adriel.voyager", name = "voyager-navigator", version.ref = "voyager" }
[plugins] [plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" } androidApplication = { id = "com.android.application", version.ref = "agp" }

View file

@ -19,3 +19,4 @@ dependencyResolutionManagement {
} }
include(":composeApp") include(":composeApp")
include(":shared:preferences")

View file

@ -0,0 +1,40 @@
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.androidLibrary)
}
kotlin {
androidTarget {
compilations.all {
kotlinOptions {
jvmTarget = "11"
}
}
}
jvm()
iosX64()
iosArm64()
iosSimulatorArm64()
sourceSets {
commonMain.dependencies {
implementation(libs.multiplatform.settings)
}
}
}
android {
namespace = "net.agorise.shared.preferences"
compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig {
minSdk = libs.versions.android.minSdk.get().toInt()
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}

View file

@ -0,0 +1,18 @@
package net.agorise.shared.preferences
import com.russhwolf.settings.Settings
/**
* Provides methods to access preferences on all supported platforms.
*/
object KeePreferences {
// TODO Use a stronger implementation that allows encryption
private val settings: Settings = Settings()
// Keys used to store/retrieve preferences
private const val KEY_RECOVERY_WORDS = "key_recovery_words"
fun isAccountActive(): Boolean {
return settings.hasKey(KEY_RECOVERY_WORDS)
}
}