Loading data/src/main/java/com/moez/QKSMS/repository/ConversationRepositoryImpl.kt +7 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,13 @@ class ConversationRepositoryImpl @Inject constructor( } override fun getBlockedConversations(): RealmResults<Conversation> { return Realm.getDefaultInstance() .where(Conversation::class.java) .equalTo("blocked", true) .findAll() } override fun getBlockedConversationsAsync(): RealmResults<Conversation> { return Realm.getDefaultInstance() .where(Conversation::class.java) .equalTo("blocked", true) Loading domain/src/main/java/com/moez/QKSMS/repository/ConversationRepository.kt +2 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ interface ConversationRepository { fun getBlockedConversations(): RealmResults<Conversation> fun getBlockedConversationsAsync(): RealmResults<Conversation> fun getConversationAsync(threadId: Long): Conversation fun getConversation(threadId: Long): Conversation? Loading presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerController.kt +12 −0 Original line number Diff line number Diff line package com.moez.QKSMS.feature.blocking.manager import android.app.Activity import android.app.AlertDialog import android.view.View import com.bluelinelabs.conductor.RouterTransaction import com.jakewharton.rxbinding2.view.clicks Loading @@ -11,6 +12,7 @@ import com.moez.QKSMS.feature.blocking.numbers.BlockedNumbersController import com.moez.QKSMS.injection.appComponent import com.moez.QKSMS.util.Preferences import io.reactivex.Observable import io.reactivex.Single import io.reactivex.subjects.PublishSubject import kotlinx.android.synthetic.main.blocking_manager_controller.* import kotlinx.android.synthetic.main.blocking_manager_list_option.view.* Loading Loading @@ -65,6 +67,16 @@ class BlockingManagerController : QkController<BlockingManagerView, BlockingMana override fun siaClicked(): Observable<*> = shouldIAnswer.clicks() override fun launchSiaClicked(): Observable<*> = shouldIAnswer.launch.clicks() override fun showCopyDialog(manager: String): Single<Boolean> = Single.create { emitter -> AlertDialog.Builder(activity) .setTitle(R.string.blocking_manager_copy_title) .setMessage(resources?.getString(R.string.blocking_manager_copy_summary, manager)) .setPositiveButton(R.string.button_continue) { _, _ -> emitter.onSuccess(true) } .setNegativeButton(R.string.button_cancel) { _, _ -> emitter.onSuccess(false) } .setCancelable(false) .show() } override fun openBlockedNumbers() { router.pushController(RouterTransaction.with(BlockedNumbersController()) .pushChangeHandler(QkChangeHandler()) Loading presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerPresenter.kt +31 −0 Original line number Diff line number Diff line package com.moez.QKSMS.feature.blocking.manager import android.content.Context import com.moez.QKSMS.R import com.moez.QKSMS.blocking.BlockingClient import com.moez.QKSMS.blocking.CallControlBlockingClient import com.moez.QKSMS.blocking.QksmsBlockingClient import com.moez.QKSMS.blocking.ShouldIAnswerBlockingClient import com.moez.QKSMS.common.Navigator import com.moez.QKSMS.common.base.QkPresenter import com.moez.QKSMS.manager.AnalyticsManager import com.moez.QKSMS.repository.ConversationRepository import com.moez.QKSMS.util.Preferences import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.autoDisposable import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.rxkotlin.plusAssign import io.reactivex.schedulers.Schedulers import javax.inject.Inject class BlockingManagerPresenter @Inject constructor( private val analytics: AnalyticsManager, private val callControl: CallControlBlockingClient, private val context: Context, private val conversationRepo: ConversationRepository, private val navigator: Navigator, private val prefs: Preferences, private val qksms: QksmsBlockingClient, Loading Loading @@ -46,6 +55,9 @@ class BlockingManagerPresenter @Inject constructor( .subscribe { available -> newState { copy(siaInstalled = available) } } view.qksmsClicked() .observeOn(Schedulers.io()) .map { getAddressesToBlock(qksms) } .switchMap { numbers -> qksms.block(numbers).andThen(Observable.just(Unit)) } // Hack .autoDisposable(view.scope()) .subscribe { analytics.setUserProperty("Blocking Manager", "QKSMS") Loading @@ -70,6 +82,21 @@ class BlockingManagerPresenter @Inject constructor( val enabled = prefs.blockingManager.get() == Preferences.BLOCKING_MANAGER_CC installed && !enabled } .observeOn(Schedulers.io()) .map { getAddressesToBlock(callControl) } .observeOn(AndroidSchedulers.mainThread()) .switchMap { numbers -> when (numbers.size) { 0 -> Observable.just(true) else -> view.showCopyDialog(context.getString(R.string.blocking_manager_call_control_title)) .toObservable() } } .doOnNext { newState { copy() } } // Radio button may have been selected when it shouldn't, fix it .filter { it } .observeOn(Schedulers.io()) .map { getAddressesToBlock(callControl) } // This sucks. Can't wait to use coroutines .switchMap { numbers -> callControl.block(numbers).andThen(Observable.just(Unit)) } // Hack .autoDisposable(view.scope()) .subscribe { callControl.isBlocked("callcontrol").blockingGet() Loading Loading @@ -113,4 +140,8 @@ class BlockingManagerPresenter @Inject constructor( } } private fun getAddressesToBlock(client: BlockingClient) = conversationRepo.getBlockedConversations() .fold(listOf<String>(), { numbers, conversation -> numbers + conversation.recipients.map { it.address } }) .filter { number -> !client.isBlocked(number).blockingGet() } } presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerView.kt +2 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ package com.moez.QKSMS.feature.blocking.manager import com.moez.QKSMS.common.base.QkViewContract import io.reactivex.Observable import io.reactivex.Single interface BlockingManagerView : QkViewContract<BlockingManagerState> { Loading @@ -13,6 +14,7 @@ interface BlockingManagerView : QkViewContract<BlockingManagerState> { fun siaClicked(): Observable<*> fun launchSiaClicked(): Observable<*> fun showCopyDialog(manager: String): Single<Boolean> fun openBlockedNumbers() } Loading
data/src/main/java/com/moez/QKSMS/repository/ConversationRepositoryImpl.kt +7 −0 Original line number Diff line number Diff line Loading @@ -121,6 +121,13 @@ class ConversationRepositoryImpl @Inject constructor( } override fun getBlockedConversations(): RealmResults<Conversation> { return Realm.getDefaultInstance() .where(Conversation::class.java) .equalTo("blocked", true) .findAll() } override fun getBlockedConversationsAsync(): RealmResults<Conversation> { return Realm.getDefaultInstance() .where(Conversation::class.java) .equalTo("blocked", true) Loading
domain/src/main/java/com/moez/QKSMS/repository/ConversationRepository.kt +2 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ interface ConversationRepository { fun getBlockedConversations(): RealmResults<Conversation> fun getBlockedConversationsAsync(): RealmResults<Conversation> fun getConversationAsync(threadId: Long): Conversation fun getConversation(threadId: Long): Conversation? Loading
presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerController.kt +12 −0 Original line number Diff line number Diff line package com.moez.QKSMS.feature.blocking.manager import android.app.Activity import android.app.AlertDialog import android.view.View import com.bluelinelabs.conductor.RouterTransaction import com.jakewharton.rxbinding2.view.clicks Loading @@ -11,6 +12,7 @@ import com.moez.QKSMS.feature.blocking.numbers.BlockedNumbersController import com.moez.QKSMS.injection.appComponent import com.moez.QKSMS.util.Preferences import io.reactivex.Observable import io.reactivex.Single import io.reactivex.subjects.PublishSubject import kotlinx.android.synthetic.main.blocking_manager_controller.* import kotlinx.android.synthetic.main.blocking_manager_list_option.view.* Loading Loading @@ -65,6 +67,16 @@ class BlockingManagerController : QkController<BlockingManagerView, BlockingMana override fun siaClicked(): Observable<*> = shouldIAnswer.clicks() override fun launchSiaClicked(): Observable<*> = shouldIAnswer.launch.clicks() override fun showCopyDialog(manager: String): Single<Boolean> = Single.create { emitter -> AlertDialog.Builder(activity) .setTitle(R.string.blocking_manager_copy_title) .setMessage(resources?.getString(R.string.blocking_manager_copy_summary, manager)) .setPositiveButton(R.string.button_continue) { _, _ -> emitter.onSuccess(true) } .setNegativeButton(R.string.button_cancel) { _, _ -> emitter.onSuccess(false) } .setCancelable(false) .show() } override fun openBlockedNumbers() { router.pushController(RouterTransaction.with(BlockedNumbersController()) .pushChangeHandler(QkChangeHandler()) Loading
presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerPresenter.kt +31 −0 Original line number Diff line number Diff line package com.moez.QKSMS.feature.blocking.manager import android.content.Context import com.moez.QKSMS.R import com.moez.QKSMS.blocking.BlockingClient import com.moez.QKSMS.blocking.CallControlBlockingClient import com.moez.QKSMS.blocking.QksmsBlockingClient import com.moez.QKSMS.blocking.ShouldIAnswerBlockingClient import com.moez.QKSMS.common.Navigator import com.moez.QKSMS.common.base.QkPresenter import com.moez.QKSMS.manager.AnalyticsManager import com.moez.QKSMS.repository.ConversationRepository import com.moez.QKSMS.util.Preferences import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.autoDisposable import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.rxkotlin.plusAssign import io.reactivex.schedulers.Schedulers import javax.inject.Inject class BlockingManagerPresenter @Inject constructor( private val analytics: AnalyticsManager, private val callControl: CallControlBlockingClient, private val context: Context, private val conversationRepo: ConversationRepository, private val navigator: Navigator, private val prefs: Preferences, private val qksms: QksmsBlockingClient, Loading Loading @@ -46,6 +55,9 @@ class BlockingManagerPresenter @Inject constructor( .subscribe { available -> newState { copy(siaInstalled = available) } } view.qksmsClicked() .observeOn(Schedulers.io()) .map { getAddressesToBlock(qksms) } .switchMap { numbers -> qksms.block(numbers).andThen(Observable.just(Unit)) } // Hack .autoDisposable(view.scope()) .subscribe { analytics.setUserProperty("Blocking Manager", "QKSMS") Loading @@ -70,6 +82,21 @@ class BlockingManagerPresenter @Inject constructor( val enabled = prefs.blockingManager.get() == Preferences.BLOCKING_MANAGER_CC installed && !enabled } .observeOn(Schedulers.io()) .map { getAddressesToBlock(callControl) } .observeOn(AndroidSchedulers.mainThread()) .switchMap { numbers -> when (numbers.size) { 0 -> Observable.just(true) else -> view.showCopyDialog(context.getString(R.string.blocking_manager_call_control_title)) .toObservable() } } .doOnNext { newState { copy() } } // Radio button may have been selected when it shouldn't, fix it .filter { it } .observeOn(Schedulers.io()) .map { getAddressesToBlock(callControl) } // This sucks. Can't wait to use coroutines .switchMap { numbers -> callControl.block(numbers).andThen(Observable.just(Unit)) } // Hack .autoDisposable(view.scope()) .subscribe { callControl.isBlocked("callcontrol").blockingGet() Loading Loading @@ -113,4 +140,8 @@ class BlockingManagerPresenter @Inject constructor( } } private fun getAddressesToBlock(client: BlockingClient) = conversationRepo.getBlockedConversations() .fold(listOf<String>(), { numbers, conversation -> numbers + conversation.recipients.map { it.address } }) .filter { number -> !client.isBlocked(number).blockingGet() } }
presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerView.kt +2 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ package com.moez.QKSMS.feature.blocking.manager import com.moez.QKSMS.common.base.QkViewContract import io.reactivex.Observable import io.reactivex.Single interface BlockingManagerView : QkViewContract<BlockingManagerState> { Loading @@ -13,6 +14,7 @@ interface BlockingManagerView : QkViewContract<BlockingManagerState> { fun siaClicked(): Observable<*> fun launchSiaClicked(): Observable<*> fun showCopyDialog(manager: String): Single<Boolean> fun openBlockedNumbers() }