aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java')
-rw-r--r--src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java381
1 files changed, 213 insertions, 168 deletions
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
index 509e3b9b..d562dd5e 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
@@ -18,9 +18,7 @@ import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StyleSpan;
import android.text.util.Linkify;
-import android.util.DisplayMetrics;
import android.util.Patterns;
-import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
@@ -33,7 +31,6 @@ import android.widget.TextView;
import android.widget.Toast;
import java.lang.ref.WeakReference;
-import java.net.URL;
import java.util.List;
import java.util.concurrent.RejectedExecutionException;
import java.util.regex.Matcher;
@@ -53,6 +50,7 @@ import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.DownloadableFile;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.Transferable;
+import eu.siacs.conversations.http.HttpConnectionManager;
import eu.siacs.conversations.persistance.FileBackend;
import eu.siacs.conversations.providers.ConversationsPlusFileProvider;
import eu.siacs.conversations.services.AvatarService;
@@ -75,8 +73,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
private ConversationActivity activity;
- private DisplayMetrics metrics;
-
private OnContactPictureClicked mOnContactPictureClickedListener;
private OnContactPictureLongClicked mOnContactPictureLongClickedListener;
@@ -92,7 +88,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
public MessageAdapter(ConversationActivity activity, List<Message> messages) {
super(activity, 0, messages);
this.activity = activity;
- metrics = getContext().getResources().getDisplayMetrics();
}
public void setOnContactPictureClicked(OnContactPictureClicked listener) {
@@ -145,12 +140,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
if (message.hasFileAttached() || message.getTransferable() != null) {
FileParams params = message.getFileParams();
if (null != params) {
- long size = params.getSize();
- if (size > (1.5 * 1024 * 1024)) {
- filesize = size / (1024 * 1024)+ " MiB";
- } else if (size > 0) {
- filesize = size / 1024 + " KiB";
- }
+ filesize = UIHelper.getHumanReadableFileSize(params.getSize());
}
if (message.getTransferable() != null && message.getTransferable().getStatus() == Transferable.STATUS_FAILED) {
@@ -231,15 +221,11 @@ public class MessageAdapter extends ArrayAdapter<Message> {
String formatedTime = UIHelper.readableTimeDifferenceFull(getContext(),
message.getTimeSent());
if (message.getStatus() <= Message.STATUS_RECEIVED) {
- if ((filesize != null) && (info != null)) {
- viewHolder.time.setText(formatedTime + " \u00B7 " + filesize +" \u00B7 " + info);
- } else if ((filesize == null) && (info != null)) {
- viewHolder.time.setText(formatedTime + " \u00B7 " + info);
- } else if ((filesize != null) && (info == null)) {
- viewHolder.time.setText(formatedTime + " \u00B7 " + filesize);
- } else {
- viewHolder.time.setText(formatedTime);
- }
+ 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)) {
viewHolder.time.setText(filesize + " \u00B7 " + info);
@@ -408,28 +394,60 @@ public class MessageAdapter extends ArrayAdapter<Message> {
return count;
}
- private void displayDownloadableMessage(ViewHolder viewHolder,
- final Message message, String text) {
+ private void displayDownloadButton(ViewHolder viewHolder, String btnText, OnClickListener onClickListener) {
+ 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) {
+ viewHolder.messageBody.setVisibility(View.VISIBLE);
+ StringBuilder fileInfos = new StringBuilder();
+ String filename = UIHelper.getDisplayFilename(message);
+ fileInfos.append((null != filename && !filename.isEmpty()) ? (filename) : "");
+
+ int oldAutoLinkMask = viewHolder.messageBody.getAutoLinkMask();
+ viewHolder.messageBody.setAutoLinkMask(0);
+ viewHolder.messageBody.setText(fileInfos);
+ viewHolder.messageBody.setAutoLinkMask(oldAutoLinkMask);
+ }
+
+ private void displayDownloadableMessage(ViewHolder viewHolder, final Message message, int resId) {
viewHolder.image.setVisibility(View.GONE);
+ FileParams fileParams = message.getFileParams();
+ String btnText;
+ if (null != fileParams) {
+ this.displayFileInfoForFileMessage(message, viewHolder);
+ btnText = activity.getString(resId, "");
+ } else {
viewHolder.messageBody.setVisibility(View.GONE);
- viewHolder.download_button.setVisibility(View.VISIBLE);
- viewHolder.download_button.setText(text);
- viewHolder.download_button.setOnClickListener(new OnClickListener() {
+ btnText = activity.getString(resId, UIHelper.getFileDescriptionString(activity, message));
+ }
+
+ this.displayDownloadButton(viewHolder, btnText, new OnClickListener() {
@Override
public void onClick(View v) {
activity.startDownloadable(message);
}
});
- viewHolder.download_button.setOnLongClickListener(openContextMenu);
}
private void displayOpenableMessage(ViewHolder viewHolder,final Message message) {
viewHolder.image.setVisibility(View.GONE);
+
+ FileParams fileParams = message.getFileParams();
+ String btnText;
+ if (null != fileParams) {
+ this.displayFileInfoForFileMessage(message, viewHolder);
+ btnText = activity.getString(R.string.cplus_open);
+ } else {
viewHolder.messageBody.setVisibility(View.GONE);
- viewHolder.download_button.setVisibility(View.VISIBLE);
- viewHolder.download_button.setText(activity.getString(R.string.open_x_file, UIHelper.getFileDescriptionString(activity, message)));
- viewHolder.download_button.setOnClickListener(new OnClickListener() {
+ btnText = activity.getString(R.string.open_x_file, UIHelper.getFileDescriptionString(activity, message));
+ }
+
+ this.displayDownloadButton(viewHolder, btnText, new OnClickListener() {
@Override
public void onClick(View v) {
@@ -489,79 +507,10 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.image.setOnLongClickListener(openContextMenu);
}
- @Override
- public View getView(int position, View view, ViewGroup parent) {
- final Message message = getItem(position);
- final boolean isInValidSession = message.isValidInSession();
+ private View displayStatusMessage(final Message message, ViewHolder viewHolder) {
+ if (null != viewHolder) {
final Conversation conversation = message.getConversation();
- final Account account = conversation.getAccount();
- final int type = getItemViewType(position);
- ViewHolder viewHolder;
- if (view == null) {
- viewHolder = new ViewHolder();
- switch (type) {
- case SENT:
- view = activity.getLayoutInflater().inflate(
- R.layout.message_sent, parent, false);
- viewHolder.message_box = (LinearLayout) view
- .findViewById(R.id.message_box);
- viewHolder.contact_picture = (ImageView) view
- .findViewById(R.id.message_photo);
- viewHolder.download_button = (Button) view
- .findViewById(R.id.download_button);
- viewHolder.indicator = (ImageView) view
- .findViewById(R.id.security_indicator);
- viewHolder.image = (ImageView) view
- .findViewById(R.id.message_image);
- viewHolder.messageBody = (TextView) view
- .findViewById(R.id.message_body);
- viewHolder.time = (TextView) view
- .findViewById(R.id.message_time);
- viewHolder.indicatorReceived = (ImageView) view
- .findViewById(R.id.indicator_received);
- viewHolder.remoteFileStatus = (TextView) view.findViewById(R.id.remote_file_status);
- break;
- case RECEIVED:
- view = activity.getLayoutInflater().inflate(
- R.layout.message_received, parent, false);
- viewHolder.message_box = (LinearLayout) view
- .findViewById(R.id.message_box);
- viewHolder.contact_picture = (ImageView) view
- .findViewById(R.id.message_photo);
- viewHolder.download_button = (Button) view
- .findViewById(R.id.download_button);
- viewHolder.indicator = (ImageView) view
- .findViewById(R.id.security_indicator);
- viewHolder.image = (ImageView) view
- .findViewById(R.id.message_image);
- viewHolder.messageBody = (TextView) view
- .findViewById(R.id.message_body);
- viewHolder.time = (TextView) view
- .findViewById(R.id.message_time);
- viewHolder.indicatorReceived = (ImageView) view
- .findViewById(R.id.indicator_received);
- viewHolder.encryption = (TextView) view.findViewById(R.id.message_encryption);
- break;
- case STATUS:
- view = activity.getLayoutInflater().inflate(R.layout.message_status, parent, false);
- viewHolder.contact_picture = (ImageView) view.findViewById(R.id.message_photo);
- viewHolder.status_message = (TextView) view.findViewById(R.id.status_message);
- break;
- default:
- viewHolder = null;
- break;
- }
- view.setTag(viewHolder);
- } else {
- viewHolder = (ViewHolder) view.getTag();
- if (viewHolder == null) {
- return view;
- }
- }
-
- boolean darkBackground = (type == RECEIVED && !isInValidSession);
- if (type == STATUS) {
viewHolder.status_message.setVisibility(View.VISIBLE);
viewHolder.contact_picture.setVisibility(View.VISIBLE);
if (conversation.getMode() == Conversation.MODE_SINGLE) {
@@ -570,13 +519,55 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.contact_picture.setAlpha(0.5f);
}
viewHolder.status_message.setText(message.getBody());
- return view;
+ }
+ return viewHolder.view;
+ }
+
+ private void displayFileMessage(final Message message, ViewHolder viewHolder) {
+ final FileParams fileParams = message.getFileParams();
+ String mimeType = (null != fileParams) ? fileParams.getMimeType() : null;
+ if ((message.getType() == Message.TYPE_IMAGE && message.getEncryption() != Message.ENCRYPTION_PGP && message.getEncryption() != Message.ENCRYPTION_DECRYPTION_FAILED)
+ || (fileParams != null && fileParams.getWidth() > 0)
+ || (null != mimeType && mimeType.startsWith("image/"))) {
+ displayImageMessage(viewHolder, message);
+ } else if ((message.getType() == Message.TYPE_FILE && message.getEncryption() != Message.ENCRYPTION_PGP && message.getEncryption() != Message.ENCRYPTION_DECRYPTION_FAILED)
+ && null != fileParams && (FileStatus.NEEDS_DOWNLOAD != fileParams.getFileStatus() || 0 == fileParams.getWidth())) {
+ displayOpenableMessage(viewHolder, message);
+ } else if (Message.Decision.NEVER == message.treatAsDownloadable()) {
+ displayTextMessage(viewHolder, message, getItemViewType(message) == RECEIVED && !message.isValidInSession());
} else {
- loadAvatar(message, viewHolder.contact_picture);
+ displayDownloadableMessage(viewHolder, message, R.string.download_x_file);
+ }
}
- viewHolder.contact_picture
- .setOnClickListener(new OnClickListener() {
+
+ private void loadAvatar(Message message, ImageView imageView) {
+ if (cancelPotentialWork(message, imageView)) {
+ int avatarPixel = imageView.getResources().getDimensionPixelOffset(R.dimen.msg_avatar_size);
+ final Bitmap bm = AvatarService.getInstance().get(message, avatarPixel, true);
+ if (bm != null) {
+ imageView.setImageBitmap(bm);
+ imageView.setBackgroundColor(0x00000000);
+ } else {
+ imageView.setBackgroundColor(UIHelper.getColorForName(UIHelper.getMessageDisplayName(message)));
+ imageView.setImageDrawable(null);
+ final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
+ final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task);
+ imageView.setImageDrawable(asyncDrawable);
+ try {
+ task.execute(message);
+ } catch (final RejectedExecutionException ignored) {
+ }
+ }
+ }
+ }
+
+ private void displayAvatar(final Message message, int type, ViewHolder viewHolder) {
+ if (type == RECEIVED) {
+ ImageView imageView = viewHolder.contact_picture;
+ if (null != imageView) {
+ this.loadAvatar(message, imageView);
+ imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
@@ -587,8 +578,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
});
- viewHolder.contact_picture
- .setOnLongClickListener(new OnLongClickListener() {
+ if (message.getConversation().getMode() == Conversation.MODE_MULTI) {
+ imageView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
@@ -601,24 +592,121 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
});
+ }
+ }
+ }
+ }
- final Transferable transferable = message.getTransferable();
- if (transferable != null && transferable.getStatus() != Transferable.STATUS_UPLOADING) {
- if (transferable.getStatus() == Transferable.STATUS_OFFER) {
- displayDownloadableMessage(viewHolder,message,activity.getString(R.string.download_x_file, UIHelper.getFileDescriptionString(activity, message)));
- } else if (transferable.getStatus() == Transferable.STATUS_OFFER_CHECK_FILESIZE) {
- displayDownloadableMessage(viewHolder, message, activity.getString(R.string.check_x_filesize, UIHelper.getFileDescriptionString(activity, message)));
+ private View initializeView(int type, ViewGroup parent) {
+ Integer viewResId = null;
+
+ switch (type) {
+ case SENT:
+ viewResId = R.layout.message_sent;
+ break;
+ case RECEIVED:
+ viewResId = R.layout.message_received;
+ break;
+ case STATUS:
+ viewResId = R.layout.message_status;
+ break;
+ }
+
+ return activity.getLayoutInflater().inflate(viewResId, parent, false);
+ }
+
+ private ViewHolder initializeViewHolderAndView(Message message, int type, ViewGroup parent) {
+ View view = initializeView(type, parent);
+ ViewHolder viewHolder = new ViewHolder(view);
+ if (SENT == type
+ || RECEIVED == type) {
+ viewHolder.message_box = (LinearLayout) view.findViewById(R.id.message_box);
+ viewHolder.message_box.setVisibility(View.VISIBLE);
+ viewHolder.indicator = (ImageView) view.findViewById(R.id.security_indicator);
+ viewHolder.messageBody = (TextView) view.findViewById(R.id.message_body);
+ viewHolder.time = (TextView) view.findViewById(R.id.message_time);
+ viewHolder.indicatorReceived = (ImageView) view.findViewById(R.id.indicator_received);
+ }
+ if ((SENT == type
+ || RECEIVED == type)) {
+ 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
+ viewHolder.contact_picture = (ImageView) view.findViewById(R.id.message_photo);
+ viewHolder.contact_picture.setVisibility(View.VISIBLE);
+ }
+ if (RECEIVED == type) {
+ viewHolder.encryption = (TextView) view.findViewById(R.id.message_encryption);
+ }
+ if (STATUS == type) {
+ viewHolder.contact_picture = (ImageView) view.findViewById(R.id.message_photo);
+ viewHolder.contact_picture.setVisibility(View.VISIBLE);
+ viewHolder.status_message = (TextView) view.findViewById(R.id.status_message);
+ viewHolder.status_message.setVisibility(View.VISIBLE);
+ }
+ view.setTag(viewHolder);
+
+ return viewHolder;
+ }
+
+ @Override
+ public View getView(int position, View view, ViewGroup parent) {
+ final Message message = getItem(position);
+ final boolean isInValidSession = message.isValidInSession();
+ final Conversation conversation = message.getConversation();
+ final Account account = conversation.getAccount();
+ final int type = getItemViewType(position);
+ ViewHolder viewHolder;
+ if (null == view) {
+ viewHolder = initializeViewHolderAndView(message, type, parent);
+ view = viewHolder.view;
} else {
+ viewHolder = (ViewHolder) view.getTag();
+ if (null == viewHolder) {
+ return view;
+ }
+ }
+
+ if (type == STATUS) {
+ return displayStatusMessage(message, viewHolder);
+ }
+
+ this.displayAvatar(message, type, viewHolder);
+
+ boolean darkBackground = (type == RECEIVED && !isInValidSession);
+ this.displayStatus(viewHolder, message, type, darkBackground);
+
+ final Transferable transferable = message.getTransferable();
+ if (null != transferable) {
+ switch (transferable.getStatus()) {
+ case Transferable.STATUS_OFFER:
+ displayDownloadableMessage(viewHolder, message, R.string.download_x_file);
+ break;
+ case Transferable.STATUS_OFFER_CHECK_FILESIZE:
+ displayDownloadableMessage(viewHolder, message, R.string.check_x_filesize);
+ break;
+ case Transferable.STATUS_UPLOADING:
+ displayFileMessage(message, viewHolder);
+ break;
+ case Transferable.STATUS_DELETED:
+ case Transferable.STATUS_CHECKING:
+ case Transferable.STATUS_FAILED:
+ case Transferable.STATUS_UNKNOWN:
displayInfoMessage(viewHolder, UIHelper.getMessagePreview(activity, message).first,darkBackground);
+ break;
}
- } else if (message.getType() == Message.TYPE_IMAGE && message.getEncryption() != Message.ENCRYPTION_PGP && message.getEncryption() != Message.ENCRYPTION_DECRYPTION_FAILED) {
- displayImageMessage(viewHolder, message);
- } else if (message.getType() == Message.TYPE_FILE && message.getEncryption() != Message.ENCRYPTION_PGP && message.getEncryption() != Message.ENCRYPTION_DECRYPTION_FAILED) {
- if (message.getFileParams() != null && message.getFileParams().getWidth() > 0) { // TODO Use FileParams.getMimeType()
- displayImageMessage(viewHolder,message);
+ } else if (message.hasFileAttached()) {
+ if (message.trusted()
+ && MessageUtil.needsDownload(message)
+ && ConversationsPlusPreferences.autoAcceptFileSize() > 0
+ && (message.isHttpUploaded() || ConversationsPlusPreferences.autoDownloadFileLink())) {
+ HttpConnectionManager.createNewDownloadConnection(message);
} else {
- displayOpenableMessage(viewHolder, message);
+ displayFileMessage(message, viewHolder);
}
+ } else if (GeoHelper.isGeoUri(message.getBody())) {
+ displayLocationMessage(viewHolder, message);
} else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
if (activity.hasPgp()) {
if (account.getPgpDecryptionService().isRunning()) {
@@ -641,35 +729,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
} else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) {
displayDecryptionFailed(viewHolder,darkBackground);
- } else if (message.hasFileAttached()) { // TODO: Move to a single block with Message.TYPE_FILE OR Message.TYPE_IMAGE
- FileParams fileParams = message.getFileParams();
- String mimeType = (null != fileParams) ? fileParams.getMimeType() : null;
- if (null != mimeType && mimeType.startsWith("image/")) {
- displayImageMessage(viewHolder, message);
- } else {
- displayOpenableMessage(viewHolder, message);
- }
- } else {
- if (GeoHelper.isGeoUri(message.getBody())) {
- displayLocationMessage(viewHolder,message);
- } else if (MessageUtil.needsDownload(message)) {
- try {
- URL url = new URL(message.getFileParams().getUrl());
- displayDownloadableMessage(viewHolder,
- message,
- activity.getString(R.string.check_x_filesize_on_host,
- UIHelper.getFileDescriptionString(activity, message),
- url.getHost()));
- } catch (Exception e) {
- displayDownloadableMessage(viewHolder,
- message,
- activity.getString(R.string.check_x_filesize,
- UIHelper.getFileDescriptionString(activity, message)));
- }
} else {
displayTextMessage(viewHolder, message, darkBackground);
}
- }
if (type == RECEIVED) {
if(isInValidSession) {
@@ -681,8 +743,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
- displayStatus(viewHolder, message, type, darkBackground);
-
return view;
}
@@ -750,6 +810,10 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
private static class ViewHolder {
+ protected ViewHolder(View view) {
+ this.view = view;
+ }
+ protected View view;
protected LinearLayout message_box;
protected Button download_button;
@@ -774,7 +838,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
@Override
protected Bitmap doInBackground(Message... params) {
- return AvatarService.getInstance().get(params[0], activity.getPixel(48), isCancelled());
+ int avatarPixel = activity.getResources().getDimensionPixelOffset(R.dimen.msg_avatar_size);
+ return AvatarService.getInstance().get(params[0], avatarPixel, isCancelled());
}
@Override
@@ -789,26 +854,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
- public void loadAvatar(Message message, ImageView imageView) {
- if (cancelPotentialWork(message, imageView)) {
- final Bitmap bm = AvatarService.getInstance().get(message, activity.getPixel(48), true);
- if (bm != null) {
- imageView.setImageBitmap(bm);
- imageView.setBackgroundColor(0x00000000);
- } else {
- imageView.setBackgroundColor(UIHelper.getColorForName(UIHelper.getMessageDisplayName(message)));
- imageView.setImageDrawable(null);
- final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
- final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task);
- imageView.setImageDrawable(asyncDrawable);
- try {
- task.execute(message);
- } catch (final RejectedExecutionException ignored) {
- }
- }
- }
- }
-
public static boolean cancelPotentialWork(Message message, ImageView imageView) {
final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);