mirror of
https://github.com/oxen-io/session-android.git
synced 2025-04-01 03:32:15 +00:00
Fixed conversation view closing + hopefully wrong status text displayed + deletion of contact on removal of last message in 1-on-1 convo
This commit is contained in:
parent
13902607b2
commit
2b46441977
@ -4,10 +4,15 @@ import android.content.Context
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import network.loki.messenger.R
|
||||||
import network.loki.messenger.databinding.ContactSectionHeaderBinding
|
import network.loki.messenger.databinding.ContactSectionHeaderBinding
|
||||||
import network.loki.messenger.databinding.ViewContactBinding
|
import network.loki.messenger.databinding.ViewContactBinding
|
||||||
import org.session.libsession.utilities.recipients.Recipient
|
import org.session.libsession.utilities.recipients.Recipient
|
||||||
|
import org.session.libsignal.utilities.Log
|
||||||
|
import org.thoughtcrime.securesms.database.Storage
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests
|
import org.thoughtcrime.securesms.mms.GlideRequests
|
||||||
|
import org.thoughtcrime.securesms.showSessionDialog
|
||||||
|
import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities
|
||||||
|
|
||||||
sealed class ContactListItem {
|
sealed class ContactListItem {
|
||||||
class Header(val name: String) : ContactListItem()
|
class Header(val name: String) : ContactListItem()
|
||||||
@ -35,11 +40,28 @@ class ContactListAdapter(
|
|||||||
binding.profilePictureView.update(contact.recipient)
|
binding.profilePictureView.update(contact.recipient)
|
||||||
binding.nameTextView.text = contact.displayName
|
binding.nameTextView.text = contact.displayName
|
||||||
binding.root.setOnClickListener { listener(contact.recipient) }
|
binding.root.setOnClickListener { listener(contact.recipient) }
|
||||||
|
|
||||||
|
// TODO: When we implement deleting contacts then probably do it here w/ something like:
|
||||||
|
/*
|
||||||
|
binding.root.setOnLongClickListener {
|
||||||
|
Log.w("[ACL]", "Long clicked on contact ${contact.recipient.name}")
|
||||||
|
binding.contentView.context.showSessionDialog {
|
||||||
|
title("Delete Contact")
|
||||||
|
text("Are you sure you want to delete this contact?")
|
||||||
|
button(R.string.delete) {
|
||||||
|
val contacts = configFactory.contacts ?: return
|
||||||
|
contacts.upsertContact(contact.recipient.address.serialize()) { priority = PRIORITY_HIDDEN }
|
||||||
|
ConfigurationMessageUtilities.forceSyncConfigurationNowIfNeeded(context)
|
||||||
|
endActionMode()
|
||||||
|
}
|
||||||
|
cancelButton(::endActionMode)
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
fun unbind() {
|
fun unbind() { binding.profilePictureView.recycle() }
|
||||||
binding.profilePictureView.recycle()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class HeaderViewHolder(
|
class HeaderViewHolder(
|
||||||
@ -52,15 +74,11 @@ class ContactListAdapter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int {
|
override fun getItemCount(): Int { return items.size }
|
||||||
return items.size
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
|
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
|
||||||
super.onViewRecycled(holder)
|
super.onViewRecycled(holder)
|
||||||
if (holder is ContactViewHolder) {
|
if (holder is ContactViewHolder) { holder.unbind() }
|
||||||
holder.unbind()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemViewType(position: Int): Int {
|
override fun getItemViewType(position: Int): Int {
|
||||||
@ -72,13 +90,9 @@ class ContactListAdapter(
|
|||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||||
return if (viewType == ViewType.Contact) {
|
return if (viewType == ViewType.Contact) {
|
||||||
ContactViewHolder(
|
ContactViewHolder(ViewContactBinding.inflate(LayoutInflater.from(context), parent, false))
|
||||||
ViewContactBinding.inflate(LayoutInflater.from(context), parent, false)
|
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
HeaderViewHolder(
|
HeaderViewHolder(ContactSectionHeaderBinding.inflate(LayoutInflater.from(context), parent, false))
|
||||||
ContactSectionHeaderBinding.inflate(LayoutInflater.from(context), parent, false)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ private const val TAG = "Storage"
|
|||||||
open class Storage(
|
open class Storage(
|
||||||
context: Context,
|
context: Context,
|
||||||
helper: SQLCipherOpenHelper,
|
helper: SQLCipherOpenHelper,
|
||||||
private val configFactory: ConfigFactory
|
val configFactory: ConfigFactory
|
||||||
) : Database(context, helper), StorageProtocol, ThreadDatabase.ConversationThreadUpdateListener {
|
) : Database(context, helper), StorageProtocol, ThreadDatabase.ConversationThreadUpdateListener {
|
||||||
|
|
||||||
override fun threadCreated(address: Address, threadId: Long) {
|
override fun threadCreated(address: Address, threadId: Long) {
|
||||||
@ -1378,12 +1378,9 @@ open class Storage(
|
|||||||
Log.w("[ACL]", "When deleting conversation, recipient is: ${recipient.name}")
|
Log.w("[ACL]", "When deleting conversation, recipient is: ${recipient.name}")
|
||||||
|
|
||||||
when {
|
when {
|
||||||
recipient.isContactRecipient -> {
|
// Note: We don't do anything if the thread is a 1-on-1 and the recipient is a contact
|
||||||
if (recipient.isLocalNumber) return
|
// of ours (i.e., when recipient.isContactRecipient)
|
||||||
val contacts = configFactory.contacts ?: return
|
|
||||||
contacts.upsertContact(recipient.address.serialize()) { priority = PRIORITY_HIDDEN }
|
|
||||||
ConfigurationMessageUtilities.forceSyncConfigurationNowIfNeeded(context)
|
|
||||||
}
|
|
||||||
recipient.isClosedGroupRecipient -> {
|
recipient.isClosedGroupRecipient -> {
|
||||||
// TODO: handle closed group
|
// TODO: handle closed group
|
||||||
val volatile = configFactory.convoVolatile ?: return
|
val volatile = configFactory.convoVolatile ?: return
|
||||||
|
@ -4,19 +4,14 @@ import network.loki.messenger.libsession_util.util.ExpiryMode
|
|||||||
|
|
||||||
import android.content.ContentResolver
|
import android.content.ContentResolver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
|
||||||
import app.cash.copper.Query
|
import app.cash.copper.Query
|
||||||
import app.cash.copper.flow.observeQuery
|
import app.cash.copper.flow.observeQuery
|
||||||
|
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
|
|
||||||
import kotlin.coroutines.resume
|
import kotlin.coroutines.resume
|
||||||
import kotlin.coroutines.resumeWithException
|
import kotlin.coroutines.resumeWithException
|
||||||
import kotlin.coroutines.suspendCoroutine
|
import kotlin.coroutines.suspendCoroutine
|
||||||
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
|
|
||||||
import org.session.libsession.database.MessageDataProvider
|
import org.session.libsession.database.MessageDataProvider
|
||||||
import org.session.libsession.messaging.messages.Destination
|
import org.session.libsession.messaging.messages.Destination
|
||||||
import org.session.libsession.messaging.messages.control.MessageRequestResponse
|
import org.session.libsession.messaging.messages.control.MessageRequestResponse
|
||||||
@ -32,9 +27,7 @@ import org.session.libsession.utilities.GroupUtil
|
|||||||
import org.session.libsession.utilities.TextSecurePreferences
|
import org.session.libsession.utilities.TextSecurePreferences
|
||||||
import org.session.libsession.utilities.recipients.Recipient
|
import org.session.libsession.utilities.recipients.Recipient
|
||||||
import org.session.libsignal.utilities.Log
|
import org.session.libsignal.utilities.Log
|
||||||
|
|
||||||
import org.session.libsignal.utilities.toHexString
|
import org.session.libsignal.utilities.toHexString
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.database.DatabaseContentProviders
|
import org.thoughtcrime.securesms.database.DatabaseContentProviders
|
||||||
import org.thoughtcrime.securesms.database.DraftDatabase
|
import org.thoughtcrime.securesms.database.DraftDatabase
|
||||||
import org.thoughtcrime.securesms.database.ExpirationConfigurationDatabase
|
import org.thoughtcrime.securesms.database.ExpirationConfigurationDatabase
|
||||||
@ -51,7 +44,6 @@ import org.thoughtcrime.securesms.database.model.MessageRecord
|
|||||||
import org.thoughtcrime.securesms.database.model.ThreadRecord
|
import org.thoughtcrime.securesms.database.model.ThreadRecord
|
||||||
import org.thoughtcrime.securesms.dependencies.ConfigFactory
|
import org.thoughtcrime.securesms.dependencies.ConfigFactory
|
||||||
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
|
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
|
||||||
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
interface ConversationRepository {
|
interface ConversationRepository {
|
||||||
@ -239,7 +231,7 @@ class DefaultConversationRepository @Inject constructor(
|
|||||||
.success {
|
.success {
|
||||||
continuation.resume(ResultOf.Success(Unit))
|
continuation.resume(ResultOf.Success(Unit))
|
||||||
}.fail { error ->
|
}.fail { error ->
|
||||||
Log.w("[onversationRepository", "Call to SnodeAPI.deleteMessage failed - attempting to resume..")
|
Log.w("ConversationRepository", "Call to SnodeAPI.deleteMessage failed - attempting to resume..")
|
||||||
continuation.resumeWithException(error)
|
continuation.resumeWithException(error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -330,9 +322,7 @@ class DefaultConversationRepository @Inject constructor(
|
|||||||
while (reader.next != null) {
|
while (reader.next != null) {
|
||||||
deleteMessageRequest(reader.current)
|
deleteMessageRequest(reader.current)
|
||||||
val recipient = reader.current.recipient
|
val recipient = reader.current.recipient
|
||||||
if (block) {
|
if (block) { setBlocked(recipient, true) }
|
||||||
setBlocked(recipient, true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ResultOf.Success(Unit)
|
return ResultOf.Success(Unit)
|
||||||
@ -359,9 +349,7 @@ class DefaultConversationRepository @Inject constructor(
|
|||||||
val cursor = mmsSmsDb.getConversation(threadId, true)
|
val cursor = mmsSmsDb.getConversation(threadId, true)
|
||||||
mmsSmsDb.readerFor(cursor).use { reader ->
|
mmsSmsDb.readerFor(cursor).use { reader ->
|
||||||
while (reader.next != null) {
|
while (reader.next != null) {
|
||||||
if (!reader.current.isOutgoing) {
|
if (!reader.current.isOutgoing) { return true }
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
Loading…
x
Reference in New Issue
Block a user