Fix DM display

This commit is contained in:
Tlaster 2020-03-03 14:13:19 +08:00
parent 842f07a26e
commit 13d1c1bfae
4 changed files with 56 additions and 38 deletions

View File

@ -20,9 +20,13 @@ package org.mariotaku.microblog.library.twitter.api;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.twitter.model.DirectMessageEventObject;
import org.mariotaku.microblog.library.twitter.model.PageableResponseList;
import org.mariotaku.microblog.library.twitter.model.Paging;
import org.mariotaku.microblog.library.twitter.template.DirectMessageAnnotationTemplate;
import org.mariotaku.restfu.annotation.method.GET;
import org.mariotaku.restfu.annotation.method.POST;
import org.mariotaku.restfu.annotation.param.Params;
import org.mariotaku.restfu.annotation.param.Query;
import org.mariotaku.restfu.annotation.param.Raw;
import org.mariotaku.restfu.http.BodyType;
@ -37,4 +41,7 @@ public interface DirectMessagesEventResources {
DirectMessageEventObject newDirectMessageEvent(@Raw(contentType = "application/json", encoding = "UTF-8")
DirectMessageEventObject event) throws MicroBlogException;
@GET("/direct_messages/events/list.json")
PageableResponseList<DirectMessageEventObject.Event> getDirectMessageList(@Query int count, @Query Paging paging) throws MicroBlogException;
}

View File

@ -48,6 +48,16 @@ public class DirectMessageEventObject {
@JsonField(name = "message_create")
MessageCreate messageCreate;
@JsonField(name = "created_timestamp")
String createdTimestamp;
public String getCreatedTimestamp() {
return createdTimestamp;
}
public void setCreatedTimestamp(String createdTimestamp) {
this.createdTimestamp = createdTimestamp;
}
public String getType() {
return type;
@ -78,6 +88,16 @@ public class DirectMessageEventObject {
Target target;
@JsonField(name = "message_data")
MessageData messageData;
@JsonField(name = "sender_id")
String senderId;
public String getSenderId() {
return senderId;
}
public void setSenderId(String senderId) {
this.senderId = senderId;
}
public Target getTarget() {
return target;

View File

@ -66,6 +66,7 @@ public final class PageableResponseList$$JsonObjectMapper<T> extends JsonMapper<
switch (fieldName) {
case "users":
case "statuses":
case "events":
case "lists": {
instance.addAll(m84ClassJsonMapper.parseList(jsonParser));
break;

View File

@ -22,24 +22,28 @@ package org.mariotaku.twidere.task.twitter.message
import android.accounts.AccountManager
import android.content.ContentValues
import android.content.Context
import android.os.Parcelable
import org.mariotaku.commons.logansquare.LoganSquareMapperFinder
import org.mariotaku.ktextension.mapToArray
import org.mariotaku.ktextension.toIntOr
import org.mariotaku.ktextension.toLongOr
import org.mariotaku.ktextension.*
import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.DMResponse
import org.mariotaku.microblog.library.twitter.model.DirectMessage
import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.restfu.callback.RawCallback
import org.mariotaku.restfu.http.HttpResponse
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.QUERY_PARAM_SHOW_NOTIFICATION
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.extension.findFieldByTypes
import org.mariotaku.twidere.extension.model.*
import org.mariotaku.twidere.extension.model.api.target
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.queryCount
import org.mariotaku.twidere.extension.queryReference
import org.mariotaku.twidere.extension.set
import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.model.ParcelableMessageConversation.ConversationType
import org.mariotaku.twidere.model.event.GetMessagesTaskEvent
@ -57,6 +61,7 @@ import org.mariotaku.twidere.task.BaseAbstractTask
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.UriUtils
import org.mariotaku.twidere.util.content.ContentResolverUtils
import java.lang.Exception
import java.util.*
/**
@ -119,7 +124,7 @@ class GetMessagesTask(
val accountsCount = param.accountKeys.size
val receivedPagination = param.pagination?.get(index) as? SinceMaxPagination
val sincePagination = param.pagination?.get(accountsCount + index) as? SinceMaxPagination
val sincePagination = param.pagination?.elementAtOrNull(accountsCount + index) as? SinceMaxPagination
val firstFetch by lazy {
val noConversationsBefore = context.contentResolver.queryCount(Conversations.CONTENT_URI,
@ -128,53 +133,38 @@ class GetMessagesTask(
}
val updateLastRead = param.hasMaxIds || firstFetch
val received = microBlog.getDirectMessages(Paging().apply {
count(100)
val maxId = receivedPagination?.maxId
val sinceId = receivedPagination?.sinceId
if (maxId != null) {
maxId(maxId)
}
if (sinceId != null) {
sinceId(sinceId)
}
})
val sent = microBlog.getSentDirectMessages(Paging().apply {
count(100)
val maxId = sincePagination?.maxId
val sinceId = sincePagination?.sinceId
if (maxId != null) {
maxId(maxId)
}
if (sinceId != null) {
sinceId(sinceId)
}
// TODO: pagination support
val list = microBlog.getDirectMessageList(50, Paging().apply {
})
val possibleUserId = (list.map { it.messageCreate.target.recipientId } + list.map { it.messageCreate.senderId }).distinct()
val users = microBlog.lookupUsers(possibleUserId.toTypedArray())
val result = list.apply {
sortByDescending { it.createdTimestamp.toLong() }
}.map {
DirectMessage().also { directMessage ->
directMessage[DirectMessage::class.java.getDeclaredField("text")] = it.messageCreate.messageData.text
directMessage[DirectMessage::class.java.getDeclaredField("id")] = it.id
directMessage[DirectMessage::class.java.getDeclaredField("sender")] = users.firstOrNull { user -> it.messageCreate.senderId == user.id }
directMessage[DirectMessage::class.java.getDeclaredField("recipient")] = users.firstOrNull { user -> it.messageCreate.senderId == user.id }
directMessage[DirectMessage::class.java.getDeclaredField("createdAt")] = Date(it.createdTimestamp.toLong())
}
}
val insertMessages = arrayListOf<ParcelableMessage>()
val conversations = hashMapOf<String, ParcelableMessageConversation>()
val conversationIds = hashSetOf<String>()
received.forEach {
result.forEach {
conversationIds.add(ParcelableMessageUtils.incomingConversationId(it.senderId, it.recipientId))
}
sent.forEach {
conversationIds.add(ParcelableMessageUtils.outgoingConversationId(it.senderId, it.recipientId))
}
conversations.addLocalConversations(context, accountKey, conversationIds)
received.forEachIndexed { i, dm ->
addConversationMessage(insertMessages, conversations, details, dm, i, received.size,
result.forEachIndexed { i, dm ->
addConversationMessage(insertMessages, conversations, details, dm, i, list.size,
false, profileImageSize, updateLastRead)
}
sent.forEachIndexed { i, dm ->
addConversationMessage(insertMessages, conversations, details, dm, i, sent.size,
true, profileImageSize, updateLastRead)
}
return DatabaseUpdateData(conversations.values, insertMessages)
}