Id/conditional nav on launch (#326)

* add initial conditional routing -- create user not working

* only one nav controller

* user check on launch works (kind of)

* Apply suggestions from code review

Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>

Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
This commit is contained in:
IanRDavies
2022-02-17 17:07:58 +00:00
committed by GitHub
parent e8ff6f509b
commit 9e46b5117d
7 changed files with 69 additions and 36 deletions
@@ -8,18 +8,24 @@ import androidx.activity.viewModels
import androidx.compose.runtime.Composable
import chat.simplex.app.ui.theme.SimpleXTheme
import androidx.lifecycle.AndroidViewModel
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import chat.simplex.app.views.DetailView
import chat.simplex.app.views.TerminalView
import chat.simplex.app.views.WelcomeView
class MainActivity: ComponentActivity() {
private val viewModel by viewModels<SimplexViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
SimpleXTheme {
Navigation(viewModel = viewModel)
Navigation(viewModel=viewModel)
}
}
}
@@ -35,11 +41,22 @@ fun Navigation(viewModel: SimplexViewModel) {
NavHost(navController=navController, startDestination=Pages.Home.route){
composable(route=Pages.Home.route){
MainPage(vm = viewModel)
MainPage(vm = viewModel, navController = navController)
}
// composable(route=Pages.Welcome.route){
// WelcomeView(vm.)
// }
composable(route = Pages.Welcome.route){
WelcomeView(vm = viewModel) {navController.navigate(Pages.Home.route) { popUpTo(Pages.Home.route) { inclusive = true }}}
}
composable(route = Pages.Terminal.route) {
TerminalView(chatModel = viewModel.chatModel, navController = navController)
}
composable(
Pages.TerminalItemDetails.route + "/{identifier}",
arguments = listOf(
navArgument("identifier"){
type = NavType.LongType
}
)
) { entry -> DetailView( entry.arguments!!.getLong("identifier"), viewModel.chatModel.terminalItems, navController) }
}
}
@@ -47,4 +64,5 @@ sealed class Pages(val route: String) {
object Home : Pages("home")
object Terminal : Pages("terminal")
object Welcome : Pages("welcome")
object TerminalItemDetails : Pages("details")
}
@@ -1,9 +1,14 @@
package chat.simplex.app
import androidx.compose.runtime.Composable
import chat.simplex.app.views.TerminalPage
import androidx.navigation.NavController
import chat.simplex.app.views.TerminalView
import chat.simplex.app.views.WelcomeView
@Composable
fun MainPage(vm: SimplexViewModel) {
TerminalPage(vm.chatModel)
fun MainPage(vm: SimplexViewModel, navController: NavController) {
if (vm.chatModel.currentUser.value == null) WelcomeView(vm=vm) {
navController.navigate(Pages.Terminal.route)
}
else TerminalView(vm.chatModel, navController)
}
@@ -35,6 +35,7 @@ class SimplexApp: Application() {
GlobalScope.launch {
withContext(Dispatchers.Main) {
var user = controller.apiGetActiveUser()
controller.setCurrentUser(user)
if (user == null) {
// user = controller.apiCreateActiveUser(Profile("android", "Android test"))
}
@@ -1,13 +1,17 @@
package chat.simplex.app.model
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import kotlinx.serialization.Serializable
import java.util.*
class ChatModel(val controller: ChatController) {
val currentUser: User? = null
var currentUser = mutableStateOf<User?>(null)
var terminalItems = mutableStateListOf<TerminalItem>()
fun setCurrentUser(u: User?){
currentUser = mutableStateOf<User?>(u)
}
companion object {
val sampleData: ChatModel get() {
val m = ChatModel(ChatController.Mock())
@@ -21,6 +21,9 @@ open class ChatController(val ctrl: ChatCtrl) {
fun setModel(m: ChatModel) {
chatModel = m
}
suspend fun setCurrentUser(u: User?){
chatModel!!.setCurrentUser(u)
}
fun startReceiver() {
thread(name="receiver") {
@@ -27,22 +27,6 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@Composable
fun TerminalPage(chatModel: ChatModel) {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = Pages.Terminal.route){
composable(Pages.Terminal.route) { TerminalView(chatModel, navController) }
composable(
"details" + "/{identifier}",
arguments=listOf(
navArgument("identifier"){
type = NavType.LongType
}
)
) { entry -> DetailView( entry.arguments!!.getLong("identifier"), chatModel.terminalItems, navController) }
}
}
@Composable
fun TerminalView(chatModel: ChatModel, navController: NavController) {
Column {
@@ -2,6 +2,8 @@ package chat.simplex.app.views
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.Image
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.ui.res.painterResource
import androidx.compose.runtime.*
import androidx.compose.runtime.Composable
@@ -11,11 +13,18 @@ import androidx.compose.material.TextField
import androidx.compose.material.Button
import androidx.compose.ui.unit.dp
import androidx.compose.ui.Modifier
import androidx.navigation.NavController
import chat.simplex.app.SimplexViewModel
import chat.simplex.app.model.Profile
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@Composable
fun WelcomeView(createUser: (data: String) -> String, navController: NavController) {
Column {
fun WelcomeView(vm: SimplexViewModel, routeHome: () -> Unit) {
Column(
modifier = Modifier.verticalScroll(rememberScrollState())
) {
Image(
painter=painterResource(R.drawable.logo), contentDescription = "Simplex Logo",
)
@@ -24,12 +33,12 @@ fun WelcomeView(createUser: (data: String) -> String, navController: NavControll
Spacer(Modifier.height(8.dp))
Text("We don't store any of your contacts or messages (once delivered) on the servers.")
Spacer(Modifier.height(24.dp))
CreateProfilePanel(createUser, navController)
CreateProfilePanel(vm, routeHome)
}
}
@Composable
fun CreateProfilePanel(createUser: (data: String) -> String, navController: NavController) {
fun CreateProfilePanel(vm: SimplexViewModel, routeHome: () -> Unit) {
var displayName by remember { mutableStateOf("") }
var fullName by remember { mutableStateOf("") }
@@ -37,12 +46,21 @@ fun CreateProfilePanel(createUser: (data: String) -> String, navController: NavC
Text("Create profile")
Text("Your profile is stored on your device and shared only with your contacts.")
Text("Display Name")
TextField(value = displayName, onValueChange = { displayName = it }, modifier = Modifier.height(30.dp))
TextField(value = displayName, onValueChange = { value -> displayName = value })
Text("Full Name (Optional)")
TextField(value = fullName, onValueChange = { fullName = it }, modifier = Modifier.height(30.dp))
TextField(value = fullName, onValueChange = { fullName = it })
Button(onClick={
createUser("{\"displayName\": $displayName, \"fullName\": $fullName}")
navController.navigate("home") { popUpTo("home") { inclusive = true }}
}) { Text("Create")}
GlobalScope.launch {
withContext(Dispatchers.Main) {
val user = vm.chatModel.controller.apiCreateActiveUser(
Profile(displayName, fullName)
)
vm.chatModel.setCurrentUser(user)
routeHome()
}
}
},
enabled = displayName.isNotEmpty()
) { Text("Create")}
}
}