Skip to content

Commit 67c3a9c

Browse files
Merge pull request #493 from JoseAlcerreca/jetchat_todos
[Jetchat] Address and remove TODOs
2 parents 4b9fd12 + 29b753c commit 67c3a9c

File tree

8 files changed

+63
-145
lines changed

8 files changed

+63
-145
lines changed

Jetchat/app/src/main/java/com/example/compose/jetchat/FragmentAwareAndroidViewBinding.kt

Lines changed: 0 additions & 103 deletions
This file was deleted.

Jetchat/app/src/main/java/com/example/compose/jetchat/MainViewModel.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@
1616

1717
package com.example.compose.jetchat
1818

19-
import androidx.lifecycle.LiveData
20-
import androidx.lifecycle.MutableLiveData
2119
import androidx.lifecycle.ViewModel
20+
import kotlinx.coroutines.flow.MutableStateFlow
21+
import kotlinx.coroutines.flow.StateFlow
2222

2323
/**
2424
* Used to communicate between screens.
2525
*/
2626
class MainViewModel : ViewModel() {
2727

28-
// TODO: Expose a flow for events
29-
private val _drawerShouldBeOpened = MutableLiveData(false)
30-
val drawerShouldBeOpened: LiveData<Boolean> = _drawerShouldBeOpened
28+
private val _drawerShouldBeOpened = MutableStateFlow(false)
29+
val drawerShouldBeOpened: StateFlow<Boolean> = _drawerShouldBeOpened
3130

3231
fun openDrawer() {
3332
_drawerShouldBeOpened.value = true

Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ import androidx.appcompat.app.AppCompatActivity
2323
import androidx.compose.material.rememberScaffoldState
2424
import androidx.compose.runtime.CompositionLocalProvider
2525
import androidx.compose.runtime.LaunchedEffect
26-
import androidx.compose.runtime.livedata.observeAsState
26+
import androidx.compose.runtime.collectAsState
27+
import androidx.compose.runtime.getValue
2728
import androidx.compose.runtime.rememberCoroutineScope
29+
import androidx.compose.ui.viewinterop.AndroidViewBinding
2830
import androidx.core.os.bundleOf
2931
import androidx.core.view.WindowCompat
3032
import androidx.navigation.NavController
31-
import androidx.navigation.findNavController
3233
import androidx.navigation.fragment.NavHostFragment
3334
import com.example.compose.jetchat.components.JetchatScaffold
3435
import com.example.compose.jetchat.conversation.BackPressHandler
@@ -59,8 +60,8 @@ class NavActivity : AppCompatActivity() {
5960
) {
6061
val scaffoldState = rememberScaffoldState()
6162

62-
val openDrawerEvent = viewModel.drawerShouldBeOpened.observeAsState()
63-
if (openDrawerEvent.value == true) {
63+
val drawerOpen by viewModel.drawerShouldBeOpened.collectAsState()
64+
if (drawerOpen) {
6465
// Open drawer and reset state in VM.
6566
LaunchedEffect(Unit) {
6667
scaffoldState.drawerState.open()
@@ -94,10 +95,7 @@ class NavActivity : AppCompatActivity() {
9495
}
9596
}
9697
) {
97-
// TODO: Fragments inflated via AndroidViewBinding don't work as expected
98-
// https://issuetracker.google.com/179915946
99-
// AndroidViewBinding(ContentMainBinding::inflate)
100-
FragmentAwareAndroidViewBinding(ContentMainBinding::inflate)
98+
AndroidViewBinding(ContentMainBinding::inflate)
10199
}
102100
}
103101
}

Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/Conversation.kt

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,10 @@ import androidx.compose.runtime.Composable
5252
import androidx.compose.runtime.CompositionLocalProvider
5353
import androidx.compose.runtime.derivedStateOf
5454
import androidx.compose.runtime.getValue
55+
import androidx.compose.runtime.mutableStateOf
5556
import androidx.compose.runtime.remember
5657
import androidx.compose.runtime.rememberCoroutineScope
58+
import androidx.compose.runtime.setValue
5759
import androidx.compose.ui.Alignment
5860
import androidx.compose.ui.Modifier
5961
import androidx.compose.ui.draw.clip
@@ -68,6 +70,7 @@ import androidx.compose.ui.res.stringResource
6870
import androidx.compose.ui.semantics.semantics
6971
import androidx.compose.ui.tooling.preview.Preview
7072
import androidx.compose.ui.unit.dp
73+
import com.example.compose.jetchat.FunctionalityNotAvailablePopup
7174
import com.example.compose.jetchat.R
7275
import com.example.compose.jetchat.components.JetchatAppBar
7376
import com.example.compose.jetchat.data.exampleUiState
@@ -99,6 +102,7 @@ fun ConversationContent(
99102

100103
val scrollState = rememberLazyListState()
101104
val scope = rememberCoroutineScope()
105+
102106
Surface(modifier = modifier) {
103107
Box(modifier = Modifier.fillMaxSize()) {
104108
Column(Modifier.fillMaxSize()) {
@@ -143,6 +147,10 @@ fun ChannelNameBar(
143147
modifier: Modifier = Modifier,
144148
onNavIconPressed: () -> Unit = { }
145149
) {
150+
var functionalityNotAvailablePopupShown by remember { mutableStateOf(false) }
151+
if (functionalityNotAvailablePopupShown) {
152+
FunctionalityNotAvailablePopup { functionalityNotAvailablePopupShown = false }
153+
}
146154
JetchatAppBar(
147155
modifier = modifier,
148156
onNavIconPressed = onNavIconPressed,
@@ -171,7 +179,7 @@ fun ChannelNameBar(
171179
Icon(
172180
imageVector = Icons.Outlined.Search,
173181
modifier = Modifier
174-
.clickable(onClick = {}) // TODO: Show not implemented dialog.
182+
.clickable(onClick = { functionalityNotAvailablePopupShown = true })
175183
.padding(horizontal = 12.dp, vertical = 16.dp)
176184
.height(24.dp),
177185
contentDescription = stringResource(id = R.string.search)
@@ -180,7 +188,7 @@ fun ChannelNameBar(
180188
Icon(
181189
imageVector = Icons.Outlined.Info,
182190
modifier = Modifier
183-
.clickable(onClick = {}) // TODO: Show not implemented dialog.
191+
.clickable(onClick = { functionalityNotAvailablePopupShown = true })
184192
.padding(horizontal = 12.dp, vertical = 16.dp)
185193
.height(24.dp),
186194
contentDescription = stringResource(id = R.string.info)
@@ -236,7 +244,7 @@ fun Messages(
236244

237245
item {
238246
Message(
239-
onAuthorClick = { navigateToProfile(content.author) },
247+
onAuthorClick = { name -> navigateToProfile(name) },
240248
msg = content,
241249
isUserMe = content.author == authorMe,
242250
isFirstMessageByAuthor = isFirstMessageByAuthor,
@@ -265,9 +273,7 @@ fun Messages(
265273
enabled = jumpToBottomButtonEnabled,
266274
onClicked = {
267275
scope.launch {
268-
// TODO: Replace with animateScrollToItem
269-
// https://issuetracker.google.com/181316785
270-
scrollState.scrollToItem(0)
276+
scrollState.animateScrollToItem(0)
271277
}
272278
},
273279
modifier = Modifier.align(Alignment.BottomCenter)
@@ -277,18 +283,12 @@ fun Messages(
277283

278284
@Composable
279285
fun Message(
280-
onAuthorClick: () -> Unit,
286+
onAuthorClick: (String) -> Unit,
281287
msg: Message,
282288
isUserMe: Boolean,
283289
isFirstMessageByAuthor: Boolean,
284290
isLastMessageByAuthor: Boolean
285291
) {
286-
// TODO: get image from msg.author
287-
val painter = if (isUserMe) {
288-
painterResource(id = R.drawable.ali)
289-
} else {
290-
painterResource(id = R.drawable.someone_else)
291-
}
292292
val borderColor = if (isUserMe) {
293293
MaterialTheme.colors.primary
294294
} else {
@@ -301,14 +301,14 @@ fun Message(
301301
// Avatar
302302
Image(
303303
modifier = Modifier
304-
.clickable(onClick = onAuthorClick)
304+
.clickable(onClick = { onAuthorClick(msg.author) })
305305
.padding(horizontal = 16.dp)
306306
.size(42.dp)
307307
.border(1.5.dp, borderColor, CircleShape)
308308
.border(3.dp, MaterialTheme.colors.surface, CircleShape)
309309
.clip(CircleShape)
310310
.align(Alignment.Top),
311-
painter = painter,
311+
painter = painterResource(id = msg.authorImage),
312312
contentScale = ContentScale.Crop,
313313
contentDescription = null,
314314
)
@@ -320,6 +320,7 @@ fun Message(
320320
msg = msg,
321321
isFirstMessageByAuthor = isFirstMessageByAuthor,
322322
isLastMessageByAuthor = isLastMessageByAuthor,
323+
authorClicked = onAuthorClick,
323324
modifier = Modifier
324325
.padding(end = 16.dp)
325326
.weight(1f)
@@ -332,13 +333,14 @@ fun AuthorAndTextMessage(
332333
msg: Message,
333334
isFirstMessageByAuthor: Boolean,
334335
isLastMessageByAuthor: Boolean,
336+
authorClicked: (String) -> Unit,
335337
modifier: Modifier = Modifier
336338
) {
337339
Column(modifier = modifier) {
338340
if (isLastMessageByAuthor) {
339341
AuthorNameTimestamp(msg)
340342
}
341-
ChatItemBubble(msg, isFirstMessageByAuthor)
343+
ChatItemBubble(msg, isFirstMessageByAuthor, authorClicked = authorClicked)
342344
if (isFirstMessageByAuthor) {
343345
// Last bubble before next author
344346
Spacer(modifier = Modifier.height(8.dp))
@@ -406,7 +408,8 @@ private fun RowScope.DayHeaderLine() {
406408
@Composable
407409
fun ChatItemBubble(
408410
message: Message,
409-
lastMessageByAuthor: Boolean
411+
lastMessageByAuthor: Boolean,
412+
authorClicked: (String) -> Unit
410413
) {
411414

412415
val backgroundBubbleColor =
@@ -420,7 +423,8 @@ fun ChatItemBubble(
420423
Column {
421424
Surface(color = backgroundBubbleColor, shape = bubbleShape) {
422425
ClickableMessage(
423-
message = message
426+
message = message,
427+
authorClicked = authorClicked
424428
)
425429
}
426430

@@ -439,7 +443,7 @@ fun ChatItemBubble(
439443
}
440444

441445
@Composable
442-
fun ClickableMessage(message: Message) {
446+
fun ClickableMessage(message: Message, authorClicked: (String) -> Unit) {
443447
val uriHandler = LocalUriHandler.current
444448

445449
val styledMessage = messageFormatter(text = message.content)
@@ -455,8 +459,7 @@ fun ClickableMessage(message: Message) {
455459
?.let { annotation ->
456460
when (annotation.tag) {
457461
SymbolAnnotationType.LINK.name -> uriHandler.openUri(annotation.item)
458-
// TODO(yrezgui): Open profile screen when click PERSON tag
459-
// (e.g. @aliconors)
462+
SymbolAnnotationType.PERSON.name -> authorClicked(annotation.item)
460463
else -> Unit
461464
}
462465
}

Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/ConversationUiState.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.example.compose.jetchat.conversation
1818

1919
import androidx.compose.runtime.Immutable
2020
import androidx.compose.runtime.mutableStateListOf
21+
import com.example.compose.jetchat.R
2122

2223
class ConversationUiState(
2324
val channelName: String,
@@ -38,5 +39,6 @@ data class Message(
3839
val author: String,
3940
val content: String,
4041
val timestamp: String,
41-
val image: Int? = null
42+
val image: Int? = null,
43+
val authorImage: Int = if (author == "me") R.drawable.ali else R.drawable.someone_else
4244
)

Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/UserInput.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,6 @@ private fun UserInputSelector(
325325
onClick = onMessageSent,
326326
colors = buttonColors,
327327
border = border,
328-
// TODO: Workaround for https://issuetracker.google.com/158830170
329328
contentPadding = PaddingValues(0.dp)
330329
) {
331330
Text(
@@ -496,7 +495,6 @@ fun ExtendedSelectorInnerButton(
496495
shape = MaterialTheme.shapes.medium,
497496
enabled = selected,
498497
colors = colors,
499-
// TODO: Workaround for https://issuetracker.google.com//158830170
500498
contentPadding = PaddingValues(0.dp)
501499
) {
502500
Text(

0 commit comments

Comments
 (0)