Fix DM display
This commit is contained in:
parent
842f07a26e
commit
13d1c1bfae
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue