When necessary, show dialog prompting user to go to external blocking manager

This commit is contained in:
moezbhatti
2019-06-21 02:40:11 -04:00
parent 25132b58d6
commit a3824825f6
21 changed files with 195 additions and 83 deletions
@@ -0,0 +1,37 @@
package com.moez.QKSMS.blocking
import com.moez.QKSMS.util.Preferences
import io.reactivex.Completable
import io.reactivex.Single
import javax.inject.Inject
import javax.inject.Singleton
/**
* Delegates requests to the active blocking client
*/
@Singleton
class BlockingManager @Inject constructor(
private val prefs: Preferences,
private val callControlBlockingClient: CallControlBlockingClient,
private val qkBlockingClient: QkBlockingClient,
private val shouldIAnswerBlockingClient: ShouldIAnswerBlockingClient
) : BlockingClient {
private val client: BlockingClient
get() = when (prefs.blockingManager.get()) {
Preferences.BLOCKING_MANAGER_SIA -> shouldIAnswerBlockingClient
Preferences.BLOCKING_MANAGER_CC -> callControlBlockingClient
else -> qkBlockingClient
}
override fun isBlocked(address: String): Single<Boolean> = client.isBlocked(address)
override fun canBlock(): Boolean = client.canBlock()
override fun block(addresses: List<String>): Completable = client.block(addresses)
override fun canUnblock(): Boolean = client.canUnblock()
override fun unblock(addresses: List<String>): Completable = client.unblock(addresses)
}
@@ -55,11 +55,14 @@ class CallControlBlockingClient @Inject constructor(
override fun canBlock(): Boolean = true
override fun block(address: String): Completable = Completable.fromCallable {
CallControl.report(context, CallControl.Report(address))
override fun block(addresses: List<String>): Completable = Completable.fromCallable {
val reports = addresses.map { CallControl.Report(it) }
CallControl.report(context, arrayListOf<CallControl.Report>().apply { addAll(reports) })
}
override fun unblock(address: String): Completable = Completable.fromCallable {
override fun unblock(addresses: List<String>): Completable = Completable.fromCallable {
// Only show a particular address if we're only unblocking that one
val address = addresses.takeIf { it.size == 1 }?.first()
CallControl.openBlockedList(context, address)
}
@@ -19,6 +19,7 @@
package com.moez.QKSMS.blocking
import android.content.Context
import android.content.Intent
import android.os.Build
import android.provider.BlockedNumberContract
import android.telecom.TelecomManager
@@ -45,11 +46,12 @@ class QkBlockingClient @Inject constructor(private val context: Context) : Block
override fun canBlock(): Boolean = Build.VERSION.SDK_INT < 24
override fun block(address: String): Completable = Completable.fromCallable {
override fun block(addresses: List<String>): Completable = Completable.fromCallable {
when {
Build.VERSION.SDK_INT >= 24 -> {
val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
val intent = telecomManager.createManageBlockedNumbersIntent()
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
@@ -58,7 +60,7 @@ class QkBlockingClient @Inject constructor(private val context: Context) : Block
.max("id")?.toLong() ?: -1
realm.executeTransaction {
realm.insert(BlockedNumber(maxId + 1, address))
realm.insert(addresses.mapIndexed { index, address -> BlockedNumber(maxId + 1 + index, address) })
}
}
}
@@ -66,15 +68,19 @@ class QkBlockingClient @Inject constructor(private val context: Context) : Block
override fun canUnblock(): Boolean = true
override fun unblock(address: String): Completable = Completable.fromCallable {
override fun unblock(addresses: List<String>): Completable = Completable.fromCallable {
when {
Build.VERSION.SDK_INT >= 24 -> BlockedNumberContract.unblock(context, address)
Build.VERSION.SDK_INT >= 24 -> addresses.forEach { address ->
BlockedNumberContract.unblock(context, address)
}
else -> Realm.getDefaultInstance().use { realm ->
val ids = realm
.where(BlockedNumber::class.java)
.findAll()
.filter { number -> PhoneNumberUtils.compare(number.address, address) }
.filter { number ->
addresses.any { address -> PhoneNumberUtils.compare(number.address, address) }
}
.map { number -> number.id }
.toLongArray()
@@ -56,9 +56,9 @@ class ShouldIAnswerBlockingClient @Inject constructor(
return Binder(context, prefs, address).isBlocked()
}
override fun block(address: String): Completable = Completable.fromCallable { showSia() }
override fun block(addresses: List<String>): Completable = Completable.fromCallable { showSia() }
override fun unblock(address: String): Completable = Completable.fromCallable { showSia() }
override fun unblock(addresses: List<String>): Completable = Completable.fromCallable { showSia() }
private fun showSia() {
val pm = context.packageManager
@@ -141,6 +141,13 @@ class ConversationRepositoryImpl @Inject constructor(
.findFirst()
}
override fun getConversations(vararg threadIds: Long): RealmResults<Conversation> {
return Realm.getDefaultInstance()
.where(Conversation::class.java)
.anyOf("id", threadIds)
.findAll()
}
override fun getThreadId(recipient: String): Long? {
return getThreadId(listOf(recipient))
}