Skip to content

Commit 6f81b3f

Browse files
Merge pull request #25 from GetStream/feature/cas-354-update-java-tutorial
[CAS-354] Format Kotlin tutorial, update Java tutorial files to match
2 parents b95054f + cea86f0 commit 6f81b3f

18 files changed

+414
-487
lines changed

samplejava/src/main/java/com/example/chattutorialjava/ChannelActivity.java

Lines changed: 50 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,29 @@
33
import android.content.Context;
44
import android.content.Intent;
55
import android.os.Bundle;
6-
import android.view.View;
76
import 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+
913
import com.getstream.sdk.chat.view.ChannelHeaderView;
10-
import com.getstream.sdk.chat.view.messageinput.MessageInputView;
1114
import com.getstream.sdk.chat.view.MessageListView;
15+
import com.getstream.sdk.chat.view.messageinput.MessageInputView;
1216
import com.getstream.sdk.chat.viewmodel.ChannelHeaderViewModel;
1317
import com.getstream.sdk.chat.viewmodel.ChannelHeaderViewModelBinding;
1418
import com.getstream.sdk.chat.viewmodel.MessageInputViewModel;
1519
import com.getstream.sdk.chat.viewmodel.MessageInputViewModelBinding;
20+
import com.getstream.sdk.chat.viewmodel.factory.ChannelViewModelFactory;
1621
import 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;
1725
import 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;
2327
import io.getstream.chat.android.client.models.Channel;
2428
import kotlin.Unit;
25-
import kotlin.jvm.functions.Function0;
2629

2730
public class ChannelActivity extends AppCompatActivity {
2831

@@ -38,54 +41,62 @@ 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);
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 ChannelActivity");
47+
}
4548

46-
// TODO set custom AttachmentViewHolderFactory
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+
// TODO set custom AttachmentViewHolderFactory
63+
64+
// Step 2 - Bind the view and ViewModels, they are loosely coupled so it's easy to customize
65+
ChannelHeaderViewModelBinding.bind(channelHeaderViewModel, channelHeaderView, this);
5266
MessageListViewModelBinding.bind(messageListViewModel, messageListView, this);
67+
MessageInputViewModelBinding.bind(messageInputViewModel, messageInputView, this);
68+
69+
// Step 3 - Let the message input know when we open a thread
70+
messageListViewModel.getMode().observe(this, mode -> {
71+
if (mode instanceof Thread) {
72+
messageInputViewModel.setActiveThread(((Thread) mode).getParentMessage());
73+
} else if (mode instanceof Normal) {
74+
messageInputViewModel.resetThread();
75+
}
76+
});
77+
78+
// Step 4 - Handle navigate up state
5379
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) {
80+
if (state instanceof NavigateUp) {
5981
finish();
6082
}
6183
});
6284

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-
});
85+
// Step 5 - Let the message input know when we are editing a message
86+
messageListView.setOnMessageEditHandler(message -> {
87+
messageInputViewModel.getEditMessage().postValue(message);
88+
return Unit.INSTANCE;
7789
});
7890

79-
Function0<Unit> onBackClick = () -> {
91+
// Step 6 - Handle back button behaviour correctly when you're in a thread
92+
channelHeaderView.setOnBackClick(() -> {
8093
messageListViewModel.onEvent(MessageListViewModel.Event.BackButtonPressed.INSTANCE);
8194
return Unit.INSTANCE;
82-
};
83-
channelHeaderView.setOnBackClick(onBackClick);
84-
95+
});
8596
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
8697
@Override
8798
public void handleOnBackPressed() {
88-
onBackClick.invoke();
99+
channelHeaderView.getOnBackClick().invoke();
89100
}
90101
});
91102
}

samplejava/src/main/java/com/example/chattutorialjava/ChannelActivity2.java

Lines changed: 53 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,29 @@
33
import android.content.Context;
44
import android.content.Intent;
55
import android.os.Bundle;
6-
import android.view.View;
76
import 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+
913
import com.getstream.sdk.chat.view.ChannelHeaderView;
10-
import com.getstream.sdk.chat.view.messageinput.MessageInputView;
1114
import com.getstream.sdk.chat.view.MessageListView;
15+
import com.getstream.sdk.chat.view.messageinput.MessageInputView;
1216
import com.getstream.sdk.chat.viewmodel.ChannelHeaderViewModel;
1317
import com.getstream.sdk.chat.viewmodel.ChannelHeaderViewModelBinding;
1418
import com.getstream.sdk.chat.viewmodel.MessageInputViewModel;
1519
import com.getstream.sdk.chat.viewmodel.MessageInputViewModelBinding;
20+
import com.getstream.sdk.chat.viewmodel.factory.ChannelViewModelFactory;
1621
import 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;
1725
import 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;
2327
import io.getstream.chat.android.client.models.Channel;
2428
import kotlin.Unit;
25-
import kotlin.jvm.functions.Function0;
2629

2730
public 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

Comments
 (0)