Merge pull request #3806 from nextcloud/feature/noid/showFederatedAvatarsForPolls

show federated avatars for polls
This commit is contained in:
Marcel Hibbe 2024-04-05 14:29:48 +02:00 committed by GitHub
commit cbc1eed336
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 93 additions and 27 deletions

View File

@ -13,13 +13,17 @@ import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.PollResultVoterItemBinding import com.nextcloud.talk.databinding.PollResultVoterItemBinding
import com.nextcloud.talk.extensions.loadFederatedUserAvatar
import com.nextcloud.talk.extensions.loadGuestAvatar import com.nextcloud.talk.extensions.loadGuestAvatar
import com.nextcloud.talk.extensions.loadUserAvatar import com.nextcloud.talk.extensions.loadUserAvatar
import com.nextcloud.talk.models.json.participants.Participant
import com.nextcloud.talk.polls.model.PollDetails import com.nextcloud.talk.polls.model.PollDetails
import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.talk.utils.DisplayUtils
class PollResultVoterViewHolder( class PollResultVoterViewHolder(
private val user: User, private val user: User,
private val roomToken: String,
override val binding: PollResultVoterItemBinding, override val binding: PollResultVoterItemBinding,
private val viewThemeUtils: ViewThemeUtils private val viewThemeUtils: ViewThemeUtils
) : PollResultViewHolder(binding) { ) : PollResultViewHolder(binding) {
@ -36,14 +40,33 @@ class PollResultVoterViewHolder(
} }
private fun loadAvatar(pollDetail: PollDetails, avatar: ImageView) { private fun loadAvatar(pollDetail: PollDetails, avatar: ImageView) {
if (pollDetail.actorType == "guests") { when (pollDetail.actorType) {
var displayName = NextcloudTalkApplication.sharedApplication?.resources?.getString(R.string.nc_guest) Participant.ActorType.GUESTS -> {
if (!TextUtils.isEmpty(pollDetail.actorDisplayName)) { var displayName = NextcloudTalkApplication.sharedApplication?.resources?.getString(R.string.nc_guest)
displayName = pollDetail.actorDisplayName!! if (!TextUtils.isEmpty(pollDetail.actorDisplayName)) {
displayName = pollDetail.actorDisplayName!!
}
avatar.loadGuestAvatar(user, displayName!!, false)
} }
avatar.loadGuestAvatar(user, displayName!!, false)
} else if (pollDetail.actorType == "users") { Participant.ActorType.USERS -> {
avatar.loadUserAvatar(user, pollDetail.actorId!!, false, false) avatar.loadUserAvatar(user, pollDetail.actorId!!, false, false)
}
Participant.ActorType.FEDERATED -> {
val darkTheme = if (DisplayUtils.isDarkModeOn(binding.root.context)) 1 else 0
avatar.loadFederatedUserAvatar(
user,
user.baseUrl!!,
roomToken,
pollDetail.actorId!!,
darkTheme,
false,
false
)
}
else -> {}
} }
} }
} }

View File

@ -16,12 +16,16 @@ import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.PollResultVotersOverviewItemBinding import com.nextcloud.talk.databinding.PollResultVotersOverviewItemBinding
import com.nextcloud.talk.extensions.loadFederatedUserAvatar
import com.nextcloud.talk.extensions.loadGuestAvatar import com.nextcloud.talk.extensions.loadGuestAvatar
import com.nextcloud.talk.extensions.loadUserAvatar import com.nextcloud.talk.extensions.loadUserAvatar
import com.nextcloud.talk.models.json.participants.Participant
import com.nextcloud.talk.polls.model.PollDetails import com.nextcloud.talk.polls.model.PollDetails
import com.nextcloud.talk.utils.DisplayUtils
class PollResultVotersOverviewViewHolder( class PollResultVotersOverviewViewHolder(
private val user: User, private val user: User,
private val roomToken: String,
override val binding: PollResultVotersOverviewItemBinding override val binding: PollResultVotersOverviewItemBinding
) : PollResultViewHolder(binding) { ) : PollResultViewHolder(binding) {
@ -66,14 +70,33 @@ class PollResultVotersOverviewViewHolder(
} }
private fun loadAvatar(pollDetail: PollDetails, avatar: ImageView) { private fun loadAvatar(pollDetail: PollDetails, avatar: ImageView) {
if (pollDetail.actorType == "guests") { when (pollDetail.actorType) {
var displayName = NextcloudTalkApplication.sharedApplication?.resources?.getString(R.string.nc_guest) Participant.ActorType.GUESTS -> {
if (!TextUtils.isEmpty(pollDetail.actorDisplayName)) { var displayName = NextcloudTalkApplication.sharedApplication?.resources?.getString(R.string.nc_guest)
displayName = pollDetail.actorDisplayName!! if (!TextUtils.isEmpty(pollDetail.actorDisplayName)) {
displayName = pollDetail.actorDisplayName!!
}
avatar.loadGuestAvatar(user, displayName!!, false)
} }
avatar.loadGuestAvatar(user, displayName!!, false)
} else if (pollDetail.actorType == "users") { Participant.ActorType.USERS -> {
avatar.loadUserAvatar(user, pollDetail.actorId!!, false, false) avatar.loadUserAvatar(user, pollDetail.actorId!!, false, false)
}
Participant.ActorType.FEDERATED -> {
val darkTheme = if (DisplayUtils.isDarkModeOn(binding.root.context)) 1 else 0
avatar.loadFederatedUserAvatar(
user,
user.baseUrl!!,
roomToken,
pollDetail.actorId!!,
darkTheme,
false,
false
)
}
else -> {}
} }
} }

View File

@ -17,6 +17,7 @@ import com.nextcloud.talk.ui.theme.ViewThemeUtils
class PollResultsAdapter( class PollResultsAdapter(
private val user: User, private val user: User,
private val roomToken: String,
private val clickListener: PollResultItemClickListener, private val clickListener: PollResultItemClickListener,
private val viewThemeUtils: ViewThemeUtils private val viewThemeUtils: ViewThemeUtils
) : RecyclerView.Adapter<PollResultViewHolder>() { ) : RecyclerView.Adapter<PollResultViewHolder>() {
@ -40,7 +41,7 @@ class PollResultsAdapter(
parent, parent,
false false
) )
viewHolder = PollResultVoterViewHolder(user, itemBinding, viewThemeUtils) viewHolder = PollResultVoterViewHolder(user, roomToken, itemBinding, viewThemeUtils)
} }
PollResultVotersOverviewItem.VIEW_TYPE -> { PollResultVotersOverviewItem.VIEW_TYPE -> {
val itemBinding = PollResultVotersOverviewItemBinding.inflate( val itemBinding = PollResultVotersOverviewItemBinding.inflate(
@ -48,7 +49,7 @@ class PollResultsAdapter(
parent, parent,
false false
) )
viewHolder = PollResultVotersOverviewViewHolder(user, itemBinding) viewHolder = PollResultVotersOverviewViewHolder(user, roomToken, itemBinding)
} }
} }
return viewHolder!! return viewHolder!!

View File

@ -6,12 +6,14 @@
*/ */
package com.nextcloud.talk.polls.model package com.nextcloud.talk.polls.model
import com.nextcloud.talk.models.json.participants.Participant
data class Poll( data class Poll(
val id: String, val id: String,
val question: String?, val question: String?,
val options: List<String>?, val options: List<String>?,
val votes: Map<String, Int>?, val votes: Map<String, Int>?,
val actorType: String?, val actorType: Participant.ActorType?,
val actorId: String?, val actorId: String?,
val actorDisplayName: String?, val actorDisplayName: String?,
val status: Int, val status: Int,

View File

@ -6,8 +6,10 @@
*/ */
package com.nextcloud.talk.polls.model package com.nextcloud.talk.polls.model
import com.nextcloud.talk.models.json.participants.Participant
data class PollDetails( data class PollDetails(
val actorType: String?, val actorType: Participant.ActorType?,
val actorId: String?, val actorId: String?,
val actorDisplayName: String?, val actorDisplayName: String?,
val optionId: Int val optionId: Int

View File

@ -9,13 +9,15 @@ package com.nextcloud.talk.polls.repositories.model
import android.os.Parcelable import android.os.Parcelable
import com.bluelinelabs.logansquare.annotation.JsonField import com.bluelinelabs.logansquare.annotation.JsonField
import com.bluelinelabs.logansquare.annotation.JsonObject import com.bluelinelabs.logansquare.annotation.JsonObject
import com.nextcloud.talk.models.json.converters.EnumActorTypeConverter
import com.nextcloud.talk.models.json.participants.Participant
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
@JsonObject @JsonObject
data class PollDetailsResponse( data class PollDetailsResponse(
@JsonField(name = ["actorType"]) @JsonField(name = ["actorType"], typeConverter = EnumActorTypeConverter::class)
var actorType: String? = null, var actorType: Participant.ActorType? = null,
@JsonField(name = ["actorId"]) @JsonField(name = ["actorId"])
var actorId: String, var actorId: String,

View File

@ -9,6 +9,8 @@ package com.nextcloud.talk.polls.repositories.model
import android.os.Parcelable import android.os.Parcelable
import com.bluelinelabs.logansquare.annotation.JsonField import com.bluelinelabs.logansquare.annotation.JsonField
import com.bluelinelabs.logansquare.annotation.JsonObject import com.bluelinelabs.logansquare.annotation.JsonObject
import com.nextcloud.talk.models.json.converters.EnumActorTypeConverter
import com.nextcloud.talk.models.json.participants.Participant
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
@ -26,8 +28,8 @@ data class PollResponse(
@JsonField(name = ["votes"]) @JsonField(name = ["votes"])
var votes: Map<String, Int>? = null, var votes: Map<String, Int>? = null,
@JsonField(name = ["actorType"]) @JsonField(name = ["actorType"], typeConverter = EnumActorTypeConverter::class)
var actorType: String? = null, var actorType: Participant.ActorType? = null,
@JsonField(name = ["actorId"]) @JsonField(name = ["actorId"])
var actorId: String? = null, var actorId: String? = null,

View File

@ -68,11 +68,17 @@ class PollResultsFragment : Fragment(), PollResultItemClickListener {
} }
viewModel.items.observe(viewLifecycleOwner) { viewModel.items.observe(viewLifecycleOwner) {
val adapter = PollResultsAdapter(parentViewModel.user, this, viewThemeUtils).apply { val adapter = PollResultsAdapter(
if (it != null) { parentViewModel.user,
list = it parentViewModel.roomToken,
this,
viewThemeUtils
)
.apply {
if (it != null) {
list = it
}
} }
}
binding.pollResultsList.adapter = adapter binding.pollResultsList.adapter = adapter
} }
@ -85,7 +91,12 @@ class PollResultsFragment : Fragment(), PollResultItemClickListener {
} }
private fun initAdapter() { private fun initAdapter() {
adapter = PollResultsAdapter(parentViewModel.user, this, viewThemeUtils) adapter = PollResultsAdapter(
parentViewModel.user,
parentViewModel.roomToken,
this,
viewThemeUtils
)
binding.pollResultsList.adapter = adapter binding.pollResultsList.adapter = adapter
binding.pollResultsList.layoutManager = LinearLayoutManager(context) binding.pollResultsList.layoutManager = LinearLayoutManager(context)
} }