backport #1252
This commit is contained in:
parent
6674d67ad5
commit
dcaff8a24b
|
@ -60,6 +60,7 @@ import org.mariotaku.twidere.util.DataStoreUtils
|
||||||
import org.mariotaku.twidere.util.UriUtils
|
import org.mariotaku.twidere.util.UriUtils
|
||||||
import org.mariotaku.twidere.util.content.ContentResolverUtils
|
import org.mariotaku.twidere.util.content.ContentResolverUtils
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import kotlin.collections.ArrayList
|
||||||
import kotlin.collections.component1
|
import kotlin.collections.component1
|
||||||
import kotlin.collections.component2
|
import kotlin.collections.component2
|
||||||
import kotlin.collections.filter
|
import kotlin.collections.filter
|
||||||
|
@ -171,19 +172,27 @@ class GetMessagesTask(
|
||||||
}.filter { it.sender != null && it.recipient != null }
|
}.filter { it.sender != null && it.recipient != null }
|
||||||
|
|
||||||
val insertMessages = arrayListOf<ParcelableMessage>()
|
val insertMessages = arrayListOf<ParcelableMessage>()
|
||||||
val conversations = hashMapOf<String, ParcelableMessageConversation>()
|
|
||||||
|
|
||||||
val conversationIds = hashSetOf<String>()
|
val conversationIds = result.map {
|
||||||
result.forEach {
|
if (it.senderId == details.key.id) {
|
||||||
conversationIds.add(ParcelableMessageUtils.incomingConversationId(it.senderId, it.recipientId))
|
ParcelableMessageUtils.outgoingConversationId(it.senderId, it.recipientId)
|
||||||
}
|
} else {
|
||||||
|
ParcelableMessageUtils.incomingConversationId(it.senderId, it.recipientId)
|
||||||
|
}
|
||||||
|
}.distinct().toHashSet()
|
||||||
|
|
||||||
|
val conversations = hashMapOf<String, ParcelableMessageConversation>()
|
||||||
conversations.addLocalConversations(context, accountKey, conversationIds)
|
conversations.addLocalConversations(context, accountKey, conversationIds)
|
||||||
|
// remove duplicate conversations upgrade from version 4.0.9
|
||||||
|
val distinct = distinctLocalConversations(context, accountKey, result.map { it.id }.toSet())
|
||||||
|
.distinct()
|
||||||
|
.filter { !it.startsWith(details.key.id) || it == details.key.id }
|
||||||
|
|
||||||
result.forEachIndexed { i, dm ->
|
result.forEachIndexed { i, dm ->
|
||||||
addConversationMessage(insertMessages, conversations, details, dm, i, list.size,
|
addConversationMessage(insertMessages, conversations, details, dm, i, list.size,
|
||||||
false, profileImageSize, updateLastRead)
|
dm.senderId == details.key.id, profileImageSize, updateLastRead)
|
||||||
}
|
}
|
||||||
return DatabaseUpdateData(conversations.values, insertMessages)
|
return DatabaseUpdateData(conversations.values, insertMessages, distinct)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -490,6 +499,26 @@ class GetMessagesTask(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
internal fun distinctLocalConversations(context: Context, accountKey: UserKey, messageIds: Set<String>): ArrayList<String> {
|
||||||
|
val where = Expression.and(Expression.inArgs(Messages.MESSAGE_ID, messageIds.size),
|
||||||
|
Expression.equalsArgs(Conversations.ACCOUNT_KEY)).sql
|
||||||
|
val whereArgs = messageIds.toTypedArray() + accountKey.toString()
|
||||||
|
val result = arrayListOf<String>()
|
||||||
|
context.contentResolver.queryReference(Messages.CONTENT_URI, Messages.COLUMNS,
|
||||||
|
where, whereArgs, null)?.use { (cur) ->
|
||||||
|
val indices = ObjectCursor.indicesFrom(cur, ParcelableMessage::class.java)
|
||||||
|
cur.moveToFirst()
|
||||||
|
while (!cur.isAfterLast) {
|
||||||
|
val conversationId = cur.getString(indices[Messages.CONVERSATION_ID])
|
||||||
|
result.add(conversationId)
|
||||||
|
indices.newObject(cur)
|
||||||
|
cur.moveToNext()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
internal fun MutableMap<String, ParcelableMessageConversation>.addLocalConversations(context: Context,
|
internal fun MutableMap<String, ParcelableMessageConversation>.addLocalConversations(context: Context,
|
||||||
accountKey: UserKey, conversationIds: Set<String>) {
|
accountKey: UserKey, conversationIds: Set<String>) {
|
||||||
val newIds = conversationIds.filterNot { it in this.keys }
|
val newIds = conversationIds.filterNot { it in this.keys }
|
||||||
|
|
Loading…
Reference in New Issue