Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 335c5757 authored by moezbhatti's avatar moezbhatti
Browse files

Store lastMessage instead of it's fields in conversation

parent e720ee95
Loading
Loading
Loading
Loading
+2 −14
Original line number Original line Diff line number Diff line
@@ -36,33 +36,21 @@ class CursorToConversationImpl @Inject constructor(
        val URI: Uri = Uri.parse("content://mms-sms/conversations?simple=true")
        val URI: Uri = Uri.parse("content://mms-sms/conversations?simple=true")
        val PROJECTION = arrayOf(
        val PROJECTION = arrayOf(
                Threads._ID,
                Threads._ID,
                Threads.DATE,
                Threads.RECIPIENT_IDS
                Threads.RECIPIENT_IDS,
                Threads.MESSAGE_COUNT,
                Threads.READ,
                Threads.SNIPPET
        )
        )


        const val ID = 0
        const val ID = 0
        const val DATE = 1
        const val RECIPIENT_IDS = 1
        const val RECIPIENT_IDS = 2
        const val MESSAGE_COUNT = 3
        const val READ = 4
        const val SNIPPET = 5
    }
    }


    override fun map(from: Cursor): Conversation {
    override fun map(from: Cursor): Conversation {
        return Conversation().apply {
        return Conversation().apply {
            id = from.getLong(ID)
            id = from.getLong(ID)
            date = from.getLong(DATE)
            recipients.addAll(from.getString(RECIPIENT_IDS)
            recipients.addAll(from.getString(RECIPIENT_IDS)
                    .split(" ")
                    .split(" ")
                    .filter { it.isNotBlank() }
                    .filter { it.isNotBlank() }
                    .map { recipientId -> recipientId.toLong() }
                    .map { recipientId -> recipientId.toLong() }
                    .map { recipientId -> Recipient().apply { id = recipientId } })
                    .map { recipientId -> Recipient().apply { id = recipientId } })
            count = from.getInt(MESSAGE_COUNT)
            read = from.getInt(READ) == 1
            snippet = from.getString(SNIPPET) ?: ""
        }
        }
    }
    }


+13 −3
Original line number Original line Diff line number Diff line
@@ -25,7 +25,7 @@ import io.realm.RealmMigration
class QkRealmMigration : RealmMigration {
class QkRealmMigration : RealmMigration {


    companion object {
    companion object {
        const val SCHEMA_VERSION: Long = 7
        const val SCHEMA_VERSION: Long = 8
    }
    }


    override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
    override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
@@ -92,9 +92,19 @@ class QkRealmMigration : RealmMigration {
            version++
            version++
        }
        }


        if (version < newVersion) {
        if (version == 7L) {
            throw IllegalStateException("Migration missing from v$oldVersion to v$newVersion")
            realm.schema.get("Conversation")
                    ?.addRealmObjectField("lastMessage", realm.schema.get("Message"))
                    ?.removeField("count")
                    ?.removeField("date")
                    ?.removeField("snippet")
                    ?.removeField("read")
                    ?.removeField("me")

            version++
        }
        }

        check(version >= newVersion) { "Migration missing from v$oldVersion to v$newVersion" }
    }
    }


}
}
+28 −25
Original line number Original line Diff line number Diff line
@@ -54,11 +54,11 @@ class ConversationRepositoryImpl @Inject constructor(
        return Realm.getDefaultInstance()
        return Realm.getDefaultInstance()
                .where(Conversation::class.java)
                .where(Conversation::class.java)
                .notEqualTo("id", 0L)
                .notEqualTo("id", 0L)
                .greaterThan("count", 0)
                .isNotNull("lastMessage")
                .equalTo("archived", archived)
                .equalTo("archived", archived)
                .equalTo("blocked", false)
                .equalTo("blocked", false)
                .isNotEmpty("recipients")
                .isNotEmpty("recipients")
                .sort("pinned", Sort.DESCENDING, "date", Sort.DESCENDING)
                .sort("pinned", Sort.DESCENDING, "lastMessage.date", Sort.DESCENDING)
                .findAllAsync()
                .findAllAsync()
    }
    }


