diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 87b03e5118..a5e58b4a8e 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -55,6 +55,8 @@ import android.widget.Toast; import android.widget.ViewSwitcher; import com.annimon.stream.Stream; +import com.annimon.stream.operator.LongArray; +import com.google.common.primitives.Longs; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.MessageDetailsActivity; @@ -113,6 +115,7 @@ import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Locale; +import java.util.Objects; import java.util.Set; import kotlin.Unit; @@ -414,7 +417,8 @@ public class ConversationFragment extends Fragment menu.findItem(R.id.menu_context_reply).setVisible(isPublicChat && selectedMessageCount == 1); String userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(getContext()); boolean userCanModerate = isPublicChat && LokiPublicChatAPI.Companion.isUserModerator(userHexEncodedPublicKey, publicChat.getChannel(), publicChat.getServer()); - boolean isDeleteOptionVisible = isPublicChat && selectedMessageCount == 1 && (isSentByUser || userCanModerate); +// boolean isDeleteOptionVisible = isPublicChat && selectedMessageCount == 1 && (isSentByUser || userCanModerate); + boolean isDeleteOptionVisible = isPublicChat && (isSentByUser || userCanModerate); menu.findItem(R.id.menu_context_delete_message).setVisible(isDeleteOptionVisible); } else { menu.findItem(R.id.menu_context_copy_public_key).setVisible(false); @@ -520,52 +524,44 @@ public class ConversationFragment extends Fragment { @Override protected Void doInBackground(MessageRecord... messageRecords) { + ArrayList serverIDs = new ArrayList<>(); + ArrayList ignoredMessages = new ArrayList<>(); + ArrayList failedMessages = new ArrayList<>(); + boolean isSentByUser = true; + LokiPublicChatAPI publicChatAPI = ApplicationContext.getInstance(getContext()).getLokiPublicChatAPI(); for (MessageRecord messageRecord : messageRecords) { - boolean isThreadDeleted; - - if (publicChat != null) { - final SettableFuture[] future = { new SettableFuture() }; - - LokiPublicChatAPI publicChatAPI = ApplicationContext.getInstance(getContext()).getLokiPublicChatAPI(); - boolean isSentByUser = messageRecord.isOutgoing(); - Long serverID = DatabaseFactory.getLokiMessageDatabase(getContext()).getServerID(messageRecord.id); - - if (publicChatAPI != null && serverID != null) { - publicChatAPI - .deleteMessage(serverID, publicChat.getChannel(), publicChat.getServer(), isSentByUser) - .success(l -> { - @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture) future[0]; - f.set(Unit.INSTANCE); - return Unit.INSTANCE; - }).fail(e -> { - @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture) future[0]; - f.setException(e); - return Unit.INSTANCE; - }); - } else { - @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture) future[0]; - f.setException(new Exception("Message server ID is null.")); + isSentByUser = isSentByUser && messageRecord.isOutgoing(); + Long serverID = DatabaseFactory.getLokiMessageDatabase(getContext()).getServerID(messageRecord.id); + if (serverID != null) { + serverIDs.add(serverID); + } + else { + ignoredMessages.add(messageRecord.getId()); + } + } + if (publicChat != null && publicChatAPI != null) { + publicChatAPI + .deleteMessages(serverIDs, publicChat.getChannel(), publicChat.getServer(), isSentByUser) + .success(l -> { + for (MessageRecord messageRecord : messageRecords) { + Long serverID = DatabaseFactory.getLokiMessageDatabase(getContext()).getServerID(messageRecord.id); + if (l.contains(serverID)) { + if (messageRecord.isMms()) { + DatabaseFactory.getMmsDatabase(getActivity()).delete(messageRecord.getId()); + } else { + DatabaseFactory.getSmsDatabase(getActivity()).deleteMessage(messageRecord.getId()); + } + } + else if (!ignoredMessages.contains(serverID)) { + failedMessages.add(messageRecord.getId()); + Log.d("Loki", "Failed to delete message: " + messageRecord.getId() + "."); + } } - - try { - @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture)future[0]; - f.get(); - } catch (Exception exception) { - Log.d("Loki", "Couldn't delete message due to error: " + exception.toString() + "."); - return null; - } - } - - if (messageRecord.isMms()) { - isThreadDeleted = DatabaseFactory.getMmsDatabase(getActivity()).delete(messageRecord.getId()); - } else { - isThreadDeleted = DatabaseFactory.getSmsDatabase(getActivity()).deleteMessage(messageRecord.getId()); - } - - if (isThreadDeleted) { - threadId = -1; - listener.setThreadId(threadId); - } + return null; + }). fail(e -> { + Log.d("Loki", "Couldn't delete message due to error: " + e.toString() + "."); + return null; + }); } return null;