Skip to content

Commit d8bfc05

Browse files
committed
Allow voters to suggest poll options in UI Components
1 parent 758866d commit d8bfc05

17 files changed

Lines changed: 361 additions & 4 deletions

File tree

stream-chat-android-ui-common/api/stream-chat-android-ui-common.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,7 @@ public final class io/getstream/chat/android/ui/common/feature/messages/list/Mes
732732
public fun <init> (Ljava/lang/String;Lio/getstream/chat/android/ui/common/helper/ClipboardHandler;ZLjava/lang/String;Ljava/lang/String;ILio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/client/setup/state/ClientState;Lkotlinx/coroutines/flow/StateFlow;Lio/getstream/chat/android/ui/common/state/messages/list/DeletedMessageVisibility;ZLio/getstream/chat/android/ui/common/state/messages/list/MessageFooterVisibility;ZLio/getstream/chat/android/ui/common/feature/messages/list/DateSeparatorHandler;Lio/getstream/chat/android/ui/common/feature/messages/list/DateSeparatorHandler;Lio/getstream/chat/android/ui/common/feature/messages/list/MessagePositionHandler;ZZ)V
733733
public synthetic fun <init> (Ljava/lang/String;Lio/getstream/chat/android/ui/common/helper/ClipboardHandler;ZLjava/lang/String;Ljava/lang/String;ILio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/client/setup/state/ClientState;Lkotlinx/coroutines/flow/StateFlow;Lio/getstream/chat/android/ui/common/state/messages/list/DeletedMessageVisibility;ZLio/getstream/chat/android/ui/common/state/messages/list/MessageFooterVisibility;ZLio/getstream/chat/android/ui/common/feature/messages/list/DateSeparatorHandler;Lio/getstream/chat/android/ui/common/feature/messages/list/DateSeparatorHandler;Lio/getstream/chat/android/ui/common/feature/messages/list/MessagePositionHandler;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
734734
public final fun addPollOption (Lio/getstream/chat/android/models/Poll;Ljava/lang/String;)V
735+
public final fun addPollOption (Ljava/lang/String;Ljava/lang/String;)V
735736
public final fun banUser (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)V
736737
public static synthetic fun banUser$default (Lio/getstream/chat/android/ui/common/feature/messages/list/MessageListController;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;ILjava/lang/Object;)V
737738
public final fun blockUser (Ljava/lang/String;)V

stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/feature/messages/list/MessageListController.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2447,8 +2447,18 @@ public class MessageListController(
24472447
* @param option The text of the new option to be added.
24482448
*/
24492449
public fun addPollOption(poll: Poll, option: String) {
2450+
addPollOption(pollId = poll.id, option = option)
2451+
}
2452+
2453+
/**
2454+
* Creates a new poll option for the poll identified by [pollId].
2455+
*
2456+
* @param pollId The id of the poll to which the option will be added.
2457+
* @param option The text of the new option to be added.
2458+
*/
2459+
public fun addPollOption(pollId: String, option: String) {
24502460
scope.launch {
2451-
chatClient.createPollOption(poll.id, PollOption(text = option)).await()
2461+
chatClient.createPollOption(pollId, PollOption(text = option)).await()
24522462
}
24532463
}
24542464

stream-chat-android-ui-common/src/test/kotlin/io/getstream/chat/android/ui/common/feature/messages/list/MessageListControllerTests.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import io.getstream.chat.android.models.Member
3535
import io.getstream.chat.android.models.Message
3636
import io.getstream.chat.android.models.MessageType
3737
import io.getstream.chat.android.models.MessagesState
38+
import io.getstream.chat.android.models.PollOption
3839
import io.getstream.chat.android.models.Reaction
3940
import io.getstream.chat.android.models.SyncStatus
4041
import io.getstream.chat.android.models.TypingEvent
@@ -49,6 +50,7 @@ import io.getstream.chat.android.randomMembers
4950
import io.getstream.chat.android.randomMessage
5051
import io.getstream.chat.android.randomMessageList
5152
import io.getstream.chat.android.randomOption
53+
import io.getstream.chat.android.randomPoll
5254
import io.getstream.chat.android.randomPollVote
5355
import io.getstream.chat.android.randomReaction
5456
import io.getstream.chat.android.randomString
@@ -994,6 +996,21 @@ internal class MessageListControllerTests {
994996
controller.errorEvents.value `should be equal to` expectedEvent
995997
}
996998

999+
@Test
1000+
fun `When calling addPollOption, ChatClient createPollOption is invoked`() = runTest {
1001+
val poll = randomPoll()
1002+
val optionText = randomString()
1003+
val chatClient = mock<ChatClient>()
1004+
val controller = Fixture(chatClient = chatClient)
1005+
.givenCurrentUser()
1006+
.givenChannelState(messagesState = MutableStateFlow(emptyList()))
1007+
.givenCreatePollOption(callFrom { PollOption(text = optionText) })
1008+
.get()
1009+
controller.addPollOption(poll = poll, option = optionText)
1010+
1011+
verify(chatClient).createPollOption(poll.id, PollOption(text = optionText))
1012+
}
1013+
9971014
@Test
9981015
fun `When toggleOriginalText, the message translation is toggled`() = runTest {
9991016
val messageId = randomString()
@@ -1291,6 +1308,10 @@ internal class MessageListControllerTests {
12911308
whenever(chatClient.removePollVote(any(), any(), voteId = any())) doReturn vote
12921309
}
12931310

1311+
fun givenCreatePollOption(option: Call<PollOption>) = apply {
1312+
whenever(chatClient.createPollOption(any(), any())) doReturn option
1313+
}
1314+
12941315
fun givenSendReaction(reaction: Call<Reaction>) = apply {
12951316
whenever(chatClient.sendReaction(any(), any(), any(), any())) doReturn reaction
12961317
}

stream-chat-android-ui-components/api/stream-chat-android-ui-components.api

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2353,6 +2353,7 @@ public final class io/getstream/chat/android/ui/feature/messages/list/MessageLis
23532353
public final fun setOnReactionViewClickListener (Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnReactionViewClickListener;)V
23542354
public final fun setOnReplyMessageClickListener (Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnReplyMessageClickListener;)V
23552355
public final fun setOnScrollToBottomHandler (Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnScrollToBottomHandler;)V
2356+
public final fun setOnSuggestPollOptionClickListener (Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnSuggestPollOptionClickListener;)V
23562357
public final fun setOnThreadClickListener (Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnThreadClickListener;)V
23572358
public final fun setOnUnreadLabelClickListener (Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnUnreadLabelClickListener;)V
23582359
public final fun setOnUnreadLabelReachedListener (Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnUnreadLabelReachedListener;)V
@@ -2600,6 +2601,10 @@ public abstract interface class io/getstream/chat/android/ui/feature/messages/li
26002601
public abstract fun onShowAllPollOptionClick (Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/Poll;)Z
26012602
}
26022603

2604+
public abstract interface class io/getstream/chat/android/ui/feature/messages/list/MessageListView$OnSuggestPollOptionClickListener {
2605+
public abstract fun onSuggestPollOptionClick (Lio/getstream/chat/android/models/Poll;)Z
2606+
}
2607+
26032608
public abstract interface class io/getstream/chat/android/ui/feature/messages/list/MessageListView$OnThreadClickListener {
26042609
public abstract fun onThreadClick (Lio/getstream/chat/android/models/Message;)Z
26052610
}
@@ -3153,6 +3158,7 @@ public abstract interface class io/getstream/chat/android/ui/feature/messages/li
31533158
public abstract fun getOnPollCloseClickListener ()Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnPollCloseClickListener;
31543159
public abstract fun getOnPollOptionClickListener ()Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnPollOptionClickListener;
31553160
public abstract fun getOnShowAllPollOptionClickListener ()Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnShowAllPollOptionClickListener;
3161+
public abstract fun getOnSuggestPollOptionClickListener ()Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnSuggestPollOptionClickListener;
31563162
public abstract fun getOnViewPollResultClickListener ()Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnViewPollResultClickListener;
31573163
public abstract fun getReactionViewClickListener ()Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnReactionViewClickListener;
31583164
public abstract fun getThreadClickListener ()Lio/getstream/chat/android/ui/feature/messages/list/MessageListView$OnThreadClickListener;
@@ -3233,7 +3239,7 @@ public final class io/getstream/chat/android/ui/feature/messages/list/adapter/vi
32333239
}
32343240

32353241
public final class io/getstream/chat/android/ui/feature/messages/list/adapter/view/PollViewStyle : io/getstream/chat/android/ui/helper/ViewStyle {
3236-
public fun <init> (Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Landroid/graphics/drawable/Drawable;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;)V
3242+
public fun <init> (Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Landroid/graphics/drawable/Drawable;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;)V
32373243
public final fun component1 ()Lio/getstream/chat/android/ui/font/TextStyle;
32383244
public final fun component2 ()Lio/getstream/chat/android/ui/font/TextStyle;
32393245
public final fun component3 ()Landroid/graphics/drawable/Drawable;
@@ -3242,8 +3248,9 @@ public final class io/getstream/chat/android/ui/feature/messages/list/adapter/vi
32423248
public final fun component6 ()Lio/getstream/chat/android/ui/font/TextStyle;
32433249
public final fun component7 ()Lio/getstream/chat/android/ui/font/TextStyle;
32443250
public final fun component8 ()Lio/getstream/chat/android/ui/font/TextStyle;
3245-
public final fun copy (Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Landroid/graphics/drawable/Drawable;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;)Lio/getstream/chat/android/ui/feature/messages/list/adapter/view/PollViewStyle;
3246-
public static synthetic fun copy$default (Lio/getstream/chat/android/ui/feature/messages/list/adapter/view/PollViewStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Landroid/graphics/drawable/Drawable;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;ILjava/lang/Object;)Lio/getstream/chat/android/ui/feature/messages/list/adapter/view/PollViewStyle;
3251+
public final fun component9 ()Lio/getstream/chat/android/ui/font/TextStyle;
3252+
public final fun copy (Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Landroid/graphics/drawable/Drawable;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;)Lio/getstream/chat/android/ui/feature/messages/list/adapter/view/PollViewStyle;
3253+
public static synthetic fun copy$default (Lio/getstream/chat/android/ui/feature/messages/list/adapter/view/PollViewStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Landroid/graphics/drawable/Drawable;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;Lio/getstream/chat/android/ui/font/TextStyle;ILjava/lang/Object;)Lio/getstream/chat/android/ui/feature/messages/list/adapter/view/PollViewStyle;
32473254
public fun equals (Ljava/lang/Object;)Z
32483255
public final fun getPollCloseTextStyle ()Lio/getstream/chat/android/ui/font/TextStyle;
32493256
public final fun getPollOptionCheckDrawable ()Landroid/graphics/drawable/Drawable;
@@ -3252,6 +3259,7 @@ public final class io/getstream/chat/android/ui/feature/messages/list/adapter/vi
32523259
public final fun getPollResultsTextStyle ()Lio/getstream/chat/android/ui/font/TextStyle;
32533260
public final fun getPollShowAllOptionsTextStyle ()Lio/getstream/chat/android/ui/font/TextStyle;
32543261
public final fun getPollSubtitleTextStyle ()Lio/getstream/chat/android/ui/font/TextStyle;
3262+
public final fun getPollSuggestOptionTextStyle ()Lio/getstream/chat/android/ui/font/TextStyle;
32553263
public final fun getPollTitleTextStyle ()Lio/getstream/chat/android/ui/font/TextStyle;
32563264
public fun hashCode ()I
32573265
public fun toString ()Ljava/lang/String;
@@ -3534,6 +3542,16 @@ public final class io/getstream/chat/android/ui/feature/messages/list/internal/p
35343542
public final fun newInstance (Lio/getstream/chat/android/models/Poll;)Lio/getstream/chat/android/ui/feature/messages/list/internal/poll/PollResultsDialogFragment;
35353543
}
35363544

3545+
public final class io/getstream/chat/android/ui/feature/messages/list/internal/poll/SuggestPollOptionDialogFragment : androidx/appcompat/app/AppCompatDialogFragment {
3546+
public static final field Companion Lio/getstream/chat/android/ui/feature/messages/list/internal/poll/SuggestPollOptionDialogFragment$Companion;
3547+
public fun <init> ()V
3548+
public fun onCreateDialog (Landroid/os/Bundle;)Landroid/app/Dialog;
3549+
}
3550+
3551+
public final class io/getstream/chat/android/ui/feature/messages/list/internal/poll/SuggestPollOptionDialogFragment$Companion {
3552+
public final fun newInstance (Ljava/lang/String;)Lio/getstream/chat/android/ui/feature/messages/list/internal/poll/SuggestPollOptionDialogFragment;
3553+
}
3554+
35373555
public class io/getstream/chat/android/ui/feature/messages/list/options/message/DefaultMessageOptionItemsFactory : io/getstream/chat/android/ui/feature/messages/list/options/message/MessageOptionItemsFactory {
35383556
public fun <init> (Landroid/content/Context;)V
35393557
public fun createMessageOptionItems (Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLjava/util/Set;Lio/getstream/chat/android/ui/feature/messages/list/MessageListViewStyle;)Ljava/util/List;
@@ -4983,6 +5001,19 @@ public final class io/getstream/chat/android/ui/viewmodel/messages/MessageListVi
49835001
public fun toString ()Ljava/lang/String;
49845002
}
49855003

5004+
public final class io/getstream/chat/android/ui/viewmodel/messages/MessageListViewModel$Event$PollOptionSuggested : io/getstream/chat/android/ui/viewmodel/messages/MessageListViewModel$Event {
5005+
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
5006+
public final fun component1 ()Ljava/lang/String;
5007+
public final fun component2 ()Ljava/lang/String;
5008+
public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lio/getstream/chat/android/ui/viewmodel/messages/MessageListViewModel$Event$PollOptionSuggested;
5009+
public static synthetic fun copy$default (Lio/getstream/chat/android/ui/viewmodel/messages/MessageListViewModel$Event$PollOptionSuggested;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/getstream/chat/android/ui/viewmodel/messages/MessageListViewModel$Event$PollOptionSuggested;
5010+
public fun equals (Ljava/lang/Object;)Z
5011+
public final fun getOption ()Ljava/lang/String;
5012+
public final fun getPollId ()Ljava/lang/String;
5013+
public fun hashCode ()I
5014+
public fun toString ()Ljava/lang/String;
5015+
}
5016+
49865017
public final class io/getstream/chat/android/ui/viewmodel/messages/MessageListViewModel$Event$PollOptionUpdated : io/getstream/chat/android/ui/viewmodel/messages/MessageListViewModel$Event {
49875018
public fun <init> (Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/Poll;Lio/getstream/chat/android/models/Option;)V
49885019
public final fun component1 ()Lio/getstream/chat/android/models/Message;

stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/feature/messages/list/MessageListView.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ import io.getstream.chat.android.ui.feature.messages.list.internal.SwipeReplyCal
9393
import io.getstream.chat.android.ui.feature.messages.list.internal.canReplyToMessage
9494
import io.getstream.chat.android.ui.feature.messages.list.internal.poll.AllPollOptionsDialogFragment
9595
import io.getstream.chat.android.ui.feature.messages.list.internal.poll.PollResultsDialogFragment
96+
import io.getstream.chat.android.ui.feature.messages.list.internal.poll.SuggestPollOptionDialogFragment
9697
import io.getstream.chat.android.ui.feature.messages.list.options.message.MessageOptionItem
9798
import io.getstream.chat.android.ui.feature.messages.list.options.message.MessageOptionItemsFactory
9899
import io.getstream.chat.android.ui.feature.messages.list.options.message.MessageOptionsDialogFragment
@@ -615,6 +616,13 @@ public class MessageListView : ConstraintLayout {
615616
true
616617
} ?: false
617618
}
619+
private val defaultOnSuggestPollOptionClickListener = OnSuggestPollOptionClickListener { poll ->
620+
context.getFragmentManager()?.let { fragmentManager ->
621+
SuggestPollOptionDialogFragment.newInstance(poll.id)
622+
.show(fragmentManager, SuggestPollOptionDialogFragment.TAG)
623+
true
624+
} ?: false
625+
}
618626

619627
private val listenerContainer = MessageListListenerContainerImpl(
620628
messageClickListener = defaultMessageClickListener,
@@ -632,6 +640,7 @@ public class MessageListView : ConstraintLayout {
632640
onShowAllPollOptionClickListener = defaultOnShowAllPollOptionClickListener,
633641
onPollCloseClickListener = defaultOnPollCloseClickListener,
634642
onViewPollResultClickListener = defaultOnViewPollResultClickListener,
643+
onSuggestPollOptionClickListener = defaultOnSuggestPollOptionClickListener,
635644
)
636645
private var enterThreadListener = defaultEnterThreadListener
637646
private var userReactionClickListener = defaultUserReactionClickListener
@@ -1433,6 +1442,20 @@ public class MessageListView : ConstraintLayout {
14331442
}
14341443
}
14351444

1445+
/**
1446+
* Set the Suggest Poll Option click listener to be used by MessageListView.
1447+
*
1448+
* @param listener The listener to use. If null, the default will be used instead.
1449+
*/
1450+
public fun setOnSuggestPollOptionClickListener(listener: OnSuggestPollOptionClickListener?) {
1451+
listenerContainer.onSuggestPollOptionClickListener =
1452+
if (listener == null) {
1453+
defaultOnSuggestPollOptionClickListener
1454+
} else {
1455+
OnSuggestPollOptionClickListener(listener::onSuggestPollOptionClick)
1456+
}
1457+
}
1458+
14361459
/**
14371460
* Sets the message long click listener to be used by MessageListView.
14381461
*
@@ -2311,6 +2334,10 @@ public class MessageListView : ConstraintLayout {
23112334
public fun onViewPollResultClick(poll: Poll): Boolean
23122335
}
23132336

2337+
public fun interface OnSuggestPollOptionClickListener {
2338+
public fun onSuggestPollOptionClick(poll: Poll): Boolean
2339+
}
2340+
23142341
@Deprecated(
23152342
message = "Use ReplyMessageClickListener instead",
23162343
replaceWith = ReplaceWith("ReplyMessageClickListener"),

stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/feature/messages/list/adapter/MessageListListenerContainer.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import io.getstream.chat.android.ui.feature.messages.list.MessageListView.OnPoll
3535
import io.getstream.chat.android.ui.feature.messages.list.MessageListView.OnPollOptionClickListener
3636
import io.getstream.chat.android.ui.feature.messages.list.MessageListView.OnReactionViewClickListener
3737
import io.getstream.chat.android.ui.feature.messages.list.MessageListView.OnShowAllPollOptionClickListener
38+
import io.getstream.chat.android.ui.feature.messages.list.MessageListView.OnSuggestPollOptionClickListener
3839
import io.getstream.chat.android.ui.feature.messages.list.MessageListView.OnThreadClickListener
3940
import io.getstream.chat.android.ui.feature.messages.list.MessageListView.OnTranslatedLabelClickListener
4041
import io.getstream.chat.android.ui.feature.messages.list.MessageListView.OnUnreadLabelReachedListener
@@ -80,6 +81,7 @@ public sealed interface MessageListListeners {
8081
public val onShowAllPollOptionClickListener: OnShowAllPollOptionClickListener
8182
public val onPollCloseClickListener: OnPollCloseClickListener
8283
public val onViewPollResultClickListener: OnViewPollResultClickListener
84+
public val onSuggestPollOptionClickListener: OnSuggestPollOptionClickListener
8385
}
8486

8587
@Deprecated(

0 commit comments

Comments
 (0)