yayan 1 жил өмнө
parent
commit
9a3de136b8

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

@@ -1,22 +1,60 @@
 package io.nexilis.alpha.ui.main
 
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.selection.selectable
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Groups
 import androidx.compose.material3.*
 import androidx.compose.runtime.*
 import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.rememberVectorPainter
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.unit.dp
 import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.navigation.NavHostController
+import coil.compose.AsyncImage
+import coil.request.ImageRequest
 import io.nexilis.alpha.ui.components.Person
 import io.nexilis.alpha.ui.screen.Screen
 import io.nexilis.service.data.viewmodels.BuddyViewModel
+import io.nexilis.service.data.viewmodels.GroupViewModel
 
 @Composable
 fun Contact(navController: NavHostController) {
+    var state by rememberSaveable { mutableIntStateOf(0) }
+    val titles = listOf("Friends", "Groups")
+    Column {
+        TabRow(selectedTabIndex = state) {
+            titles.forEachIndexed { index, title ->
+                Tab(
+                    text = { Text(title) },
+                    selected = state == index,
+                    onClick = { state = index }
+                )
+            }
+        }
+        if (state == 0) {
+            PersonContact(navController = navController)
+        } else {
+            GroupContact(navController = navController)
+        }
+    }
+}
+
+@Composable
+fun PersonContact(navController: NavHostController) {
     val viewModel: BuddyViewModel = hiltViewModel()
     val all by viewModel.all.observeAsState()
-    var selectedItem by remember { mutableStateOf(0) }
+    var selectedItem by remember { mutableIntStateOf(0) }
     LazyColumn {
         items(
             count = all?.size ?: 0,
@@ -52,4 +90,59 @@ fun Contact(navController: NavHostController) {
             }
         }
     }
+}
+
+@Composable
+fun GroupContact(navController: NavHostController) {
+    val viewModel: GroupViewModel = hiltViewModel()
+    val all by viewModel.allGroup.observeAsState()
+    var selectedItem by remember { mutableIntStateOf(0) }
+    LazyColumn {
+        items(
+            count = all?.size ?: 0,
+            key = {
+                all?.get(it)?.group_id ?: 0
+            }
+        ) { item ->
+            all?.get(item)?.let {
+                ListItem(
+                    modifier = Modifier.selectable(selected = selectedItem == item, onClick = {
+                        selectedItem = item
+                        navController.navigate(Screen.Chat.route + "/${it.group_id}") {
+                            launchSingleTop = true
+                            restoreState = true
+                        }
+                    }),
+                    headlineContent = {
+                        Text(
+                            it.f_name.trim(),
+                            style = MaterialTheme.typography.titleSmall
+                        )
+                    },
+                    supportingContent = {
+                        Text(
+                            "",
+                            style = MaterialTheme.typography.bodySmall
+                        )
+                    },
+                    leadingContent = {
+                        AsyncImage(
+                            model = ImageRequest.Builder(LocalContext.current)
+                                .data("https://digixplatform.com/filepalio/image/${it.image_id}")
+                                .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
+                                .crossfade(true)
+                                .build(),
+                            contentDescription = "",
+                            contentScale = ContentScale.Crop,
+                            modifier = Modifier
+                                .size(48.dp)
+                                .clip(CircleShape)
+                                .background(Color.LightGray),
+                            error = rememberVectorPainter(image = Icons.Default.Groups),
+                        )
+                    }
+                )
+            }
+        }
+    }
 }

+ 1 - 1
cpaas-lite/src/main/java/io/nexilis/service/data/daos/GroupDao.kt

@@ -14,7 +14,7 @@ interface GroupDao {
     fun getAll(): LiveData<List<Group>>
 
     @Query("select * from `Group` where group_id = :id")
-    fun get(id: String): LiveData<List<Group>>
+    fun get(id: String): LiveData<Group>
 
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     suspend fun insert(entity: Group)

+ 5 - 0
cpaas-lite/src/main/java/io/nexilis/service/data/repositories/GroupRepository.kt

@@ -13,4 +13,9 @@ class GroupRepository @Inject constructor(private val dao: GroupDao) : Repositor
     override suspend fun insert(entity: MainEntity) {
         dao.insert(entity as Group)
     }
+
+    fun get(id: String): LiveData<Group> {
+        return dao.get(id)
+    }
+
 }

+ 28 - 0
cpaas-lite/src/main/java/io/nexilis/service/data/viewmodels/GroupViewModel.kt

@@ -0,0 +1,28 @@
+package io.nexilis.service.data.viewmodels
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import dagger.hilt.android.lifecycle.HiltViewModel
+import io.nexilis.service.data.entities.Buddy
+import io.nexilis.service.data.entities.Group
+import io.nexilis.service.data.repositories.GroupMemberRepository
+import io.nexilis.service.data.repositories.GroupRepository
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class GroupViewModel @Inject constructor(private val repository: GroupRepository, private val memberRepository: GroupMemberRepository) : ViewModel() {
+
+    val allGroup: LiveData<List<Group>> = repository.all
+
+    fun getGroup(id: String): LiveData<Group> {
+        return repository.get(id)
+    }
+
+    fun insert(buddy: Buddy) = viewModelScope.launch(Dispatchers.IO) {
+        repository.insert(buddy)
+    }
+
+}

+ 1 - 1
gradle/libs.versions.toml

@@ -8,7 +8,7 @@ junitVersion = "1.1.5"
 espressoCore = "3.5.1"
 lifecycleRuntimeKtx = "2.7.0"
 activityCompose = "1.8.2"
-composeBom = "2024.02.02"
+composeBom = "2024.03.00"
 hilt = "2.49"
 hiltNavigation = "1.2.0"
 gms = "4.3.14"