yayan 1 anno fa
parent
commit
6ff79510f0

+ 19 - 23
app/src/main/java/io/nexilis/alpha/ui/components/BubleChat.kt

@@ -37,7 +37,7 @@ import io.nexilis.service.data.viewmodels.MessageStatusViewModel
 @Composable
 fun RightBubbleChat(
     modifier: Modifier,
-    message: Message?,
+    message: Message,
     messageStatusModel: MessageStatusViewModel = hiltViewModel(),
     content: @Composable () -> Unit
 ) {
@@ -65,32 +65,28 @@ fun RightBubbleChat(
             Text(
                 text = DateUtils.formatDateTime(
                     LocalContext.current,
-                    message?.server_date ?: 0,
+                    message.server_date,
                     DateUtils.FORMAT_SHOW_TIME
                 ),
                 color = MaterialTheme.colorScheme.onPrimaryContainer,
                 style = MaterialTheme.typography.bodySmall,
             )
             Spacer(modifier = Modifier.width(6.dp))
-            message?.message_id?.let {
-                message.opposite_pin.let { pin ->
-                    val messageStatus by messageStatusModel.get(it, pin)
-                        .observeAsState()
-                    Icon(
-                        imageVector = when (messageStatus?.status) {
-                            1, 2 -> Icons.Default.Done
-                            3 -> Icons.Default.DoneAll
-                            4 -> Icons.Default.DoneAll
-                            else -> Icons.Default.AccessTime
-                        },
-                        contentDescription = "",
-                        modifier = Modifier
-                            .align(Alignment.Bottom)
-                            .size(16.dp),
-                        tint = if (messageStatus?.status == 4) Color.BlueSky else Color.Gray
-                    )
-                }
-            }
+            val messageStatus by messageStatusModel.get(message.message_id, message.opposite_pin)
+                .observeAsState()
+            Icon(
+                imageVector = when (messageStatus?.status) {
+                    1, 2 -> Icons.Default.Done
+                    3 -> Icons.Default.DoneAll
+                    4 -> Icons.Default.DoneAll
+                    else -> Icons.Default.AccessTime
+                },
+                contentDescription = "",
+                modifier = Modifier
+                    .align(Alignment.Bottom)
+                    .size(16.dp),
+                tint = if (messageStatus?.status == 4) Color.BlueSky else Color.Gray
+            )
         }
     }
 }
