diff --git a/app/src/main/java/com/fastaccess/github/ui/adapter/viewholder/CommentViewHolder.kt b/app/src/main/java/com/fastaccess/github/ui/adapter/viewholder/CommentViewHolder.kt index 9b1fc353..b014d9db 100644 --- a/app/src/main/java/com/fastaccess/github/ui/adapter/viewholder/CommentViewHolder.kt +++ b/app/src/main/java/com/fastaccess/github/ui/adapter/viewholder/CommentViewHolder.kt @@ -6,11 +6,9 @@ import android.view.ViewGroup import androidx.core.view.isVisible import com.fastaccess.data.model.CommentAuthorAssociation import com.fastaccess.data.model.CommentModel -import com.fastaccess.data.model.getEmoji import com.fastaccess.github.R import com.fastaccess.github.extensions.timeAgo import com.fastaccess.github.ui.adapter.base.BaseViewHolder -import com.fastaccess.github.utils.extensions.popupEmoji import io.noties.markwon.Markwon import kotlinx.android.synthetic.main.comment_row_item.view.* @@ -62,26 +60,8 @@ class CommentViewHolder( // val urlPattern = Patterns.WEB_URL // Linkify.addLinks(description, urlPattern, null, null, filter) - addEmoji.setOnClickListener { - it.popupEmoji(requireNotNull(model.id), model.reactionGroups) { - callback.invoke(adapterPosition) - } - } - - reactionsText.isVisible = model.reactionGroups?.any { it.users?.totalCount != 0 } ?: false - if (reactionsText.isVisible) { - val stringBuilder = StringBuilder() - model.reactionGroups?.forEach { - if (it.users?.totalCount != 0) { - stringBuilder.append(it.content.getEmoji()) - .append(" ") - .append("${it.users?.totalCount}") - .append(" ") - } - } - reactionsText.text = stringBuilder - } else { - reactionsText.text = "" + adaptiveEmoticon.init(requireNotNull(model.id), model.reactionGroups) { + callback.invoke(adapterPosition) } } } diff --git a/app/src/main/java/com/fastaccess/github/ui/modules/editor/EditorFragment.kt b/app/src/main/java/com/fastaccess/github/ui/modules/editor/EditorFragment.kt index d533773d..51557f19 100644 --- a/app/src/main/java/com/fastaccess/github/ui/modules/editor/EditorFragment.kt +++ b/app/src/main/java/com/fastaccess/github/ui/modules/editor/EditorFragment.kt @@ -36,12 +36,12 @@ import javax.inject.Inject class EditorFragment : BaseFragment(), IconDialogFragment.IconDialogClickListener, MarkdownLayout.MarkdownLayoutCallback, CreateLinkDialogFragment.OnLinkSelected { + @Inject lateinit var markwon: Markwon @Inject lateinit var preference: FastHubSharedPreference @Inject lateinit var mentionsPresenter: MentionsPresenter @Inject lateinit var markwonAdapterBuilder: MarkwonAdapter.Builder - override fun viewModel(): BaseViewModel? = null override fun layoutRes(): Int = R.layout.editor_fragment_layout @@ -107,10 +107,7 @@ class EditorFragment : BaseFragment(), IconDialogFragment.IconDialogClickListene title: String, link: String, isImage: Boolean - ) { - //TODO upload pic and get URL - markdownLayout.onLinkSelected(title, link, isImage) - } + ) = markdownLayout.onLinkSelected(title, link, isImage) private fun initEditText() { Autocomplete.on(editText) diff --git a/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt b/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt index bd496f61..ec84ee7b 100644 --- a/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt +++ b/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt @@ -40,7 +40,6 @@ import com.fastaccess.github.utils.EXTRA_THREE import com.fastaccess.github.utils.EXTRA_TWO import com.fastaccess.github.utils.extensions.hideKeyboard import com.fastaccess.github.utils.extensions.isConnected -import com.fastaccess.github.utils.extensions.popupEmoji import com.fastaccess.github.utils.extensions.theme import com.fastaccess.markdown.MarkdownProvider import com.fastaccess.markdown.spans.LabelSpan @@ -291,10 +290,8 @@ class IssueFragment : BaseFragment(), LockUnlockFragment.OnLockReasonSelected, R.color.material_red_500 } ) - addEmoji.setOnClickListener { - it.popupEmoji(requireNotNull(model.id), model.reactionGroups) { - initReactions(model) - } + adaptiveEmoticon.init(requireNotNull(model.id), model.reactionGroups) { + initReactions(model) } val isAuthor = login == me?.login || model.authorAssociation?.equals(CommentAuthorAssociation.OWNER.rawValue(), true) == true || model.authorAssociation?.equals(CommentAuthorAssociation.COLLABORATOR.rawValue(), true) == true diff --git a/app/src/main/java/com/fastaccess/github/ui/widget/AdaptiveEmoticonLayout.kt b/app/src/main/java/com/fastaccess/github/ui/widget/AdaptiveEmoticonLayout.kt new file mode 100644 index 00000000..bd1173f5 --- /dev/null +++ b/app/src/main/java/com/fastaccess/github/ui/widget/AdaptiveEmoticonLayout.kt @@ -0,0 +1,176 @@ +package com.fastaccess.github.ui.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.View +import android.widget.LinearLayout +import androidx.core.view.isVisible +import com.fastaccess.data.model.ReactionContent +import com.fastaccess.data.model.ReactionGroupModel +import com.fastaccess.data.model.getEmoji +import com.fastaccess.github.R +import com.fastaccess.github.platform.works.ReactionWorker +import com.fastaccess.github.utils.extensions.popupEmoji +import kotlinx.android.synthetic.main.add_reactions_layout.view.* + +/** + * Created by Kosh on 2019-07-30. + */ +class AdaptiveEmoticonLayout : LinearLayout { + constructor(context: Context?) : super(context) + constructor( + context: Context?, + attrs: AttributeSet? + ) : super(context, attrs) + + constructor( + context: Context?, + attrs: AttributeSet?, + defStyleAttr: Int + ) : super(context, attrs, defStyleAttr) + + @SuppressLint("RestrictedApi") + override fun onFinishInflate() { + super.onFinishInflate() + View.inflate(context, R.layout.add_reactions_layout, this) + } + + fun init( + id: String, + reactionGroups: List?, + callback: (() -> Unit)? + ) { + addEmoji.setOnClickListener { + it.popupEmoji(id, reactionGroups) { + initReactions(reactionGroups) + callback?.invoke() + } + } + + initReactions(reactionGroups) + + thumbsUp.setOnClickListener { react(it, id, reactionGroups?.firstOrNull { it.content == ReactionContent.THUMBS_UP }, callback) } + thumbsDown.setOnClickListener { react(it, id, reactionGroups?.firstOrNull { it.content == ReactionContent.THUMBS_DOWN }, callback) } + confused.setOnClickListener { react(it, id, reactionGroups?.firstOrNull { it.content == ReactionContent.CONFUSED }, callback) } + laugh.setOnClickListener { react(it, id, reactionGroups?.firstOrNull { it.content == ReactionContent.LAUGH }, callback) } + hooray.setOnClickListener { react(it, id, reactionGroups?.firstOrNull { it.content == ReactionContent.HOORAY }, callback) } + heart.setOnClickListener { react(it, id, reactionGroups?.firstOrNull { it.content == ReactionContent.HEART }, callback) } + rocket.setOnClickListener { react(it, id, reactionGroups?.firstOrNull { it.content == ReactionContent.ROCKET }, callback) } + eyes.setOnClickListener { react(it, id, reactionGroups?.firstOrNull { it.content == ReactionContent.EYES }, callback) } + } + + + @SuppressLint("SetTextI18n") + private fun initReactions( + reactionGroups: List? + ) { + getReactionCount(reactionGroups, ReactionContent.THUMBS_UP).let { + if (it > 0) { + thumbsUp.isVisible = true + thumbsUp.text = "${ReactionContent.THUMBS_UP.getEmoji()} $it" + } else { + thumbsUp.isVisible = false + } + } + + getReactionCount(reactionGroups, ReactionContent.THUMBS_DOWN).let { + if (it > 0) { + thumbsDown.isVisible = true + thumbsDown.text = "${ReactionContent.THUMBS_DOWN.getEmoji()} $it" + } else { + thumbsDown.isVisible = false + } + } + + getReactionCount(reactionGroups, ReactionContent.CONFUSED).let { + if (it > 0) { + confused.isVisible = true + confused.text = "${ReactionContent.CONFUSED.getEmoji()} $it" + } else { + confused.isVisible = false + } + } + + getReactionCount(reactionGroups, ReactionContent.LAUGH).let { + if (it > 0) { + laugh.isVisible = true + laugh.text = "${ReactionContent.LAUGH.getEmoji()} $it" + } else { + laugh.isVisible = false + } + } + + getReactionCount(reactionGroups, ReactionContent.HOORAY).let { + if (it > 0) { + hooray.isVisible = true + hooray.text = "${ReactionContent.HOORAY.getEmoji()} $it" + } else { + hooray.isVisible = false + } + } + + getReactionCount(reactionGroups, ReactionContent.HEART).let { + if (it > 0) { + heart.isVisible = true + heart.text = "${ReactionContent.HEART.getEmoji()} $it" + } else { + heart.isVisible = false + } + } + + getReactionCount(reactionGroups, ReactionContent.ROCKET).let { + if (it > 0) { + rocket.isVisible = true + rocket.text = "${ReactionContent.ROCKET.getEmoji()} $it" + } else { + rocket.isVisible = false + } + } + + getReactionCount(reactionGroups, ReactionContent.EYES).let { + if (it > 0) { + eyes.isVisible = true + eyes.text = "${ReactionContent.EYES.getEmoji()} $it" + } else { + eyes.isVisible = false + } + } + + } + + private fun getReactionCount( + reactionGroups: List?, + content: ReactionContent + ): Int = reactionGroups + ?.filter { it.users != null && it.content != null } + ?.firstOrNull { it.content == content }?.let { + return@let it.users?.totalCount ?: 0 + } ?: 0 + + private fun react( + view: View, + id: String, + model: ReactionGroupModel?, + callback: (() -> Unit)? + ) { + model?.let { reaction -> + val add: Boolean + if (reaction.viewerHasReacted == true) { + reaction.users?.totalCount = reaction.users?.totalCount?.minus(1) + model.viewerHasReacted = false + add = false + } else { + reaction.users?.totalCount = reaction.users?.totalCount?.plus(1) + model.viewerHasReacted = true + add = true + } + if (reaction.users?.totalCount == 0) { + view.isVisible = false + } + ReactionWorker.enqueue(model.content?.value ?: "", id, add) + callback?.invoke() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/github/ui/widget/ReactionsChipGroup.kt b/app/src/main/java/com/fastaccess/github/ui/widget/ReactionsChipGroup.kt index 0925f574..f72cb2ad 100644 --- a/app/src/main/java/com/fastaccess/github/ui/widget/ReactionsChipGroup.kt +++ b/app/src/main/java/com/fastaccess/github/ui/widget/ReactionsChipGroup.kt @@ -18,8 +18,16 @@ import kotlinx.android.synthetic.main.reactions_chips_layout.view.* */ class ReactionsChipGroup : ChipGroup { constructor(context: Context?) : super(context) - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + constructor( + context: Context?, + attrs: AttributeSet? + ) : super(context, attrs) + + constructor( + context: Context?, + attrs: AttributeSet?, + defStyleAttr: Int + ) : super(context, attrs, defStyleAttr) @SuppressLint("RestrictedApi") override fun onFinishInflate() { @@ -31,7 +39,8 @@ class ReactionsChipGroup : ChipGroup { id: String, reactionGroups: List?, popupWindow: PopupWindow? = null, - callback: (() -> Unit)?) { + callback: (() -> Unit)? + ) { thumbsUp.text = "${ReactionContent.THUMBS_UP.getEmoji()} ${reactionGroups ?.firstOrNull { it.content == ReactionContent.THUMBS_UP } ?.users?.totalCount}" @@ -71,7 +80,8 @@ class ReactionsChipGroup : ChipGroup { id: String, model: ReactionGroupModel?, popupWindow: PopupWindow?, - callback: (() -> Unit)?) { + callback: (() -> Unit)? + ) { model?.let { reaction -> val add: Boolean if (reaction.viewerHasReacted == true) { diff --git a/app/src/main/res/layouts/other_layouts/layout/add_reactions_layout.xml b/app/src/main/res/layouts/other_layouts/layout/add_reactions_layout.xml new file mode 100644 index 00000000..fa9e552d --- /dev/null +++ b/app/src/main/res/layouts/other_layouts/layout/add_reactions_layout.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/row_layouts/layout/comment_row_item.xml b/app/src/main/res/layouts/row_layouts/layout/comment_row_item.xml index bd2ad2eb..b7232d75 100644 --- a/app/src/main/res/layouts/row_layouts/layout/comment_row_item.xml +++ b/app/src/main/res/layouts/row_layouts/layout/comment_row_item.xml @@ -64,28 +64,8 @@ app:autoSizeTextType="uniform" tools:text="Owner" /> - - - + + \ No newline at end of file diff --git a/app/src/main/res/layouts/row_layouts/layout/issue_header_row_item.xml b/app/src/main/res/layouts/row_layouts/layout/issue_header_row_item.xml index bfd14734..cde3fe05 100644 --- a/app/src/main/res/layouts/row_layouts/layout/issue_header_row_item.xml +++ b/app/src/main/res/layouts/row_layouts/layout/issue_header_row_item.xml @@ -132,16 +132,6 @@ - - + + \ No newline at end of file diff --git a/resources/src/main/res/drawable/ic_add_emoji.xml b/resources/src/main/res/drawable/ic_add_emoji.xml index 25d14098..e4cb0e6a 100644 --- a/resources/src/main/res/drawable/ic_add_emoji.xml +++ b/resources/src/main/res/drawable/ic_add_emoji.xml @@ -1,10 +1,11 @@ - + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12M22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2A10,10 0 0,1 22,12M10,9.5C10,10.3 9.3,11 8.5,11C7.7,11 7,10.3 7,9.5C7,8.7 7.7,8 8.5,8C9.3,8 10,8.7 10,9.5M17,9.5C17,10.3 16.3,11 15.5,11C14.7,11 14,10.3 14,9.5C14,8.7 14.7,8 15.5,8C16.3,8 17,8.7 17,9.5M12,17.23C10.25,17.23 8.71,16.5 7.81,15.42L9.23,14C9.68,14.72 10.75,15.23 12,15.23C13.25,15.23 14.32,14.72 14.77,14L16.19,15.42C15.29,16.5 13.75,17.23 12,17.23Z" + tools:fillColor="#000" /> \ No newline at end of file