From e63109215e9dda9152f0bc92bf230b652413a677 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 11 Feb 2014 23:55:03 +0100 Subject: [PATCH] offline messages --- .../gultsch/chat/entities/Conversation.java | 1 - .../chat/persistance/DatabaseBackend.java | 8 +- .../chat/services/XmppConnectionService.java | 121 ++++++++++++------ .../gultsch/chat/ui/ConversationFragment.java | 17 ++- .../chat/ui/NewConversationActivity.java | 2 - 5 files changed, 103 insertions(+), 46 deletions(-) diff --git a/src/de/gultsch/chat/entities/Conversation.java b/src/de/gultsch/chat/entities/Conversation.java index e0e5623c..fba5464a 100644 --- a/src/de/gultsch/chat/entities/Conversation.java +++ b/src/de/gultsch/chat/entities/Conversation.java @@ -78,7 +78,6 @@ public class Conversation extends AbstractEntity { } public void markRead() { - Log.d("xmppService", "inside mark read method"); if (this.messages == null) return; for(int i = this.messages.size() -1; i >= 0; --i) { if (messages.get(i).isRead()) return; diff --git a/src/de/gultsch/chat/persistance/DatabaseBackend.java b/src/de/gultsch/chat/persistance/DatabaseBackend.java index f746f447..25a96f46 100644 --- a/src/de/gultsch/chat/persistance/DatabaseBackend.java +++ b/src/de/gultsch/chat/persistance/DatabaseBackend.java @@ -176,8 +176,6 @@ public class DatabaseBackend extends SQLiteOpenHelper { public void deleteAccount(Account account) { SQLiteDatabase db = this.getWritableDatabase(); String[] args = { account.getUuid() }; - Log.d("gultsch", "backend trying to delete account with uuid:" - + account.getUuid()); db.delete(Account.TABLENAME, Account.UUID + "=?", args); } @@ -263,4 +261,10 @@ public class DatabaseBackend extends SQLiteOpenHelper { cursor.moveToFirst(); return Contact.fromCursor(cursor); } + + public void deleteMessage(Message message) { + SQLiteDatabase db = this.getWritableDatabase(); + String[] args = { message.getUuid() }; + db.delete(Message.TABLENAME, Message.UUID + "=?", args); + } } diff --git a/src/de/gultsch/chat/services/XmppConnectionService.java b/src/de/gultsch/chat/services/XmppConnectionService.java index a7125923..567c851f 100644 --- a/src/de/gultsch/chat/services/XmppConnectionService.java +++ b/src/de/gultsch/chat/services/XmppConnectionService.java @@ -54,14 +54,14 @@ public class XmppConnectionService extends Service { private OnConversationListChangedListener convChangedListener = null; private OnAccountListChangedListener accountChangedListener = null; - + private ContentObserver contactObserver = new ContentObserver(null) { @Override - public void onChange(boolean selfChange) { - super.onChange(selfChange); - Log.d(LOGTAG,"contact list has changed"); - mergePhoneContactsWithRoster(); - } + public void onChange(boolean selfChange) { + super.onChange(selfChange); + Log.d(LOGTAG, "contact list has changed"); + mergePhoneContactsWithRoster(); + } }; private final IBinder mBinder = new XmppConnectionBinder(); @@ -129,15 +129,18 @@ public class XmppConnectionService extends Service { Message.ENCRYPTION_NONE, status); if (packet.hasChild("delay")) { try { - String stamp = packet.findChild("delay").getAttribute("stamp"); - stamp = stamp.replace("Z","+0000"); - Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(stamp); + String stamp = packet.findChild("delay").getAttribute( + "stamp"); + stamp = stamp.replace("Z", "+0000"); + Date date = new SimpleDateFormat( + "yyyy-MM-dd'T'HH:mm:ssZ").parse(stamp); message.setTime(date.getTime()); } catch (ParseException e) { - Log.d(LOGTAG,"error trying to parse date"+e.getMessage()); + Log.d(LOGTAG, + "error trying to parse date" + e.getMessage()); } } - if(notify) { + if (notify) { message.markUnread(); } conversation.getMessages().add(message); @@ -165,6 +168,15 @@ public class XmppConnectionService extends Service { if (account.getStatus() == Account.STATUS_ONLINE) { databaseBackend.clearPresences(account); connectMultiModeConversations(account); + List conversations = getConversations(); + for(int i = 0; i < conversations.size(); ++i) { + if (conversations.get(i).getAccount()==account) { + sendUnsendMessages(conversations.get(i)); + } + } + if (convChangedListener!=null) { + convChangedListener.onConversationListChanged(); + } } } }; @@ -233,10 +245,9 @@ public class XmppConnectionService extends Service { public void onCreate() { databaseBackend = DatabaseBackend.getInstance(getApplicationContext()); this.accounts = databaseBackend.getAccounts(); - - getContentResolver() - .registerContentObserver( - ContactsContract.Contacts.CONTENT_URI, true,contactObserver); + + getContentResolver().registerContentObserver( + ContactsContract.Contacts.CONTENT_URI, true, contactObserver); } public XmppConnection createConnection(Account account) { @@ -250,10 +261,53 @@ public class XmppConnectionService extends Service { return connection; } - public void sendMessage(final Account account, final Message message) { - if (message.getConversation().getMode() == Conversation.MODE_SINGLE) { + public void sendMessage(Account account, Message message) { + + if (account.getStatus() == Account.STATUS_ONLINE) { + MessagePacket packet = prepareMessagePacket(account, message); + connections.get(account).sendMessagePacket(packet); + if (message.getConversation().getMode() == Conversation.MODE_SINGLE) { + message.setStatus(Message.STATUS_SEND); + if (message.getConversation().getMode() == Conversation.MODE_SINGLE) { + databaseBackend.createMessage(message); + message.getConversation().getMessages().add(message); + if (convChangedListener!=null) { + convChangedListener.onConversationListChanged(); + } + } + } + } else { + message.getConversation().getMessages().add(message); databaseBackend.createMessage(message); + if (convChangedListener!=null) { + convChangedListener.onConversationListChanged(); + } } + + } + + private void sendUnsendMessages(Conversation conversation) { + for (int i = 0; i < conversation.getMessages().size(); ++i) { + if (conversation.getMessages().get(i).getStatus() == Message.STATUS_UNSEND) { + Message message = conversation.getMessages() + .get(i); + MessagePacket packet = prepareMessagePacket( + conversation.getAccount(),message); + connections.get(conversation.getAccount()).sendMessagePacket( + packet); + message.setStatus(Message.STATUS_SEND); + if (conversation.getMode() == Conversation.MODE_SINGLE) { + databaseBackend.updateMessage(message); + } else { + databaseBackend.deleteMessage(message); + conversation.getMessages().remove(i); + i--; + } + } + } + } + + private MessagePacket prepareMessagePacket(Account account, Message message) { MessagePacket packet = new MessagePacket(); if (message.getConversation().getMode() == Conversation.MODE_SINGLE) { packet.setType(MessagePacket.TYPE_CHAT); @@ -263,13 +317,7 @@ public class XmppConnectionService extends Service { packet.setTo(message.getCounterpart()); packet.setFrom(account.getJid()); packet.setBody(message.getBody()); - if (account.getStatus() == Account.STATUS_ONLINE) { - connections.get(account).sendMessagePacket(packet); - if (message.getConversation().getMode() == Conversation.MODE_SINGLE) { - message.setStatus(Message.STATUS_SEND); - databaseBackend.updateMessage(message); - } - } + return packet; } public void getRoster(Account account, @@ -419,20 +467,21 @@ public class XmppConnectionService extends Service { public List getAccounts() { return this.accounts; } - + public Contact findContact(Account account, String jid) { return databaseBackend.findContact(account, jid); } - public Conversation findOrCreateConversation(Account account, - String jid, boolean muc) { + public Conversation findOrCreateConversation(Account account, String jid, + boolean muc) { for (Conversation conv : this.getConversations()) { if ((conv.getAccount().equals(account)) && (conv.getContactJid().equals(jid))) { return conv; } } - Conversation conversation = databaseBackend.findConversation(account,jid); + Conversation conversation = databaseBackend.findConversation(account, + jid); if (conversation != null) { conversation.setStatus(Conversation.STATUS_AVAILABLE); conversation.setAccount(account); @@ -448,13 +497,13 @@ public class XmppConnectionService extends Service { } else { String conversationName; Contact contact = findContact(account, jid); - if (contact!=null) { + if (contact != null) { conversationName = contact.getDisplayName(); } else { conversationName = jid.split("@")[0]; } if (muc) { - conversation = new Conversation(conversationName,account, jid, + conversation = new Conversation(conversationName, account, jid, Conversation.MODE_MULTI); if (account.getStatus() == Account.STATUS_ONLINE) { joinMuc(account, conversation); @@ -516,9 +565,9 @@ public class XmppConnectionService extends Service { Log.d(LOGTAG, "found connection. disconnecting"); this.connections.get(account).disconnect(); this.connections.remove(account); - this.accounts.remove(account); } databaseBackend.deleteAccount(account); + this.accounts.remove(account); if (accountChangedListener != null) accountChangedListener.onAccountListChangedListener(); } @@ -558,15 +607,15 @@ public class XmppConnectionService extends Service { packet.setAttribute("to", muc + "/" + account.getUsername()); Element x = new Element("x"); x.setAttribute("xmlns", "http://jabber.org/protocol/muc"); - if (conversation.getMessages().size()!=0) { + if (conversation.getMessages().size() != 0) { Element history = new Element("history"); - history.setAttribute("seconds",(System.currentTimeMillis() - conversation.getLatestMessageDate()) / 1000+""); + history.setAttribute( + "seconds", + (System.currentTimeMillis() - conversation + .getLatestMessageDate()) / 1000 + ""); x.addChild(history); - } else { - Log.d(LOGTAG,"conversation had no prior messages"+conversation.getMessages().size()); } packet.addChild(x); - Log.d(LOGTAG,packet.toString()); connections.get(conversation.getAccount()).sendPresencePacket(packet); } diff --git a/src/de/gultsch/chat/ui/ConversationFragment.java b/src/de/gultsch/chat/ui/ConversationFragment.java index 81dc1d26..f7513d08 100644 --- a/src/de/gultsch/chat/ui/ConversationFragment.java +++ b/src/de/gultsch/chat/ui/ConversationFragment.java @@ -60,14 +60,14 @@ public class ConversationFragment extends Fragment { activity.xmppConnectionService.sendMessage(conversation.getAccount(),message); chatMsg.setText(""); - if (conversation.getMode()==Conversation.MODE_SINGLE) { + /*if (conversation.getMode()==Conversation.MODE_SINGLE) { conversation.getMessages().add(message); messageList.add(message); - } + }*/ - activity.updateConversationList(); + //activity.updateConversationList(); - messagesView.setSelection(messageList.size() - 1); + //messagesView.setSelection(messageList.size() - 1); } }); @@ -151,9 +151,16 @@ public class ConversationFragment extends Fragment { TextView time = (TextView) view.findViewById(R.id.message_time); if (item.getStatus() == Message.STATUS_UNSEND) { time.setTypeface(null, Typeface.ITALIC); + time.setText("sending\u2026"); } else { - time.setText(UIHelper.readableTimeDifference(item + time.setTypeface(null,Typeface.NORMAL); + if ((item.getConversation().getMode()==Conversation.MODE_SINGLE)||(type != RECIEVED)) { + time.setText(UIHelper.readableTimeDifference(item .getTimeSent())); + } else { + time.setText(item.getCounterpart()+" \u00B7 "+UIHelper.readableTimeDifference(item + .getTimeSent())); + } } return view; } diff --git a/src/de/gultsch/chat/ui/NewConversationActivity.java b/src/de/gultsch/chat/ui/NewConversationActivity.java index d8680841..a41e3e39 100644 --- a/src/de/gultsch/chat/ui/NewConversationActivity.java +++ b/src/de/gultsch/chat/ui/NewConversationActivity.java @@ -252,7 +252,6 @@ public class NewConversationActivity extends XmppActivity { this.accounts = xmppConnectionService.getAccounts(); this.rosterContacts.clear(); for (int i = 0; i < accounts.size(); ++i) { - if (accounts.get(i).getStatus() == Account.STATUS_ONLINE) { xmppConnectionService.getRoster(accounts.get(i), new OnRosterFetchedListener() { @@ -271,7 +270,6 @@ public class NewConversationActivity extends XmppActivity { }); } } - } @Override public boolean onCreateOptionsMenu(Menu menu) {