Skip to content

Commit 310242e

Browse files
Merge pull request #6 from KaushalVasava/add_multi_image_chat
Update layout and add date wise sorting
2 parents fe19274 + 00fd8d2 commit 310242e

File tree

2 files changed

+91
-24
lines changed

2 files changed

+91
-24
lines changed

app/src/main/java/com/lahsuak/apps/geminiai/ui/screen/ChatScreen.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import androidx.compose.ui.ExperimentalComposeUiApi
6565
import androidx.compose.ui.Modifier
6666
import androidx.compose.ui.draw.clip
6767
import androidx.compose.ui.graphics.Color
68+
import androidx.compose.ui.layout.ContentScale
6869
import androidx.compose.ui.platform.LocalContext
6970
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
7071
import androidx.compose.ui.res.painterResource
@@ -338,10 +339,10 @@ fun MessageInput(
338339
val context = LocalContext.current
339340
val imageUris = rememberSaveable(saver = UriSaver()) { mutableStateListOf() }
340341
val pickMedia = rememberLauncherForActivityResult(
341-
ActivityResultContracts.PickVisualMedia()
342+
ActivityResultContracts.PickMultipleVisualMedia()
342343
) { imageUri ->
343-
imageUri?.let {
344-
imageUris.add(it)
344+
imageUri.let {
345+
imageUris.addAll(it)
345346
}
346347
}
347348
val keyboard = LocalSoftwareKeyboardController.current
@@ -355,13 +356,14 @@ fun MessageInput(
355356
ElevatedCard(Modifier.fillMaxWidth()) {
356357
Column {
357358
LazyRow(
358-
modifier = Modifier.padding(all = 8.dp)
359+
modifier = Modifier.padding(vertical = 2.dp, horizontal = 12.dp)
359360
) {
360361
items(imageUris) { imageUri ->
361362
Box {
362363
AsyncImage(
363364
model = imageUri,
364365
contentDescription = null,
366+
contentScale = ContentScale.FillBounds,
365367
modifier = Modifier
366368
.padding(4.dp)
367369
.requiredSize(72.dp)
Lines changed: 85 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,43 @@
11
package com.lahsuak.apps.geminiai.ui.screen
22

3+
import androidx.compose.foundation.ExperimentalFoundationApi
4+
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.layout.Arrangement
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.fillMaxSize
8+
import androidx.compose.foundation.layout.fillMaxWidth
39
import androidx.compose.foundation.layout.padding
410
import androidx.compose.foundation.lazy.LazyColumn
511
import androidx.compose.foundation.lazy.items
12+
import androidx.compose.foundation.shape.RoundedCornerShape
613
import androidx.compose.material.icons.Icons
714
import androidx.compose.material.icons.filled.Add
8-
import androidx.compose.material3.Card
915
import androidx.compose.material3.ExperimentalMaterial3Api
1016
import androidx.compose.material3.FloatingActionButton
1117
import androidx.compose.material3.Icon
18+
import androidx.compose.material3.MaterialTheme
1219
import androidx.compose.material3.Scaffold
1320
import androidx.compose.material3.Text
1421
import androidx.compose.material3.TopAppBar
1522
import androidx.compose.runtime.Composable
1623
import androidx.compose.runtime.collectAsState
1724
import androidx.compose.runtime.getValue
25+
import androidx.compose.ui.Alignment
1826
import androidx.compose.ui.Modifier
27+
import androidx.compose.ui.draw.clip
28+
import androidx.compose.ui.graphics.Color
29+
import androidx.compose.ui.res.painterResource
1930
import androidx.compose.ui.res.stringResource
2031
import androidx.compose.ui.text.style.TextOverflow
2132
import androidx.compose.ui.unit.dp
2233
import com.lahsuak.apps.geminiai.R
2334
import com.lahsuak.apps.geminiai.ui.model.Role
2435
import com.lahsuak.apps.geminiai.ui.viewmodel.GroupViewModel
36+
import java.text.SimpleDateFormat
37+
import java.util.Locale
2538
import java.util.UUID
2639

27-
@OptIn(ExperimentalMaterial3Api::class)
40+
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
2841
@Composable
2942
fun MenuScreen(
3043
groupViewModel: GroupViewModel,
@@ -43,26 +56,78 @@ fun MenuScreen(
4356
}
4457
}
4558
) { paddingValue ->
46-
LazyColumn(
47-
Modifier
48-
.padding(paddingValue)
49-
.padding(top = 16.dp, bottom = 16.dp)
50-
) {
51-
items(list.reversed()) {
52-
Card(
53-
modifier = Modifier.padding(bottom = 8.dp, start = 8.dp, end = 8.dp),
54-
onClick = {
55-
onItemClicked("chat", it.id)
56-
}) {
57-
Text(
58-
text = it.chats.lastOrNull{
59-
it.role == Role.YOU
60-
}?.text ?: "",
61-
overflow = TextOverflow.Ellipsis,
62-
modifier = Modifier.padding(12.dp)
63-
)
59+
if (list.isEmpty()) {
60+
Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center) {
61+
Icon(
62+
painter = painterResource(id = R.drawable.ic_launcher_foreground),
63+
contentDescription = "null",
64+
modifier = Modifier.align(Alignment.CenterHorizontally)
65+
)
66+
Text(
67+
"Start a new chat",
68+
style = MaterialTheme.typography.titleLarge,
69+
modifier = Modifier.align(Alignment.CenterHorizontally)
70+
)
71+
}
72+
} else {
73+
LazyColumn(
74+
Modifier
75+
.fillMaxSize()
76+
.padding(paddingValue)
77+
.padding(top = 16.dp, bottom = 16.dp)
78+
) {
79+
val groupItems = list.sortedByDescending {
80+
it.chats.last().time!!.time
81+
}.groupBy {
82+
getDate(it.chats.last().time!!.time)
83+
}
84+
groupItems.forEach { (date, items) ->
85+
stickyHeader {
86+
Text(
87+
date,
88+
style = MaterialTheme.typography.titleSmall,
89+
color = MaterialTheme.colorScheme.primary,
90+
modifier = Modifier.padding(start = 12.dp),
91+
)
92+
}
93+
items(items, key = { item -> item.id }) {
94+
Column(
95+
modifier = Modifier
96+
.fillMaxWidth()
97+
.padding(bottom = 8.dp, start = 8.dp, end = 8.dp)
98+
.clip(RoundedCornerShape(8.dp))
99+
.clickable {
100+
onItemClicked("chat", it.id)
101+
}
102+
) {
103+
Text(
104+
text = it.chats.lastOrNull {
105+
it.role == Role.YOU
106+
}?.text ?: "",
107+
overflow = TextOverflow.Ellipsis,
108+
maxLines = 1,
109+
style = MaterialTheme.typography.titleMedium,
110+
modifier = Modifier.padding(horizontal = 8.dp)
111+
)
112+
Text(
113+
text = it.chats.lastOrNull {
114+
it.role == Role.GEMINI
115+
}?.text?.take(100) ?: "",
116+
maxLines = 2,
117+
overflow = TextOverflow.Ellipsis,
118+
modifier = Modifier.padding(8.dp),
119+
style = MaterialTheme.typography.bodyMedium,
120+
color = Color.Gray
121+
)
122+
}
123+
}
64124
}
65125
}
66126
}
67127
}
128+
}
129+
130+
fun getDate(date: Long): String {
131+
val sdf = SimpleDateFormat("dd MMM", Locale.getDefault())
132+
return sdf.format(date)
68133
}

0 commit comments

Comments
 (0)