improve images in timelines

This commit is contained in:
Conny Duck 2020-06-18 16:46:35 +02:00
parent 44f0dc562c
commit f35734ce74
4 changed files with 34 additions and 36 deletions

View File

@ -27,6 +27,7 @@ import androidx.paging.ExperimentalPagingApi
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.SimpleItemAnimator import androidx.recyclerview.widget.SimpleItemAnimator
import at.connyduck.pixelcat.R import at.connyduck.pixelcat.R
import at.connyduck.pixelcat.components.util.extension.getDisplayWidthInPx
import at.connyduck.pixelcat.components.util.getColorForAttr import at.connyduck.pixelcat.components.util.getColorForAttr
import at.connyduck.pixelcat.dagger.ViewModelFactory import at.connyduck.pixelcat.dagger.ViewModelFactory
import at.connyduck.pixelcat.databinding.FragmentTimelineBinding import at.connyduck.pixelcat.databinding.FragmentTimelineBinding
@ -58,7 +59,7 @@ class TimelineFragment : DaggerFragment(R.layout.fragment_timeline), TimeLineAct
binding.timelineRecyclerView.scrollToPosition(0) binding.timelineRecyclerView.scrollToPosition(0)
} }
val adapter = TimelineListAdapter(this) val adapter = TimelineListAdapter(view.context.getDisplayWidthInPx(), this)
binding.timelineRecyclerView.adapter = adapter binding.timelineRecyclerView.adapter = adapter
(binding.timelineRecyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false (binding.timelineRecyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false

View File

@ -51,6 +51,7 @@ object TimelineDiffUtil : DiffUtil.ItemCallback<StatusEntity>() {
} }
class TimelineListAdapter( class TimelineListAdapter(
private val displayWidth: Int,
private val listener: TimeLineActionListener private val listener: TimeLineActionListener
) : PagingDataAdapter<StatusEntity, TimelineViewHolder>(TimelineDiffUtil) { ) : PagingDataAdapter<StatusEntity, TimelineViewHolder>(TimelineDiffUtil) {
@ -58,6 +59,9 @@ class TimelineListAdapter(
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TimelineViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TimelineViewHolder {
val binding = ItemStatusBinding.inflate(LayoutInflater.from(parent.context), parent, false) val binding = ItemStatusBinding.inflate(LayoutInflater.from(parent.context), parent, false)
binding.postImages.adapter = TimelineImageAdapter()
binding.postIndicator.setViewPager(binding.postImages)
(binding.postImages.adapter as TimelineImageAdapter).registerAdapterDataObserver(binding.postIndicator.adapterDataObserver)
return TimelineViewHolder(binding) return TimelineViewHolder(binding)
} }
@ -68,6 +72,17 @@ class TimelineListAdapter(
// TODO order the stuff here // TODO order the stuff here
(holder.binding.postImages.adapter as TimelineImageAdapter).images = status.attachments (holder.binding.postImages.adapter as TimelineImageAdapter).images = status.attachments
val maxImageRatio = status.attachments.map {
if(it.meta?.small?.width == null || it.meta.small.height == null) {
1f
} else {
it.meta.small.height.toFloat() / it.meta.small.width.toFloat()
}
}.max()?.coerceAtMost(1f) ?: 1f
holder.binding.postImages.layoutParams.height = (displayWidth * maxImageRatio).toInt()
holder.binding.postAvatar.load(status.account.avatar) { holder.binding.postAvatar.load(status.account.avatar) {
transformations(RoundedCornersTransformation(25f)) transformations(RoundedCornersTransformation(25f))
} }
@ -81,14 +96,14 @@ class TimelineListAdapter(
holder.binding.postLikeButton.isChecked = status.favourited holder.binding.postLikeButton.isChecked = status.favourited
holder.binding.postLikeButton.setEventListener { button, buttonState -> holder.binding.postLikeButton.setEventListener { _, _ ->
listener.onFavorite(status) listener.onFavorite(status)
true true
} }
holder.binding.postBoostButton.isChecked = status.reblogged holder.binding.postBoostButton.isChecked = status.reblogged
holder.binding.postBoostButton.setEventListener { button, buttonState -> holder.binding.postBoostButton.setEventListener { _, _ ->
listener.onBoost(status) listener.onBoost(status)
true true
} }
@ -114,13 +129,4 @@ class TimelineListAdapter(
} }
} }
class TimelineViewHolder(val binding: ItemStatusBinding) : RecyclerView.ViewHolder(binding.root) { class TimelineViewHolder(val binding: ItemStatusBinding) : RecyclerView.ViewHolder(binding.root)
init {
binding.postImages.adapter = TimelineImageAdapter()
binding.postIndicator.setViewPager(binding.postImages)
(binding.postImages.adapter as TimelineImageAdapter).registerAdapterDataObserver(binding.postIndicator.adapterDataObserver)
// val snapHelper = PagerSnapHelper()
// snapHelper.attachToRecyclerView(binding.postImages)
}
}

View File

@ -19,13 +19,10 @@
package at.connyduck.pixelcat.model package at.connyduck.pixelcat.model
import android.os.Parcelable
import com.squareup.moshi.Json import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass import com.squareup.moshi.JsonClass
import kotlinx.android.parcel.Parcelize
@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)
@Parcelize
data class Attachment( data class Attachment(
val id: String, val id: String,
val url: String, val url: String,
@ -33,7 +30,7 @@ data class Attachment(
val meta: MetaData?, val meta: MetaData?,
val type: Type, val type: Type,
val description: String? val description: String?
) : Parcelable { ) {
enum class Type { enum class Type {
@Json(name = "image") @Json(name = "image")
@ -48,28 +45,22 @@ data class Attachment(
UNKNOWN UNKNOWN
} }
/*class MediaTypeDeserializer : JsonDeserializer<Type> {
@Throws(JsonParseException::class)
override fun deserialize(json: JsonElement, classOfT: java.lang.reflect.Type, context: JsonDeserializationContext): Type {
return when (json.toString()) {
"\"image\"" -> Type.IMAGE
"\"gifv\"" -> Type.GIFV
"\"video\"" -> Type.VIDEO
"\"audio\"" -> Type.AUDIO
else -> Type.UNKNOWN
}
}
}*/
/** /**
* The meta data of an [Attachment]. * The meta data of an [Attachment].
*/ */
@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)
@Parcelize
data class MetaData( data class MetaData(
val focus: Focus?, val focus: Focus?,
val duration: Float? val duration: Float?,
) : Parcelable val small: ImageMetaData?
)
@JsonClass(generateAdapter = true)
data class ImageMetaData(
val width: Int?,
val height: Int?,
val aspect: Float?
)
/** /**
* The Focus entity, used to specify the focal point of an image. * The Focus entity, used to specify the focal point of an image.
@ -78,9 +69,8 @@ data class Attachment(
* https://github.com/jonom/jquery-focuspoint#1-calculate-your-images-focus-point * https://github.com/jonom/jquery-focuspoint#1-calculate-your-images-focus-point
*/ */
@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)
@Parcelize
data class Focus( data class Focus(
val x: Float, val x: Float,
val y: Float val y: Float
) : Parcelable )
} }

View File

@ -5,7 +5,8 @@
<ImageView <ImageView
android:id="@+id/timelineImageView" android:id="@+id/timelineImageView"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_gravity="center"
android:layout_height="match_parent" android:layout_height="match_parent"
android:adjustViewBounds="true" /> android:adjustViewBounds="true" />