Skip to content

Commit 4c316c2

Browse files
committed
- Updated applications to SDK 5.1.0
1 parent f9b0c6c commit 4c316c2

File tree

3 files changed

+54
-8
lines changed

3 files changed

+54
-8
lines changed

samplejava/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ android {
3030

3131
dependencies {
3232
// Add new dependencies
33+
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1"
34+
3335
implementation "io.getstream:stream-chat-android-ui-components:5.1.0"
3436
implementation "com.google.android.material:material:1.6.0"
3537
implementation "androidx.activity:activity-ktx:1.4.0"

samplejava/src/main/java/com/example/chattutorial/ChannelActivity3.java

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import android.content.Context;
44
import android.content.Intent;
55
import android.os.Bundle;
6-
import android.widget.TextView;
76

87
import androidx.activity.OnBackPressedCallback;
8+
import androidx.annotation.NonNull;
99
import androidx.annotation.Nullable;
1010
import androidx.appcompat.app.AppCompatActivity;
11+
import androidx.lifecycle.FlowLiveDataConversions;
12+
import androidx.lifecycle.LiveData;
13+
import androidx.lifecycle.Transformations;
1114
import androidx.lifecycle.ViewModelProvider;
1215

1316
import com.example.chattutorial.databinding.ActivityChannel3Binding;
@@ -20,15 +23,22 @@
2023
import java.util.ArrayList;
2124
import java.util.List;
2225

26+
import io.getstream.chat.android.client.ChatClient;
2327
import io.getstream.chat.android.client.models.Channel;
2428
import io.getstream.chat.android.client.models.Message;
29+
import io.getstream.chat.android.client.models.TypingEvent;
30+
import io.getstream.chat.android.offline.extensions.ChatClientExtensions;
31+
import io.getstream.chat.android.offline.plugin.state.channel.ChannelState;
2532
import io.getstream.chat.android.ui.message.input.viewmodel.MessageInputViewModelBinding;
2633
import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.AttachmentFactoryManager;
2734
import io.getstream.chat.android.ui.message.list.header.MessageListHeaderView;
2835
import io.getstream.chat.android.ui.message.list.header.viewmodel.MessageListHeaderViewModel;
2936
import io.getstream.chat.android.ui.message.list.header.viewmodel.MessageListHeaderViewModelBinding;
3037
import io.getstream.chat.android.ui.message.list.viewmodel.MessageListViewModelBinding;
3138
import io.getstream.chat.android.ui.message.list.viewmodel.factory.MessageListViewModelFactory;
39+
import kotlinx.coroutines.Dispatchers;
40+
import kotlinx.coroutines.flow.Flow;
41+
import kotlinx.coroutines.flow.FlowKt;
3242

3343
public class ChannelActivity3 extends AppCompatActivity {
3444

@@ -110,11 +120,41 @@ public void handleOnBackPressed() {
110120
});
111121

112122
// Custom typing info header bar
113-
TextView typingHeaderView = findViewById(R.id.typingHeaderView);
114123
String nobodyTyping = "nobody is typing";
115-
typingHeaderView.setText(nobodyTyping);
124+
binding.typingHeaderView.setText(nobodyTyping);
125+
126+
// Observe typing events and update typing header depending on its state.
127+
Flow<ChannelState> channelStateFlow = ChatClientExtensions.watchChannelAsState(ChatClient.instance(), cid, 30);
128+
LiveData<TypingEvent> typingEventLiveData = Transformations.switchMap(
129+
FlowLiveDataConversions.asLiveData(channelStateFlow),
130+
channelState -> FlowLiveDataConversions.asLiveData(channelState.getTyping())
131+
);
132+
133+
typingEventLiveData.observe(this, typingEvent -> {
134+
String headerText;
135+
136+
if (typingEvent.getUsers().size() != 0) {
137+
headerText = "typing: " + joinTypingUpdatesToUserNames(typingEvent);
138+
} else {
139+
headerText = nobodyTyping;
140+
}
141+
142+
binding.typingHeaderView.setText(headerText);
143+
});
144+
}
145+
146+
@NonNull
147+
private String joinTypingUpdatesToUserNames(@NonNull TypingEvent typingEvent) {
148+
StringBuilder joinedString = new StringBuilder();
149+
150+
for (int i = 0; i < typingEvent.getUsers().size(); i++) {
151+
if (i < typingEvent.getUsers().size() - 1) {
152+
joinedString.append(typingEvent.getUsers().get(i).getName()).append(", ");
153+
} else {
154+
joinedString.append(typingEvent.getUsers().get(i).getName());
155+
}
156+
}
116157

117-
//TODO implemet an OP based solution here once the Core team introduces extensions for StateFlow
118-
// based values
158+
return joinedString.toString();
119159
}
120160
}

samplekotlin/src/main/java/com/example/chattutorial/ChannelActivity3.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel.Mode.Threa
1515
import com.getstream.sdk.chat.viewmodel.messages.MessageListViewModel.State.NavigateUp
1616
import io.getstream.chat.android.client.ChatClient
1717
import io.getstream.chat.android.client.models.Channel
18-
import io.getstream.chat.android.offline.extensions.globalState
18+
import io.getstream.chat.android.offline.extensions.watchChannelAsState
1919
import io.getstream.chat.android.ui.message.input.viewmodel.bindView
2020
import io.getstream.chat.android.ui.message.list.adapter.viewholder.attachment.AttachmentFactoryManager
2121
import io.getstream.chat.android.ui.message.list.header.viewmodel.MessageListHeaderViewModel
2222
import io.getstream.chat.android.ui.message.list.header.viewmodel.bindView
2323
import io.getstream.chat.android.ui.message.list.viewmodel.bindView
2424
import io.getstream.chat.android.ui.message.list.viewmodel.factory.MessageListViewModelFactory
25-
import kotlinx.coroutines.flow.collect
25+
import kotlinx.coroutines.flow.filterNotNull
26+
import kotlinx.coroutines.flow.flatMapLatest
2627

2728
class ChannelActivity3 : AppCompatActivity() {
2829

@@ -95,7 +96,10 @@ class ChannelActivity3 : AppCompatActivity() {
9596

9697
// Observe typing events and update typing header depending on its state.
9798
lifecycleScope.launchWhenStarted {
98-
ChatClient.instance().globalState.typingUpdates.collect {
99+
ChatClient.instance().watchChannelAsState(cid, 30)
100+
.filterNotNull()
101+
.flatMapLatest { it.typing }
102+
.collect {
99103
binding.typingHeaderView.text = when {
100104
it.users.isNotEmpty() -> it.users.joinToString(prefix = "typing: ") { user -> user.name }
101105
else -> nobodyTyping

0 commit comments

Comments
 (0)