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 ac79fc8929fadf55b273f0f679839ccc6497fbfa..ef7d1a58ccd40e7b94ef0fca36f16e3fa6bb9583 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 @@ -71,11 +71,7 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli } private val listAdapter by lazy { - TimelineAdapter( - getCurrentUserPowerLevel(args.roomId), - this, - isThread - ) { loadMoreDebounce(Unit) }.apply { + TimelineAdapter(this, isThread) { loadMoreDebounce(Unit) }.apply { setHasStableIds(true) registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { @@ -216,6 +212,7 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli override fun onShowEmoji(roomId: String, eventId: String, onAddEmoji: (String) -> Unit) { if (showNoInternetConnection()) return + if (showErrorIfNotAbleToPost()) return onLocalAddEmojiCallback = onAddEmoji navigator.navigateToShowEmoji(roomId, eventId) } @@ -246,16 +243,14 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli roomId: String, eventId: String, emoji: String, isUnSend: Boolean ) { if (showNoInternetConnection()) return - if (viewModel.accessLevelLiveData.value?.isCurrentUserAbleToPost() != true) { - showError(getString(R.string.you_can_not_post_to_this_room)) - return - } + if (showErrorIfNotAbleToPost()) return if (isUnSend) viewModel.unSendReaction(roomId, eventId, emoji) else viewModel.sendReaction(roomId, eventId, emoji) } override fun onPollOptionSelected(roomId: String, eventId: String, optionId: String) { if (showNoInternetConnection()) return + if (showErrorIfNotAbleToPost()) return viewModel.pollVote(roomId, eventId, optionId) } @@ -320,7 +315,12 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli private fun onUserAccessLevelChanged(powerLevelsContent: PowerLevelsContent) { if (isGroupMode) onGroupUserAccessLevelChanged(powerLevelsContent) else onCircleUserAccessLeveChanged(powerLevelsContent) - listAdapter.updateUserPowerLevel(getCurrentUserPowerLevel(args.roomId)) + } + + private fun showErrorIfNotAbleToPost(): Boolean { + val isAbleToPost = viewModel.accessLevelLiveData.value?.isCurrentUserAbleToPost() == true + if (!isAbleToPost) showError(getString(R.string.you_can_not_post_to_this_room)) + return !isAbleToPost } private fun onGroupUserAccessLevelChanged(powerLevelsContent: PowerLevelsContent) { diff --git a/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineAdapter.kt b/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineAdapter.kt index d94c4652a3e42f43828bc071c7a28f3dcc09921c..a2e48feaec5b35bb58e5ad5ff0164938efd3de29 100644 --- a/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineAdapter.kt +++ b/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineAdapter.kt @@ -1,6 +1,5 @@ package org.futo.circles.feature.timeline.list -import android.annotation.SuppressLint import android.view.ViewGroup import org.futo.circles.core.base.list.BaseRvAdapter import org.futo.circles.core.feature.timeline.data_source.BaseTimelineDataSource @@ -10,7 +9,6 @@ import org.futo.circles.model.PostItemPayload import org.futo.circles.view.PostOptionsListener class TimelineAdapter( - private var userPowerLevel: Int, private val postOptionsListener: PostOptionsListener, private val isThread: Boolean, private val onLoadMore: () -> Unit @@ -24,12 +22,6 @@ class TimelineAdapter( ) }) { - @SuppressLint("NotifyDataSetChanged") - fun updateUserPowerLevel(level: Int) { - userPowerLevel = level - notifyDataSetChanged() - } - override fun getItemId(position: Int): Long = getItem(position).id.hashCode().toLong() override fun getItemViewType(position: Int): Int = getItem(position).content.type.ordinal @@ -45,7 +37,7 @@ class TimelineAdapter( } override fun onBindViewHolder(holder: PostViewHolder, position: Int) { - holder.bind(getItem(position), userPowerLevel) + holder.bind(getItem(position)) if (position >= itemCount - BaseTimelineDataSource.LOAD_MORE_THRESHOLD) onLoadMore() } @@ -59,7 +51,7 @@ class TimelineAdapter( } else { payloads.forEach { val payload = (it as? PostItemPayload) ?: return@forEach - if (payload.needToUpdateFullItem) holder.bind(getItem(position), userPowerLevel) + if (payload.needToUpdateFullItem) holder.bind(getItem(position)) else holder.bindPayload(payload) } } diff --git a/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineViewHolder.kt b/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineViewHolder.kt index fd2366a96746e65a7cb701a4e0ae2531dac2a95f..963a2cd832282abf0d54695cbfe1bf8f8cc1dba5 100644 --- a/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineViewHolder.kt +++ b/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineViewHolder.kt @@ -8,6 +8,7 @@ import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.annotation.CallSuper import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -36,8 +37,9 @@ sealed class PostViewHolder(view: View, private val isThread: Boolean) : abstract val postLayout: PostLayout - open fun bind(post: Post, userPowerLevel: Int) { - postLayout.setData(post, userPowerLevel, isThread) + @CallSuper + open fun bind(post: Post) { + postLayout.setData(post, isThread) } fun bindPayload(payload: PostItemPayload) { @@ -94,8 +96,8 @@ class TextMediaPostViewHolder( .show() } - override fun bind(post: Post, userPowerLevel: Int) { - super.bind(post, userPowerLevel) + override fun bind(post: Post) { + super.bind(post) binding.vLoadingView.gone() when (val content = post.content) { is TextContent -> bindTextPost(content) @@ -159,8 +161,8 @@ class PollPostViewHolder( binding.lPollPost.setListener(postOptionsListener) } - override fun bind(post: Post, userPowerLevel: Int) { - super.bind(post, userPowerLevel) + override fun bind(post: Post) { + super.bind(post) (post.content as? PollContent)?.let { binding.pollContentView.setup(it) { optionId -> postOptionsListener.onPollOptionSelected(post.postInfo.roomId, post.id, optionId) 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 ad29fbbe7854028db59c95fd0ab30f863e2eec91..484fcbfcf583aa0fb9dfa299cf094f421b44919d 100644 --- a/app/src/main/java/org/futo/circles/view/PostFooterView.kt +++ b/app/src/main/java/org/futo/circles/view/PostFooterView.kt @@ -7,6 +7,7 @@ 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.getCurrentUserPowerLevel import org.futo.circles.core.extensions.setIsVisible import org.futo.circles.core.model.Post import org.futo.circles.core.model.ReactionsData @@ -25,7 +26,6 @@ class PostFooterView( private var optionsListener: PostOptionsListener? = null private var post: Post? = null private var isThreadPost = false - private var userPowerLevel: Int = Role.Default.value init { setupViews() @@ -56,9 +56,8 @@ class PostFooterView( optionsListener = postOptionsListener } - fun setData(data: Post, powerLevel: Int, isThread: Boolean) { + fun setData(data: Post, isThread: Boolean) { post = data - userPowerLevel = powerLevel isThreadPost = isThread bindViewData(data.repliesCount, data.canShare()) bindReactionsList(data.reactionsData) @@ -70,12 +69,9 @@ class PostFooterView( bindReactionsList(reactions) } - fun areUserAbleToPost() = userPowerLevel >= Role.Default.value - private fun bindViewData(repliesCount: Int, canShare: Boolean) { with(binding) { btnShare.setIsVisible(canShare) - btnLike.isEnabled = areUserAbleToPost() btnReply.apply { isVisible = !isThreadPost setRepliesCount(repliesCount) @@ -111,7 +107,7 @@ class PostFooterView( private fun locallyUpdateEmojisList(view: ReactionItemView, reaction: ReactionsData) { if (!NetworkObserver.isConnected()) return - if (areUserAbleToPost().not()) return + if (!isAbleToPost()) return if (reaction.addedByMe) { if (reaction.count == 1) { binding.lEmojisContainer.removeView(view) @@ -139,5 +135,7 @@ class PostFooterView( } } + private fun isAbleToPost() = + getCurrentUserPowerLevel(post?.postInfo?.roomId ?: "") >= Role.Default.value } \ 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 1dbcb5bf94fee01cd227aa7b2d731ebf366d3706..e9b15ff219670e38eb5bc06b0245b9d492c11a9e 100644 --- a/app/src/main/java/org/futo/circles/view/PostLayout.kt +++ b/app/src/main/java/org/futo/circles/view/PostLayout.kt @@ -49,12 +49,11 @@ class PostLayout( private val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() { override fun onDoubleTap(e: MotionEvent): Boolean { - if (binding.postFooter.areUserAbleToPost()) - post?.let { - optionsListener?.onShowEmoji(it.postInfo.roomId, it.id) { emoji -> - binding.postFooter.addEmojiFromPickerLocalUpdate(emoji) - } + post?.let { + optionsListener?.onShowEmoji(it.postInfo.roomId, it.id) { emoji -> + binding.postFooter.addEmojiFromPickerLocalUpdate(emoji) } + } return true } @@ -89,9 +88,9 @@ class PostLayout( } - fun setData(data: Post, userPowerLevel: Int, isThread: Boolean) { + fun setData(data: Post, isThread: Boolean) { post = data - setGeneralMessageData(data, userPowerLevel, isThread) + setGeneralMessageData(data, isThread) } fun setPayload(payload: PostItemPayload) { @@ -118,9 +117,9 @@ class PostLayout( } } - private fun setGeneralMessageData(data: Post, userPowerLevel: Int, isThread: Boolean) { + private fun setGeneralMessageData(data: Post, isThread: Boolean) { binding.postHeader.setData(data) - binding.postFooter.setData(data, userPowerLevel, isThread) + binding.postFooter.setData(data, isThread) setMentionBorder(data.content) setIsEdited(data.postInfo.isEdited) setSendStatus(data.sendState, data.readByCount)