make sure View Contact Details works on private contacts too

This commit is contained in:
tibbi 2020-12-31 16:12:59 +01:00
parent b63f1e6495
commit 0e115c35af
3 changed files with 39 additions and 38 deletions

View File

@ -5,7 +5,6 @@ import android.content.Intent
import android.content.pm.ShortcutInfo import android.content.pm.ShortcutInfo
import android.graphics.drawable.Icon import android.graphics.drawable.Icon
import android.net.Uri import android.net.Uri
import android.provider.ContactsContract
import android.text.TextUtils import android.text.TextUtils
import android.util.TypedValue import android.util.TypedValue
import android.view.Menu import android.view.Menu
@ -26,6 +25,7 @@ import com.simplemobiletools.commons.models.SimpleContact
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.extensions.startContactDetailsIntent
import com.simplemobiletools.dialer.interfaces.RefreshItemsListener import com.simplemobiletools.dialer.interfaces.RefreshItemsListener
class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList<SimpleContact>, recyclerView: MyRecyclerView, val refreshItemsListener: RefreshItemsListener? = null, class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList<SimpleContact>, recyclerView: MyRecyclerView, val refreshItemsListener: RefreshItemsListener? = null,
@ -106,11 +106,7 @@ class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList<SimpleCo
private fun viewContactDetails() { private fun viewContactDetails() {
val contact = getSelectedItems().firstOrNull() ?: return val contact = getSelectedItems().firstOrNull() ?: return
val lookupKey = SimpleContactsHelper(activity).getContactLookupKey((contact).rawId.toString()) activity.startContactDetailsIntent(contact)
val publicUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey)
activity.runOnUiThread {
activity.launchViewContactIntent(publicUri)
}
} }
private fun askConfirmDelete() { private fun askConfirmDelete() {

View File

@ -1,15 +1,17 @@
package com.simplemobiletools.dialer.extensions package com.simplemobiletools.dialer.extensions
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.provider.ContactsContract
import android.telecom.PhoneAccount import android.telecom.PhoneAccount
import android.telecom.PhoneAccountHandle import android.telecom.PhoneAccountHandle
import android.telecom.TelecomManager import android.telecom.TelecomManager
import com.simplemobiletools.commons.extensions.isDefaultDialer import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.extensions.launchCallIntent import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.extensions.telecomManager import com.simplemobiletools.commons.models.SimpleContact
import com.simplemobiletools.commons.helpers.PERMISSION_READ_PHONE_STATE import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.dialogs.SelectSIMDialog import com.simplemobiletools.dialer.dialogs.SelectSIMDialog
@ -23,6 +25,35 @@ fun SimpleActivity.startCallIntent(recipient: String) {
} }
} }
// handle private contacts differently, only Simple Contacts Pro can open them
fun Activity.startContactDetailsIntent(contact: SimpleContact) {
val simpleContacts = "com.simplemobiletools.contacts.pro"
val simpleContactsDebug = "com.simplemobiletools.contacts.pro.debug"
if (contact.rawId > 1000000 && contact.contactId > 1000000 && contact.rawId == contact.contactId &&
(isPackageInstalled(simpleContacts) || isPackageInstalled(simpleContactsDebug))) {
Intent().apply {
action = Intent.ACTION_VIEW
putExtra(CONTACT_ID, contact.rawId)
putExtra(IS_PRIVATE, true)
`package` = if (isPackageInstalled(simpleContacts)) simpleContacts else simpleContactsDebug
setDataAndType(ContactsContract.Contacts.CONTENT_LOOKUP_URI, "vnd.android.cursor.dir/person")
if (resolveActivity(packageManager) != null) {
startActivity(this)
} else {
toast(R.string.no_app_found)
}
}
} else {
ensureBackgroundThread {
val lookupKey = SimpleContactsHelper(this).getContactLookupKey((contact).rawId.toString())
val publicUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey)
runOnUiThread {
launchViewContactIntent(publicUri)
}
}
}
}
// used at devices with multiple SIM cards // used at devices with multiple SIM cards
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
fun SimpleActivity.getHandleToUse(intent: Intent?, phoneNumber: String, callback: (handle: PhoneAccountHandle) -> Unit) { fun SimpleActivity.getHandleToUse(intent: Intent?, phoneNumber: String, callback: (handle: PhoneAccountHandle) -> Unit) {

View File

@ -2,7 +2,6 @@ package com.simplemobiletools.dialer.fragments
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri
import android.provider.ContactsContract import android.provider.ContactsContract
import android.util.AttributeSet import android.util.AttributeSet
import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.reddit.indicatorfastscroll.FastScrollItemIndicator
@ -14,6 +13,7 @@ import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.ContactsAdapter import com.simplemobiletools.dialer.adapters.ContactsAdapter
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.extensions.startContactDetailsIntent
import com.simplemobiletools.dialer.interfaces.RefreshItemsListener import com.simplemobiletools.dialer.interfaces.RefreshItemsListener
import kotlinx.android.synthetic.main.fragment_letters_layout.view.* import kotlinx.android.synthetic.main.fragment_letters_layout.view.*
import java.util.* import java.util.*
@ -101,33 +101,7 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
if (currAdapter == null) { if (currAdapter == null) {
ContactsAdapter(activity as SimpleActivity, contacts, fragment_list, this) { ContactsAdapter(activity as SimpleActivity, contacts, fragment_list, this) {
val contact = it as SimpleContact val contact = it as SimpleContact
activity?.startContactDetailsIntent(contact)
// handle private contacts differently, only Simple Contacts Pro can open them
val simpleContacts = "com.simplemobiletools.contacts.pro"
val simpleContactsDebug = "com.simplemobiletools.contacts.pro.debug"
if (it.rawId > 1000000 && it.contactId > 1000000 && it.rawId == it.contactId &&
(context.isPackageInstalled(simpleContacts) || context.isPackageInstalled(simpleContactsDebug))) {
Intent().apply {
action = Intent.ACTION_VIEW
putExtra(CONTACT_ID, it.rawId)
putExtra(IS_PRIVATE, true)
`package` = if (context.isPackageInstalled(simpleContacts)) simpleContacts else simpleContactsDebug
setDataAndType(ContactsContract.Contacts.CONTENT_LOOKUP_URI, "vnd.android.cursor.dir/person")
if (resolveActivity(context.packageManager) != null) {
activity?.startActivity(this)
} else {
context.toast(R.string.no_app_found)
}
}
} else {
ensureBackgroundThread {
val lookupKey = SimpleContactsHelper(activity!!).getContactLookupKey((contact).rawId.toString())
val publicUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey)
activity?.runOnUiThread {
activity!!.launchViewContactIntent(publicUri)
}
}
}
}.apply { }.apply {
fragment_list.adapter = this fragment_list.adapter = this
} }