Simplifying profile picture view

We don't need the isLarge option as the component's size is always set.
Using profilePictureView in the call screen.
This commit is contained in:
ThomasSession 2024-07-17 10:28:58 +10:00
parent 1ca62629f6
commit 0130469230
8 changed files with 52 additions and 85 deletions

View File

@ -254,8 +254,10 @@ class WebRtcCallActivity : PassphraseRequiredActionBarActivity() {
else -> 0f else -> 0f
} }
remoteRecipient.animate().cancel() userAvatar.animate().cancel()
remoteRecipient.animate().rotation(rotation).start() userAvatar.animate().rotation(rotation).start()
contactAvatar.animate().cancel()
contactAvatar.animate().rotation(rotation).start()
speakerPhoneButton.animate().cancel() speakerPhoneButton.animate().cancel()
speakerPhoneButton.animate().rotation(rotation).start() speakerPhoneButton.animate().rotation(rotation).start()
@ -328,44 +330,20 @@ class WebRtcCallActivity : PassphraseRequiredActionBarActivity() {
launch { launch {
viewModel.recipient.collect { latestRecipient -> viewModel.recipient.collect { latestRecipient ->
binding.contactAvatar.recycle()
if (latestRecipient.recipient != null) { if (latestRecipient.recipient != null) {
val publicKey = latestRecipient.recipient.address.serialize() val contactPublicKey = latestRecipient.recipient.address.serialize()
val displayName = getUserDisplayName(publicKey) val contactDisplayName = getUserDisplayName(contactPublicKey)
supportActionBar?.title = displayName supportActionBar?.title = contactDisplayName
val signalProfilePicture = latestRecipient.recipient.contactPhoto binding.remoteRecipientName.text = contactDisplayName
val avatar = (signalProfilePicture as? ProfileContactPhoto)?.avatarObject
val sizeInPX = // sort out the contact's avatar
resources.getDimensionPixelSize(R.dimen.extra_large_profile_picture_size) binding.contactAvatar.apply {
binding.remoteRecipientName.text = displayName publicKey = contactPublicKey
if (signalProfilePicture != null && avatar != "0" && avatar != "") { displayName = contactDisplayName
glide.clear(binding.remoteRecipient) update()
glide.load(signalProfilePicture)
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.circleCrop()
.error(
AvatarPlaceholderGenerator.generate(
this@WebRtcCallActivity,
sizeInPX,
publicKey,
displayName
)
)
.into(binding.remoteRecipient)
} else {
glide.clear(binding.remoteRecipient)
glide.load(
AvatarPlaceholderGenerator.generate(
this@WebRtcCallActivity,
sizeInPX,
publicKey,
displayName
)
)
.diskCacheStrategy(DiskCacheStrategy.ALL).circleCrop()
.into(binding.remoteRecipient)
} }
} else {
glide.clear(binding.remoteRecipient)
} }
} }
} }
@ -411,11 +389,11 @@ class WebRtcCallActivity : PassphraseRequiredActionBarActivity() {
viewModel.fullscreenRenderer?.let { surfaceView -> viewModel.fullscreenRenderer?.let { surfaceView ->
binding.fullscreenRenderer.addView(surfaceView) binding.fullscreenRenderer.addView(surfaceView)
binding.fullscreenRenderer.isVisible = true binding.fullscreenRenderer.isVisible = true
binding.remoteRecipient.isVisible = false binding.contactAvatar.isVisible = false
} }
} else { } else {
binding.fullscreenRenderer.isVisible = false binding.fullscreenRenderer.isVisible = false
binding.remoteRecipient.isVisible = true binding.contactAvatar.isVisible = true
} }
// handle floating video window // handle floating video window

View File

