diff --git a/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt index a0d477898c688f2cfe0accdf81ba53051a59dead..746306af2b477ca3a79ef584eff67e1374ec273f 100644 --- a/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt +++ b/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt @@ -23,7 +23,6 @@ import org.futo.circles.core.extensions.showError import org.futo.circles.core.extensions.showNoInternetConnection import org.futo.circles.core.extensions.showSuccess import org.futo.circles.core.extensions.withConfirmation -import org.futo.circles.core.feature.markdown.MarkdownParser import org.futo.circles.core.feature.share.ShareProvider import org.futo.circles.core.model.CircleRoomTypeArg import org.futo.circles.core.model.CreatePollContent @@ -87,6 +86,8 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli } } + private var onLocalAddEmojiCallback: ((String) -> Unit)? = null + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupViews() @@ -203,8 +204,9 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli navigator.navigateToShowMediaPreview(roomId, eventId) } - override fun onShowEmoji(roomId: String, eventId: String) { + override fun onShowEmoji(roomId: String, eventId: String, onAddEmoji: (String) -> Unit) { if (showNoInternetConnection()) return + onLocalAddEmojiCallback = onAddEmoji navigator.navigateToShowEmoji(roomId, eventId) } @@ -274,6 +276,8 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli override fun onEmojiSelected(roomId: String?, eventId: String?, emoji: String) { roomId ?: return eventId ?: return + onLocalAddEmojiCallback?.invoke(emoji) + onLocalAddEmojiCallback = null viewModel.sendReaction(roomId, eventId, emoji) } diff --git a/app/src/main/java/org/futo/circles/view/PostFooterView.kt b/app/src/main/java/org/futo/circles/view/PostFooterView.kt index de1816f0bab7d4aedfb16824b754a07b599e8dea..6747a3d449aeaed835a74be73a5b1d67a672a52a 100644 --- a/app/src/main/java/org/futo/circles/view/PostFooterView.kt +++ b/app/src/main/java/org/futo/circles/view/PostFooterView.kt @@ -4,6 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.children import androidx.core.view.isVisible import org.futo.circles.core.base.NetworkObserver import org.futo.circles.core.extensions.setIsVisible @@ -41,7 +42,12 @@ class PostFooterView( post?.let { optionsListener?.onShare(it.content) } } btnLike.setOnClickListener { - post?.let { optionsListener?.onShowEmoji(it.postInfo.roomId, it.id) } + post?.let { + optionsListener?.onShowEmoji( + it.postInfo.roomId, + it.id + ) { addEmojiFromPickerLocalUpdate(it) } + } } } } @@ -85,35 +91,56 @@ class PostFooterView( } private fun bindReactionsList(reactions: List<ReactionsData>) { - binding.rvEmojis.setIsVisible(reactions.isNotEmpty()) + binding.hsEmojis.setIsVisible(reactions.isNotEmpty()) binding.lEmojisContainer.removeAllViews() - reactions.forEach { - binding.lEmojisContainer.addView(ReactionItemView(context).apply { - setup(it) { reaction -> - locallyUpdateEmojisList(this, reaction) - post?.let { - optionsListener?.onEmojiChipClicked( - it.postInfo.roomId, - it.id, - reaction.key, - reaction.addedByMe - ) - } + reactions.forEach { addReactionItem(it) } + } + + private fun addReactionItem(reactionsData: ReactionsData) { + binding.lEmojisContainer.addView(ReactionItemView(context).apply { + setup(reactionsData) { reaction -> + locallyUpdateEmojisList(this, reaction) + post?.let { + optionsListener?.onEmojiChipClicked( + it.postInfo.roomId, + it.id, + reaction.key, + reaction.addedByMe + ) } - }) - } + } + }) } private fun locallyUpdateEmojisList(view: ReactionItemView, reaction: ReactionsData) { if (!NetworkObserver.isConnected()) return if (areUserAbleToPost().not()) return if (reaction.addedByMe) { - if (reaction.count == 1) binding.lEmojisContainer.removeView(view) - else view.bindReactionData(reaction.copy(addedByMe = false, count = reaction.count - 1)) + if (reaction.count == 1) { + binding.lEmojisContainer.removeView(view) + if (binding.lEmojisContainer.children.count() == 0) + binding.hsEmojis.setIsVisible(false) + } else view.bindReactionData( + reaction.copy( + addedByMe = false, + count = reaction.count - 1 + ) + ) } else { view.bindReactionData(reaction.copy(addedByMe = true, count = reaction.count + 1)) } } + fun addEmojiFromPickerLocalUpdate(emoji: String) { + val view = binding.lEmojisContainer.findViewWithTag<ReactionItemView>(emoji) + view?.let { + val data = it.reactionsData ?: return + it.bindReactionData(data.copy(count = data.count + 1, addedByMe = true)) + } ?: kotlin.run { + binding.hsEmojis.setIsVisible(true) + addReactionItem(ReactionsData(emoji, 1, true)) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/org/futo/circles/view/PostLayout.kt b/app/src/main/java/org/futo/circles/view/PostLayout.kt index 808ffc9dd615465989ee663fb6a9b71ca99621a2..1976049f69bc9eb634b757f7c993f19145bc067a 100644 --- a/app/src/main/java/org/futo/circles/view/PostLayout.kt +++ b/app/src/main/java/org/futo/circles/view/PostLayout.kt @@ -11,13 +11,13 @@ import android.view.ViewGroup import android.widget.FrameLayout import org.futo.circles.R import org.futo.circles.core.extensions.setIsVisible +import org.futo.circles.core.feature.markdown.MarkdownParser import org.futo.circles.core.model.MediaContent import org.futo.circles.core.model.PollContent import org.futo.circles.core.model.Post import org.futo.circles.core.model.PostContent import org.futo.circles.core.model.TextContent import org.futo.circles.databinding.LayoutPostBinding -import org.futo.circles.core.feature.markdown.MarkdownParser import org.futo.circles.model.PostItemPayload import org.matrix.android.sdk.api.session.room.send.SendState @@ -28,7 +28,7 @@ interface PostOptionsListener { fun onShare(content: PostContent) fun onReply(roomId: String, eventId: String) fun onShowPreview(roomId: String, eventId: String) - fun onShowEmoji(roomId: String, eventId: String) + fun onShowEmoji(roomId: String, eventId: String, onAddEmoji: (String) -> Unit) fun onEmojiChipClicked(roomId: String, eventId: String, emoji: String, isUnSend: Boolean) fun onPollOptionSelected(roomId: String, eventId: String, optionId: String) } @@ -49,7 +49,11 @@ class PostLayout( GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() { override fun onDoubleTap(e: MotionEvent): Boolean { if (binding.postFooter.areUserAbleToPost()) - post?.let { optionsListener?.onShowEmoji(it.postInfo.roomId, it.id) } + post?.let { + optionsListener?.onShowEmoji(it.postInfo.roomId, it.id) { emoji -> + binding.postFooter.addEmojiFromPickerLocalUpdate(emoji) + } + } return true } diff --git a/app/src/main/java/org/futo/circles/view/ReactionItemView.kt b/app/src/main/java/org/futo/circles/view/ReactionItemView.kt index a22d653e16d9f91029907e0022080da5d879ddba..062826b9864a7bc4192e17120ed5dc643731d7d9 100644 --- a/app/src/main/java/org/futo/circles/view/ReactionItemView.kt +++ b/app/src/main/java/org/futo/circles/view/ReactionItemView.kt @@ -15,14 +15,19 @@ class ReactionItemView( private val binding = ListItemTimelineReactionBinding.inflate(LayoutInflater.from(context), this) + var reactionsData: ReactionsData? = null + private set + fun setup(data: ReactionsData, onClick: (ReactionsData) -> Unit) { binding.emojiChip.setOnClickListener { onClick(data) } bindReactionData(data) } fun bindReactionData(data: ReactionsData) { + reactionsData = data binding.emojiChip.apply { val title = "${data.key} ${data.count}" + tag = data.key text = title isChecked = data.addedByMe } diff --git a/app/src/main/res/layout/view_post_footer.xml b/app/src/main/res/layout/view_post_footer.xml index d19627b2e41dc829d0ce946fd061bb7b8d34f1f5..03c5f2fb4f2fd3dcf02c175333be5e28841158d8 100644 --- a/app/src/main/res/layout/view_post_footer.xml +++ b/app/src/main/res/layout/view_post_footer.xml @@ -8,7 +8,7 @@ <HorizontalScrollView - android:id="@+id/rvEmojis" + android:id="@+id/hsEmojis" android:layout_width="0dp" android:layout_height="0dp" android:orientation="horizontal" @@ -47,7 +47,7 @@ app:iconTint="@color/button_src_state_color" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/btnReply" - app:layout_constraintStart_toEndOf="@id/rvEmojis" + app:layout_constraintStart_toEndOf="@id/hsEmojis" app:layout_constraintTop_toBottomOf="@id/divider" app:tint="@color/button_src_state_color" />