diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 52178c4f26..452954fdf0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -1136,7 +1136,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe val builder = AlertDialog.Builder(this) val sessionID = messages.first().individualRecipient.address.toString() builder.setTitle(R.string.ConversationFragment_ban_selected_user) - builder.setMessage("This will ban the selected user from this room. It won't ban them from other rooms. The selected user won't know that they've been banned.") + builder.setMessage("This will ban the selected user from this room. It won't ban them from other rooms.") builder.setCancelable(true) val openGroup = DatabaseFactory.getLokiThreadDatabase(this).getOpenGroupChat(threadID)!! builder.setPositiveButton(R.string.ban) { _, _ -> @@ -1154,6 +1154,28 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe builder.show() } + override fun banAndDeleteAll(messages: Set) { + val builder = AlertDialog.Builder(this) + val sessionID = messages.first().individualRecipient.address.toString() + builder.setTitle(R.string.ConversationFragment_ban_selected_user) + builder.setMessage("This will ban the selected user from this room and delete all messages sent by them. It won't ban them from other rooms or delete the messages they sent there.") + builder.setCancelable(true) + val openGroup = DatabaseFactory.getLokiThreadDatabase(this).getOpenGroupChat(threadID)!! + builder.setPositiveButton(R.string.ban) { _, _ -> + OpenGroupAPIV2.banAndDeleteAll(sessionID, openGroup.room, openGroup.server).successUi { + Toast.makeText(this@ConversationActivityV2, "Successfully banned user and deleted all their messages", Toast.LENGTH_LONG).show() + }.failUi { error -> + Toast.makeText(this@ConversationActivityV2, "Couldn't execute request due to error: $error", Toast.LENGTH_LONG).show() + } + endActionMode() + } + builder.setNegativeButton(android.R.string.cancel) { dialog, _ -> + dialog.dismiss() + endActionMode() + } + builder.show() + } + override fun copyMessages(messages: Set) { val sortedMessages = messages.sortedBy { it.dateSent } val builder = StringBuilder() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationActionModeCallback.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationActionModeCallback.kt index 62f292e325..7d3a06e6b1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationActionModeCallback.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationActionModeCallback.kt @@ -51,6 +51,8 @@ class ConversationActionModeCallback(private val adapter: ConversationAdapter, p menu.findItem(R.id.menu_context_delete_message).isVisible = userCanDeleteSelectedItems() // Ban user menu.findItem(R.id.menu_context_ban_user).isVisible = userCanBanSelectedUsers() + // Ban and delete all + menu.findItem(R.id.menu_context_ban_and_delete_all).isVisible = userCanBanSelectedUsers() // Copy message text menu.findItem(R.id.menu_context_copy).isVisible = !containsControlMessage && hasText // Copy Session ID @@ -75,6 +77,7 @@ class ConversationActionModeCallback(private val adapter: ConversationAdapter, p when (item.itemId) { R.id.menu_context_delete_message -> delegate?.deleteMessages(selectedItems) R.id.menu_context_ban_user -> delegate?.banUser(selectedItems) + R.id.menu_context_ban_and_delete_all -> delegate?.banAndDeleteAll(selectedItems) R.id.menu_context_copy -> delegate?.copyMessages(selectedItems) R.id.menu_context_copy_public_key -> delegate?.copySessionID(selectedItems) R.id.menu_context_resend -> delegate?.resendMessage(selectedItems) @@ -94,6 +97,7 @@ interface ConversationActionModeCallbackDelegate { fun deleteMessages(messages: Set) fun banUser(messages: Set) + fun banAndDeleteAll(messages: Set) fun copyMessages(messages: Set) fun copySessionID(messages: Set) fun resendMessage(messages: Set) diff --git a/app/src/main/res/layout/media_overview_gallery_item_header.xml b/app/src/main/res/layout/media_overview_gallery_item_header.xml index b6ba05e274..9c6036b4d5 100644 --- a/app/src/main/res/layout/media_overview_gallery_item_header.xml +++ b/app/src/main/res/layout/media_overview_gallery_item_header.xml @@ -15,5 +15,5 @@ android:textColor="?attr/media_overview_header_foreground" android:textSize="@dimen/small_font_size" tools:text="March 1, 2015" /> - + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_conversation_item_action.xml b/app/src/main/res/menu/menu_conversation_item_action.xml index ffa6fc7ed3..60874fd7b4 100644 --- a/app/src/main/res/menu/menu_conversation_item_action.xml +++ b/app/src/main/res/menu/menu_conversation_item_action.xml @@ -37,6 +37,11 @@ android:id="@+id/menu_context_ban_user" app:showAsAction="never" /> + + Copy text Delete message Ban user + Ban and delete all Resend message Reply to message diff --git a/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupAPIV2.kt b/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupAPIV2.kt index 701d9d4bbe..c6f335472c 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupAPIV2.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupAPIV2.kt @@ -337,6 +337,14 @@ object OpenGroupAPIV2 { } } + fun banAndDeleteAll(publicKey: String, room: String, server: String): Promise { + val parameters = mapOf( "public_key" to publicKey ) + val request = Request(verb = POST, room = room, server = server, endpoint = "ban_and_delete_all", parameters = parameters) + return send(request).map { + Log.d("Loki", "Banned user: $publicKey from: $server.$room.") + } + } + fun unban(publicKey: String, room: String, server: String): Promise { val request = Request(verb = DELETE, room = room, server = server, endpoint = "block_list/$publicKey") return send(request).map {