diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 48044766a..af0b81585 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -2822,6 +2822,26 @@ public class XmppConnectionService extends Service { }); } + public void destroyRoom(final Conversation conversation, final OnRoomDestroy callback) { + IqPacket request = new IqPacket(IqPacket.TYPE.SET); + request.setTo(conversation.getJid().asBareJid()); + request.query("http://jabber.org/protocol/muc#owner").addChild("destroy"); + sendIqPacket(conversation.getAccount(), request, new OnIqPacketReceived() { + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + if (packet.getType() == IqPacket.TYPE.RESULT) { + if (callback != null) { + callback.onRoomDestroySucceeded(); + } + } else if (packet.getType() == IqPacket.TYPE.ERROR) { + if (callback != null) { + callback.onRoomDestroyFailed(); + } + } + } + }); + } + private void disconnect(Account account, boolean force) { if ((account.getStatus() == Account.State.ONLINE) || (account.getStatus() == Account.State.DISABLED)) { @@ -4140,6 +4160,12 @@ public class XmppConnectionService extends Service { void onPasswordChangeFailed(); } + public interface OnRoomDestroy { + void onRoomDestroySucceeded(); + + void onRoomDestroyFailed(); + } + public interface OnAffiliationChanged { void onAffiliationChangedSuccessful(Jid jid); diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index 8d2efff0b..882b8f364 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -72,7 +72,7 @@ import rocks.xmpp.addr.Jid; import static eu.siacs.conversations.entities.Bookmark.printableValue; import static eu.siacs.conversations.utils.StringUtils.changed; -public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged, XmppConnectionService.OnConfigurationPushed, TextWatcher, OnMediaLoaded { +public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged, XmppConnectionService.OnConfigurationPushed, XmppConnectionService.OnRoomDestroy, TextWatcher, OnMediaLoaded { public static final String ACTION_VIEW_MUC = "view_muc"; private static final float INACTIVE_ALPHA = 0.4684f; //compromise between dark and light theme @@ -319,6 +319,9 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers case R.id.action_delete_bookmark: deleteBookmark(); break; + case R.id.action_destroy_room: + destroyRoom(); + break; case R.id.action_advanced_mode: this.mAdvancedMode = !menuItem.isChecked(); menuItem.setChecked(this.mAdvancedMode); @@ -406,6 +409,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers MenuItem menuItemSaveBookmark = menu.findItem(R.id.action_save_as_bookmark); MenuItem menuItemDeleteBookmark = menu.findItem(R.id.action_delete_bookmark); MenuItem menuItemAdvancedMode = menu.findItem(R.id.action_advanced_mode); + MenuItem menuItemDestroyRoom = menu.findItem(R.id.action_destroy_room); menuItemAdvancedMode.setChecked(mAdvancedMode); if (mConversation == null) { return true; @@ -417,6 +421,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers menuItemDeleteBookmark.setVisible(false); menuItemSaveBookmark.setVisible(true); } + menuItemDestroyRoom.setVisible(mConversation.getMucOptions().getSelf().getAffiliation().ranks(MucOptions.Affiliation.OWNER)); return true; } @@ -481,6 +486,19 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers updateView(); } + protected void destroyRoom() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.destroy_room); + builder.setMessage(R.string.destroy_room_dialog); + builder.setPositiveButton(R.string.ok, (dialog, which) -> { + xmppConnectionService.destroyRoom(mConversation, ConferenceDetailsActivity.this); + }); + builder.setNegativeButton(R.string.cancel, null); + final AlertDialog dialog = builder.create(); + dialog.setCanceledOnTouchOutside(false); + dialog.show(); + } + @Override void onBackendConnected() { if (mPendingConferenceInvite != null) { @@ -687,6 +705,15 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers displayToast(getString(resId, nick)); } + @Override + public void onRoomDestroySucceeded() { + finish(); + } + @Override + public void onRoomDestroyFailed() { + displayToast(getString(R.string.could_not_destroy_room)); + } + @Override public void onPushSucceeded() { displayToast(getString(R.string.modified_conference_options)); diff --git a/src/main/res/menu/muc_details.xml b/src/main/res/menu/muc_details.xml index 5fc3ac600..16063b2b1 100644 --- a/src/main/res/menu/muc_details.xml +++ b/src/main/res/menu/muc_details.xml @@ -31,6 +31,11 @@ android:orderInCategory="80" app:showAsAction="never" android:title="@string/delete_bookmark"/> + room@conference.example.com/nick Save as bookmark Delete bookmark + Destroy group chat + Are you sure you want to destroy this group chat?\n\nWarning: The group chat will be completely removed on the server. + Could not destroy room This bookmark already exists Edit group chat subject Topic