@ -30,7 +30,6 @@ class ProfilePictureView @JvmOverloads constructor(
var displayName: String? = null var displayName: String? = null
var additionalPublicKey: String? = null var additionalPublicKey: String? = null
var additionalDisplayName: String? = null var additionalDisplayName: String? = null
var isLarge = false
private val profilePicturesCache = mutableMapOf<View, Recipient>() private val profilePicturesCache = mutableMapOf<View, Recipient>()
private val unknownRecipientDrawable by lazy { ResourceContactPhoto(R.drawable.ic_profile_default) private val unknownRecipientDrawable by lazy { ResourceContactPhoto(R.drawable.ic_profile_default)
@ -87,29 +86,25 @@ class ProfilePictureView @JvmOverloads constructor(
fun update() { fun update() {
val publicKey = publicKey ?: return val publicKey = publicKey ?: return
val additionalPublicKey = additionalPublicKey val additionalPublicKey = additionalPublicKey
// if we have a multi avatar setup
if (additionalPublicKey != null) { if (additionalPublicKey != null) {
setProfilePictureIfNeeded(binding.doubleModeImageView1, publicKey, displayName) setProfilePictureIfNeeded(binding.doubleModeImageView1, publicKey, displayName)
setProfilePictureIfNeeded(binding.doubleModeImageView2, additionalPublicKey, additionalDisplayName) setProfilePictureIfNeeded(binding.doubleModeImageView2, additionalPublicKey, additionalDisplayName)
binding.doubleModeImageViewContainer.visibility = View.VISIBLE binding.doubleModeImageViewContainer.visibility = View.VISIBLE
} else {
// clear single image
glide.clear(binding.singleModeImageView)
binding.singleModeImageView.visibility = View.INVISIBLE
} else { // single image mode
setProfilePictureIfNeeded(binding.singleModeImageView, publicKey, displayName)
binding.singleModeImageView.visibility = View.VISIBLE
// clear multi image
glide.clear(binding.doubleModeImageView1) glide.clear(binding.doubleModeImageView1)
glide.clear(binding.doubleModeImageView2) glide.clear(binding.doubleModeImageView2)
binding.doubleModeImageViewContainer.visibility = View.INVISIBLE binding.doubleModeImageViewContainer.visibility = View.INVISIBLE
} }
if (additionalPublicKey == null && !isLarge) {
setProfilePictureIfNeeded(binding.singleModeImageView, publicKey, displayName)
binding.singleModeImageView.visibility = View.VISIBLE
} else {
glide.clear(binding.singleModeImageView)
binding.singleModeImageView.visibility = View.INVISIBLE
}
if (additionalPublicKey == null && isLarge) {
setProfilePictureIfNeeded(binding.largeSingleModeImageView, publicKey, displayName)
binding.largeSingleModeImageView.visibility = View.VISIBLE
} else {
glide.clear(binding.largeSingleModeImageView)
binding.largeSingleModeImageView.visibility = View.INVISIBLE
}
} }
private fun setProfilePictureIfNeeded(imageView: ImageView, publicKey: String, displayName: String?) { private fun setProfilePictureIfNeeded(imageView: ImageView, publicKey: String, displayName: String?) {

View File

@ -56,7 +56,6 @@ class UserDetailsBottomSheet: BottomSheetDialogFragment() {
val threadRecipient = threadDb.getRecipientForThreadId(threadID) ?: return dismiss() val threadRecipient = threadDb.getRecipientForThreadId(threadID) ?: return dismiss()
with(binding) { with(binding) {
profilePictureView.publicKey = publicKey profilePictureView.publicKey = publicKey
profilePictureView.isLarge = true
profilePictureView.update(recipient) profilePictureView.update(recipient)
nameTextViewContainer.visibility = View.VISIBLE nameTextViewContainer.visibility = View.VISIBLE
nameTextViewContainer.setOnClickListener { nameTextViewContainer.setOnClickListener {

View File

@ -122,7 +122,6 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
view.apply { view.apply {
publicKey = hexEncodedPublicKey publicKey = hexEncodedPublicKey
displayName = getDisplayName() displayName = getDisplayName()
isLarge = true
update() update()
} }
} }

View File

@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape <shape
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="oval">
<solid android:color="@color/profile_picture_background" /> <solid android:color="@color/profile_picture_background" />
<corners android:radius="40dp" />
</shape> </shape>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/profile_picture_background" />
<corners android:radius="23dp" />
</shape>

View File

@ -23,8 +23,20 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"/> android:layout_gravity="center"/>
</FrameLayout> </FrameLayout>
<ImageView
android:id="@+id/remote_recipient" <org.thoughtcrime.securesms.components.ProfilePictureView
android:id="@+id/userAvatar"
app:layout_constraintStart_toStartOf="@id/fullscreen_renderer_container"
app:layout_constraintEnd_toEndOf="@id/fullscreen_renderer_container"
app:layout_constraintTop_toTopOf="@id/fullscreen_renderer_container"
app:layout_constraintBottom_toBottomOf="@id/fullscreen_renderer_container"
app:layout_constraintVertical_bias="0.4"
android:layout_width="@dimen/extra_large_profile_picture_size"
android:layout_height="@dimen/extra_large_profile_picture_size"
android:visibility="gone"/>
<org.thoughtcrime.securesms.components.ProfilePictureView
android:id="@+id/contactAvatar"
app:layout_constraintStart_toStartOf="@id/fullscreen_renderer_container" app:layout_constraintStart_toStartOf="@id/fullscreen_renderer_container"
app:layout_constraintEnd_toEndOf="@id/fullscreen_renderer_container" app:layout_constraintEnd_toEndOf="@id/fullscreen_renderer_container"
app:layout_constraintTop_toTopOf="@id/fullscreen_renderer_container" app:layout_constraintTop_toTopOf="@id/fullscreen_renderer_container"
@ -71,9 +83,9 @@
android:foregroundGravity="center" android:foregroundGravity="center"
android:visibility="gone" android:visibility="gone"
app:SpinKit_Color="@color/core_white" app:SpinKit_Color="@color/core_white"
app:layout_constraintEnd_toEndOf="@+id/remote_recipient" app:layout_constraintEnd_toEndOf="@+id/contactAvatar"
app:layout_constraintStart_toStartOf="@+id/remote_recipient" app:layout_constraintStart_toStartOf="@+id/contactAvatar"
app:layout_constraintTop_toBottomOf="@id/remote_recipient" app:layout_constraintTop_toBottomOf="@id/contactAvatar"
tools:visibility="visible" /> tools:visibility="visible" />
<TextView <TextView

View File

@ -27,17 +27,11 @@
</RelativeLayout> </RelativeLayout>
<ImageView <ImageView
android:scaleType="centerCrop"
android:id="@+id/singleModeImageView" android:id="@+id/singleModeImageView"
android:layout_width="@dimen/medium_profile_picture_size"
android:layout_height="@dimen/medium_profile_picture_size"
android:background="@drawable/profile_picture_view_medium_background" />
<ImageView
android:id="@+id/largeSingleModeImageView"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:layout_width="@dimen/large_profile_picture_size" android:layout_width="match_parent"
android:layout_height="@dimen/large_profile_picture_size" android:layout_height="match_parent"
android:background="@drawable/profile_picture_view_large_background" /> android:adjustViewBounds="true"
android:background="@drawable/profile_picture_view_background" />
</merge> </merge>