aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java
diff options
context:
space:
mode:
authorsteckbrief <steckbrief@chefmail.de>2016-06-12 11:44:23 +0200
committersteckbrief <steckbrief@chefmail.de>2017-08-02 14:31:07 +0200
commit530d64beca87181e9bea8034353353cd8a7083a4 (patch)
tree54d7d8c5fa7d22a466d32dc7aba0bb6ec10ef1ce /src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java
parent76ce6f52062aa802482497bc79aa05ee3e73244b (diff)
Implements FS#217: Rework display of /me messages
Diffstat (limited to 'src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java')
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java78
1 files changed, 59 insertions, 19 deletions
diff --git a/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java b/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java
index 9a501b89..a4711aa0 100644
--- a/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java
+++ b/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java
@@ -13,9 +13,13 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.text.Spannable;
import android.text.SpannableString;
+
import android.text.style.ForegroundColorSpan;
+
import android.text.style.StyleSpan;
import android.text.util.Linkify;
+
+import android.util.DisplayMetrics;
import android.util.Patterns;
import android.view.View;
import android.view.View.OnClickListener;
@@ -29,11 +33,13 @@ import android.widget.TextView;
import android.widget.Toast;
import java.lang.ref.WeakReference;
+
import java.util.List;
import java.util.concurrent.RejectedExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+
import de.thedevstack.conversationsplus.ConversationsPlusApplication;
import de.thedevstack.conversationsplus.ConversationsPlusColors;
import de.thedevstack.conversationsplus.ConversationsPlusPreferences;
@@ -44,6 +50,7 @@ import de.thedevstack.conversationsplus.entities.Conversation;
import de.thedevstack.conversationsplus.entities.DownloadableFile;
import de.thedevstack.conversationsplus.entities.FileParams;
import de.thedevstack.conversationsplus.entities.Message;
+
import de.thedevstack.conversationsplus.entities.Transferable;
import de.thedevstack.conversationsplus.enums.FileStatus;
import de.thedevstack.conversationsplus.persistance.FileBackend;
@@ -64,7 +71,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 static final int ME_COMMAND = 3;
private static final Pattern XMPP_PATTERN = Pattern
.compile("xmpp\\:(?:(?:["
+ Patterns.GOOD_IRI_CHAR
@@ -73,12 +80,25 @@ public class MessageAdapter extends ArrayAdapter<Message> {
private ConversationActivity activity;
+ private DisplayMetrics metrics;
+
private OnContactPictureClicked mOnContactPictureClickedListener;
private OnContactPictureLongClicked mOnContactPictureLongClickedListener;
+ private OnLongClickListener openContextMenu = new OnLongClickListener() {
+
+ @Override
+ public boolean onLongClick(View v) {
+ v.showContextMenu();
+ return true;
+ }
+ };
+
+
public MessageAdapter(ConversationActivity activity, List<Message> messages) {
super(activity, 0, messages);
this.activity = activity;
+ metrics = getContext().getResources().getDisplayMetrics();
}
public void setOnContactPictureClicked(OnContactPictureClicked listener) {
@@ -92,11 +112,13 @@ public class MessageAdapter extends ArrayAdapter<Message> {
@Override
public int getViewTypeCount() {
- return 3;
+ return 4;
}
public int getItemViewType(Message message) {
- if (message.getType() == Message.TYPE_STATUS) {
+ if (message.hasMeCommand()) {
+ return ME_COMMAND;
+ } else if (message.getType() == Message.TYPE_STATUS) {
return STATUS;
} else if (message.getStatus() <= Message.STATUS_RECEIVED) {
return RECEIVED;
@@ -209,13 +231,13 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
- String formatedTime = UIHelper.readableTimeDifferenceFull(getContext(),
- message.getTimeSent());
+ String formatedTime = UIHelper.readableTimeDifferenceFull(getContext(), message.getTimeSent());
if (message.getStatus() <= Message.STATUS_RECEIVED) {
StringBuilder timeText = new StringBuilder();
timeText.append((null != formatedTime) ? formatedTime + ((null != info || null != filesize) ? " \u00B7 " : "") : "");
timeText.append((null != filesize) ? filesize + ((null != info) ? " \u00B7 " : "") : "");
timeText.append((null != info) ? info : "");
+
viewHolder.time.setText(timeText);
} else {
if ((filesize != null) && (info != null)) {
@@ -261,7 +283,10 @@ public class MessageAdapter extends ArrayAdapter<Message> {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
+ if (null != viewHolder.image) {
viewHolder.image.setVisibility(View.GONE);
+ }
+
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody.setText(text);
viewHolder.messageBody.setTextColor(getMessageTextColor(viewHolder.darkBackground, false));
@@ -273,7 +298,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
+
viewHolder.image.setVisibility(View.GONE);
+
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody.setText(getContext().getString(
R.string.decryption_failed));
@@ -286,7 +313,10 @@ public class MessageAdapter extends ArrayAdapter<Message> {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
+ if (null != viewHolder.image) {
viewHolder.image.setVisibility(View.GONE);
+ }
+
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody.setIncludeFontPadding(true);
if (message.getBody() != null) {
@@ -298,6 +328,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
body = message.getBody();
}
final SpannableString formattedBody = new SpannableString(body);
+
if (message.getType() != Message.TYPE_PRIVATE) {
if (message.hasMeCommand()) {
final Spannable span = new SpannableString(formattedBody);
@@ -310,8 +341,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
} else {
String privateMarker;
if (message.getStatus() <= Message.STATUS_RECEIVED) {
- privateMarker = activity
- .getString(R.string.private_message);
+ privateMarker = activity.getString(R.string.private_message);
} else {
final String to;
if (message.getCounterpart() != null) {
@@ -365,10 +395,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
viewHolder.messageBody.setTextColor(this.getMessageTextColor(viewHolder.darkBackground, true));
viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
+ viewHolder.messageBody.setOnLongClickListener(openContextMenu);
}
/**
* Counts the number of occurrences of the pattern in body.
+ *
* @param pattern the pattern to match
* @param body the body to find the pattern
* @return the number of occurrences
@@ -386,6 +418,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.download_button.setVisibility(View.VISIBLE);
viewHolder.download_button.setText(btnText);
viewHolder.download_button.setOnClickListener(onClickListener);
+ viewHolder.download_button.setOnLongClickListener(openContextMenu);
}
private void displayFileInfoForFileMessage(final Message message, ViewHolder viewHolder) {
@@ -418,7 +451,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
this.displayDownloadButton(viewHolder, btnText, new OnClickListener() {
-
@Override
public void onClick(View v) {
activity.startDownloadable(message);
@@ -440,12 +472,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
this.displayDownloadButton(viewHolder, btnText, new OnClickListener() {
-
@Override
public void onClick(View v) {
openDownloadable(message);
}
});
+
}
private void displayLocationMessage(ViewHolder viewHolder, final Message message) {
@@ -454,28 +486,30 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.download_button.setVisibility(View.VISIBLE);
viewHolder.download_button.setText(R.string.show_location);
viewHolder.download_button.setOnClickListener(new OnClickListener() {
-
@Override
public void onClick(View v) {
showLocation(message);
}
});
+
+ viewHolder.download_button.setOnLongClickListener(openContextMenu);
}
- private void displayImageMessage(ViewHolder viewHolder,
- final Message message) {
+ private void displayImageMessage(ViewHolder viewHolder, final Message message) {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
ImageUtil.loadBitmap(message, viewHolder.image, viewHolder.messageBody, true);
- viewHolder.image.setOnClickListener(new OnClickListener() {
+ viewHolder.image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
openDownloadable(message);
}
});
+
+ viewHolder.image.setOnLongClickListener(openContextMenu);
}
private View displayStatusMessage(final Message message, ViewHolder viewHolder) {
@@ -491,6 +525,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
viewHolder.status_message.setText(message.getBody());
}
+
return viewHolder.view;
}
@@ -558,10 +593,11 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
private void displayAvatar(final Message message, int type, ViewHolder viewHolder) {
- if (type == RECEIVED) {
+ if (type == ME_COMMAND || (type == RECEIVED)) { // && message.getConversation().getMode() == Conversation.MODE_MULTI
ImageView imageView = viewHolder.contact_picture;
if (null != imageView) {
this.loadAvatar(message, imageView);
+
imageView.setOnClickListener(new OnClickListener() {
@Override
@@ -605,6 +641,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
case STATUS:
viewResId = R.layout.message_status;
break;
+ case ME_COMMAND:
+ viewResId = R.layout.message_mecmd;
+ break;
}
return activity.getLayoutInflater().inflate(viewResId, parent, false);
@@ -614,7 +653,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
View view = initializeView(type, parent);
ViewHolder viewHolder = new ViewHolder(view);
if (SENT == type
- || RECEIVED == type) {
+ || RECEIVED == type
+ || ME_COMMAND == type) {
viewHolder.message_box = ViewUtil.visible(view, R.id.message_box);
viewHolder.indicator = (ImageView) view.findViewById(R.id.security_indicator);
viewHolder.messageBody = (TextView) view.findViewById(R.id.message_body);
@@ -626,7 +666,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.download_button = (Button) view.findViewById(R.id.download_button);
viewHolder.image = (ImageView) view.findViewById(R.id.message_image);
}
- if (RECEIVED == type) { // Extra block as preparation for new /me representation
+ if (ME_COMMAND == type
+ || (RECEIVED == type)) { // && message.getConversation().getMode() == Conversation.MODE_MULTI --> only muc received msgs
viewHolder.contact_picture = ViewUtil.visible(view, R.id.message_photo);
}
if (RECEIVED == type) {
@@ -691,9 +732,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
} else {
displayInfoMessage(viewHolder, activity.getString(R.string.install_openkeychain));
if (viewHolder != null) {
- viewHolder.message_box
- .setOnClickListener(new OnClickListener() {
-
+ viewHolder.message_box.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
activity.showInstallPgpDialog();
@@ -787,6 +826,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
protected ViewHolder(View view) {
this.view = view;
}
+
protected View view;
protected LinearLayout message_box;