yayan 1 tahun lalu
induk
melakukan
6f2304b976

+ 2 - 0
app/src/main/java/io/nexilis/alpha/ui/components/ContentChat.kt

@@ -4,6 +4,7 @@ import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.aspectRatio
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
@@ -47,6 +48,7 @@ fun ContentChat(modifier: Modifier, message: Message) {
                 painter = rememberAsyncImagePainter(uri),
                 contentDescription = "",
                 modifier = modifier
+                    .aspectRatio(3f/4f)
                     .graphicsLayer {
                         shape = RoundedCornerShape(12.dp)
                         clip = true

+ 78 - 0
app/src/main/java/io/nexilis/alpha/ui/components/Person.kt

@@ -0,0 +1,78 @@
+package io.nexilis.alpha.ui.components
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Person
+import androidx.compose.material.icons.filled.Verified
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+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 coil.compose.AsyncImage
+import coil.request.ImageRequest
+import io.nexilis.service.data.entities.Buddy
+
+@Composable
+fun Person(buddy: Buddy) {
+    Column {
+        Box(
+            Modifier.align(Alignment.CenterHorizontally),
+            contentAlignment = Alignment.BottomEnd
+        ) {
+            AsyncImage(
+                model = ImageRequest.Builder(LocalContext.current)
+                    .data("https://digixplatform.com/filepalio/image/${buddy.image_id}")
+                    .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
+                    .crossfade(true)
+                    .build(),
+                placeholder = rememberVectorPainter(image = Icons.Default.Person),
+                contentDescription = "",
+                contentScale = ContentScale.Crop,
+                modifier = Modifier
+                    .size(48.dp)
+                    .clip(CircleShape)
+                    .background(Color.LightGray),
+                error = rememberVectorPainter(image = Icons.Default.Person),
+            )
+            if (buddy.official_account != "0") {
+                val color: Color = when (buddy.official_account) {
+                    "1", "3" -> {
+                        Color(0xFF4c87ef)
+                    }
+
+                    "2" -> {
+                        Color(0xFF0cff00)
+                    }
+
+                    "5" -> {
+                        Color(0xFFE000FF)
+                    }
+
+                    else -> {
+                        Color(0xFF4c87ef)
+                    }
+                }
+                Icon(
+                    imageVector = Icons.Default.Verified,
+                    contentDescription = "",
+                    modifier = Modifier
+                        .size(16.dp)
+                        .clip(CircleShape)
+                        .background(color = MaterialTheme.colorScheme.surface),
+                    tint = color
+                )
+            }
+        }
+    }
+}

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

@@ -1,30 +1,18 @@
 package io.nexilis.alpha.ui.components
 
-import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
-import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.Person
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.ui.Alignment
 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 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
@@ -60,22 +48,7 @@ fun Title(navController: NavHostController, navMainController: NavHostController
         Row {
             val buddy by buddyViewModel.getBuddy(pin).observeAsState()
             buddy?.let {
-                AsyncImage(
-                    model = ImageRequest.Builder(LocalContext.current)
-                        .data("https://digixplatform.com/filepalio/image/${it.image_id}")
-                        .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
-                        .crossfade(true)
-                        .build(),
-                    placeholder = rememberVectorPainter(image = Icons.Default.Person),
-                    contentDescription = "",
-                    contentScale = ContentScale.Crop,
-                    modifier = Modifier
-                        .align(Alignment.CenterVertically)
-                        .size(48.dp)
-                        .clip(CircleShape)
-                        .background(Color.LightGray),
-                    error = rememberVectorPainter(image = Icons.Default.Person),
-                )
+                Person(buddy = it)
                 Spacer(modifier = Modifier.width(8.dp))
                 Text(
                     modifier = Modifier.align(Alignment.CenterVertically),

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

@@ -86,7 +86,7 @@ fun Chat(
                                     message = message,
                                 ) {
                                     ContentChat(
-                                        modifier = Modifier.fillParentMaxSize(0.65f),
+                                        modifier = Modifier.fillMaxWidth(0.7f),
                                         message = message
                                     )
                                 }
@@ -96,7 +96,7 @@ fun Chat(
                                     message = message
                                 ) {
                                     ContentChat(
-                                        modifier = Modifier.fillParentMaxSize(0.65f),
+                                        modifier = Modifier.fillMaxWidth(0.7f),
                                         message = message
                                     )
                                 }

+ 2 - 26
app/src/main/java/io/nexilis/alpha/ui/main/Chats.kt

@@ -1,29 +1,19 @@
 package io.nexilis.alpha.ui.main
 
-import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.*
 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.Person
 import androidx.compose.material3.*
 import androidx.compose.runtime.*
 import androidx.compose.runtime.livedata.observeAsState
 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.semantics.contentDescription
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.text.style.TextOverflow
 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.MessageSummaryViewModel
@@ -79,21 +69,7 @@ fun Chats(
                     },
                     leadingContent = {
                         buddy?.let {
-                            AsyncImage(
-                                model = ImageRequest.Builder(LocalContext.current)
-                                    .data("https://digixplatform.com/filepalio/image/${it.image_id}")
-                                    .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
-                                    .crossfade(true)
-                                    .build(),
-                                placeholder = rememberVectorPainter(image = Icons.Default.Person),
-                                contentDescription = "",
-                                contentScale = ContentScale.Crop,
-                                modifier = Modifier
-                                    .size(48.dp)
-                                    .clip(CircleShape)
-                                    .background(Color.LightGray),
-                                error = rememberVectorPainter(image = Icons.Default.Person),
-                            )
+                            Person(buddy = it)
                         }
                     },
                     trailingContent = {

+ 26 - 53
app/src/main/java/io/nexilis/alpha/ui/main/Contact.kt

@@ -1,26 +1,14 @@
 package io.nexilis.alpha.ui.main
 
-import androidx.compose.foundation.background
-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.Person
 import androidx.compose.material3.*
 import androidx.compose.runtime.*
 import androidx.compose.runtime.livedata.observeAsState
 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
 
@@ -36,47 +24,32 @@ fun Contact(navController: NavHostController) {
                 all?.get(it)?.f_pin ?: 0
             }
         ) { item ->
-            val buddy = all?.get(item)
-            ListItem(
-                modifier = Modifier.selectable(selected = selectedItem == item, onClick = {
-                    selectedItem = item
-                    navController.navigate(Screen.Chat.route + "/${buddy?.f_pin}") {
-                        launchSingleTop = true
-                        restoreState = true
+            all?.get(item)?.let {
+                ListItem(
+                    modifier = Modifier.selectable(selected = selectedItem == item, onClick = {
+                        selectedItem = item
+                        navController.navigate(Screen.Chat.route + "/${it.f_pin}") {
+                            launchSingleTop = true
+                            restoreState = true
+                        }
+                    }),
+                    headlineContent = {
+                        Text(
+                            it.first_name,
+                            style = MaterialTheme.typography.titleSmall
+                        )
+                    },
+                    supportingContent = {
+                        Text(
+                            "",
+                            style = MaterialTheme.typography.bodySmall
+                        )
+                    },
+                    leadingContent = {
+                        Person(buddy = it)
                     }
-                }),
-                headlineContent = {
-                    Text(
-                        buddy?.first_name ?: "",
-                        style = MaterialTheme.typography.titleSmall
-                    )
-                },
-                supportingContent = {
-                    Text(
-                        "",
-                        style = MaterialTheme.typography.bodySmall
-                    )
-                },
-                leadingContent = {
-                    AsyncImage(
-                        model = ImageRequest.Builder(LocalContext.current)
-                            .data("https://digixplatform.com/filepalio/image/${buddy?.image_id}")
-                            .addHeader("Cookie" , "PHPSESSID=123;MOBILE=123")
-                            .crossfade(true)
-                            .build(),
-                        placeholder = rememberVectorPainter(image = Icons.Default.Person),
-                        contentDescription = "",
-                        contentScale = ContentScale.Crop,
-                        modifier = Modifier
-                            .size(48.dp)
-                            .clip(CircleShape)
-                            .background(Color.LightGray),
-//                            .padding(8.dp),
-                        error = rememberVectorPainter(image = Icons.Default.Person),
-//                        colorFilter = ColorFilter.tint(Color.White)
-                    )
-                }
-            )
+                )
+            }
         }
     }
 }

+ 7 - 71
app/src/main/java/io/nexilis/alpha/ui/main/Friend.kt

@@ -1,15 +1,11 @@
 package io.nexilis.alpha.ui.main
 
-import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.*
 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.Close
-import androidx.compose.material.icons.filled.Person
 import androidx.compose.material.icons.filled.Search
-import androidx.compose.material.icons.filled.Verified
 import androidx.compose.material3.AlertDialog
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
@@ -33,17 +29,11 @@ import androidx.compose.runtime.setValue
 import androidx.compose.runtime.snapshots.SnapshotStateList
 import androidx.compose.ui.Alignment
 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.input.nestedscroll.nestedScroll
-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.service.data.entities.Buddy
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 import org.json.JSONArray
@@ -169,53 +159,13 @@ fun SearchResultList(
                     openAlertDialog.value = true
                 }),
                 headlineContent = {
-                    Row {
-                        Text(
-                            "${buddy.first_name} ${buddy.last_name}".trim(),
-                            style = MaterialTheme.typography.titleSmall
-                        )
-                        if (buddy.official_account != "0") {
-                            val color: Color = when (buddy.official_account) {
-                                "1", "3" -> {
-                                    Color(0xFF4c87ef)
-                                }
-
-                                "2" -> {
-                                    Color(0xFF0cff00)
-                                }
-
-                                "5" -> {
-                                    Color(0xFFE000FF)
-                                }
-
-                                else -> {
-                                    Color(0xFF4c87ef)
-                                }
-                            }
-                            Icon(
-                                imageVector = Icons.Default.Verified,
-                                contentDescription = "",
-                                tint = color
-                            )
-                        }
-                    }
+                    Text(
+                        "${buddy.first_name} ${buddy.last_name}".trim(),
+                        style = MaterialTheme.typography.titleSmall
+                    )
                 },
                 leadingContent = {
-                    AsyncImage(
-                        model = ImageRequest.Builder(LocalContext.current)
-                            .data("https://digixplatform.com/filepalio/image/${buddy.image_id}")
-                            .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
-                            .crossfade(true)
-                            .build(),
-                        placeholder = rememberVectorPainter(image = Icons.Default.Person),
-                        contentDescription = "",
-                        contentScale = ContentScale.Crop,
-                        modifier = Modifier
-                            .size(48.dp)
-                            .clip(CircleShape)
-                            .background(Color.LightGray),
-                        error = rememberVectorPainter(image = Icons.Default.Person),
-                    )
+                    Person(buddy = buddy)
                 }
             )
         }
@@ -224,21 +174,7 @@ fun SearchResultList(
         val buddy = list[selectedItem]
         AlertDialog(
             icon = {
-                AsyncImage(
-                    model = ImageRequest.Builder(LocalContext.current)
-                        .data("https://digixplatform.com/filepalio/image/${buddy.image_id}")
-                        .addHeader("Cookie", "PHPSESSID=123;MOBILE=123")
-                        .crossfade(true)
-                        .build(),
-                    placeholder = rememberVectorPainter(image = Icons.Default.Person),
-                    contentDescription = "",
-                    contentScale = ContentScale.Crop,
-                    modifier = Modifier
-                        .size(48.dp)
-                        .clip(CircleShape)
-                        .background(Color.LightGray),
-                    error = rememberVectorPainter(image = Icons.Default.Person),
-                )
+                Person(buddy = buddy)
             },
             title = {
                 Text(text = "Add contact?")

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

@@ -6,7 +6,10 @@ import android.net.Uri
 import android.widget.Toast
 import androidx.activity.compose.rememberLauncherForActivityResult
 import androidx.activity.result.contract.ActivityResultContracts
+import androidx.compose.foundation.BorderStroke
 import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
 import androidx.compose.foundation.layout.*
 import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.material.icons.Icons
@@ -16,6 +19,8 @@ import androidx.compose.runtime.*
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.painter.Painter
 import androidx.compose.ui.layout.ContentScale
 import androidx.compose.ui.platform.LocalContext
@@ -30,6 +35,7 @@ import io.nexilis.service.core.createImageFile
 import io.nexilis.service.data.entities.Buddy
 import io.nexilis.service.data.viewmodels.BuddyViewModel
 
+
 @Composable
 fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), me: Buddy) {
     val viewModel: BuddyViewModel = hiltViewModel()
@@ -57,6 +63,20 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), me: Buddy) {
             Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show()
         }
     }
+    val rainbowColorsBrush = remember {
+        Brush.sweepGradient(
+            listOf(
+                Color(0xFF9575CD),
+                Color(0xFFBA68C8),
+                Color(0xFFE57373),
+                Color(0xFFFFB74D),
+                Color(0xFFFFF176),
+                Color(0xFFAED581),
+                Color(0xFF4DD0E1),
+                Color(0xFF9575CD)
+            )
+        )
+    }
     Column(
         modifier = Modifier
             .padding(contentPadding)
@@ -79,9 +99,13 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), me: Buddy) {
                 )
             Image(
                 painter = painter, contentDescription = "", modifier = Modifier
-                    .padding(top = 8.dp, end = 16.dp, bottom = 8.dp)
-                    .clip(CircleShape)
-                    .size(150.dp),
+                    .size(150.dp)
+                    .border(
+                        BorderStroke(4.dp, rainbowColorsBrush),
+                        CircleShape
+                    )
+                    .padding(4.dp)
+                    .clip(CircleShape),
                 contentScale = ContentScale.Crop
             )
             IconButton(onClick = {
@@ -96,6 +120,9 @@ fun Profile(contentPadding: PaddingValues = PaddingValues(0.dp), me: Buddy) {
                 Icon(
                     imageVector = Icons.Default.AddCircle,
                     contentDescription = "",
+                    modifier = Modifier
+                        .clip(CircleShape)
+                        .background(color = MaterialTheme.colorScheme.surface),
                     tint = MaterialTheme.colorScheme.primary
                 )
             }