code saving

This commit is contained in:
2021-09-21 13:39:34 +03:00
parent d1ed98691c
commit 56fb93d2e4
43 changed files with 665 additions and 122 deletions
@@ -7,7 +7,6 @@ object VKConstants {
const val USER_FIELDS =
"photo_50,photo_100,photo_200,status,screen_name,online,online_mobile,last_seen,verified,sex,online_info"
const val API_VERSION = "5.132"
const val VK_APP_ID = "2274003"
const val VK_SECRET = "hHbZxrka2uZ6jB1inYsH"
@@ -27,7 +27,9 @@ object VkUtils {
return throwable.error == VkErrors.NEED_CAPTCHA
}
fun prepareMessageText(text: String): String {
fun prepareMessageText(text: String?): String? {
if (text == null) return null
return text
.replace("\n", " ")
.replace("&amp", "&")
@@ -58,9 +60,7 @@ object VkUtils {
}
BaseVkAttachmentItem.AttachmentType.VIDEO -> {
val video = baseAttachment.video ?: continue
attachments += VkVideo(
link = video.player
)
attachments += video.asVkVideo()
}
BaseVkAttachmentItem.AttachmentType.AUDIO -> {
val audio = baseAttachment.audio ?: continue
@@ -1,8 +1,8 @@
package com.meloda.fast.api.model
import android.os.Parcelable
import androidx.room.Embedded
import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey
import kotlinx.parcelize.Parcelize
@@ -24,10 +24,14 @@ data class VkConversation(
val lastMessageId: Int,
val unreadCount: Int?,
val membersCount: Int?,
val isPinned: Boolean
) : Parcelable {
@Ignore
val isPinned: Boolean,
@Embedded(prefix = "pinnedMessage_")
var pinnedMessage: VkMessage? = null,
@Embedded(prefix = "lastMessage_")
var lastMessage: VkMessage? = null
) : Parcelable {
fun isChat() = type == "chat"
fun isUser() = type == "user"
@@ -2,10 +2,8 @@ package com.meloda.fast.api.model
import android.os.Parcelable
import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey
import com.meloda.fast.api.model.attachments.VkAttachment
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Entity(tableName = "messages")
@@ -25,16 +23,10 @@ data class VkMessage(
val actionConversationMessageId: Int? = null,
val actionMessage: String? = null,
val geoType: String? = null,
val important: Boolean = false
) : Parcelable {
@IgnoredOnParcel
@Ignore
var forwards: List<VkMessage>? = null
@IgnoredOnParcel
@Ignore
val important: Boolean = false,
var forwards: List<VkMessage>? = null,
var attachments: List<VkAttachment>? = null
) : Parcelable {
fun isPeerChat() = peerId > 2_000_000_000
@@ -1,5 +1,7 @@
package com.meloda.fast.api.model.attachments
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
abstract class VkAttachment : Parcelable
@Parcelize
open class VkAttachment : Parcelable
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkAudio(
val link: String
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,8 +1,14 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkCall(
val initiatorId: Int
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkFile(
val link: String
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkGift(
val link: String
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkGraffiti(
val link: String
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkGroupCall(
val initiatorId: Int
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkLink(
val link: String
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkMiniApp(
val link: String
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,6 +1,7 @@
package com.meloda.fast.api.model.attachments
import com.meloda.fast.api.model.base.attachments.Size
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
@@ -16,6 +17,9 @@ data class VkPhoto(
val userId: Int?
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
fun sizeOfType(type: Char): Size? {
for (size in sizes) {
if (size.type == type.toString())
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkPoll(
val id: Int
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -2,6 +2,7 @@ package com.meloda.fast.api.model.attachments
import com.meloda.fast.api.model.base.attachments.BaseVkSticker
import com.meloda.fast.api.model.base.attachments.StickerSize
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
@@ -12,6 +13,9 @@ data class VkSticker(
val backgroundImages: List<BaseVkSticker.Image>
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
fun urlForSize(@StickerSize size: Int): String? {
for (image in images) {
if (image.width == size) return image.url
@@ -1,8 +1,21 @@
package com.meloda.fast.api.model.attachments
import com.meloda.fast.api.model.base.attachments.BaseVkVideo
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkVideo(
val link: String
) : VkAttachment()
val id: Int,
val images: List<BaseVkVideo.Image>,
val firstFrames: List<BaseVkVideo.FirstFrame>
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
fun imageForWidth(width: Int): BaseVkVideo.Image? {
return images.find { it.width == width }
}
}
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkVoiceMessage(
val link: String
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkWall(
val id: Int
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -1,8 +1,13 @@
package com.meloda.fast.api.model.attachments
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@Parcelize
data class VkWallReply(
val id: Int
) : VkAttachment()
) : VkAttachment() {
@IgnoredOnParcel
val className: String = this::class.java.name
}
@@ -54,7 +54,10 @@ data class BaseVkConversation(
membersCount = chatSettings?.membersCount,
ownerId = chatSettings?.ownerId,
isPinned = sortId.majorId > 0
).apply { this.lastMessage = lastMessage }
).apply {
this.lastMessage = lastMessage
this.pinnedMessage = chatSettings?.pinnedMessage?.asVkMessage()
}
@Parcelize
data class Peer(
@@ -111,7 +114,9 @@ data class BaseVkConversation(
val isDisappearing: Boolean,
@SerializedName("is_service")
val isService: Boolean,
val theme: String
val theme: String?,
@SerializedName("pinned_message")
val pinnedMessage: BaseVkMessage?
) : Parcelable {
@Parcelize
@@ -2,8 +2,10 @@ package com.meloda.fast.api.model.base.attachments
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import com.meloda.fast.api.model.attachments.VkVideo
import kotlinx.parcelize.Parcelize
//not all fields
@Parcelize
data class BaseVkVideo(
val id: Int,
@@ -53,6 +55,12 @@ data class BaseVkVideo(
//ads
) : BaseVkAttachment() {
fun asVkVideo() = VkVideo(
id = id,
images = image,
firstFrames = firstFrame
)
@Parcelize
data class Image(
val height: Int,
@@ -1,9 +1,11 @@
package com.meloda.fast.api.network
import com.meloda.fast.api.VKException
import com.meloda.fast.api.base.ApiResponse
import okhttp3.Request
import okio.IOException
import okio.Timeout
import org.json.JSONObject
import retrofit2.*
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
@@ -86,6 +88,9 @@ internal class ResultCall<T>(proxy: Call<T>) : CallDelegate<T, Answer<T>>(proxy)
}
} else Answer.Error(IOException(response.errorBody()?.string() ?: ""))
if (result is Answer.Error) if (checkErrors(call, result)) return
callback.onResponse(proxy, Response.success(result))
}
@@ -95,6 +100,23 @@ internal class ResultCall<T>(proxy: Call<T>) : CallDelegate<T, Answer<T>>(proxy)
Response.success(Answer.Error(throwable = error))
)
}
private fun checkErrors(call: Call<T>, result: Answer.Error): Boolean {
val json = JSONObject(result.throwable.message ?: "{}")
return if (json.has("error")) {
val error = json.optString("error", "")
val description = json.optString("error_description", "")
val exception = VKException(
error = error,
description = description,
).also { it.json = json }
onFailure(call, exception)
true
} else false
}
}
override fun timeout(): Timeout {
@@ -1,5 +1,6 @@
package com.meloda.fast.api.network.datasource
import com.meloda.fast.api.model.VkMessage
import com.meloda.fast.api.model.request.MessagesGetHistoryRequest
import com.meloda.fast.api.model.request.MessagesGetLongPollServerRequest
import com.meloda.fast.api.model.request.MessagesMarkAsImportantRequest
@@ -25,4 +26,8 @@ class MessagesDataSource @Inject constructor(
suspend fun getLongPollServer(params: MessagesGetLongPollServerRequest) =
repo.getLongPollServer(params.map)
suspend fun storeMessages(messages: List<VkMessage>) = dao.insert(messages)
suspend fun getCachedMessages(peerId: Int) = dao.getByPeerId(peerId)
}