diff --git a/res/values/strings.xml b/res/values/strings.xml
index 52e1419917a5079de453bd0f46fe144dc72bef3c..f732580523ac4e15f258a1248ad7f4d9305204d9 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 c298a6522ab40e6cd73684d8cc1f34583294dbf2..1e82fe6aad825511c8cad90772309bbad07a3926 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 44964c7c28a4f7e1dc08481e4b46b57a499f1d73..154b317e5416a026b2e544837c84595e687aa435 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 99556890368a90f18c7af7d45fcbfdf8415ec8fc..06efff4b93f9e53caa133d59dabff0a0f07600bd 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 5d7e9f94d7a516c18eedc9b8c934988fa8f4c498..1939ae727d4797ddcbf82cb68419386bc2414d27 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");
+ });
}
}