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 604422460..7635ad40e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt @@ -10,7 +10,6 @@ import androidx.annotation.DimenRes import com.bumptech.glide.load.engine.DiskCacheStrategy import network.loki.messenger.R import network.loki.messenger.databinding.ViewProfilePictureBinding -import network.loki.messenger.databinding.ViewUserBinding import org.session.libsession.avatars.ContactColors import org.session.libsession.avatars.PlaceholderAvatarPhoto import org.session.libsession.avatars.ProfileContactPhoto @@ -74,7 +73,7 @@ class ProfilePictureView @JvmOverloads constructor( additionalDisplayName = getUserDisplayName(apk) } } else if(recipient.isOpenGroupInboxRecipient) { - val publicKey = GroupUtil.getDecodedOpenGroupInbox(recipient.address.serialize()) + val publicKey = GroupUtil.getDecodedOpenGroupInboxSessionId(recipient.address.serialize()) this.publicKey = publicKey displayName = getUserDisplayName(publicKey) additionalPublicKey = null diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 3b9516b8a..3436b2063 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -87,6 +87,7 @@ import org.session.libsession.messaging.utilities.SessionId import org.session.libsession.snode.SnodeAPI import org.session.libsession.utilities.Address import org.session.libsession.utilities.Address.Companion.fromSerialized +import org.session.libsession.utilities.GroupUtil import org.session.libsession.utilities.MediaTypes import org.session.libsession.utilities.Stub import org.session.libsession.utilities.TextSecurePreferences @@ -239,7 +240,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe val address = if (sessionId.prefix == IdPrefix.BLINDED && openGroup != null) { storage.getOrCreateBlindedIdMapping(sessionId.hexString, openGroup.server, openGroup.publicKey).sessionId?.let { fromSerialized(it) - } ?: fromSerialized(sessionId.hexString) + } ?: GroupUtil.getEncodedOpenGroupInboxID(openGroup, sessionId) } else { it } @@ -248,7 +249,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } } ?: finish() } - viewModelFactory.create(threadId, MessagingModuleConfiguration.shared.getUserED25519KeyPair(), contentResolver) + viewModelFactory.create(this@ConversationActivityV2, threadId, MessagingModuleConfiguration.shared.getUserED25519KeyPair(), contentResolver) } private var actionMode: ActionMode? = null private var unreadCount = 0 @@ -591,10 +592,10 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe // called from onCreate private fun setUpInputBar() { - val recipient = viewModel.recipient ?: return + val blindedRecipient = viewModel.blindedRecipient binding!!.inputBar.isVisible = viewModel.openGroup?.canWrite == true - || (viewModel.openGroup == null && !recipient.blocksCommunityMessageRequests) + || (blindedRecipient == null || !blindedRecipient.blocksCommunityMessageRequests) binding!!.inputBar.delegate = this binding!!.inputBarRecordingView.delegate = this // GIF button @@ -1068,12 +1069,13 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe private fun updatePlaceholder() { val recipient = viewModel.recipient ?: return Log.w("Loki", "recipient was null in placeholder update") + val blindedRecipient = viewModel.blindedRecipient val binding = binding ?: return val openGroup = viewModel.openGroup val (textResource, insertParam) = when { recipient.isLocalNumber -> R.string.activity_conversation_empty_state_note_to_self to null openGroup != null && !openGroup.canWrite -> R.string.activity_conversation_empty_state_read_only to recipient.toShortString() - openGroup == null && recipient.blocksCommunityMessageRequests -> R.string.activity_conversation_empty_state_blocks_community_requests to recipient.toShortString() + blindedRecipient != null && blindedRecipient.blocksCommunityMessageRequests -> R.string.activity_conversation_empty_state_blocks_community_requests to recipient.toShortString() else -> R.string.activity_conversation_empty_state_default to recipient.toShortString() } val showPlaceholder = adapter.itemCount == 0 diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt index 13736974b..79b0b6a4c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.conversation.v2 import android.content.ContentResolver +import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope @@ -8,6 +9,7 @@ import app.cash.copper.flow.observeQuery import com.goterl.lazysodium.utils.KeyPair import dagger.assisted.Assisted import dagger.assisted.AssistedInject +import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableStateFlow @@ -18,6 +20,8 @@ import org.session.libsession.messaging.open_groups.OpenGroup import org.session.libsession.messaging.open_groups.OpenGroupApi import org.session.libsession.messaging.utilities.SessionId import org.session.libsession.messaging.utilities.SodiumUtilities +import org.session.libsession.utilities.Address +import org.session.libsession.utilities.GroupUtil import org.session.libsession.utilities.recipients.Recipient import org.session.libsignal.utilities.IdPrefix import org.session.libsignal.utilities.Log @@ -28,6 +32,7 @@ import org.thoughtcrime.securesms.repository.ConversationRepository import java.util.UUID class ConversationViewModel( + private val context: Context, val threadId: Long, val edKeyPair: KeyPair?, private val contentResolver: ContentResolver, @@ -47,6 +52,19 @@ class ConversationViewModel( val recipient: Recipient? get() = _recipient.value + val blindedRecipient: Recipient? + get() = _recipient.value?.let { recipient -> + when { + recipient.isOpenGroupOutboxRecipient -> recipient + recipient.isOpenGroupInboxRecipient -> Recipient.from( + context, + Address.fromSerialized(GroupUtil.getDecodedOpenGroupInboxSessionId(recipient.address.serialize())), + false + ) + else -> null + } + } + private var _openGroup: RetrieveOnce = RetrieveOnce { storage.getOpenGroup(threadId) } @@ -201,7 +219,7 @@ class ConversationViewModel( @dagger.assisted.AssistedFactory interface AssistedFactory { - fun create(threadId: Long, edKeyPair: KeyPair?, contentResolver: ContentResolver): Factory + fun create(context: Context, threadId: Long, edKeyPair: KeyPair?, contentResolver: ContentResolver): Factory } @Suppress("UNCHECKED_CAST") @@ -209,12 +227,13 @@ class ConversationViewModel( @Assisted private val threadId: Long, @Assisted private val edKeyPair: KeyPair?, @Assisted private val contentResolver: ContentResolver, + @Assisted private val context: Context, private val repository: ConversationRepository, private val storage: Storage ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { - return ConversationViewModel(threadId, edKeyPair, contentResolver, repository, storage) as T + return ConversationViewModel(context, threadId, edKeyPair, contentResolver, repository, storage) as T } } } 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 e69ac7119..37c65ff69 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -436,7 +436,7 @@ open class Storage(context: Context, helper: SQLCipherOpenHelper, private val co } override fun isCheckingCommunityRequests(): Boolean { - return configFactory.user?.getCommunityMessageRequests() != true + return configFactory.user?.getCommunityMessageRequests() == true } fun notifyUpdates(forConfigObject: ConfigBase) { @@ -1414,7 +1414,7 @@ open class Storage(context: Context, helper: SQLCipherOpenHelper, private val co val blindedId = when { recipient.isGroupRecipient -> null recipient.isOpenGroupInboxRecipient -> { - GroupUtil.getDecodedOpenGroupInbox(address) + GroupUtil.getDecodedOpenGroupInboxSessionId(address) } else -> { if (SessionId(address).prefix == IdPrefix.BLINDED) { diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt index 9add39d09..4836faf4a 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt @@ -245,9 +245,10 @@ object MessageSender { if (message.sentTimestamp == null) { message.sentTimestamp = SnodeAPI.nowWithOffset } + // Attach the blocks message requests info configFactory.user?.let { user -> if (message is VisibleMessage) { - message.blocksMessageRequests = user.getCommunityMessageRequests() + message.blocksMessageRequests = !user.getCommunityMessageRequests() } } val userEdKeyPair = MessagingModuleConfiguration.shared.getUserED25519KeyPair()!! 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 be505f082..06ab2ad40 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/GroupUtil.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/GroupUtil.kt @@ -60,7 +60,7 @@ object GroupUtil { } @JvmStatic - fun getDecodedOpenGroupInbox(groupID: String): String { + fun getDecodedOpenGroupInboxSessionId(groupID: String): String { val decodedGroupId = getDecodedGroupID(groupID) if (decodedGroupId.split("!").count() > 2) { return decodedGroupId.split("!", limit = 3)[2] 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 12183733b..20f285b59 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 @@ -325,7 +325,7 @@ public class Recipient implements RecipientModifiedListener { return this.name; } } else if (isOpenGroupInboxRecipient()){ - String inboxID = GroupUtil.getDecodedOpenGroupInbox(sessionID); + String inboxID = GroupUtil.getDecodedOpenGroupInboxSessionId(sessionID); Contact contact = storage.getContactWithSessionID(inboxID); if (contact == null) { return sessionID; } return contact.displayName(Contact.ContactContext.REGULAR);