new attachments: gift, graffiti

fix NullPointerException on VkPhoto.kt text param
This commit is contained in:
2021-10-11 00:33:38 +03:00
parent 63de514975
commit 1bba8ee4e6
10 changed files with 108 additions and 14 deletions
@@ -150,9 +150,7 @@ object VkUtils {
} }
BaseVkAttachmentItem.AttachmentType.GIFT -> { BaseVkAttachmentItem.AttachmentType.GIFT -> {
val gift = baseAttachment.gift ?: continue val gift = baseAttachment.gift ?: continue
attachments += VkGift( attachments += gift.asVkGift()
link = gift.thumb_48
)
} }
BaseVkAttachmentItem.AttachmentType.WALL -> { BaseVkAttachmentItem.AttachmentType.WALL -> {
val wall = baseAttachment.wall ?: continue val wall = baseAttachment.wall ?: continue
@@ -160,9 +158,7 @@ object VkUtils {
} }
BaseVkAttachmentItem.AttachmentType.GRAFFITI -> { BaseVkAttachmentItem.AttachmentType.GRAFFITI -> {
val graffiti = baseAttachment.graffiti ?: continue val graffiti = baseAttachment.graffiti ?: continue
attachments += VkGraffiti( attachments += graffiti.asVkGraffiti()
link = graffiti.url
)
} }
BaseVkAttachmentItem.AttachmentType.POLL -> { BaseVkAttachmentItem.AttachmentType.POLL -> {
val poll = baseAttachment.poll ?: continue val poll = baseAttachment.poll ?: continue
@@ -5,7 +5,10 @@ import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
data class VkGift( data class VkGift(
val link: String val id: Int,
val thumb256: String?,
val thumb96: String?,
val thumb48: String
) : VkAttachment() { ) : VkAttachment() {
@IgnoredOnParcel @IgnoredOnParcel
@@ -5,7 +5,12 @@ import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
data class VkGraffiti( data class VkGraffiti(
val link: String val id: Int,
val ownerId: Int,
val url: String,
val width: Int,
val height: Int,
val accessKey: String
) : VkAttachment() { ) : VkAttachment() {
@IgnoredOnParcel @IgnoredOnParcel
@@ -15,7 +15,7 @@ data class VkPhoto(
val hasTags: Boolean, val hasTags: Boolean,
val accessKey: String?, val accessKey: String?,
val sizes: List<BaseVkPhoto.Size>, val sizes: List<BaseVkPhoto.Size>,
val text: String, val text: String?,
val userId: Int? val userId: Int?
) : VkAttachment() { ) : VkAttachment() {
@@ -1,6 +1,7 @@
package com.meloda.fast.api.model.base.attachments package com.meloda.fast.api.model.base.attachments
import android.os.Parcelable import android.os.Parcelable
import com.meloda.fast.api.model.attachments.VkGift
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
@@ -9,4 +10,13 @@ data class BaseVkGift(
val thumb_256: String?, val thumb_256: String?,
val thumb_96: String?, val thumb_96: String?,
val thumb_48: String val thumb_48: String
) : Parcelable ) : Parcelable {
fun asVkGift() = VkGift(
id = id,
thumb256 = thumb_256,
thumb96 = thumb_96,
thumb48 = thumb_48
)
}
@@ -1,6 +1,7 @@
package com.meloda.fast.api.model.base.attachments package com.meloda.fast.api.model.base.attachments
import android.os.Parcelable import android.os.Parcelable
import com.meloda.fast.api.model.attachments.VkGraffiti
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
@@ -11,4 +12,15 @@ data class BaseVkGraffiti(
val width: Int, val width: Int,
val height: Int, val height: Int,
val access_key: String val access_key: String
) : Parcelable ) : Parcelable {
fun asVkGraffiti() = VkGraffiti(
id = id,
ownerId = owner_id,
url = url,
width = width,
height = height,
accessKey = access_key
)
}
@@ -13,7 +13,7 @@ data class BaseVkPhoto(
val has_tags: Boolean, val has_tags: Boolean,
val access_key: String?, val access_key: String?,
val sizes: List<Size>, val sizes: List<Size>,
val text: String, val text: String?,
val user_id: Int?, val user_id: Int?,
val lat: Double?, val lat: Double?,
val long: Double?, val long: Double?,
@@ -66,6 +66,10 @@ class AttachmentInflater constructor(
when (val attachment = attachments[0]) { when (val attachment = attachments[0]) {
is VkSticker -> return sticker(attachment) is VkSticker -> return sticker(attachment)
is VkWall -> return wall(attachment) is VkWall -> return wall(attachment)
is VkVoiceMessage -> return voice(attachment)
is VkCall -> return call(attachment)
is VkGraffiti -> return graffiti(attachment)
is VkGift -> return gift(attachment)
} }
} }
@@ -94,8 +98,6 @@ class AttachmentInflater constructor(
is VkAudio -> audio(attachment) is VkAudio -> audio(attachment)
is VkFile -> file(attachment) is VkFile -> file(attachment)
is VkLink -> link(attachment) is VkLink -> link(attachment)
is VkVoiceMessage -> voice(attachment)
is VkCall -> call(attachment)
else -> Log.e( else -> Log.e(
"Attachment inflater", "Attachment inflater",
@@ -370,4 +372,38 @@ class AttachmentInflater constructor(
binding.state.text = callState binding.state.text = callState
} }
private fun graffiti(graffiti: VkGraffiti) {
val binding = ItemMessageAttachmentGraffitiBinding.inflate(inflater, container, true)
val url = graffiti.url
val heightCoefficient = graffiti.height / AndroidUtils.px(140)
with(binding.image) {
layoutParams = LinearLayoutCompat.LayoutParams(
AndroidUtils.px(140).roundToInt(),
(graffiti.height / heightCoefficient).roundToInt()
)
load(url) { crossfade(150) }
}
}
private fun gift(gift: VkGift) {
val binding = ItemMessageAttachmentGiftBinding.inflate(inflater, container, true)
val url = gift.thumb256 ?: gift.thumb96 ?: gift.thumb48
with(binding.image) {
shapeAppearanceModel = shapeAppearanceModel.withCornerSize { AndroidUtils.px(12) }
layoutParams = LinearLayoutCompat.LayoutParams(
AndroidUtils.px(140).roundToInt(),
AndroidUtils.px(140).roundToInt()
)
load(url) { crossfade(150) }
}
}
} }
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</androidx.appcompat.widget.LinearLayoutCompat>
</layout>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</androidx.appcompat.widget.LinearLayoutCompat>
</layout>