answer to xep 184 message receipts. fixes #95
This commit is contained in:
parent
99793fa909
commit
cedc1f40b3
|
@ -1,12 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<array name="resources">
|
||||
<string-array name="resources">
|
||||
<item>Mobile</item>
|
||||
<item>Phone</item>
|
||||
<item>Tablet</item>
|
||||
<item>Conversations</item>
|
||||
<item>Android</item>
|
||||
</array>
|
||||
</string-array>
|
||||
<string-array name="filesizes">
|
||||
<item>never</item>
|
||||
<item>256 KB</item>
|
||||
|
@ -19,4 +19,16 @@
|
|||
<item>524288</item>
|
||||
<item>1048576</item>
|
||||
</string-array>
|
||||
<string-array name="message_acks">
|
||||
<item>never</item>
|
||||
<item>when received</item>
|
||||
<item>when read</item>
|
||||
<item>when received and when read</item>
|
||||
</string-array>
|
||||
<string-array name="message_acks_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
|
|
@ -145,6 +145,8 @@
|
|||
<string name="pref_advanced_options">Advanced Options</string>
|
||||
<string name="pref_never_send_crash">Never send crash reports</string>
|
||||
<string name="pref_never_send_crash_summary">By sending in stack traces you are helping the ongoing development of Conversations</string>
|
||||
<string name="pref_auto_acknowledge_messages">Acknowledge Messages</string>
|
||||
<string name="pref_auto_acknowledge_messages_summary">Allows your contact to know whether or not you have received or read a specific message</string>
|
||||
<string name="openpgp_error">OpenKeychain reporeted an error</string>
|
||||
<string name="error_decrypting_file">I/O Error decrypting file</string>
|
||||
<string name="error_copying_image_file">Error copying image file.</string>
|
||||
|
|
|
@ -22,6 +22,14 @@
|
|||
android:entries="@array/filesizes"
|
||||
android:entryValues="@array/filesizes_values"
|
||||
android:defaultValue="524288"/>
|
||||
<ListPreference
|
||||
android:key="auto_acknowledge_messages"
|
||||
android:title="@string/pref_auto_acknowledge_messages"
|
||||
android:summary="@string/pref_auto_acknowledge_messages_summary"
|
||||
android:entries="@array/message_acks"
|
||||
android:entryValues="@array/message_acks_values"
|
||||
android:defaultValue="2"
|
||||
/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory
|
||||
android:title="@string/pref_notification_settings">
|
||||
|
|
|
@ -101,7 +101,7 @@ public class XmppConnectionService extends Service {
|
|||
@Override
|
||||
public void onContactStatusChanged(Contact contact) {
|
||||
Conversation conversation = findActiveConversation(contact);
|
||||
if (conversation!=null) {
|
||||
if (conversation != null) {
|
||||
conversation.endOtrIfNeeded();
|
||||
}
|
||||
}
|
||||
|
@ -140,6 +140,7 @@ public class XmppConnectionService extends Service {
|
|||
notify = (SystemClock.elapsedRealtime() - lastCarbonMessageReceived) > CARBON_GRACE_PERIOD;
|
||||
}
|
||||
|
||||
|
||||
if ((packet.getType() == MessagePacket.TYPE_CHAT)) {
|
||||
String pgpBody = mMessageParser.getPgpBody(packet);
|
||||
if (pgpBody != null) {
|
||||
|
@ -217,6 +218,25 @@ public class XmppConnectionService extends Service {
|
|||
Log.d(LOGTAG, "error trying to parse date" + e.getMessage());
|
||||
}
|
||||
}
|
||||
if ((confirmReception()) && ((packet.getId() != null))) {
|
||||
MessagePacket receivedPacket = new MessagePacket();
|
||||
receivedPacket.setType(MessagePacket.TYPE_UNKNOWN);
|
||||
receivedPacket.setTo(message.getCounterpart());
|
||||
receivedPacket.setFrom(account.getFullJid());
|
||||
if (packet.hasChild("markable", "urn:xmpp:chat-markers:0")) {
|
||||
Element received = receivedPacket.addChild("received",
|
||||
"urn:xmpp:chat-markers:0");
|
||||
received.setAttribute("id", packet.getId());
|
||||
account.getXmppConnection().sendMessagePacket(
|
||||
receivedPacket);
|
||||
} else if (packet.hasChild("request", "urn:xmpp:receipts")) {
|
||||
Element received = receivedPacket.addChild("received",
|
||||
"urn:xmpp:receipts");
|
||||
received.setAttribute("id", packet.getId());
|
||||
account.getXmppConnection().sendMessagePacket(
|
||||
receivedPacket);
|
||||
}
|
||||
}
|
||||
Conversation conversation = message.getConversation();
|
||||
conversation.getMessages().add(message);
|
||||
if (packet.getType() != MessagePacket.TYPE_ERROR) {
|
||||
|
@ -279,7 +299,7 @@ public class XmppConnectionService extends Service {
|
|||
Conversation muc = findMuc(
|
||||
packet.getAttribute("from").split("/")[0], account);
|
||||
if (muc != null) {
|
||||
muc.getMucOptions().processPacket(packet,getPgpEngine());
|
||||
muc.getMucOptions().processPacket(packet, getPgpEngine());
|
||||
} else {
|
||||
Log.d(LOGTAG, account.getJid()
|
||||
+ ": could not find muc for received muc package "
|
||||
|
@ -293,7 +313,7 @@ public class XmppConnectionService extends Service {
|
|||
account.getJid() + ": reading muc status packet "
|
||||
+ packet.toString());
|
||||
int error = muc.getMucOptions().getError();
|
||||
muc.getMucOptions().processPacket(packet,getPgpEngine());
|
||||
muc.getMucOptions().processPacket(packet, getPgpEngine());
|
||||
if ((muc.getMucOptions().getError() != error)
|
||||
&& (convChangedListener != null)) {
|
||||
Log.d(LOGTAG, "muc error status changed");
|
||||
|
@ -336,7 +356,8 @@ public class XmppConnectionService extends Service {
|
|||
msg, x.getContent()));
|
||||
}
|
||||
}
|
||||
onContactStatusChanged.onContactStatusChanged(contact);
|
||||
onContactStatusChanged
|
||||
.onContactStatusChanged(contact);
|
||||
}
|
||||
} else if (type.equals("unavailable")) {
|
||||
if (fromParts.length != 2) {
|
||||
|
@ -400,6 +421,9 @@ public class XmppConnectionService extends Service {
|
|||
"urn:xmpp:jingle:transports:s5b:1");
|
||||
query.addChild("feature").setAttribute("var",
|
||||
"urn:xmpp:jingle:transports:ibb:1");
|
||||
if (confirmReception()) {
|
||||
query.addChild("feature").setAttribute("var", "urn:xmpp:receipts");
|
||||
}
|
||||
account.getXmppConnection().sendIqPacket(iqResponse, null);
|
||||
} else {
|
||||
if ((packet.getType() == IqPacket.TYPE_GET)
|
||||
|
@ -868,6 +892,7 @@ public class XmppConnectionService extends Service {
|
|||
packet.setTo(message.getCounterpart());
|
||||
packet.setFrom(account.getJid());
|
||||
}
|
||||
packet.addChild("markable", "urn:xmpp:chat-markers:0");
|
||||
} else if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
|
||||
packet.setType(MessagePacket.TYPE_GROUPCHAT);
|
||||
packet.setBody(message.getBody());
|
||||
|
@ -908,7 +933,7 @@ public class XmppConnectionService extends Service {
|
|||
new OnPhoneContactsLoadedListener() {
|
||||
@Override
|
||||
public void onPhoneContactsLoaded(List<Bundle> phoneContacts) {
|
||||
for(Account account : accounts) {
|
||||
for (Account account : accounts) {
|
||||
account.getRoster().clearSystemAccounts();
|
||||
}
|
||||
for (Bundle phoneContact : phoneContacts) {
|
||||
|
@ -1133,8 +1158,7 @@ public class XmppConnectionService extends Service {
|
|||
x.addChild("history").setAttribute("seconds", diff + "");
|
||||
}
|
||||
packet.addChild(x);
|
||||
account.getXmppConnection()
|
||||
.sendPresencePacket(packet);
|
||||
account.getXmppConnection().sendPresencePacket(packet);
|
||||
}
|
||||
|
||||
private OnRenameListener renameListener = null;
|
||||
|
@ -1228,12 +1252,12 @@ public class XmppConnectionService extends Service {
|
|||
}
|
||||
|
||||
protected void syncDirtyContacts(Account account) {
|
||||
for(Contact contact : account.getRoster().getContacts()) {
|
||||
for (Contact contact : account.getRoster().getContacts()) {
|
||||
if (contact.getOption(Contact.Options.DIRTY_PUSH)) {
|
||||
pushContactToServer(contact);
|
||||
}
|
||||
if (contact.getOption(Contact.Options.DIRTY_DELETE)) {
|
||||
Log.d(LOGTAG,"dirty delete");
|
||||
Log.d(LOGTAG, "dirty delete");
|
||||
deleteContactOnServer(contact);
|
||||
}
|
||||
}
|
||||
|
@ -1424,6 +1448,18 @@ public class XmppConnectionService extends Service {
|
|||
.getDefaultSharedPreferences(getApplicationContext());
|
||||
}
|
||||
|
||||
private boolean confirmReception() {
|
||||
String autoAcks = getPreferences().getString(
|
||||
"auto_acknowledge_messages", "2");
|
||||
int autoAcksValue;
|
||||
try {
|
||||
autoAcksValue = Integer.parseInt(autoAcks);
|
||||
} catch (NumberFormatException e) {
|
||||
autoAcksValue = 0;
|
||||
}
|
||||
return autoAcksValue == 1 || autoAcksValue == 3;
|
||||
}
|
||||
|
||||
public void updateUi(Conversation conversation, boolean notify) {
|
||||
if (convChangedListener != null) {
|
||||
convChangedListener.onConversationListChanged();
|
||||
|
|
|
@ -37,6 +37,8 @@ public class MessagePacket extends AbstractStanza {
|
|||
case TYPE_GROUPCHAT:
|
||||
this.setAttribute("type", "groupchat");
|
||||
break;
|
||||
case TYPE_UNKNOWN:
|
||||
break;
|
||||
default:
|
||||
this.setAttribute("type","chat");
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue