From f338d897535ebc7737a6bc5edb169d9ae41627c1 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 4 Jan 2015 00:14:40 +0100 Subject: no longer use ConcurrentHashMap in favor of synchronize on a final HashMap --- .../eu/siacs/conversations/entities/Roster.java | 46 +++++++++++++--------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Roster.java b/src/main/java/eu/siacs/conversations/entities/Roster.java index 1a81a419..ce058004 100644 --- a/src/main/java/eu/siacs/conversations/entities/Roster.java +++ b/src/main/java/eu/siacs/conversations/entities/Roster.java @@ -1,14 +1,14 @@ package eu.siacs.conversations.entities; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import java.util.concurrent.ConcurrentHashMap; import eu.siacs.conversations.xmpp.jid.Jid; public class Roster { final Account account; - final ConcurrentHashMap contacts = new ConcurrentHashMap<>(); + final HashMap contacts = new HashMap<>(); private String version = null; public Roster(Account account) { @@ -19,23 +19,27 @@ public class Roster { if (jid == null) { return null; } - final Contact contact = contacts.get(jid.toBareJid().toString()); - if (contact != null && contact.showInRoster()) { - return contact; - } else { - return null; + synchronized (this.contacts) { + Contact contact = contacts.get(jid.toBareJid().toString()); + if (contact != null && contact.showInRoster()) { + return contact; + } else { + return null; + } } } public Contact getContact(final Jid jid) { - final Jid bareJid = jid.toBareJid(); - if (contacts.containsKey(bareJid.toString())) { - return contacts.get(bareJid.toString()); - } else { - final Contact contact = new Contact(bareJid); - contact.setAccount(account); - contacts.put(bareJid.toString(), contact); - return contact; + synchronized (this.contacts) { + final Jid bareJid = jid.toBareJid(); + if (contacts.containsKey(bareJid.toString())) { + return contacts.get(bareJid.toString()); + } else { + Contact contact = new Contact(bareJid); + contact.setAccount(account); + contacts.put(bareJid.toString(), contact); + return contact; + } } } @@ -46,13 +50,13 @@ public class Roster { } public void markAllAsNotInRoster() { - for (final Contact contact : getContacts()) { + for (Contact contact : getContacts()) { contact.resetOption(Contact.Options.IN_ROSTER); } } public void clearSystemAccounts() { - for (final Contact contact : getContacts()) { + for (Contact contact : getContacts()) { contact.setPhotoUri(null); contact.setSystemName(null); contact.setSystemAccount(null); @@ -60,13 +64,17 @@ public class Roster { } public List getContacts() { - return new ArrayList<>(this.contacts.values()); + synchronized (this.contacts) { + return new ArrayList<>(this.contacts.values()); + } } public void initContact(final Contact contact) { contact.setAccount(account); contact.setOption(Contact.Options.IN_ROSTER); - contacts.put(contact.getJid().toBareJid().toString(), contact); + synchronized (this.contacts) { + contacts.put(contact.getJid().toBareJid().toString(), contact); + } } public void setVersion(String version) { -- cgit v1.2.3 From b739a0d200d67d972572d1a37a32c75db2d043a4 Mon Sep 17 00:00:00 2001 From: kriztan Date: Sun, 4 Jan 2015 11:16:21 +0100 Subject: corrected German 'private_message_to' --- src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 9e8e3b3d..469e47e8 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -245,7 +245,7 @@ (Oder klicke lange, um Standard wiederherzustellen) Dein Server unterstützt die Veröffentlichung von Avataren nicht. private Nachricht - an %s + an %s: Sende private Nachricht an %s Verbinden Das Konto existiert bereits -- cgit v1.2.3 From c674e9c3e9e30490de4aa31da204519776124deb Mon Sep 17 00:00:00 2001 From: sergio Date: Sun, 4 Jan 2015 11:24:53 +0100 Subject: Update spanish translations --- src/main/res/values-es/strings.xml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index d47a3adc..cd67c2c9 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -365,6 +365,20 @@ Buscar historial en servidor No más historial del servidor Actualizando… - !Contraseña cambiada! + ¡Contraseña cambiada! No se puede cambiar la contraseña + Enviar mensaje para empezar una conversación cifrada + Haz una pregunta + Si tu contacto y tú tenéis un secreto en común que nadie más sabe (como una broma o simplemente lo que tomasteis para comer la última vez que os visteis) podéis usar ese secreto para verificar la huella digital de cada uno.\n\nPuedes usar una sugerencia o pregunta para hacer a tu contacto que deberá responder distinguiendo mayúsculas y minúsculas. + Tu contacto quiere verificar tu huella digital a través de un secreto compartido. Tu contacto te hace la siguiente sugerencia o pregunta para ese secreto. + La pregunta no puede ser vacía + El secreto compartido no puede ser vacío + Compara detenidamente la huella digital mostrada abajo con la de tu contacto.\nPuedes usar cualquier forma de comunicación segura como un correo electrónico cifrado o conversación telefónica para verificarlo. + Cambiar contraseña + Contraseña actual + Nueva contraseña + La contraseña no puede ser vacía + Habilitar todas las cuentas + Deshabilitar todas las cuentas + Realizar acción con -- cgit v1.2.3 From e32a927300a96fc59adcabb2ebc16318e67de226 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 4 Jan 2015 12:09:39 +0100 Subject: Use packet callbacks only for IqPackets. Removed unnecessary code --- .../services/XmppConnectionService.java | 4 +- .../siacs/conversations/xmpp/XmppConnection.java | 104 +++++++-------------- 2 files changed, 37 insertions(+), 71 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 6bdc55a1..04fc04d3 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -803,7 +803,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa final IqPacket iqPacket = new IqPacket(IqPacket.TYPE_GET); final Element query = iqPacket.query("jabber:iq:private"); query.addChild("storage", "storage:bookmarks"); - final PacketReceived callback = new OnIqPacketReceived() { + final OnIqPacketReceived callback = new OnIqPacketReceived() { @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { @@ -2090,7 +2090,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } } - public void sendIqPacket(final Account account, final IqPacket packet, final PacketReceived callback) { + public void sendIqPacket(final Account account, final IqPacket packet, final OnIqPacketReceived callback) { final XmppConnection connection = account.getXmppConnection(); if (connection != null) { connection.sendIqPacket(packet, callback); diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index f7f0c346..ff3210a4 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -104,7 +104,7 @@ public class XmppConnection implements Runnable { private long lastConnect = 0; private long lastSessionStarted = 0; private int attempt = 0; - private final Map packetCallbacks = new Hashtable<>(); + private final Map packetCallbacks = new Hashtable<>(); private OnPresencePacketReceived presenceListener = null; private OnJinglePacketReceived jingleListener = null; private OnIqPacketReceived unregisteredIqListener = null; @@ -444,50 +444,24 @@ public class XmppConnection implements Runnable { } } else { if (packetCallbacks.containsKey(packet.getId())) { - if (packetCallbacks.get(packet.getId()) instanceof OnIqPacketReceived) { - ((OnIqPacketReceived) packetCallbacks.get(packet.getId())) - .onIqPacketReceived(account, packet); - } - + packetCallbacks.get(packet.getId()).onIqPacketReceived(account, packet); packetCallbacks.remove(packet.getId()); } else if ((packet.getType() == IqPacket.TYPE_GET || packet .getType() == IqPacket.TYPE_SET) && this.unregisteredIqListener != null) { this.unregisteredIqListener.onIqPacketReceived(account, packet); - } + } } } - private void processMessage(final Tag currentTag) throws XmlPullParserException, - IOException { - final MessagePacket packet = (MessagePacket) processPacket(currentTag, - PACKET_MESSAGE); - final String id = packet.getAttribute("id"); - if ((id != null) && (packetCallbacks.containsKey(id))) { - if (packetCallbacks.get(id) instanceof OnMessagePacketReceived) { - ((OnMessagePacketReceived) packetCallbacks.get(id)) - .onMessagePacketReceived(account, packet); - } - packetCallbacks.remove(id); - } else if (this.messageListener != null) { - this.messageListener.onMessagePacketReceived(account, packet); - } + private void processMessage(final Tag currentTag) throws XmlPullParserException, IOException { + final MessagePacket packet = (MessagePacket) processPacket(currentTag,PACKET_MESSAGE); + this.messageListener.onMessagePacketReceived(account, packet); } - private void processPresence(final Tag currentTag) throws XmlPullParserException, - IOException { - PresencePacket packet = (PresencePacket) processPacket(currentTag, - PACKET_PRESENCE); - final String id = packet.getAttribute("id"); - if ((id != null) && (packetCallbacks.containsKey(id))) { - if (packetCallbacks.get(id) instanceof OnPresencePacketReceived) { - ((OnPresencePacketReceived) packetCallbacks.get(id)) - .onPresencePacketReceived(account, packet); - } - packetCallbacks.remove(id); - } else if (this.presenceListener != null) { - this.presenceListener.onPresencePacketReceived(account, packet); - } + private void processPresence(final Tag currentTag) throws XmlPullParserException, IOException { + PresencePacket packet = (PresencePacket) processPacket(currentTag, PACKET_PRESENCE); + this.presenceListener.onPresencePacketReceived(account, packet); } private void sendStartTLS() throws IOException { @@ -497,8 +471,7 @@ public class XmppConnection implements Runnable { } private SharedPreferences getPreferences() { - return PreferenceManager - .getDefaultSharedPreferences(applicationContext); + return PreferenceManager.getDefaultSharedPreferences(applicationContext); } private boolean enableLegacySSL() { @@ -676,7 +649,7 @@ public class XmppConnection implements Runnable { final IqPacket iq = new IqPacket(IqPacket.TYPE_SET); iq.addChild("bind", "urn:ietf:params:xml:ns:xmpp-bind") .addChild("resource").setContent(account.getResource()); - this.sendUnboundIqPacket(iq, new OnIqPacketReceived() { + this.sendUnmodifiedIqPacket(iq, new OnIqPacketReceived() { @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { final Element bind = packet.findChild("bind"); @@ -719,12 +692,10 @@ public class XmppConnection implements Runnable { } }); if (this.streamFeatures.hasChild("session")) { - Log.d(Config.LOGTAG, account.getJid().toBareJid() - + ": sending deprecated session"); + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": sending deprecated session"); final IqPacket startSession = new IqPacket(IqPacket.TYPE_SET); - startSession.addChild("session", - "urn:ietf:params:xml:ns:xmpp-session"); - this.sendUnboundIqPacket(startSession, null); + startSession.addChild("session","urn:ietf:params:xml:ns:xmpp-session"); + this.sendUnmodifiedIqPacket(startSession, null); } } @@ -845,49 +816,44 @@ public class XmppConnection implements Runnable { return new BigInteger(50, mXmppConnectionService.getRNG()).toString(32); } - public void sendIqPacket(final IqPacket packet, final PacketReceived callback) { - if (packet.getId() == null) { - final String id = nextRandomId(); - packet.setAttribute("id", id); - } + public void sendIqPacket(final IqPacket packet, final OnIqPacketReceived callback) { packet.setFrom(account.getJid()); - this.sendPacket(packet, callback); + this.sendUnmodifiedIqPacket(packet,callback); + } - public void sendUnboundIqPacket(final IqPacket packet, final PacketReceived callback) { + private void sendUnmodifiedIqPacket(final IqPacket packet, final OnIqPacketReceived callback) { if (packet.getId() == null) { final String id = nextRandomId(); packet.setAttribute("id", id); } - this.sendPacket(packet, callback); + if (callback != null) { + if (packet.getId() == null) { + packet.setId(nextRandomId()); + } + packetCallbacks.put(packet.getId(), callback); + } + this.sendPacket(packet); } public void sendMessagePacket(final MessagePacket packet) { - this.sendPacket(packet, null); + this.sendPacket(packet); } public void sendPresencePacket(final PresencePacket packet) { - this.sendPacket(packet, null); + this.sendPacket(packet); } - private synchronized void sendPacket(final AbstractStanza packet, final PacketReceived callback) { - if (packet.getName().equals("iq") || packet.getName().equals("message") - || packet.getName().equals("presence")) { + private synchronized void sendPacket(final AbstractStanza packet) { + final String name = packet.getName(); + if (name.equals("iq") || name.equals("message") || name.equals("presence")) { ++stanzasSent; - } + } tagWriter.writeStanzaAsync(packet); - if (packet instanceof MessagePacket && packet.getId() != null - && this.streamId != null) { - Log.d(Config.LOGTAG, "request delivery report for stanza " - + stanzasSent); + if (packet instanceof MessagePacket && packet.getId() != null && this.streamId != null) { + Log.d(Config.LOGTAG, "request delivery report for stanza " + stanzasSent); this.messageReceipts.put(stanzasSent, packet.getId()); tagWriter.writeStanzaAsync(new RequestPacket(this.smVersion)); - } - if (callback != null) { - if (packet.getId() == null) { - packet.setId(nextRandomId()); - } - packetCallbacks.put(packet.getId(), callback); } } @@ -1044,11 +1010,11 @@ public class XmppConnection implements Runnable { } public void sendActive() { - this.sendPacket(new ActivePacket(), null); + this.sendPacket(new ActivePacket()); } public void sendInactive() { - this.sendPacket(new InactivePacket(), null); + this.sendPacket(new InactivePacket()); } public class Features { -- cgit v1.2.3 From 5c190487bc04e5dcb9b12a49d2447d441860d990 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 4 Jan 2015 12:37:22 +0100 Subject: deal with prosodys muc namespace tagging of messages --- src/main/java/eu/siacs/conversations/parser/MessageParser.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 44cda261..65a8f9e6 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -245,6 +245,10 @@ public class MessageParser extends AbstractParser implements return null; } } + if (message.hasChild("x","http://jabber.org/protocol/muc#user") + && "chat".equals(message.getAttribute("type"))) { + return null; + } Conversation conversation = mXmppConnectionService .findOrCreateConversation(account, fullJid.toBareJid(), false); String pgpBody = getPgpBody(message); @@ -482,7 +486,6 @@ public class MessageParser extends AbstractParser implements public void onMessagePacketReceived(Account account, MessagePacket packet) { Message message = null; this.parseNick(packet, account); - if ((packet.getType() == MessagePacket.TYPE_CHAT || packet.getType() == MessagePacket.TYPE_NORMAL)) { if ((packet.getBody() != null) && (packet.getBody().startsWith("?OTR"))) { @@ -490,9 +493,7 @@ public class MessageParser extends AbstractParser implements if (message != null) { message.markUnread(); } - } else if (packet.hasChild("body") - && !(packet.hasChild("x", - "http://jabber.org/protocol/muc#user"))) { + } else if (packet.hasChild("body")) { message = this.parseChat(packet, account); if (message != null) { message.markUnread(); -- cgit v1.2.3 From 3a4fbcd4cc9449aa9689a6c152f14b1fc19e4333 Mon Sep 17 00:00:00 2001 From: Jaroslav Lichtblau Date: Sun, 4 Jan 2015 12:43:32 +0100 Subject: Czech translation update --- src/main/res/values-cs/strings.xml | 40 +++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml index 33c7310b..f35893ee 100644 --- a/src/main/res/values-cs/strings.xml +++ b/src/main/res/values-cs/strings.xml @@ -12,6 +12,10 @@ Upravit jméno Přidat do telefonního seznamu Smazat ze seznamu + Zablokovat kontakt + Odblokovat kontakt + Zablokovat doménu + Odblokovat doménu Nastavení účtů Nastavení Detaily konference @@ -20,6 +24,7 @@ Sdílet s konverzací Začít konverzaci Vybrat kontakt + Seznam blokovaných právě teď před minutou před %d minutami @@ -33,8 +38,14 @@ Účastník Návštěvník Chcete odstranit %s ze svého seznamu? Konverzace spojené s tímto kontaktem nebudou odstraněny. + Chcete zablokovat příjem zpráv od %s? + Chcete odblokovat příjem zpráv od %s? + Zablokovat všechny kontakty z %s? + Odblokovat všechny kontakty z %s? + Kontakty zablokovány Chcete odstranit %s ze záložek? Konverzace spojené s touto záložkou nebudou odstraněny. Registrovat nový účet na serveru + Změnit heslo na serveru Sdílet s Začít konverzaci Pozvat kontakt @@ -44,6 +55,8 @@ Přidat Upravit Smazat + Zablokovat + Odblokovat Uložit OK Aplikace Konverzace přestala reagovat @@ -173,7 +186,12 @@ offline Konference Ostatní členové + Údaje serveru + XEP-0313: MAM XEP-0280: Kopie zpráv + XEP-0352: Zobrazování stavu klienta + XEP-0191: Příkaz blokování + XEP-0237: Verzování seznamu XEP-0198: Nastavení proudu XEP-0163: PEP (Avatars) dostupný @@ -201,6 +219,8 @@ Připojit ke konferenci Smazat kontakt Zobrazit detaily kontaktu + Zablokovat kontakt + Odblokovat kontakt Vytvořit Kontakt již existuje Vstoupit @@ -293,6 +313,7 @@ Přenos obrázku selhal Skenovat QR kód Zobrazit QR kód + Zobrazit seznam blokovaných Detaily účtu Ověřit OTR Vzdálený otisk @@ -343,4 +364,21 @@ Zkopírovat otisk OTR do schránky Načíst historii ze serveru Na serveru není žádná další historie - + Aktualizuji... + Heslo změněno! + Nelze změnit heslo + Zaslat zprávu pro spuštění šifrovaného chatu + Položit otázku + Pokud máte vy i váš kontakt společné tajemství které neví nikdo jiný (něco jako společný vtip nebo co jste spolu měli k obědu při svém posledním setkání), můžete toto tajemství použít pro ověření pravosti svých šifrovacích otisků.\n\nZadáte nápovědu nebo otázku a kontakt na ni správně odpoví. + Váš kontakt by rád ověřil pravost šifrovacího otisku dotazem na společné tajemství. Váš kontakt zadal následující nápovědu nebo otázku pro zodpovězení tajemství. + Nápověda by měla být vyplněna + Společně tajemství nemůže být nevyplněno + Opatrně porovnejte otisk zobrazený níže s otiskem vašeho kontatku.\nMůžete využít jakoukoliv bezpečnou formu komunikace pro jejich výměnu, jako třeba šifrovaný email nebo telefonát. + Změnit heslo + Současné heslo + Nové heslo + Heslo nemá být prázdné + Povolit všechny účty + Vypnout všechny účty + Provést akci s + \ No newline at end of file -- cgit v1.2.3 From eb7e683403e9335165341ed65cf949cb60319ebc Mon Sep 17 00:00:00 2001 From: Sam Whited Date: Tue, 30 Dec 2014 08:16:25 -0500 Subject: Make IqPacket type an enum --- .../siacs/conversations/generator/IqGenerator.java | 16 ++++---- .../eu/siacs/conversations/parser/IqParser.java | 14 +++---- .../services/MessageArchiveService.java | 2 +- .../services/XmppConnectionService.java | 32 +++++++-------- .../siacs/conversations/xmpp/XmppConnection.java | 46 +++++++++++----------- .../xmpp/jingle/JingleConnection.java | 10 ++--- .../xmpp/jingle/JingleConnectionManager.java | 4 +- .../xmpp/jingle/JingleInbandTransport.java | 14 +++---- .../siacs/conversations/xmpp/stanzas/IqPacket.java | 46 ++++++++-------------- 9 files changed, 85 insertions(+), 99 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java index f94dc5d7..58933692 100644 --- a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java @@ -21,7 +21,7 @@ public class IqGenerator extends AbstractGenerator { } public IqPacket discoResponse(final IqPacket request) { - final IqPacket packet = new IqPacket(IqPacket.TYPE_RESULT); + final IqPacket packet = new IqPacket(IqPacket.TYPE.RESULT); packet.setId(request.getId()); packet.setTo(request.getFrom()); final Element query = packet.addChild("query", @@ -40,7 +40,7 @@ public class IqGenerator extends AbstractGenerator { } protected IqPacket publish(final String node, final Element item) { - final IqPacket packet = new IqPacket(IqPacket.TYPE_SET); + final IqPacket packet = new IqPacket(IqPacket.TYPE.SET); final Element pubsub = packet.addChild("pubsub", "http://jabber.org/protocol/pubsub"); final Element publish = pubsub.addChild("publish"); @@ -50,7 +50,7 @@ public class IqGenerator extends AbstractGenerator { } protected IqPacket retrieve(String node, Element item) { - final IqPacket packet = new IqPacket(IqPacket.TYPE_GET); + final IqPacket packet = new IqPacket(IqPacket.TYPE.GET); final Element pubsub = packet.addChild("pubsub", "http://jabber.org/protocol/pubsub"); final Element items = pubsub.addChild("items"); @@ -100,7 +100,7 @@ public class IqGenerator extends AbstractGenerator { } public IqPacket queryMessageArchiveManagement(final MessageArchiveService.Query mam) { - final IqPacket packet = new IqPacket(IqPacket.TYPE_SET); + final IqPacket packet = new IqPacket(IqPacket.TYPE.SET); final Element query = packet.query("urn:xmpp:mam:0"); query.setAttribute("queryid",mam.getQueryId()); final Data data = new Data(); @@ -119,28 +119,28 @@ public class IqGenerator extends AbstractGenerator { return packet; } public IqPacket generateGetBlockList() { - final IqPacket iq = new IqPacket(IqPacket.TYPE_GET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); iq.addChild("blocklist", Xmlns.BLOCKING); return iq; } public IqPacket generateSetBlockRequest(final Jid jid) { - final IqPacket iq = new IqPacket(IqPacket.TYPE_SET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.SET); final Element block = iq.addChild("block", Xmlns.BLOCKING); block.addChild("item").setAttribute("jid", jid.toBareJid().toString()); return iq; } public IqPacket generateSetUnblockRequest(final Jid jid) { - final IqPacket iq = new IqPacket(IqPacket.TYPE_SET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.SET); final Element block = iq.addChild("unblock", Xmlns.BLOCKING); block.addChild("item").setAttribute("jid", jid.toBareJid().toString()); return iq; } public IqPacket generateSetPassword(final Account account, final String newPassword) { - final IqPacket packet = new IqPacket(IqPacket.TYPE_SET); + final IqPacket packet = new IqPacket(IqPacket.TYPE.SET); packet.setTo(account.getServer()); final Element query = packet.addChild("query", Xmlns.REGISTER); final Jid jid = account.getJid(); diff --git a/src/main/java/eu/siacs/conversations/parser/IqParser.java b/src/main/java/eu/siacs/conversations/parser/IqParser.java index e84545fc..70a6e3f7 100644 --- a/src/main/java/eu/siacs/conversations/parser/IqParser.java +++ b/src/main/java/eu/siacs/conversations/parser/IqParser.java @@ -83,7 +83,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { if (packet.hasChild("query", Xmlns.ROSTER) && fromServer(account, packet)) { final Element query = packet.findChild("query"); // If this is in response to a query for the whole roster: - if (packet.getType() == IqPacket.TYPE_RESULT) { + if (packet.getType() == IqPacket.TYPE.RESULT) { account.getRoster().markAllAsNotInRoster(); } this.rosterItems(account, query); @@ -97,7 +97,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { (block != null ? block.getChildren() : null); // If this is a response to a blocklist query, clear the block list and replace with the new one. // Otherwise, just update the existing blocklist. - if (packet.getType() == IqPacket.TYPE_RESULT) { + if (packet.getType() == IqPacket.TYPE.RESULT) { account.clearBlocklist(); } if (items != null) { @@ -116,7 +116,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { // Update the UI mXmppConnectionService.updateBlocklistUi(OnUpdateBlocklist.Status.BLOCKED); } else if (packet.hasChild("unblock", Xmlns.BLOCKING) && - fromServer(account, packet) && packet.getType() == IqPacket.TYPE_SET) { + fromServer(account, packet) && packet.getType() == IqPacket.TYPE.SET) { Log.d(Config.LOGTAG, "Received unblock update from server"); final Collection items = packet.findChild("unblock", Xmlns.BLOCKING).getChildren(); if (items.size() == 0) { @@ -144,12 +144,12 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { .discoResponse(packet); account.getXmppConnection().sendIqPacket(response, null); } else if (packet.hasChild("ping", "urn:xmpp:ping")) { - final IqPacket response = packet.generateResponse(IqPacket.TYPE_RESULT); + final IqPacket response = packet.generateResponse(IqPacket.TYPE.RESULT); mXmppConnectionService.sendIqPacket(account, response, null); } else { - if ((packet.getType() == IqPacket.TYPE_GET) - || (packet.getType() == IqPacket.TYPE_SET)) { - final IqPacket response = packet.generateResponse(IqPacket.TYPE_ERROR); + if ((packet.getType() == IqPacket.TYPE.GET) + || (packet.getType() == IqPacket.TYPE.SET)) { + final IqPacket response = packet.generateResponse(IqPacket.TYPE.ERROR); final Element error = response.addChild("error"); error.setAttribute("type", "cancel"); error.addChild("feature-not-implemented", diff --git a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java index 82111243..5fb50f90 100644 --- a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java +++ b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java @@ -111,7 +111,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { this.mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_ERROR) { + if (packet.getType() == IqPacket.TYPE.ERROR) { Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": error executing mam: " + packet.toString()); finalizeQuery(query); } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 04fc04d3..fd0a4b9d 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -787,7 +787,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } public void fetchRosterFromServer(final Account account) { - final IqPacket iqPacket = new IqPacket(IqPacket.TYPE_GET); + final IqPacket iqPacket = new IqPacket(IqPacket.TYPE.GET); if (!"".equals(account.getRosterVersion())) { Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": fetching roster version " + account.getRosterVersion()); @@ -800,7 +800,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } public void fetchBookmarks(final Account account) { - final IqPacket iqPacket = new IqPacket(IqPacket.TYPE_GET); + final IqPacket iqPacket = new IqPacket(IqPacket.TYPE.GET); final Element query = iqPacket.query("jabber:iq:private"); query.addChild("storage", "storage:bookmarks"); final OnIqPacketReceived callback = new OnIqPacketReceived() { @@ -835,7 +835,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } public void pushBookmarks(Account account) { - IqPacket iqPacket = new IqPacket(IqPacket.TYPE_SET); + IqPacket iqPacket = new IqPacket(IqPacket.TYPE.SET); Element query = iqPacket.query("jabber:iq:private"); Element storage = query.addChild("storage", "storage:bookmarks"); for (Bookmark bookmark : account.getBookmarks()) { @@ -1107,7 +1107,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa sendIqPacket(account, iq, new OnIqPacketReceived() { @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_RESULT) { + if (packet.getType() == IqPacket.TYPE.RESULT) { account.setPassword(newPassword); databaseBackend.updateAccount(account); callback.onPasswordChangeSucceeded(); @@ -1500,13 +1500,13 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } public void pushConferenceConfiguration(final Conversation conversation,final Bundle options, final OnConferenceOptionsPushed callback) { - IqPacket request = new IqPacket(IqPacket.TYPE_GET); + IqPacket request = new IqPacket(IqPacket.TYPE.GET); request.setTo(conversation.getJid().toBareJid()); request.query("http://jabber.org/protocol/muc#owner"); sendIqPacket(conversation.getAccount(),request,new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - if (packet.getType() != IqPacket.TYPE_ERROR) { + if (packet.getType() != IqPacket.TYPE.ERROR) { Data data = Data.parse(packet.query().findChild("x", "jabber:x:data")); for (Field field : data.getFields()) { if (options.containsKey(field.getName())) { @@ -1514,13 +1514,13 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } } data.submit(); - IqPacket set = new IqPacket(IqPacket.TYPE_SET); + IqPacket set = new IqPacket(IqPacket.TYPE.SET); set.setTo(conversation.getJid().toBareJid()); set.query("http://jabber.org/protocol/muc#owner").addChild(data); sendIqPacket(account, set, new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_RESULT) { + if (packet.getType() == IqPacket.TYPE.RESULT) { if (callback != null) { callback.onPushSucceeded(); } @@ -1662,7 +1662,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa final boolean sendUpdates = contact .getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST) && contact.getOption(Contact.Options.PREEMPTIVE_GRANT); - final IqPacket iq = new IqPacket(IqPacket.TYPE_SET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.SET); iq.query(Xmlns.ROSTER).addChild(contact.asElement()); account.getXmppConnection().sendIqPacket(iq, null); if (sendUpdates) { @@ -1702,7 +1702,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa @Override public void onIqPacketReceived(Account account, IqPacket result) { - if (result.getType() == IqPacket.TYPE_RESULT) { + if (result.getType() == IqPacket.TYPE.RESULT) { final IqPacket packet = XmppConnectionService.this.mIqGenerator .publishAvatarMetadata(avatar); sendIqPacket(account, packet, new OnIqPacketReceived() { @@ -1710,7 +1710,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa @Override public void onIqPacketReceived(Account account, IqPacket result) { - if (result.getType() == IqPacket.TYPE_RESULT) { + if (result.getType() == IqPacket.TYPE.RESULT) { if (account.setAvatar(avatar.getFilename())) { databaseBackend.updateAccount(account); } @@ -1747,7 +1747,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa public void onIqPacketReceived(Account account, IqPacket result) { final String ERROR = account.getJid().toBareJid() + ": fetching avatar for " + avatar.owner + " failed "; - if (result.getType() == IqPacket.TYPE_RESULT) { + if (result.getType() == IqPacket.TYPE.RESULT) { avatar.image = mIqParser.avatarData(result); if (avatar.image != null) { if (getFileBackend().save(avatar)) { @@ -1801,7 +1801,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa @Override public void onIqPacketReceived(Account account, IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_RESULT) { + if (packet.getType() == IqPacket.TYPE.RESULT) { Element pubsub = packet.findChild("pubsub", "http://jabber.org/protocol/pubsub"); if (pubsub != null) { @@ -1835,7 +1835,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa contact.setOption(Contact.Options.DIRTY_DELETE); Account account = contact.getAccount(); if (account.getStatus() == Account.State.ONLINE) { - IqPacket iq = new IqPacket(IqPacket.TYPE_SET); + IqPacket iq = new IqPacket(IqPacket.TYPE.SET); Element item = iq.query(Xmlns.ROSTER).addChild("item"); item.setAttribute("jid", contact.getJid().toString()); item.setAttribute("subscription", "remove"); @@ -2202,7 +2202,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_RESULT) { + if (packet.getType() == IqPacket.TYPE.RESULT) { account.getBlocklist().add(jid); updateBlocklistUi(OnUpdateBlocklist.Status.BLOCKED); } @@ -2217,7 +2217,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa this.sendIqPacket(blockable.getAccount(), getIqGenerator().generateSetUnblockRequest(jid), new OnIqPacketReceived() { @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_RESULT) { + if (packet.getType() == IqPacket.TYPE.RESULT) { account.getBlocklist().remove(jid); updateBlocklistUi(OnUpdateBlocklist.Status.UNBLOCKED); } diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index ff3210a4..d954c0d4 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -372,7 +372,7 @@ public class XmppConnection implements Runnable { private void sendInitialPing() { Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": sending intial ping"); - final IqPacket iq = new IqPacket(IqPacket.TYPE_GET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); iq.setFrom(account.getJid()); iq.addChild("ping", "urn:xmpp:ping"); this.sendIqPacket(iq, new OnIqPacketReceived() { @@ -446,11 +446,11 @@ public class XmppConnection implements Runnable { if (packetCallbacks.containsKey(packet.getId())) { packetCallbacks.get(packet.getId()).onIqPacketReceived(account, packet); packetCallbacks.remove(packet.getId()); - } else if ((packet.getType() == IqPacket.TYPE_GET || packet - .getType() == IqPacket.TYPE_SET) + } else if ((packet.getType() == IqPacket.TYPE.GET || packet + .getType() == IqPacket.TYPE.SET) && this.unregisteredIqListener != null) { this.unregisteredIqListener.onIqPacketReceived(account, packet); - } + } } } @@ -479,19 +479,19 @@ public class XmppConnection implements Runnable { } private void switchOverToTls(final Tag currentTag) throws XmlPullParserException, IOException { - tagReader.readTag(); - try { + tagReader.readTag(); + try { final SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null,new X509TrustManager[]{this.mXmppConnectionService.getMemorizingTrustManager()},mXmppConnectionService.getRNG()); final SSLSocketFactory factory = sc.getSocketFactory(); final HostnameVerifier verifier = this.mXmppConnectionService.getMemorizingTrustManager().wrapHostnameVerifier(new StrictHostnameVerifier()); - final InetAddress address = socket == null ? null : socket.getInetAddress(); + final InetAddress address = socket == null ? null : socket.getInetAddress(); if (factory == null || address == null || verifier == null) { throw new IOException("could not setup ssl"); } - final SSLSocket sslSocket = (SSLSocket) factory.createSocket(socket,address.getHostAddress(), socket.getPort(),true); + final SSLSocket sslSocket = (SSLSocket) factory.createSocket(socket,address.getHostAddress(), socket.getPort(),true); if (sslSocket == null) { throw new IOException("could not initialize ssl socket"); @@ -506,13 +506,13 @@ public class XmppConnection implements Runnable { supportedProtocols.remove("SSLv3"); supportProtocols = new String[supportedProtocols.size()]; supportedProtocols.toArray(supportProtocols); - } + } sslSocket.setEnabledProtocols(supportProtocols); - if (!verifier.verify(account.getServer().getDomainpart(),sslSocket.getSession())) { - Log.d(Config.LOGTAG,account.getJid().toBareJid()+": TLS certificate verification failed"); - disconnect(true); - changeStatus(Account.State.SECURITY_ERROR); + if (!verifier.verify(account.getServer().getDomainpart(),sslSocket.getSession())) { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": TLS certificate verification failed"); + disconnect(true); + changeStatus(Account.State.SECURITY_ERROR); } tagReader.setInputStream(sslSocket.getInputStream()); tagWriter.setOutputStream(sslSocket.getOutputStream()); @@ -521,11 +521,11 @@ public class XmppConnection implements Runnable { enabledEncryption = true; processStream(tagReader.readTag()); sslSocket.close(); - } catch (final NoSuchAlgorithmException | KeyManagementException e1) { + } catch (final NoSuchAlgorithmException | KeyManagementException e1) { Log.d(Config.LOGTAG,account.getJid().toBareJid()+": TLS certificate verification failed"); disconnect(true); changeStatus(Account.State.SECURITY_ERROR); - } + } } private void processStreamFeatures(final Tag currentTag) @@ -598,7 +598,7 @@ public class XmppConnection implements Runnable { } private void sendRegistryRequest() { - final IqPacket register = new IqPacket(IqPacket.TYPE_GET); + final IqPacket register = new IqPacket(IqPacket.TYPE.GET); register.query("jabber:iq:register"); register.setTo(account.getServer()); sendIqPacket(register, new OnIqPacketReceived() { @@ -608,7 +608,7 @@ public class XmppConnection implements Runnable { final Element instructions = packet.query().findChild("instructions"); if (packet.query().hasChild("username") && (packet.query().hasChild("password"))) { - final IqPacket register = new IqPacket(IqPacket.TYPE_SET); + final IqPacket register = new IqPacket(IqPacket.TYPE.SET); final Element username = new Element("username") .setContent(account.getUsername()); final Element password = new Element("password") @@ -619,7 +619,7 @@ public class XmppConnection implements Runnable { @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_RESULT) { + if (packet.getType() == IqPacket.TYPE.RESULT) { account.setOption(Account.OPTION_REGISTER, false); changeStatus(Account.State.REGISTRATION_SUCCESSFUL); @@ -646,7 +646,7 @@ public class XmppConnection implements Runnable { } private void sendBindRequest() { - final IqPacket iq = new IqPacket(IqPacket.TYPE_SET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.SET); iq.addChild("bind", "urn:ietf:params:xml:ns:xmpp-bind") .addChild("resource").setContent(account.getResource()); this.sendUnmodifiedIqPacket(iq, new OnIqPacketReceived() { @@ -705,7 +705,7 @@ public class XmppConnection implements Runnable { enableAdvancedStreamFeatures(); } } else { - final IqPacket iq = new IqPacket(IqPacket.TYPE_GET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); iq.setTo(server.toDomainJid()); iq.query("http://jabber.org/protocol/disco#info"); this.sendIqPacket(iq, new OnIqPacketReceived() { @@ -750,7 +750,7 @@ public class XmppConnection implements Runnable { } private void sendServiceDiscoveryItems(final Jid server) { - final IqPacket iq = new IqPacket(IqPacket.TYPE_GET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); iq.setTo(server.toDomainJid()); iq.query("http://jabber.org/protocol/disco#items"); this.sendIqPacket(iq, new OnIqPacketReceived() { @@ -771,7 +771,7 @@ public class XmppConnection implements Runnable { } private void sendEnableCarbons() { - final IqPacket iq = new IqPacket(IqPacket.TYPE_SET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.SET); iq.addChild("enable", "urn:xmpp:carbons:2"); this.sendIqPacket(iq, new OnIqPacketReceived() { @@ -861,7 +861,7 @@ public class XmppConnection implements Runnable { if (streamFeatures.hasChild("sm")) { tagWriter.writeStanzaAsync(new RequestPacket(smVersion)); } else { - final IqPacket iq = new IqPacket(IqPacket.TYPE_GET); + final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); iq.setFrom(account.getJid()); iq.addChild("ping", "urn:xmpp:ping"); this.sendIqPacket(iq, null); diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java index d578ca38..d6f901d8 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java @@ -75,7 +75,7 @@ public class JingleConnection implements Downloadable { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_ERROR) { + if (packet.getType() == IqPacket.TYPE.ERROR) { fail(); } } @@ -191,10 +191,10 @@ public class JingleConnection implements Downloadable { } IqPacket response; if (returnResult) { - response = packet.generateResponse(IqPacket.TYPE_RESULT); + response = packet.generateResponse(IqPacket.TYPE.RESULT); } else { - response = packet.generateResponse(IqPacket.TYPE_ERROR); + response = packet.generateResponse(IqPacket.TYPE.ERROR); } account.getXmppConnection().sendIqPacket(response, null); } @@ -552,7 +552,7 @@ public class JingleConnection implements Downloadable { Log.d(Config.LOGTAG, "candidate " + connection.getCandidate().getCid() + " was our proxy. going to activate"); - IqPacket activation = new IqPacket(IqPacket.TYPE_SET); + IqPacket activation = new IqPacket(IqPacket.TYPE.SET); activation.setTo(connection.getCandidate().getJid()); activation.query("http://jabber.org/protocol/bytestreams") .setAttribute("sid", this.getSessionId()); @@ -564,7 +564,7 @@ public class JingleConnection implements Downloadable { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_ERROR) { + if (packet.getType() == IqPacket.TYPE.ERROR) { onProxyActivated.failed(); } else { onProxyActivated.success(); diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java index b0a730b1..57c74ad9 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java @@ -46,7 +46,7 @@ public class JingleConnectionManager extends AbstractConnectionManager { return; } } - IqPacket response = packet.generateResponse(IqPacket.TYPE_ERROR); + IqPacket response = packet.generateResponse(IqPacket.TYPE.ERROR); Element error = response.addChild("error"); error.setAttribute("type", "cancel"); error.addChild("item-not-found", @@ -84,7 +84,7 @@ public class JingleConnectionManager extends AbstractConnectionManager { final String proxy = account.getXmppConnection() .findDiscoItemByFeature(xmlns); if (proxy != null) { - IqPacket iq = new IqPacket(IqPacket.TYPE_GET); + IqPacket iq = new IqPacket(IqPacket.TYPE.GET); iq.setAttribute("to", proxy); iq.query(xmlns); account.getXmppConnection().sendIqPacket(iq, diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java index e25f7e65..174f70fa 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java @@ -44,7 +44,7 @@ public class JingleInbandTransport extends JingleTransport { private OnIqPacketReceived onAckReceived = new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - if (connected && packet.getType() == IqPacket.TYPE_RESULT) { + if (connected && packet.getType() == IqPacket.TYPE.RESULT) { sendNextBlock(); } } @@ -60,7 +60,7 @@ public class JingleInbandTransport extends JingleTransport { } public void connect(final OnTransportConnected callback) { - IqPacket iq = new IqPacket(IqPacket.TYPE_SET); + IqPacket iq = new IqPacket(IqPacket.TYPE.SET); iq.setTo(this.counterpart); Element open = iq.addChild("open", "http://jabber.org/protocol/ibb"); open.setAttribute("sid", this.sessionId); @@ -73,7 +73,7 @@ public class JingleInbandTransport extends JingleTransport { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - if (packet.getType() == IqPacket.TYPE_ERROR) { + if (packet.getType() == IqPacket.TYPE.ERROR) { callback.failed(); } else { callback.established(); @@ -157,7 +157,7 @@ public class JingleInbandTransport extends JingleTransport { this.remainingSize -= count; this.digest.update(buffer); String base64 = Base64.encodeToString(buffer, Base64.NO_WRAP); - IqPacket iq = new IqPacket(IqPacket.TYPE_SET); + IqPacket iq = new IqPacket(IqPacket.TYPE.SET); iq.setTo(this.counterpart); Element data = iq.addChild("data", "http://jabber.org/protocol/ibb"); @@ -208,15 +208,15 @@ public class JingleInbandTransport extends JingleTransport { established = true; connected = true; this.account.getXmppConnection().sendIqPacket( - packet.generateResponse(IqPacket.TYPE_RESULT), null); + packet.generateResponse(IqPacket.TYPE.RESULT), null); } else { this.account.getXmppConnection().sendIqPacket( - packet.generateResponse(IqPacket.TYPE_ERROR), null); + packet.generateResponse(IqPacket.TYPE.ERROR), null); } } else if (connected && payload.getName().equals("data")) { this.receiveNextBlock(payload.getContent()); this.account.getXmppConnection().sendIqPacket( - packet.generateResponse(IqPacket.TYPE_RESULT), null); + packet.generateResponse(IqPacket.TYPE.RESULT), null); } else { // TODO some sort of exception } diff --git a/src/main/java/eu/siacs/conversations/xmpp/stanzas/IqPacket.java b/src/main/java/eu/siacs/conversations/xmpp/stanzas/IqPacket.java index 2481112b..7b36fc49 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/stanzas/IqPacket.java +++ b/src/main/java/eu/siacs/conversations/xmpp/stanzas/IqPacket.java @@ -4,32 +4,18 @@ import eu.siacs.conversations.xml.Element; public class IqPacket extends AbstractStanza { - public static final int TYPE_ERROR = -1; - public static final int TYPE_SET = 0; - public static final int TYPE_RESULT = 1; - public static final int TYPE_GET = 2; - - private IqPacket(final String name) { - super(name); + public static enum TYPE { + ERROR, + SET, + RESULT, + GET, + INVALID } - public IqPacket(final int type) { + public IqPacket(final TYPE type) { super("iq"); - switch (type) { - case TYPE_SET: - this.setAttribute("type", "set"); - break; - case TYPE_GET: - this.setAttribute("type", "get"); - break; - case TYPE_RESULT: - this.setAttribute("type", "result"); - break; - case TYPE_ERROR: - this.setAttribute("type", "error"); - break; - default: - break; + if (type != TYPE.INVALID) { + this.setAttribute("type", type.toString().toLowerCase()); } } @@ -51,23 +37,23 @@ public class IqPacket extends AbstractStanza { return query(); } - public int getType() { + public TYPE getType() { final String type = getAttribute("type"); switch (type) { case "error": - return TYPE_ERROR; + return TYPE.ERROR; case "result": - return TYPE_RESULT; + return TYPE.RESULT; case "set": - return TYPE_SET; + return TYPE.SET; case "get": - return TYPE_GET; + return TYPE.GET; default: - return 1000; + return TYPE.INVALID; } } - public IqPacket generateResponse(final int type) { + public IqPacket generateResponse(final TYPE type) { final IqPacket packet = new IqPacket(type); packet.setTo(this.getFrom()); packet.setId(this.getId()); -- cgit v1.2.3 From 88704ce5cd68047008375c2eba6751e2e3cdd8c0 Mon Sep 17 00:00:00 2001 From: Sam Whited Date: Tue, 30 Dec 2014 08:50:51 -0500 Subject: Verify IQ responses Fixes #20 Move fromServer/toServer to AbstractStanza --- .../eu/siacs/conversations/parser/IqParser.java | 13 +++--------- .../services/XmppConnectionService.java | 3 +-- .../siacs/conversations/xmpp/XmppConnection.java | 24 +++++++++++++++++----- .../conversations/xmpp/stanzas/AbstractStanza.java | 17 ++++++++++++++- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/parser/IqParser.java b/src/main/java/eu/siacs/conversations/parser/IqParser.java index 70a6e3f7..3b501f33 100644 --- a/src/main/java/eu/siacs/conversations/parser/IqParser.java +++ b/src/main/java/eu/siacs/conversations/parser/IqParser.java @@ -71,16 +71,9 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { return super.avatarData(items); } - public static boolean fromServer(final Account account, final IqPacket packet) { - return packet.getFrom() == null - || packet.getFrom().equals(account.getServer()) - || packet.getFrom().equals(account.getJid().toBareJid()) - || packet.getFrom().equals(account.getJid()); - } - @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { - if (packet.hasChild("query", Xmlns.ROSTER) && fromServer(account, packet)) { + if (packet.hasChild("query", Xmlns.ROSTER) && packet.fromServer(account)) { final Element query = packet.findChild("query"); // If this is in response to a query for the whole roster: if (packet.getType() == IqPacket.TYPE.RESULT) { @@ -88,7 +81,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { } this.rosterItems(account, query); } else if ((packet.hasChild("block", Xmlns.BLOCKING) || packet.hasChild("blocklist", Xmlns.BLOCKING)) && - fromServer(account, packet)) { + packet.fromServer(account)) { // Block list or block push. Log.d(Config.LOGTAG, "Received blocklist update from server"); final Element blocklist = packet.findChild("blocklist", Xmlns.BLOCKING); @@ -116,7 +109,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { // Update the UI mXmppConnectionService.updateBlocklistUi(OnUpdateBlocklist.Status.BLOCKED); } else if (packet.hasChild("unblock", Xmlns.BLOCKING) && - fromServer(account, packet) && packet.getType() == IqPacket.TYPE.SET) { + packet.fromServer(account) && packet.getType() == IqPacket.TYPE.SET) { Log.d(Config.LOGTAG, "Received unblock update from server"); final Collection items = packet.findChild("unblock", Xmlns.BLOCKING).getChildren(); if (items.size() == 0) { diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index fd0a4b9d..beba97fe 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -84,7 +84,6 @@ import eu.siacs.conversations.xmpp.OnMessagePacketReceived; import eu.siacs.conversations.xmpp.OnPresencePacketReceived; import eu.siacs.conversations.xmpp.OnStatusChanged; import eu.siacs.conversations.xmpp.OnUpdateBlocklist; -import eu.siacs.conversations.xmpp.PacketReceived; import eu.siacs.conversations.xmpp.XmppConnection; import eu.siacs.conversations.xmpp.forms.Data; import eu.siacs.conversations.xmpp.forms.Field; @@ -979,7 +978,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa query.setCallback(callback); } callback.informUser(R.string.fetching_history_from_server); - } + } } }).start(); } diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index d954c0d4..56d3e560 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -9,6 +9,7 @@ import android.os.PowerManager.WakeLock; import android.os.SystemClock; import android.preference.PreferenceManager; import android.util.Log; +import android.util.Pair; import android.util.SparseArray; import org.apache.http.conn.ssl.StrictHostnameVerifier; @@ -104,7 +105,7 @@ public class XmppConnection implements Runnable { private long lastConnect = 0; private long lastSessionStarted = 0; private int attempt = 0; - private final Map packetCallbacks = new Hashtable<>(); + private final Map> packetCallbacks = new Hashtable<>(); private OnPresencePacketReceived presenceListener = null; private OnJinglePacketReceived jingleListener = null; private OnIqPacketReceived unregisteredIqListener = null; @@ -444,8 +445,21 @@ public class XmppConnection implements Runnable { } } else { if (packetCallbacks.containsKey(packet.getId())) { - packetCallbacks.get(packet.getId()).onIqPacketReceived(account, packet); - packetCallbacks.remove(packet.getId()); + final Pair packetCallbackDuple = packetCallbacks.get(packet.getId()); + // Packets to the server should have responses from the server + if (packetCallbackDuple.first.toServer(account)) { + if (packet.fromServer(account)) { + packetCallbackDuple.second + .onIqPacketReceived(account, packet); + packetCallbacks.remove(packet.getId()); + } + } else { + if (packet.getFrom().equals(packetCallbackDuple.first.getTo())) { + packetCallbackDuple.second + .onIqPacketReceived(account, packet); + packetCallbacks.remove(packet.getId()); + } + } } else if ((packet.getType() == IqPacket.TYPE.GET || packet .getType() == IqPacket.TYPE.SET) && this.unregisteredIqListener != null) { @@ -693,7 +707,7 @@ public class XmppConnection implements Runnable { }); if (this.streamFeatures.hasChild("session")) { Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": sending deprecated session"); - final IqPacket startSession = new IqPacket(IqPacket.TYPE_SET); + final IqPacket startSession = new IqPacket(IqPacket.TYPE.SET); startSession.addChild("session","urn:ietf:params:xml:ns:xmpp-session"); this.sendUnmodifiedIqPacket(startSession, null); } @@ -831,7 +845,7 @@ public class XmppConnection implements Runnable { if (packet.getId() == null) { packet.setId(nextRandomId()); } - packetCallbacks.put(packet.getId(), callback); + packetCallbacks.put(packet.getId(), new Pair<>(packet, callback)); } this.sendPacket(packet); } diff --git a/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractStanza.java b/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractStanza.java index 1a49b45e..55256ece 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractStanza.java +++ b/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractStanza.java @@ -1,11 +1,12 @@ package eu.siacs.conversations.xmpp.stanzas; +import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xmpp.jid.Jid; public class AbstractStanza extends Element { - protected AbstractStanza(String name) { + protected AbstractStanza(final String name) { super(name); } @@ -36,4 +37,18 @@ public class AbstractStanza extends Element { public void setId(final String id) { setAttribute("id", id); } + + public boolean fromServer(final Account account) { + return getFrom() == null + || getFrom().equals(account.getServer()) + || getFrom().equals(account.getJid().toBareJid()) + || getFrom().equals(account.getJid()); + } + + public boolean toServer(final Account account) { + return getTo() == null + || getTo().equals(account.getServer()) + || getTo().equals(account.getJid().toBareJid()) + || getTo().equals(account.getJid()); + } } -- cgit v1.2.3 From 0d6d09b7e97709f0978a5527454ab6bbd9ad9443 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 4 Jan 2015 15:40:09 +0100 Subject: code cleanup + logging of spoofed iq packets --- .../siacs/conversations/xmpp/XmppConnection.java | 68 +++++++++++----------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 56d3e560..714b9a51 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -430,42 +430,40 @@ public class XmppConnection implements Runnable { return element; } - private void processIq(final Tag currentTag) throws XmlPullParserException, - IOException { - final IqPacket packet = (IqPacket) processPacket(currentTag, PACKET_IQ); + private void processIq(final Tag currentTag) throws XmlPullParserException, IOException { + final IqPacket packet = (IqPacket) processPacket(currentTag, PACKET_IQ); - if (packet.getId() == null) { - return; // an iq packet without id is definitely invalid - } + if (packet.getId() == null) { + return; // an iq packet without id is definitely invalid + } - if (packet instanceof JinglePacket) { - if (this.jingleListener != null) { - this.jingleListener.onJinglePacketReceived(account, - (JinglePacket) packet); - } - } else { - if (packetCallbacks.containsKey(packet.getId())) { - final Pair packetCallbackDuple = packetCallbacks.get(packet.getId()); - // Packets to the server should have responses from the server - if (packetCallbackDuple.first.toServer(account)) { - if (packet.fromServer(account)) { - packetCallbackDuple.second - .onIqPacketReceived(account, packet); - packetCallbacks.remove(packet.getId()); - } - } else { - if (packet.getFrom().equals(packetCallbackDuple.first.getTo())) { - packetCallbackDuple.second - .onIqPacketReceived(account, packet); - packetCallbacks.remove(packet.getId()); - } - } - } else if ((packet.getType() == IqPacket.TYPE.GET || packet - .getType() == IqPacket.TYPE.SET) - && this.unregisteredIqListener != null) { - this.unregisteredIqListener.onIqPacketReceived(account, packet); - } - } + if (packet instanceof JinglePacket) { + if (this.jingleListener != null) { + this.jingleListener.onJinglePacketReceived(account,(JinglePacket) packet); + } + } else { + if (packetCallbacks.containsKey(packet.getId())) { + final Pair packetCallbackDuple = packetCallbacks.get(packet.getId()); + // Packets to the server should have responses from the server + if (packetCallbackDuple.first.toServer(account)) { + if (packet.fromServer(account)) { + packetCallbackDuple.second.onIqPacketReceived(account, packet); + packetCallbacks.remove(packet.getId()); + } else { + Log.e(Config.LOGTAG,account.getJid().toBareJid().toString()+": ignoring spoofed iq packet"); + } + } else { + if (packet.getFrom().equals(packetCallbackDuple.first.getTo())) { + packetCallbackDuple.second.onIqPacketReceived(account, packet); + packetCallbacks.remove(packet.getId()); + } else { + Log.e(Config.LOGTAG,account.getJid().toBareJid().toString()+": ignoring spoofed iq packet"); + } + } + } else if (packet.getType() == IqPacket.TYPE.GET|| packet.getType() == IqPacket.TYPE.SET) { + this.unregisteredIqListener.onIqPacketReceived(account, packet); + } + } } private void processMessage(final Tag currentTag) throws XmlPullParserException, IOException { @@ -836,7 +834,7 @@ public class XmppConnection implements Runnable { } - private void sendUnmodifiedIqPacket(final IqPacket packet, final OnIqPacketReceived callback) { + private synchronized void sendUnmodifiedIqPacket(final IqPacket packet, final OnIqPacketReceived callback) { if (packet.getId() == null) { final String id = nextRandomId(); packet.setAttribute("id", id); -- cgit v1.2.3 From 92f4b7161b28c8af01b47a8e1590e025bd20f314 Mon Sep 17 00:00:00 2001 From: Sam Whited Date: Sun, 4 Jan 2015 10:43:15 -0500 Subject: Add travis config --- .travis.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..cb01fd95 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: android +android: + components: + - platform-tools + - tools + - build-tools-19.1.0 + - android-19 -- cgit v1.2.3 From 0c804af1bc22c5aaf95c3bbf53964d43a431b46f Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 4 Jan 2015 17:23:34 +0100 Subject: added travis build icon to README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 66213e46..d20b052a 100644 --- a/README.md +++ b/README.md @@ -285,6 +285,9 @@ Make sure to have ANDROID_HOME point to your Android SDK cd Conversations ./gradlew build + +[![Build Status](https://travis-ci.org/siacs/Conversations.svg?branch=development)](https://travis-ci.org/siacs/Conversations) + ### How do I update/add external libraries? If the library you want to update is in Maven Central or JCenter (or has its own -- cgit v1.2.3 From e6cd92a663ba2f8ae572c901b359ce0f42db5900 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 4 Jan 2015 17:53:06 +0100 Subject: added higher auto accept file sizes also changed labeling to MiB and KiB --- .../conversations/ui/adapter/MessageAdapter.java | 4 +- src/main/res/values/arrays.xml | 70 ++++++++++++---------- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 478586b9..ae3c1834 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -103,9 +103,9 @@ public class MessageAdapter extends ArrayAdapter { if (message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE || message.getDownloadable() != null) { ImageParams params = message.getImageParams(); if (params.size > (1.5 * 1024 * 1024)) { - filesize = params.size / (1024 * 1024)+ " MB"; + filesize = params.size / (1024 * 1024)+ " MiB"; } else if (params.size > 0) { - filesize = params.size / 1024 + " KB"; + filesize = params.size / 1024 + " KiB"; } if (message.getDownloadable() != null && message.getDownloadable().getStatus() == Downloadable.STATUS_FAILED) { error = true; diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml index 4acc9e62..0fc55776 100644 --- a/src/main/res/values/arrays.xml +++ b/src/main/res/values/arrays.xml @@ -1,39 +1,43 @@ - - Mobile - Phone - Tablet - Conversations - Android - - - never - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - 30 minutes - 1 hour - 2 hours - 8 hours - until further notice - + + Mobile + Phone + Tablet + Conversations + Android + + + never + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + + 30 minutes + 1 hour + 2 hours + 8 hours + until further notice + - - 1800 - 3600 - 7200 - 28800 - -1 - + + 1800 + 3600 + 7200 + 28800 + -1 + -- cgit v1.2.3 From 3522243835fd29751109cb578897b4e403f06b7d Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 4 Jan 2015 18:16:55 +0100 Subject: do not run mam queries in findOrCreateConversation() when isn't available --- .../siacs/conversations/services/XmppConnectionService.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index beba97fe..59cb3bb2 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1052,11 +1052,13 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } this.databaseBackend.createConversation(conversation); } - if (query == null) { - this.mMessageArchiveService.query(conversation); - } else { - if (query.getConversation() == null) { - this.mMessageArchiveService.query(conversation,query.getStart()); + if (account.getXmppConnection() != null && account.getXmppConnection().getFeatures().mam()) { + if (query == null) { + this.mMessageArchiveService.query(conversation); + } else { + if (query.getConversation() == null) { + this.mMessageArchiveService.query(conversation, query.getStart()); + } } } this.conversations.add(conversation); -- cgit v1.2.3 From 2723c9ccb938e073b4c8cd26e39553a31bcbfdbe Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 4 Jan 2015 23:04:23 +0100 Subject: made checks for valid image extensions case insensitive --- src/main/java/eu/siacs/conversations/entities/Message.java | 2 +- src/main/java/eu/siacs/conversations/http/HttpConnection.java | 2 +- src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index b5a1897d..8cb48635 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -395,7 +395,7 @@ public class Message extends AbstractEntity { String[] pathParts = url.getPath().split("/"); String filename; if (pathParts.length > 0) { - filename = pathParts[pathParts.length - 1]; + filename = pathParts[pathParts.length - 1].toLowerCase(); } else { return false; } diff --git a/src/main/java/eu/siacs/conversations/http/HttpConnection.java b/src/main/java/eu/siacs/conversations/http/HttpConnection.java index 5348e395..b715c3f3 100644 --- a/src/main/java/eu/siacs/conversations/http/HttpConnection.java +++ b/src/main/java/eu/siacs/conversations/http/HttpConnection.java @@ -65,7 +65,7 @@ public class HttpConnection implements Downloadable { this.message.setDownloadable(this); try { mUrl = new URL(message.getBody()); - String path = mUrl.getPath(); + String path = mUrl.getPath().toLowerCase(); if (path != null && (path.endsWith(".pgp") || path.endsWith(".gpg"))) { this.message.setEncryption(Message.ENCRYPTION_PGP); } else if (message.getEncryption() != Message.ENCRYPTION_OTR) { diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java index d6f901d8..ff94563c 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java @@ -280,7 +280,7 @@ public class JingleConnection implements Downloadable { Element fileNameElement = fileOffer.findChild("name"); if (fileNameElement != null) { String[] filename = fileNameElement.getContent() - .toLowerCase(Locale.US).split("\\."); + .toLowerCase(Locale.US).toLowerCase().split("\\."); if (Arrays.asList(VALID_IMAGE_EXTENSIONS).contains( filename[filename.length - 1])) { message.setType(Message.TYPE_IMAGE); -- cgit v1.2.3 From ddee804a0134f49e1b1e7679ec012b91e3d64593 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Mon, 5 Jan 2015 08:41:13 +0100 Subject: Updated languages for higher auto accept file sizes and changed labeling to MiB and KiB --- src/main/res/values-ca/arrays.xml | 46 +++++++++++---------- src/main/res/values-cs/arrays.xml | 73 +++++++++++++++++----------------- src/main/res/values-de/arrays.xml | 60 ++++++++++++++-------------- src/main/res/values-es/arrays.xml | 75 ++++++++++++++++++----------------- src/main/res/values-eu/arrays.xml | 75 ++++++++++++++++++----------------- src/main/res/values-fr/arrays.xml | 44 ++++++++++---------- src/main/res/values-gl/arrays.xml | 46 +++++++++++---------- src/main/res/values-it/arrays.xml | 73 +++++++++++++++++----------------- src/main/res/values-iw/arrays.xml | 46 +++++++++++---------- src/main/res/values-nl/arrays.xml | 73 +++++++++++++++++----------------- src/main/res/values-ru/arrays.xml | 46 +++++++++++---------- src/main/res/values-sv/arrays.xml | 46 +++++++++++---------- src/main/res/values-zh-rCN/arrays.xml | 75 ++++++++++++++++++----------------- src/main/res/values-zh-rTW/arrays.xml | 75 ++++++++++++++++++----------------- 14 files changed, 437 insertions(+), 416 deletions(-) diff --git a/src/main/res/values-ca/arrays.xml b/src/main/res/values-ca/arrays.xml index ff1a0d4b..4ce49172 100644 --- a/src/main/res/values-ca/arrays.xml +++ b/src/main/res/values-ca/arrays.xml @@ -1,24 +1,26 @@ - - - Mòbil - Telèfon - Tauleta - Conversations - Android - - - mai - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - \ No newline at end of file + + Mòbil + Telèfon + Tauleta + Conversations + Android + + + mai + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + diff --git a/src/main/res/values-cs/arrays.xml b/src/main/res/values-cs/arrays.xml index 4510cf84..896c6d9a 100644 --- a/src/main/res/values-cs/arrays.xml +++ b/src/main/res/values-cs/arrays.xml @@ -1,39 +1,40 @@ - - - Mobil - Telefon - Tablet - Konverzace - Android - - - nikdy - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - 30 minut - jedna hodina - 2 hodiny - 8 hodin - než opět změním - - - - 1800 - 3600 - 7200 - 28800 - -1 - - + + Mobil + Telefon + Tablet + Konverzace + Android + + + nikdy + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + + 30 minut + jedna hodina + 2 hodiny + 8 hodin + než opět změním + + + 1800 + 3600 + 7200 + 28800 + -1 + diff --git a/src/main/res/values-de/arrays.xml b/src/main/res/values-de/arrays.xml index ed5d47b5..f28263c8 100644 --- a/src/main/res/values-de/arrays.xml +++ b/src/main/res/values-de/arrays.xml @@ -1,31 +1,33 @@ - - - Mobile - Phone - Tablet - Conversations - Android - - - nie - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - 30 Minuten - 1 Stunde - 2 Stunden - 8 Stunden - bis auf Widerruf - - - \ No newline at end of file + + Mobile + Phone + Tablet + Conversations + Android + + + nie + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + + 30 Minuten + 1 Stunde + 2 Stunden + 8 Stunden + bis auf Widerruf + + diff --git a/src/main/res/values-es/arrays.xml b/src/main/res/values-es/arrays.xml index 15231955..d6e0127a 100644 --- a/src/main/res/values-es/arrays.xml +++ b/src/main/res/values-es/arrays.xml @@ -1,39 +1,40 @@ - - - Móvil - Teléfono - Tablet - Conversations - Android - - - nunca - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - 30 minutos - 1 hora - 2 horas - 8 horas - Hasta nuevo aviso - - - - 1800 - 3600 - 7200 - 28800 - -1 - - - \ No newline at end of file + + Móvil + Teléfono + Tablet + Conversations + Android + + + nunca + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + + 30 minutos + 1 hora + 2 horas + 8 horas + Hasta nuevo aviso + + + 1800 + 3600 + 7200 + 28800 + -1 + + diff --git a/src/main/res/values-eu/arrays.xml b/src/main/res/values-eu/arrays.xml index a34d3c6a..fec7d60d 100644 --- a/src/main/res/values-eu/arrays.xml +++ b/src/main/res/values-eu/arrays.xml @@ -1,39 +1,40 @@ - - - Mugikorra - Telefonoa - Tableta - Conversations - Android - - - inoiz - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - 30 minutu - ordu bat - 2 ordu - 8 ordu - abisatu arte - - - - 1800 - 3600 - 7200 - 28800 - -1 - - - \ No newline at end of file + + Mugikorra + Telefonoa + Tableta + Conversations + Android + + + inoiz + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + + 30 minutu + ordu bat + 2 ordu + 8 ordu + abisatu arte + + + 1800 + 3600 + 7200 + 28800 + -1 + + diff --git a/src/main/res/values-fr/arrays.xml b/src/main/res/values-fr/arrays.xml index ae140796..7667be0a 100644 --- a/src/main/res/values-fr/arrays.xml +++ b/src/main/res/values-fr/arrays.xml @@ -1,24 +1,26 @@ - - - Mobile - Téléphone - Tablette - Conversations - Android + + Mobile + Téléphone + Tablette + Conversations + Android + + + jamais + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 - - jamais - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - \ No newline at end of file + diff --git a/src/main/res/values-gl/arrays.xml b/src/main/res/values-gl/arrays.xml index 19424a78..c6d1b22e 100644 --- a/src/main/res/values-gl/arrays.xml +++ b/src/main/res/values-gl/arrays.xml @@ -1,24 +1,26 @@ - - - Móvil - Teléfono - Tablet - Conversations - Android - - - nunca - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - \ No newline at end of file + + Móvil + Teléfono + Tablet + Conversations + Android + + + nunca + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + diff --git a/src/main/res/values-it/arrays.xml b/src/main/res/values-it/arrays.xml index 60c0b04f..2a6a64a8 100644 --- a/src/main/res/values-it/arrays.xml +++ b/src/main/res/values-it/arrays.xml @@ -1,39 +1,40 @@ - - - Cellulare - Telefono - Tablet - Conversations - Android - - - mai - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - 30 minuti - un\'ora - 2 ore - 8 ore - fino a nuovo avviso - - - - 1800 - 3600 - 7200 - 28800 - -1 - - + + Cellulare + Telefono + Tablet + Conversations + Android + + + mai + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + + 30 minuti + un\'ora + 2 ore + 8 ore + fino a nuovo avviso + + + 1800 + 3600 + 7200 + 28800 + -1 + diff --git a/src/main/res/values-iw/arrays.xml b/src/main/res/values-iw/arrays.xml index 28768d6c..d5e73e3d 100644 --- a/src/main/res/values-iw/arrays.xml +++ b/src/main/res/values-iw/arrays.xml @@ -1,24 +1,26 @@ - - - נייד - טלפון - טאבלט - Conversations - Android - - - אף פעם - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - \ No newline at end of file + + נייד + טלפון + טאבלט + Conversations + Android + + + אף פעם + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + diff --git a/src/main/res/values-nl/arrays.xml b/src/main/res/values-nl/arrays.xml index e5ae27e7..77a1afbe 100644 --- a/src/main/res/values-nl/arrays.xml +++ b/src/main/res/values-nl/arrays.xml @@ -1,39 +1,40 @@ - - - Mobiel - Telefoon - Tablet - Conversations - Android - - - nooit - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - 30 minuten - 1 uur - 2 uur - 8 uur - voor onbepaalde duur - - - - 1800 - 3600 - 7200 - 28800 - -1 - - + + Mobiel + Telefoon + Tablet + Conversations + Android + + + nooit + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + + 30 minuten + 1 uur + 2 uur + 8 uur + voor onbepaalde duur + + + 1800 + 3600 + 7200 + 28800 + -1 + diff --git a/src/main/res/values-ru/arrays.xml b/src/main/res/values-ru/arrays.xml index d01d4eb9..f4bd94fe 100644 --- a/src/main/res/values-ru/arrays.xml +++ b/src/main/res/values-ru/arrays.xml @@ -1,24 +1,26 @@ - - - Мобильный - Телефон - Планшет - Conversations - Андроид - - - никогда - 256 Кб - 512 Кб - 1 Мб - - - 0 - 262144 - 524288 - 1048576 - - - \ No newline at end of file + + Мобильный + Телефон + Планшет + Conversations + Андроид + + + никогда + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + diff --git a/src/main/res/values-sv/arrays.xml b/src/main/res/values-sv/arrays.xml index 890e2915..fa156f8e 100644 --- a/src/main/res/values-sv/arrays.xml +++ b/src/main/res/values-sv/arrays.xml @@ -1,24 +1,26 @@ - - - Mobile - Phone - Tablet - Conversations - Android - - - aldrig - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - \ No newline at end of file + + Mobile + Phone + Tablet + Conversations + Android + + + aldrig + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + diff --git a/src/main/res/values-zh-rCN/arrays.xml b/src/main/res/values-zh-rCN/arrays.xml index 1a243079..b7f184d8 100644 --- a/src/main/res/values-zh-rCN/arrays.xml +++ b/src/main/res/values-zh-rCN/arrays.xml @@ -1,39 +1,40 @@ - - - 手机 - 电话 - 平板电脑 - Conversations - Android - - - 永不 - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - 30 分钟 - 1 小时 - 2 小时 - 8 小时 - 直至另行取消 - - - - 1800 - 3600 - 7200 - 28800 - -1 - - - \ No newline at end of file + + 手机 + 电话 + 平板电脑 + Conversations + Android + + + 永不 + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + + 30 分钟 + 1 小时 + 2 小时 + 8 小时 + 直至另行取消 + + + 1800 + 3600 + 7200 + 28800 + -1 + + diff --git a/src/main/res/values-zh-rTW/arrays.xml b/src/main/res/values-zh-rTW/arrays.xml index b9c261ad..335233a4 100644 --- a/src/main/res/values-zh-rTW/arrays.xml +++ b/src/main/res/values-zh-rTW/arrays.xml @@ -1,39 +1,40 @@ - - - 手機 - 電話 - 平板電腦 - Conversations - Android - - - 永不 - 256 KB - 512 KB - 1 MB - - - 0 - 262144 - 524288 - 1048576 - - - 30 分鐘 - 1 小時 - 2 小時 - 8 小時 - 直至另行取消 - - - - 1800 - 3600 - 7200 - 28800 - -1 - - - \ No newline at end of file + + 手機 + 電話 + 平板電腦 + Conversations + Android + + + 永不 + 256 KiB + 512 KiB + 1 MiB + 5 MiB + 10 MiB + + + 0 + 262144 + 524288 + 1048576 + 5242880 + 10485760 + + + 30 分鐘 + 1 小時 + 2 小時 + 8 小時 + 直至另行取消 + + + 1800 + 3600 + 7200 + 28800 + -1 + + -- cgit v1.2.3 From f1ebece8669768910707d3cc696b98390bddbfc0 Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Mon, 10 Nov 2014 23:40:16 +1100 Subject: Send notification to Pebble on new message This implements basic notifications to the Pebble through the app (using an intent). This simply hooks into NotificationService.notify(). This is pretty basic, but it works (I haven't tested to see how the intent is received when the Pebble app is not around, though). More fancy stuff could probably be added to avoid getting flooded, but the Pebble app already does a good job a filtering notification (e.g., screen on or quiet times). Signed-off-by: Olivier Mehani --- .../services/NotificationService.java | 30 ++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index a30cf2f1..594b356f 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -21,11 +21,15 @@ import android.util.Log; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Calendar; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.json.JSONArray; +import org.json.JSONObject; + import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; @@ -65,6 +69,24 @@ public class NotificationService { ); } + public void notifyPebble(Message message) { + final Intent i = new Intent("com.getpebble.action.SEND_NOTIFICATION"); + + final HashMap data = new HashMap(); + final Conversation conversation = message.getConversation(); + data.put("title", conversation.getName()); + data.put("body", message.getBody()); + final JSONObject jsonData = new JSONObject(data); + final String notificationData = new JSONArray().put(jsonData).toString(); + + i.putExtra("messageType", "PEBBLE_ALERT"); + i.putExtra("sender", "Conversations"); /* XXX: Shouldn't be hardcoded, e.g., AbstractGenerator.APP_NAME); */ + i.putExtra("notificationData", notificationData); + + mXmppConnectionService.sendBroadcast(i); + } + + public boolean notificationsEnabled() { return mXmppConnectionService.getPreferences().getBoolean("show_notification", true); } @@ -110,9 +132,13 @@ public class NotificationService { notifications.put(conversationUuid, mList); } final Account account = message.getConversation().getAccount(); - updateNotification((!(this.mIsInForeground && this.mOpenConversation == null) || !isScreenOn) + final boolean doNotify = (!(this.mIsInForeground && this.mOpenConversation == null) || !isScreenOn) && !account.inGracePeriod() - && !this.inMiniGracePeriod(account)); + && !this.inMiniGracePeriod(account); + updateNotification(doNotify); + if (doNotify) { + notifyPebble(message); + } } } -- cgit v1.2.3 From bdb335e6b08d35a23468ca1d5730330c520a6a90 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 5 Jan 2015 15:06:39 +0100 Subject: Show affiliation instead of role in MucDetails and offer 'advanced mode' to display role --- .../siacs/conversations/entities/MucOptions.java | 103 ++++++++++++++------- .../ui/ConferenceDetailsActivity.java | 93 ++++++++++--------- src/main/res/menu/muc_details.xml | 7 ++ src/main/res/values/strings.xml | 5 + 4 files changed, 130 insertions(+), 78 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/MucOptions.java b/src/main/java/eu/siacs/conversations/entities/MucOptions.java index 97a63532..ce2c5b04 100644 --- a/src/main/java/eu/siacs/conversations/entities/MucOptions.java +++ b/src/main/java/eu/siacs/conversations/entities/MucOptions.java @@ -4,15 +4,55 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import eu.siacs.conversations.R; import eu.siacs.conversations.crypto.PgpEngine; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xmpp.jid.InvalidJidException; import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.stanzas.PresencePacket; + import android.annotation.SuppressLint; @SuppressLint("DefaultLocale") public class MucOptions { + + public enum Affiliation { + OWNER(R.string.owner), + ADMIN(R.string.admin), + MEMBER(R.string.member), + OUTCAST(R.string.outcast), + NONE(R.string.no_affiliation); + + private Affiliation(int resId) { + this.resId = resId; + } + + private int resId; + + public int getResId() { + return resId; + } + } + + ; + + public enum Role { + MODERATOR(R.string.moderator), + VISITOR(R.string.visitor), + PARTICIPANT(R.string.participant), + NONE(R.string.no_role); + + private Role(int resId) { + this.resId = resId; + } + + private int resId; + + public int getResId() { + return resId; + } + } + public static final int ERROR_NO_ERROR = 0; public static final int ERROR_NICK_IN_USE = 1; public static final int ERROR_UNKNOWN = 2; @@ -30,6 +70,7 @@ public class MucOptions { private interface OnEventListener { public void onSuccess(); + public void onFailure(); } @@ -42,18 +83,8 @@ public class MucOptions { } public class User { - public static final int ROLE_MODERATOR = 3; - public static final int ROLE_NONE = 0; - public static final int ROLE_PARTICIPANT = 2; - public static final int ROLE_VISITOR = 1; - public static final int AFFILIATION_ADMIN = 4; - public static final int AFFILIATION_OWNER = 3; - public static final int AFFILIATION_MEMBER = 2; - public static final int AFFILIATION_OUTCAST = 1; - public static final int AFFILIATION_NONE = 0; - - private int role; - private int affiliation; + private Role role; + private Affiliation affiliation; private String name; private Jid jid; private long pgpKeyId = 0; @@ -74,7 +105,7 @@ public class MucOptions { return this.jid; } - public int getRole() { + public Role getRole() { return this.role; } @@ -82,35 +113,41 @@ public class MucOptions { role = role.toLowerCase(); switch (role) { case "moderator": - this.role = ROLE_MODERATOR; + this.role = Role.MODERATOR; break; case "participant": - this.role = ROLE_PARTICIPANT; + this.role = Role.PARTICIPANT; break; case "visitor": - this.role = ROLE_VISITOR; + this.role = Role.VISITOR; break; default: - this.role = ROLE_NONE; + this.role = Role.NONE; break; } } - public int getAffiliation() { + public Affiliation getAffiliation() { return this.affiliation; } public void setAffiliation(String affiliation) { - if (affiliation.equalsIgnoreCase("admin")) { - this.affiliation = AFFILIATION_ADMIN; - } else if (affiliation.equalsIgnoreCase("owner")) { - this.affiliation = AFFILIATION_OWNER; - } else if (affiliation.equalsIgnoreCase("member")) { - this.affiliation = AFFILIATION_MEMBER; - } else if (affiliation.equalsIgnoreCase("outcast")) { - this.affiliation = AFFILIATION_OUTCAST; - } else { - this.affiliation = AFFILIATION_NONE; + affiliation = affiliation.toLowerCase(); + switch (affiliation) { + case "admin": + this.affiliation = Affiliation.ADMIN; + break; + case "owner": + this.affiliation = Affiliation.OWNER; + break; + case "member": + this.affiliation = Affiliation.MEMBER; + break; + case "outcast": + this.affiliation = Affiliation.OUTCAST; + break; + default: + this.affiliation = Affiliation.NONE; } } @@ -168,7 +205,7 @@ public class MucOptions { if (!from.isBareJid()) { final String name = from.getResourcepart(); final String type = packet.getAttribute("type"); - final Element x = packet.findChild("x","http://jabber.org/protocol/muc#user"); + final Element x = packet.findChild("x", "http://jabber.org/protocol/muc#user"); final List codes = getStatusCodes(x); if (type == null) { User user = new User(); @@ -204,7 +241,7 @@ public class MucOptions { msg = ""; } user.setPgpKeyId(pgp.fetchKeyId(account, msg, - signed.getContent())); + signed.getContent())); } } } @@ -261,10 +298,10 @@ public class MucOptions { private List getStatusCodes(Element x) { List codes = new ArrayList(); if (x != null) { - for(Element child : x.getChildren()) { + for (Element child : x.getChildren()) { if (child.getName().equals("status")) { String code = child.getAttribute("code"); - if (code!=null) { + if (code != null) { codes.add(code); } } @@ -389,7 +426,7 @@ public class MucOptions { public Jid createJoinJid(String nick) { try { - return Jid.fromString(this.conversation.getJid().toBareJid().toString() + "/"+nick); + return Jid.fromString(this.conversation.getJid().toBareJid().toString() + "/" + nick); } catch (final InvalidJidException e) { return null; } diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index eeb015f3..5a30d761 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -31,6 +31,7 @@ import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Bookmark; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Conversation; +import eu.siacs.conversations.entities.MucOptions; import eu.siacs.conversations.entities.MucOptions.User; import eu.siacs.conversations.services.XmppConnectionService.OnMucRosterUpdate; import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate; @@ -59,6 +60,8 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers private List users = new ArrayList<>(); private User mSelectedUser = null; + private boolean mAdvancedMode = false; + private UiCallback renameCallback = new UiCallback() { @Override public void success(Conversation object) { @@ -66,7 +69,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers @Override public void run() { Toast.makeText(ConferenceDetailsActivity.this,getString(R.string.your_nick_has_been_changed),Toast.LENGTH_SHORT).show(); - populateView(); + updateView(); } }); @@ -94,7 +97,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers @Override public void run() { - populateView(); + updateView(); } }); } @@ -105,7 +108,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers @Override public void run() { - populateView(); + updateView(); } }); } @@ -171,23 +174,16 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers case R.id.action_delete_bookmark: deleteBookmark(); break; + case R.id.action_advanced_mode: + this.mAdvancedMode = !menuItem.isChecked(); + menuItem.setChecked(this.mAdvancedMode); + invalidateOptionsMenu(); + updateView(); + break; } return super.onOptionsItemSelected(menuItem); } - public String getReadableRole(int role) { - switch (role) { - case User.ROLE_MODERATOR: - return getString(R.string.moderator); - case User.ROLE_PARTICIPANT: - return getString(R.string.participant); - case User.ROLE_VISITOR: - return getString(R.string.visitor); - default: - return ""; - } - } - @Override protected String getShareableUri() { if (mConversation != null) { @@ -201,6 +197,8 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers public boolean onPrepareOptionsMenu(Menu menu) { 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); + menuItemAdvancedMode.setChecked(mAdvancedMode); Account account = mConversation.getAccount(); if (account.hasBookmarkFor(mConversation.getJid().toBareJid())) { menuItemSaveBookmark.setVisible(false); @@ -290,16 +288,15 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers this.mConversation = xmppConnectionService .findConversationByUuid(uuid); if (this.mConversation != null) { - populateView(); + updateView(); } } } - private void populateView() { + private void updateView() { mAccountJid.setText(getString(R.string.using_account, mConversation .getAccount().getJid().toBareJid())); - mYourPhoto.setImageBitmap(avatarService().get( - mConversation.getAccount(), getPixel(48))); + mYourPhoto.setImageBitmap(avatarService().get(mConversation.getAccount(), getPixel(48))); setTitle(mConversation.getName()); mFullJid.setText(mConversation.getJid().toBareJid().toString()); mYourNick.setText(mConversation.getMucOptions().getActualNick()); @@ -307,18 +304,12 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers if (mConversation.getMucOptions().online()) { mMoreDetails.setVisibility(View.VISIBLE); User self = mConversation.getMucOptions().getSelf(); - switch (self.getAffiliation()) { - case User.AFFILIATION_ADMIN: - mRoleAffiliaton.setText(getReadableRole(self.getRole()) + " (" - + getString(R.string.admin) + ")"); - break; - case User.AFFILIATION_OWNER: - mRoleAffiliaton.setText(getReadableRole(self.getRole()) + " (" - + getString(R.string.owner) + ")"); - break; - default: - mRoleAffiliaton.setText(getReadableRole(self.getRole())); - break; + final String status = getStatus(self); + if (status != null) { + mRoleAffiliaton.setVisibility(View.VISIBLE); + mRoleAffiliaton.setText(status); + } else { + mRoleAffiliaton.setVisibility(View.GONE); } } this.users.clear(); @@ -337,32 +328,31 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers }); registerForContextMenu(view); view.setTag(user); - TextView name = (TextView) view - .findViewById(R.id.contact_display_name); - TextView key = (TextView) view.findViewById(R.id.key); - TextView role = (TextView) view.findViewById(R.id.contact_jid); - if (user.getPgpKeyId() != 0) { - key.setVisibility(View.VISIBLE); - key.setOnClickListener(new OnClickListener() { + TextView tvDisplayName = (TextView) view.findViewById(R.id.contact_display_name); + TextView tvKey = (TextView) view.findViewById(R.id.key); + TextView tvStatus = (TextView) view.findViewById(R.id.contact_jid); + if (mAdvancedMode && user.getPgpKeyId() != 0) { + tvKey.setVisibility(View.VISIBLE); + tvKey.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { viewPgpKey(user); } }); - key.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId())); + tvKey.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId())); } Bitmap bm; Contact contact = user.getContact(); if (contact != null) { bm = avatarService().get(contact, getPixel(48)); - name.setText(contact.getDisplayName()); - role.setText(user.getName() + " \u2022 " - + getReadableRole(user.getRole())); + tvDisplayName.setText(contact.getDisplayName()); + tvStatus.setText(user.getName() + " \u2022 " + getStatus(user)); } else { bm = avatarService().get(user.getName(), getPixel(48)); - name.setText(user.getName()); - role.setText(getReadableRole(user.getRole())); + tvDisplayName.setText(user.getName()); + tvStatus.setText(getStatus(user)); + } ImageView iv = (ImageView) view.findViewById(R.id.contact_photo); iv.setImageBitmap(bm); @@ -370,6 +360,19 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } } + private String getStatus(User user) { + if (mAdvancedMode) { + StringBuilder builder = new StringBuilder(); + builder.append(getString(user.getAffiliation().getResId())); + builder.append(" ("); + builder.append(getString(user.getRole().getResId())); + builder.append(')'); + return builder.toString(); + } else { + return getString(user.getAffiliation().getResId()); + } + } + @SuppressWarnings("deprecation") @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void setListItemBackgroundOnView(View view) { diff --git a/src/main/res/menu/muc_details.xml b/src/main/res/menu/muc_details.xml index 341d438a..7587e55c 100644 --- a/src/main/res/menu/muc_details.xml +++ b/src/main/res/menu/muc_details.xml @@ -21,6 +21,13 @@ android:title="@string/delete_bookmark" android:orderInCategory="80" android:showAsAction="never" /> + Enable all accounts Disable all accounts Perform action with + No affiliation + No role + Outcast + Member + Advanced mode -- cgit v1.2.3 From 2679824770b025e65a9a848c1112219bc8df1b37 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 5 Jan 2015 15:08:13 +0100 Subject: prevent QR code parser from crashing fixed #839 --- .../java/eu/siacs/conversations/utils/XmppUri.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/utils/XmppUri.java b/src/main/java/eu/siacs/conversations/utils/XmppUri.java index aacb6362..0f1b18c3 100644 --- a/src/main/java/eu/siacs/conversations/utils/XmppUri.java +++ b/src/main/java/eu/siacs/conversations/utils/XmppUri.java @@ -18,7 +18,11 @@ public class XmppUri { try { parse(Uri.parse(uri)); } catch (IllegalArgumentException e) { - jid = null; + try { + jid = Jid.fromString(uri).toBareJid().toString(); + } catch (InvalidJidException e2) { + jid = null; + } } } @@ -42,6 +46,13 @@ public class XmppUri { try { jid = URLDecoder.decode(uri.getEncodedPath(), "UTF-8").split("/")[1]; } catch (final UnsupportedEncodingException ignored) { + jid = null; + } + } else { + try { + jid = Jid.fromString(uri.toString()).toBareJid().toString(); + } catch (final InvalidJidException ignored) { + jid = null; } } } @@ -62,7 +73,7 @@ public class XmppUri { public Jid getJid() { try { - return Jid.fromString(this.jid); + return this.jid == null ? null :Jid.fromString(this.jid); } catch (InvalidJidException e) { return null; } @@ -71,8 +82,4 @@ public class XmppUri { public String getFingerprint() { return this.fingerprint; } - - public boolean isMuc() { - return this.muc; - } } -- cgit v1.2.3 From 47a8a395957f6d202321c260e2d9e96753a0c180 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Mon, 5 Jan 2015 15:59:21 +0100 Subject: corrected German spellings and shorten some strings --- src/main/res/values-de/strings.xml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 469e47e8..aa87f758 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -28,7 +28,7 @@ vor einer Minute vor %d Minuten ungelesene Unterhaltungen - senden… + Senden… Entschlüssele Nachricht. Bitte warten… Nickname wird bereits verwendet Administrator @@ -133,8 +133,8 @@ Anwesenheitsbenachrichtigungen senden Empfange Anwesenheitsbenachrichtigungen Frage um Erlaubnis, Anwesenheitsbenachrichtigungen sehen zu dürfen - Foto auswählen - Foto aufnehmen + Bild auswählen + Bild aufnehmen Erlaube Statusanfrage vorab Die ausgewählte Datei ist kein Bild Fehler beim Umwandeln des Bildes @@ -165,7 +165,7 @@ Öffentlichen OpenPGP-Schlüssel veröffentlichen Anschalten Bist du dir sicher? - Wenn du dein Konto löscht, gehen alle Gesprächsverläufe verloren + Wenn du dein Konto löschst, gehen alle Gesprächsverläufe verloren Sprache aufzeichnen Jabber-ID: Passwort: @@ -188,13 +188,13 @@ Server Info XEP-0313: MAM XEP-0280: Message Carbons - XEP-0352: Client State Indication + XEP-0352: CSI XEP-0191: Blocking Command XEP-0237: Roster Versioning XEP-0198: Stream Management XEP-0163: PEP (Avatare) - verfügbar - nicht verfügbar + ja + nein Öffentlicher Schlüssel fehlt online vor einer Minute gesehen @@ -219,7 +219,7 @@ Kontakt löschen Kontaktdetails anzeigen Kontakt sperren - Kontakte entsperren + Kontakt entsperren Erstellen Der Kontakt existiert bereits Beitreten @@ -236,7 +236,7 @@ Auch hinzufügen %s hat bis zu diesem Punkt gelesen Veröffentlichen - Klicke hier, um einen Avatar auszuwählen + Hier klicken, um einen Avatar auszuwählen Achtung: Jeder, der deinen Status sehen darf, sieht auch deinen Avatar. Veröffentliche… Der Server hat die Veröffentlichung des Avatars abgelehnt. @@ -250,7 +250,7 @@ Verbinden Das Konto existiert bereits Weiter - Aktuelle Sitzung wiederhergestellt + Sitzung wiederhergestellt Zusätzliche Informationen Überspringen Benachrichtigungen deaktivieren @@ -329,17 +329,17 @@ Erneut versuchen Fertig Überprüft! - Kontakt forder SMP Überprüfung an + Kontakt fordert eine Überprüfung an Keine gültige OTR Sitzung gefunden! Conversations Berühren, um den Vordergrund-Dient zu deaktiveren. Den Dienst im Vordergrund ausführen. - Verhindert, dass das Betriebssystem die Verbindung unterbricht + Verhindert, dass Android die Verbindung unterbricht Datei auswählen Empfange %1$s Datei (%2$d%% heruntergeladen) Download %s Datei Öffne %s Datei - sende (%1$d%% gesendet) + Sende (%1$d%% gesendet) Bereite Datei für die Übertragung vor Datei zum Download angeboten %s Datei @@ -353,7 +353,7 @@ Dynamische Tags anzeigen Zeige schreibgeschützte Tags unterhalb der Kontakte Aktiviere Benachrichtigungen - Starte Konferenze mit… + Starte Konferenz mit… Konferenz-Server kann nicht gefunden werden Starten der Konferenz fehlgeschlagen! Konferenz erstellt! @@ -361,8 +361,8 @@ Zurücksetzen Konto-Avatar OTR-Fingerabdruck in Zwischenablage kopieren - Hole Chatverlauf vom Server - Keine weiteren Nachrichten auf dem Server vorhanden. + Lade Chatverlauf + Keine weiteren Nachrichten vorhanden Aktualisiere… Passwort geändert. Passwort kann nicht geändert werden. -- cgit v1.2.3 From 85f24c91061ecc6b9d038837cd304164f59135bb Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 5 Jan 2015 16:17:05 +0100 Subject: avoid requesting blocklist after stream resumption --- .../eu/siacs/conversations/parser/IqParser.java | 1 + .../siacs/conversations/xmpp/XmppConnection.java | 50 ++++++++++------------ 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/parser/IqParser.java b/src/main/java/eu/siacs/conversations/parser/IqParser.java index 3b501f33..6430c296 100644 --- a/src/main/java/eu/siacs/conversations/parser/IqParser.java +++ b/src/main/java/eu/siacs/conversations/parser/IqParser.java @@ -92,6 +92,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { // Otherwise, just update the existing blocklist. if (packet.getType() == IqPacket.TYPE.RESULT) { account.clearBlocklist(); + account.getXmppConnection().getFeatures().setBlockListRequested(true); } if (items != null) { final Collection jids = new ArrayList<>(items.size()); diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 714b9a51..30437575 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -95,12 +95,9 @@ public class XmppConnection implements Runnable { private int smVersion = 3; private final SparseArray messageReceipts = new SparseArray<>(); - private boolean enabledEncryption = false; - private boolean enabledCarbons = false; - private int stanzasReceived = 0; private int stanzasSent = 0; - private long lastPaketReceived = 0; + private long lastPacketReceived = 0; private long lastPingSent = 0; private long lastConnect = 0; private long lastSessionStarted = 0; @@ -147,13 +144,12 @@ public class XmppConnection implements Runnable { protected void connect() { Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": connecting"); - enabledEncryption = false; + features.encryptionEnabled = false; lastConnect = SystemClock.elapsedRealtime(); lastPingSent = SystemClock.elapsedRealtime(); this.attempt++; try { - shouldAuthenticate = shouldBind = !account - .isOptionSet(Account.OPTION_REGISTER); + shouldAuthenticate = shouldBind = !account.isOptionSet(Account.OPTION_REGISTER); tagReader = new XmlReader(wakeLock); tagWriter = new TagWriter(); packetCallbacks.clear(); @@ -304,7 +300,7 @@ public class XmppConnection implements Runnable { final RequestPacket r = new RequestPacket(smVersion); tagWriter.writeStanzaAsync(r); } else if (nextTag.isStart("resumed")) { - lastPaketReceived = SystemClock.elapsedRealtime(); + lastPacketReceived = SystemClock.elapsedRealtime(); final Element resumed = tagReader.readElement(nextTag); final String h = resumed.getAttribute("h"); try { @@ -337,7 +333,7 @@ public class XmppConnection implements Runnable { tagWriter.writeStanzaAsync(ack); } else if (nextTag.isStart("a")) { final Element ack = tagReader.readElement(nextTag); - lastPaketReceived = SystemClock.elapsedRealtime(); + lastPacketReceived = SystemClock.elapsedRealtime(); final int serverSequence = Integer.parseInt(ack.getAttribute("h")); final String msgId = this.messageReceipts.get(serverSequence); if (msgId != null) { @@ -426,7 +422,7 @@ public class XmppConnection implements Runnable { } } ++stanzasReceived; - lastPaketReceived = SystemClock.elapsedRealtime(); + lastPacketReceived = SystemClock.elapsedRealtime(); return element; } @@ -530,7 +526,7 @@ public class XmppConnection implements Runnable { tagWriter.setOutputStream(sslSocket.getOutputStream()); sendStartStream(); Log.d(Config.LOGTAG, account.getJid().toBareJid()+ ": TLS connection established"); - enabledEncryption = true; + features.encryptionEnabled = true; processStream(tagReader.readTag()); sslSocket.close(); } catch (final NoSuchAlgorithmException | KeyManagementException e1) { @@ -543,18 +539,18 @@ public class XmppConnection implements Runnable { private void processStreamFeatures(final Tag currentTag) throws XmlPullParserException, IOException { this.streamFeatures = tagReader.readElement(currentTag); - if (this.streamFeatures.hasChild("starttls") && !enabledEncryption) { + if (this.streamFeatures.hasChild("starttls") && !features.encryptionEnabled) { sendStartTLS(); } else if (this.streamFeatures.hasChild("register") && account.isOptionSet(Account.OPTION_REGISTER) - && enabledEncryption) { + && features.encryptionEnabled) { sendRegistryRequest(); } else if (!this.streamFeatures.hasChild("register") && account.isOptionSet(Account.OPTION_REGISTER)) { changeStatus(Account.State.REGISTRATION_NOT_SUPPORTED); disconnect(true); } else if (this.streamFeatures.hasChild("mechanisms") - && shouldAuthenticate && enabledEncryption) { + && shouldAuthenticate && features.encryptionEnabled) { final List mechanisms = extractMechanisms(streamFeatures .findChild("mechanisms")); final Element auth = new Element("auth"); @@ -679,15 +675,15 @@ public class XmppConnection implements Runnable { tagWriter.writeStanzaAsync(enable); stanzasSent = 0; messageReceipts.clear(); - } else if (streamFeatures.hasChild("sm", - "urn:xmpp:sm:2")) { + } else if (streamFeatures.hasChild("sm", "urn:xmpp:sm:2")) { smVersion = 2; final EnablePacket enable = new EnablePacket(smVersion); tagWriter.writeStanzaAsync(enable); stanzasSent = 0; messageReceipts.clear(); } - enabledCarbons = false; + features.carbonsEnabled = false; + features.blockListRequested = false; disco.clear(); sendServiceDiscoveryInfo(account.getServer()); sendServiceDiscoveryItems(account.getServer()); @@ -750,12 +746,10 @@ public class XmppConnection implements Runnable { } private void enableAdvancedStreamFeatures() { - if (getFeatures().carbons()) { - if (!enabledCarbons) { - sendEnableCarbons(); - } + if (getFeatures().carbons() && !features.carbonsEnabled) { + sendEnableCarbons(); } - if (getFeatures().blocking()) { + if (getFeatures().blocking() && !features.blockListRequested) { Log.d(Config.LOGTAG, "Requesting block list"); this.sendIqPacket(getIqGenerator().generateGetBlockList(), mXmppConnectionService.getIqParser()); } @@ -792,7 +786,7 @@ public class XmppConnection implements Runnable { if (!packet.hasChild("error")) { Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": successfully enabled carbons"); - enabledCarbons = true; + features.carbonsEnabled = true; } else { Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": error enableing carbons " + packet.toString()); @@ -1018,7 +1012,7 @@ public class XmppConnection implements Runnable { } public long getLastPacketReceived() { - return this.lastPaketReceived; + return this.lastPacketReceived; } public void sendActive() { @@ -1031,6 +1025,9 @@ public class XmppConnection implements Runnable { public class Features { XmppConnection connection; + private boolean carbonsEnabled = false; + private boolean encryptionEnabled = false; + private boolean blockListRequested = false; public Features(final XmppConnection connection) { this.connection = connection; @@ -1078,9 +1075,8 @@ public class XmppConnection implements Runnable { return connection.streamFeatures != null && connection.streamFeatures.hasChild("ver"); } - public boolean streamhost() { - return connection - .findDiscoItemByFeature("http://jabber.org/protocol/bytestreams") != null; + public void setBlockListRequested(boolean value) { + this.blockListRequested = value; } } -- cgit v1.2.3 From 0c51245ff5840cf485ce893062adc1cf778cd808 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 5 Jan 2015 18:45:39 +0100 Subject: reworked ping scheduling strategy. very experimental --- .../services/XmppConnectionService.java | 93 ++++++++-------------- 1 file changed, 32 insertions(+), 61 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 59cb3bb2..1192d5b9 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -188,12 +188,12 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } } syncDirtyContacts(account); - scheduleWakeupCall(Config.PING_MAX_INTERVAL, true); + scheduleWakeUpCall(Config.PING_MAX_INTERVAL,account.getUuid().hashCode()); } else if (account.getStatus() == Account.State.OFFLINE) { resetSendingToWaiting(account); if (!account.isOptionSet(Account.OPTION_DISABLED)) { int timeToReconnect = mRandom.nextInt(50) + 10; - scheduleWakeupCall(timeToReconnect, false); + scheduleWakeUpCall(timeToReconnect,account.getUuid().hashCode()); } } else if (account.getStatus() == Account.State.REGISTRATION_SUCCESSFUL) { databaseBackend.updateAccount(account); @@ -206,7 +206,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa + ": error connecting account. try again in " + next + "s for the " + (connection.getAttempt() + 1) + " time"); - scheduleWakeupCall((int) (next * 1.2), false); + scheduleWakeUpCall(next,account.getUuid().hashCode()); } } getNotificationService().updateErrorNotification(); @@ -241,8 +241,6 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa private OpenPgpServiceConnection pgpServiceConnection; private PgpEngine mPgpEngine = null; - private Intent pingIntent; - private PendingIntent pendingPingIntent = null; private WakeLock wakeLock; private PowerManager pm; private final OnBindListener mOnBindListener = new OnBindListener() { @@ -388,16 +386,17 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa @Override public int onStartCommand(Intent intent, int flags, int startId) { - if (intent != null && intent.getAction() != null) { - if (intent.getAction().equals(ACTION_MERGE_PHONE_CONTACTS)) { + final String action = intent == null ? null : intent.getAction(); + if (action != null) { + if (action.equals(ACTION_MERGE_PHONE_CONTACTS)) { PhoneHelper.loadPhoneContacts(getApplicationContext(), new ArrayList(), this); return START_STICKY; - } else if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) { + } else if (action.equals(Intent.ACTION_SHUTDOWN)) { logoutAndSave(); return START_NOT_STICKY; - } else if (intent.getAction().equals(ACTION_CLEAR_NOTIFICATION)) { + } else if (action.equals(ACTION_CLEAR_NOTIFICATION)) { mNotificationService.clear(); - } else if (intent.getAction().equals(ACTION_DISABLE_FOREGROUND)) { + } else if (action.equals(ACTION_DISABLE_FOREGROUND)) { getPreferences().edit().putBoolean("keep_foreground_service",false).commit(); toggleForegroundService(); } @@ -419,37 +418,36 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } } if (account.getStatus() == Account.State.ONLINE) { - long lastReceived = account.getXmppConnection() - .getLastPacketReceived(); - long lastSent = account.getXmppConnection() - .getLastPingSent(); - if (lastSent - lastReceived >= Config.PING_TIMEOUT * 1000) { - Log.d(Config.LOGTAG, account.getJid() - + ": ping timeout"); + long lastReceived = account.getXmppConnection().getLastPacketReceived(); + long lastSent = account.getXmppConnection().getLastPingSent(); + long pingInterval = "ui".equals(action) ? Config.PING_MIN_INTERVAL * 1000 : Config.PING_MAX_INTERVAL * 1000; + long secondsToNextPing = ((lastReceived + pingInterval) - SystemClock.elapsedRealtime()) / 1000; + if (lastSent > lastReceived && (lastSent + Config.PING_TIMEOUT * 1000) < SystemClock.elapsedRealtime()) { + Log.d(Config.LOGTAG, account.getJid().toBareJid()+ ": ping timeout"); this.reconnectAccount(account, true); - } else if (SystemClock.elapsedRealtime() - lastReceived >= Config.PING_MIN_INTERVAL * 1000) { + } else if (secondsToNextPing <= 0) { account.getXmppConnection().sendPing(); - this.scheduleWakeupCall(2, false); + Log.d(Config.LOGTAG, account.getJid().toBareJid()+" send ping"); + this.scheduleWakeUpCall(Config.PING_TIMEOUT,account.getUuid().hashCode()); + } else { + this.scheduleWakeUpCall((int) secondsToNextPing, account.getUuid().hashCode()); } } else if (account.getStatus() == Account.State.OFFLINE) { if (account.getXmppConnection() == null) { - account.setXmppConnection(this - .createConnection(account)); + account.setXmppConnection(this.createConnection(account)); } new Thread(account.getXmppConnection()).start(); } else if ((account.getStatus() == Account.State.CONNECTING) && ((SystemClock.elapsedRealtime() - account .getXmppConnection().getLastConnect()) / 1000 >= Config.CONNECT_TIMEOUT)) { - Log.d(Config.LOGTAG, account.getJid() - + ": time out during connect reconnecting"); + Log.d(Config.LOGTAG, account.getJid()+ ": time out during connect reconnecting"); reconnectAccount(account, true); } else { if (account.getXmppConnection().getTimeToNextAttempt() <= 0) { reconnectAccount(account, true); } } - // in any case. reschedule wakup call - this.scheduleWakeupCall(Config.PING_MAX_INTERVAL, true); + } if (mOnAccountUpdate != null) { mOnAccountUpdate.onAccountUpdate(); @@ -546,42 +544,16 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa stopSelf(); } - protected void scheduleWakeupCall(int seconds, boolean ping) { - long timeToWake = SystemClock.elapsedRealtime() + seconds * 1000; - Context context = getApplicationContext(); - AlarmManager alarmManager = (AlarmManager) context - .getSystemService(Context.ALARM_SERVICE); + protected void scheduleWakeUpCall(int seconds, int requestCode) { + final long timeToWake = SystemClock.elapsedRealtime() + seconds * 1000; - if (ping) { - if (this.pingIntent == null) { - this.pingIntent = new Intent(context, EventReceiver.class); - this.pingIntent.setAction("ping"); - this.pingIntent.putExtra("time", timeToWake); - this.pendingPingIntent = PendingIntent.getBroadcast(context, 0, - this.pingIntent, 0); - alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, - timeToWake, pendingPingIntent); - } else { - long scheduledTime = this.pingIntent.getLongExtra("time", 0); - if (scheduledTime < SystemClock.elapsedRealtime() - || (scheduledTime > timeToWake)) { - this.pingIntent.putExtra("time", timeToWake); - alarmManager.cancel(this.pendingPingIntent); - this.pendingPingIntent = PendingIntent.getBroadcast( - context, 0, this.pingIntent, 0); - alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, - timeToWake, pendingPingIntent); - } - } - } else { - Intent intent = new Intent(context, EventReceiver.class); - intent.setAction("ping_check"); - PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, - intent, 0); - alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, timeToWake, - alarmIntent); - } + Context context = getApplicationContext(); + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + Intent intent = new Intent(context, EventReceiver.class); + intent.setAction("ping"); + PendingIntent alarmIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0); + alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, timeToWake, alarmIntent); } public XmppConnection createConnection(final Account account) { @@ -1862,8 +1834,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } Thread thread = new Thread(account.getXmppConnection()); thread.start(); - scheduleWakeupCall((int) (Config.CONNECT_TIMEOUT * 1.2), - false); + scheduleWakeUpCall(Config.CONNECT_TIMEOUT,account.getUuid().hashCode()); } else { account.getRoster().clearPresences(); account.setXmppConnection(null); -- cgit v1.2.3 From fdcbdfdc0500e9cad97d716def5112d2bec91e19 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 5 Jan 2015 18:46:42 +0100 Subject: added debug info + possible platform bug work arounds to message adapter --- .../java/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index ae3c1834..5b5664c6 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -10,6 +10,7 @@ import android.text.SpannableString; import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.util.DisplayMetrics; +import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; @@ -23,6 +24,7 @@ import android.widget.Toast; import java.util.List; +import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; @@ -430,6 +432,11 @@ public class MessageAdapter extends ArrayAdapter { } return view; } else if (type == NULL) { + if (viewHolder.message_box != null) { + Log.e(Config.LOGTAG, "detected type=NULL but with wrong cached view"); + view = activity.getLayoutInflater().inflate(R.layout.message_null, parent, false); + view.setTag(new ViewHolder()); + } if (position == getCount() - 1) { view.getLayoutParams().height = 1; } else { @@ -438,6 +445,9 @@ public class MessageAdapter extends ArrayAdapter { } view.setLayoutParams(view.getLayoutParams()); return view; + } else if (message.wasMergedIntoPrevious()) { + Log.e(Config.LOGTAG,"detected wasMergedIntoPrevious with wrong type"); + return view; } else if (viewHolder.messageBody == null || viewHolder.image == null) { return view; //avoiding weird platform bugs } else if (type == RECEIVED) { -- cgit v1.2.3 From f8758b7bd537a02f9a021322caf5ac6f4f4b2548 Mon Sep 17 00:00:00 2001 From: Benoit Bouvarel Date: Mon, 5 Jan 2015 23:42:37 +0100 Subject: Update strings.xml French translation updated --- src/main/res/values-fr/strings.xml | 87 +++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index b3b86f1f..c6355927 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -268,5 +268,90 @@ Vérification de l\'image L\'image a été suprimée Vous n\'êtes pas connecté. Merci de retenter plus tard. - +Vérifier la taille de l\'image +Options du message +Copier le texte +Partager l\'image +Copier l\'URL +Envoyer de nouveau +URL de l\'image +Message texte +URL copiée dans le presse-papier +Message copié dans le presse-papier +Echec lors de l\'envoi de l\'image +Scanner un QR code +Afficher le QR code +Afficher la liste des contacts bloqués + +Vérifier l\'OTR +Supprimer l\'empreinte +Scanner +(ou les touches) +Socialist Millionaire Protocol +Indice ou question +Secret partagé +Confirmer +En cours +Répondre +Echoué +Les secrets ne correspondent pas +Réessayer +Terminé +Vérifié! +Le contact requiert la vérification du SMP +Aucune session valide d\'OTR n\'a été trouvée! +Conversations +Toucher pour désactiver le service au premier-plan +Garder le service au premier-plan +Evite que le système ferme votre connexion +Choix d\'un fichier +Réception %1$s fichier (%2$d%% complété) +Télecharger %s fichier +Ouvrir %s fichier +envoi (%1$d%% complété) +Préparation du fichier pour l\'envoi +Fichier disponible pour téléchargement +%s fichier +Annuler l\'envoi +Envoi du fichier échoué +Le fichier a été supprimé +Aucune application disponible pour ouvrir le fichier +Impossible de vérifier l\'empreinte +Vérifier manuellement +Etes-vous sûr de vouloir vérifier l\'empreinte OTR de vos contacts? +Afficher les tags dynamiques +Afficher les tags en lecture-seule sous les contacts +Activer les notifications +Créer une conférence avec… +Aucun serveur de conférence disponible +Echec de la création de la conférence! +Conférence créée! +Secret commun accepté! +Réinitialiser +Image du compte +Copier l\'empreinte OTR dans le presse-papier +Récupérer l\'historique depuis le serveur +Fin de l\'historique sur le serveur +Mise à jour… +Mot de passe modifié! +Impossible de changer le mot de passe +Envoyez un message pour commencer la conversation chiffrée +Poser une question +Si vous et votre contact avez un secret en commun connu par vous deux uniquement (comme une histoire personnelle ou même comme ce que vous avez mangé lors de votre dernière rencontre) vous pouvez utiliser ce secret pour vérifier vos empreintes respectives.\n\nVous envoyez un indice ou une question à votre contact qui devra répondre en faisant attention à la casse. +Votre contact voudrait vous identifier de manière sûre grâce à un secret commun. Il vous envoie le message ou la question suivante. +Votre indice ne devrait pas être vide +Votre secret ne peut être vide +Comparez avec soin l\'empreinte de votre contact avec celle indiquée ci-dessous.\nVous pouvez utiliser n\'importe quel moyen de communication sécurisée pour cela, tel que le télephone ou l\'envoi d\'un e-mail chiffré. +Changer de mot de passe +Mot de passe actuel +Nouveau mot de passe +Le mot de passe ne peut être vide +Activer tous les comptes +Désactiver tous les comptes +Faire une action avec +Aucune affiliation +Aucun rôle +Banni +Membre +Mode avancé -- cgit v1.2.3 From 352af145f83607e24a5115021e0f07f6e3471518 Mon Sep 17 00:00:00 2001 From: Benoit Bouvarel Date: Tue, 6 Jan 2015 01:23:51 +0100 Subject: Update strings.xml char ">" was missing at line 285 --- src/main/res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index c6355927..daae6076 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -282,7 +282,7 @@ Scanner un QR code Afficher le QR code Afficher la liste des contacts bloqués - +Détails du compte Vérifier l\'OTR Supprimer l\'empreinte Scanner -- cgit v1.2.3 From 4b0043ba91026887d74bfc46f0bcb0b23a6c2230 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 6 Jan 2015 18:25:31 +0100 Subject: fixed potential NPEs in ShareWithActivity --- src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java index 5e770376..a3904d21 100644 --- a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java @@ -134,11 +134,12 @@ public class ShareWithActivity extends XmppActivity { @Override public void onStart() { final String type = getIntent().getType(); - if (type != null && !type.startsWith("text/")) { - this.share.uri = (Uri) getIntent().getParcelableExtra(Intent.EXTRA_STREAM); + final Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM); + if (type != null && uri != null && !type.startsWith("text/")) { + this.share.uri = uri; try { - this.share.image = type.startsWith("image/") - || URLConnection.guessContentTypeFromName(this.share.uri.toString()).startsWith("image/"); + String guess = URLConnection.guessContentTypeFromName(uri.toString()); + this.share.image = type.startsWith("image/") || (guess != null && guess.startsWith("image/")); } catch (final StringIndexOutOfBoundsException ignored) { this.share.image = false; } -- cgit v1.2.3 From 562699c7458a2acda942b8a6fe7e0bed4032309c Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 6 Jan 2015 18:26:14 +0100 Subject: run invalidateOptionsMenu on uiThread --- src/main/java/eu/siacs/conversations/ui/ConversationActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 5cfc1116..e71f4cbb 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -1050,10 +1050,10 @@ public class ConversationActivity extends XmppActivity @Override public void OnUpdateBlocklist(Status status) { - invalidateOptionsMenu(); runOnUiThread(new Runnable() { @Override public void run() { + invalidateOptionsMenu(); ConversationActivity.this.mConversationFragment.updateMessages(); } }); -- cgit v1.2.3 From 353f4e38bb065dacd8c8c16872b205aa0ca02f92 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 6 Jan 2015 18:44:08 +0100 Subject: mark sent images as sent_received instead of sent fixed #842 --- src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java index ff94563c..fe37596c 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java @@ -707,8 +707,7 @@ public class JingleConnection implements Downloadable { private void receiveSuccess() { this.mJingleStatus = JINGLE_STATUS_FINISHED; - this.mXmppConnectionService.markMessage(this.message, - Message.STATUS_SEND); + this.mXmppConnectionService.markMessage(this.message,Message.STATUS_SEND_RECEIVED); this.disconnectSocks5Connections(); if (this.transport != null && this.transport instanceof JingleInbandTransport) { this.transport.disconnect(); -- cgit v1.2.3 From f02f510c187a581afd27093c97eb421fc56d3221 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 6 Jan 2015 19:46:52 +0100 Subject: fixed bug in new ping strategy --- .../java/eu/siacs/conversations/services/XmppConnectionService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 1192d5b9..cf3f72dc 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -421,16 +421,16 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa long lastReceived = account.getXmppConnection().getLastPacketReceived(); long lastSent = account.getXmppConnection().getLastPingSent(); long pingInterval = "ui".equals(action) ? Config.PING_MIN_INTERVAL * 1000 : Config.PING_MAX_INTERVAL * 1000; - long secondsToNextPing = ((lastReceived + pingInterval) - SystemClock.elapsedRealtime()) / 1000; + long msToNextPing = (Math.max(lastReceived,lastSent) + pingInterval) - SystemClock.elapsedRealtime(); if (lastSent > lastReceived && (lastSent + Config.PING_TIMEOUT * 1000) < SystemClock.elapsedRealtime()) { Log.d(Config.LOGTAG, account.getJid().toBareJid()+ ": ping timeout"); this.reconnectAccount(account, true); - } else if (secondsToNextPing <= 0) { + } else if (msToNextPing <= 0) { account.getXmppConnection().sendPing(); Log.d(Config.LOGTAG, account.getJid().toBareJid()+" send ping"); this.scheduleWakeUpCall(Config.PING_TIMEOUT,account.getUuid().hashCode()); } else { - this.scheduleWakeUpCall((int) secondsToNextPing, account.getUuid().hashCode()); + this.scheduleWakeUpCall((int) (msToNextPing / 1000), account.getUuid().hashCode()); } } else if (account.getStatus() == Account.State.OFFLINE) { if (account.getXmppConnection() == null) { -- cgit v1.2.3 From 066f60a23c9d69b60ea7119589d70a826a7def4d Mon Sep 17 00:00:00 2001 From: Jaroslav Lichtblau Date: Tue, 6 Jan 2015 21:15:32 +0100 Subject: Czech translation for - show affiliation instead of role in MucDetails --- src/main/res/values-cs/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml index f35893ee..ba8ae998 100644 --- a/src/main/res/values-cs/strings.xml +++ b/src/main/res/values-cs/strings.xml @@ -381,4 +381,9 @@ Povolit všechny účty Vypnout všechny účty Provést akci s + Nepřidružený + Bez role + Vyloučený + Člen + Pokročilý mód \ No newline at end of file -- cgit v1.2.3 From d502e57661ecc63e09692add8ae3e7c0daf93b70 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 7 Jan 2015 00:59:42 +0100 Subject: refactored UiHelper --- src/main/java/eu/siacs/conversations/utils/UIHelper.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/utils/UIHelper.java b/src/main/java/eu/siacs/conversations/utils/UIHelper.java index 2f1383b8..74f0d345 100644 --- a/src/main/java/eu/siacs/conversations/utils/UIHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/UIHelper.java @@ -51,10 +51,18 @@ public class UIHelper { } private static boolean today(Date date) { + return sameDay(date,new Date(System.currentTimeMillis())); + } + + public static boolean sameDay(long timestamp1, long timestamp2) { + return sameDay(new Date(timestamp1),new Date(timestamp2)); + } + + private static boolean sameDay(Date a, Date b) { Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); - cal1.setTime(date); - cal2.setTimeInMillis(System.currentTimeMillis()); + cal1.setTime(a); + cal2.setTime(b); return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2 .get(Calendar.DAY_OF_YEAR); -- cgit v1.2.3 From a22c8c04d8c15925e6048dcc5de3d8e8eb9d7055 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 7 Jan 2015 01:01:15 +0100 Subject: use copyonwritearraylist in for phone helper --- .../java/eu/siacs/conversations/services/XmppConnectionService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index cf3f72dc..90e9f20b 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -389,7 +389,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa final String action = intent == null ? null : intent.getAction(); if (action != null) { if (action.equals(ACTION_MERGE_PHONE_CONTACTS)) { - PhoneHelper.loadPhoneContacts(getApplicationContext(), new ArrayList(), this); + PhoneHelper.loadPhoneContacts(getApplicationContext(), new CopyOnWriteArrayList(), this); return START_STICKY; } else if (action.equals(Intent.ACTION_SHUTDOWN)) { logoutAndSave(); @@ -500,7 +500,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa this.databaseBackend.readRoster(account.getRoster()); } initConversations(); - PhoneHelper.loadPhoneContacts(getApplicationContext(),new ArrayList(), this); + PhoneHelper.loadPhoneContacts(getApplicationContext(),new CopyOnWriteArrayList(), this); getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contactObserver); this.fileObserver.startWatching(); -- cgit v1.2.3 From 45bb59dba8850d67025a83244a80a1d69d59276b Mon Sep 17 00:00:00 2001 From: Sam Whited Date: Tue, 6 Jan 2015 21:37:49 -0500 Subject: Add materials theme --- build.gradle | 6 +++--- src/main/res/values-v21/themes.xml | 14 ++++++++++++++ src/main/res/values/colors.xml | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 src/main/res/values-v21/themes.xml diff --git a/build.gradle b/build.gradle index 29cb3840..87e35247 100644 --- a/build.gradle +++ b/build.gradle @@ -40,12 +40,12 @@ dependencies { } android { - compileSdkVersion 19 - buildToolsVersion "19.1" + compileSdkVersion 21 + buildToolsVersion "21.1.2" defaultConfig { minSdkVersion 14 - targetSdkVersion 19 + targetSdkVersion 21 versionCode 41 versionName "0.10" } diff --git a/src/main/res/values-v21/themes.xml b/src/main/res/values-v21/themes.xml new file mode 100644 index 00000000..fddab466 --- /dev/null +++ b/src/main/res/values-v21/themes.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml index 908b8b89..c21650a5 100644 --- a/src/main/res/values/colors.xml +++ b/src/main/res/values/colors.xml @@ -3,6 +3,7 @@ #ff259b24 #ff0a7e07 + #ff0091ea #de000000 #8a000000 #fffafafa -- cgit v1.2.3 From 312f95b73d9e2e1a0e3f21ea7c297263ec05987b Mon Sep 17 00:00:00 2001 From: Sam Whited Date: Tue, 6 Jan 2015 21:51:37 -0500 Subject: Update travis config to use current build tools --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cb01fd95..e11c02c5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,5 +3,6 @@ android: components: - platform-tools - tools + - build-tools-21.1.2 - build-tools-19.1.0 - - android-19 + - android-21 -- cgit v1.2.3 From a1a2a391089e206fa7d3bd2c47cc5f76758eaaec Mon Sep 17 00:00:00 2001 From: kruks23 Date: Wed, 7 Jan 2015 08:50:19 +0100 Subject: Update affiliation in MUC details and advance mode --- src/main/res/values-es/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index cd67c2c9..fba7dbc8 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -381,4 +381,9 @@ Habilitar todas las cuentas Deshabilitar todas las cuentas Realizar acción con + Sin afiliación + Sin rol + Rechazado + Miembro + Modo avanzado -- cgit v1.2.3 From 81e9afdf192aa925f1dc18a1b5e1d666ab153342 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 7 Jan 2015 12:20:39 +0100 Subject: reset next encryption when archiving conversations --- .../java/eu/siacs/conversations/services/XmppConnectionService.java | 3 +++ src/main/java/eu/siacs/conversations/ui/ConversationActivity.java | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 90e9f20b..5d314ecf 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1005,6 +1005,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } else { conversation.setMode(Conversation.MODE_SINGLE); } + conversation.setNextEncryption(-1); conversation.addAll(0, databaseBackend.getMessages(conversation, Config.PAGE_SIZE)); this.databaseBackend.updateConversation(conversation); } else { @@ -1040,6 +1041,8 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } public void archiveConversation(Conversation conversation) { + conversation.setStatus(Conversation.STATUS_ARCHIVED); + conversation.setNextEncryption(-1); synchronized (this.conversations) { if (conversation.getMode() == Conversation.MODE_MULTI) { if (conversation.getAccount().getStatus() == Account.State.ONLINE) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index e71f4cbb..795dabf2 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -492,7 +492,6 @@ public class ConversationActivity extends XmppActivity } public void endConversation(Conversation conversation) { - conversation.setStatus(Conversation.STATUS_ARCHIVED); showConversationsOverview(); xmppConnectionService.archiveConversation(conversation); if (conversationList.size() > 0) { -- cgit v1.2.3 From ef525fb10e672b23219fdf180d310de9f6ce59d3 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 7 Jan 2015 15:03:29 +0100 Subject: basic affiliation changes in muc --- .../siacs/conversations/entities/MucOptions.java | 48 ++++++++++---- .../siacs/conversations/generator/IqGenerator.java | 11 ++++ .../services/XmppConnectionService.java | 22 +++++++ .../ui/ConferenceDetailsActivity.java | 76 ++++++++++++++++++---- src/main/res/menu/muc_details_context.xml | 23 ++++++- src/main/res/values/strings.xml | 6 ++ 6 files changed, 160 insertions(+), 26 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/MucOptions.java b/src/main/java/eu/siacs/conversations/entities/MucOptions.java index ce2c5b04..6a12f407 100644 --- a/src/main/java/eu/siacs/conversations/entities/MucOptions.java +++ b/src/main/java/eu/siacs/conversations/entities/MucOptions.java @@ -17,40 +17,64 @@ import android.annotation.SuppressLint; public class MucOptions { public enum Affiliation { - OWNER(R.string.owner), - ADMIN(R.string.admin), - MEMBER(R.string.member), - OUTCAST(R.string.outcast), - NONE(R.string.no_affiliation); - - private Affiliation(int resId) { + OWNER("owner", 4, R.string.owner), + ADMIN("admin", 3, R.string.admin), + MEMBER("member", 2, R.string.member), + OUTCAST("outcast", 0, R.string.outcast), + NONE("none", 1, R.string.no_affiliation); + + private Affiliation(String string, int rank, int resId) { + this.string = string; this.resId = resId; + this.rank = rank; } + private String string; private int resId; + private int rank; public int getResId() { return resId; } + + @Override + public String toString() { + return this.string; + } + + public boolean outranks(Affiliation affiliation) { + return rank > affiliation.rank; + } + + public boolean ranks(Affiliation affiliation) { + return rank >= affiliation.rank; + } } ; public enum Role { - MODERATOR(R.string.moderator), - VISITOR(R.string.visitor), - PARTICIPANT(R.string.participant), - NONE(R.string.no_role); + MODERATOR("moderator", R.string.moderator), + VISITOR("visitor", R.string.visitor), + PARTICIPANT("participant", R.string.participant), + NONE("none", R.string.no_role); - private Role(int resId) { + private Role(String string, int resId) { + this.string = string; this.resId = resId; } + private String string; private int resId; public int getResId() { return resId; } + + @Override + public String toString() { + return this.string; + } } public static final int ERROR_NO_ERROR = 0; diff --git a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java index 58933692..988b9744 100644 --- a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.services.MessageArchiveService; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.utils.Xmlns; @@ -148,4 +149,14 @@ public class IqGenerator extends AbstractGenerator { query.addChild("password").setContent(newPassword); return packet; } + + public IqPacket changeAffiliation(Conversation conference, Jid jid, String affiliation) { + IqPacket packet = new IqPacket(IqPacket.TYPE.SET); + packet.setTo(conference.getJid().toBareJid()); + packet.setFrom(conference.getAccount().getJid()); + Element item = packet.query("http://jabber.org/protocol/muc#admin").addChild("item"); + item.setAttribute("jid", jid.toString()); + item.setAttribute("affiliation", affiliation); + return packet; + } } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 5d314ecf..4ab2d42b 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1516,6 +1516,28 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa }); } + public void changeAffiliationInConference(final Conversation conference, Jid user, MucOptions.Affiliation affiliation, final OnAffiliationChanged callback) { + final Jid jid = user.toBareJid(); + IqPacket request = this.mIqGenerator.changeAffiliation(conference, jid, affiliation.toString()); + Log.d(Config.LOGTAG,request.toString()); + sendIqPacket(conference.getAccount(),request,new OnIqPacketReceived() { + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + Log.d(Config.LOGTAG,packet.toString()); + if (packet.getType() == IqPacket.TYPE.RESULT) { + callback.onAffiliationChangedSuccessful(jid); + } else { + callback.onAffiliationChangeFailed(jid,R.string.could_not_change_affiliation); + } + } + }); + } + + public interface OnAffiliationChanged { + public void onAffiliationChangedSuccessful(Jid jid); + public void onAffiliationChangeFailed(Jid jid, int resId); + } + public void disconnect(Account account, boolean force) { if ((account.getStatus() == Account.State.ONLINE) || (account.getStatus() == Account.State.DISABLED)) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index 5a30d761..41190ef2 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -33,11 +33,13 @@ import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.MucOptions; import eu.siacs.conversations.entities.MucOptions.User; +import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.services.XmppConnectionService.OnMucRosterUpdate; import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate; +import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.stanzas.MessagePacket; -public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate { +public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged { public static final String ACTION_VIEW_MUC = "view_muc"; private Conversation mConversation; private OnClickListener inviteListener = new OnClickListener() { @@ -222,21 +224,44 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers if (tag instanceof User) { getMenuInflater().inflate(R.menu.muc_details_context,menu); final User user = (User) tag; + final User self = mConversation.getMucOptions().getSelf(); this.mSelectedUser = user; String name; - final Contact contact = user.getContact(); - if (contact != null) { - name = contact.getDisplayName(); - } else if (user.getJid() != null) { - name = user.getJid().toBareJid().toString(); - } else { - name = user.getName(); - } - menu.setHeaderTitle(name); - MenuItem startConversation = menu.findItem(R.id.start_conversation); - if (user.getJid() == null) { - startConversation.setVisible(false); + if (user.getJid() != null) { + final Contact contact = user.getContact(); + if (contact != null) { + name = contact.getDisplayName(); + } else if (user.getJid() != null) { + name = user.getJid().toBareJid().toString(); + } else { + name = user.getName(); + } + menu.setHeaderTitle(name); + MenuItem startConversation = menu.findItem(R.id.start_conversation); + MenuItem giveMembership = menu.findItem(R.id.give_membership); + MenuItem removeMembership = menu.findItem(R.id.remove_membership); + MenuItem giveAdminPrivileges = menu.findItem(R.id.give_admin_privileges); + MenuItem removeAdminPrivileges = menu.findItem(R.id.remove_admin_privileges); + MenuItem removeFromRoom = menu.findItem(R.id.remove_from_room); + startConversation.setVisible(true); + if (self.getAffiliation().ranks(MucOptions.Affiliation.ADMIN) && + self.getAffiliation().outranks(user.getAffiliation())) { + if (mAdvancedMode) { + if (user.getAffiliation() == MucOptions.Affiliation.NONE) { + giveMembership.setVisible(true); + } else { + removeMembership.setVisible(true); + } + } + if (user.getAffiliation() != MucOptions.Affiliation.ADMIN) { + giveAdminPrivileges.setVisible(true); + } else { + removeAdminPrivileges.setVisible(true); + } + removeFromRoom.setVisible(true); + } } + } super.onCreateContextMenu(menu,v,menuInfo); } @@ -247,6 +272,21 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers case R.id.start_conversation: startConversation(mSelectedUser); return true; + case R.id.give_admin_privileges: + xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.ADMIN,this); + return true; + case R.id.give_membership: + xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.MEMBER,this); + return true; + case R.id.remove_membership: + xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.NONE,this); + return true; + case R.id.remove_admin_privileges: + xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.MEMBER,this); + return true; + case R.id.remove_from_room: + xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.OUTCAST,this); + return true; default: return super.onContextItemSelected(item); } @@ -399,4 +439,14 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } } } + + @Override + public void onAffiliationChangedSuccessful(Jid jid) { + + } + + @Override + public void onAffiliationChangeFailed(Jid jid, int resId) { + + } } diff --git a/src/main/res/menu/muc_details_context.xml b/src/main/res/menu/muc_details_context.xml index 113934f3..ad9f174a 100644 --- a/src/main/res/menu/muc_details_context.xml +++ b/src/main/res/menu/muc_details_context.xml @@ -3,5 +3,26 @@ + android:visible="false" /> + + + + + + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index bb358610..d78e135a 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -411,4 +411,10 @@ Outcast Member Advanced mode + Grant membership + Remove membership + Grant admin privileges + Remove admin privileges + Remove from room + Could not change affiliation -- cgit v1.2.3 From 0ad8796b4402cf9f39c6aede7873429cfcd0d4ad Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 7 Jan 2015 16:45:44 +0100 Subject: fixed invites --- .../siacs/conversations/parser/MessageParser.java | 61 +++++++++------------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 65a8f9e6..af9d0401 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -348,6 +348,17 @@ public class MessageParser extends AbstractParser implements private void parseNonMessage(Element packet, Account account) { final Jid from = packet.getAttributeAsJid("from"); + Element invite = extractInvite(packet); + if (invite != null) { + Conversation conversation = mXmppConnectionService.findOrCreateConversation(account,from, true); + if (!conversation.getMucOptions().online()) { + Element password = invite.findChild("password"); + conversation.getMucOptions().setPassword(password == null ? null : password.getContent()); + mXmppConnectionService.databaseBackend.updateConversation(conversation); + mXmppConnectionService.joinMuc(conversation); + mXmppConnectionService.updateConversationUi(); + } + } if (packet.hasChild("event", "http://jabber.org/protocol/pubsub#event")) { Element event = packet.findChild("event", "http://jabber.org/protocol/pubsub#event"); @@ -374,42 +385,18 @@ public class MessageParser extends AbstractParser implements updateLastseen(packet, account, false); mXmppConnectionService.markMessage(account, from.toBareJid(), id, Message.STATUS_SEND_RECEIVED); - } else if (packet.hasChild("x", "http://jabber.org/protocol/muc#user")) { - Element x = packet.findChild("x", - "http://jabber.org/protocol/muc#user"); - if (x.hasChild("invite")) { - Conversation conversation = mXmppConnectionService - .findOrCreateConversation(account, - packet.getAttributeAsJid("from"), true); - if (!conversation.getMucOptions().online()) { - if (x.hasChild("password")) { - Element password = x.findChild("password"); - conversation.getMucOptions().setPassword( - password.getContent()); - mXmppConnectionService.databaseBackend - .updateConversation(conversation); - } - mXmppConnectionService.joinMuc(conversation); - mXmppConnectionService.updateConversationUi(); - } - } - } else if (packet.hasChild("x", "jabber:x:conference")) { - Element x = packet.findChild("x", "jabber:x:conference"); - Jid jid = x.getAttributeAsJid("jid"); - String password = x.getAttribute("password"); - if (jid != null) { - Conversation conversation = mXmppConnectionService - .findOrCreateConversation(account, jid, true); - if (!conversation.getMucOptions().online()) { - if (password != null) { - conversation.getMucOptions().setPassword(password); - mXmppConnectionService.databaseBackend - .updateConversation(conversation); - } - mXmppConnectionService.joinMuc(conversation); - mXmppConnectionService.updateConversationUi(); - } - } + } + } + + private Element extractInvite(Element message) { + Element x = message.findChild("x","http://jabber.org/protocol/muc#user"); + if (x == null) { + x = message.findChild("x","jabber:x:conference"); + } + if (x != null && x.hasChild("invite")) { + return x; + } else { + return null; } } @@ -493,7 +480,7 @@ public class MessageParser extends AbstractParser implements if (message != null) { message.markUnread(); } - } else if (packet.hasChild("body")) { + } else if (packet.hasChild("body") && extractInvite(packet) == null) { message = this.parseChat(packet, account); if (message != null) { message.markUnread(); -- cgit v1.2.3 From 9d43ddbf59f9575d9b2fc7a1022c7b59f99cd5da Mon Sep 17 00:00:00 2001 From: Christian S Date: Wed, 7 Jan 2015 12:25:37 +0100 Subject: Updated German translations... ...I'm not sure if "Weitere Einstellungen" is the right translation for "advanced mode". Has anybody a better translation? I've changed the translations. Updated German translations... Updated German translations... --- src/main/res/values-de/strings.xml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index aa87f758..c482f268 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -374,10 +374,21 @@ Dein gemeinsamer Schlüssel darf nicht leer sein Vergleiche den angezeigten Fingerabdruck sorgfältig mit dem deines Kontakts.\nDu kannst dazu einen sicheren Kommunikationsweg (z.B. verschlüsselte E-Mail oder Telefonanruf) zum Austausch nutzen. Passwort ändern - Aktuelles Passwort - Neues Passwort - Das Passwort darf nicht leer sein + Aktuelles Passwort + Neues Passwort + Das Passwort darf nicht leer sein Alle Konten anschalten - Alle Konten abschalten + Alle Konten abschalten Aktion durchführen mit + Keine Zugehörigkeit + Keine Rolle + Ausgeschlossen + Mitglied + Experten Modus + Mitgliedschaft gewähren + Mitgliedschaft entziehen + Administratorrechte gewähren + Administratorrechte entziehen + Aus Konferenz entfernen + Zugehörigkeit kann nicht geändert werden -- cgit v1.2.3 From 8d655f445a37acff288e39ec237395d303b7c3a2 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 7 Jan 2015 18:34:24 +0100 Subject: more muc options * show invite button only with admin privileges or on public conferences * Offer to ban user in public conferences. Thanks to @betheg for the awesome ground work for this --- .../siacs/conversations/entities/MucOptions.java | 30 ++++++++++++++++++---- .../siacs/conversations/parser/MessageParser.java | 23 ++++++++++++----- .../services/XmppConnectionService.java | 30 +++++++++++++++++++--- .../ui/ConferenceDetailsActivity.java | 27 ++++++++++++++++++- .../conversations/ui/ConversationActivity.java | 11 ++------ src/main/res/values/strings.xml | 3 +++ 6 files changed, 99 insertions(+), 25 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/MucOptions.java b/src/main/java/eu/siacs/conversations/entities/MucOptions.java index 6a12f407..96860a16 100644 --- a/src/main/java/eu/siacs/conversations/entities/MucOptions.java +++ b/src/main/java/eu/siacs/conversations/entities/MucOptions.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.crypto.PgpEngine; import eu.siacs.conversations.xml.Element; @@ -12,6 +13,7 @@ import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.stanzas.PresencePacket; import android.annotation.SuppressLint; +import android.util.Log; @SuppressLint("DefaultLocale") public class MucOptions { @@ -51,8 +53,6 @@ public class MucOptions { } } - ; - public enum Role { MODERATOR("moderator", R.string.moderator), VISITOR("visitor", R.string.visitor), @@ -86,6 +86,7 @@ public class MucOptions { public static final int KICKED_FROM_ROOM = 9; + public static final String STATUS_CODE_ROOM_CONFIG_CHANGED = "104"; public static final String STATUS_CODE_SELF_PRESENCE = "110"; public static final String STATUS_CODE_BANNED = "301"; public static final String STATUS_CODE_CHANGED_NICK = "303"; @@ -107,8 +108,8 @@ public class MucOptions { } public class User { - private Role role; - private Affiliation affiliation; + private Role role = Role.NONE; + private Affiliation affiliation = Affiliation.NONE; private String name; private Jid jid; private long pgpKeyId = 0; @@ -190,6 +191,7 @@ public class MucOptions { private Account account; private List users = new CopyOnWriteArrayList<>(); + private List features = new ArrayList<>(); private Conversation conversation; private boolean isOnline = false; private int error = ERROR_UNKNOWN; @@ -205,6 +207,23 @@ public class MucOptions { this.conversation = conversation; } + public void updateFeatures(ArrayList features) { + this.features.clear(); + this.features.addAll(features); + } + + public boolean hasFeature(String feature) { + return this.features.contains(feature); + } + + public boolean canInvite() { + return !membersOnly() || self.getAffiliation().ranks(Affiliation.ADMIN); + } + + public boolean membersOnly() { + return hasFeature("muc_membersonly"); + } + public void deleteUser(String name) { for (int i = 0; i < users.size(); ++i) { if (users.get(i).getName().equals(name)) { @@ -225,6 +244,7 @@ public class MucOptions { } public void processPacket(PresencePacket packet, PgpEngine pgp) { + Log.d(Config.LOGTAG, packet.toString()); final Jid from = packet.getFrom(); if (!from.isBareJid()) { final String name = from.getResourcepart(); @@ -320,7 +340,7 @@ public class MucOptions { } private List getStatusCodes(Element x) { - List codes = new ArrayList(); + List codes = new ArrayList<>(); if (x != null) { for (Element child : x.getChildren()) { if (child.getName().equals("status")) { diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index af9d0401..bb9de061 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -1,15 +1,13 @@ package eu.siacs.conversations.parser; -import android.util.Log; - import net.java.otr4j.session.Session; import net.java.otr4j.session.SessionStatus; -import eu.siacs.conversations.Config; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Message; +import eu.siacs.conversations.entities.MucOptions; import eu.siacs.conversations.services.MessageArchiveService; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.utils.CryptoHelper; @@ -142,14 +140,25 @@ public class MessageParser extends AbstractParser implements Conversation conversation = mXmppConnectionService .findOrCreateConversation(account, from.toBareJid(), true); if (packet.hasChild("subject")) { - conversation.getMucOptions().setSubject( - packet.findChild("subject").getContent()); + conversation.getMucOptions().setSubject(packet.findChild("subject").getContent()); mXmppConnectionService.updateConversationUi(); return null; } - if (from.isBareJid()) { + + final Element x = packet.findChild("x", "http://jabber.org/protocol/muc#user"); + if (from.isBareJid() && (x == null || !x.hasChild("status"))) { return null; + } else if (from.isBareJid() && x.hasChild("status")) { + for(Element child : x.getChildren()) { + if (child.getName().equals("status")) { + String code = child.getAttribute("code"); + if (code.contains(MucOptions.STATUS_CODE_ROOM_CONFIG_CHANGED)) { + mXmppConnectionService.fetchConferenceConfiguration(conversation); + } + } + } } + if (from.getResourcepart().equals(conversation.getMucOptions().getActualNick())) { if (mXmppConnectionService.markMessage(conversation, packet.getId(), Message.STATUS_SEND)) { @@ -350,7 +359,7 @@ public class MessageParser extends AbstractParser implements final Jid from = packet.getAttributeAsJid("from"); Element invite = extractInvite(packet); if (invite != null) { - Conversation conversation = mXmppConnectionService.findOrCreateConversation(account,from, true); + Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, from, true); if (!conversation.getMucOptions().online()) { Element password = invite.findChild("password"); conversation.getMucOptions().setPassword(password == null ? null : password.getContent()); diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 4ab2d42b..5c16ef3f 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1316,6 +1316,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa packet.addChild("x", "jabber:x:signed").setContent(sig); } sendPresencePacket(account, packet); + fetchConferenceConfiguration(conversation); if (!joinJid.equals(conversation.getJid())) { conversation.setContactJid(joinJid); databaseBackend.updateConversation(conversation); @@ -1475,6 +1476,29 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } } + public void fetchConferenceConfiguration(final Conversation conversation) { + IqPacket request = new IqPacket(IqPacket.TYPE.GET); + request.setTo(conversation.getJid().toBareJid()); + request.query("http://jabber.org/protocol/disco#info"); + sendIqPacket(conversation.getAccount(), request, new OnIqPacketReceived() { + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + if (packet.getType() != IqPacket.TYPE.ERROR) { + ArrayList features = new ArrayList(); + for (Element child : packet.query().getChildren()) { + if (child != null && child.getName().equals("feature")) { + String var = child.getAttribute("var"); + if (var != null) { + features.add(var); + } + } + } + conversation.getMucOptions().updateFeatures(features); + } + } + }); + } + public void pushConferenceConfiguration(final Conversation conversation,final Bundle options, final OnConferenceOptionsPushed callback) { IqPacket request = new IqPacket(IqPacket.TYPE.GET); request.setTo(conversation.getJid().toBareJid()); @@ -1520,14 +1544,14 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa final Jid jid = user.toBareJid(); IqPacket request = this.mIqGenerator.changeAffiliation(conference, jid, affiliation.toString()); Log.d(Config.LOGTAG,request.toString()); - sendIqPacket(conference.getAccount(),request,new OnIqPacketReceived() { + sendIqPacket(conference.getAccount(), request, new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - Log.d(Config.LOGTAG,packet.toString()); + Log.d(Config.LOGTAG, packet.toString()); if (packet.getType() == IqPacket.TYPE.RESULT) { callback.onAffiliationChangedSuccessful(jid); } else { - callback.onAffiliationChangeFailed(jid,R.string.could_not_change_affiliation); + callback.onAffiliationChangeFailed(jid, R.string.could_not_change_affiliation); } } }); diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index 41190ef2..5272c922 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -1,8 +1,10 @@ package eu.siacs.conversations.ui; import android.annotation.TargetApi; +import android.app.AlertDialog; import android.app.PendingIntent; import android.content.Context; +import android.content.DialogInterface; import android.content.IntentSender.SendIntentException; import android.graphics.Bitmap; import android.os.Build; @@ -285,13 +287,31 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.MEMBER,this); return true; case R.id.remove_from_room: - xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.OUTCAST,this); + removeFromRoom(mSelectedUser); return true; default: return super.onContextItemSelected(item); } } + private void removeFromRoom(final User user) { + if (mConversation.getMucOptions().membersOnly()) { + xmppConnectionService.changeAffiliationInConference(mConversation,user.getJid(), MucOptions.Affiliation.NONE,this); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.ban_user_from_conference); + builder.setMessage(getString(R.string.removing_from_public_conference,user.getName())); + builder.setNegativeButton(R.string.cancel,null); + builder.setPositiveButton(R.string.ban_now,new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + xmppConnectionService.changeAffiliationInConference(mConversation,user.getJid(), MucOptions.Affiliation.OUTCAST,ConferenceDetailsActivity.this); + } + }); + builder.create().show(); + } + } + protected void startConversation(User user) { if (user.getJid() != null) { Conversation conversation = xmppConnectionService.findOrCreateConversation(this.mConversation.getAccount(),user.getJid().toBareJid(),false); @@ -397,6 +417,11 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers ImageView iv = (ImageView) view.findViewById(R.id.contact_photo); iv.setImageBitmap(bm); membersView.addView(view); + if (mConversation.getMucOptions().canInvite()) { + mInviteButton.setVisibility(View.VISIBLE); + } else { + mInviteButton.setVisibility(View.GONE); + } } } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 795dabf2..ba5b3e59 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -9,7 +9,6 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.IntentSender.SendIntentException; -import android.media.MediaActionSound; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; @@ -83,11 +82,6 @@ public class ConversationActivity extends XmppActivity private boolean mActivityPaused = false; - - public List getConversationList() { - return this.conversationList; - } - public Conversation getSelectedConversation() { return this.mSelectedConversation; } @@ -284,8 +278,7 @@ public class ConversationActivity extends XmppActivity final MenuItem menuBlock = menu.findItem(R.id.action_block); final MenuItem menuUnblock = menu.findItem(R.id.action_unblock); - if (isConversationsOverviewVisable() - && isConversationsOverviewHideable()) { + if (isConversationsOverviewVisable() && isConversationsOverviewHideable()) { menuArchive.setVisible(false); menuMucDetails.setVisible(false); menuContactDetails.setVisible(false); @@ -309,9 +302,9 @@ public class ConversationActivity extends XmppActivity menuAttach.setVisible(false); menuBlock.setVisible(false); menuUnblock.setVisible(false); + menuInviteContact.setVisible(getSelectedConversation().getMucOptions().canInvite()); } else { menuMucDetails.setVisible(false); - menuInviteContact.setTitle(R.string.conference_with); if (this.getSelectedConversation().isBlocked()) { menuBlock.setVisible(false); } else { diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index d78e135a..c8e84d75 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -417,4 +417,7 @@ Remove admin privileges Remove from room Could not change affiliation + Ban user from conference + You are trying to remove %s from a public conference. The only way to do that is to ban that user for ever. + Ban now -- cgit v1.2.3 From c9dc82d134f57869e220ae67332b8b01fae8fee3 Mon Sep 17 00:00:00 2001 From: Nathan Follens Date: Wed, 7 Jan 2015 18:49:13 +0100 Subject: Update Dutch translations --- src/main/res/values-nl/strings.xml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index cb47ae97..91484794 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -367,5 +367,30 @@ Bijwerken… Wachtwoord gewijzigd! Kon wachtwoord niet wijzigen + Verstuur een bericht om een versleuteld gesprek te starten + Stel een vraag + Als jij en je contact een gemeenschappelijk geheim hebben dat niemand anders weet (zoals een privé-grap of gewoonweg wat jullie gegeten hebben de laatste keer dat jullie elkaar zagen) kunnen jullie dat geheim gebruiken om elkaars vingerafdrukken te bevestigen.\n\nJe geeft een hint of een vraag voor je contact, en hij/zij moet hier op antwoorden met een hoofdlettergevoelig antwoord. + Je contact wil je vingerafdruk bevestigen door je uit te dagen met een gedeeld geheim. Je contact heeft daarvoor volgende hint of vraag opgegeven. + Je hint zou niet leeg mogen zijn + Je gedeeld geheim can niet leeg zijn + Vergelijk voorzichtig de vingerafdruk hieronder met de vingerafdruk van je contact.\nJe kan hiervoor eender welke betrouwbare vorm van communicatie gebruiken, zoals een versleutelde e-mail of een telefoongesprek. + Wachtwoord wijzigen + Huidig wachtwoord + Nieuw wachtwoord + Wachtwoord zou niet leeg mogen zijn + Alle accounts aanzetten + Alle accounts uitzetten + Actie uitvoeren met + Geen aansluiting + Geen rol + Verstoteling + Lid + Geavanceerde modus + Lidmaatschap verlenen + Lidmaatschap verwijderen + Administratorprivileges verlenen + Administratorprivileges verwijderen + Verwijderen uit kamer + Kon aansluiting niet wijzigen -- cgit v1.2.3 From 45c1e88a083307e32ca4ba105e47386bb8b98c2f Mon Sep 17 00:00:00 2001 From: "Christian S." Date: Wed, 7 Jan 2015 19:06:18 +0100 Subject: Updated German translations for more muc options --- src/main/res/values-de/strings.xml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index c482f268..e23320a6 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -5,7 +5,7 @@ Konten verwalten Unterhaltung beenden Kontaktdetails - Konferenzdetails + Konferenz-Details Verschlüsselte Unterhaltung Konto hinzufügen Name bearbeiten @@ -17,7 +17,7 @@ Domain entsperren Konten verwalten Einstellungen - Konferenzdetails + Konferenz-Details Kontaktdetails Conversations Mit Unterhaltung teilen @@ -112,7 +112,7 @@ Klingelton Spiele Klingelton, wenn eine neue Nachricht ankommt Konferenz-Benachrichtigungen - Benachrichtige mich bei jeder Konferenznachricht und nicht nur, wenn ich angesprochen werde + Benachrichtige mich bei jeder Konferenz-Nachricht und nicht nur, wenn ich angesprochen werde Gnadenfrist Deaktiviere Benachrichtigungen für eine kurze Zeit nach Erhalt einer Nachricht, die von einem anderen deiner Clients kommt. Erweiterte Optionen @@ -215,7 +215,7 @@ Konferenzen Suche Kontakt erstellen - Konferenz beitreten + Konferenz betreten Kontakt löschen Kontaktdetails anzeigen Kontakt sperren @@ -223,13 +223,13 @@ Erstellen Der Kontakt existiert bereits Beitreten - Konferenzadresse + Konferenz-Adresse raum@conference.example.com Als Lesezeichen speichern Lesezeichen löschen Das Lesezeichen existiert bereits Du - Konferenzthema anpassen + Konferenz-Thema anpassen Konferenz nicht gefunden Verlassen Der Kontakt hat dich zur Kontaktliste hinzugefügt @@ -292,9 +292,9 @@ Konferenz-Name Konferenz-Thema statt Raum-JID als Namen verwenden OTR-Fingerabdruck in die Zwischenablage kopiert! - Du wurdest aus dem Konferenzraum verbannt - Der Konferenzraum ist nur für Mitglieder - Du wurdest aus dem Konferenzraum geworfen + Du wurdest von der Konferenz ausgeschlossen + Die Konferenz ist nur für Mitglieder + Du wurdest aus der Konferenz geworfen Verwende Konto %s Prüfe Bild auf HTTP-Host Bild wurde gelöscht @@ -391,4 +391,7 @@ Administratorrechte entziehen Aus Konferenz entfernen Zugehörigkeit kann nicht geändert werden + Kontakt von Konferenz ausschließen. + Du versuchst %s aus der öffentlichen Konferenz zu entfernen. Die einzige Möglichkeit, dies dauerhaft zu tun, ist den Kontakt von der Konferenz auszuschließen. + Kontakt ausschließen -- cgit v1.2.3 From e1ea20b3928fd7a9558d2f625b671134a8506b5d Mon Sep 17 00:00:00 2001 From: Sam Whited Date: Wed, 7 Jan 2015 13:41:33 -0500 Subject: =?UTF-8?q?s/.../=E2=80=A6/=20in=20CS=20strings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ci skip] --- src/main/res/values-cs/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml index ba8ae998..002ed8e5 100644 --- a/src/main/res/values-cs/strings.xml +++ b/src/main/res/values-cs/strings.xml @@ -364,7 +364,7 @@ Zkopírovat otisk OTR do schránky Načíst historii ze serveru Na serveru není žádná další historie - Aktualizuji... + Aktualizuji… Heslo změněno! Nelze změnit heslo Zaslat zprávu pro spuštění šifrovaného chatu @@ -386,4 +386,4 @@ Vyloučený Člen Pokročilý mód - \ No newline at end of file + -- cgit v1.2.3 From 061de5205e198eac51cf54af5fd9b2e4faebe4d2 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 8 Jan 2015 00:23:26 +0100 Subject: some clean ups for affiliation change context menu --- .../eu/siacs/conversations/ui/ConferenceDetailsActivity.java | 10 ++++++++-- src/main/res/menu/muc_details_context.xml | 4 ++++ src/main/res/values/strings.xml | 8 ++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index 5272c922..2185c3af 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -245,6 +245,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers MenuItem giveAdminPrivileges = menu.findItem(R.id.give_admin_privileges); MenuItem removeAdminPrivileges = menu.findItem(R.id.remove_admin_privileges); MenuItem removeFromRoom = menu.findItem(R.id.remove_from_room); + MenuItem banFromConference = menu.findItem(R.id.ban_from_conference); startConversation.setVisible(true); if (self.getAffiliation().ranks(MucOptions.Affiliation.ADMIN) && self.getAffiliation().outranks(user.getAffiliation())) { @@ -254,13 +255,15 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } else { removeMembership.setVisible(true); } + banFromConference.setVisible(true); + } else { + removeFromRoom.setVisible(true); } if (user.getAffiliation() != MucOptions.Affiliation.ADMIN) { giveAdminPrivileges.setVisible(true); } else { removeAdminPrivileges.setVisible(true); } - removeFromRoom.setVisible(true); } } @@ -289,6 +292,9 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers case R.id.remove_from_room: removeFromRoom(mSelectedUser); return true; + case R.id.ban_from_conference: + xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.OUTCAST,this); + return true; default: return super.onContextItemSelected(item); } @@ -299,7 +305,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers xmppConnectionService.changeAffiliationInConference(mConversation,user.getJid(), MucOptions.Affiliation.NONE,this); } else { AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.ban_user_from_conference); + builder.setTitle(R.string.ban_from_conference); builder.setMessage(getString(R.string.removing_from_public_conference,user.getName())); builder.setNegativeButton(R.string.cancel,null); builder.setPositiveButton(R.string.ban_now,new DialogInterface.OnClickListener() { diff --git a/src/main/res/menu/muc_details_context.xml b/src/main/res/menu/muc_details_context.xml index ad9f174a..dc0f5d3e 100644 --- a/src/main/res/menu/muc_details_context.xml +++ b/src/main/res/menu/muc_details_context.xml @@ -21,6 +21,10 @@ android:id="@+id/remove_membership" android:title="@string/remove_membership" android:visible="false"/> + Member Advanced mode Grant membership - Remove membership + Revoke membership Grant admin privileges - Remove admin privileges - Remove from room + Revoke admin privileges + Remove from conference Could not change affiliation - Ban user from conference + Ban from conference You are trying to remove %s from a public conference. The only way to do that is to ban that user for ever. Ban now -- cgit v1.2.3 From f8dc59be818b3a16e975bda189ad3af2f52311e6 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 8 Jan 2015 00:41:37 +0100 Subject: fixed german translation --- src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index e23320a6..c9876d01 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -391,7 +391,7 @@ Administratorrechte entziehen Aus Konferenz entfernen Zugehörigkeit kann nicht geändert werden - Kontakt von Konferenz ausschließen. - Du versuchst %s aus der öffentlichen Konferenz zu entfernen. Die einzige Möglichkeit, dies dauerhaft zu tun, ist den Kontakt von der Konferenz auszuschließen. + Von Konferenz ausschließen. + Du versuchst %s aus einer öffentlichen Konferenz zu entfernen. Die einzige Möglichkeit, dies dauerhaft zu tun, ist den Kontakt aus dieser Konferenz zu verbannen. Kontakt ausschließen -- cgit v1.2.3 From f8aa1bfec4df8cc7e34eae537f68ab45ed62756c Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 8 Jan 2015 01:23:53 +0100 Subject: kick after ban --- .../siacs/conversations/generator/IqGenerator.java | 10 ++++++++++ .../services/XmppConnectionService.java | 21 +++++++++++++++++++++ .../conversations/ui/ConferenceDetailsActivity.java | 15 ++++++++++++++- src/main/res/values/strings.xml | 1 + 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java index 988b9744..6dcccaab 100644 --- a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java @@ -159,4 +159,14 @@ public class IqGenerator extends AbstractGenerator { item.setAttribute("affiliation", affiliation); return packet; } + + public IqPacket changeRole(Conversation conference, String nick, String role) { + IqPacket packet = new IqPacket(IqPacket.TYPE.SET); + packet.setTo(conference.getJid().toBareJid()); + packet.setFrom(conference.getAccount().getJid()); + Element item = packet.query("http://jabber.org/protocol/muc#admin").addChild("item"); + item.setAttribute("nick", nick); + item.setAttribute("role", role); + return packet; + } } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 5c16ef3f..495b9c26 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1562,6 +1562,27 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa public void onAffiliationChangeFailed(Jid jid, int resId); } + public void changeRoleInConference(final Conversation conference, final String nick, MucOptions.Role role, final OnRoleChanged callback) { + IqPacket request = this.mIqGenerator.changeRole(conference, nick, role.toString()); + Log.d(Config.LOGTAG,request.toString()); + sendIqPacket(conference.getAccount(), request, new OnIqPacketReceived() { + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + Log.d(Config.LOGTAG, packet.toString()); + if (packet.getType() == IqPacket.TYPE.RESULT) { + callback.onRoleChangedSuccessful(nick); + } else { + callback.onRoleChangeFailed(nick, R.string.could_not_change_role); + } + } + }); + } + + public interface OnRoleChanged{ + public void onRoleChangedSuccessful(String nick); + public void onRoleChangeFailed(String nick, int resid); + } + public void disconnect(Account account, boolean force) { if ((account.getStatus() == Account.State.ONLINE) || (account.getStatus() == Account.State.DISABLED)) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index 2185c3af..daaa59cf 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -41,7 +41,7 @@ import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdat import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.stanzas.MessagePacket; -public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged { +public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged { public static final String ACTION_VIEW_MUC = "view_muc"; private Conversation mConversation; private OnClickListener inviteListener = new OnClickListener() { @@ -294,6 +294,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers return true; case R.id.ban_from_conference: xmppConnectionService.changeAffiliationInConference(mConversation,mSelectedUser.getJid(), MucOptions.Affiliation.OUTCAST,this); + xmppConnectionService.changeRoleInConference(mConversation,mSelectedUser.getName(), MucOptions.Role.NONE,this); return true; default: return super.onContextItemSelected(item); @@ -303,6 +304,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers private void removeFromRoom(final User user) { if (mConversation.getMucOptions().membersOnly()) { xmppConnectionService.changeAffiliationInConference(mConversation,user.getJid(), MucOptions.Affiliation.NONE,this); + xmppConnectionService.changeRoleInConference(mConversation,mSelectedUser.getName(), MucOptions.Role.NONE,ConferenceDetailsActivity.this); } else { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.ban_from_conference); @@ -312,6 +314,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers @Override public void onClick(DialogInterface dialog, int which) { xmppConnectionService.changeAffiliationInConference(mConversation,user.getJid(), MucOptions.Affiliation.OUTCAST,ConferenceDetailsActivity.this); + xmppConnectionService.changeRoleInConference(mConversation,mSelectedUser.getName(), MucOptions.Role.NONE,ConferenceDetailsActivity.this); } }); builder.create().show(); @@ -480,4 +483,14 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers public void onAffiliationChangeFailed(Jid jid, int resId) { } + + @Override + public void onRoleChangedSuccessful(String nick) { + + } + + @Override + public void onRoleChangeFailed(String nick, int resid) { + + } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 651fa234..bbac0c7c 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -420,4 +420,5 @@ Ban from conference You are trying to remove %s from a public conference. The only way to do that is to ban that user for ever. Ban now + Could not change role -- cgit v1.2.3 From 0fe193b027b2879d68fe7bb9b27c0a8cd35aa205 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 8 Jan 2015 14:45:44 +0100 Subject: code cleanup --- .../services/XmppConnectionService.java | 27 ++++++++++++---------- .../ui/ConferenceDetailsActivity.java | 2 -- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 495b9c26..ad951f3e 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -388,17 +388,20 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa public int onStartCommand(Intent intent, int flags, int startId) { final String action = intent == null ? null : intent.getAction(); if (action != null) { - if (action.equals(ACTION_MERGE_PHONE_CONTACTS)) { - PhoneHelper.loadPhoneContacts(getApplicationContext(), new CopyOnWriteArrayList(), this); - return START_STICKY; - } else if (action.equals(Intent.ACTION_SHUTDOWN)) { - logoutAndSave(); - return START_NOT_STICKY; - } else if (action.equals(ACTION_CLEAR_NOTIFICATION)) { - mNotificationService.clear(); - } else if (action.equals(ACTION_DISABLE_FOREGROUND)) { - getPreferences().edit().putBoolean("keep_foreground_service",false).commit(); - toggleForegroundService(); + switch (action) { + case ACTION_MERGE_PHONE_CONTACTS: + PhoneHelper.loadPhoneContacts(getApplicationContext(), new CopyOnWriteArrayList(), this); + return START_STICKY; + case Intent.ACTION_SHUTDOWN: + logoutAndSave(); + return START_NOT_STICKY; + case ACTION_CLEAR_NOTIFICATION: + mNotificationService.clear(); + break; + case ACTION_DISABLE_FOREGROUND: + getPreferences().edit().putBoolean("keep_foreground_service",false).commit(); + toggleForegroundService(); + break; } } this.wakeLock.acquire(); @@ -1484,7 +1487,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa @Override public void onIqPacketReceived(Account account, IqPacket packet) { if (packet.getType() != IqPacket.TYPE.ERROR) { - ArrayList features = new ArrayList(); + ArrayList features = new ArrayList<>(); for (Element child : packet.query().getChildren()) { if (child != null && child.getName().equals("feature")) { String var = child.getAttribute("var"); diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index daaa59cf..a6df1085 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -233,8 +233,6 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers final Contact contact = user.getContact(); if (contact != null) { name = contact.getDisplayName(); - } else if (user.getJid() != null) { - name = user.getJid().toBareJid().toString(); } else { name = user.getName(); } -- cgit v1.2.3 From a9159568b9aca24563a3b8c732b257d246e33a1a Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 8 Jan 2015 21:29:26 +0100 Subject: allow for very basic muc configuration --- .../siacs/conversations/entities/MucOptions.java | 6 +- .../services/XmppConnectionService.java | 3 +- .../ui/ConferenceDetailsActivity.java | 80 ++++++- src/main/res/layout/activity_muc_details.xml | 257 ++++++++++++--------- src/main/res/values-de/strings.xml | 10 +- src/main/res/values/strings.xml | 11 +- 6 files changed, 239 insertions(+), 128 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/MucOptions.java b/src/main/java/eu/siacs/conversations/entities/MucOptions.java index 96860a16..d4b997fc 100644 --- a/src/main/java/eu/siacs/conversations/entities/MucOptions.java +++ b/src/main/java/eu/siacs/conversations/entities/MucOptions.java @@ -13,7 +13,6 @@ import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.stanzas.PresencePacket; import android.annotation.SuppressLint; -import android.util.Log; @SuppressLint("DefaultLocale") public class MucOptions { @@ -224,6 +223,10 @@ public class MucOptions { return hasFeature("muc_membersonly"); } + public boolean nonanonymous() { + return hasFeature("muc_nonanonymous"); + } + public void deleteUser(String name) { for (int i = 0; i < users.size(); ++i) { if (users.get(i).getName().equals(name)) { @@ -244,7 +247,6 @@ public class MucOptions { } public void processPacket(PresencePacket packet, PgpEngine pgp) { - Log.d(Config.LOGTAG, packet.toString()); final Jid from = packet.getFrom(); if (!from.isBareJid()) { final String name = from.getResourcepart(); diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index ad951f3e..e13a3e65 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1497,6 +1497,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } } conversation.getMucOptions().updateFeatures(features); + updateConversationUi(); } } }); @@ -2229,7 +2230,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa public void onMucRosterUpdate(); } - private interface OnConferenceOptionsPushed { + public interface OnConferenceOptionsPushed { public void onPushSucceeded(); public void onPushFailed(); } diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index a6df1085..ce367240 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -41,7 +41,7 @@ import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdat import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.stanzas.MessagePacket; -public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged { +public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged, XmppConnectionService.OnConferenceOptionsPushed { public static final String ACTION_VIEW_MUC = "view_muc"; private Conversation mConversation; private OnClickListener inviteListener = new OnClickListener() { @@ -59,6 +59,8 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers private TextView mAccountJid; private LinearLayout membersView; private LinearLayout mMoreDetails; + private TextView mConferenceType; + private ImageButton mChangeConferenceSettingsButton; private Button mInviteButton; private String uuid = null; private List users = new ArrayList<>(); @@ -94,6 +96,36 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } }; + private OnClickListener mChangeConferenceSettings = new OnClickListener() { + @Override + public void onClick(View v) { + final MucOptions mucOptions = mConversation.getMucOptions(); + AlertDialog.Builder builder = new AlertDialog.Builder(ConferenceDetailsActivity.this); + builder.setTitle(R.string.conference_options); + String[] options = {getString(R.string.members_only), + getString(R.string.non_anonymous)}; + final boolean[] values = new boolean[options.length]; + values[0] = mucOptions.membersOnly(); + values[1] = mucOptions.nonanonymous(); + builder.setMultiChoiceItems(options,values,new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialog, int which, boolean isChecked) { + values[which] = isChecked; + } + }); + builder.setNegativeButton(R.string.cancel, null); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Bundle options = new Bundle(); + options.putString("muc#roomconfig_membersonly", values[0] ? "1" : "0"); + options.putString("muc#roomconfig_whois", values[1] ? "anyone" : "moderators"); + xmppConnectionService.pushConferenceConfiguration(mConversation,options,ConferenceDetailsActivity.this); + } + }); + builder.create().show(); + } + }; @Override public void onConversationUpdate() { @@ -129,8 +161,12 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers mAccountJid = (TextView) findViewById(R.id.details_account); mMoreDetails = (LinearLayout) findViewById(R.id.muc_more_details); mMoreDetails.setVisibility(View.GONE); + mChangeConferenceSettingsButton = (ImageButton) findViewById(R.id.change_conference_button); + mChangeConferenceSettingsButton.setOnClickListener(this.mChangeConferenceSettings); + mConferenceType = (TextView) findViewById(R.id.muc_conference_type); mInviteButton = (Button) findViewById(R.id.invite); mInviteButton.setOnClickListener(inviteListener); + mConferenceType = (TextView) findViewById(R.id.muc_conference_type); if (getActionBar() != null) { getActionBar().setHomeButtonEnabled(true); getActionBar().setDisplayHomeAsUpEnabled(true); @@ -361,16 +397,17 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } private void updateView() { + final MucOptions mucOptions = mConversation.getMucOptions(); + final User self = mucOptions.getSelf(); mAccountJid.setText(getString(R.string.using_account, mConversation .getAccount().getJid().toBareJid())); mYourPhoto.setImageBitmap(avatarService().get(mConversation.getAccount(), getPixel(48))); setTitle(mConversation.getName()); mFullJid.setText(mConversation.getJid().toBareJid().toString()); - mYourNick.setText(mConversation.getMucOptions().getActualNick()); + mYourNick.setText(mucOptions.getActualNick()); mRoleAffiliaton = (TextView) findViewById(R.id.muc_role); - if (mConversation.getMucOptions().online()) { + if (mucOptions.online()) { mMoreDetails.setVisibility(View.VISIBLE); - User self = mConversation.getMucOptions().getSelf(); final String status = getStatus(self); if (status != null) { mRoleAffiliaton.setVisibility(View.VISIBLE); @@ -378,9 +415,19 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } else { mRoleAffiliaton.setVisibility(View.GONE); } + if (mucOptions.membersOnly()) { + mConferenceType.setText(R.string.private_conference); + } else { + mConferenceType.setText(R.string.public_conference); + } + if (self.getAffiliation().ranks(MucOptions.Affiliation.OWNER)) { + mChangeConferenceSettingsButton.setVisibility(View.VISIBLE); + } else { + mChangeConferenceSettingsButton.setVisibility(View.GONE); + } } this.users.clear(); - this.users.addAll(mConversation.getMucOptions().getUsers()); + this.users.addAll(mucOptions.getUsers()); LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); membersView.removeAllViews(); for (final User user : mConversation.getMucOptions().getUsers()) { @@ -479,7 +526,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers @Override public void onAffiliationChangeFailed(Jid jid, int resId) { - + displayToast(getString(resId,jid.toBareJid().toString())); } @Override @@ -488,7 +535,26 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers } @Override - public void onRoleChangeFailed(String nick, int resid) { + public void onRoleChangeFailed(String nick, int resId) { + displayToast(getString(resId,nick)); + } + + @Override + public void onPushSucceeded() { + displayToast(getString(R.string.modified_conference_options)); + } + + @Override + public void onPushFailed() { + displayToast(getString(R.string.could_not_modify_conference_options)); + } + private void displayToast(final String msg) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(ConferenceDetailsActivity.this,msg,Toast.LENGTH_SHORT).show(); + } + }); } } diff --git a/src/main/res/layout/activity_muc_details.xml b/src/main/res/layout/activity_muc_details.xml index f689f10d..8299e832 100644 --- a/src/main/res/layout/activity_muc_details.xml +++ b/src/main/res/layout/activity_muc_details.xml @@ -1,119 +1,146 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -