From 2a7b08fe648713337ed194110980c5ef9e3bb501 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Mon, 17 Feb 2025 04:55:16 +0200 Subject: [PATCH] Fix/ses 3326 unpin legacy groups (#949) * SES-3326 ability to unpin legacy group post deprecation * Reusing naming logic for contacts and recipients Should fix SES-3323 and SES-3320 --- .../securesms/calls/WebRtcCallActivity.kt | 8 +- .../securesms/components/FromTextView.java | 2 +- .../components/ProfilePictureView.kt | 19 ++--- .../securesms/contacts/UserView.kt | 5 +- .../v2/MessageDetailsViewModel.kt | 2 +- .../conversation/v2/dialogs/BlockedDialog.kt | 6 +- .../v2/mention/MentionViewModel.kt | 2 +- .../v2/messages/ControlMessageView.kt | 8 +- .../conversation/v2/messages/QuoteView.kt | 3 +- .../securesms/database/Storage.kt | 14 ++++ .../database/model/ThreadRecord.java | 11 +-- .../groups/BaseGroupMembersViewModel.kt | 3 +- .../securesms/groups/GroupManagerV2Impl.kt | 2 +- .../securesms/groups/OpenGroupUtilities.kt | 48 ----------- .../legacy/CreateLegacyGroupViewModel.kt | 2 +- .../home/ConversationOptionsBottomSheet.kt | 2 +- .../securesms/home/UserDetailsBottomSheet.kt | 4 +- .../home/search/GlobalSearchAdapterUtils.kt | 2 +- .../MultipleRecipientNotificationBuilder.kt | 11 ++- .../SingleRecipientNotificationBuilder.java | 13 ++- .../reactions/ReactionRecipientsAdapter.java | 3 - .../securesms/webrtc/CallViewModel.kt | 8 +- .../conversation/v2/MentionViewModelTest.kt | 2 +- .../libsession/database/StorageProtocol.kt | 1 + .../libsession/messaging/contacts/Contact.kt | 7 +- .../messaging/groups/GroupInviteException.kt | 2 +- .../utilities/UpdateMessageBuilder.kt | 82 +++++++++---------- .../session/libsession/utilities/GroupUtil.kt | 17 ---- .../utilities/recipients/Recipient.java | 19 +---- .../recipients/RecipientProvider.java | 2 +- 30 files changed, 108 insertions(+), 202 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupUtilities.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/WebRtcCallActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/WebRtcCallActivity.kt index 9fdc6b1063..bd288d11a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/WebRtcCallActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/WebRtcCallActivity.kt @@ -343,7 +343,7 @@ class WebRtcCallActivity : PassphraseRequiredActionBarActivity() { if (latestRecipient.recipient != null) { val contactPublicKey = latestRecipient.recipient.address.serialize() - val contactDisplayName = getUserDisplayName(contactPublicKey) + val contactDisplayName = viewModel.getUserName(contactPublicKey) supportActionBar?.title = contactDisplayName binding.remoteRecipientName.text = contactDisplayName @@ -440,12 +440,6 @@ class WebRtcCallActivity : PassphraseRequiredActionBarActivity() { binding.contactAvatar.isVisible = false } - private fun getUserDisplayName(publicKey: String): String { - val contact = - DatabaseComponent.get(this).sessionContactDatabase().getContactWithAccountID(publicKey) - return contact?.displayName(Contact.ContactContext.REGULAR) ?: publicKey - } - override fun onStop() { super.onStop() uiJob?.cancel() diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java index ae9f5e6e70..8a8d15a8e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java @@ -55,7 +55,7 @@ public class FromTextView extends EmojiTextView { if (recipient.isLocalNumber()) { builder.append(getContext().getString(R.string.noteToSelf)); - } else if (recipient.getName() == null && !TextUtils.isEmpty(recipient.getProfileName())) { + } else if (!TextUtils.isEmpty(recipient.getProfileName())) { SpannableString profileName = new SpannableString(" (~" + recipient.getProfileName() + ") "); profileName.setSpan(new CenterAlignedRelativeSizeSpan(0.75f), 0, profileName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); profileName.setSpan(new TypefaceSpan("sans-serif-light"), 0, profileName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt b/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt index ccb11a503a..f6c47937d2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt @@ -7,28 +7,23 @@ import android.view.LayoutInflater import android.view.View import android.widget.ImageView import android.widget.RelativeLayout +import com.bumptech.glide.Glide +import com.bumptech.glide.RequestManager import com.bumptech.glide.load.engine.DiskCacheStrategy +import dagger.hilt.android.AndroidEntryPoint import network.loki.messenger.R import network.loki.messenger.databinding.ViewProfilePictureBinding import org.session.libsession.avatars.ContactColors import org.session.libsession.avatars.PlaceholderAvatarPhoto import org.session.libsession.avatars.ProfileContactPhoto import org.session.libsession.avatars.ResourceContactPhoto -import org.session.libsession.messaging.contacts.Contact +import org.session.libsession.database.StorageProtocol import org.session.libsession.utilities.Address import org.session.libsession.utilities.AppTextSecurePreferences import org.session.libsession.utilities.GroupUtil import org.session.libsession.utilities.recipients.Recipient import org.session.libsignal.utilities.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.RequestManager -import dagger.hilt.android.AndroidEntryPoint -import org.session.libsession.database.StorageProtocol -import org.session.libsignal.utilities.AccountId import org.thoughtcrime.securesms.database.GroupDatabase -import org.thoughtcrime.securesms.database.SessionContactDatabase -import org.thoughtcrime.securesms.database.Storage -import org.thoughtcrime.securesms.dependencies.ConfigFactory import javax.inject.Inject @AndroidEntryPoint @@ -47,9 +42,6 @@ class ProfilePictureView @JvmOverloads constructor( var additionalDisplayName: String? = null var recipient: Recipient? = null - @Inject - lateinit var contactDatabase: SessionContactDatabase - @Inject lateinit var groupDatabase: GroupDatabase @@ -91,8 +83,7 @@ class ProfilePictureView @JvmOverloads constructor( isGroupsV2Recipient: Boolean = false, ) { fun getUserDisplayName(publicKey: String): String = prefs.takeIf { userPublicKey == publicKey }?.getProfileName() - ?: contactDatabase.getContactWithAccountID(publicKey)?.displayName(Contact.ContactContext.REGULAR) - ?: publicKey + ?: storage.getContactNameWithAccountID(publicKey) if (isLegacyGroupRecipient || isGroupsV2Recipient) { val members = if (isLegacyGroupRecipient) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/UserView.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/UserView.kt index ff0fbc65c9..95710d936e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/UserView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/UserView.kt @@ -11,6 +11,7 @@ import org.session.libsession.messaging.contacts.Contact import org.session.libsession.utilities.recipients.Recipient import org.thoughtcrime.securesms.dependencies.DatabaseComponent import com.bumptech.glide.RequestManager +import org.session.libsession.messaging.MessagingModuleConfiguration class UserView : LinearLayout { private lateinit var binding: ViewUserBinding @@ -49,8 +50,8 @@ class UserView : LinearLayout { fun getUserDisplayName(publicKey: String): String { if (isLocalUser) return context.getString(R.string.you) - val contact = DatabaseComponent.get(context).sessionContactDatabase().getContactWithAccountID(publicKey) - return contact?.displayName(Contact.ContactContext.REGULAR) ?: publicKey + + return MessagingModuleConfiguration.shared.storage.getContactNameWithAccountID(publicKey) } val address = user.address.serialize() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailsViewModel.kt index caaff7a66a..932384a7be 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailsViewModel.kt @@ -87,7 +87,7 @@ class MessageDetailsViewModel @Inject constructor( sent = dateSent.let(::Date).toString().let { TitledText(R.string.sent, it) }, received = dateReceived.let(::Date).toString().let { TitledText(R.string.received, it) }, error = lokiMessageDatabase.getErrorMessage(id)?.let { TitledText(R.string.theError, it) }, - senderInfo = individualRecipient.run { name?.let { TitledText(it, address.serialize()) } }, + senderInfo = individualRecipient.run { TitledText(name, address.serialize()) }, sender = individualRecipient, thread = recipient, readOnly = isDeprecatedLegacyGroup, diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/dialogs/BlockedDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/dialogs/BlockedDialog.kt index 9113f8ed46..894b28a2f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/dialogs/BlockedDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/dialogs/BlockedDialog.kt @@ -10,21 +10,17 @@ import android.text.style.StyleSpan import androidx.fragment.app.DialogFragment import network.loki.messenger.R import org.session.libsession.messaging.MessagingModuleConfiguration -import org.session.libsession.messaging.contacts.Contact import org.session.libsession.utilities.StringSubstitutionConstants.NAME_KEY import org.session.libsession.utilities.recipients.Recipient import org.thoughtcrime.securesms.createSessionDialog -import org.thoughtcrime.securesms.dependencies.DatabaseComponent import org.thoughtcrime.securesms.ui.getSubbedCharSequence /** Shown upon sending a message to a user that's blocked. */ class BlockedDialog(private val recipient: Recipient, private val context: Context) : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = createSessionDialog { - val contactDB = DatabaseComponent.get(requireContext()).sessionContactDatabase() val accountID = recipient.address.toString() - val contact = contactDB.getContactWithAccountID(accountID) - val name = contact?.displayName(Contact.ContactContext.REGULAR) ?: accountID + val name = MessagingModuleConfiguration.shared.storage.getContactNameWithAccountID(accountID) val explanationCS = context.getSubbedCharSequence(R.string.blockUnblockName, NAME_KEY to name) val spannable = SpannableStringBuilder(explanationCS) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/mention/MentionViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/mention/MentionViewModel.kt index 50a83477d3..83f6b8af92 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/mention/MentionViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/mention/MentionViewModel.kt @@ -162,7 +162,7 @@ class MentionViewModel( .map { contact -> Member( publicKey = contact.accountID, - name = contact.displayName(contactContext).orEmpty(), + name = contact.displayName(contactContext), isModerator = contact.accountID in moderatorIDs, isMe = false ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt index 8360ef1dba..00c9d0292a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt @@ -158,13 +158,13 @@ class ControlMessageView : LinearLayout { context.showSessionDialog { val titleTxt = context.getSubbedString( R.string.callsMissedCallFrom, - NAME_KEY to message.individualRecipient.name!! + NAME_KEY to message.individualRecipient.name ) title(titleTxt) val bodyTxt = context.getSubbedCharSequence( R.string.callsYouMissedCallPermissions, - NAME_KEY to message.individualRecipient.name!! + NAME_KEY to message.individualRecipient.name ) text(bodyTxt) @@ -187,13 +187,13 @@ class ControlMessageView : LinearLayout { context.showSessionDialog { val titleTxt = context.getSubbedString( R.string.callsMissedCallFrom, - NAME_KEY to message.individualRecipient.name!! + NAME_KEY to message.individualRecipient.name ) title(titleTxt) val bodyTxt = context.getSubbedCharSequence( R.string.callsMicrophonePermissionsRequired, - NAME_KEY to message.individualRecipient.name!! + NAME_KEY to message.individualRecipient.name ) text(bodyTxt) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt index 43f5178e4f..c78fb4f96a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt @@ -19,6 +19,7 @@ import org.session.libsession.utilities.recipients.Recipient import org.thoughtcrime.securesms.conversation.v2.utilities.MentionUtilities import org.thoughtcrime.securesms.database.SessionContactDatabase import com.bumptech.glide.RequestManager +import org.session.libsession.utilities.truncateIdForDisplay import org.thoughtcrime.securesms.mms.SlideDeck import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.getAccentColor @@ -76,7 +77,7 @@ class QuoteView @JvmOverloads constructor(context: Context, attrs: AttributeSet? val authorDisplayName = if (quoteIsLocalUser) context.getString(R.string.you) - else author?.displayName(Contact.contextForRecipient(thread)) ?: "${authorPublicKey.take(4)}...${authorPublicKey.takeLast(4)}" + else author?.displayName(Contact.contextForRecipient(thread)) ?: truncateIdForDisplay(authorPublicKey) binding.quoteViewAuthorTextView.text = authorDisplayName binding.quoteViewAuthorTextView.setTextColor(getTextColor(isOutgoingMessage)) // Body diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index 239c840398..d3164ab0a5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -8,6 +8,7 @@ import java.security.MessageDigest import network.loki.messenger.libsession_util.ConfigBase.Companion.PRIORITY_HIDDEN import network.loki.messenger.libsession_util.ConfigBase.Companion.PRIORITY_PINNED import network.loki.messenger.libsession_util.ConfigBase.Companion.PRIORITY_VISIBLE +import network.loki.messenger.libsession_util.getOrNull import network.loki.messenger.libsession_util.util.BaseCommunityInfo import network.loki.messenger.libsession_util.util.ExpiryMode import network.loki.messenger.libsession_util.util.GroupDisplayInfo @@ -17,6 +18,7 @@ import org.session.libsession.avatars.AvatarHelper import org.session.libsession.database.MessageDataProvider import org.session.libsession.database.StorageProtocol import org.session.libsession.messaging.BlindedIdMapping +import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.messaging.calls.CallMessageType import org.session.libsession.messaging.contacts.Contact import org.session.libsession.messaging.jobs.AttachmentUploadJob @@ -67,6 +69,7 @@ import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.Recipient.DisappearingState import org.session.libsession.utilities.recipients.MessageType import org.session.libsession.utilities.recipients.getType +import org.session.libsession.utilities.truncateIdForDisplay import org.session.libsignal.crypto.ecc.DjbECPublicKey import org.session.libsignal.crypto.ecc.ECKeyPair import org.session.libsignal.messages.SignalServiceAttachmentPointer @@ -1238,6 +1241,17 @@ open class Storage @Inject constructor( return sessionContactDatabase.getContactWithAccountID(accountID) } + override fun getContactNameWithAccountID(accountID: String, groupId: AccountId?, contactContext: Contact.ContactContext): String { + val contact = sessionContactDatabase.getContactWithAccountID(accountID) + // first attempt to get the name from the contact + val userName: String? = contact?.displayName(contactContext) + ?: if(groupId != null){ + configFactory.withGroupConfigs(groupId) { it.groupMembers.getOrNull(accountID)?.name } + } else null + + return userName ?: truncateIdForDisplay(accountID) + } + override fun getAllContacts(): Set { return sessionContactDatabase.getAllContacts() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java index 59c47e297c..35818af2cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java @@ -94,17 +94,8 @@ public class ThreadRecord extends DisplayRecord { this.groupThreadStatus = groupThreadStatus; } - public @Nullable Uri getSnippetUri() { - return snippetUri; - } - private String getName() { - String name = getRecipient().getName(); - if (name == null) { - Log.w("ThreadRecord", "Got a null name - using: Unknown"); - name = "Unknown"; - } - return name; + return getRecipient().getName(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/BaseGroupMembersViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/BaseGroupMembersViewModel.kt index 5acbba02e3..dbea353b4e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/BaseGroupMembersViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/BaseGroupMembersViewModel.kt @@ -20,7 +20,6 @@ import network.loki.messenger.libsession_util.util.GroupMember import org.session.libsession.database.StorageProtocol import org.session.libsession.utilities.ConfigFactoryProtocol import org.session.libsession.utilities.ConfigUpdateNotification -import org.session.libsession.utilities.getMemberName import org.session.libsignal.utilities.AccountId import java.util.EnumSet @@ -78,7 +77,7 @@ abstract class BaseGroupMembersViewModel ( val name = if (isMyself) { context.getString(R.string.you) } else { - member.getMemberName(configFactory) + storage.getContactNameWithAccountID(member.accountId.hexString, groupId) } val highlightStatus = status in EnumSet.of( diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt index 6ec1584568..558d8e8327 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt @@ -135,7 +135,7 @@ class GroupManagerV2Impl @Inject constructor( for (member in memberAsRecipients) { configs.groupMembers.set( configs.groupMembers.getOrConstruct(member.address.serialize()).apply { - setName(member.name.orEmpty()) + setName(member.name) setProfilePic(member.profileAvatar?.let { url -> member.profileKey?.let { key -> UserPic(url, key) } } ?: UserPic.DEFAULT) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupUtilities.kt deleted file mode 100644 index f2147aaf37..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupUtilities.kt +++ /dev/null @@ -1,48 +0,0 @@ -package org.thoughtcrime.securesms.groups - -import android.content.Context -import androidx.annotation.WorkerThread -import org.greenrobot.eventbus.EventBus -import org.session.libsession.messaging.open_groups.OpenGroupApi -import org.session.libsession.utilities.GroupUtil -import org.session.libsession.utilities.recipients.Recipient -import org.thoughtcrime.securesms.dependencies.DatabaseComponent -import java.util.* - -//TODO Refactor so methods declare specific type of checked exceptions and not generalized Exception. -object OpenGroupUtilities { - - private const val TAG = "OpenGroupUtilities" - - /** - * Pulls the general public chat data from the server and updates related records. - * Fires [GroupInfoUpdatedEvent] on [EventBus] upon success. - * - * Consider using [org.thoughtcrime.securesms.loki.api.PublicChatInfoUpdateWorker] for lazy approach. - */ - @JvmStatic - @WorkerThread - @Throws(Exception::class) - fun updateGroupInfo(context: Context, server: String, room: String) { - val groupId = GroupUtil.getEncodedOpenGroupID("$server.$room".toByteArray()) - if (!DatabaseComponent.get(context).groupDatabase().hasGroup(groupId)) { - throw IllegalStateException("Attempt to update open group info for non-existent DB record: $groupId") - } - - val info = OpenGroupApi.getRoomInfo(room, server).get() // store info again? - - EventBus.getDefault().post(GroupInfoUpdatedEvent(server, room = room)) - } - - /** - * Return a generated name for users in the style of `$name (...$hex.takeLast(8))` for public groups - */ - @JvmStatic - fun getDisplayName(recipient: Recipient): String { - return String.format(Locale.ROOT, PUBLIC_GROUP_STRING_FORMAT, recipient.name, recipient.address.serialize().takeLast(8)) - } - - const val PUBLIC_GROUP_STRING_FORMAT = "%s (...%s)" - - data class GroupInfoUpdatedEvent(val url: String, val channel: Long = -1, val room: String = "") -} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/legacy/CreateLegacyGroupViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/legacy/CreateLegacyGroupViewModel.kt index 1e76872d88..64d639cda4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/legacy/CreateLegacyGroupViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/legacy/CreateLegacyGroupViewModel.kt @@ -40,7 +40,7 @@ class CreateLegacyGroupViewModel @Inject constructor( fun filter(query: String): List { return _recipients.value?.filter { - it.address.serialize().contains(query, ignoreCase = true) || it.name?.contains(query, ignoreCase = true) == true + it.address.serialize().contains(query, ignoreCase = true) || it.name.contains(query, ignoreCase = true) } ?: emptyList() } } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt index 15b503c9e8..3ba2b25c88 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt @@ -152,7 +152,7 @@ class ConversationOptionsBottomSheet(private val parentContext: Context) : Botto && !isDeprecatedLegacyGroup binding.markAllAsReadTextView.setOnClickListener(this) binding.pinTextView.isVisible = !thread.isPinned && !isDeprecatedLegacyGroup - binding.unpinTextView.isVisible = thread.isPinned && !isDeprecatedLegacyGroup + binding.unpinTextView.isVisible = thread.isPinned binding.pinTextView.setOnClickListener(this) binding.unpinTextView.setOnClickListener(this) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/UserDetailsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/home/UserDetailsBottomSheet.kt index c21f7d37e8..6571921622 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/UserDetailsBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/UserDetailsBottomSheet.kt @@ -84,7 +84,7 @@ class UserDetailsBottomSheet: BottomSheetDialogFragment() { else -> return@setOnEditorActionListener false } } - nameTextView.text = recipient.name ?: publicKey // Uses the Contact API internally + nameTextView.text = recipient.name nameEditIcon.isVisible = threadRecipient.isContactRecipient && !threadRecipient.isCommunityInboxRecipient @@ -140,7 +140,7 @@ class UserDetailsBottomSheet: BottomSheetDialogFragment() { val contact = storage.getContactWithAccountID(publicKey) ?: Contact(publicKey) contact.nickname = newNickName storage.setContact(contact) - nameTextView.text = recipient.name ?: publicKey // Uses the Contact API internally + nameTextView.text = recipient.name } @SuppressLint("ServiceCast") diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchAdapterUtils.kt b/app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchAdapterUtils.kt index 58afdae7b6..4e74a5d220 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchAdapterUtils.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchAdapterUtils.kt @@ -146,7 +146,7 @@ fun ContentView.bindModel(query: String?, model: Message) = binding.apply { } fun Recipient.getSearchName(): String = - name?.takeIf { it.isNotEmpty() && !it.looksLikeAccountId } + name.takeIf { it.isNotEmpty() && !it.looksLikeAccountId } ?: address.serialize().let(::truncateIdForDisplay) fun Contact.getSearchName(): String = diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.kt index dc13beed33..377c3e6237 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.kt @@ -8,6 +8,7 @@ import android.text.SpannableStringBuilder import androidx.core.app.NotificationCompat import com.squareup.phrase.Phrase import network.loki.messenger.R +import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.messaging.contacts.Contact import org.session.libsession.utilities.NotificationPrivacyPreference import org.session.libsession.utilities.StringSubstitutionConstants.CONVERSATION_COUNT_KEY @@ -102,11 +103,9 @@ class MultipleRecipientNotificationBuilder(context: Context, privacy: Notificati * @param openGroupRecipient whether in an open group context */ private fun getGroupDisplayName(recipient: Recipient, openGroupRecipient: Boolean): String { - val contactDB = get(context).sessionContactDatabase() - val accountID = recipient.address.serialize() - val contact = contactDB.getContactWithAccountID(accountID) ?: return accountID - val displayName = contact.displayName(if (openGroupRecipient) Contact.ContactContext.OPEN_GROUP else Contact.ContactContext.REGULAR) - if (displayName == null) { return accountID } - return displayName + return MessagingModuleConfiguration.shared.storage.getContactNameWithAccountID( + accountID = recipient.address.serialize(), + contactContext = if (openGroupRecipient) Contact.ContactContext.OPEN_GROUP else Contact.ContactContext.REGULAR + ) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java index 0b22de8d3b..9f252ad8e1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java @@ -27,6 +27,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.session.libsession.avatars.ContactPhoto; +import org.session.libsession.messaging.MessagingModuleConfiguration; import org.session.libsession.messaging.contacts.Contact; import org.session.libsession.utilities.NotificationPrivacyPreference; import org.session.libsession.utilities.Util; @@ -330,12 +331,10 @@ public class SingleRecipientNotificationBuilder extends AbstractNotificationBuil * @param openGroupRecipient whether in an open group context */ private String getGroupDisplayName(Recipient recipient, boolean openGroupRecipient) { - SessionContactDatabase contactDB = DatabaseComponent.get(context).sessionContactDatabase(); - String accountID = recipient.getAddress().serialize(); - Contact contact = contactDB.getContactWithAccountID(accountID); - if (contact == null) { return accountID; } - String displayName = contact.displayName(openGroupRecipient ? Contact.ContactContext.OPEN_GROUP : Contact.ContactContext.REGULAR); - if (displayName == null) { return accountID; } - return displayName; + return MessagingModuleConfiguration.getShared().getStorage().getContactNameWithAccountID( + recipient.getAddress().serialize(), + null, + openGroupRecipient ? Contact.ContactContext.OPEN_GROUP : Contact.ContactContext.REGULAR + ); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java index a1eace1e29..28662e894a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java @@ -163,9 +163,6 @@ final class ReactionRecipientsAdapter extends RecyclerView.Adapter val name = - memberContacts[index].displayName(Contact.ContactContext.OPEN_GROUP).orEmpty() + memberContacts[index].displayName(Contact.ContactContext.OPEN_GROUP) MentionViewModel.Candidate( MentionViewModel.Member(m.pubKey, name, m.roles.any { it.isModerator }, isMe = false), diff --git a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt index cdb6b439e6..f185cc1cd1 100644 --- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -209,6 +209,7 @@ interface StorageProtocol { // Contacts fun getContactWithAccountID(accountID: String): Contact? + fun getContactNameWithAccountID(accountID: String, groupId: AccountId? = null, contactContext: Contact.ContactContext = Contact.ContactContext.REGULAR): String fun getAllContacts(): Set fun setContact(contact: Contact) fun getRecipientForThread(threadId: Long): Recipient? diff --git a/libsession/src/main/java/org/session/libsession/messaging/contacts/Contact.kt b/libsession/src/main/java/org/session/libsession/messaging/contacts/Contact.kt index 229c360afc..6d899da758 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/contacts/Contact.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/contacts/Contact.kt @@ -3,6 +3,7 @@ package org.session.libsession.messaging.contacts import android.os.Parcelable import kotlinx.parcelize.Parcelize import org.session.libsession.utilities.recipients.Recipient +import org.session.libsession.utilities.truncateIdForDisplay @Parcelize class Contact( @@ -38,12 +39,12 @@ class Contact( /** * The name to display in the UI. For local use only. */ - fun displayName(context: ContactContext): String? = nickname ?: when (context) { + fun displayName(context: ContactContext = ContactContext.REGULAR): String = nickname ?: when (context) { ContactContext.REGULAR -> name // In open groups, where it's more likely that multiple users have the same name, // we display a bit of the Account ID after a user's display name for added context. - ContactContext.OPEN_GROUP -> name?.let { "$it (${accountID.take(4)}...${accountID.takeLast(4)})" } - } + ContactContext.OPEN_GROUP -> name?.let { "$it (${truncateIdForDisplay(accountID)})" } + } ?: truncateIdForDisplay(accountID) enum class ContactContext { REGULAR, OPEN_GROUP diff --git a/libsession/src/main/java/org/session/libsession/messaging/groups/GroupInviteException.kt b/libsession/src/main/java/org/session/libsession/messaging/groups/GroupInviteException.kt index d8ffab0f3a..9b0adf8f7d 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/groups/GroupInviteException.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/groups/GroupInviteException.kt @@ -32,7 +32,7 @@ class GroupInviteException( fun format(context: Context, storage: StorageProtocol): CharSequence { val getInviteeName = { accountId: String -> - storage.getContactWithAccountID(accountId)?.name ?: truncateIdForDisplay(accountId) + storage.getContactNameWithAccountID(accountId) } val first = inviteeAccountIds.first().let(getInviteeName) diff --git a/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageBuilder.kt b/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageBuilder.kt index fb171eb608..0045c31c52 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageBuilder.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageBuilder.kt @@ -34,14 +34,8 @@ object UpdateMessageBuilder { val storage = MessagingModuleConfiguration.shared.storage - private fun getSenderName(senderId: String) = storage.getContactWithAccountID(senderId) - ?.displayName(Contact.ContactContext.REGULAR) - ?: truncateIdForDisplay(senderId) - - private fun getGroupMemberName(groupId: AccountId?, memberId: String) = - storage.getContactWithAccountID(memberId)?.displayName(Contact.ContactContext.REGULAR) - ?: groupId?.let{ MessagingModuleConfiguration.shared.configFactory.withGroupConfigs(it) { it.groupMembers.getOrNull(memberId)?.name } } - ?: truncateIdForDisplay(memberId) + private fun getGroupMemberName(memberId: String, groupId: AccountId? = null) = + storage.getContactNameWithAccountID(memberId, groupId) @JvmStatic fun buildGroupUpdateMessage( @@ -86,19 +80,19 @@ object UpdateMessageBuilder { } 1 -> { Phrase.from(context, R.string.legacyGroupMemberNew) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) .format() } 2 -> { Phrase.from(context, R.string.legacyGroupMemberTwoNew) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(1), groupV2Id)) .format() } else -> { val newMemberCountMinusOne = newMemberCount - 1 Phrase.from(context, R.string.legacyGroupMemberNewMultiple) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) .put(COUNT_KEY, newMemberCountMinusOne) .format() } @@ -126,14 +120,14 @@ object UpdateMessageBuilder { "" // Return an empty string - we don't want to show the error in the conversation } 1 -> Phrase.from(context, R.string.groupRemoved) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) .format() 2 -> Phrase.from(context, R.string.groupRemovedTwo) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(1), groupV2Id)) .format() else -> Phrase.from(context, R.string.groupRemovedMultiple) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) .put(COUNT_KEY, updateData.updatedMembers.size - 1) .format() } @@ -150,14 +144,14 @@ object UpdateMessageBuilder { "" // Return an empty string - we don't want to show the error in the conversation } 1 -> Phrase.from(context, R.string.groupRemoved) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) .format() 2 -> Phrase.from(context, R.string.groupRemovedTwo) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(1), groupV2Id)) .format() else -> Phrase.from(context, R.string.groupRemovedMultiple) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) .put(COUNT_KEY, updateData.updatedMembers.size - 1) .format() } @@ -173,14 +167,14 @@ object UpdateMessageBuilder { "" // Return an empty string - we don't want to show the error in the conversation } 1 -> Phrase.from(context, R.string.groupMemberLeft) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) .format() 2 -> Phrase.from(context, R.string.groupMemberLeftTwo) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(1), groupV2Id)) .format() else -> Phrase.from(context, R.string.groupMemberLeftMultiple) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(updateData.updatedMembers.elementAt(0), groupV2Id)) .put(COUNT_KEY, updateData.updatedMembers.size - 1) .format() } @@ -208,16 +202,16 @@ object UpdateMessageBuilder { .format() number == 1 -> Phrase.from(context, if (historyShared) R.string.groupMemberNewHistory else R.string.groupMemberNew) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first(), groupV2Id)) .format() number == 2 && containsUser -> Phrase.from(context, if (historyShared) R.string.groupMemberNewYouHistoryTwo else R.string.groupInviteYouAndOtherNew) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first { it != userPublicKey })) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.sessionIds.first { it != userPublicKey }, groupV2Id)) .format() number == 2 -> Phrase.from(context, if (historyShared) R.string.groupMemberNewHistoryTwo else R.string.groupMemberNewTwo) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.last())) + .put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first(), groupV2Id)) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.sessionIds.last(), groupV2Id)) .format() containsUser -> Phrase.from(context, if (historyShared) R.string.groupMemberNewYouHistoryMultiple else R.string.groupInviteYouAndMoreNew) @@ -225,7 +219,7 @@ object UpdateMessageBuilder { .format() number > 0 -> Phrase.from(context, if (historyShared) R.string.groupMemberNewHistoryMultiple else R.string.groupMemberNewMultiple) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first(), groupV2Id)) .put(COUNT_KEY, updateData.sessionIds.size - 1) .format() else -> "" @@ -239,16 +233,16 @@ object UpdateMessageBuilder { ) number == 1 -> Phrase.from(context, R.string.adminPromotedToAdmin) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first(), groupV2Id)) .format() number == 2 && containsUser -> Phrase.from(context, R.string.groupPromotedYouTwo) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first{ it != userPublicKey })) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.sessionIds.first{ it != userPublicKey }, groupV2Id)) .format() number == 2 -> Phrase.from(context, R.string.adminTwoPromotedToAdmin) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.last())) + .put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first(), groupV2Id)) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.sessionIds.last(), groupV2Id)) .format() containsUser -> Phrase.from(context, R.string.groupPromotedYouMultiple) @@ -256,7 +250,7 @@ object UpdateMessageBuilder { .format() else -> Phrase.from(context, R.string.adminMorePromotedToAdmin) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first(), groupV2Id)) .put(COUNT_KEY, updateData.sessionIds.size - 1) .format() } @@ -268,16 +262,16 @@ object UpdateMessageBuilder { R.string.groupRemovedYouGeneral).format() number == 1 -> Phrase.from(context, R.string.groupRemoved) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first(), groupV2Id)) .format() number == 2 && containsUser -> Phrase.from(context, R.string.groupRemovedYouTwo) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first { it != userPublicKey })) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.sessionIds.first { it != userPublicKey }, groupV2Id)) .format() number == 2 -> Phrase.from(context, R.string.groupRemovedTwo) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) - .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.last())) + .put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first(), groupV2Id)) + .put(OTHER_NAME_KEY, getGroupMemberName(updateData.sessionIds.last(), groupV2Id)) .format() containsUser -> Phrase.from(context, R.string.groupRemovedYouMultiple) @@ -285,7 +279,7 @@ object UpdateMessageBuilder { .format() else -> Phrase.from(context, R.string.groupRemovedMultiple) - .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(updateData.sessionIds.first(), groupV2Id)) .put(COUNT_KEY, updateData.sessionIds.size - 1) .format() } @@ -295,7 +289,7 @@ object UpdateMessageBuilder { } is UpdateMessageData.Kind.GroupInvitation -> { val approved = configFactory.getGroup(AccountId(updateData.groupAccountId))?.invited == false - val inviterName = updateData.invitingAdminName?.takeIf { it.isNotEmpty() } ?: getGroupMemberName(groupV2Id, updateData.invitingAdminId) + val inviterName = updateData.invitingAdminName?.takeIf { it.isNotEmpty() } ?: getGroupMemberName(updateData.invitingAdminId, groupV2Id) return if (!approved) { Phrase.from(context, R.string.messageRequestGroupInvite) .put(NAME_KEY, inviterName) @@ -336,7 +330,7 @@ object UpdateMessageBuilder { return "" } - val senderName = if (isOutgoing) context.getString(R.string.you) else getSenderName(senderId!!) + val senderName = if (isOutgoing) context.getString(R.string.you) else getGroupMemberName(senderId!!) // Case 1.) Disappearing messages have been turned off.. if (duration <= 0) { @@ -393,7 +387,7 @@ object UpdateMessageBuilder { kind: DataExtractionNotificationInfoMessage.Kind, senderId: String? = null): CharSequence { - val senderName = if (senderId != null) getSenderName(senderId) else context.getString(R.string.unknown) + val senderName = if (senderId != null) getGroupMemberName(senderId) else context.getString(R.string.unknown) return when (kind) { SCREENSHOT -> Phrase.from(context, R.string.screenshotTaken) @@ -407,9 +401,7 @@ object UpdateMessageBuilder { } fun buildCallMessage(context: Context, type: CallMessageType, senderId: String): String { - val senderName = - storage.getContactWithAccountID(senderId)?.displayName(Contact.ContactContext.REGULAR) - ?: senderId + val senderName = storage.getContactNameWithAccountID(senderId) return when (type) { CALL_INCOMING -> Phrase.from(context, R.string.callsCalledYou).put(NAME_KEY, senderName) diff --git a/libsession/src/main/java/org/session/libsession/utilities/GroupUtil.kt b/libsession/src/main/java/org/session/libsession/utilities/GroupUtil.kt index 03d93aa5a5..108ba7f3f6 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/GroupUtil.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/GroupUtil.kt @@ -132,21 +132,4 @@ object GroupUtil { } return memberMap } -} - -fun GroupMember.getMemberName(config: ConfigFactoryProtocol): String { - return config.withUserConfigs { - it.contacts.get(this.accountId.hexString)?.displayName - ?: this.name.takeIf { it.isNotBlank() } - ?: truncateIdForDisplay(this.accountId.hexString) - } -} - -//todo GROUPSV2 Currently avatars use Recipients to display avatars, meaning unknown groups member are not currently using this avatar below but instead will try to fetch a recipient from the account ID, which won't be found so the unknown icon will be used - We need to have an avatar system that handles low level daat like a url -fun GroupMember.getMemberAvatar(config: ConfigFactoryProtocol): UserPic { - return config.withUserConfigs { - it.contacts.get(this.accountId.hexString)?.profilePicture - ?: this.profilePic() - ?: UserPic.DEFAULT - } } \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java b/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java index a0666512ee..8232642f5a 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java +++ b/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java @@ -320,7 +320,7 @@ public class Recipient implements RecipientModifiedListener, Cloneable { if (notify) notifyListeners(); } - public synchronized @Nullable String getName() { + public synchronized @NonNull String getName() { StorageProtocol storage = MessagingModuleConfiguration.getShared().getStorage(); String accountID = this.address.toString(); if (isGroupOrCommunityRecipient()) { @@ -335,13 +335,9 @@ public class Recipient implements RecipientModifiedListener, Cloneable { } } else if (isCommunityInboxRecipient()){ String inboxID = GroupUtil.getDecodedOpenGroupInboxAccountId(accountID); - Contact contact = storage.getContactWithAccountID(inboxID); - if (contact == null) return accountID; - return contact.displayName(Contact.ContactContext.REGULAR); + return storage.getContactNameWithAccountID(inboxID, null, Contact.ContactContext.OPEN_GROUP); } else { - Contact contact = storage.getContactWithAccountID(accountID); - if (contact == null) return null; - return contact.displayName(Contact.ContactContext.REGULAR); + return storage.getContactNameWithAccountID(accountID, null, Contact.ContactContext.REGULAR); } } @@ -523,14 +519,7 @@ public class Recipient implements RecipientModifiedListener, Cloneable { } public synchronized String toShortString() { - String name = getName(); - if (name != null) return name; - String accountId = address.serialize(); - if (accountId.length() < 4) return accountId; // so substrings don't throw out of bounds exceptions - int takeAmount = 4; - String start = accountId.substring(0, takeAmount); - String end = accountId.substring(accountId.length()-takeAmount); - return start+"..."+end; + return getName(); } public synchronized @NonNull Drawable getFallbackContactPhotoDrawable(Context context, boolean inverted) { diff --git a/libsession/src/main/java/org/session/libsession/utilities/recipients/RecipientProvider.java b/libsession/src/main/java/org/session/libsession/utilities/recipients/RecipientProvider.java index c0e1f2d8c1..b22e3450ed 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/recipients/RecipientProvider.java +++ b/libsession/src/main/java/org/session/libsession/utilities/recipients/RecipientProvider.java @@ -56,7 +56,7 @@ class RecipientProvider { @NonNull Recipient getRecipient(@NonNull Context context, @NonNull Address address, @NonNull Optional settings, @NonNull Optional groupRecord, boolean asynchronous) { Recipient cachedRecipient = recipientCache.get(address); - if (cachedRecipient != null && (asynchronous || !cachedRecipient.isResolving()) && ((!groupRecord.isPresent() && !settings.isPresent()) || !cachedRecipient.isResolving() || cachedRecipient.getName() != null)) { + if (cachedRecipient != null && (asynchronous || !cachedRecipient.isResolving()) && ((!groupRecord.isPresent() && !settings.isPresent()) || !cachedRecipient.isResolving())) { return cachedRecipient; }