@@ -67,28 +67,37 @@ class ConversationRepositoryImpl @Inject constructor(
            realm.refresh()
            realm.refresh()
            realm.copyFromRealm(realm.where(Conversation::class.java)
            realm.copyFromRealm(realm.where(Conversation::class.java)
                    .notEqualTo("id", 0L)
                    .notEqualTo("id", 0L)
                    .greaterThan("count", 0)
                    .isNotNull("lastMessage")
                    .equalTo("archived", false)
                    .equalTo("archived", false)
                    .equalTo("blocked", false)
                    .equalTo("blocked", false)
                    .isNotEmpty("recipients")
                    .isNotEmpty("recipients")
                    .sort("pinned", Sort.DESCENDING, "date", Sort.DESCENDING)
                    .sort("pinned", Sort.DESCENDING, "lastMessage.date", Sort.DESCENDING)
                    .findAll())
                    .findAll())
        }
        }
    }
    }


    override fun getTopConversations(): List<Conversation> {
    override fun getTopConversations(): List<Conversation> {
        val realm = Realm.getDefaultInstance()
        return Realm.getDefaultInstance().use { realm ->
        return realm.copyFromRealm(
            realm.copyFromRealm(realm.where(Conversation::class.java)
                realm.where(Conversation::class.java)
                    .notEqualTo("id", 0L)
                    .notEqualTo("id", 0L)
                        .greaterThan("count", 0)
                    .isNotNull("lastMessage")
                        .greaterThan("date", System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7))
                    .beginGroup()
                    .equalTo("pinned", true)
                    .or()
                    .greaterThan("lastMessage.date", System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7))
                    .endGroup()
                    .equalTo("archived", false)
                    .equalTo("archived", false)
                    .equalTo("blocked", false)
                    .equalTo("blocked", false)
                    .isNotEmpty("recipients")
                    .isNotEmpty("recipients")
                        .sort("pinned", Sort.DESCENDING, "count", Sort.DESCENDING)
                    .findAll())
                        .findAll()
                    .sortedWith(compareByDescending<Conversation> { conversation -> conversation.pinned }
        )
                            .thenByDescending { conversation ->
                                realm.where(Message::class.java)
                                        .equalTo("threadId", conversation.id)
                                        .greaterThan("date", System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7))
                                        .count()
                            })
        }
    }
    }


    override fun setConversationName(id: Long, name: String) {
    override fun setConversationName(id: Long, name: String) {
@@ -234,20 +243,14 @@ class ConversationRepositoryImpl @Inject constructor(
                        .equalTo("id", threadId)
                        .equalTo("id", threadId)
                        .findFirst() ?: return
                        .findFirst() ?: return


                val messages = realm
                val message = realm
                        .where(Message::class.java)
                        .where(Message::class.java)
                        .equalTo("threadId", threadId)
                        .equalTo("threadId", threadId)
                        .sort("date", Sort.DESCENDING)
                        .sort("date", Sort.DESCENDING)
                        .findAll()
                        .findFirst()

                val message = messages.firstOrNull()


                realm.executeTransaction {
                realm.executeTransaction {
                    conversation.count = messages.size
                    conversation.lastMessage = message
                    conversation.date = message?.date ?: 0
                    conversation.snippet = message?.getSummary() ?: ""
                    conversation.read = message?.read ?: true
                    conversation.me = message?.isMe() ?: false
                }
                }
            }
            }
        }
        }
+6 −4
Original line number Original line Diff line number Diff line
@@ -113,7 +113,7 @@ class MessageRepositoryImpl @Inject constructor(
            realm.where(Conversation::class.java)
            realm.where(Conversation::class.java)
                    .equalTo("archived", false)
                    .equalTo("archived", false)
                    .equalTo("blocked", false)
                    .equalTo("blocked", false)
                    .equalTo("read", false)
                    .equalTo("lastMessage.read", false)
                    .count()
                    .count()
        }
        }
    }
    }
@@ -251,13 +251,15 @@ class MessageRepositoryImpl @Inject constructor(


    override fun markUnread(vararg threadIds: Long) {
    override fun markUnread(vararg threadIds: Long) {
        Realm.getDefaultInstance()?.use { realm ->
        Realm.getDefaultInstance()?.use { realm ->
            val conversation = realm.where(Conversation::class.java)
            val conversations = realm.where(Conversation::class.java)
                    .anyOf("id", threadIds)
                    .anyOf("id", threadIds)
                    .equalTo("read", true)
                    .equalTo("lastMessage.read", true)
                    .findAll()
                    .findAll()


            realm.executeTransaction {
            realm.executeTransaction {
                conversation.forEach { it.read = false }
                conversations.forEach { conversation ->
                    conversation.lastMessage?.read = false
                }
            }
            }
        }
        }
    }
    }
+1 −3
Original line number Original line Diff line number Diff line
@@ -147,9 +147,7 @@ class SyncRepositoryImpl @Inject constructor(
                    .findAll()
                    .findAll()
                    .forEach { message ->
                    .forEach { message ->
                        val conversation = conversations.find { conversation -> conversation.id == message.threadId }
                        val conversation = conversations.find { conversation -> conversation.id == message.threadId }
                        conversation?.date = message.date
                        conversation?.lastMessage = message
                        conversation?.snippet = message.getSummary()
                        conversation?.me = message.isMe()
                    }
                    }


            realm.insertOrUpdate(conversations)
            realm.insertOrUpdate(conversations)
Loading