diff --git a/data/src/main/java/com/moez/QKSMS/blocking/BlockingManager.kt b/data/src/main/java/com/moez/QKSMS/blocking/BlockingManager.kt index 633a22f3..a9f4114d 100644 --- a/data/src/main/java/com/moez/QKSMS/blocking/BlockingManager.kt +++ b/data/src/main/java/com/moez/QKSMS/blocking/BlockingManager.kt @@ -30,7 +30,9 @@ class BlockingManager @Inject constructor( override fun getClientCapability(): BlockingClient.Capability = client.getClientCapability() - override fun getAction(address: String): Single = client.getAction(address) + override fun shouldBlock(address: String): Single = client.shouldBlock(address) + + override fun isBlacklisted(address: String): Single = client.isBlacklisted(address) override fun block(addresses: List): Completable = client.block(addresses) diff --git a/data/src/main/java/com/moez/QKSMS/blocking/CallBlockerBlockingClient.kt b/data/src/main/java/com/moez/QKSMS/blocking/CallBlockerBlockingClient.kt index 8cb4ada1..ca57497d 100644 --- a/data/src/main/java/com/moez/QKSMS/blocking/CallBlockerBlockingClient.kt +++ b/data/src/main/java/com/moez/QKSMS/blocking/CallBlockerBlockingClient.kt @@ -43,11 +43,24 @@ class CallBlockerBlockingClient @Inject constructor( override fun getClientCapability() = BlockingClient.Capability.BLOCK_WITH_PERMISSION - override fun getAction(address: String): Single = Single.fromCallable { + override fun shouldBlock(address: String): Single = Single.fromCallable { val uri = Uri.parse("content://com.cuiet.blockCalls.ContProvBlockCalls/lookup/is.blocked.lookup") val blockReason = tryOrNull { - context.contentResolver.query(uri, arrayOf("result"), "incomingNumber", - arrayOf(address), null) + context.contentResolver.query(uri, arrayOf("result"), "incomingNumber", arrayOf(address), null) + ?.use { cursor -> cursor.map(::LookupResult) } + ?.find { result -> result.blockReason != null } + }?.blockReason + + when (blockReason) { + "true" -> BlockingClient.Action.Block() + else -> BlockingClient.Action.Unblock + } + } + + override fun isBlacklisted(address: String): Single = Single.fromCallable { + val uri = Uri.parse("content://com.cuiet.blockCalls.ContProvBlockCalls/lookup/is.blocked.lookup") + val blockReason = tryOrNull { + context.contentResolver.query(uri, arrayOf("result"), "blacklistLookup", arrayOf(address), null) ?.use { cursor -> cursor.map(::LookupResult) } ?.find { result -> result.blockReason != null } }?.blockReason diff --git a/data/src/main/java/com/moez/QKSMS/blocking/CallControlBlockingClient.kt b/data/src/main/java/com/moez/QKSMS/blocking/CallControlBlockingClient.kt index ada74816..35b231f3 100644 --- a/data/src/main/java/com/moez/QKSMS/blocking/CallControlBlockingClient.kt +++ b/data/src/main/java/com/moez/QKSMS/blocking/CallControlBlockingClient.kt @@ -48,7 +48,9 @@ class CallControlBlockingClient @Inject constructor( override fun getClientCapability() = BlockingClient.Capability.BLOCK_WITH_PERMISSION - override fun getAction(address: String): Single = Single.fromCallable { + override fun shouldBlock(address: String): Single = isBlacklisted(address) + + override fun isBlacklisted(address: String): Single = Single.fromCallable { val uri = Uri.withAppendedPath(CallControl.LOOKUP_TEXT_URI, address) val blockReason = tryOrNull { context.contentResolver.query(uri, projection, null, null, null) // Query URI diff --git a/data/src/main/java/com/moez/QKSMS/blocking/QksmsBlockingClient.kt b/data/src/main/java/com/moez/QKSMS/blocking/QksmsBlockingClient.kt index 33be2b18..6ea3f9b9 100644 --- a/data/src/main/java/com/moez/QKSMS/blocking/QksmsBlockingClient.kt +++ b/data/src/main/java/com/moez/QKSMS/blocking/QksmsBlockingClient.kt @@ -31,7 +31,9 @@ class QksmsBlockingClient @Inject constructor( override fun getClientCapability() = BlockingClient.Capability.BLOCK_WITHOUT_PERMISSION - override fun getAction(address: String): Single = Single.fromCallable { + override fun shouldBlock(address: String): Single = isBlacklisted(address) + + override fun isBlacklisted(address: String): Single = Single.fromCallable { when (blockingRepo.isBlocked(address)) { true -> BlockingClient.Action.Block() false -> BlockingClient.Action.Unblock diff --git a/data/src/main/java/com/moez/QKSMS/blocking/ShouldIAnswerBlockingClient.kt b/data/src/main/java/com/moez/QKSMS/blocking/ShouldIAnswerBlockingClient.kt index bfbc65a0..84c927e5 100644 --- a/data/src/main/java/com/moez/QKSMS/blocking/ShouldIAnswerBlockingClient.kt +++ b/data/src/main/java/com/moez/QKSMS/blocking/ShouldIAnswerBlockingClient.kt @@ -55,7 +55,9 @@ class ShouldIAnswerBlockingClient @Inject constructor( override fun getClientCapability() = BlockingClient.Capability.CANT_BLOCK - override fun getAction(address: String): Single { + override fun shouldBlock(address: String): Single = isBlacklisted(address) + + override fun isBlacklisted(address: String): Single { return Binder(context, address).isBlocked() .map { blocked -> when (blocked) { diff --git a/domain/src/main/java/com/moez/QKSMS/blocking/BlockingClient.kt b/domain/src/main/java/com/moez/QKSMS/blocking/BlockingClient.kt index 97534f8f..6f9a2fe4 100644 --- a/domain/src/main/java/com/moez/QKSMS/blocking/BlockingClient.kt +++ b/domain/src/main/java/com/moez/QKSMS/blocking/BlockingClient.kt @@ -52,7 +52,14 @@ interface BlockingClient { /** * Returns the recommendation action to perform given a message from the [address] */ - fun getAction(address: String): Single + fun shouldBlock(address: String): Single + + /** + * Returns whether or not the [address] is in the blocking manager's blacklist + * In most cases this will return the same result as [shouldBlock], but it's possible for an app's blacklist + * to be temporarily deactivated, in which case the results will differ + */ + fun isBlacklisted(address: String): Single /** * Blocks the numbers or opens the manager diff --git a/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveMms.kt b/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveMms.kt index 0d1ff083..e67c7a79 100644 --- a/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveMms.kt +++ b/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveMms.kt @@ -57,7 +57,7 @@ class ReceiveMms @Inject constructor( // to check if it should be blocked after we've pulled it into realm. If it // turns out that it should be dropped, then delete it // TODO Don't store blocked messages in the first place - val action = blockingClient.getAction(message.address).blockingGet() + val action = blockingClient.shouldBlock(message.address).blockingGet() val shouldDrop = prefs.drop.get() Timber.v("block=$action, drop=$shouldDrop") diff --git a/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveSms.kt b/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveSms.kt index f2b4c6d3..c8fbeddb 100644 --- a/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveSms.kt +++ b/domain/src/main/java/com/moez/QKSMS/interactor/ReceiveSms.kt @@ -49,7 +49,7 @@ class ReceiveSms @Inject constructor( // Don't continue if the sender is blocked val messages = it.messages val address = messages[0].displayOriginatingAddress - val action = blockingClient.getAction(address).blockingGet() + val action = blockingClient.shouldBlock(address).blockingGet() val shouldDrop = prefs.drop.get() Timber.v("block=$action, drop=$shouldDrop") diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/blocking/BlockingDialog.kt b/presentation/src/main/java/com/moez/QKSMS/feature/blocking/BlockingDialog.kt index 04d6daa5..ea56b960 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/blocking/BlockingDialog.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/blocking/BlockingDialog.kt @@ -77,7 +77,7 @@ class BlockingDialog @Inject constructor( } private fun allBlocked(addresses: List): Boolean = addresses.all { address -> - blockingManager.getAction(address).blockingGet() is BlockingClient.Action.Block + blockingManager.isBlacklisted(address).blockingGet() is BlockingClient.Action.Block } private suspend fun showDialog( @@ -92,8 +92,9 @@ class BlockingDialog @Inject constructor( } val manager = context.getString(when (prefs.blockingManager.get()) { - Preferences.BLOCKING_MANAGER_SIA -> R.string.blocking_manager_sia_title + Preferences.BLOCKING_MANAGER_CB -> R.string.blocking_manager_call_blocker_title Preferences.BLOCKING_MANAGER_CC -> R.string.blocking_manager_call_control_title + Preferences.BLOCKING_MANAGER_SIA -> R.string.blocking_manager_sia_title else -> R.string.blocking_manager_qksms_title }) diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/blocking/BlockingPresenter.kt b/presentation/src/main/java/com/moez/QKSMS/feature/blocking/BlockingPresenter.kt index 749ae671..4e37d238 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/blocking/BlockingPresenter.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/blocking/BlockingPresenter.kt @@ -38,8 +38,9 @@ class BlockingPresenter @Inject constructor( disposables += prefs.blockingManager.asObservable() .map { client -> when (client) { - Preferences.BLOCKING_MANAGER_SIA -> R.string.blocking_manager_sia_title + Preferences.BLOCKING_MANAGER_CB -> R.string.blocking_manager_call_blocker_title Preferences.BLOCKING_MANAGER_CC -> R.string.blocking_manager_call_control_title + Preferences.BLOCKING_MANAGER_SIA -> R.string.blocking_manager_sia_title else -> R.string.blocking_manager_qksms_title } } diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerPresenter.kt b/presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerPresenter.kt index 09b748bc..71e66aa2 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerPresenter.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/blocking/manager/BlockingManagerPresenter.kt @@ -118,7 +118,7 @@ class BlockingManagerPresenter @Inject constructor( .switchMap { numbers -> callControl.block(numbers).andThen(Observable.just(Unit)) } // Hack .autoDisposable(view.scope()) .subscribe { - callControl.getAction("callcontrol").blockingGet() + callControl.shouldBlock("callcontrol").blockingGet() analytics.setUserProperty("Blocking Manager", "Call Control") prefs.blockingManager.set(Preferences.BLOCKING_MANAGER_CC) } @@ -143,6 +143,6 @@ class BlockingManagerPresenter @Inject constructor( private fun getAddressesToBlock(client: BlockingClient) = conversationRepo.getBlockedConversations() .fold(listOf(), { numbers, conversation -> numbers + conversation.recipients.map { it.address } }) - .filter { number -> client.getAction(number).blockingGet() !is BlockingClient.Action.Block } + .filter { number -> client.isBlacklisted(number).blockingGet() !is BlockingClient.Action.Block } }