From a892bb6f1685b84b74ba37e5a6a24ee8fb45eee7 Mon Sep 17 00:00:00 2001 From: steckbrief Date: Mon, 7 Aug 2017 12:57:57 +0200 Subject: Simplifying introduction of new XEP implementations, implements FS#250 and FS#251 (Privacy and Security settings), refactoring of location of some interfaces --- .../muc/OnConferenceConfigurationFetched.java | 10 +++ .../services/muc/OnConferenceJoined.java | 7 ++ .../listener/ConferenceConfigurationFetched.java | 96 ++++++++++++++++++++++ .../ConferenceServiceDiscoveryReceived.java | 59 +++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 src/main/java/de/thedevstack/conversationsplus/services/muc/OnConferenceConfigurationFetched.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/services/muc/OnConferenceJoined.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/services/muc/listener/ConferenceConfigurationFetched.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/services/muc/listener/ConferenceServiceDiscoveryReceived.java (limited to 'src/main/java/de/thedevstack/conversationsplus/services/muc') diff --git a/src/main/java/de/thedevstack/conversationsplus/services/muc/OnConferenceConfigurationFetched.java b/src/main/java/de/thedevstack/conversationsplus/services/muc/OnConferenceConfigurationFetched.java new file mode 100644 index 00000000..7e7222fd --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/services/muc/OnConferenceConfigurationFetched.java @@ -0,0 +1,10 @@ +package de.thedevstack.conversationsplus.services.muc; + +import de.thedevstack.conversationsplus.entities.Conversation; +import de.thedevstack.conversationsplus.xml.Element; + +public interface OnConferenceConfigurationFetched { + void onConferenceConfigurationFetched(Conversation conversation); + + void onFetchFailed(Conversation conversation, Element error); +} \ No newline at end of file diff --git a/src/main/java/de/thedevstack/conversationsplus/services/muc/OnConferenceJoined.java b/src/main/java/de/thedevstack/conversationsplus/services/muc/OnConferenceJoined.java new file mode 100644 index 00000000..5e9a0af5 --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/services/muc/OnConferenceJoined.java @@ -0,0 +1,7 @@ +package de.thedevstack.conversationsplus.services.muc; + +import de.thedevstack.conversationsplus.entities.Conversation; + +public interface OnConferenceJoined { + void onConferenceJoined(Conversation conversation); +} \ No newline at end of file diff --git a/src/main/java/de/thedevstack/conversationsplus/services/muc/listener/ConferenceConfigurationFetched.java b/src/main/java/de/thedevstack/conversationsplus/services/muc/listener/ConferenceConfigurationFetched.java new file mode 100644 index 00000000..a386db88 --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/services/muc/listener/ConferenceConfigurationFetched.java @@ -0,0 +1,96 @@ +package de.thedevstack.conversationsplus.services.muc.listener; + +import android.util.Log; + +import de.thedevstack.conversationsplus.Config; +import de.thedevstack.conversationsplus.entities.Account; +import de.thedevstack.conversationsplus.entities.Conversation; +import de.thedevstack.conversationsplus.entities.MucOptions; +import de.thedevstack.conversationsplus.generator.PresenceGenerator; +import de.thedevstack.conversationsplus.persistance.DatabaseBackend; +import de.thedevstack.conversationsplus.services.muc.OnConferenceConfigurationFetched; +import de.thedevstack.conversationsplus.services.muc.OnConferenceJoined; +import de.thedevstack.conversationsplus.utils.XmppConnectionServiceAccessor; +import de.thedevstack.conversationsplus.utils.XmppSendUtil; +import de.thedevstack.conversationsplus.xml.Element; +import de.thedevstack.conversationsplus.xmpp.OnIqPacketReceived; +import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; +import de.thedevstack.conversationsplus.xmpp.stanzas.PresencePacket; + +/** + */ +public class ConferenceConfigurationFetched implements OnConferenceConfigurationFetched { + private OnConferenceJoined onConferenceJoined; + + public ConferenceConfigurationFetched(OnConferenceJoined onConferenceJoined) { + this.onConferenceJoined = onConferenceJoined; + } + + private void join(Conversation conversation) { + Account account = conversation.getAccount(); + final MucOptions mucOptions = conversation.getMucOptions(); + final Jid joinJid = mucOptions.getSelf().getFullJid(); + Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": joining conversation " + joinJid.toString()); + long lastMessageTransmitted = conversation.getLastMessageTransmitted(); + PresencePacket packet = PresenceGenerator.generateMucJoin(account, joinJid, mucOptions, lastMessageTransmitted); + XmppSendUtil.sendPresencePacket(account, packet); + if (onConferenceJoined != null) { + onConferenceJoined.onConferenceJoined(conversation); + } + if (!joinJid.equals(conversation.getJid())) { + conversation.setContactJid(joinJid); + DatabaseBackend.getInstance().updateConversation(conversation); + } + + if (mucOptions.mamSupport()) { + XmppConnectionServiceAccessor.xmppConnectionService.getMessageArchiveService().catchupMUC(conversation); + } + if (mucOptions.membersOnly() && mucOptions.nonanonymous()) { + fetchConferenceMembers(conversation); + } + XmppConnectionServiceAccessor.xmppConnectionService.sendUnsentMessages(conversation); + } + + @Override + public void onConferenceConfigurationFetched(Conversation conversation) { + join(conversation); + } + + @Override + public void onFetchFailed(final Conversation conversation, Element error) { + join(conversation); + XmppConnectionServiceAccessor.xmppConnectionService.fetchConferenceConfiguration(conversation); + } + + private void fetchConferenceMembers(final Conversation conversation) { + final Account account = conversation.getAccount(); + final String[] affiliations = {"member","admin","owner"}; + OnIqPacketReceived callback = new OnIqPacketReceived() { + + private int i = 0; + + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + Element query = packet.query("http://jabber.org/protocol/muc#admin"); + if (packet.getType() == IqPacket.TYPE.RESULT && query != null) { + for(Element child : query.getChildren()) { + if ("item".equals(child.getName())) { + conversation.getMucOptions().putMember(child.getAttributeAsJid("jid")); + } + } + } else { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": could not request affiliation "+affiliations[i]+" in "+conversation.getJid().toBareJid()); + } + ++i; + if (i >= affiliations.length) { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": retrieved members for "+conversation.getJid().toBareJid()+": "+conversation.getMucOptions().getMembers()); + } + } + }; + for(String affiliation : affiliations) { + XmppSendUtil.sendIqPacket(account, XmppConnectionServiceAccessor.xmppConnectionService.getIqGenerator().queryAffiliation(conversation, affiliation), callback); + } + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": fetching members for "+conversation.getName()); + } +} diff --git a/src/main/java/de/thedevstack/conversationsplus/services/muc/listener/ConferenceServiceDiscoveryReceived.java b/src/main/java/de/thedevstack/conversationsplus/services/muc/listener/ConferenceServiceDiscoveryReceived.java new file mode 100644 index 00000000..5d1b8c8d --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/services/muc/listener/ConferenceServiceDiscoveryReceived.java @@ -0,0 +1,59 @@ +package de.thedevstack.conversationsplus.services.muc.listener; + +import android.util.Log; + +import java.util.ArrayList; + +import de.thedevstack.conversationsplus.Config; +import de.thedevstack.conversationsplus.entities.Account; +import de.thedevstack.conversationsplus.entities.Conversation; +import de.thedevstack.conversationsplus.services.XmppConnectionService; +import de.thedevstack.conversationsplus.services.muc.OnConferenceConfigurationFetched; +import de.thedevstack.conversationsplus.utils.UiUpdateHelper; +import de.thedevstack.conversationsplus.xml.Element; +import de.thedevstack.conversationsplus.xmpp.OnIqPacketReceived; +import de.thedevstack.conversationsplus.xmpp.disco.ServiceDiscovery; +import de.thedevstack.conversationsplus.xmpp.forms.Data; +import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; + +/** + */ +public class ConferenceServiceDiscoveryReceived implements OnIqPacketReceived { + private Conversation conversation; + private OnConferenceConfigurationFetched callback; + + public ConferenceServiceDiscoveryReceived(Conversation conversation, OnConferenceConfigurationFetched callback) { + this.conversation = conversation; + this.callback = callback; + } + + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + Element query = packet.findChild(ServiceDiscovery.ELEMENT, ServiceDiscovery.NAMESPACE); + if (packet.getType() == IqPacket.TYPE.RESULT && query != null) { + ArrayList features = new ArrayList<>(); + for (Element child : query.getChildren()) { + if (child != null && child.getName().equals("feature")) { + String var = child.getAttribute("var"); + if (var != null) { + features.add(var); + } + } + } + Element form = query.findChild("x", "jabber:x:data"); + if (form != null) { + conversation.getMucOptions().updateFormData(Data.parse(form)); + } + conversation.getMucOptions().updateFeatures(features); + if (callback != null) { + callback.onConferenceConfigurationFetched(conversation); + } + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": fetched muc configuration for " + conversation.getJid().toBareJid() + " - " + features.toString()); + UiUpdateHelper.updateConversationUi(); + } else if (packet.getType() == IqPacket.TYPE.ERROR) { + if (callback != null) { + callback.onFetchFailed(conversation, packet.getError()); + } + } + } +} -- cgit v1.2.3