diff options
-rw-r--r-- | res/layout/message_null.xml | 5 | ||||
-rw-r--r-- | res/values-ca/arrays.xml | 4 | ||||
-rw-r--r-- | res/values-es/arrays.xml | 4 | ||||
-rw-r--r-- | res/values-eu/arrays.xml | 4 | ||||
-rw-r--r-- | res/values-eu/strings.xml | 3 | ||||
-rw-r--r-- | res/values-fr/arrays.xml | 4 | ||||
-rw-r--r-- | res/values-gl/arrays.xml | 4 | ||||
-rw-r--r-- | res/values-he/strings.xml | 1 | ||||
-rw-r--r-- | res/values-ru/strings.xml | 3 | ||||
-rw-r--r-- | res/values-sv/strings.xml | 3 | ||||
-rw-r--r-- | src/eu/siacs/conversations/entities/Message.java | 138 | ||||
-rw-r--r-- | src/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 15 |
12 files changed, 127 insertions, 61 deletions
diff --git a/res/layout/message_null.xml b/res/layout/message_null.xml new file mode 100644 index 00000000..4c7dd938 --- /dev/null +++ b/res/layout/message_null.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="wrap_content"> +</RelativeLayout>
\ No newline at end of file diff --git a/res/values-ca/arrays.xml b/res/values-ca/arrays.xml index 0c079329..47738ec3 100644 --- a/res/values-ca/arrays.xml +++ b/res/values-ca/arrays.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <array name="resources"> + <string-array name="resources"> <item>Mòbil</item> <item>Telèfon</item> <item>Tauleta</item> <item>Conversations</item> <item>Android</item> - </array> + </string-array> <string-array name="filesizes"> <item>mai</item> <item>256 KB</item> diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml index 318b9d5c..95c99077 100644 --- a/res/values-es/arrays.xml +++ b/res/values-es/arrays.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <array name="resources"> + <string-array name="resources"> <item>Móvil</item> <item>Teléfono</item> <item>Tablet</item> <item>Conversations</item> <item>Android</item> - </array> + </string-array> <string-array name="filesizes"> <item>nunca</item> <item>256 KB</item> diff --git a/res/values-eu/arrays.xml b/res/values-eu/arrays.xml index 2a5c3ce3..21b20afb 100644 --- a/res/values-eu/arrays.xml +++ b/res/values-eu/arrays.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <array name="resources"> + <string-array name="resources"> <item>Mugikorra</item> <item>Telefonoa</item> <item>Tableta</item> <item>Conversations</item> <item>Android</item> - </array> + </string-array> <string-array name="filesizes"> <item>inoiz</item> <item>256 KB</item> diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index bfe9184e..7a728d4e 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -266,7 +266,6 @@ <string name="contact_added_you">Kontaktuak bere zerrendara gehitu zaitu</string> <string name="add_back">Bera gehitu</string> <string name="contact_has_read_up_to_this_point">%s(e)k puntu honetaraino irakurri du</string> - <string name="publish_avatar">Profileko argazkia argitaratu</string> <string name="touch_to_choose_picture">Ukitu profileko argazkia irudi bat galeriatik hautatzeko</string> <string name="publish_avatar_explanation">Adi: Zure presentzia eguneraketetara harpidetutako edonork irudi hau ikusi ahal izango du.</string> <string name="publishing">Argitaratzen…</string> @@ -285,4 +284,4 @@ <string name="additional_information">Informazio gehiago</string> <string name="skip">Orain ez</string> -</resources>
\ No newline at end of file +</resources> diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml index 46c02da5..97842906 100644 --- a/res/values-fr/arrays.xml +++ b/res/values-fr/arrays.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <array name="resources"> + <string-array name="resources"> <item>Mobile</item> <item>Téléphone</item> <item>Tablette</item> <item>Conversations</item> <item>Android</item> - </array> + </string-array> <string-array name="filesizes"> <item>jamais</item> <item>256 KB</item> diff --git a/res/values-gl/arrays.xml b/res/values-gl/arrays.xml index 318b9d5c..95c99077 100644 --- a/res/values-gl/arrays.xml +++ b/res/values-gl/arrays.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <array name="resources"> + <string-array name="resources"> <item>Móvil</item> <item>Teléfono</item> <item>Tablet</item> <item>Conversations</item> <item>Android</item> - </array> + </string-array> <string-array name="filesizes"> <item>nunca</item> <item>256 KB</item> diff --git a/res/values-he/strings.xml b/res/values-he/strings.xml index 7bf2dbfd..2f2e497a 100644 --- a/res/values-he/strings.xml +++ b/res/values-he/strings.xml @@ -261,7 +261,6 @@ <string name="contact_added_you">איש קשר הוסיף אותך אל רשימת קשר</string> <string name="add_back">הוסף בחזרה</string> <string name="contact_has_read_up_to_this_point">%s קרא עד לנקודה זו</string> - <string name="publish_avatar">פרסם אווטאר</string> <string name="touch_to_choose_picture">לחץ על אווטאר כדי לבחור תמונה מתוך גלריה</string> <string name="publish_avatar_explanation">לתשומת לבך: כל מי אשר רשום לעדכוני נוכחות שלך יורשה לראות את תמונה זו.</string> <string name="publishing">כעת מפרסם…</string> diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 3bcf52e5..d4dc365c 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -19,7 +19,6 @@ <string name="send_private_message_to">Отправить личное сообщение для %s</string> <string name="touch_to_choose_picture">Нажмите на аватар, чтобы выбрать новую фотографию из галереи</string> <string name="mgmt_account_publish_avatar">Разместить аватар</string> - <string name="publish_avatar">Разместить аватар</string> <string name="error_publish_avatar_server_reject">Сервер не смог разместить аватар</string> <string name="error_publish_avatar_converting">В процессе преобразования фотографии возникла ошибка</string> <string name="error_publish_avatar_no_server_support">Ваш сервер не поддерживает публикацию аватаров</string> @@ -284,4 +283,4 @@ <string name="delete_bookmark">Удалить закладку</string> <string name="bookmark_already_exists">Такая закладка уже существует</string> -</resources>
\ No newline at end of file +</resources> diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 0f4d33b2..ee16ba58 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -273,7 +273,6 @@ <string name="send_private_message_to">Skicka privat meddelande till %s</string> <string name="touch_to_choose_picture">Tryck på avatarbild för att välja en bild från bildgalleriet</string> <string name="mgmt_account_publish_avatar">Publisera avatarbild</string> - <string name="publish_avatar">Publisera avatarbild</string> <string name="error_publish_avatar_server_reject">Servern kunde inte publisera</string> <string name="error_publish_avatar_converting">Något gick fel vid konvertering av din bild</string> <string name="error_publish_avatar_no_server_support">Din server stödjer inte publisering av avatarbilder</string> @@ -286,4 +285,4 @@ <string name="publish">Publicera</string> <string name="private_message">privat meddelande</string> -</resources>
\ No newline at end of file +</resources> diff --git a/src/eu/siacs/conversations/entities/Message.java b/src/eu/siacs/conversations/entities/Message.java index 9dea2f8a..09beff52 100644 --- a/src/eu/siacs/conversations/entities/Message.java +++ b/src/eu/siacs/conversations/entities/Message.java @@ -7,7 +7,7 @@ import android.content.Context; import android.database.Cursor; public class Message extends AbstractEntity { - + public static final String TABLENAME = "messages"; public static final int STATUS_RECEPTION_FAILED = -3; @@ -28,7 +28,7 @@ public class Message extends AbstractEntity { public static final int ENCRYPTION_OTR = 2; public static final int ENCRYPTION_DECRYPTED = 3; public static final int ENCRYPTION_DECRYPTION_FAILED = 4; - + public static final int TYPE_TEXT = 0; public static final int TYPE_IMAGE = 1; public static final int TYPE_AUDIO = 2; @@ -58,27 +58,32 @@ public class Message extends AbstractEntity { protected String remoteMsgId = null; protected transient Conversation conversation = null; - + protected transient JingleConnection jingleConnection = null; - + private Message() { - + } public Message(Conversation conversation, String body, int encryption) { this(java.util.UUID.randomUUID().toString(), conversation.getUuid(), - conversation.getContactJid(), null, body, System.currentTimeMillis(), encryption, - Message.STATUS_UNSEND,TYPE_TEXT,null); + conversation.getContactJid(), null, body, System + .currentTimeMillis(), encryption, + Message.STATUS_UNSEND, TYPE_TEXT, null); this.conversation = conversation; } - - public Message(Conversation conversation, String counterpart, String body, int encryption, int status) { - this(java.util.UUID.randomUUID().toString(), conversation.getUuid(),counterpart, null, body, System.currentTimeMillis(), encryption,status,TYPE_TEXT,null); + + public Message(Conversation conversation, String counterpart, String body, + int encryption, int status) { + this(java.util.UUID.randomUUID().toString(), conversation.getUuid(), + counterpart, null, body, System.currentTimeMillis(), + encryption, status, TYPE_TEXT, null); this.conversation = conversation; } - - public Message(String uuid, String conversationUUid, String counterpart, String trueCounterpart, - String body, long timeSent, int encryption, int status, int type, String remoteMsgId) { + + public Message(String uuid, String conversationUUid, String counterpart, + String trueCounterpart, String body, long timeSent, int encryption, + int status, int type, String remoteMsgId) { this.uuid = uuid; this.conversationUuid = conversationUUid; this.counterpart = counterpart; @@ -97,20 +102,20 @@ public class Message extends AbstractEntity { values.put(UUID, uuid); values.put(CONVERSATION, conversationUuid); values.put(COUNTERPART, counterpart); - values.put(TRUE_COUNTERPART,trueCounterpart); + values.put(TRUE_COUNTERPART, trueCounterpart); values.put(BODY, body); values.put(TIME_SENT, timeSent); values.put(ENCRYPTION, encryption); values.put(STATUS, status); values.put(TYPE, type); - values.put(REMOTE_MSG_ID,remoteMsgId); + values.put(REMOTE_MSG_ID, remoteMsgId); return values; } public String getConversationUuid() { return conversationUuid; } - + public Conversation getConversation() { return this.conversation; } @@ -118,7 +123,7 @@ public class Message extends AbstractEntity { public String getCounterpart() { return counterpart; } - + public Contact getContact() { if (this.conversation.getMode() == Conversation.MODE_SINGLE) { return this.conversation.getContact(); @@ -127,7 +132,8 @@ public class Message extends AbstractEntity { return null; } else { Account account = this.conversation.getAccount(); - Contact contact = account.getRoster().getContact(this.trueCounterpart); + Contact contact = account.getRoster().getContact( + this.trueCounterpart); if (contact.showInRoster()) { return contact; } else { @@ -136,20 +142,20 @@ public class Message extends AbstractEntity { } } } - + public String getBody() { return body; } - + public String getReadableBody(Context context) { - if ((encryption == ENCRYPTION_PGP)&&(type == TYPE_TEXT)) { - return ""+context.getText(R.string.encrypted_message_received); - } else if ((encryption == ENCRYPTION_OTR)&&(type == TYPE_IMAGE)) { - return ""+context.getText(R.string.encrypted_image_received); + if ((encryption == ENCRYPTION_PGP) && (type == TYPE_TEXT)) { + return "" + context.getText(R.string.encrypted_message_received); + } else if ((encryption == ENCRYPTION_OTR) && (type == TYPE_IMAGE)) { + return "" + context.getText(R.string.encrypted_image_received); } else if (encryption == ENCRYPTION_DECRYPTION_FAILED) { - return ""+context.getText(R.string.decryption_failed); + return "" + context.getText(R.string.decryption_failed); } else if (type == TYPE_IMAGE) { - return ""+context.getText(R.string.image_file); + return "" + context.getText(R.string.image_file); } else { return body.trim(); } @@ -166,11 +172,11 @@ public class Message extends AbstractEntity { public int getStatus() { return status; } - + public String getRemoteMsgId() { return this.remoteMsgId; } - + public void setRemoteMsgId(String id) { this.remoteMsgId = id; } @@ -199,11 +205,11 @@ public class Message extends AbstractEntity { public boolean isRead() { return this.read; } - + public void markRead() { this.read = true; } - + public void markUnread() { this.read = false; } @@ -223,7 +229,7 @@ public class Message extends AbstractEntity { public String getEncryptedBody() { return this.encryptedBody; } - + public void setEncryptedBody(String body) { this.encryptedBody = body; } @@ -231,7 +237,7 @@ public class Message extends AbstractEntity { public void setType(int type) { this.type = type; } - + public int getType() { return this.type; } @@ -243,11 +249,11 @@ public class Message extends AbstractEntity { this.counterpart = this.counterpart.split("/")[0] + "/" + presence; } } - + public void setTrueCounterpart(String trueCounterpart) { this.trueCounterpart = trueCounterpart; } - + public String getPresence() { String[] counterparts = this.counterpart.split("/"); if (counterparts.length == 2) { @@ -256,15 +262,15 @@ public class Message extends AbstractEntity { return null; } } - + public void setJingleConnection(JingleConnection connection) { this.jingleConnection = connection; } - + public JingleConnection getJingleConnection() { return this.jingleConnection; } - + public static Message createStatusMessage(Conversation conversation) { Message message = new Message(); message.setType(Message.TYPE_STATUS); @@ -275,12 +281,64 @@ public class Message extends AbstractEntity { public void setCounterpart(String counterpart) { this.counterpart = counterpart; } - + public boolean equals(Message message) { - if ((this.remoteMsgId!=null) && (this.body != null) && (this.counterpart != null)) { - return this.remoteMsgId.equals(message.getRemoteMsgId()) && this.body.equals(message.getBody()) && this.counterpart.equals(message.getCounterpart()); + if ((this.remoteMsgId != null) && (this.body != null) + && (this.counterpart != null)) { + return this.remoteMsgId.equals(message.getRemoteMsgId()) + && this.body.equals(message.getBody()) + && this.counterpart.equals(message.getCounterpart()); + } else { + return false; + } + } + + public Message next() { + int index = this.conversation.getMessages().indexOf(this); + if (index < 0 || index >= this.conversation.getMessages().size() - 1) { + return null; } else { + return this.conversation.getMessages().get(index + 1); + } + } + + public Message prev() { + int index = this.conversation.getMessages().indexOf(this); + if (index <= 0 || index > this.conversation.getMessages().size()) { + return null; + } else { + return this.conversation.getMessages().get(index - 1); + } + } + + public boolean mergable(Message message) { + if (message == null) { return false; } + return (message.getType() == Message.TYPE_TEXT + && message.getEncryption() != Message.ENCRYPTION_PGP + && this.getType() == message.getType() + && this.getEncryption() == message.getEncryption() + && this.getCounterpart().equals(message.getCounterpart()) + && (message.getTimeSent() - this.getTimeSent()) <= 20000 && ((this + .getStatus() == message.getStatus()) || (this.getStatus() == Message.STATUS_SEND && message + .getStatus() == Message.STATUS_UNSEND))); + } + + public String getMergedBody() { + Message next = this.next(); + if (this.mergable(next)) { + return body.trim() + '\n' + next.getMergedBody(); + } + return body.trim(); + } + + public boolean wasMergedIntoPrevious() { + Message prev = this.prev(); + if (prev == null) { + return false; + } else { + return prev.mergable(this); + } } } diff --git a/src/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 0ab28a65..48e1414b 100644 --- a/src/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -36,6 +36,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { private static final int SENT = 0; private static final int RECEIVED = 1; private static final int STATUS = 2; + private static final int NULL = 3; private ConversationActivity activity; @@ -74,12 +75,14 @@ public class MessageAdapter extends ArrayAdapter<Message> { @Override public int getViewTypeCount() { - return 3; + return 4; } @Override public int getItemViewType(int position) { - if (getItem(position).getType() == Message.TYPE_STATUS) { + if (getItem(position).wasMergedIntoPrevious()) { + return NULL; + } else if (getItem(position).getType() == Message.TYPE_STATUS) { return STATUS; } else if (getItem(position).getStatus() <= Message.STATUS_RECEIVED) { return RECEIVED; @@ -212,7 +215,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { viewHolder.messageBody.setVisibility(View.VISIBLE); if (message.getBody() != null) { if (message.getType() != Message.TYPE_PRIVATE) { - viewHolder.messageBody.setText(message.getBody().trim()); + viewHolder.messageBody.setText(message.getMergedBody()); } else { String privateMarker; if (message.getStatus() <= Message.STATUS_RECEIVED) { @@ -301,6 +304,10 @@ public class MessageAdapter extends ArrayAdapter<Message> { if (view == null) { viewHolder = new ViewHolder(); switch (type) { + case NULL: + view = (View) activity.getLayoutInflater().inflate( + R.layout.message_null, parent, false); + break; case SENT: view = (View) activity.getLayoutInflater().inflate( R.layout.message_sent, parent, false); @@ -382,7 +389,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { viewHolder = (ViewHolder) view.getTag(); } - if (type == STATUS) { + if (type == STATUS || type == NULL) { return view; } |