diff options
author | steckbrief <steckbrief@chefmail.de> | 2016-06-12 11:44:23 +0200 |
---|---|---|
committer | steckbrief <steckbrief@chefmail.de> | 2017-08-02 14:31:07 +0200 |
commit | 530d64beca87181e9bea8034353353cd8a7083a4 (patch) | |
tree | 54d7d8c5fa7d22a466d32dc7aba0bb6ec10ef1ce /src/main/java/de | |
parent | 76ce6f52062aa802482497bc79aa05ee3e73244b (diff) |
Implements FS#217: Rework display of /me messages
Diffstat (limited to 'src/main/java/de')
-rw-r--r-- | src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java | 78 |
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; |