Loading data/src/main/java/com/moez/QKSMS/filter/ContactGroupFilter.kt 0 → 100644 +32 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 Moez Bhatti <moez.bhatti@gmail.com> * * This file is part of QKSMS. * * QKSMS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * QKSMS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with QKSMS. If not, see <http://www.gnu.org/licenses/>. */ package com.moez.QKSMS.filter import com.moez.QKSMS.extensions.removeAccents import com.moez.QKSMS.model.ContactGroup import javax.inject.Inject class ContactGroupFilter @Inject constructor(private val contactFilter: ContactFilter) : Filter<ContactGroup>() { override fun filter(item: ContactGroup, query: CharSequence): Boolean { return item.title.removeAccents().contains(query, true) || // Name item.contacts.any { contact -> contactFilter.filter(contact, query) } // Contacts } } data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt +53 −37 Original line number Diff line number Diff line Loading @@ -25,10 +25,13 @@ import android.provider.ContactsContract import android.provider.ContactsContract.CommonDataKinds.Email import android.provider.ContactsContract.CommonDataKinds.Phone import com.moez.QKSMS.extensions.asFlowable import com.moez.QKSMS.extensions.asObservable import com.moez.QKSMS.extensions.mapNotNull import com.moez.QKSMS.model.Contact import com.moez.QKSMS.model.ContactGroup import com.moez.QKSMS.util.Preferences import io.reactivex.Flowable import io.reactivex.Observable import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers Loading Loading @@ -70,43 +73,43 @@ class ContactRepositoryImpl @Inject constructor( .findAll() } override fun getUnmanagedContacts(): Flowable<List<Contact>> { override fun getUnmanagedContacts(starred: Boolean): Observable<List<Contact>> { val realm = Realm.getDefaultInstance() val mobileLabel by lazy { Phone.getTypeLabel(context.resources, Phone.TYPE_MOBILE, "Mobile").toString() val mobileOnly = prefs.mobileOnly.get() val mobileLabel by lazy { Phone.getTypeLabel(context.resources, Phone.TYPE_MOBILE, "Mobile").toString() } var query = realm.where(Contact::class.java) if (mobileOnly) { query = query.contains("numbers.type", mobileLabel) } if (starred) { query = query.equalTo("starred", true) } val contactsFlowable = when (prefs.mobileOnly.get()) { true -> realm.where(Contact::class.java) .contains("numbers.type", mobileLabel) return query .findAllAsync() .asFlowable() .asObservable() .filter { it.isLoaded } .filter { it.isValid } .map { realm.copyFromRealm(it) } .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) .map { contacts -> if (mobileOnly) { contacts.map { contact -> val filteredNumbers = contact.numbers.filter { number -> number.type == mobileLabel } contact.numbers.clear() contact.numbers.addAll(filteredNumbers) contact } } else { contacts } false -> realm.where(Contact::class.java) .findAllAsync() .asFlowable() .filter { it.isLoaded } .filter { it.isValid } .map { realm.copyFromRealm(it) } .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) } return contactsFlowable.map { contacts -> .map { contacts -> contacts.sortedWith(Comparator { c1, c2 -> val initial = c1.name.firstOrNull() val other = c2.name.firstOrNull() Loading @@ -121,4 +124,17 @@ class ContactRepositoryImpl @Inject constructor( } } override fun getUnmanagedContactGroups(): Observable<List<ContactGroup>> { val realm = Realm.getDefaultInstance() return realm.where(ContactGroup::class.java) .isNotEmpty("contacts") .findAllAsync() .asObservable() .filter { it.isLoaded } .filter { it.isValid } .map { realm.copyFromRealm(it) } .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) } } data/src/main/java/com/moez/QKSMS/repository/ConversationRepositoryImpl.kt +23 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.content.Context import android.provider.Telephony import com.moez.QKSMS.compat.TelephonyCompat import com.moez.QKSMS.extensions.anyOf import com.moez.QKSMS.extensions.asObservable import com.moez.QKSMS.extensions.map import com.moez.QKSMS.extensions.removeAccents import com.moez.QKSMS.filter.ConversationFilter Loading @@ -35,6 +36,9 @@ import com.moez.QKSMS.model.Recipient import com.moez.QKSMS.model.SearchResult import com.moez.QKSMS.util.PhoneNumberUtils import com.moez.QKSMS.util.tryOrNull import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import io.realm.Case import io.realm.Realm import io.realm.RealmResults Loading Loading @@ -183,6 +187,25 @@ class ConversationRepositoryImpl @Inject constructor( .findAll() } override fun getUnmanagedConversations(): Observable<List<Conversation>> { val realm = Realm.getDefaultInstance() return realm.where(Conversation::class.java) .sort("date", Sort.DESCENDING) .notEqualTo("id", 0L) .greaterThan("count", 0) .equalTo("archived", false) .equalTo("blocked", false) .isNotEmpty("recipients") .limit(5) .findAllAsync() .asObservable() .filter { it.isLoaded } .filter { it.isValid } .map { realm.copyFromRealm(it) } .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) } override fun getRecipient(recipientId: Long): Recipient? { return Realm.getDefaultInstance() .where(Recipient::class.java) Loading domain/src/main/java/com/moez/QKSMS/repository/ContactRepository.kt +5 −2 Original line number Diff line number Diff line Loading @@ -20,7 +20,8 @@ package com.moez.QKSMS.repository import android.net.Uri import com.moez.QKSMS.model.Contact import io.reactivex.Flowable import com.moez.QKSMS.model.ContactGroup import io.reactivex.Observable import io.reactivex.Single import io.realm.RealmResults Loading @@ -30,6 +31,8 @@ interface ContactRepository { fun getContacts(): RealmResults<Contact> fun getUnmanagedContacts(): Flowable<List<Contact>> fun getUnmanagedContacts(starred: Boolean = false): Observable<List<Contact>> fun getUnmanagedContactGroups(): Observable<List<ContactGroup>> } No newline at end of file domain/src/main/java/com/moez/QKSMS/repository/ConversationRepository.kt +3 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ package com.moez.QKSMS.repository import com.moez.QKSMS.model.Conversation import com.moez.QKSMS.model.Recipient import com.moez.QKSMS.model.SearchResult import io.reactivex.Observable import io.realm.RealmResults interface ConversationRepository { Loading Loading @@ -51,6 +52,8 @@ interface ConversationRepository { */ fun getConversations(vararg threadIds: Long): RealmResults<Conversation> fun getUnmanagedConversations(): Observable<List<Conversation>> fun getRecipient(recipientId: Long): Recipient? fun getThreadId(recipient: String): Long? Loading Loading
data/src/main/java/com/moez/QKSMS/filter/ContactGroupFilter.kt 0 → 100644 +32 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 Moez Bhatti <moez.bhatti@gmail.com> * * This file is part of QKSMS. * * QKSMS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * QKSMS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with QKSMS. If not, see <http://www.gnu.org/licenses/>. */ package com.moez.QKSMS.filter import com.moez.QKSMS.extensions.removeAccents import com.moez.QKSMS.model.ContactGroup import javax.inject.Inject class ContactGroupFilter @Inject constructor(private val contactFilter: ContactFilter) : Filter<ContactGroup>() { override fun filter(item: ContactGroup, query: CharSequence): Boolean { return item.title.removeAccents().contains(query, true) || // Name item.contacts.any { contact -> contactFilter.filter(contact, query) } // Contacts } }
data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt +53 −37 Original line number Diff line number Diff line Loading @@ -25,10 +25,13 @@ import android.provider.ContactsContract import android.provider.ContactsContract.CommonDataKinds.Email import android.provider.ContactsContract.CommonDataKinds.Phone import com.moez.QKSMS.extensions.asFlowable import com.moez.QKSMS.extensions.asObservable import com.moez.QKSMS.extensions.mapNotNull import com.moez.QKSMS.model.Contact import com.moez.QKSMS.model.ContactGroup import com.moez.QKSMS.util.Preferences import io.reactivex.Flowable import io.reactivex.Observable import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers Loading Loading @@ -70,43 +73,43 @@ class ContactRepositoryImpl @Inject constructor( .findAll() } override fun getUnmanagedContacts(): Flowable<List<Contact>> { override fun getUnmanagedContacts(starred: Boolean): Observable<List<Contact>> { val realm = Realm.getDefaultInstance() val mobileLabel by lazy { Phone.getTypeLabel(context.resources, Phone.TYPE_MOBILE, "Mobile").toString() val mobileOnly = prefs.mobileOnly.get() val mobileLabel by lazy { Phone.getTypeLabel(context.resources, Phone.TYPE_MOBILE, "Mobile").toString() } var query = realm.where(Contact::class.java) if (mobileOnly) { query = query.contains("numbers.type", mobileLabel) } if (starred) { query = query.equalTo("starred", true) } val contactsFlowable = when (prefs.mobileOnly.get()) { true -> realm.where(Contact::class.java) .contains("numbers.type", mobileLabel) return query .findAllAsync() .asFlowable() .asObservable() .filter { it.isLoaded } .filter { it.isValid } .map { realm.copyFromRealm(it) } .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) .map { contacts -> if (mobileOnly) { contacts.map { contact -> val filteredNumbers = contact.numbers.filter { number -> number.type == mobileLabel } contact.numbers.clear() contact.numbers.addAll(filteredNumbers) contact } } else { contacts } false -> realm.where(Contact::class.java) .findAllAsync() .asFlowable() .filter { it.isLoaded } .filter { it.isValid } .map { realm.copyFromRealm(it) } .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) } return contactsFlowable.map { contacts -> .map { contacts -> contacts.sortedWith(Comparator { c1, c2 -> val initial = c1.name.firstOrNull() val other = c2.name.firstOrNull() Loading @@ -121,4 +124,17 @@ class ContactRepositoryImpl @Inject constructor( } } override fun getUnmanagedContactGroups(): Observable<List<ContactGroup>> { val realm = Realm.getDefaultInstance() return realm.where(ContactGroup::class.java) .isNotEmpty("contacts") .findAllAsync() .asObservable() .filter { it.isLoaded } .filter { it.isValid } .map { realm.copyFromRealm(it) } .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) } }
data/src/main/java/com/moez/QKSMS/repository/ConversationRepositoryImpl.kt +23 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.content.Context import android.provider.Telephony import com.moez.QKSMS.compat.TelephonyCompat import com.moez.QKSMS.extensions.anyOf import com.moez.QKSMS.extensions.asObservable import com.moez.QKSMS.extensions.map import com.moez.QKSMS.extensions.removeAccents import com.moez.QKSMS.filter.ConversationFilter Loading @@ -35,6 +36,9 @@ import com.moez.QKSMS.model.Recipient import com.moez.QKSMS.model.SearchResult import com.moez.QKSMS.util.PhoneNumberUtils import com.moez.QKSMS.util.tryOrNull import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import io.realm.Case import io.realm.Realm import io.realm.RealmResults Loading Loading @@ -183,6 +187,25 @@ class ConversationRepositoryImpl @Inject constructor( .findAll() } override fun getUnmanagedConversations(): Observable<List<Conversation>> { val realm = Realm.getDefaultInstance() return realm.where(Conversation::class.java) .sort("date", Sort.DESCENDING) .notEqualTo("id", 0L) .greaterThan("count", 0) .equalTo("archived", false) .equalTo("blocked", false) .isNotEmpty("recipients") .limit(5) .findAllAsync() .asObservable() .filter { it.isLoaded } .filter { it.isValid } .map { realm.copyFromRealm(it) } .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) } override fun getRecipient(recipientId: Long): Recipient? { return Realm.getDefaultInstance() .where(Recipient::class.java) Loading
domain/src/main/java/com/moez/QKSMS/repository/ContactRepository.kt +5 −2 Original line number Diff line number Diff line Loading @@ -20,7 +20,8 @@ package com.moez.QKSMS.repository import android.net.Uri import com.moez.QKSMS.model.Contact import io.reactivex.Flowable import com.moez.QKSMS.model.ContactGroup import io.reactivex.Observable import io.reactivex.Single import io.realm.RealmResults Loading @@ -30,6 +31,8 @@ interface ContactRepository { fun getContacts(): RealmResults<Contact> fun getUnmanagedContacts(): Flowable<List<Contact>> fun getUnmanagedContacts(starred: Boolean = false): Observable<List<Contact>> fun getUnmanagedContactGroups(): Observable<List<ContactGroup>> } No newline at end of file
domain/src/main/java/com/moez/QKSMS/repository/ConversationRepository.kt +3 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ package com.moez.QKSMS.repository import com.moez.QKSMS.model.Conversation import com.moez.QKSMS.model.Recipient import com.moez.QKSMS.model.SearchResult import io.reactivex.Observable import io.realm.RealmResults interface ConversationRepository { Loading Loading @@ -51,6 +52,8 @@ interface ConversationRepository { */ fun getConversations(vararg threadIds: Long): RealmResults<Conversation> fun getUnmanagedConversations(): Observable<List<Conversation>> fun getRecipient(recipientId: Long): Recipient? fun getThreadId(recipient: String): Long? Loading