mirror of
https://github.com/oxen-io/session-android.git
synced 2024-12-24 00:37:47 +00:00
SES1688 - Deleting last message in conversation, group, or community leaves the RecyclerView in a broken state (#1449)
* Initial fix implemented * Fixes #1448 * Addressed PR feedback
This commit is contained in:
parent
34eedc0fdb
commit
165ade7259
@ -1112,6 +1112,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
||||
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()
|
||||
@ -1882,12 +1883,12 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
||||
Log.w("ConversationActivityV2", "Asked to delete messages but could not obtain viewModel recipient - aborting.")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
val allSentByCurrentUser = messages.all { it.isOutgoing }
|
||||
val allHasHash = messages.all { lokiMessageDb.getMessageServerHash(it.id, it.isMms) != null }
|
||||
|
||||
// If the recipient is a community then we delete the message for everyone
|
||||
if (recipient.isCommunityRecipient) {
|
||||
// If the recipient is a community OR a Note-to-Self then we delete the message for everyone
|
||||
if (recipient.isCommunityRecipient || recipient.isLocalNumber) {
|
||||
val messageCount = 1 // Only used for plurals string
|
||||
showSessionDialog {
|
||||
title(resources.getQuantityString(R.plurals.ConversationFragment_delete_selected_messages, messageCount, messageCount))
|
||||
@ -1917,8 +1918,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
||||
}
|
||||
bottomSheet.show(supportFragmentManager, bottomSheet.tag)
|
||||
}
|
||||
else // Finally, if this is a closed group and you are deleting someone else's message(s)
|
||||
// then we can only delete locally.
|
||||
else // Finally, if this is a closed group and you are deleting someone else's message(s) then we can only delete locally.
|
||||
{
|
||||
val messageCount = 1
|
||||
showSessionDialog {
|
||||
@ -2027,7 +2027,6 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
||||
val message = messages.first() as MmsMessageRecord
|
||||
|
||||
// Do not allow the user to download a file attachment before it has finished downloading
|
||||
// TODO: Localise the msg in this toast!
|
||||
if (message.isMediaPending) {
|
||||
Toast.makeText(this, resources.getString(R.string.conversation_activity__wait_until_attachment_has_finished_downloading), Toast.LENGTH_LONG).show()
|
||||
return
|
||||
|
@ -1095,8 +1095,7 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
|
||||
}
|
||||
val whereString = where.substring(0, where.length - 4)
|
||||
try {
|
||||
cursor =
|
||||
db!!.query(TABLE_NAME, arrayOf<String?>(ID), whereString, null, null, null, null)
|
||||
cursor = db!!.query(TABLE_NAME, arrayOf<String?>(ID), whereString, null, null, null, null)
|
||||
val toDeleteStringMessageIds = mutableListOf<String>()
|
||||
while (cursor.moveToNext()) {
|
||||
toDeleteStringMessageIds += cursor.getLong(0).toString()
|
||||
|
@ -633,6 +633,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
long threadId = getThreadIdForMessage(messageId);
|
||||
db.delete(TABLE_NAME, ID_WHERE, new String[] {messageId+""});
|
||||
notifyConversationListeners(threadId);
|
||||
boolean threadDeleted = DatabaseComponent.get(context).threadDatabase().update(threadId, false, true);
|
||||
return threadDeleted;
|
||||
}
|
||||
|
@ -515,12 +515,6 @@ public class ThreadDatabase extends Database {
|
||||
return getConversationList(where);
|
||||
}
|
||||
|
||||
public Cursor getArchivedConversationList() {
|
||||
String where = "(" + MESSAGE_COUNT + " != 0 OR " + GroupDatabase.TABLE_NAME + "." + GROUP_ID + " LIKE '" + COMMUNITY_PREFIX + "%') " +
|
||||
"AND " + ARCHIVED + " = 1 ";
|
||||
return getConversationList(where);
|
||||
}
|
||||
|
||||
private Cursor getConversationList(String where) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
String query = createQuery(where, 0);
|
||||
@ -750,10 +744,7 @@ public class ThreadDatabase extends Database {
|
||||
return true;
|
||||
}
|
||||
|
||||
MmsSmsDatabase.Reader reader = null;
|
||||
|
||||
try {
|
||||
reader = mmsSmsDatabase.readerFor(mmsSmsDatabase.getConversationSnippet(threadId));
|
||||
try (MmsSmsDatabase.Reader reader = mmsSmsDatabase.readerFor(mmsSmsDatabase.getConversationSnippet(threadId))) {
|
||||
MessageRecord record = null;
|
||||
if (reader != null) {
|
||||
record = reader.getNext();
|
||||
@ -771,11 +762,10 @@ public class ThreadDatabase extends Database {
|
||||
deleteThread(threadId);
|
||||
return true;
|
||||
}
|
||||
// todo: add empty snippet that clears existing data
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (reader != null)
|
||||
reader.close();
|
||||
notifyConversationListListeners();
|
||||
notifyConversationListeners(threadId);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user