mirror of
https://github.com/oxen-io/session-android.git
synced 2025-08-25 17:37:57 +00:00
fix: set approved on new outgoing threads, use approved more deeply and invalidate the options menu on recipient modified. Add approvedMe flag toggles for visible message receive
This commit is contained in:
@@ -388,7 +388,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
|||||||
|
|
||||||
// called from onCreate
|
// called from onCreate
|
||||||
private fun setUpToolBar() {
|
private fun setUpToolBar() {
|
||||||
val actionBar = supportActionBar!!
|
val actionBar = supportActionBar ?: return
|
||||||
actionBarBinding = ActivityConversationV2ActionBarBinding.inflate(layoutInflater)
|
actionBarBinding = ActivityConversationV2ActionBarBinding.inflate(layoutInflater)
|
||||||
actionBar.title = ""
|
actionBar.title = ""
|
||||||
actionBar.customView = actionBarBinding!!.root
|
actionBar.customView = actionBarBinding!!.root
|
||||||
@@ -581,6 +581,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
|||||||
if (viewModel.recipient.isContactRecipient) {
|
if (viewModel.recipient.isContactRecipient) {
|
||||||
binding?.blockedBanner?.isVisible = viewModel.recipient.isBlocked
|
binding?.blockedBanner?.isVisible = viewModel.recipient.isBlocked
|
||||||
}
|
}
|
||||||
|
invalidateOptionsMenu()
|
||||||
updateSubtitle()
|
updateSubtitle()
|
||||||
showOrHideInputIfNeeded()
|
showOrHideInputIfNeeded()
|
||||||
actionBarBinding?.profilePictureView?.update(recipient)
|
actionBarBinding?.profilePictureView?.update(recipient)
|
||||||
@@ -623,9 +624,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun isMessageRequestThread(): Boolean {
|
private fun isMessageRequestThread(): Boolean {
|
||||||
val hasSent = threadDb.getLastSeenAndHasSent(viewModel.threadId).second()
|
return !viewModel.recipient.isGroupRecipient && !viewModel.recipient.isApproved
|
||||||
return (!viewModel.recipient.isGroupRecipient && !hasSent) ||
|
|
||||||
(!viewModel.recipient.isGroupRecipient && hasSent && !(viewModel.recipient.hasApprovedMe() || viewModel.hasReceived()))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isOutgoingMessageRequestThread(): Boolean {
|
private fun isOutgoingMessageRequestThread(): Boolean {
|
||||||
@@ -1001,6 +1000,9 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
|||||||
override fun sendMessage() {
|
override fun sendMessage() {
|
||||||
if (isIncomingMessageRequestThread()) {
|
if (isIncomingMessageRequestThread()) {
|
||||||
acceptMessageRequest()
|
acceptMessageRequest()
|
||||||
|
} else if (!viewModel.recipient.isApproved) {
|
||||||
|
// edge case for new outgoing thread on new recipient without sending approval messages
|
||||||
|
viewModel.setRecipientApproved()
|
||||||
}
|
}
|
||||||
if (viewModel.recipient.isContactRecipient && viewModel.recipient.isBlocked) {
|
if (viewModel.recipient.isContactRecipient && viewModel.recipient.isBlocked) {
|
||||||
BlockedDialog(viewModel.recipient).show(supportFragmentManager, "Blocked Dialog")
|
BlockedDialog(viewModel.recipient).show(supportFragmentManager, "Blocked Dialog")
|
||||||
|
@@ -53,6 +53,10 @@ class ConversationViewModel(
|
|||||||
repository.deleteLocally(recipient, message)
|
repository.deleteLocally(recipient, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun setRecipientApproved() {
|
||||||
|
repository.setApproved(recipient, true)
|
||||||
|
}
|
||||||
|
|
||||||
fun deleteForEveryone(message: MessageRecord) = viewModelScope.launch {
|
fun deleteForEveryone(message: MessageRecord) = viewModelScope.launch {
|
||||||
repository.deleteForEveryone(threadId, recipient, message)
|
repository.deleteForEveryone(threadId, recipient, message)
|
||||||
.onFailure {
|
.onFailure {
|
||||||
|
@@ -238,10 +238,15 @@ public class RecipientDatabase extends Database {
|
|||||||
public void setApproved(@NonNull Recipient recipient, boolean approved) {
|
public void setApproved(@NonNull Recipient recipient, boolean approved) {
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put(APPROVED, approved ? 1 : 0);
|
values.put(APPROVED, approved ? 1 : 0);
|
||||||
values.put(APPROVED_ME, approved ? 1 : 0);
|
|
||||||
updateOrInsert(recipient.getAddress(), values);
|
updateOrInsert(recipient.getAddress(), values);
|
||||||
recipient.resolve().setApproved(approved);
|
recipient.resolve().setApproved(approved);
|
||||||
recipient.resolve().setHasApprovedMe(approved);
|
}
|
||||||
|
|
||||||
|
public void setApprovedMe(@NonNull Recipient recipient, boolean approvedMe) {
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put(APPROVED_ME, approvedMe ? 1 : 0);
|
||||||
|
updateOrInsert(recipient.getAddress(), values);
|
||||||
|
recipient.resolve().setHasApprovedMe(approvedMe);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBlocked(@NonNull Recipient recipient, boolean blocked) {
|
public void setBlocked(@NonNull Recipient recipient, boolean blocked) {
|
||||||
|
@@ -4,11 +4,22 @@ import android.content.Context
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import org.session.libsession.database.StorageProtocol
|
import org.session.libsession.database.StorageProtocol
|
||||||
import org.session.libsession.messaging.contacts.Contact
|
import org.session.libsession.messaging.contacts.Contact
|
||||||
import org.session.libsession.messaging.jobs.*
|
import org.session.libsession.messaging.jobs.AttachmentUploadJob
|
||||||
|
import org.session.libsession.messaging.jobs.GroupAvatarDownloadJob
|
||||||
|
import org.session.libsession.messaging.jobs.Job
|
||||||
|
import org.session.libsession.messaging.jobs.JobQueue
|
||||||
|
import org.session.libsession.messaging.jobs.MessageReceiveJob
|
||||||
|
import org.session.libsession.messaging.jobs.MessageSendJob
|
||||||
|
import org.session.libsession.messaging.jobs.TrimThreadJob
|
||||||
import org.session.libsession.messaging.messages.control.ConfigurationMessage
|
import org.session.libsession.messaging.messages.control.ConfigurationMessage
|
||||||
import org.session.libsession.messaging.messages.control.MessageRequestResponse
|
import org.session.libsession.messaging.messages.control.MessageRequestResponse
|
||||||
import org.session.libsession.messaging.messages.signal.*
|
import org.session.libsession.messaging.messages.signal.IncomingEncryptedMessage
|
||||||
|
import org.session.libsession.messaging.messages.signal.IncomingGroupMessage
|
||||||
|
import org.session.libsession.messaging.messages.signal.IncomingMediaMessage
|
||||||
import org.session.libsession.messaging.messages.signal.IncomingTextMessage
|
import org.session.libsession.messaging.messages.signal.IncomingTextMessage
|
||||||
|
import org.session.libsession.messaging.messages.signal.OutgoingGroupMediaMessage
|
||||||
|
import org.session.libsession.messaging.messages.signal.OutgoingMediaMessage
|
||||||
|
import org.session.libsession.messaging.messages.signal.OutgoingTextMessage
|
||||||
import org.session.libsession.messaging.messages.visible.Attachment
|
import org.session.libsession.messaging.messages.visible.Attachment
|
||||||
import org.session.libsession.messaging.messages.visible.VisibleMessage
|
import org.session.libsession.messaging.messages.visible.VisibleMessage
|
||||||
import org.session.libsession.messaging.open_groups.OpenGroupV2
|
import org.session.libsession.messaging.open_groups.OpenGroupV2
|
||||||
@@ -19,14 +30,17 @@ import org.session.libsession.messaging.sending_receiving.link_preview.LinkPrevi
|
|||||||
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel
|
import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel
|
||||||
import org.session.libsession.messaging.utilities.UpdateMessageData
|
import org.session.libsession.messaging.utilities.UpdateMessageData
|
||||||
import org.session.libsession.snode.OnionRequestAPI
|
import org.session.libsession.snode.OnionRequestAPI
|
||||||
import org.session.libsession.utilities.*
|
import org.session.libsession.utilities.Address
|
||||||
import org.session.libsession.utilities.Address.Companion.fromSerialized
|
import org.session.libsession.utilities.Address.Companion.fromSerialized
|
||||||
|
import org.session.libsession.utilities.GroupRecord
|
||||||
|
import org.session.libsession.utilities.GroupUtil
|
||||||
|
import org.session.libsession.utilities.ProfileKeyUtil
|
||||||
|
import org.session.libsession.utilities.TextSecurePreferences
|
||||||
import org.session.libsession.utilities.recipients.Recipient
|
import org.session.libsession.utilities.recipients.Recipient
|
||||||
import org.session.libsignal.crypto.ecc.ECKeyPair
|
import org.session.libsignal.crypto.ecc.ECKeyPair
|
||||||
import org.session.libsignal.messages.SignalServiceAttachmentPointer
|
import org.session.libsignal.messages.SignalServiceAttachmentPointer
|
||||||
import org.session.libsignal.messages.SignalServiceGroup
|
import org.session.libsignal.messages.SignalServiceGroup
|
||||||
import org.session.libsignal.utilities.KeyHelper
|
import org.session.libsignal.utilities.KeyHelper
|
||||||
import org.session.libsignal.utilities.Log
|
|
||||||
import org.session.libsignal.utilities.guava.Optional
|
import org.session.libsignal.utilities.guava.Optional
|
||||||
import org.thoughtcrime.securesms.ApplicationContext
|
import org.thoughtcrime.securesms.ApplicationContext
|
||||||
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
|
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
|
||||||
@@ -585,7 +599,7 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context,
|
|||||||
// create Thread if needed
|
// create Thread if needed
|
||||||
val threadId = threadDatabase.getOrCreateThreadIdFor(recipient)
|
val threadId = threadDatabase.getOrCreateThreadIdFor(recipient)
|
||||||
if (contact.didApproveMe == true) {
|
if (contact.didApproveMe == true) {
|
||||||
recipientDatabase.setApproved(recipient, true)
|
recipientDatabase.setApprovedMe(recipient, true)
|
||||||
threadDatabase.setHasSent(threadId, true)
|
threadDatabase.setHasSent(threadId, true)
|
||||||
}
|
}
|
||||||
if (contact.isApproved == true) {
|
if (contact.isApproved == true) {
|
||||||
@@ -663,7 +677,7 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context,
|
|||||||
val mmsDb = DatabaseComponent.get(context).mmsDatabase()
|
val mmsDb = DatabaseComponent.get(context).mmsDatabase()
|
||||||
val senderAddress = fromSerialized(senderPublicKey)
|
val senderAddress = fromSerialized(senderPublicKey)
|
||||||
val requestSender = Recipient.from(context, senderAddress, false)
|
val requestSender = Recipient.from(context, senderAddress, false)
|
||||||
recipientDb.setApproved(requestSender, true)
|
recipientDb.setApprovedMe(requestSender, true)
|
||||||
|
|
||||||
val message = IncomingMediaMessage(
|
val message = IncomingMediaMessage(
|
||||||
senderAddress,
|
senderAddress,
|
||||||
@@ -686,4 +700,12 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun setRecipientApproved(recipient: Recipient, approved: Boolean) {
|
||||||
|
DatabaseComponent.get(context).recipientDatabase().setApproved(recipient, approved)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setRecipientApprovedMe(recipient: Recipient, approvedMe: Boolean) {
|
||||||
|
DatabaseComponent.get(context).recipientDatabase().setApprovedMe(recipient, approvedMe)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@@ -39,6 +39,7 @@ interface ConversationRepository {
|
|||||||
fun inviteContacts(threadId: Long, contacts: List<Recipient>)
|
fun inviteContacts(threadId: Long, contacts: List<Recipient>)
|
||||||
fun unblock(recipient: Recipient)
|
fun unblock(recipient: Recipient)
|
||||||
fun deleteLocally(recipient: Recipient, message: MessageRecord)
|
fun deleteLocally(recipient: Recipient, message: MessageRecord)
|
||||||
|
fun setApproved(recipient: Recipient, isApproved: Boolean)
|
||||||
|
|
||||||
suspend fun deleteForEveryone(
|
suspend fun deleteForEveryone(
|
||||||
threadId: Long,
|
threadId: Long,
|
||||||
@@ -138,6 +139,10 @@ class DefaultConversationRepository @Inject constructor(
|
|||||||
messageDataProvider.deleteMessage(message.id, !message.isMms)
|
messageDataProvider.deleteMessage(message.id, !message.isMms)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun setApproved(recipient: Recipient, isApproved: Boolean) {
|
||||||
|
recipientDb.setApproved(recipient, isApproved)
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun deleteForEveryone(
|
override suspend fun deleteForEveryone(
|
||||||
threadId: Long,
|
threadId: Long,
|
||||||
recipient: Recipient,
|
recipient: Recipient,
|
||||||
|
@@ -4,7 +4,6 @@ import android.content.Context
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import org.session.libsession.messaging.contacts.Contact
|
import org.session.libsession.messaging.contacts.Contact
|
||||||
import org.session.libsession.messaging.jobs.AttachmentUploadJob
|
import org.session.libsession.messaging.jobs.AttachmentUploadJob
|
||||||
import org.session.libsession.messaging.jobs.GroupAvatarDownloadJob
|
|
||||||
import org.session.libsession.messaging.jobs.Job
|
import org.session.libsession.messaging.jobs.Job
|
||||||
import org.session.libsession.messaging.jobs.MessageSendJob
|
import org.session.libsession.messaging.jobs.MessageSendJob
|
||||||
import org.session.libsession.messaging.messages.control.ConfigurationMessage
|
import org.session.libsession.messaging.messages.control.ConfigurationMessage
|
||||||
@@ -158,4 +157,6 @@ interface StorageProtocol {
|
|||||||
fun persist(message: VisibleMessage, quotes: QuoteModel?, linkPreview: List<LinkPreview?>, groupPublicKey: String?, openGroupID: String?, attachments: List<Attachment>): Long?
|
fun persist(message: VisibleMessage, quotes: QuoteModel?, linkPreview: List<LinkPreview?>, groupPublicKey: String?, openGroupID: String?, attachments: List<Attachment>): Long?
|
||||||
fun insertDataExtractionNotificationMessage(senderPublicKey: String, message: DataExtractionNotificationInfoMessage, sentTimestamp: Long)
|
fun insertDataExtractionNotificationMessage(senderPublicKey: String, message: DataExtractionNotificationInfoMessage, sentTimestamp: Long)
|
||||||
fun insertMessageRequestResponse(response: MessageRequestResponse)
|
fun insertMessageRequestResponse(response: MessageRequestResponse)
|
||||||
|
fun setRecipientApproved(recipient: Recipient, approved: Boolean)
|
||||||
|
fun setRecipientApprovedMe(recipient: Recipient, approvedMe: Boolean)
|
||||||
}
|
}
|
||||||
|
@@ -208,6 +208,8 @@ fun MessageReceiver.handleVisibleMessage(message: VisibleMessage, proto: SignalS
|
|||||||
profileManager.setUnidentifiedAccessMode(context, recipient, Recipient.UnidentifiedAccessMode.UNKNOWN)
|
profileManager.setUnidentifiedAccessMode(context, recipient, Recipient.UnidentifiedAccessMode.UNKNOWN)
|
||||||
profileManager.setProfilePictureURL(context, recipient, profile.profilePictureURL!!)
|
profileManager.setProfilePictureURL(context, recipient, profile.profilePictureURL!!)
|
||||||
}
|
}
|
||||||
|
// set approved on receive message
|
||||||
|
storage.setRecipientApprovedMe(recipient, true)
|
||||||
}
|
}
|
||||||
// Parse quote if needed
|
// Parse quote if needed
|
||||||
var quoteModel: QuoteModel? = null
|
var quoteModel: QuoteModel? = null
|
||||||
|
Reference in New Issue
Block a user