diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 8dec42dcf9..f4320716b5 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -68,6 +68,7 @@ import org.thoughtcrime.securesms.contactshare.ContactUtil; import org.thoughtcrime.securesms.contactshare.SharedContactDetailsActivity; import org.thoughtcrime.securesms.conversation.ConversationAdapter.HeaderViewHolder; import org.thoughtcrime.securesms.conversation.ConversationAdapter.ItemClickListener; +import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; import org.thoughtcrime.securesms.database.Address; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MmsSmsDatabase; @@ -80,6 +81,8 @@ import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate; +import org.thoughtcrime.securesms.loki.LokiAPIDatabase; +import org.thoughtcrime.securesms.loki.LokiUserDatabase; import org.thoughtcrime.securesms.longmessage.LongMessageActivity; import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.mms.GlideApp; @@ -101,6 +104,8 @@ import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.concurrent.SimpleTask; import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask; import org.whispersystems.libsignal.util.guava.Optional; +import org.whispersystems.signalservice.internal.util.concurrent.SettableFuture; +import org.whispersystems.signalservice.loki.api.LokiGroupChatAPI; import java.io.IOException; import java.io.InputStream; @@ -112,6 +117,7 @@ import java.util.List; import java.util.Locale; import java.util.Set; +import kotlin.Unit; import network.loki.messenger.R; @SuppressLint("StaticFieldLeak") @@ -403,8 +409,9 @@ public class ConversationFragment extends Fragment if (isLokiPublicChat) { menu.findItem(R.id.menu_context_reply).setVisible(false); - menu.findItem(R.id.menu_context_delete_message).setVisible(false); } + + menu.findItem(R.id.menu_context_delete_message).setVisible(true); } private ConversationAdapter getListAdapter() { @@ -488,6 +495,8 @@ public class ConversationFragment extends Fragment builder.setMessage(getActivity().getResources().getQuantityString(R.plurals.ConversationFragment_this_will_permanently_delete_all_n_selected_messages, messagesCount, messagesCount)); builder.setCancelable(true); + boolean isLokiPublicChat = this.recipient.isGroupRecipient(); + builder.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { @@ -498,15 +507,52 @@ public class ConversationFragment extends Fragment @Override protected Void doInBackground(MessageRecord... messageRecords) { for (MessageRecord messageRecord : messageRecords) { - boolean threadDeleted; + boolean isThreadDeleted; + + if (isLokiPublicChat) { + + final SettableFuture[] future = { new SettableFuture() }; + + String userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(getContext()); + LokiAPIDatabase lokiAPIDatabase = DatabaseFactory.getLokiAPIDatabase(getContext()); + LokiUserDatabase lokiUserDatabase = DatabaseFactory.getLokiUserDatabase(getContext()); + byte[] userPrivateKey = IdentityKeyUtil.getIdentityKeyPair(getContext()).getPrivateKey().serialize(); + + Long serverID = DatabaseFactory.getLokiMessageDatabase(getContext()).getServerID(messageRecord.id); + + if (serverID != null) { + new LokiGroupChatAPI(userHexEncodedPublicKey, userPrivateKey, lokiAPIDatabase, lokiUserDatabase) + .deleteMessage(serverID, LokiGroupChatAPI.getPublicChatServerID(), LokiGroupChatAPI.getPublicChatServer(), true) + .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("Missing message server ID.")); + } + + 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()) { - threadDeleted = DatabaseFactory.getMmsDatabase(getActivity()).delete(messageRecord.getId()); + isThreadDeleted = DatabaseFactory.getMmsDatabase(getActivity()).delete(messageRecord.getId()); } else { - threadDeleted = DatabaseFactory.getSmsDatabase(getActivity()).deleteMessage(messageRecord.getId()); + isThreadDeleted = DatabaseFactory.getSmsDatabase(getActivity()).deleteMessage(messageRecord.getId()); } - if (threadDeleted) { + if (isThreadDeleted) { threadId = -1; listener.setThreadId(threadId); } diff --git a/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt b/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt index 0548e9e6fe..11429c1e84 100644 --- a/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt +++ b/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt @@ -18,6 +18,13 @@ class LokiMessageDatabase(context: Context, helper: SQLCipherOpenHelper) : Datab @JvmStatic val createTableCommand = "CREATE TABLE $tableName ($messageID INTEGER PRIMARY KEY, $serverID INTEGER DEFAULT 0, $friendRequestStatus INTEGER DEFAULT 0);" } + fun getServerID(messageID: Long): Long? { + val database = databaseHelper.readableDatabase + return database.get(tableName, "${Companion.messageID} = ?", arrayOf( messageID.toString() )) { cursor -> + cursor.getInt(Companion.serverID) + }?.toLong() + } + fun getMessageID(serverID: Long): Long? { val database = databaseHelper.readableDatabase return database.get(tableName, "${Companion.serverID} = ?", arrayOf( serverID.toString() )) { cursor ->