From 8ee042067801f4435db7ca1090cc643f12c3a24a Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Fri, 2 Oct 2020 21:18:39 +0200 Subject: [PATCH] Set onClick listener for poll result view. (#1946) Fixes #1861 --- .../tusky/adapter/PollAdapter.kt | 18 +++++++++++---- .../tusky/adapter/StatusBaseViewHolder.java | 23 +++++++++++++++---- .../notifications/NotificationHelper.java | 2 +- .../com/keylesspalace/tusky/entity/Poll.kt | 10 ++++++-- .../tusky/util/StatusViewHelper.kt | 13 +++++++---- .../tusky/viewdata/PollViewData.kt | 5 +++- .../com/keylesspalace/tusky/FilterTest.kt | 1 + 7 files changed, 54 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt index 2dbf6440..a990d326 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt @@ -34,14 +34,24 @@ class PollAdapter: RecyclerView.Adapter() { private var pollOptions: List = emptyList() private var voteCount: Int = 0 + private var votersCount: Int? = null private var mode = RESULT private var emojis: List = emptyList() - - fun setup(options: List, voteCount: Int, emojis: List, mode: Int) { + private var resultClickListener: View.OnClickListener? = null + + fun setup( + options: List, + voteCount: Int, + votersCount: Int?, + emojis: List, + mode: Int, + resultClickListener: View.OnClickListener?) { this.pollOptions = options this.voteCount = voteCount + this.votersCount = votersCount this.emojis = emojis this.mode = mode + this.resultClickListener = resultClickListener notifyDataSetChanged() } @@ -69,7 +79,7 @@ class PollAdapter: RecyclerView.Adapter() { when(mode) { RESULT -> { - val percent = calculatePercent(option.votesCount, voteCount) + val percent = calculatePercent(option.votesCount, votersCount, voteCount) val emojifiedPollOptionText = buildDescription(option.title, percent, holder.resultTextView.context) .emojify(emojis, holder.resultTextView) holder.resultTextView.text = EmojiCompat.get().process(emojifiedPollOptionText) @@ -77,7 +87,7 @@ class PollAdapter: RecyclerView.Adapter() { val level = percent * 100 holder.resultTextView.background.level = level - + holder.resultTextView.setOnClickListener(resultClickListener) } SINGLE -> { val emojifiedPollOptionText = option.title.emojify(emojis, holder.radioButton) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index 8bf86483..0781a081 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -946,7 +946,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { List options = poll.getOptions(); for (int i = 0; i < args.length; i++) { if (i < options.size()) { - int percent = PollViewDataKt.calculatePercent(options.get(i).getVotesCount(), poll.getVotesCount()); + int percent = PollViewDataKt.calculatePercent(options.get(i).getVotesCount(), poll.getVotersCount(), poll.getVotesCount()); args[i] = buildDescription(options.get(i).getTitle(), percent, context); } else { args[i] = ""; @@ -989,12 +989,18 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { if (expired || poll.getVoted()) { // no voting possible - pollAdapter.setup(poll.getOptions(), poll.getVotesCount(), emojis, PollAdapter.RESULT); + View.OnClickListener viewThreadListener = v -> { + int position = getAdapterPosition(); + if (position != RecyclerView.NO_POSITION) { + listener.onViewThread(position); + } + }; + pollAdapter.setup(poll.getOptions(), poll.getVotesCount(), poll.getVotersCount(), emojis, PollAdapter.RESULT, viewThreadListener); pollButton.setVisibility(View.GONE); } else { // voting possible - pollAdapter.setup(poll.getOptions(), poll.getVotesCount(), emojis, poll.getMultiple() ? PollAdapter.MULTIPLE : PollAdapter.SINGLE); + pollAdapter.setup(poll.getOptions(), poll.getVotesCount(), poll.getVotersCount(), emojis, poll.getMultiple() ? PollAdapter.MULTIPLE : PollAdapter.SINGLE, null); pollButton.setVisibility(View.VISIBLE); @@ -1021,8 +1027,15 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { private CharSequence getPollInfoText(long timestamp, PollViewData poll, StatusDisplayOptions statusDisplayOptions, Context context) { - String votes = numberFormat.format(poll.getVotesCount()); - String votesText = context.getResources().getQuantityString(R.plurals.poll_info_votes, poll.getVotesCount(), votes); + + String votesText; + if(poll.getVotersCount() == null) { + String voters = numberFormat.format(poll.getVotesCount()); + votesText = context.getResources().getQuantityString(R.plurals.poll_info_votes, poll.getVotesCount(), voters); + } else { + String voters = numberFormat.format(poll.getVotersCount()); + votesText = context.getResources().getQuantityString(R.plurals.poll_info_people, poll.getVotersCount(), voters); + } CharSequence pollDurationInfo; if (poll.getExpired()) { pollDurationInfo = context.getString(R.string.poll_info_closed); diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java index c1c51ad7..ff05a8cf 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java +++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java @@ -716,7 +716,7 @@ public class NotificationHelper { Poll poll = notification.getStatus().getPoll(); for(PollOption option: poll.getOptions()) { builder.append(buildDescription(option.getTitle(), - PollViewDataKt.calculatePercent(option.getVotesCount(), poll.getVotesCount()), + PollViewDataKt.calculatePercent(option.getVotesCount(), poll.getVotersCount(), poll.getVoterCount()), context)); builder.append('\n'); } diff --git a/app/src/main/java/com/keylesspalace/tusky/entity/Poll.kt b/app/src/main/java/com/keylesspalace/tusky/entity/Poll.kt index 57361d1b..0d47c6f4 100644 --- a/app/src/main/java/com/keylesspalace/tusky/entity/Poll.kt +++ b/app/src/main/java/com/keylesspalace/tusky/entity/Poll.kt @@ -9,6 +9,7 @@ data class Poll( val expired: Boolean, val multiple: Boolean, @SerializedName("votes_count") val votesCount: Int, + @SerializedName("voters_count") val votersCount: Int?, // nullable for compatibility with Pleroma val options: List, val voted: Boolean ) { @@ -22,7 +23,12 @@ data class Poll( } } - return copy(options = newOptions, votesCount = votesCount + choices.size, voted = true) + return copy( + options = newOptions, + votesCount = votesCount + choices.size, + votersCount = votersCount?.plus(1), + voted = true + ) } fun toNewPoll(creationDate: Date) = NewPoll( @@ -38,4 +44,4 @@ data class Poll( data class PollOption( val title: String, @SerializedName("votes_count") val votesCount: Int -) \ No newline at end of file +) diff --git a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt index 6ab8eb8b..7dfeeeba 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt @@ -24,7 +24,6 @@ import android.widget.ImageView import android.widget.TextView import androidx.annotation.DrawableRes import androidx.appcompat.content.res.AppCompatResources -import androidx.core.content.ContextCompat import com.bumptech.glide.Glide import com.keylesspalace.tusky.R import com.keylesspalace.tusky.entity.Attachment @@ -272,9 +271,13 @@ class StatusViewHelper(private val itemView: View) { private fun getPollInfoText(timestamp: Long, poll: PollViewData, pollDescription: TextView, useAbsoluteTime: Boolean): CharSequence { val context = pollDescription.context - val votes = NumberFormat.getNumberInstance().format(poll.votesCount.toLong()) - val votesText = context.resources.getQuantityString(R.plurals.poll_info_votes, poll.votesCount, votes) - val pollDurationInfo: CharSequence + val votesText = if(poll.votersCount == null) { + val votes = NumberFormat.getNumberInstance().format(poll.votesCount.toLong()) + context.resources.getQuantityString(R.plurals.poll_info_votes, poll.votesCount, votes) + } else { + val votes = NumberFormat.getNumberInstance().format(poll.votersCount.toLong()) + context.resources.getQuantityString(R.plurals.poll_info_people, poll.votersCount, votes) + } pollDurationInfo = if (poll.expired) { context.getString(R.string.poll_info_closed) } else { @@ -294,7 +297,7 @@ class StatusViewHelper(private val itemView: View) { for (i in 0 until Status.MAX_POLL_OPTIONS) { if (i < options.size) { - val percent = calculatePercent(options[i].votesCount, poll.votesCount) + val percent = calculatePercent(options[i].votesCount, poll.votersCount, poll.votesCount) val pollOptionText = buildDescription(options[i].title, percent, pollResults[i].context) pollResults[i].text = pollOptionText.emojify(emojis, pollResults[i]) diff --git a/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt b/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt index ecfdbd70..f0ca6265 100644 --- a/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt +++ b/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt @@ -31,6 +31,7 @@ data class PollViewData( val expired: Boolean, val multiple: Boolean, val votesCount: Int, + val votersCount: Int?, val options: List, var voted: Boolean ) @@ -41,10 +42,11 @@ data class PollOptionViewData( var selected: Boolean ) -fun calculatePercent(fraction: Int, total: Int): Int { +fun calculatePercent(fraction: Int, totalVoters: Int?, totalVotes: Int): Int { return if (fraction == 0) { 0 } else { + val total = totalVoters ?: totalVotes (fraction / total.toDouble() * 100).roundToInt() } } @@ -63,6 +65,7 @@ fun Poll?.toViewData(): PollViewData? { expired, multiple, votesCount, + votersCount, options.map { it.toViewData() }, voted ) diff --git a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt index 23b34c86..bdaeceb8 100644 --- a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt @@ -224,6 +224,7 @@ class FilterTest { expired = false, multiple = false, votesCount = 0, + votersCount = 0, options = pollOptions.map { PollOption(it, 0) },