messages pin & unpin feature

fix avatars and titles
visual improvements
other bugfixes & minor changes
This commit is contained in:
2021-10-08 12:55:22 +03:00
parent 9e074dd5ad
commit 7c1a7d8a89
32 changed files with 504 additions and 313 deletions
@@ -10,27 +10,28 @@ import kotlinx.parcelize.Parcelize
@Parcelize
data class VkConversation(
@PrimaryKey(autoGenerate = false)
val id: Int,
val ownerId: Int?,
val title: String?,
val photo200: String?,
val type: String,
val callInProgress: Boolean,
val isPhantom: Boolean,
val lastConversationMessageId: Int,
val inRead: Int,
val outRead: Int,
val isMarkedUnread: Boolean,
val lastMessageId: Int,
val unreadCount: Int?,
val membersCount: Int?,
val isPinned: Boolean,
var id: Int,
var ownerId: Int?,
var title: String?,
var photo200: String?,
var type: String,
var callInProgress: Boolean,
var isPhantom: Boolean,
var lastConversationMessageId: Int,
var inRead: Int,
var outRead: Int,
var isMarkedUnread: Boolean,
var lastMessageId: Int,
var unreadCount: Int?,
var membersCount: Int?,
var isPinned: Boolean,
var canChangePin: Boolean,
@Embedded(prefix = "pinnedMessage_")
var pinnedMessage: VkMessage? = null,
@Embedded(prefix = "lastMessage_")
var lastMessage: VkMessage? = null
var lastMessage: VkMessage? = null,
) : Parcelable {
fun isChat() = type == "chat"
@@ -4,8 +4,10 @@ import androidx.lifecycle.MutableLiveData
import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey
import com.meloda.fast.api.UserConfig
import com.meloda.fast.api.model.attachments.VkAttachment
import com.meloda.fast.base.adapter.SelectableItem
import com.meloda.fast.util.TimeUtils
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
@@ -58,6 +60,10 @@ data class VkMessage(
return Action.parse(action)
}
fun canEdit() =
fromId == UserConfig.userId &&
(System.currentTimeMillis() / 1000 - date.toLong() < TimeUtils.ONE_DAY_IN_SECONDS)
fun copyMessage(
id: Int = this.id,
text: String? = this.text,
@@ -40,7 +40,8 @@ data class BaseVkConversation(
unreadCount = unread_count,
membersCount = chat_settings?.members_count,
ownerId = chat_settings?.owner_id,
isPinned = sort_id.major_id > 0
isPinned = sort_id.major_id > 0,
canChangePin = chat_settings?.acl?.can_change_pin == true
).apply {
this.lastMessage = lastMessage
this.pinnedMessage = chat_settings?.pinned_message?.asVkMessage()
@@ -70,6 +70,28 @@ data class MessagesMarkAsImportantRequest(
}
@Parcelize
data class MessagesPinMessageRequest(
val peerId: Int,
val messageId: Int? = null,
val conversationMessageId: Int? = null
) : Parcelable {
val map
get() = mutableMapOf(
"peer_id" to peerId.toString()
).apply {
messageId?.let { this["message_id"] = it.toString() }
conversationMessageId?.let { this["conversation_message_id"] = it.toString() }
}
}
@Parcelize
data class MessagesUnPinMessageRequest(val peerId: Int) : Parcelable {
val map get() = mutableMapOf("peer_id" to peerId.toString())
}
@Parcelize
data class MessagesGetLongPollServerRequest(
val needPts: Boolean,
@@ -1,6 +1,6 @@
package com.meloda.fast.api.network
object VKUrls {
object VkUrls {
const val OAUTH = "https://oauth.vk.com"
const val API = "https://api.vk.com/method"
@@ -22,6 +22,8 @@ object VKUrls {
const val GetHistory = "$API/messages.getHistory"
const val Send = "$API/messages.send"
const val MarkAsImportant = "$API/messages.markAsImportant"
const val Pin = "$API/messages.pin"
const val Unpin = "$API/messages.unpin"
const val GetLongPollServer = "$API/messages.getLongPollServer"
const val GetLongPollHistory = "$API/messages.getLongPollHistory"
}
@@ -1,10 +1,7 @@
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
import com.meloda.fast.api.model.request.MessagesSendRequest
import com.meloda.fast.api.model.request.*
import com.meloda.fast.api.network.repo.MessagesRepo
import com.meloda.fast.database.dao.MessagesDao
import javax.inject.Inject
@@ -26,8 +23,14 @@ class MessagesDataSource @Inject constructor(
suspend fun getLongPollServer(params: MessagesGetLongPollServerRequest) =
repo.getLongPollServer(params.map)
suspend fun storeMessages(messages: List<VkMessage>) = dao.insert(messages)
suspend fun pin(params: MessagesPinMessageRequest) =
repo.pin(params.map)
suspend fun getCachedMessages(peerId: Int) = dao.getByPeerId(peerId)
suspend fun unpin(params: MessagesUnPinMessageRequest) =
repo.unpin(params.map)
suspend fun store(messages: List<VkMessage>) = dao.insert(messages)
suspend fun getCached(peerId: Int) = dao.getByPeerId(peerId)
}
@@ -1,6 +1,6 @@
package com.meloda.fast.api.network.repo
import com.meloda.fast.api.network.VKUrls
import com.meloda.fast.api.network.VkUrls
import com.meloda.fast.api.model.response.ResponseAuthDirect
import com.meloda.fast.api.network.Answer
import com.meloda.fast.api.model.response.ResponseSendSms
@@ -8,10 +8,10 @@ import retrofit2.http.*
interface AuthRepo {
@GET(VKUrls.Auth.DirectAuth)
@GET(VkUrls.Auth.DirectAuth)
suspend fun auth(@QueryMap param: Map<String, String?>): Answer<ResponseAuthDirect>
@GET(VKUrls.Auth.SendSms)
@GET(VkUrls.Auth.SendSms)
suspend fun sendSms(@Query("sid") validationSid: String): Answer<ResponseSendSms>
}
@@ -2,7 +2,7 @@ package com.meloda.fast.api.network.repo
import com.meloda.fast.api.base.ApiResponse
import com.meloda.fast.api.network.Answer
import com.meloda.fast.api.network.VKUrls
import com.meloda.fast.api.network.VkUrls
import com.meloda.fast.api.model.response.ConversationsGetResponse
import retrofit2.http.FieldMap
import retrofit2.http.FormUrlEncoded
@@ -11,7 +11,7 @@ import retrofit2.http.POST
interface ConversationsRepo {
@FormUrlEncoded
@POST(VKUrls.Conversations.Get)
@POST(VkUrls.Conversations.Get)
suspend fun getAllChats(@FieldMap params: Map<String, String>): Answer<ApiResponse<ConversationsGetResponse>>
}
@@ -2,9 +2,10 @@ package com.meloda.fast.api.network.repo
import com.meloda.fast.api.base.ApiResponse
import com.meloda.fast.api.model.base.BaseVkLongPoll
import com.meloda.fast.api.model.base.BaseVkMessage
import com.meloda.fast.api.model.response.MessagesGetHistoryResponse
import com.meloda.fast.api.network.Answer
import com.meloda.fast.api.network.VKUrls
import com.meloda.fast.api.network.VkUrls
import retrofit2.http.FieldMap
import retrofit2.http.FormUrlEncoded
import retrofit2.http.POST
@@ -12,19 +13,27 @@ import retrofit2.http.POST
interface MessagesRepo {
@FormUrlEncoded
@POST(VKUrls.Messages.GetHistory)
@POST(VkUrls.Messages.GetHistory)
suspend fun getHistory(@FieldMap params: Map<String, String>): Answer<ApiResponse<MessagesGetHistoryResponse>>
@FormUrlEncoded
@POST(VKUrls.Messages.Send)
@POST(VkUrls.Messages.Send)
suspend fun send(@FieldMap params: Map<String, String>): Answer<ApiResponse<Int>>
@FormUrlEncoded
@POST(VKUrls.Messages.MarkAsImportant)
@POST(VkUrls.Messages.MarkAsImportant)
suspend fun markAsImportant(@FieldMap params: Map<String, String>): Answer<ApiResponse<List<Int>>>
@FormUrlEncoded
@POST(VKUrls.Messages.GetLongPollServer)
@POST(VkUrls.Messages.GetLongPollServer)
suspend fun getLongPollServer(@FieldMap params: Map<String, String>): Answer<ApiResponse<BaseVkLongPoll>>
@FormUrlEncoded
@POST(VkUrls.Messages.Pin)
suspend fun pin(@FieldMap params: Map<String, String>): Answer<ApiResponse<BaseVkMessage>>
@FormUrlEncoded
@POST(VkUrls.Messages.Unpin)
suspend fun unpin(@FieldMap params: Map<String, String>): Answer<ApiResponse<Any>>
}
@@ -3,7 +3,7 @@ package com.meloda.fast.api.network.repo
import com.meloda.fast.api.base.ApiResponse
import com.meloda.fast.api.model.base.BaseVkUser
import com.meloda.fast.api.network.Answer
import com.meloda.fast.api.network.VKUrls
import com.meloda.fast.api.network.VkUrls
import retrofit2.http.FieldMap
import retrofit2.http.FormUrlEncoded
import retrofit2.http.POST
@@ -11,7 +11,7 @@ import retrofit2.http.POST
interface UsersRepo {
@FormUrlEncoded
@POST(VKUrls.Users.GetById)
@POST(VkUrls.Users.GetById)
suspend fun getById(
@FieldMap params: Map<String, String>?
): Answer<ApiResponse<List<BaseVkUser>>>