@@ -99,7 +95,7 @@ fun RightBubbleChat(
 @Composable
 fun LeftBubbleChat(
     modifier: Modifier,
-    message: Message?,
+    message: Message,
     content: @Composable () -> Unit
 ) {
     Column(
@@ -126,7 +122,7 @@ fun LeftBubbleChat(
             Text(
                 text = DateUtils.formatDateTime(
                     LocalContext.current,
-                    message?.server_date ?: 0,
+                    message.server_date,
                     DateUtils.FORMAT_SHOW_TIME
                 ),
                 color = MaterialTheme.colorScheme.onSurface,

+ 16 - 1
app/src/main/java/io/nexilis/alpha/ui/components/Title.kt

@@ -26,12 +26,27 @@ import androidx.navigation.compose.currentBackStackEntryAsState
 import coil.compose.AsyncImage
 import coil.request.ImageRequest
 import io.nexilis.alpha.ui.screen.Screen
+import io.nexilis.alpha.ui.screen.screenItems
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
 @Composable
-fun Title(navMainController: NavHostController, title: String) {
+fun Title(navController: NavHostController, navMainController: NavHostController) {
+    val navBackStackEntry by navController.currentBackStackEntryAsState()
     val navMainBackStackEntry by navMainController.currentBackStackEntryAsState()
     val buddyViewModel: BuddyViewModel = hiltViewModel()
+    var title = ""
+    navBackStackEntry?.destination?.route?.let { route ->
+        try {
+            title = screenItems.first { it.route == route }.title
+        } catch (ignored: Exception) {
+        }
+    }
+    navMainBackStackEntry?.destination?.route?.let { route ->
+        try {
+            title = screenItems.first { it.route == route }.title
+        } catch (ignored: Exception) {
+        }
+    }
     var isChat = false
     var pin = ""
     navMainBackStackEntry?.destination?.route?.let {

+ 34 - 38
app/src/main/java/io/nexilis/alpha/ui/main/Chat.kt

@@ -29,21 +29,19 @@ import io.nexilis.alpha.ui.components.RightBubbleChat
 import io.nexilis.service.core.WhiteTransparent
 import io.nexilis.service.data.entities.Buddy
 import io.nexilis.service.data.entities.Message
-import io.nexilis.service.data.viewmodels.MessageStatusViewModel
 import io.nexilis.service.data.viewmodels.MessageViewModel
 
 @Composable
 fun Chat(
     navController: NavHostController,
     pin: String,
-    me: Buddy?
+    me: Buddy
 ) {
     var textInput by rememberSaveable(stateSaver = TextFieldValue.Saver) {
         mutableStateOf(TextFieldValue("", TextRange(0, 7)))
     }
     val messageModel: MessageViewModel = hiltViewModel()
     val list by messageModel.getOpposite(pin).observeAsState()
-    val messageStatusModel: MessageStatusViewModel = hiltViewModel()
     val state = rememberLazyListState()
     Column(
         modifier = Modifier
@@ -60,48 +58,46 @@ fun Chat(
             reverseLayout = true
         ) {
             items(count = list?.size ?: 0) {
-                val message = list?.let { l ->
-                    val m = l[it]
-                    m
-                }
-                ListItem(modifier = Modifier.fillMaxWidth(), headlineContent = {
-                    Row(
-                        modifier = Modifier.fillMaxWidth(),
-                        horizontalArrangement = if (message?.f_pin == me?.f_pin) Arrangement.End else Arrangement.Start
-                    ) {
-                        if (message?.f_pin == me?.f_pin) {
-                            Spacer(modifier = Modifier.weight(0.1f))
-                            RightBubbleChat(
-                                modifier = Modifier.weight(weight = 0.9f, fill = false),
-                                message = message,
-                                messageStatusModel = messageStatusModel
-                            ) {
-                                Text(
-                                    text = list?.get(it)?.message_text ?: "",
-                                    style = MaterialTheme.typography.bodyMedium,
-                                )
-                            }
-                        } else {
-                            LeftBubbleChat(
-                                modifier = Modifier.weight(weight = 0.9f, fill = false),
-                                message = message
-                            ) {
-                                Text(
-                                    text = list?.get(it)?.message_text ?: "",
-                                    style = MaterialTheme.typography.bodyMedium,
-                                )
+                list?.let { l ->
+                    val message = l[it]
+                    ListItem(modifier = Modifier.fillMaxWidth(), headlineContent = {
+                        Row(
+                            modifier = Modifier.fillMaxWidth(),
+                            horizontalArrangement = if (message.f_pin == me.f_pin) Arrangement.End else Arrangement.Start
+                        ) {
+                            if (message.f_pin == me.f_pin) {
+                                Spacer(modifier = Modifier.weight(0.1f))
+                                RightBubbleChat(
+                                    modifier = Modifier.weight(weight = 0.9f, fill = false),
+                                    message = message,
+                                ) {
+                                    Text(
+                                        text = list?.get(it)?.message_text ?: "",
+                                        style = MaterialTheme.typography.bodyMedium,
+                                    )
+                                }
+                            } else {
+                                LeftBubbleChat(
+                                    modifier = Modifier.weight(weight = 0.9f, fill = false),
+                                    message = message
+                                ) {
+                                    Text(
+                                        text = list?.get(it)?.message_text ?: "",
+                                        style = MaterialTheme.typography.bodyMedium,
+                                    )
+                                }
+                                Spacer(modifier = Modifier.weight(0.1f))
                             }
-                            Spacer(modifier = Modifier.weight(0.1f))
                         }
-                    }
-                }, colors = ListItemDefaults.colors(containerColor = Color.Transparent))
+                    }, colors = ListItemDefaults.colors(containerColor = Color.Transparent))
+                }
+
             }
         }
         TextField(
             modifier = Modifier
                 .fillMaxWidth()
                 .graphicsLayer {
-//                    shadowElevation = 2.dp.toPx()
                     shape = CircleShape
                     clip = true
                 }
@@ -134,7 +130,7 @@ fun Chat(
                         if (textInput.text.trim().isEmpty()) {
                             return@IconButton
                         }
-                        me?.let {
+                        me.let {
                             messageModel.send(
                                 Message(
                                     message_id = System.nanoTime().toString(),

+ 1 - 6
app/src/main/java/io/nexilis/alpha/ui/main/Chats.kt

@@ -25,7 +25,6 @@ import androidx.navigation.NavHostController
 import coil.compose.AsyncImage
 import coil.request.ImageRequest
 import io.nexilis.alpha.ui.screen.Screen
-import io.nexilis.alpha.ui.viewmodel.MainViewModel
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 import io.nexilis.service.data.viewmodels.MessageSummaryViewModel
 import io.nexilis.service.data.viewmodels.MessageViewModel
@@ -33,12 +32,8 @@ import io.nexilis.service.data.viewmodels.MessageViewModel
 @Composable
 fun Chats(
     navController: NavHostController,
-    contentPadding: PaddingValues = PaddingValues(0.dp),
-    mainViewModel: MainViewModel
+    contentPadding: PaddingValues = PaddingValues(0.dp)
 ) {
-    SideEffect {
-        mainViewModel.setTitle("Chats")
-    }
     val messageSummaryViewModel: MessageSummaryViewModel = hiltViewModel()
     val chats by messageSummaryViewModel.all.observeAsState()
     val messageViewModel: MessageViewModel = hiltViewModel()

+ 1 - 5
app/src/main/java/io/nexilis/alpha/ui/main/Contact.kt

@@ -22,14 +22,10 @@ import androidx.navigation.NavHostController
 import coil.compose.AsyncImage
 import coil.request.ImageRequest
 import io.nexilis.alpha.ui.screen.Screen
-import io.nexilis.alpha.ui.viewmodel.MainViewModel
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
 @Composable
-fun Contact(navController: NavHostController, mainViewModel: MainViewModel) {
-    SideEffect {
-        mainViewModel.setTitle("Contact")
-    }
+fun Contact(navController: NavHostController) {
     val viewModel: BuddyViewModel = hiltViewModel()
     val all by viewModel.all.observeAsState()
     var selectedItem by remember { mutableStateOf(0) }

+ 0 - 6
app/src/main/java/io/nexilis/alpha/ui/main/Home.kt

@@ -5,7 +5,6 @@ import androidx.compose.foundation.layout.*
 import androidx.compose.foundation.lazy.grid.GridCells
 import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.SideEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.ui.Modifier
@@ -17,18 +16,13 @@ import androidx.hilt.navigation.compose.hiltViewModel
 import coil.compose.AsyncImage
 import coil.request.ImageRequest
 import io.nexilis.alpha.R
-import io.nexilis.alpha.ui.viewmodel.MainViewModel
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 fun Home(
     contentPadding: PaddingValues = PaddingValues(0.dp),
-    mainViewModel: MainViewModel
 ) {
-    SideEffect {
-        mainViewModel.setTitle("Home")
-    }
     val viewModel: BuddyViewModel = hiltViewModel()
     val all by viewModel.all.observeAsState()
     LazyVerticalGrid(

+ 8 - 19
app/src/main/java/io/nexilis/alpha/ui/main/Main.kt

@@ -7,9 +7,7 @@ import androidx.compose.material.icons.automirrored.filled.ArrowBack
 import androidx.compose.material.icons.automirrored.filled.Chat
 import androidx.compose.material3.*
 import androidx.compose.runtime.*
-import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.ui.Modifier
-import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.navigation.NavDestination.Companion.hierarchy
 import androidx.navigation.NavGraph.Companion.findStartDestination
 import androidx.navigation.NavHostController
@@ -23,12 +21,12 @@ import androidx.navigation.navigation
 import io.nexilis.alpha.ui.components.ActionsMenu
 import io.nexilis.alpha.ui.components.Title
 import io.nexilis.alpha.ui.screen.Screen
-import io.nexilis.alpha.ui.viewmodel.MainViewModel
+import io.nexilis.alpha.ui.screen.barItems
 import io.nexilis.service.data.entities.Buddy
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-fun Main(navController: NavHostController, me: Buddy?) {
+fun Main(navController: NavHostController, me: Buddy) {
     val navMainController = rememberNavController()
     val hostState = remember { SnackbarHostState() }
     val navBackStackEntry by navMainController.currentBackStackEntryAsState()
@@ -40,16 +38,13 @@ fun Main(navController: NavHostController, me: Buddy?) {
                 it == Screen.Home.route || it == Screen.Chats.route || it == Screen.Profile.route
         }
     }
-    val mainViewModel: MainViewModel = hiltViewModel()
-    val title by mainViewModel.title.observeAsState("")
     Scaffold(
         modifier = Modifier.fillMaxSize(),
         topBar = {
             TopAppBar(
                 title = {
-                    Title(
-                        navMainController = navMainController,
-                        title
+                    Title( navController = navController,
+                        navMainController = navMainController
                     )
                 },
                 navigationIcon = {
@@ -82,20 +77,19 @@ fun Main(navController: NavHostController, me: Buddy?) {
             route = Graph.home
         ) {
             composable(route = Screen.Home.route) {
-                Home(mainViewModel = mainViewModel)
+                Home()
             }
             composable(route = Screen.Chats.route) {
                 Chats(
-                    navController = navMainController,
-                    mainViewModel = mainViewModel
+                    navController = navMainController
                 )
             }
             composable(route = Screen.Profile.route) {
-                Profile(mainViewModel = mainViewModel)
+                Profile(me = me)
             }
             navigation(route = Graph.child, startDestination = Screen.Contact.route) {
                 composable(route = Screen.Contact.route) {
-                    Contact(navController = navMainController, mainViewModel = mainViewModel)
+                    Contact(navController = navMainController)
                 }
                 composable(
                     route = Screen.Chat.route + "/{pin}",
@@ -138,11 +132,6 @@ fun NavigationIcon(navController: NavHostController, isHome: Boolean) {
 fun BottomBar(navController: NavHostController, isHome: Boolean) {
     val navBackStackEntry by navController.currentBackStackEntryAsState()
     val currentDestination = navBackStackEntry?.destination
-    val barItems = listOf(
-        Screen.Home,
-        Screen.Chats,
-        Screen.Profile
-    )
     if (isHome) NavigationBar {
         barItems.forEachIndexed { index, screen ->
             NavigationBarItem(

+ 9 - 18
app/src/main/java/io/nexilis/alpha/ui/main/Profile.kt

@@ -13,7 +13,6 @@ import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.*
 import androidx.compose.material3.*
 import androidx.compose.runtime.*
-import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clip
@@ -27,18 +26,14 @@ import androidx.hilt.navigation.compose.hiltViewModel
 import coil.compose.rememberAsyncImagePainter
 import coil.request.ImageRequest
 import io.nexilis.alpha.BuildConfig
-import io.nexilis.alpha.ui.viewmodel.MainViewModel
 import io.nexilis.service.core.createImageFile
+import io.nexilis.service.data.entities.Buddy
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 import java.util.Objects
 
 @Composable
-fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), mainViewModel: MainViewModel) {
-    SideEffect {
-        mainViewModel.setTitle("Profile")
-    }
+fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), me: Buddy) {
     val viewModel: BuddyViewModel = hiltViewModel()
-    val me by viewModel.me.observeAsState()
     val context = LocalContext.current
     val file = context.createImageFile()
     val uri = FileProvider.getUriForFile(
@@ -48,10 +43,8 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), mainViewModel:
     var imageUri by remember { mutableStateOf<Uri>(Uri.EMPTY) }
     val launcher = rememberLauncherForActivityResult(ActivityResultContracts.TakePicture()) {
         if (it && uri.path?.isNotEmpty() == true) {
-            me?.let { me ->
-                viewModel.changeProfile(me.f_pin, file) {
-                    imageUri = uri
-                }
+            viewModel.changeProfile(me.f_pin, file) {
+                imageUri = uri
             }
         }
     }
@@ -80,7 +73,7 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), mainViewModel:
                     rememberAsyncImagePainter(imageUri)
                 else rememberAsyncImagePainter(
                     model = ImageRequest.Builder(LocalContext.current)
-                        .data("https://digixplatform.com/filepalio/image/${me?.image_id}")
+                        .data("https://digixplatform.com/filepalio/image/${me.image_id}")
                         .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
                         .crossfade(true)
                         .build()
@@ -112,12 +105,10 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), mainViewModel:
         ListItem(
             headlineContent = { Text("Name", style = MaterialTheme.typography.bodySmall) },
             supportingContent = {
-                me?.first_name?.let {
-                    Text(
-                        it,
-                        style = MaterialTheme.typography.titleMedium
-                    )
-                }
+                Text(
+                    me.first_name,
+                    style = MaterialTheme.typography.titleMedium
+                )
             },
             leadingContent = {
                 Icon(imageVector = Icons.Default.Person, contentDescription = "")

+ 3 - 3
app/src/main/java/io/nexilis/alpha/ui/main/Root.kt

@@ -17,8 +17,8 @@ fun Root(navController: NavHostController = rememberNavController()) {
     val viewModel: BuddyViewModel = hiltViewModel()
     val me by viewModel.me.observeAsState()
     var start = Graph.authentication
-    me?.let {
-        val isAnonymous = it.first_name.startsWith("USR") && it.is_change_profile == "0"
+    me?.let { buddy ->
+        val isAnonymous = buddy.first_name.startsWith("USR") && buddy.is_change_profile == "0"
         if (!isAnonymous) {
             start = Graph.home
         }
@@ -33,7 +33,7 @@ fun Root(navController: NavHostController = rememberNavController()) {
                 }
             }
             composable(route = Graph.home) {
-                Main(navController = navController, me = me)
+                Main(navController = navController, me = buddy)
             }
             composable(route = Screen.Friend.route) {
                 Friend(navController = navController)

+ 0 - 5
app/src/main/java/io/nexilis/alpha/ui/main/Sign.kt

@@ -20,7 +20,6 @@ import androidx.compose.ui.text.input.VisualTransformation
 import androidx.compose.ui.unit.dp
 import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.navigation.NavHostController
-import io.nexilis.alpha.ui.viewmodel.MainViewModel
 import io.nexilis.service.core.getSharedPreferences
 import io.nexilis.service.core.optString
 import io.nexilis.service.core.put
@@ -29,12 +28,8 @@ import io.nexilis.service.data.viewmodels.BuddyViewModel
 @Composable
 fun SignUp(
     navController: NavHostController,
-    mainViewModel: MainViewModel = hiltViewModel(),
     completion: (Boolean) -> Unit
 ) {
-    SideEffect {
-        mainViewModel.setTitle("Sign Up")
-    }
     var textUsername by rememberSaveable(stateSaver = TextFieldValue.Saver) {
         mutableStateOf(TextFieldValue("", TextRange(0, 7)))
     }

+ 20 - 3
app/src/main/java/io/nexilis/alpha/ui/screen/Screen.kt

@@ -1,7 +1,7 @@
 package io.nexilis.alpha.ui.screen
 
 import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.Chat
+import androidx.compose.material.icons.automirrored.filled.Chat
 import androidx.compose.material.icons.filled.Email
 import androidx.compose.material.icons.filled.Home
 import androidx.compose.material.icons.filled.Person
@@ -13,11 +13,28 @@ sealed class Screen(
     val title: String
 ) {
     object Home : Screen("home", Icons.Filled.Home, "Home")
-    object Chats : Screen("chats", Icons.Filled.Chat, "Chats")
+    object Chats : Screen("chats", Icons.AutoMirrored.Filled.Chat, "Chats")
     object Profile : Screen("profile", Icons.Filled.Person, "Profile")
     object Contact : Screen("contact", Icons.Filled.Email, "Contact")
     object Chat : Screen("chat", Icons.Filled.Email, "Chat")
     object SignIn : Screen("sign_in", Icons.Filled.Email, "Sign In")
     object SignUp : Screen("sign_up", Icons.Filled.Email, "Sign Up")
     object Friend : Screen("friend", Icons.Filled.Person, "Friend")
-}
+}
+
+val barItems = listOf(
+    Screen.Home,
+    Screen.Chats,
+    Screen.Profile
+)
+
+val screenItems = listOf(
+    Screen.Home,
+    Screen.Chats,
+    Screen.Profile,
+    Screen.Contact,
+    Screen.Chat,
+    Screen.SignIn,
+    Screen.SignUp,
+    Screen.Friend,
+)

+ 0 - 20
app/src/main/java/io/nexilis/alpha/ui/viewmodel/MainViewModel.kt

@@ -1,20 +0,0 @@
-package io.nexilis.alpha.ui.viewmodel
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import dagger.hilt.android.lifecycle.HiltViewModel
-import javax.inject.Inject
-
-@HiltViewModel
-class MainViewModel @Inject constructor() : ViewModel() {
-
-    private val _title = MutableLiveData("")
-
-    val title: LiveData<String> get() = _title
-
-    fun setTitle(title: String) {
-        _title.value = title
-    }
-
-}