33import android .content .Context ;
44import android .content .Intent ;
55import android .os .Bundle ;
6- import android .view .View ;
76import android .widget .ProgressBar ;
87
8+ import androidx .activity .OnBackPressedCallback ;
9+ import androidx .annotation .Nullable ;
10+ import androidx .appcompat .app .AppCompatActivity ;
11+ import androidx .lifecycle .ViewModelProvider ;
12+
913import com .getstream .sdk .chat .view .ChannelHeaderView ;
10- import com .getstream .sdk .chat .view .messageinput .MessageInputView ;
1114import com .getstream .sdk .chat .view .MessageListView ;
15+ import com .getstream .sdk .chat .view .messageinput .MessageInputView ;
1216import com .getstream .sdk .chat .viewmodel .ChannelHeaderViewModel ;
1317import com .getstream .sdk .chat .viewmodel .ChannelHeaderViewModelBinding ;
1418import com .getstream .sdk .chat .viewmodel .MessageInputViewModel ;
1519import com .getstream .sdk .chat .viewmodel .MessageInputViewModelBinding ;
20+ import com .getstream .sdk .chat .viewmodel .factory .ChannelViewModelFactory ;
1621import com .getstream .sdk .chat .viewmodel .messages .MessageListViewModel ;
22+ import com .getstream .sdk .chat .viewmodel .messages .MessageListViewModel .Mode .Normal ;
23+ import com .getstream .sdk .chat .viewmodel .messages .MessageListViewModel .Mode .Thread ;
24+ import com .getstream .sdk .chat .viewmodel .messages .MessageListViewModel .State .NavigateUp ;
1725import com .getstream .sdk .chat .viewmodel .messages .MessageListViewModelBinding ;
1826
19- import androidx .activity .OnBackPressedCallback ;
20- import androidx .annotation .Nullable ;
21- import androidx .appcompat .app .AppCompatActivity ;
22- import androidx .lifecycle .ViewModelProvider ;
2327import io .getstream .chat .android .client .models .Channel ;
2428import kotlin .Unit ;
25- import kotlin .jvm .functions .Function0 ;
2629
2730public class ChannelActivity2 extends AppCompatActivity {
2831
@@ -38,55 +41,66 @@ public static Intent newIntent(Context context, Channel channel) {
3841 protected void onCreate (@ Nullable Bundle savedInstanceState ) {
3942 super .onCreate (savedInstanceState );
4043 setContentView (R .layout .activity_channel_2 );
41- final MessageListView messageListView = findViewById ( R . id . messageListView );
42- final ProgressBar progressBar = findViewById ( R . id . progressBar );
43- final ChannelHeaderView channelHeaderView = findViewById ( R . id . channelHeaderView );
44- final MessageInputView messageInputView = findViewById ( R . id . messageInputView );
44+ String cid = getIntent (). getStringExtra ( CID_KEY );
45+ if ( cid == null ) {
46+ throw new IllegalStateException ( "Specifying a channel id is required when starting ChannelActivity2" );
47+ }
4548
46- messageListView .setAttachmentViewHolderFactory (new MyAttachmentViewHolderFactory ());
49+ // Step 0 - Get View references
50+ MessageListView messageListView = findViewById (R .id .messageListView );
51+ ProgressBar progressBar = findViewById (R .id .progressBar );
52+ ChannelHeaderView channelHeaderView = findViewById (R .id .channelHeaderView );
53+ MessageInputView messageInputView = findViewById (R .id .messageInputView );
4754
48- final String cid = getIntent ().getStringExtra (CID_KEY );
49- final ViewModelProvider viewModelProvider = new ViewModelProvider (this , new ChannelViewModelsFactory (cid ));
55+ // Step 1 - Create 3 separate ViewModels for the views so it's easy to customize one of the components
56+ ChannelViewModelFactory factory = new ChannelViewModelFactory (cid );
57+ ViewModelProvider provider = new ViewModelProvider (this , factory );
58+ ChannelHeaderViewModel channelHeaderViewModel = provider .get (ChannelHeaderViewModel .class );
59+ MessageListViewModel messageListViewModel = provider .get (MessageListViewModel .class );
60+ MessageInputViewModel messageInputViewModel = provider .get (MessageInputViewModel .class );
5061
51- final MessageListViewModel messageListViewModel = viewModelProvider .get (MessageListViewModel .class );
62+ // Set custom AttachmentViewHolderFactory
63+ messageListView .setAttachmentViewHolderFactory (new MyAttachmentViewHolderFactory ());
64+
65+ // Step 2 - Bind the view and ViewModels, they are loosely coupled so it's easy to customize
66+ ChannelHeaderViewModelBinding .bind (channelHeaderViewModel , channelHeaderView , this );
5267 MessageListViewModelBinding .bind (messageListViewModel , messageListView , this );
68+ MessageInputViewModelBinding .bind (messageInputViewModel , messageInputView , this );
69+
70+ // Step 3 - Let the message input know when we open a thread
71+ messageListViewModel .getMode ().observe (this , mode -> {
72+ if (mode instanceof Thread ) {
73+ messageInputViewModel .setActiveThread (((Thread ) mode ).getParentMessage ());
74+ } else if (mode instanceof Normal ) {
75+ messageInputViewModel .resetThread ();
76+ }
77+ });
78+
79+ // Step 4 - Handle navigate up state
5380 messageListViewModel .getState ().observe (this , state -> {
54- if (state instanceof MessageListViewModel .State .Loading ) {
55- progressBar .setVisibility (View .VISIBLE );
56- } else if (state instanceof MessageListViewModel .State .Result ) {
57- progressBar .setVisibility (View .GONE );
58- } else if (state instanceof MessageListViewModel .State .NavigateUp ) {
81+ if (state instanceof NavigateUp ) {
5982 finish ();
6083 }
6184 });
6285
63- ChannelHeaderViewModelBinding .bind (viewModelProvider .get (ChannelHeaderViewModel .class ), channelHeaderView , this );
64-
65- final MessageInputViewModel messageInputViewModel = viewModelProvider .get (MessageInputViewModel .class );
66- MessageInputViewModelBinding .bind (messageInputViewModel , messageInputView , this );
67- messageListViewModel .getMode ().observe (this , mode -> {
68- if (mode instanceof MessageListViewModel .Mode .Thread ) {
69- messageInputViewModel .setActiveThread (((MessageListViewModel .Mode .Thread ) mode ).getParentMessage ());
70- } else if (mode instanceof MessageListViewModel .Mode .Normal ) {
71- messageInputViewModel .resetThread ();
72- }
73- messageListView .setOnMessageEditHandler ((message ) -> {
74- messageInputViewModel .getEditMessage ().postValue (message );
75- return Unit .INSTANCE ;
76- });
86+ // Step 5 - Let the message input know when we are editing a message
87+ messageListView .setOnMessageEditHandler (message -> {
88+ messageInputViewModel .getEditMessage ().postValue (message );
89+ return Unit .INSTANCE ;
7790 });
7891
79- Function0 <Unit > onBackClick = () -> {
92+ // Step 6 - Handle back button behaviour correctly when you're in a thread
93+ channelHeaderView .setOnBackClick (() -> {
8094 messageListViewModel .onEvent (MessageListViewModel .Event .BackButtonPressed .INSTANCE );
8195 return Unit .INSTANCE ;
82- };
83- channelHeaderView .setOnBackClick (onBackClick );
84-
96+ });
8597 getOnBackPressedDispatcher ().addCallback (this , new OnBackPressedCallback (true ) {
8698 @ Override
8799 public void handleOnBackPressed () {
88- onBackClick .invoke ();
100+ channelHeaderView . getOnBackClick () .invoke ();
89101 }
90102 });
103+
104+
91105 }
92106}
0 commit comments