From 592aded106dfd18e8a239b3b59a26d0a50d64465 Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Thu, 12 Jun 2014 23:04:28 +0200 Subject: [PATCH] finished offline otr --- res/values/strings.xml | 4 +- .../siacs/conversations/entities/Message.java | 7 ++- .../services/XmppConnectionService.java | 47 +++++++++++++------ .../ui/ConversationActivity.java | 4 +- .../ui/ConversationFragment.java | 8 +++- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 52e141991..f73258052 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -97,9 +97,6 @@ Error loading image (File not found) Image file offered for download Not Connected - You have to be online to send %s but your account assoziated with this Conversation is currently offline. - You can not perform this action while being offline - files OTR encrypted messages Manage account Your Contact is Offline @@ -112,6 +109,7 @@ Restart Install offering… + waiting… No OpenPGP Key found Conversations is unable to encrypt your messages because your contact is not announcing his or hers public key.\n\nPlease ask your contact to setup OpenPGP. No OpenPGP Keys found diff --git a/src/eu/siacs/conversations/entities/Message.java b/src/eu/siacs/conversations/entities/Message.java index c298a6522..1e82fe6aa 100644 --- a/src/eu/siacs/conversations/entities/Message.java +++ b/src/eu/siacs/conversations/entities/Message.java @@ -19,6 +19,7 @@ public class Message extends AbstractEntity { public static final int STATUS_SEND = 2; public static final int STATUS_SEND_FAILED = 3; public static final int STATUS_SEND_REJECTED = 4; + public static final int STATUS_WAITING = 5; public static final int STATUS_OFFERED = 6; public static final int STATUS_SEND_RECEIVED = 7; public static final int STATUS_SEND_DISPLAYED = 8; @@ -200,7 +201,11 @@ public class Message extends AbstractEntity { } public void setPresence(String presence) { - this.counterpart = this.counterpart.split("/")[0] + "/" + presence; + if (presence == null) { + this.counterpart = this.counterpart.split("/")[0]; + } else { + this.counterpart = this.counterpart.split("/")[0] + "/" + presence; + } } public String getPresence() { diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java index 44964c7c2..154b317e5 100644 --- a/src/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/eu/siacs/conversations/services/XmppConnectionService.java @@ -102,7 +102,7 @@ public class XmppConnectionService extends Service { Conversation conversation = findActiveConversation(contact); if (conversation != null) { conversation.endOtrIfNeeded(); - if (online&&(contact.getPresences().size() == 1)) { + if (online && (contact.getPresences().size() == 1)) { sendUnsendMessages(conversation); } } @@ -653,17 +653,19 @@ public class XmppConnectionService extends Service { mJingleConnectionManager.createNewConnection(message); } else { if (message.getEncryption() == Message.ENCRYPTION_OTR) { - if (!conv.hasValidOtrSession()) { + if (!conv.hasValidOtrSession()&&(message.getPresence() != null)) { // starting otr session. messages will be send later - conv.startOtrSession(getApplicationContext(), message.getPresence(), - true); - } else if (conv.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) { + conv.startOtrSession(getApplicationContext(), + message.getPresence(), true); + } else if (conv.hasValidOtrSession() && conv.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) { // otr session aleary exists, creating message packet // accordingly packet = prepareMessagePacket(account, message, conv.getOtrSession()); send = true; message.setStatus(Message.STATUS_SEND); + } else if (message.getPresence() == null) { + message.setStatus(Message.STATUS_WAITING); } saveInDb = true; addToConversation = true; @@ -700,10 +702,15 @@ public class XmppConnectionService extends Service { message.setBody(decryptedBody); addToConversation = true; } else if (message.getEncryption() == Message.ENCRYPTION_OTR) { - if (!conv.hasValidOtrSession()) { - conv.startOtrSession(getApplicationContext(), message.getPresence(),false); + if (conv.hasValidOtrSession()) { + message.setPresence(conv.getOtrSession().getSessionID() + .getUserID()); + } else if (!conv.hasValidOtrSession() && message.getPresence() != null) { + conv.startOtrSession(getApplicationContext(), + message.getPresence(), false); + } else if (message.getPresence() == null) { + message.setStatus(Message.STATUS_WAITING); } - message.setPresence(conv.getOtrSession().getSessionID().getUserID()); saveInDb = true; addToConversation = true; } else { @@ -729,7 +736,9 @@ public class XmppConnectionService extends Service { private void sendUnsendMessages(Conversation conversation) { for (int i = 0; i < conversation.getMessages().size(); ++i) { - if (conversation.getMessages().get(i).getStatus() == Message.STATUS_UNSEND) { + int status = conversation.getMessages().get(i).getStatus(); + if ((status == Message.STATUS_UNSEND) + || (status == Message.STATUS_WAITING)) { resendMessage(conversation.getMessages().get(i)); } } @@ -756,14 +765,19 @@ public class XmppConnectionService extends Service { packet.addChild("x", "jabber:x:encrypted").setContent( message.getBody()); } else if (message.getEncryption() == Message.ENCRYPTION_OTR) { - Presences presences = message.getConversation().getContact().getPresences(); + Presences presences = message.getConversation().getContact() + .getPresences(); if (!message.getConversation().hasValidOtrSession()) { - if ((message.getPresence() != null)&&(presences.has(message.getPresence()))) { - message.getConversation().startOtrSession(getApplicationContext(), message.getPresence(), true); + if ((message.getPresence() != null) + && (presences.has(message.getPresence()))) { + message.getConversation().startOtrSession( + getApplicationContext(), message.getPresence(), + true); } else { if (presences.size() == 1) { String presence = presences.asStringArray()[0]; - message.getConversation().startOtrSession(getApplicationContext(), presence, true); + message.getConversation().startOtrSession( + getApplicationContext(), presence, true); } } } @@ -774,6 +788,7 @@ public class XmppConnectionService extends Service { } } else if (message.getType() == Message.TYPE_IMAGE) { // TODO: send images + } } @@ -1194,10 +1209,12 @@ public class XmppConnectionService extends Service { Account account = conversation.getAccount(); List messages = conversation.getMessages(); Session otrSession = conversation.getOtrSession(); - Log.d(LOGTAG,account.getJid()+" otr session established with "+conversation.getContactJid()+"/"+otrSession.getSessionID().getUserID()); + Log.d(LOGTAG, account.getJid() + " otr session established with " + + conversation.getContactJid() + "/" + + otrSession.getSessionID().getUserID()); for (int i = 0; i < messages.size(); ++i) { Message msg = messages.get(i); - if ((msg.getStatus() == Message.STATUS_UNSEND) + if ((msg.getStatus() == Message.STATUS_UNSEND || msg.getStatus() == Message.STATUS_WAITING) && (msg.getEncryption() == Message.ENCRYPTION_OTR)) { MessagePacket outPacket = prepareMessagePacket(account, msg, otrSession); diff --git a/src/eu/siacs/conversations/ui/ConversationActivity.java b/src/eu/siacs/conversations/ui/ConversationActivity.java index 995568903..06efff4b9 100644 --- a/src/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/eu/siacs/conversations/ui/ConversationActivity.java @@ -389,7 +389,7 @@ public class ConversationActivity extends XmppActivity { // TODO Auto-generated method stub } - }, "file"); + }); } private void attachFile(final int attachmentChoice) { @@ -868,7 +868,7 @@ public class ConversationActivity extends XmppActivity { } public void selectPresence(final Conversation conversation, - final OnPresenceSelected listener, String reason) { + final OnPresenceSelected listener) { Contact contact = conversation.getContact(); if (contact == null) { showAddToRosterDialog(conversation); diff --git a/src/eu/siacs/conversations/ui/ConversationFragment.java b/src/eu/siacs/conversations/ui/ConversationFragment.java index 5d7e9f94d..1939ae727 100644 --- a/src/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/eu/siacs/conversations/ui/ConversationFragment.java @@ -207,6 +207,9 @@ public class ConversationFragment extends Fragment { } } switch (message.getStatus()) { + case Message.STATUS_WAITING: + info = getString(R.string.waiting); + break; case Message.STATUS_UNSEND: info = getString(R.string.sending); break; @@ -883,7 +886,7 @@ public class ConversationFragment extends Fragment { } protected void sendOtrMessage(final Message message) { - ConversationActivity activity = (ConversationActivity) getActivity(); + final ConversationActivity activity = (ConversationActivity) getActivity(); final XmppConnectionService xmppService = activity.xmppConnectionService; if (conversation.hasValidOtrSession()) { activity.xmppConnectionService.sendMessage(message); @@ -896,6 +899,7 @@ public class ConversationFragment extends Fragment { public void onPresenceSelected(boolean success, String presence) { if (success) { + Log.d("xmppService","selected presence "+presence); message.setPresence(presence); xmppService.sendMessage(message); messageSent(); @@ -908,7 +912,7 @@ public class ConversationFragment extends Fragment { xmppService.sendMessage(message); messageSent(); } - }, "otr"); + }); } }