AccountMediaGridAdapter.kt 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package com.keylesspalace.tusky.components.account.media
  2. import android.content.Context
  3. import android.graphics.Color
  4. import android.view.LayoutInflater
  5. import android.view.View
  6. import android.view.ViewGroup
  7. import android.widget.Toast
  8. import androidx.appcompat.content.res.AppCompatResources
  9. import androidx.core.view.setPadding
  10. import androidx.paging.PagingDataAdapter
  11. import androidx.recyclerview.widget.DiffUtil
  12. import com.bumptech.glide.Glide
  13. import com.google.android.material.color.MaterialColors
  14. import com.keylesspalace.tusky.R
  15. import com.keylesspalace.tusky.databinding.ItemAccountMediaBinding
  16. import com.keylesspalace.tusky.entity.Attachment
  17. import com.keylesspalace.tusky.util.BindingHolder
  18. import com.keylesspalace.tusky.util.decodeBlurHash
  19. import com.keylesspalace.tusky.util.getFormattedDescription
  20. import com.keylesspalace.tusky.util.hide
  21. import com.keylesspalace.tusky.util.show
  22. import com.keylesspalace.tusky.viewdata.AttachmentViewData
  23. import java.util.Random
  24. class AccountMediaGridAdapter(
  25. private val alwaysShowSensitiveMedia: Boolean,
  26. private val useBlurhash: Boolean,
  27. context: Context,
  28. private val onAttachmentClickListener: (AttachmentViewData, View) -> Unit
  29. ) : PagingDataAdapter<AttachmentViewData, BindingHolder<ItemAccountMediaBinding>>(
  30. object : DiffUtil.ItemCallback<AttachmentViewData>() {
  31. override fun areItemsTheSame(oldItem: AttachmentViewData, newItem: AttachmentViewData): Boolean {
  32. return oldItem.attachment.id == newItem.attachment.id
  33. }
  34. override fun areContentsTheSame(oldItem: AttachmentViewData, newItem: AttachmentViewData): Boolean {
  35. return oldItem == newItem
  36. }
  37. }
  38. ) {
  39. private val baseItemBackgroundColor = MaterialColors.getColor(context, com.google.android.material.R.attr.colorSurface, Color.BLACK)
  40. private val videoIndicator = AppCompatResources.getDrawable(context, R.drawable.ic_play_indicator)
  41. private val mediaHiddenDrawable = AppCompatResources.getDrawable(context, R.drawable.ic_hide_media_24dp)
  42. private val itemBgBaseHSV = FloatArray(3)
  43. private val random = Random()
  44. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemAccountMediaBinding> {
  45. val binding = ItemAccountMediaBinding.inflate(LayoutInflater.from(parent.context), parent, false)
  46. Color.colorToHSV(baseItemBackgroundColor, itemBgBaseHSV)
  47. itemBgBaseHSV[2] = itemBgBaseHSV[2] + random.nextFloat() / 3f - 1f / 6f
  48. binding.root.setBackgroundColor(Color.HSVToColor(itemBgBaseHSV))
  49. return BindingHolder(binding)
  50. }
  51. override fun onBindViewHolder(holder: BindingHolder<ItemAccountMediaBinding>, position: Int) {
  52. val context = holder.binding.root.context
  53. getItem(position)?.let { item ->
  54. val imageView = holder.binding.accountMediaImageView
  55. val overlay = holder.binding.accountMediaImageViewOverlay
  56. val blurhash = item.attachment.blurhash
  57. val placeholder = if (useBlurhash && blurhash != null) {
  58. decodeBlurHash(context, blurhash)
  59. } else {
  60. null
  61. }
  62. if (item.attachment.type == Attachment.Type.AUDIO) {
  63. overlay.hide()
  64. imageView.setPadding(context.resources.getDimensionPixelSize(R.dimen.profile_media_audio_icon_padding))
  65. Glide.with(imageView)
  66. .load(R.drawable.ic_music_box_preview_24dp)
  67. .centerInside()
  68. .into(imageView)
  69. imageView.contentDescription = item.attachment.getFormattedDescription(context)
  70. } else if (item.sensitive && !item.isRevealed && !alwaysShowSensitiveMedia) {
  71. overlay.show()
  72. overlay.setImageDrawable(mediaHiddenDrawable)
  73. imageView.setPadding(0)
  74. Glide.with(imageView)
  75. .load(placeholder)
  76. .centerInside()
  77. .into(imageView)
  78. imageView.contentDescription = imageView.context.getString(R.string.post_media_hidden_title)
  79. } else {
  80. if (item.attachment.type == Attachment.Type.VIDEO || item.attachment.type == Attachment.Type.GIFV) {
  81. overlay.show()
  82. overlay.setImageDrawable(videoIndicator)
  83. } else {
  84. overlay.hide()
  85. }
  86. imageView.setPadding(0)
  87. Glide.with(imageView)
  88. .asBitmap()
  89. .load(item.attachment.previewUrl)
  90. .placeholder(placeholder)
  91. .centerInside()
  92. .into(imageView)
  93. imageView.contentDescription = item.attachment.getFormattedDescription(context)
  94. }
  95. holder.binding.root.setOnClickListener {
  96. onAttachmentClickListener(item, imageView)
  97. }
  98. holder.binding.root.setOnLongClickListener { view ->
  99. val description = item.attachment.getFormattedDescription(view.context)
  100. Toast.makeText(view.context, description, Toast.LENGTH_LONG).show()
  101. true
  102. }
  103. }
  104. }
  105. }