diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt index 8198748a0..51bab9f80 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingPollMessageViewHolder.kt @@ -125,6 +125,7 @@ class IncomingPollMessageViewHolder(incomingView: View, payload: Any) : MessageH binding.bubble.setOnClickListener { val pollVoteDialog = PollMainDialogFragment.newInstance( + message.activeUser!!, roomToken, pollId, pollName diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt index ccf339b64..15b3d8ab0 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt @@ -141,6 +141,7 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : Messag binding.bubble.setOnClickListener { val pollVoteDialog = PollMainDialogFragment.newInstance( + message.activeUser!!, roomToken, pollId, pollName diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultItem.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultItem.kt index 22d2cda4c..19051ea61 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultItem.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultItem.kt @@ -1,9 +1,10 @@ package com.nextcloud.talk.polls.adapters -class PollResultItem( - val pollOption: String, - val pollPercent: Int, - val selfVoted: Boolean +import com.nextcloud.talk.polls.model.PollDetails - // val voters.... +class PollResultItem( + val name: String, + val percent: Int, + val selfVoted: Boolean, + val voters: List? ) diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultViewHolder.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultViewHolder.kt index bf0bc409d..b8f400340 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultViewHolder.kt @@ -2,34 +2,106 @@ package com.nextcloud.talk.polls.adapters import android.annotation.SuppressLint import android.graphics.Typeface +import android.text.TextUtils import android.view.View +import android.widget.LinearLayout import androidx.recyclerview.widget.RecyclerView +import com.facebook.drawee.backends.pipeline.Fresco +import com.facebook.drawee.generic.RoundingParams +import com.facebook.drawee.interfaces.DraweeController +import com.facebook.drawee.view.SimpleDraweeView +import com.nextcloud.talk.R +import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.PollResultItemBinding +import com.nextcloud.talk.models.database.UserEntity +import com.nextcloud.talk.polls.model.PollDetails +import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.DisplayUtils class PollResultViewHolder( - private val binding: PollResultItemBinding, - private val showDetails: Boolean, - - ) : RecyclerView.ViewHolder(binding.root) { + private val user: UserEntity, + private val binding: PollResultItemBinding +) : RecyclerView.ViewHolder(binding.root) { @SuppressLint("SetTextI18n") fun bind(pollResultItem: PollResultItem, clickListener: PollResultItemClickListener) { binding.root.setOnClickListener { clickListener.onClick(pollResultItem) } - binding.pollOptionText.text = pollResultItem.pollOption - binding.pollOptionPercentText.text = pollResultItem.pollPercent.toString() + "%" + // binding.root.setOnClickListener { clickListener.onClick(pollResultItem) } + + binding.pollOptionText.text = pollResultItem.name + binding.pollOptionPercentText.text = "${pollResultItem.percent}%" if (pollResultItem.selfVoted) { binding.pollOptionText.setTypeface(null, Typeface.BOLD) binding.pollOptionPercentText.setTypeface(null, Typeface.BOLD) } - binding.pollOptionBar.progress = pollResultItem.pollPercent + binding.pollOptionBar.progress = pollResultItem.percent - if (showDetails) { + if (!pollResultItem.voters.isNullOrEmpty()) { binding.pollOptionDetail.visibility = View.VISIBLE + + val lp = LinearLayout.LayoutParams( + 90, + 70 + ) + + pollResultItem.voters.forEach { + val avatar = SimpleDraweeView(binding.root.context) + avatar.layoutParams = lp + + val roundingParams = RoundingParams.fromCornersRadius(5f) + roundingParams.roundAsCircle = true + + avatar.hierarchy.roundingParams = roundingParams + avatar.controller = getAvatarDraweeController(it) + + binding.pollOptionDetail.addView(avatar) + } } else { binding.pollOptionDetail.visibility = View.GONE } } + + private fun getAvatarDraweeController(pollDetail: PollDetails): DraweeController? { + if (pollDetail.actorType == "guests") { + var displayName = NextcloudTalkApplication.sharedApplication?.resources?.getString(R.string.nc_guest) + if (!TextUtils.isEmpty(pollDetail.actorDisplayName)) { + displayName = pollDetail.actorDisplayName!! + } + val draweeController: DraweeController = Fresco.newDraweeControllerBuilder() + // .setOldController(binding.avatar.controller) + .setAutoPlayAnimations(true) + .setImageRequest( + DisplayUtils.getImageRequestForUrl( + ApiUtils.getUrlForGuestAvatar( + user.baseUrl, + displayName, + false + ), + null + ) + ) + .build() + return draweeController + } else if (pollDetail.actorType == "users") { + val draweeController: DraweeController = Fresco.newDraweeControllerBuilder() + // .setOldController(binding.avatar.controller) + .setAutoPlayAnimations(true) + .setImageRequest( + DisplayUtils.getImageRequestForUrl( + ApiUtils.getUrlForAvatar( + user.baseUrl, + pollDetail.actorId, + false + ), + null + ) + ) + .build() + return draweeController + } + return null + } } diff --git a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt index 039ec4900..63827661b 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/adapters/PollResultsAdapter.kt @@ -4,20 +4,22 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.nextcloud.talk.databinding.PollResultItemBinding +import com.nextcloud.talk.models.database.UserEntity class PollResultsAdapter( + private val user: UserEntity, private val clickListener: PollResultItemClickListener, - private val showDetails: Boolean ) : RecyclerView.Adapter() { internal var list: MutableList = ArrayList() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PollResultViewHolder { val itemBinding = PollResultItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return PollResultViewHolder(itemBinding, showDetails) + return PollResultViewHolder(user, itemBinding) } override fun onBindViewHolder(holder: PollResultViewHolder, position: Int) { - holder.bind(list[position], clickListener) + val pollResultItem = list[position] + holder.bind(pollResultItem, clickListener) } override fun getItemCount(): Int { diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt index ba7f0d57d..88859b881 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt @@ -13,12 +13,14 @@ import autodagger.AutoInjector import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.DialogPollMainBinding +import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.polls.model.Poll import com.nextcloud.talk.polls.viewmodels.PollMainViewModel import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) class PollMainDialogFragment( + private val user: UserEntity, private val pollId: String, private val roomToken: String, private val pollTitle: String @@ -91,6 +93,7 @@ class PollMainDialogFragment( initVotersAmount(poll.numVoters) val contentFragment = PollResultsFragment( + user, viewModel, roomToken, pollId @@ -114,9 +117,10 @@ class PollMainDialogFragment( companion object { @JvmStatic fun newInstance( + user: UserEntity, roomTokenParam: String, pollId: String, name: String - ): PollMainDialogFragment = PollMainDialogFragment(pollId, roomTokenParam, name) + ): PollMainDialogFragment = PollMainDialogFragment(user, pollId, roomTokenParam, name) } } diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt index 8a4964204..85dbcb5e3 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollResultsFragment.kt @@ -32,6 +32,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import autodagger.AutoInjector import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.databinding.DialogPollResultsBinding +import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.polls.adapters.PollResultItem import com.nextcloud.talk.polls.adapters.PollResultItemClickListener import com.nextcloud.talk.polls.adapters.PollResultsAdapter @@ -42,6 +43,7 @@ import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) class PollResultsFragment( + private val user: UserEntity, private val parentViewModel: PollMainViewModel, private val roomToken: String, private val pollId: String @@ -78,7 +80,7 @@ class PollResultsFragment( parentViewModel.viewState.observe(viewLifecycleOwner) { state -> if (state is PollMainViewModel.PollResultState) { - initAdapter(state.showParticipants) + initAdapter() initPollResults(state.poll) initEditButton(state.showEditButton) initCloseButton(state.showCloseButton) @@ -86,8 +88,8 @@ class PollResultsFragment( } } - private fun initAdapter(showParticipants: Boolean) { - adapter = PollResultsAdapter(this, showParticipants) + private fun initAdapter() { + adapter = PollResultsAdapter(user, this) _binding?.pollResultsList?.adapter = adapter _binding?.pollResultsList?.layoutManager = LinearLayoutManager(context) } @@ -98,15 +100,15 @@ class PollResultsFragment( val oneVoteInPercent = 100 / votersAmount // TODO: poll.numVoters when fixed on api poll.options?.forEachIndexed { index, option -> - val votersForThisOption = poll.details.filter { it.optionId == index }.size - val optionsPercent = oneVoteInPercent * votersForThisOption + val votersForThisOption = poll.details.filter { it.optionId == index } + val optionsPercent = oneVoteInPercent * votersForThisOption.size val pollResultItem = PollResultItem( option, optionsPercent, - isOptionSelfVoted(poll, index) + isOptionSelfVoted(poll, index), + votersForThisOption ) - // TODO add participants to PollResultItem adapter?.list?.add(pollResultItem) } } else if (poll.votes != null) { @@ -114,16 +116,17 @@ class PollResultsFragment( val oneVoteInPercent = 100 / votersAmount poll.options?.forEachIndexed { index, option -> - var votersForThisOption = poll.votes.filter { it.key.toInt() == index }[index.toString()] - if (votersForThisOption == null) { - votersForThisOption = 0 + var votersAmountForThisOption = poll.votes.filter { it.key.toInt() == index }[index.toString()] + if (votersAmountForThisOption == null) { + votersAmountForThisOption = 0 } - val optionsPercent = oneVoteInPercent * votersForThisOption + val optionsPercent = oneVoteInPercent * votersAmountForThisOption val pollResultItem = PollResultItem( option, optionsPercent, - isOptionSelfVoted(poll, index) + isOptionSelfVoted(poll, index), + null ) adapter?.list?.add(pollResultItem) } diff --git a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollMainViewModel.kt b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollMainViewModel.kt index 909f108a6..e9f66f242 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollMainViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/viewmodels/PollMainViewModel.kt @@ -48,7 +48,6 @@ class PollMainViewModel @Inject constructor(private val repository: PollReposito open class PollResultState( val poll: Poll, - val showParticipants: Boolean, val showEditButton: Boolean, val showCloseButton: Boolean ) : ViewState @@ -129,11 +128,10 @@ class PollMainViewModel @Inject constructor(private val repository: PollReposito } private fun setPollResultState(poll: Poll) { - val showDetails = poll.status == Poll.STATUS_CLOSED && poll.resultMode == Poll.RESULT_MODE_PUBLIC val showEditButton = poll.status == Poll.STATUS_OPEN && poll.resultMode == Poll.RESULT_MODE_PUBLIC val showCloseButton = poll.status == Poll.STATUS_OPEN && isPollCreatedByCurrentUser(poll) - _viewState.value = PollResultState(poll, showDetails, showEditButton, showCloseButton) + _viewState.value = PollResultState(poll, showEditButton, showCloseButton) } private fun votedForOpenHiddenPoll(poll: Poll): Boolean { diff --git a/app/src/main/res/layout/dialog_poll_results.xml b/app/src/main/res/layout/dialog_poll_results.xml index 89d435994..8b7df33de 100644 --- a/app/src/main/res/layout/dialog_poll_results.xml +++ b/app/src/main/res/layout/dialog_poll_results.xml @@ -26,7 +26,7 @@ diff --git a/app/src/main/res/layout/poll_result_item.xml b/app/src/main/res/layout/poll_result_item.xml index d04974b62..73850adb2 100644 --- a/app/src/main/res/layout/poll_result_item.xml +++ b/app/src/main/res/layout/poll_result_item.xml @@ -38,11 +38,6 @@ app:layout_constraintStart_toStartOf="@+id/poll_option_text" app:layout_constraintTop_toBottomOf="@+id/poll_option_bar"> - -