diff --git a/apps/android/app/src/main/java/chat/simplex/app/MainActivity.kt b/apps/android/app/src/main/java/chat/simplex/app/MainActivity.kt index dfd150c0d2..5870e1fa1d 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/MainActivity.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/MainActivity.kt @@ -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() + 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") } diff --git a/apps/android/app/src/main/java/chat/simplex/app/MainPage.kt b/apps/android/app/src/main/java/chat/simplex/app/MainPage.kt index 69930bde53..d7abb01223 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/MainPage.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/MainPage.kt @@ -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) } diff --git a/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt b/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt index 8803729b2f..62a4113a1e 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt @@ -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")) } diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt index d5e2eb65c2..5c82f51225 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt @@ -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(null) var terminalItems = mutableStateListOf() + fun setCurrentUser(u: User?){ + currentUser = mutableStateOf(u) + } + companion object { val sampleData: ChatModel get() { val m = ChatModel(ChatController.Mock()) diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt index c5449969ec..974e6d1776 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt @@ -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") { diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt index 6169cc09b8..4fde8eb87c 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt @@ -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 { diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/WelcomeView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/WelcomeView.kt index e0ed85466f..30a4334a0a 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/WelcomeView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/WelcomeView.kt @@ -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")} } } \ No newline at end of file