--- a/res/layout/chat_msg_row.xml Thu Jun 10 20:08:03 2010 +0200
+++ b/res/layout/chat_msg_row.xml Mon Jun 14 22:47:22 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 Thu Jun 10 20:08:03 2010 +0200
+++ b/src/com/beem/project/beem/BeemService.java Mon Jun 14 22:47:22 2010 +0200
@@ -50,6 +50,8 @@
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.smack.proxy.ProxyInfo;
import org.jivesoftware.smack.proxy.ProxyInfo.ProxyType;
import org.jivesoftware.smack.util.StringUtils;
@@ -314,7 +316,17 @@
private void configure(ProviderManager pm) {
// 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());
@@ -328,14 +340,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
@@ -352,8 +356,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 Thu Jun 10 20:08:03 2010 +0200
+++ b/src/com/beem/project/beem/service/BeemChatManager.java Mon Jun 14 22:47:22 2010 +0200
@@ -173,6 +173,7 @@
return mChats.get(key);
}
ChatAdapter res = new ChatAdapter(chat);
+ Log.d(TAG, "getChat put " + key);
mChats.put(key, res);
return res;
}
--- a/src/com/beem/project/beem/service/Contact.java Thu Jun 10 20:08:03 2010 +0200
+++ b/src/com/beem/project/beem/service/Contact.java Mon Jun 14 22:47:22 2010 +0200
@@ -357,7 +357,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 Thu Jun 10 20:08:03 2010 +0200
+++ b/src/com/beem/project/beem/service/Message.java Mon Jun 14 22:47:22 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 Thu Jun 10 20:08:03 2010 +0200
+++ b/src/com/beem/project/beem/ui/Chat.java Mon Jun 14 22:47:22 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;
@@ -269,6 +271,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
@@ -384,8 +387,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;
@@ -394,7 +396,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()));
@@ -526,7 +528,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;
@@ -535,9 +537,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();
}
}
@@ -679,6 +682,10 @@
msgName.setError(null);
TextView msgText = (TextView) sv.findViewById(R.id.chatmessagetext);
msgText.setText(msg.getMessage());
+ TextView msgDate = (TextView) sv.findViewById(R.id.chatmessagedate);
+ 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);
@@ -698,6 +705,7 @@
private String mName;
private String mMessage;
private boolean mIsError;
+ private Date mTimestamp;
/**
* Constructor.
@@ -727,6 +735,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.
*/
@@ -783,6 +807,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;
+ }
+
}
/**
@@ -811,8 +854,6 @@
if (!"".equals(inputContent)) {
Message msgToSend = new Message(mContact.getJIDWithRes(), Message.MSG_TYPE_CHAT);
msgToSend.setBody(inputContent);
- Log.d(TAG, "jid " + mContact.getJIDWithRes());
-
try {
if (mChat == null) {
@@ -831,8 +872,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);
}