fix #263
Add support for XEP-0263 : Delayed Delivery and display timestamps for
message.
--- a/res/layout/chat_msg_row.xml Fri May 07 18:16:41 2010 +0200
+++ b/res/layout/chat_msg_row.xml Thu May 13 23:02:52 2010 +0200
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
@@ -8,15 +8,28 @@
<TextView android:id="@+id/chatmessagename"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentTop="true"
android:textSize="16sp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:paddingBottom="1dp"
/>
- <TextView android:id="@+id/chatmessagetext"
- android:layout_width="fill_parent"
+ <TextView android:id="@+id/chatmessagedate"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentRight="true"
android:autoLink="all"
/>
-</LinearLayout>
+ <TextView android:id="@+id/chatmessagetext"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_below="@id/chatmessagename"
+ android:autoLink="all"
+ />
+
+</RelativeLayout>
+
--- a/src/com/beem/project/beem/BeemService.java Fri May 07 18:16:41 2010 +0200
+++ b/src/com/beem/project/beem/BeemService.java Thu May 13 23:02:52 2010 +0200
@@ -50,6 +50,9 @@
import org.jivesoftware.smack.Roster.SubscriptionMode;
import org.jivesoftware.smack.provider.PrivacyProvider;
import org.jivesoftware.smack.provider.ProviderManager;
+import org.jivesoftware.smackx.provider.DelayInfoProvider;
+import org.jivesoftware.smackx.packet.ChatStateExtension;
+import org.jivesoftware.smackx.packet.ChatStateExtension.Provider;
import org.jivesoftware.smack.proxy.ProxyInfo;
import org.jivesoftware.smack.proxy.ProxyInfo.ProxyType;
import org.jivesoftware.smack.util.StringUtils;
@@ -301,9 +304,21 @@
* @param pm The ProviderManager.
*/
private void configure(ProviderManager pm) {
+ Log.d(TAG, "providers = " + pm.getExtensionProviders() );
// Privacy
pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());
+ // Delayed Delivery only the new version
+ pm.addExtensionProvider("delay", "urn:xmpp:delay", new DelayInfoProvider());
+ // Chat State
+ ChatStateExtension.Provider chatState = new ChatStateExtension.Provider();
+ pm.addExtensionProvider("active", "http://jabber.org/protocol/chatstates", chatState);
+ pm
+ .addExtensionProvider("composing", "http://jabber.org/protocol/chatstates",
+ chatState);
+ pm.addExtensionProvider("paused", "http://jabber.org/protocol/chatstates", chatState);
+ pm.addExtensionProvider("inactive", "http://jabber.org/protocol/chatstates", chatState);
+ pm.addExtensionProvider("gone", "http://jabber.org/protocol/chatstates", chatState);
/*
// Private Data Storage
pm.addIQProvider("query", "jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider());
@@ -317,14 +332,6 @@
pm.addExtensionProvider("x", "jabber:x:roster", new RosterExchangeProvider());
// Message Events
pm.addExtensionProvider("x", "jabber:x:event", new MessageEventProvider());
- // Chat State
- pm.addExtensionProvider("active", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
- pm
- .addExtensionProvider("composing", "http://jabber.org/protocol/chatstates",
- new ChatStateExtension.Provider());
- pm.addExtensionProvider("paused", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
- pm.addExtensionProvider("inactive", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
- pm.addExtensionProvider("gone", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
// XHTML
pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider());
// Group Chat Invitations
@@ -341,8 +348,6 @@
pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin", new MUCAdminProvider());
// MUC Owner
pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner", new MUCOwnerProvider());
- // Delayed Delivery
- pm.addExtensionProvider("x", "jabber:x:delay", new DelayInformationProvider());
// Version
try {
pm.addIQProvider("query", "jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version"));
--- a/src/com/beem/project/beem/service/BeemChatManager.java Fri May 07 18:16:41 2010 +0200
+++ b/src/com/beem/project/beem/service/BeemChatManager.java Thu May 13 23:02:52 2010 +0200
@@ -177,6 +177,7 @@
return mChats.get(key);
}
ChatAdapter res = new ChatAdapter(chat);
+ Log.d(TAG, "getChat put " + key);
mChats.put(key, res);
return res;
}
@@ -301,6 +302,7 @@
try {
if (!chat.isOpen() && message.getBody() != null) {
if (chat instanceof ChatAdapter) {
+ Log.d(TAG, "processmessage put " + chat.getParticipant().getJID());
mChats.put(chat.getParticipant().getJID(), (ChatAdapter) chat);
}
notifyNewChat(chat);
--- a/src/com/beem/project/beem/service/Contact.java Fri May 07 18:16:41 2010 +0200
+++ b/src/com/beem/project/beem/service/Contact.java Thu May 13 23:02:52 2010 +0200
@@ -374,7 +374,7 @@
@Override
public String toString() {
if (mJID != null)
- return mJID;
+ return mJID + "/[" + mRes + "]";
return super.toString();
}
--- a/src/com/beem/project/beem/service/Message.java Fri May 07 18:16:41 2010 +0200
+++ b/src/com/beem/project/beem/service/Message.java Thu May 13 23:02:52 2010 +0200
@@ -44,9 +44,12 @@
package com.beem.project.beem.service;
import org.jivesoftware.smack.packet.XMPPError;
+import org.jivesoftware.smackx.packet.DelayInformation;
+import org.jivesoftware.smack.packet.PacketExtension;
import android.os.Parcel;
import android.os.Parcelable;
+import java.util.Date;
/**
* This class represents a instant message.
@@ -86,6 +89,7 @@
private String mTo;
private String mFrom;
private String mThread;
+ private Date mTimestamp;
// TODO ajouter l'erreur
@@ -101,6 +105,7 @@
mSubject = "";
mThread = "";
mFrom = null;
+ mTimestamp = new Date();
}
/**
@@ -151,6 +156,12 @@
mSubject = smackMsg.getSubject();
mThread = smackMsg.getThread();
}
+ PacketExtension pTime = smackMsg.getExtension("delay", "urn:xmpp:delay");
+ if (pTime instanceof DelayInformation) {
+ mTimestamp = ((DelayInformation) pTime).getStamp();
+ } else {
+ mTimestamp = new Date();
+ }
}
/**
@@ -164,6 +175,7 @@
mSubject = in.readString();
mThread = in.readString();
mFrom = in.readString();
+ mTimestamp = new Date(in.readLong());
}
/**
@@ -178,6 +190,7 @@
dest.writeString(mSubject);
dest.writeString(mThread);
dest.writeString(mFrom);
+ dest.writeLong(mTimestamp.getTime());
}
/**
@@ -277,6 +290,24 @@
}
/**
+ * Set the Date of the message.
+ *
+ * @param date date of the message.
+ */
+ public void setTimestamp(Date date) {
+ mTimestamp = date;
+ }
+
+ /**
+ * Get the Date of the message.
+ *
+ * @return if it is a delayed message get the date the message was sended.
+ */
+ public Date getTimestamp() {
+ return mTimestamp;
+ }
+
+ /**
* {@inheritDoc}
*/
@Override
--- a/src/com/beem/project/beem/ui/Chat.java Fri May 07 18:16:41 2010 +0200
+++ b/src/com/beem/project/beem/ui/Chat.java Thu May 13 23:02:52 2010 +0200
@@ -47,6 +47,8 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Date;
+import java.text.DateFormat;
import org.jivesoftware.smack.util.StringUtils;
@@ -263,6 +265,7 @@
case R.id.chat_menu_change_chat:
try {
final List<Contact> openedChats = mChatManager.getOpenedChatList();
+ Log.d(TAG, "opened chats = " + openedChats);
if (openedChats.size() > 0)
createChatSwitcherDialog(openedChats);
else
@@ -378,8 +381,7 @@
String fromBareJid = StringUtils.parseBareAddress(m.getFrom());
if (m.getType() == Message.MSG_TYPE_ERROR) {
lastMessage = null;
- result.add(new MessageText(fromBareJid, name, m.getBody(), true));
- continue;
+ result.add(new MessageText(fromBareJid, name, m.getBody(), true, m.getTimestamp()));
} else if (m.getType() == Message.MSG_TYPE_CHAT) {
if (fromBareJid == null) { //nofrom or from == yours
name = localName;
@@ -388,7 +390,7 @@
if (m.getBody() != null) {
if (lastMessage == null || !fromBareJid.equals(lastMessage.getBareJid())) {
- lastMessage = new MessageText(fromBareJid, name, m.getBody());
+ lastMessage = new MessageText(fromBareJid, name, m.getBody(), false, m.getTimestamp());
result.add(lastMessage);
} else {
lastMessage.setMessage(lastMessage.getMessage().concat("\n" + m.getBody()));
@@ -520,7 +522,7 @@
@Override
public void run() {
if (msg.getType() == Message.MSG_TYPE_ERROR) {
- mListMessages.add(new MessageText(fromBareJid, mContact.getName(), msg.getBody(), true));
+ mListMessages.add(new MessageText(fromBareJid, mContact.getName(), msg.getBody(), true, msg.getTimestamp()));
mMessagesListAdapter.notifyDataSetChanged();
} else if (msg.getBody() != null) {
MessageText lastMessage = null;
@@ -529,9 +531,10 @@
if (lastMessage != null && lastMessage.getBareJid().equals(fromBareJid)) {
lastMessage.setMessage(lastMessage.getMessage().concat("\n" + msg.getBody()));
+ lastMessage.setTimestamp(msg.getTimestamp());
mListMessages.set(mListMessages.size() - 1, lastMessage);
} else if (msg.getBody() != null)
- mListMessages.add(new MessageText(fromBareJid, mContact.getName(), msg.getBody()));
+ mListMessages.add(new MessageText(fromBareJid, mContact.getName(), msg.getBody(), false, msg.getTimestamp()));
mMessagesListAdapter.notifyDataSetChanged();
}
}
@@ -673,6 +676,12 @@
msgName.setError(null);
TextView msgText = (TextView) sv.findViewById(R.id.chatmessagetext);
msgText.setText(msg.getMessage());
+ TextView msgDate = (TextView) sv.findViewById(R.id.chatmessagedate);
+ Log.d(TAG, "test = " + msg.getMessage());
+ Log.d(TAG, "time = " + msg.getTimestamp());
+ DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM);
+ String date = df.format(msg.getTimestamp());
+ msgDate.setText(date);
if (msg.isError()) {
String err = getString(R.string.chat_error);
msgName.setText(err);
@@ -692,6 +701,7 @@
private String mName;
private String mMessage;
private boolean mIsError;
+ private Date mTimestamp;
/**
* Constructor.
@@ -721,6 +731,22 @@
}
/**
+ * Constructor.
+ * @param bareJid A String containing the bare JID of the message's author.
+ * @param name A String containing the name of the message's author.
+ * @param message A String containing the message.
+ * @param isError if the message is an error message.
+ * @param date the time of the message.
+ */
+ public MessageText(final String bareJid, final String name, final String message, final boolean isError, Date date) {
+ mBareJid = bareJid;
+ mName = name;
+ mMessage = message;
+ mIsError = isError;
+ mTimestamp = date;
+ }
+
+ /**
* JID attribute accessor.
* @return A String containing the bare JID of the message's author.
*/
@@ -777,6 +803,25 @@
public boolean isError() {
return mIsError;
}
+
+ /**
+ * Set the Date of the message.
+ *
+ * @param date date of the message.
+ */
+ public void setTimestamp(Date date) {
+ mTimestamp = date;
+ }
+
+ /**
+ * Get the Date of the message.
+ *
+ * @return if it is a delayed message get the date the message was sended.
+ */
+ public Date getTimestamp() {
+ return mTimestamp;
+ }
+
}
/**
@@ -825,8 +870,9 @@
if (lastMessage != null && lastMessage.getName().equals(self)) {
lastMessage.setMessage(lastMessage.getMessage().concat("\n" + inputContent));
+ lastMessage.setTimestamp(new Date());
} else
- mListMessages.add(new MessageText(self, self, inputContent));
+ mListMessages.add(new MessageText(self, self, inputContent, false, new Date()));
mMessagesListAdapter.notifyDataSetChanged();
mInputField.setText(null);
}