Skip to content

Commit 0a101d2

Browse files
authored
feat: open contact details when tapping profile photo (#475)
* feat: open contact details when tapping profile photo * fix: use proper attribute Refs: #452
1 parent d9c6159 commit 0a101d2

File tree

7 files changed

+74
-23
lines changed

7 files changed

+74
-23
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
### Changed
9+
- Tapping contact photo in lists now launches the contact details page ([#452])
810

911
### Fixed
1012
- Fixed incorrect spacing between prefix and last name ([#157])
@@ -118,6 +120,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
118120
[#339]: https://github.com/FossifyOrg/Contacts/issues/339
119121
[#360]: https://github.com/FossifyOrg/Contacts/issues/360
120122
[#415]: https://github.com/FossifyOrg/Contacts/issues/415
123+
[#452]: https://github.com/FossifyOrg/Contacts/issues/452
121124

122125
[Unreleased]: https://github.com/FossifyOrg/Contacts/compare/1.5.0...HEAD
123126
[1.5.0]: https://github.com/FossifyOrg/Contacts/compare/1.4.0...1.5.0

app/src/main/kotlin/org/fossify/contacts/activities/GroupContactsActivity.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import org.fossify.contacts.adapters.ContactsAdapter
1717
import org.fossify.contacts.databinding.ActivityGroupContactsBinding
1818
import org.fossify.contacts.dialogs.SelectContactsDialog
1919
import org.fossify.contacts.extensions.handleGenericContactClick
20+
import org.fossify.contacts.extensions.viewContact
2021
import org.fossify.contacts.helpers.GROUP
2122
import org.fossify.contacts.helpers.LOCATION_GROUP_CONTACTS
2223
import org.fossify.contacts.interfaces.RefreshContactsListener
@@ -153,10 +154,14 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
153154
recyclerView = binding.groupContactsList,
154155
location = LOCATION_GROUP_CONTACTS,
155156
removeListener = this,
156-
refreshListener = this
157-
) {
158-
contactClicked(it as Contact)
159-
}.apply {
157+
refreshListener = this,
158+
itemClick = {
159+
contactClicked(it as Contact)
160+
},
161+
profileIconClick = {
162+
viewContact(it as Contact)
163+
}
164+
).apply {
160165
binding.groupContactsList.adapter = this
161166
}
162167

app/src/main/kotlin/org/fossify/contacts/adapters/ContactsAdapter.kt

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import org.fossify.contacts.helpers.*
4747
import org.fossify.contacts.interfaces.RefreshContactsListener
4848
import org.fossify.contacts.interfaces.RemoveFromGroupListener
4949
import java.util.Collections
50+
import androidx.core.graphics.drawable.toDrawable
5051

5152
class ContactsAdapter(
5253
activity: SimpleActivity,
@@ -58,7 +59,8 @@ class ContactsAdapter(
5859
private val location: Int,
5960
private val removeListener: RemoveFromGroupListener?,
6061
private val enableDrag: Boolean = false,
61-
itemClick: (Any) -> Unit
62+
itemClick: (Any) -> Unit,
63+
private val profileIconClick: ((Any) -> Unit)? = null
6264
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate, ItemTouchHelperContract {
6365

6466
private val NEW_GROUP_ID = -1
@@ -350,11 +352,7 @@ class ContactsAdapter(
350352
.error(placeholderImage)
351353

352354
val size = activity.resources.getDimension(org.fossify.commons.R.dimen.shortcut_size).toInt()
353-
val itemToLoad: Any? = if (contact.photoUri.isNotEmpty()) {
354-
contact.photoUri
355-
} else {
356-
contact.photo
357-
}
355+
val itemToLoad: Any? = contact.photoUri.ifEmpty { contact.photo }
358356

359357
val builder = Glide.with(activity)
360358
.asDrawable()
@@ -424,10 +422,27 @@ class ContactsAdapter(
424422
}
425423
}
426424

427-
findViewById<TextView>(org.fossify.commons.R.id.item_contact_image).beVisibleIf(showContactThumbnails)
425+
findViewById<ImageView>(org.fossify.commons.R.id.item_contact_image).apply {
426+
beVisibleIf(showContactThumbnails)
427+
if (profileIconClick != null && viewType != VIEW_TYPE_GRID) {
428+
setBackgroundResource(R.drawable.selector_clickable_circle)
429+
setOnClickListener {
430+
if (!actModeCallback.isSelectable) {
431+
profileIconClick.invoke(contact)
432+
} else {
433+
holder.viewClicked(contact)
434+
}
435+
}
436+
setOnLongClickListener {
437+
holder.viewLongClicked()
438+
true
439+
}
440+
}
441+
}
428442

429443
if (showContactThumbnails) {
430-
val placeholderImage = BitmapDrawable(resources, SimpleContactsHelper(context).getContactLetterIcon(fullName))
444+
val placeholderImage =
445+
SimpleContactsHelper(context).getContactLetterIcon(fullName).toDrawable(resources)
431446
if (contact.photoUri.isEmpty() && contact.photo == null) {
432447
findViewById<ImageView>(org.fossify.commons.R.id.item_contact_image).setImageDrawable(placeholderImage)
433448
} else {
@@ -437,11 +452,7 @@ class ContactsAdapter(
437452
.error(placeholderImage)
438453
.centerCrop()
439454

440-
val itemToLoad: Any? = if (contact.photoUri.isNotEmpty()) {
441-
contact.photoUri
442-
} else {
443-
contact.photo
444-
}
455+
val itemToLoad: Any? = contact.photoUri.ifEmpty { contact.photo }
445456

446457
Glide.with(activity)
447458
.load(itemToLoad)

app/src/main/kotlin/org/fossify/contacts/fragments/ContactsFragment.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import org.fossify.contacts.adapters.ContactsAdapter
1414
import org.fossify.contacts.databinding.FragmentContactsBinding
1515
import org.fossify.contacts.databinding.FragmentLettersLayoutBinding
1616
import org.fossify.contacts.extensions.config
17+
import org.fossify.contacts.extensions.viewContact
1718
import org.fossify.contacts.helpers.LOCATION_CONTACTS_TAB
1819
import org.fossify.contacts.interfaces.RefreshContactsListener
1920

@@ -58,9 +59,13 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
5859
removeListener = null,
5960
recyclerView = innerBinding.fragmentList,
6061
enableDrag = false,
61-
) {
62-
(activity as RefreshContactsListener).contactClicked(it as Contact)
63-
}.apply {
62+
itemClick = {
63+
(activity as RefreshContactsListener).contactClicked(it as Contact)
64+
},
65+
profileIconClick = {
66+
activity?.viewContact(it as Contact)
67+
}
68+
).apply {
6469
innerBinding.fragmentList.adapter = this
6570
}
6671

app/src/main/kotlin/org/fossify/contacts/fragments/FavoritesFragment.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.fossify.contacts.databinding.FragmentFavoritesBinding
2121
import org.fossify.contacts.databinding.FragmentLettersLayoutBinding
2222
import org.fossify.contacts.dialogs.SelectContactsDialog
2323
import org.fossify.contacts.extensions.config
24+
import org.fossify.contacts.extensions.viewContact
2425
import org.fossify.contacts.helpers.LOCATION_FAVORITES_TAB
2526
import org.fossify.contacts.interfaces.RefreshContactsListener
2627

@@ -79,9 +80,13 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
7980
removeListener = null,
8081
recyclerView = innerBinding.fragmentList,
8182
enableDrag = true,
82-
) {
83-
(activity as RefreshContactsListener).contactClicked(it as Contact)
84-
}.apply {
83+
itemClick = {
84+
(activity as RefreshContactsListener).contactClicked(it as Contact)
85+
},
86+
profileIconClick = {
87+
activity?.viewContact(it as Contact)
88+
}
89+
).apply {
8590
innerBinding.fragmentList.adapter = this
8691
setupZoomListener(zoomListener)
8792
onDragEndListener = {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:color="@color/activated_item_foreground">
4+
<item android:id="@android:id/mask">
5+
<shape android:shape="oval">
6+
<solid android:color="@android:color/white" />
7+
</shape>
8+
</item>
9+
</ripple>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item>
4+
<selector>
5+
<item android:state_selected="true">
6+
<shape android:shape="oval">
7+
<solid android:color="@color/activated_item_foreground" />
8+
</shape>
9+
</item>
10+
<item android:drawable="@drawable/ripple_selector_background_circle" />
11+
</selector>
12+
</item>
13+
</layer-list>

0 commit comments

Comments
 (0)