FollowViewHolder.kt 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright 2023 Tusky Contributors
  3. *
  4. * This file is a part of Tusky.
  5. *
  6. * This program is free software; you can redistribute it and/or modify it under the terms of the
  7. * GNU General Public License as published by the Free Software Foundation; either version 3 of the
  8. * License, or (at your option) any later version.
  9. *
  10. * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
  11. * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
  12. * Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with Tusky; if not,
  15. * see <http://www.gnu.org/licenses>.
  16. */
  17. package com.keylesspalace.tusky.components.notifications
  18. import androidx.recyclerview.widget.RecyclerView
  19. import com.keylesspalace.tusky.R
  20. import com.keylesspalace.tusky.databinding.ItemFollowBinding
  21. import com.keylesspalace.tusky.entity.Notification
  22. import com.keylesspalace.tusky.entity.TimelineAccount
  23. import com.keylesspalace.tusky.util.StatusDisplayOptions
  24. import com.keylesspalace.tusky.util.emojify
  25. import com.keylesspalace.tusky.util.loadAvatar
  26. import com.keylesspalace.tusky.util.unicodeWrap
  27. import com.keylesspalace.tusky.viewdata.NotificationViewData
  28. class FollowViewHolder(
  29. private val binding: ItemFollowBinding,
  30. private val notificationActionListener: NotificationActionListener,
  31. ) : NotificationsPagingAdapter.ViewHolder, RecyclerView.ViewHolder(binding.root) {
  32. private val avatarRadius42dp = itemView.context.resources.getDimensionPixelSize(
  33. R.dimen.avatar_radius_42dp
  34. )
  35. override fun bind(
  36. viewData: NotificationViewData,
  37. payloads: List<*>?,
  38. statusDisplayOptions: StatusDisplayOptions
  39. ) {
  40. // Skip updates with payloads. That indicates a timestamp update, and
  41. // this view does not have timestamps.
  42. if (!payloads.isNullOrEmpty()) return
  43. setMessage(
  44. viewData.account,
  45. viewData.type === Notification.Type.SIGN_UP,
  46. statusDisplayOptions.animateAvatars,
  47. statusDisplayOptions.animateEmojis
  48. )
  49. setupButtons(notificationActionListener, viewData.account.id)
  50. }
  51. private fun setMessage(
  52. account: TimelineAccount,
  53. isSignUp: Boolean,
  54. animateAvatars: Boolean,
  55. animateEmojis: Boolean
  56. ) {
  57. val context = binding.notificationText.context
  58. val format =
  59. context.getString(
  60. if (isSignUp) {
  61. R.string.notification_sign_up_format
  62. } else {
  63. R.string.notification_follow_format
  64. }
  65. )
  66. val wrappedDisplayName = account.name.unicodeWrap()
  67. val wholeMessage = String.format(format, wrappedDisplayName)
  68. val emojifiedMessage =
  69. wholeMessage.emojify(
  70. account.emojis,
  71. binding.notificationText,
  72. animateEmojis
  73. )
  74. binding.notificationText.text = emojifiedMessage
  75. val username = context.getString(R.string.post_username_format, account.username)
  76. binding.notificationUsername.text = username
  77. val emojifiedDisplayName = wrappedDisplayName.emojify(
  78. account.emojis,
  79. binding.notificationUsername,
  80. animateEmojis
  81. )
  82. binding.notificationDisplayName.text = emojifiedDisplayName
  83. loadAvatar(
  84. account.avatar,
  85. binding.notificationAvatar,
  86. avatarRadius42dp,
  87. animateAvatars
  88. )
  89. }
  90. private fun setupButtons(listener: NotificationActionListener, accountId: String) {
  91. binding.root.setOnClickListener { listener.onViewAccount(accountId) }
  92. }
  93. }