Loading data/src/main/java/com/moez/QKSMS/mapper/CursorToConversationImpl.kt +2 −14 Original line number Original line Diff line number Diff line Loading @@ -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) ?: "" } } } } Loading data/src/main/java/com/moez/QKSMS/migration/QkRealmMigration.kt +13 −3 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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" } } } } } data/src/main/java/com/moez/QKSMS/repository/ConversationRepositoryImpl.kt +28 −25 Original line number Original line Diff line number Diff line Loading @@ -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() } } Loading @@ -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) { Loading Loading @@ -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 } } } } } } Loading data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +6 −4 Original line number Original line Diff line number Diff line Loading @@ -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() } } } } Loading Loading @@ -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 } } } } } } } Loading data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt +1 −3 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
data/src/main/java/com/moez/QKSMS/mapper/CursorToConversationImpl.kt +2 −14 Original line number Original line Diff line number Diff line Loading @@ -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) ?: "" } } } } Loading
data/src/main/java/com/moez/QKSMS/migration/QkRealmMigration.kt +13 −3 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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" } } } } }
data/src/main/java/com/moez/QKSMS/repository/ConversationRepositoryImpl.kt +28 −25 Original line number Original line Diff line number Diff line Loading @@ -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() } } Loading @@ -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) { Loading Loading @@ -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 } } } } } } Loading
data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +6 −4 Original line number Original line Diff line number Diff line Loading @@ -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() } } } } Loading Loading @@ -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 } } } } } } } Loading
data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt +1 −3 Original line number Original line Diff line number Diff line Loading @@ -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