@ -40,6 +40,7 @@ import androidx.annotation.DimenRes
import androidx.core.text.set
import androidx.core.text.set
import androidx.core.text.toSpannable
import androidx.core.text.toSpannable
import androidx.core.view.drawToBitmap
import androidx.core.view.drawToBitmap
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.Lifecycle
@ -79,7 +80,6 @@ import org.session.libsession.messaging.messages.signal.OutgoingTextMessage
import org.session.libsession.messaging.messages.visible.Reaction
import org.session.libsession.messaging.messages.visible.Reaction
import org.session.libsession.messaging.messages.visible.VisibleMessage
import org.session.libsession.messaging.messages.visible.VisibleMessage
import org.session.libsession.messaging.open_groups.OpenGroupApi
import org.session.libsession.messaging.open_groups.OpenGroupApi
import org.session.libsession.messaging.open_groups.OpenGroupApi.Capability
import org.session.libsession.messaging.sending_receiving.MessageSender
import org.session.libsession.messaging.sending_receiving.MessageSender
import org.session.libsession.messaging.sending_receiving.attachments.Attachment
import org.session.libsession.messaging.sending_receiving.attachments.Attachment
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview
@ -112,9 +112,9 @@ import org.thoughtcrime.securesms.conversation.settings.ConversationSettingsActi
import org.thoughtcrime.securesms.conversation.v2.ConversationReactionOverlay.OnActionSelectedListener
import org.thoughtcrime.securesms.conversation.v2.ConversationReactionOverlay.OnActionSelectedListener
import org.thoughtcrime.securesms.conversation.v2.ConversationReactionOverlay.OnReactionSelectedListener
import org.thoughtcrime.securesms.conversation.v2.ConversationReactionOverlay.OnReactionSelectedListener
import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.MESSAGE_TIMESTAMP
import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.MESSAGE_TIMESTAMP
import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_DELETE
import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_REPLY
import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_REPLY
import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_RESEND
import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_RESEND
import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_DELETE
import org.thoughtcrime.securesms.conversation.v2.dialogs.BlockedDialog
import org.thoughtcrime.securesms.conversation.v2.dialogs.BlockedDialog
import org.thoughtcrime.securesms.conversation.v2.dialogs.LinkPreviewDialog
import org.thoughtcrime.securesms.conversation.v2.dialogs.LinkPreviewDialog
import org.thoughtcrime.securesms.conversation.v2.dialogs.SendSeedDialog
import org.thoughtcrime.securesms.conversation.v2.dialogs.SendSeedDialog
@ -177,6 +177,7 @@ import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.SaveAttachmentTask
import org.thoughtcrime.securesms.util.SaveAttachmentTask
import org.thoughtcrime.securesms.util.SimpleTextWatcher
import org.thoughtcrime.securesms.util.isScrolledToBottom
import org.thoughtcrime.securesms.util.isScrolledToBottom
import org.thoughtcrime.securesms.util.push
import org.thoughtcrime.securesms.util.push
import org.thoughtcrime.securesms.util.toPx
import org.thoughtcrime.securesms.util.toPx
@ -250,11 +251,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
val address = if ( sessionId . prefix == IdPrefix . BLINDED && openGroup != null ) {
val address = if ( sessionId . prefix == IdPrefix . BLINDED && openGroup != null ) {
storage . getOrCreateBlindedIdMapping ( sessionId . hexString , openGroup . server , openGroup . publicKey ) . sessionId ?. let {
storage . getOrCreateBlindedIdMapping ( sessionId . hexString , openGroup . server , openGroup . publicKey ) . sessionId ?. let {
fromSerialized ( it )
fromSerialized ( it )
} ?: run {
} ?: GroupUtil . getEncodedOpenGroupInboxID ( openGroup , sessionId )
val openGroupInboxId =
" ${openGroup.server} ! ${openGroup.publicKey} ! ${sessionId.hexString} " . toByteArray ( )
fromSerialized ( GroupUtil . getEncodedOpenGroupInboxID ( openGroupInboxId ) )
}
} else {
} else {
it
it
}
}
@ -263,7 +260,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
}
}
} ?: finish ( )
} ?: finish ( )
}
}
viewModelFactory . create ( threadId , MessagingModuleConfiguration . shared . getUserED25519KeyPair ( ) , contentResolver )
viewModelFactory . create ( threadId , MessagingModuleConfiguration . shared . getUserED25519KeyPair ( ) )
}
}
private var actionMode : ActionMode ? = null
private var actionMode : ActionMode ? = null
private var unreadCount = 0
private var unreadCount = 0
@ -322,8 +319,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
handleSwipeToReply ( message )
handleSwipeToReply ( message )
} ,
} ,
onItemLongPress = { message , position , view ->
onItemLongPress = { message , position , view ->
if ( !is MessageRequestThread ( ) &&
if ( ! viewModel . isMessageRequestThread &&
( viewModel . openGroup == null || Capability . REACTIONS . name . lowercase ( ) in viewModel . serverCapabilities )
viewModel . canReactToMessages
) {
) {
showEmojiPicker ( message , view )
showEmojiPicker ( message , view )
} else {
} else {
@ -606,26 +603,27 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
// called from onCreate
// called from onCreate
private fun setUpInputBar ( ) {
private fun setUpInputBar ( ) {
binding !! . inputBar . isVisible = viewModel . openGroup == null || viewModel . openGroup ?. canWrite == true
val binding = binding ?: return
binding !! . inputBar . delegate = this
binding . inputBar . isGone = viewModel . hidesInputBar ( )
binding !! . inputBarRecordingView . delegate = this
binding . inputBar . delegate = this
binding . inputBarRecordingView . delegate = this
// GIF button
// GIF button
binding !! . gifButtonContainer . addView ( gifButton )
binding . gifButtonContainer . addView ( gifButton )
gifButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
gifButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
gifButton . onUp = { showGIFPicker ( ) }
gifButton . onUp = { showGIFPicker ( ) }
gifButton . snIsEnabled = false
gifButton . snIsEnabled = false
// Document button
// Document button
binding !! . documentButtonContainer . addView ( documentButton )
binding . documentButtonContainer . addView ( documentButton )
documentButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
documentButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
documentButton . onUp = { showDocumentPicker ( ) }
documentButton . onUp = { showDocumentPicker ( ) }
documentButton . snIsEnabled = false
documentButton . snIsEnabled = false
// Library button
// Library button
binding !! . libraryButtonContainer . addView ( libraryButton )
binding . libraryButtonContainer . addView ( libraryButton )
libraryButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
libraryButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
libraryButton . onUp = { pickFromLibrary ( ) }
libraryButton . onUp = { pickFromLibrary ( ) }
libraryButton . snIsEnabled = false
libraryButton . snIsEnabled = false
// Camera button
// Camera button
binding !! . cameraButtonContainer . addView ( cameraButton )
binding . cameraButtonContainer . addView ( cameraButton )
cameraButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
cameraButton . layoutParams = RelativeLayout . LayoutParams ( RelativeLayout . LayoutParams . MATCH _PARENT , RelativeLayout . LayoutParams . MATCH _PARENT )
cameraButton . onUp = { showCamera ( ) }
cameraButton . onUp = { showCamera ( ) }
cameraButton . snIsEnabled = false
cameraButton . snIsEnabled = false
@ -774,7 +772,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
override fun onPrepareOptionsMenu ( menu : Menu ) : Boolean {
override fun onPrepareOptionsMenu ( menu : Menu ) : Boolean {
val recipient = viewModel . recipient ?: return false
val recipient = viewModel . recipient ?: return false
if ( !is MessageRequestThread ( ) ) {
if ( ! viewModel . isMessageRequestThread ) {
ConversationMenuHelper . onPrepareOptionsMenu (
ConversationMenuHelper . onPrepareOptionsMenu (
menu ,
menu ,
menuInflater ,
menuInflater ,
@ -860,11 +858,6 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
}
}
}
}
private fun isMessageRequestThread ( ) : Boolean {
val recipient = viewModel . recipient ?: return false
return ! recipient . isGroupRecipient && ! recipient . isApproved
}
private fun isOutgoingMessageRequestThread ( ) : Boolean {
private fun isOutgoingMessageRequestThread ( ) : Boolean {
val recipient = viewModel . recipient ?: return false
val recipient = viewModel . recipient ?: return false
return ! recipient . isGroupRecipient &&
return ! recipient . isGroupRecipient &&
@ -1079,11 +1072,13 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
private fun updatePlaceholder ( ) {
private fun updatePlaceholder ( ) {
val recipient = viewModel . recipient
val recipient = viewModel . recipient
?: return Log . w ( " Loki " , " recipient was null in placeholder update " )
?: return Log . w ( " Loki " , " recipient was null in placeholder update " )
val blindedRecipient = viewModel . blindedRecipient
val binding = binding ?: return
val binding = binding ?: return
val openGroup = viewModel . openGroup
val openGroup = viewModel . openGroup
val ( textResource , insertParam ) = when {
val ( textResource , insertParam ) = when {
recipient . isLocalNumber -> R . string . activity _conversation _empty _state _note _to _self to null
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 && ! openGroup . canWrite -> R . string . activity _conversation _empty _state _read _only to recipient . toShortString ( )
blindedRecipient ?. blocksCommunityMessageRequests == true -> R . string . activity _conversation _empty _state _blocks _community _requests to recipient . toShortString ( )
else -> R . string . activity _conversation _empty _state _default to recipient . toShortString ( )
else -> R . string . activity _conversation _empty _state _default to recipient . toShortString ( )
}
}
val showPlaceholder = adapter . itemCount == 0
val showPlaceholder = adapter . itemCount == 0