diff --git a/src/main/kotlin/org/briarproject/briar/desktop/BriarService.kt b/src/main/kotlin/org/briarproject/briar/desktop/BriarService.kt index 35855a46a7b8f6ad30564cbb50a0b9ad60f0aa67..6cce7eb78c6da5cb9f9f969fb300aa680b3ff37d 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/BriarService.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/BriarService.kt @@ -29,6 +29,7 @@ import javax.inject.Inject import javax.inject.Singleton enum class Screen { + REGISTRATION, LOGIN, MAIN } @@ -60,41 +61,40 @@ constructor( private val contacts: MutableList<Contact> = ArrayList() - @Composable - override fun start( - conversationManager: ConversationManager, - messagingManager: MessagingManager - ) { - if (!accountManager.accountExists()) { - createAccount() - } else { - login(conversationManager, messagingManager) - } - } - override fun stop() { lifecycleManager.stopServices() lifecycleManager.waitForShutdown() } - private fun createAccount() { - print("No account found. Let's create one!\n\n") - Registration("Briar", accountManager, lifecycleManager) - } - @Composable - private fun login( + override fun start( conversationManager: ConversationManager, messagingManager: MessagingManager ) { val title = "Briar Desktop" - var screenState by remember { mutableStateOf(Screen.LOGIN) } + var screenState by remember { + mutableStateOf( + if (accountManager.accountExists()) { + Screen.LOGIN + } else { + Screen.REGISTRATION + } + ) + } Window(title = title) { MaterialTheme(colors = DarkColorPallet) { when (screenState) { + Screen.REGISTRATION -> + Registration( + modifier = Modifier.background(briarBlack), + onSubmit = { username, password -> + accountManager.createAccount(username, password) + signedIn() + screenState = Screen.MAIN + } + ) Screen.LOGIN -> Login( - "Briar", modifier = Modifier.background(briarBlack), onResult = { try { @@ -123,7 +123,10 @@ constructor( val dbKey = accountManager.databaseKey ?: throw AssertionError() lifecycleManager.startServices(dbKey) lifecycleManager.waitForStartup() - val contacts: Collection<Contact> = contactManager.getContacts() + val contacts = contactManager.getContacts() + if (contacts.isEmpty()) { + //todo: add some dummy account to db + } for (contact in contacts) { println("${contact.author.name} (${contact.alias})") this.contacts.add(contact) diff --git a/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Login.kt b/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Login.kt index 06f13c19084b490078ca4988bb2922b708cc7b21..427a55c238ff6faf72821b5efe900ce888fb5c08 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Login.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Login.kt @@ -22,46 +22,39 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.svgResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp // TODO: Error handling @Composable fun Login( - title: String, modifier: Modifier = Modifier, onResult: (result: String) -> Unit -) = +) { + var password by remember { mutableStateOf("") } Column( modifier = modifier.padding(16.dp).fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { - TheImage() + BriarLogo() Spacer(Modifier.height(32.dp)) - TheTextField(onResult) + OutlinedTextField( + value = password, + onValueChange = { password = it }, + label = { Text("Password") }, + singleLine = true, + textStyle = TextStyle(color = Color.White), + visualTransformation = PasswordVisualTransformation() + ) + Spacer(Modifier.height(16.dp)) + Button(onClick = { onResult.invoke(password) }) { + Text("Login", color = Color.Black) + } } - -@Composable -private fun TheImage() { - Image( - painter = svgResource("images/logo_circle.svg"), - contentDescription = "Briar logo", - modifier = Modifier - .fillMaxWidth() - .clip(shape = RoundedCornerShape(400.dp)) - ) } @Composable -private fun TheTextField(onResult: (result: String) -> Unit) { - var password by remember { mutableStateOf("") } - OutlinedTextField(password, { password = it }, label = { Text("Password") }) - Spacer(Modifier.height(16.dp)) - Button( - onClick = { - onResult.invoke(password) - } - ) { - Text("Login", color = Color.Black) - } -} +fun BriarLogo(modifier: Modifier = Modifier.fillMaxWidth().clip(shape = RoundedCornerShape(400.dp))) = + Image(svgResource("images/logo_circle.svg"), "Briar logo", modifier) diff --git a/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Registration.kt b/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Registration.kt index 479c901ff738bd21fc09925a34946a0acbf44353..523523391fd141f67af2922fb133f38e5da3dbc2 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Registration.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/dialogs/Registration.kt @@ -1,15 +1,11 @@ package org.briarproject.briar.desktop.dialogs -import androidx.compose.desktop.Window -import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer 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.shape.RoundedCornerShape import androidx.compose.material.Button import androidx.compose.material.OutlinedTextField import androidx.compose.material.Text @@ -20,52 +16,44 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.res.svgResource +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp -import org.briarproject.bramble.api.account.AccountManager -import org.briarproject.bramble.api.lifecycle.LifecycleManager // TODO: Error handling and password strength -fun Registration(title: String, accountManager: AccountManager, lifecycleManager: LifecycleManager) = - Window(title = title) { - Column( - modifier = Modifier.padding(16.dp).fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - TheImage() - Spacer(Modifier.height(32.dp)) - TheTextFields(accountManager, lifecycleManager) - } - } - -@Composable -private fun TheImage() { - Image( - painter = svgResource("images/logo_circle.svg"), - contentDescription = "Briar logo", - modifier = Modifier - .fillMaxWidth() - .clip(shape = RoundedCornerShape(400.dp)) - ) -} - @Composable -private fun TheTextFields(accountManager: AccountManager, lifecycleManager: LifecycleManager) { +fun Registration( + modifier: Modifier = Modifier, + onSubmit: (username: String, password: String) -> Unit +) { var username by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } - OutlinedTextField(username, { username = it }, label = { Text("Username") }) - OutlinedTextField(password, { password = it }, label = { Text("Password") }) - Spacer(Modifier.height(16.dp)) - Button( - onClick = { - accountManager.createAccount(username, password) - val dbKey = accountManager.databaseKey ?: throw AssertionError() - lifecycleManager.startServices(dbKey) - lifecycleManager.waitForStartup() - } + Column( + modifier = modifier.padding(16.dp).fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally ) { - Text("Register") + BriarLogo() + Spacer(Modifier.height(32.dp)) + OutlinedTextField( + value = username, + onValueChange = { username = it }, + label = { Text("Username") }, + singleLine = true, + textStyle = TextStyle(color = Color.White), + ) + OutlinedTextField( + value = password, + onValueChange = { password = it }, + label = { Text("Password") }, + singleLine = true, + textStyle = TextStyle(color = Color.White), + visualTransformation = PasswordVisualTransformation(), + ) + Spacer(Modifier.height(16.dp)) + Button(onClick = { onSubmit.invoke(username, password) }) { + Text("Register") + } } }