diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index 9b7487bb6..89bcf046a 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -216,17 +216,6 @@ column="5"/> - - - - protected constructor(i } companion object { + /** + * @return True if all [attachments] are previewable. + * + * @see Attachment.isPreviewable + */ @JvmStatic protected fun hasPreviewableAttachment(attachments: List): Boolean { - for (attachment in attachments) { - if (attachment.type == Attachment.Type.UNKNOWN) return false - - if (attachment.meta?.original?.width == null && attachment.meta?.small?.width == null) return false - } - return true + return attachments.all { it.isPreviewable() } } private fun getReblogDescription(context: Context, status: IStatusViewData): CharSequence { diff --git a/app/src/main/java/app/pachli/components/account/media/AccountMediaGridAdapter.kt b/app/src/main/java/app/pachli/components/account/media/AccountMediaGridAdapter.kt index 4069dc77d..2940b82b3 100644 --- a/app/src/main/java/app/pachli/components/account/media/AccountMediaGridAdapter.kt +++ b/app/src/main/java/app/pachli/components/account/media/AccountMediaGridAdapter.kt @@ -7,19 +7,18 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources -import androidx.core.view.setPadding import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil import app.pachli.R +import app.pachli.adapter.isPlayable import app.pachli.core.activity.decodeBlurHash -import app.pachli.core.common.extensions.hide import app.pachli.core.common.extensions.show -import app.pachli.core.designsystem.R as DR +import app.pachli.core.common.extensions.visible import app.pachli.core.navigation.AttachmentViewData -import app.pachli.core.network.model.Attachment import app.pachli.databinding.ItemAccountMediaBinding import app.pachli.util.BindingHolder import app.pachli.util.getFormattedDescription +import app.pachli.util.iconResource import com.bumptech.glide.Glide import com.google.android.material.color.MaterialColors import java.util.Random @@ -41,7 +40,7 @@ class AccountMediaGridAdapter( ) { private val baseItemBackgroundColor = MaterialColors.getColor(context, com.google.android.material.R.attr.colorSurface, Color.BLACK) - private val videoIndicator = AppCompatResources.getDrawable(context, R.drawable.ic_play_indicator) + private val playableIcon = AppCompatResources.getDrawable(context, R.drawable.ic_play_indicator) private val mediaHiddenDrawable = AppCompatResources.getDrawable(context, R.drawable.ic_hide_media_24dp) private val itemBgBaseHSV = FloatArray(3) @@ -57,59 +56,53 @@ class AccountMediaGridAdapter( override fun onBindViewHolder(holder: BindingHolder, position: Int) { val context = holder.binding.root.context - getItem(position)?.let { item -> + getItem(position)?.let { item -> val imageView = holder.binding.accountMediaImageView val overlay = holder.binding.accountMediaImageViewOverlay - val blurhash = item.attachment.blurhash - val placeholder = if (useBlurhash && blurhash != null) { - decodeBlurHash(context, blurhash) - } else { - null + val placeholder = item.attachment.blurhash?.let { + if (useBlurhash) decodeBlurHash(context, it) else null } - if (item.attachment.type == Attachment.Type.AUDIO) { - overlay.hide() - - imageView.setPadding(context.resources.getDimensionPixelSize(DR.dimen.profile_media_audio_icon_padding)) - - Glide.with(imageView) - .load(R.drawable.ic_music_box_preview_24dp) - .centerInside() - .into(imageView) - - imageView.contentDescription = item.attachment.getFormattedDescription(context) - } else if (item.sensitive && !item.isRevealed) { - overlay.show() - overlay.setImageDrawable(mediaHiddenDrawable) - - imageView.setPadding(0) - - Glide.with(imageView) - .load(placeholder) - .centerInside() - .into(imageView) - - imageView.contentDescription = imageView.context.getString(R.string.post_media_hidden_title) - } else { - if (item.attachment.type == Attachment.Type.VIDEO || item.attachment.type == Attachment.Type.GIFV) { + when { + item.sensitive && !item.isRevealed -> { overlay.show() - overlay.setImageDrawable(videoIndicator) - } else { - overlay.hide() + overlay.setImageDrawable(mediaHiddenDrawable) + + Glide.with(imageView) + .load(placeholder) + .centerInside() + .into(imageView) + + imageView.contentDescription = context.getString(R.string.post_media_hidden_title) } - imageView.setPadding(0) + item.attachment.isPreviewable() -> { + if (item.attachment.type.isPlayable()) overlay.setImageDrawable(playableIcon) + overlay.visible(item.attachment.type.isPlayable()) - Glide.with(imageView) - .asBitmap() - .load(item.attachment.previewUrl) - .placeholder(placeholder) - .centerInside() - .into(imageView) + Glide.with(imageView) + .asBitmap() + .load(item.attachment.previewUrl) + .placeholder(placeholder) + .centerInside() + .into(imageView) - imageView.contentDescription = item.attachment.getFormattedDescription(context) + imageView.contentDescription = item.attachment.getFormattedDescription(context) + } + + else -> { + if (item.attachment.type.isPlayable()) overlay.setImageDrawable(playableIcon) + overlay.visible(item.attachment.type.isPlayable()) + + Glide.with(imageView) + .load(item.attachment.iconResource()) + .centerInside() + .into(imageView) + + imageView.contentDescription = item.attachment.getFormattedDescription(context) + } } holder.binding.root.setOnClickListener { @@ -118,7 +111,7 @@ class AccountMediaGridAdapter( holder.binding.root.setOnLongClickListener { view -> val description = item.attachment.getFormattedDescription(view.context) - Toast.makeText(view.context, description, Toast.LENGTH_LONG).show() + Toast.makeText(context, description, Toast.LENGTH_LONG).show() true } } diff --git a/core/designsystem/src/main/res/values/dimens.xml b/core/designsystem/src/main/res/values/dimens.xml index b7dbc6060..0eb525e35 100644 --- a/core/designsystem/src/main/res/values/dimens.xml +++ b/core/designsystem/src/main/res/values/dimens.xml @@ -63,8 +63,6 @@ 3dp - 16dp - 4dp 1dp diff --git a/core/network/src/main/kotlin/app/pachli/core/network/model/Attachment.kt b/core/network/src/main/kotlin/app/pachli/core/network/model/Attachment.kt index d71fc5fb3..84db4e753 100644 --- a/core/network/src/main/kotlin/app/pachli/core/network/model/Attachment.kt +++ b/core/network/src/main/kotlin/app/pachli/core/network/model/Attachment.kt @@ -103,4 +103,13 @@ data class Attachment( return (width / height).toDouble() } } + + /** + * @return True if this attachment can be previewed. A previewable attachment + * must be a known type and have a non-null width for the preview image. + */ + fun isPreviewable(): Boolean { + if (type == Type.UNKNOWN) return false + return !(meta?.original?.width == null && meta?.small?.width == null) + } }