diff --git a/app/src/main/kotlin/org/fossify/phone/activities/DialpadActivity.kt b/app/src/main/kotlin/org/fossify/phone/activities/DialpadActivity.kt index f89928ebc..e3710d47d 100644 --- a/app/src/main/kotlin/org/fossify/phone/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/org/fossify/phone/activities/DialpadActivity.kt @@ -291,14 +291,17 @@ class DialpadActivity : SimpleActivity() { activity = this, contacts = filtered, recyclerView = binding.dialpadList, - highlightText = text - ) { - val contact = it as Contact - startCallWithConfirmationCheck(contact.getPrimaryNumber() ?: return@ContactsAdapter, contact.getNameToDisplay()) - Handler().postDelayed({ - binding.dialpadInput.setText("") - }, 1000) - }.apply { + highlightText = text, + itemClick = { + val contact = it as Contact + startCallWithConfirmationCheck(contact.getPrimaryNumber() ?: return@ContactsAdapter, contact.getNameToDisplay()) + Handler().postDelayed({ + binding.dialpadInput.setText("") + }, 1000) + }, + profileIconClick = { + startContactDetailsIntent(it as Contact) + }).apply { binding.dialpadList.adapter = this } diff --git a/app/src/main/kotlin/org/fossify/phone/adapters/ContactsAdapter.kt b/app/src/main/kotlin/org/fossify/phone/adapters/ContactsAdapter.kt index 37a6e1d80..63a18347d 100644 --- a/app/src/main/kotlin/org/fossify/phone/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/org/fossify/phone/adapters/ContactsAdapter.kt @@ -47,7 +47,8 @@ class ContactsAdapter( private val showDeleteButton: Boolean = true, private val enableDrag: Boolean = false, private val allowLongClick: Boolean = true, - itemClick: (Any) -> Unit + itemClick: (Any) -> Unit, + val profileIconClick: ((Any) -> Unit)? = null ) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract, MyRecyclerView.MyZoomListener { @@ -363,6 +364,25 @@ class ContactsAdapter( binding.apply { root.setupViewBackground(activity) itemContactFrame.isSelected = selectedKeys.contains(contact.rawId) + + itemContactImage.apply { + if (profileIconClick != null) { + setBackgroundResource(R.drawable.selector_clickable_circle) + + setOnClickListener { + if (!actModeCallback.isSelectable) { + profileIconClick.invoke(contact) + } else { + holder.viewClicked(contact) + } + } + setOnLongClickListener { + holder.viewLongClicked() + true + } + } + } + itemContactName.apply { setTextColor(textColor) setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) diff --git a/app/src/main/kotlin/org/fossify/phone/adapters/RecentCallsAdapter.kt b/app/src/main/kotlin/org/fossify/phone/adapters/RecentCallsAdapter.kt index 198aa5e1a..6952bc3cd 100644 --- a/app/src/main/kotlin/org/fossify/phone/adapters/RecentCallsAdapter.kt +++ b/app/src/main/kotlin/org/fossify/phone/adapters/RecentCallsAdapter.kt @@ -38,6 +38,7 @@ class RecentCallsAdapter( private val showOverflowMenu: Boolean, private val itemDelete: (List) -> Unit = {}, itemClick: (Any) -> Unit, + val profileIconClick: ((Any) -> Unit)? = null ) : MyRecyclerViewListAdapter(activity, recyclerView, RecentCallsDiffCallback(), itemClick) { private lateinit var outgoingCallIcon: Drawable @@ -434,7 +435,8 @@ class RecentCallsAdapter( val currentFontSize = fontSize itemRecentsHolder.isSelected = selectedKeys.contains(call.id) - val name = findContactByCall(call)?.getNameToDisplay() ?: call.name + val matchingContact = findContactByCall(call) + val name = matchingContact?.getNameToDisplay() ?: call.name val formatPhoneNumbers = activity.config.formatPhoneNumbers var nameToShow = if (name == call.phoneNumber && formatPhoneNumbers) { SpannableString(name.formatPhoneNumber()) @@ -500,6 +502,24 @@ class RecentCallsAdapter( SimpleContactsHelper(root.context).loadContactImage(call.photoUri, itemRecentsImage, call.name) + itemRecentsImage.apply { + if (profileIconClick != null) { + setBackgroundResource(R.drawable.selector_clickable_circle) + + setOnClickListener { + if (!actModeCallback.isSelectable) { + profileIconClick.invoke(call) + } else { + viewClicked(call) + } + } + setOnLongClickListener { + viewLongClicked() + true + } + } + } + val drawable = when (call.type) { Calls.OUTGOING_TYPE -> outgoingCallIcon Calls.MISSED_TYPE -> incomingMissedCallIcon diff --git a/app/src/main/kotlin/org/fossify/phone/dialogs/SelectContactDialog.kt b/app/src/main/kotlin/org/fossify/phone/dialogs/SelectContactDialog.kt index cff53210f..e37447d58 100644 --- a/app/src/main/kotlin/org/fossify/phone/dialogs/SelectContactDialog.kt +++ b/app/src/main/kotlin/org/fossify/phone/dialogs/SelectContactDialog.kt @@ -29,10 +29,10 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List(context, attributeSet), @@ -112,19 +113,22 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa viewType = viewType, showDeleteButton = false, enableDrag = true, - ) { contact -> - if (context.config.showCallConfirmation) { - CallConfirmationDialog(activity as SimpleActivity, (contact as Contact).getNameToDisplay()) { + itemClick = { it -> + if (context.config.showCallConfirmation) { + CallConfirmationDialog(activity as SimpleActivity, (it as Contact).getNameToDisplay()) { + activity?.apply { + initiateCall(it) { launchCallIntent(it) } + } + } + } else { activity?.apply { - initiateCall(contact) { launchCallIntent(it) } + initiateCall(it as Contact) { launchCallIntent(it) } } } - } else { - activity?.apply { - initiateCall(contact as Contact) { launchCallIntent(it) } - } - } - }.apply { + }, + profileIconClick = { + activity?.startContactDetailsIntent(it as Contact) + }).apply { binding.fragmentList.adapter = this onDragEndListener = { diff --git a/app/src/main/kotlin/org/fossify/phone/fragments/RecentsFragment.kt b/app/src/main/kotlin/org/fossify/phone/fragments/RecentsFragment.kt index ef0e4647e..f5b5b51b9 100644 --- a/app/src/main/kotlin/org/fossify/phone/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/org/fossify/phone/fragments/RecentsFragment.kt @@ -7,11 +7,13 @@ import org.fossify.commons.helpers.* import org.fossify.commons.models.contacts.Contact import org.fossify.commons.views.MyRecyclerView import org.fossify.phone.R +import org.fossify.phone.activities.MainActivity import org.fossify.phone.activities.SimpleActivity import org.fossify.phone.adapters.RecentCallsAdapter import org.fossify.phone.databinding.FragmentRecentsBinding import org.fossify.phone.extensions.config import org.fossify.phone.extensions.startCallWithConfirmationCheck +import org.fossify.phone.extensions.startContactDetailsIntent import org.fossify.phone.helpers.RecentsHelper import org.fossify.phone.interfaces.RefreshItemsListener import org.fossify.phone.models.CallLogItem @@ -146,6 +148,12 @@ class RecentsFragment( itemClick = { val recentCall = it as RecentCall activity?.startCallWithConfirmationCheck(recentCall.phoneNumber, recentCall.name) + }, + profileIconClick = { + val contact = findContactByCall(it as RecentCall) + if (contact != null) { + activity?.startContactDetailsIntent(contact) + } } ) @@ -278,4 +286,8 @@ class RecentsFragment( return callLog } + + private fun findContactByCall(recentCall: RecentCall): Contact? { + return (activity as MainActivity).cachedContacts.find { it.name == recentCall.name && it.doesHavePhoneNumber(recentCall.phoneNumber) } + } } diff --git a/app/src/main/res/drawable/ripple_selector_background_circle.xml b/app/src/main/res/drawable/ripple_selector_background_circle.xml new file mode 100644 index 000000000..8168bf123 --- /dev/null +++ b/app/src/main/res/drawable/ripple_selector_background_circle.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/selector_clickable_circle.xml b/app/src/main/res/drawable/selector_clickable_circle.xml new file mode 100644 index 000000000..cf6243ea7 --- /dev/null +++ b/app/src/main/res/drawable/selector_clickable_circle.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + +