diff --git a/data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt index cba29074..29fcb2d4 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/ContactRepositoryImpl.kt @@ -22,9 +22,12 @@ import android.content.Context import android.net.Uri import android.provider.BaseColumns 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.mapNotNull import com.moez.QKSMS.model.Contact +import com.moez.QKSMS.util.Preferences import io.reactivex.Flowable import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers @@ -35,13 +38,16 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class ContactRepositoryImpl @Inject constructor(val context: Context) : ContactRepository { +class ContactRepositoryImpl @Inject constructor( + private val context: Context, + private val prefs: Preferences +) : ContactRepository { override fun findContactUri(address: String): Single { return Flowable.just(address) .map { when { - address.contains('@') -> Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_FILTER_URI, Uri.encode(address)) + address.contains('@') -> Uri.withAppendedPath(Email.CONTENT_FILTER_URI, Uri.encode(address)) else -> Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address)) } } @@ -61,15 +67,41 @@ class ContactRepositoryImpl @Inject constructor(val context: Context) : ContactR override fun getUnmanagedContacts(): Flowable> { val realm = Realm.getDefaultInstance() - return realm.where(Contact::class.java) - .sort("name") - .findAllAsync() - .asFlowable() - .filter { it.isLoaded } - .filter { it.isValid } - .map { realm.copyFromRealm(it) } - .subscribeOn(AndroidSchedulers.mainThread()) - .observeOn(Schedulers.io()) + + val mobileLabel by lazy { + Phone.getTypeLabel(context.resources, Phone.TYPE_MOBILE, "Mobile").toString() + } + + return when (prefs.mobileOnly.get()) { + true -> realm.where(Contact::class.java) + .contains("numbers.type", mobileLabel) + .sort("name") + .findAllAsync() + .asFlowable() + .filter { it.isLoaded } + .filter { it.isValid } + .map { realm.copyFromRealm(it) } + .subscribeOn(AndroidSchedulers.mainThread()) + .observeOn(Schedulers.io()) + .map { contacts -> + contacts.map { contact -> + val filteredNumbers = contact.numbers.filter { number -> number.type == mobileLabel } + contact.numbers.clear() + contact.numbers.addAll(filteredNumbers) + contact + } + } + + false -> realm.where(Contact::class.java) + .sort("name") + .findAllAsync() + .asFlowable() + .filter { it.isLoaded } + .filter { it.isValid } + .map { realm.copyFromRealm(it) } + .subscribeOn(AndroidSchedulers.mainThread()) + .observeOn(Schedulers.io()) + } } } \ No newline at end of file diff --git a/data/src/main/java/com/moez/QKSMS/util/ContactImageLoader.kt b/data/src/main/java/com/moez/QKSMS/util/ContactImageLoader.kt index dba1c31f..c03f1a54 100644 --- a/data/src/main/java/com/moez/QKSMS/util/ContactImageLoader.kt +++ b/data/src/main/java/com/moez/QKSMS/util/ContactImageLoader.kt @@ -37,7 +37,10 @@ import java.io.InputStream import java.security.MessageDigest -class ContactImageLoader(private val context: Context, private val contactRepo: ContactRepository) : ModelLoader { +class ContactImageLoader( + private val context: Context, + private val contactRepo: ContactRepository +) : ModelLoader { override fun handles(model: String): Boolean { return PhoneNumberUtils.isGlobalPhoneNumber(model) @@ -47,8 +50,8 @@ class ContactImageLoader(private val context: Context, private val contactRepo: return ModelLoader.LoadData(ContactImageKey(model), ContactImageFetcher(context, contactRepo, model)) } - class Factory(val context: Context) : ModelLoaderFactory { - override fun build(multiFactory: MultiModelLoaderFactory) = ContactImageLoader(context, ContactRepositoryImpl(context)) + class Factory(val context: Context, val prefs: Preferences) : ModelLoaderFactory { + override fun build(multiFactory: MultiModelLoaderFactory) = ContactImageLoader(context, ContactRepositoryImpl(context, prefs)) override fun teardown() {} // nothing to do here } diff --git a/data/src/main/java/com/moez/QKSMS/util/GlideAppModule.kt b/data/src/main/java/com/moez/QKSMS/util/GlideAppModule.kt index de77f0e8..124d3f40 100644 --- a/data/src/main/java/com/moez/QKSMS/util/GlideAppModule.kt +++ b/data/src/main/java/com/moez/QKSMS/util/GlideAppModule.kt @@ -19,12 +19,14 @@ package com.moez.QKSMS.util import android.content.Context +import android.preference.PreferenceManager import android.util.Log import com.bumptech.glide.Glide import com.bumptech.glide.GlideBuilder import com.bumptech.glide.Registry import com.bumptech.glide.annotation.GlideModule import com.bumptech.glide.module.AppGlideModule +import com.f2prateek.rx.preferences2.RxSharedPreferences import java.io.InputStream @GlideModule @@ -35,7 +37,8 @@ class GlideAppModule : AppGlideModule() { } override fun registerComponents(context: Context, glide: Glide, registry: Registry) { - registry.append(String::class.java, InputStream::class.java, ContactImageLoader.Factory(context)) + // TODO use DI to create the ContactImageLoader.Factory + registry.append(String::class.java, InputStream::class.java, ContactImageLoader.Factory(context, Preferences(RxSharedPreferences.create(PreferenceManager.getDefaultSharedPreferences(context))))) } } \ No newline at end of file diff --git a/data/src/main/java/com/moez/QKSMS/util/Preferences.kt b/data/src/main/java/com/moez/QKSMS/util/Preferences.kt index 0af06c65..eb6c4cdc 100644 --- a/data/src/main/java/com/moez/QKSMS/util/Preferences.kt +++ b/data/src/main/java/com/moez/QKSMS/util/Preferences.kt @@ -83,6 +83,7 @@ class Preferences @Inject constructor(private val rxPrefs: RxSharedPreferences) val autoEmoji = rxPrefs.getBoolean("autoEmoji", true) val delivery = rxPrefs.getBoolean("delivery", false) val unicode = rxPrefs.getBoolean("unicode", false) + val mobileOnly = rxPrefs.getBoolean("mobileOnly", false) val mmsSize = rxPrefs.getInteger("mmsSize", 300) val logging = rxPrefs.getBoolean("logging", false) diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt index 44e7f0c8..377b46c2 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt @@ -138,6 +138,7 @@ class SettingsController : QkController newState { copy(stripUnicodeEnabled = enabled) } } + disposables += prefs.mobileOnly.asObservable() + .subscribe { enabled -> newState { copy(mobileOnly = enabled) } } + val mmsSizeLabels = context.resources.getStringArray(R.array.mms_sizes) val mmsSizeIds = context.resources.getIntArray(R.array.mms_sizes_ids) disposables += prefs.mmsSize.asObservable() @@ -130,6 +133,8 @@ class SettingsPresenter @Inject constructor( R.id.unicode -> prefs.unicode.set(!prefs.unicode.get()) + R.id.mobileOnly -> prefs.mobileOnly.set(!prefs.mobileOnly.get()) + R.id.mmsSize -> view.showMmsSizePicker() R.id.sync -> { diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsState.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsState.kt index 59982dc4..78a64541 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsState.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsState.kt @@ -38,6 +38,7 @@ data class SettingsState( val systemFontEnabled: Boolean = false, val splitSmsEnabled: Boolean = false, val stripUnicodeEnabled: Boolean = false, + val mobileOnly: Boolean = false, val maxMmsSizeSummary: String = "100KB", val maxMmsSizeId: Int = 100 ) \ No newline at end of file diff --git a/presentation/src/main/res/drawable/ic_smartphone_black_24dp.xml b/presentation/src/main/res/drawable/ic_smartphone_black_24dp.xml new file mode 100644 index 00000000..ceb1e5cc --- /dev/null +++ b/presentation/src/main/res/drawable/ic_smartphone_black_24dp.xml @@ -0,0 +1,27 @@ + + + + diff --git a/presentation/src/main/res/layout/settings_controller.xml b/presentation/src/main/res/layout/settings_controller.xml index e4dd98e5..1ec33015 100644 --- a/presentation/src/main/res/layout/settings_controller.xml +++ b/presentation/src/main/res/layout/settings_controller.xml @@ -153,6 +153,15 @@ app:title="@string/settings_unicode_title" app:widget="@layout/settings_switch_widget" /> + + Confirm that messages were sent successfully Strip accents Remove accents from characters in outgoing SMS messages + Mobile numbers only + When composing a message, only show mobile numbers Auto-compress MMS attachments Sync messages Re-sync your messages with the native Android SMS database