# HG changeset patch # User Da Risk # Date 1273784572 -7200 # Node ID d1db49d18275ca794b5343cb5a7d617fcfe6edb4 # Parent 3691532291fada2c9c4ee0e903bf484f57649f20 fix #263 Add support for XEP-0263 : Delayed Delivery and display timestamps for message. diff -r 3691532291fa -r d1db49d18275 res/layout/chat_msg_row.xml --- 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 @@ - - - + + + + diff -r 3691532291fa -r d1db49d18275 src/com/beem/project/beem/BeemService.java --- 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")); diff -r 3691532291fa -r d1db49d18275 src/com/beem/project/beem/service/BeemChatManager.java --- 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); diff -r 3691532291fa -r d1db49d18275 src/com/beem/project/beem/service/Contact.java --- 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(); } diff -r 3691532291fa -r d1db49d18275 src/com/beem/project/beem/service/Message.java --- 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 diff -r 3691532291fa -r d1db49d18275 src/com/beem/project/beem/ui/Chat.java --- 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 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); }