mirror of
https://github.com/SimpleMobileTools/Simple-Contacts.git
synced 2025-06-05 21:59:27 +02:00
moving the Manage Blocked Numbers in Commons
This commit is contained in:
@ -9,12 +9,12 @@ import android.os.Bundle
|
||||
import android.telecom.PhoneAccount
|
||||
import android.telecom.TelecomManager
|
||||
import android.view.Menu
|
||||
import com.simplemobiletools.commons.extensions.isDefaultDialer
|
||||
import com.simplemobiletools.commons.extensions.showErrorToast
|
||||
import com.simplemobiletools.commons.extensions.telecomManager
|
||||
import com.simplemobiletools.commons.extensions.toast
|
||||
import com.simplemobiletools.commons.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
|
||||
import com.simplemobiletools.contacts.pro.R
|
||||
import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer
|
||||
import com.simplemobiletools.contacts.pro.extensions.telecomManager
|
||||
import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.M)
|
||||
class DialerActivity : SimpleActivity() {
|
||||
|
@ -14,18 +14,17 @@ import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
|
||||
import com.simplemobiletools.commons.helpers.isOreoPlus
|
||||
import com.simplemobiletools.contacts.pro.R
|
||||
import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter
|
||||
import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog
|
||||
import com.simplemobiletools.contacts.pro.extensions.callContact
|
||||
import com.simplemobiletools.contacts.pro.extensions.config
|
||||
import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer
|
||||
import com.simplemobiletools.contacts.pro.extensions.startCallIntent
|
||||
import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
|
||||
import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE
|
||||
import com.simplemobiletools.contacts.pro.helpers.LOCATION_DIALPAD
|
||||
import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
|
||||
import com.simplemobiletools.contacts.pro.models.Contact
|
||||
import com.simplemobiletools.contacts.pro.models.SpeedDial
|
||||
import kotlinx.android.synthetic.main.activity_dialpad.*
|
||||
@ -174,7 +173,7 @@ class DialpadActivity : SimpleActivity() {
|
||||
val secretCode = text.substring(4, text.length - 4)
|
||||
if (isOreoPlus()) {
|
||||
if (isDefaultDialer()) {
|
||||
getSystemService(TelephonyManager::class.java).sendDialerSpecialCode(secretCode)
|
||||
getSystemService(TelephonyManager::class.java)?.sendDialerSpecialCode(secretCode)
|
||||
} else {
|
||||
launchSetDefaultDialerIntent()
|
||||
}
|
||||
|
@ -1,95 +0,0 @@
|
||||
package com.simplemobiletools.contacts.pro.activities
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import com.simplemobiletools.commons.extensions.beVisibleIf
|
||||
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
|
||||
import com.simplemobiletools.commons.extensions.underlineText
|
||||
import com.simplemobiletools.commons.extensions.updateTextColors
|
||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
|
||||
import com.simplemobiletools.contacts.pro.R
|
||||
import com.simplemobiletools.contacts.pro.adapters.ManageBlockedNumbersAdapter
|
||||
import com.simplemobiletools.contacts.pro.dialogs.AddBlockedNumberDialog
|
||||
import com.simplemobiletools.contacts.pro.extensions.getBlockedNumbers
|
||||
import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer
|
||||
import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
|
||||
import com.simplemobiletools.contacts.pro.models.BlockedNumber
|
||||
import kotlinx.android.synthetic.main.activity_manage_blocked_numbers.*
|
||||
|
||||
class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListener {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_manage_blocked_numbers)
|
||||
updateBlockedNumbers()
|
||||
updateTextColors(manage_blocked_numbers_wrapper)
|
||||
updatePlaceholderTexts()
|
||||
|
||||
manage_blocked_numbers_placeholder_2.apply {
|
||||
underlineText()
|
||||
setTextColor(getAdjustedPrimaryColor())
|
||||
setOnClickListener {
|
||||
if (isDefaultDialer()) {
|
||||
addOrEditBlockedNumber()
|
||||
} else {
|
||||
launchSetDefaultDialerIntent()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
menuInflater.inflate(R.menu.menu_add_blocked_number, menu)
|
||||
updateMenuItemColors(menu)
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
when (item.itemId) {
|
||||
R.id.add_blocked_number -> addOrEditBlockedNumber()
|
||||
else -> return super.onOptionsItemSelected(item)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun refreshItems() {
|
||||
updateBlockedNumbers()
|
||||
}
|
||||
|
||||
private fun updatePlaceholderTexts() {
|
||||
manage_blocked_numbers_placeholder.text = getString(if (isDefaultDialer()) R.string.not_blocking_anyone else R.string.must_make_default_dialer)
|
||||
manage_blocked_numbers_placeholder_2.text = getString(if (isDefaultDialer()) R.string.add_a_blocked_number else R.string.set_as_default)
|
||||
}
|
||||
|
||||
private fun updateBlockedNumbers() {
|
||||
ensureBackgroundThread {
|
||||
val blockedNumbers = getBlockedNumbers()
|
||||
runOnUiThread {
|
||||
ManageBlockedNumbersAdapter(this, blockedNumbers, this, manage_blocked_numbers_list) {
|
||||
addOrEditBlockedNumber(it as BlockedNumber)
|
||||
}.apply {
|
||||
manage_blocked_numbers_list.adapter = this
|
||||
}
|
||||
|
||||
manage_blocked_numbers_placeholder.beVisibleIf(blockedNumbers.isEmpty())
|
||||
manage_blocked_numbers_placeholder_2.beVisibleIf(blockedNumbers.isEmpty())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun addOrEditBlockedNumber(currentNumber: BlockedNumber? = null) {
|
||||
AddBlockedNumberDialog(this, currentNumber) {
|
||||
updateBlockedNumbers()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, resultData)
|
||||
if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER && isDefaultDialer()) {
|
||||
updatePlaceholderTexts()
|
||||
updateBlockedNumbers()
|
||||
}
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.view.Menu
|
||||
import com.simplemobiletools.commons.activities.ManageBlockedNumbersActivity
|
||||
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
|
||||
import com.simplemobiletools.commons.extensions.beVisibleIf
|
||||
import com.simplemobiletools.commons.extensions.getFontSizeText
|
||||
|
@ -64,17 +64,6 @@ open class SimpleActivity : BaseSimpleActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.M)
|
||||
protected fun launchSetDefaultDialerIntent() {
|
||||
Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName).apply {
|
||||
if (resolveActivity(packageManager) != null) {
|
||||
startActivityForResult(this, REQUEST_CODE_SET_DEFAULT_DIALER)
|
||||
} else {
|
||||
toast(R.string.no_app_found)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected fun getTabIcon(position: Int): Drawable {
|
||||
val drawableId = when (position) {
|
||||
LOCATION_CONTACTS_TAB -> R.drawable.ic_person_vector
|
||||
|
@ -1,87 +0,0 @@
|
||||
package com.simplemobiletools.contacts.pro.adapters
|
||||
|
||||
import android.view.Menu
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
|
||||
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||
import com.simplemobiletools.contacts.pro.R
|
||||
import com.simplemobiletools.contacts.pro.extensions.config
|
||||
import com.simplemobiletools.contacts.pro.extensions.deleteBlockedNumber
|
||||
import com.simplemobiletools.contacts.pro.models.BlockedNumber
|
||||
import kotlinx.android.synthetic.main.item_manage_blocked_number.view.*
|
||||
import java.util.*
|
||||
|
||||
class ManageBlockedNumbersAdapter(activity: BaseSimpleActivity, var blockedNumbers: ArrayList<BlockedNumber>, val listener: RefreshRecyclerViewListener?,
|
||||
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
|
||||
|
||||
private val config = activity.config
|
||||
|
||||
init {
|
||||
setupDragListener(true)
|
||||
}
|
||||
|
||||
override fun getActionMenuId() = R.menu.cab_remove_only
|
||||
|
||||
override fun prepareActionMode(menu: Menu) {}
|
||||
|
||||
override fun actionItemPressed(id: Int) {
|
||||
when (id) {
|
||||
R.id.cab_remove -> removeSelection()
|
||||
}
|
||||
}
|
||||
|
||||
override fun getSelectableItemCount() = blockedNumbers.size
|
||||
|
||||
override fun getIsItemSelectable(position: Int) = true
|
||||
|
||||
override fun getItemSelectionKey(position: Int) = blockedNumbers.getOrNull(position)?.id?.toInt()
|
||||
|
||||
override fun getItemKeyPosition(key: Int) = blockedNumbers.indexOfFirst { it.id.toInt() == key }
|
||||
|
||||
override fun onActionModeCreated() {}
|
||||
|
||||
override fun onActionModeDestroyed() {}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_blocked_number, parent)
|
||||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
val blockedNumber = blockedNumbers[position]
|
||||
holder.bindView(blockedNumber, true, true) { itemView, adapterPosition ->
|
||||
setupView(itemView, blockedNumber)
|
||||
}
|
||||
bindViewHolder(holder)
|
||||
}
|
||||
|
||||
override fun getItemCount() = blockedNumbers.size
|
||||
|
||||
private fun getSelectedItems() = blockedNumbers.filter { selectedKeys.contains(it.id.toInt()) } as ArrayList<BlockedNumber>
|
||||
|
||||
private fun setupView(view: View, blockedNumber: BlockedNumber) {
|
||||
view.apply {
|
||||
manage_blocked_number_holder?.isSelected = selectedKeys.contains(blockedNumber.id.toInt())
|
||||
manage_blocked_number_title.apply {
|
||||
text = blockedNumber.number
|
||||
setTextColor(config.textColor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun removeSelection() {
|
||||
val removeBlockedNumbers = ArrayList<BlockedNumber>(selectedKeys.size)
|
||||
val positions = getSelectedItemPositions()
|
||||
|
||||
getSelectedItems().forEach {
|
||||
removeBlockedNumbers.add(it)
|
||||
activity.deleteBlockedNumber(it.number)
|
||||
}
|
||||
|
||||
blockedNumbers.removeAll(removeBlockedNumbers)
|
||||
removeSelectedItems(positions)
|
||||
if (blockedNumbers.isEmpty()) {
|
||||
listener?.refreshItems()
|
||||
}
|
||||
}
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
package com.simplemobiletools.contacts.pro.dialogs
|
||||
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||
import com.simplemobiletools.commons.extensions.setupDialogStuff
|
||||
import com.simplemobiletools.commons.extensions.showKeyboard
|
||||
import com.simplemobiletools.commons.extensions.value
|
||||
import com.simplemobiletools.contacts.pro.R
|
||||
import com.simplemobiletools.contacts.pro.extensions.addBlockedNumber
|
||||
import com.simplemobiletools.contacts.pro.extensions.deleteBlockedNumber
|
||||
import com.simplemobiletools.contacts.pro.models.BlockedNumber
|
||||
import kotlinx.android.synthetic.main.dialog_add_blocked_number.view.*
|
||||
|
||||
class AddBlockedNumberDialog(val activity: BaseSimpleActivity, val originalNumber: BlockedNumber? = null, val callback: () -> Unit) {
|
||||
init {
|
||||
val view = activity.layoutInflater.inflate(R.layout.dialog_add_blocked_number, null).apply {
|
||||
if (originalNumber != null) {
|
||||
add_blocked_number_edittext.setText(originalNumber.number)
|
||||
}
|
||||
}
|
||||
|
||||
AlertDialog.Builder(activity)
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.create().apply {
|
||||
activity.setupDialogStuff(view, this) {
|
||||
showKeyboard(view.add_blocked_number_edittext)
|
||||
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
|
||||
val newBlockedNumber = view.add_blocked_number_edittext.value
|
||||
if (originalNumber != null && newBlockedNumber != originalNumber.number) {
|
||||
activity.deleteBlockedNumber(originalNumber.number)
|
||||
}
|
||||
|
||||
if (newBlockedNumber.isNotEmpty()) {
|
||||
activity.addBlockedNumber(newBlockedNumber)
|
||||
}
|
||||
|
||||
callback()
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,24 +1,18 @@
|
||||
package com.simplemobiletools.contacts.pro.extensions
|
||||
|
||||
import android.annotation.TargetApi
|
||||
import android.content.ContentValues
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.database.Cursor
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.provider.BlockedNumberContract
|
||||
import android.provider.BlockedNumberContract.BlockedNumbers
|
||||
import android.provider.ContactsContract
|
||||
import android.telecom.TelecomManager
|
||||
import androidx.core.content.FileProvider
|
||||
import com.simplemobiletools.commons.extensions.*
|
||||
import com.simplemobiletools.commons.extensions.getIntValue
|
||||
import com.simplemobiletools.commons.extensions.hasPermission
|
||||
import com.simplemobiletools.commons.extensions.toast
|
||||
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
|
||||
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
|
||||
import com.simplemobiletools.commons.helpers.isMarshmallowPlus
|
||||
import com.simplemobiletools.commons.helpers.isNougatPlus
|
||||
import com.simplemobiletools.contacts.pro.BuildConfig
|
||||
import com.simplemobiletools.contacts.pro.R
|
||||
import com.simplemobiletools.contacts.pro.activities.EditContactActivity
|
||||
@ -27,7 +21,6 @@ import com.simplemobiletools.contacts.pro.databases.ContactsDatabase
|
||||
import com.simplemobiletools.contacts.pro.helpers.*
|
||||
import com.simplemobiletools.contacts.pro.interfaces.ContactsDao
|
||||
import com.simplemobiletools.contacts.pro.interfaces.GroupsDao
|
||||
import com.simplemobiletools.contacts.pro.models.BlockedNumber
|
||||
import com.simplemobiletools.contacts.pro.models.Contact
|
||||
import com.simplemobiletools.contacts.pro.models.ContactSource
|
||||
import com.simplemobiletools.contacts.pro.models.Organization
|
||||
@ -39,8 +32,6 @@ val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applica
|
||||
|
||||
val Context.groupsDB: GroupsDao get() = ContactsDatabase.getInstance(applicationContext).GroupsDao()
|
||||
|
||||
val Context.telecomManager: TelecomManager get() = getSystemService(Context.TELECOM_SERVICE) as TelecomManager
|
||||
|
||||
fun Context.getEmptyContact(): Contact {
|
||||
val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
|
||||
val organization = Organization("", "")
|
||||
@ -330,60 +321,4 @@ fun Context.getAllContactSources(): ArrayList<ContactSource> {
|
||||
return sources.toMutableList() as ArrayList<ContactSource>
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
fun Context.getBlockedNumbers(): ArrayList<BlockedNumber> {
|
||||
val blockedNumbers = ArrayList<BlockedNumber>()
|
||||
if (!isNougatPlus() || !isDefaultDialer()) {
|
||||
return blockedNumbers
|
||||
}
|
||||
|
||||
val uri = BlockedNumberContract.BlockedNumbers.CONTENT_URI
|
||||
val projection = arrayOf(
|
||||
BlockedNumberContract.BlockedNumbers.COLUMN_ID,
|
||||
BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER,
|
||||
BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER
|
||||
)
|
||||
|
||||
var cursor: Cursor? = null
|
||||
try {
|
||||
cursor = contentResolver.query(uri, projection, null, null, null)
|
||||
if (cursor?.moveToFirst() == true) {
|
||||
do {
|
||||
val id = cursor.getLongValue(BlockedNumberContract.BlockedNumbers.COLUMN_ID)
|
||||
val number = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER) ?: ""
|
||||
val normalizedNumber = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER) ?: ""
|
||||
val blockedNumber = BlockedNumber(id, number, normalizedNumber)
|
||||
blockedNumbers.add(blockedNumber)
|
||||
} while (cursor.moveToNext())
|
||||
}
|
||||
} finally {
|
||||
cursor?.close()
|
||||
}
|
||||
|
||||
return blockedNumbers
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
fun Context.addBlockedNumber(number: String) {
|
||||
ContentValues().apply {
|
||||
put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number)
|
||||
try {
|
||||
contentResolver.insert(BlockedNumbers.CONTENT_URI, this)
|
||||
} catch (e: Exception) {
|
||||
showErrorToast(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.N)
|
||||
fun Context.deleteBlockedNumber(number: String) {
|
||||
val values = ContentValues()
|
||||
values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number)
|
||||
val uri = contentResolver.insert(BlockedNumbers.CONTENT_URI, values)
|
||||
contentResolver.delete(uri!!, null, null)
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.M)
|
||||
fun Context.isDefaultDialer() = isMarshmallowPlus() && telecomManager.defaultDialerPackage == packageName
|
||||
|
||||
fun Context.getPrivateContactSource() = ContactSource(SMT_PRIVATE, SMT_PRIVATE, getString(R.string.phone_storage_hidden))
|
||||
|
@ -32,7 +32,6 @@ const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts"
|
||||
const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number"
|
||||
const val FIRST_CONTACT_ID = 1000000
|
||||
const val FIRST_GROUP_ID = 10000L
|
||||
const val REQUEST_CODE_SET_DEFAULT_DIALER = 1
|
||||
|
||||
// extras used at third party intents
|
||||
const val KEY_PHONE = "phone"
|
||||
|
@ -1,3 +0,0 @@
|
||||
package com.simplemobiletools.contacts.pro.models
|
||||
|
||||
data class BlockedNumber(val id: Long, val number: String, val normalizedNumber: String)
|
Reference in New Issue
Block a user