aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java
diff options
context:
space:
mode:
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.java151
1 files changed, 66 insertions, 85 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 79ab3bc3..e49575f6 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,7 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.text.Spannable;
import android.text.SpannableString;
-import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
-import android.text.style.RelativeSizeSpan;
import android.text.style.StyleSpan;
import android.text.util.Linkify;
import android.util.Patterns;
@@ -48,13 +46,14 @@ 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.http.HttpConnectionManager;
import de.thedevstack.conversationsplus.persistance.FileBackend;
import de.thedevstack.conversationsplus.providers.ConversationsPlusFileProvider;
import de.thedevstack.conversationsplus.services.AvatarService;
+import de.thedevstack.conversationsplus.services.filetransfer.http.download.AutomaticFileDownload;
import de.thedevstack.conversationsplus.ui.ConversationActivity;
import de.thedevstack.conversationsplus.utils.CryptoHelper;
import de.thedevstack.conversationsplus.utils.GeoHelper;
+import de.thedevstack.conversationsplus.utils.ImageUtil;
import de.thedevstack.conversationsplus.utils.MessageUtil;
import de.thedevstack.conversationsplus.utils.UIHelper;
import de.thedevstack.conversationsplus.utils.ui.TextViewUtil;
@@ -119,7 +118,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
- private void displayStatus(ViewHolder viewHolder, Message message, int type, boolean darkBackground) {
+ private void displayStatus(ViewHolder viewHolder, Message message, int type) {
String filesize = null;
String info = null;
boolean error = false;
@@ -177,12 +176,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
if (error && type == SENT) {
viewHolder.time.setTextColor(ConversationsPlusColors.warning());
} else {
- viewHolder.time.setTextColor(this.getMessageTextColor(darkBackground,false));
+ viewHolder.time.setTextColor(this.getMessageTextColor(viewHolder.darkBackground,false));
}
if (message.getEncryption() == Message.ENCRYPTION_NONE) {
viewHolder.indicator.setVisibility(View.GONE);
} else {
- viewHolder.indicator.setImageResource(darkBackground ? R.drawable.ic_lock_white_18dp : R.drawable.ic_lock_black_18dp);
+ viewHolder.indicator.setImageResource(viewHolder.darkBackground ? R.drawable.ic_lock_white_18dp : R.drawable.ic_lock_black_18dp);
viewHolder.indicator.setVisibility(View.VISIBLE);
if (message.getEncryption() == Message.ENCRYPTION_AXOLOTL) {
XmppAxolotlSession.Trust trust = message.getConversation()
@@ -194,7 +193,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.indicator.setAlpha(1.0f);
} else {
viewHolder.indicator.clearColorFilter();
- if (darkBackground) {
+ if (viewHolder.darkBackground) {
viewHolder.indicator.setAlpha(0.7f);
} else {
viewHolder.indicator.setAlpha(0.57f);
@@ -202,7 +201,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
} else {
viewHolder.indicator.clearColorFilter();
- if (darkBackground) {
+ if (viewHolder.darkBackground) {
viewHolder.indicator.setAlpha(0.7f);
} else {
viewHolder.indicator.setAlpha(0.57f);
@@ -236,7 +235,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
if (message.hasFileAttached() && null != message.getFileParams() && null != viewHolder.remoteFileStatus) {
FileStatus fileStatus = message.getFileParams().getFileStatus();
- if (fileStatus == FileStatus.DELETE_FAILED || fileStatus == FileStatus.DELETED || fileStatus == FileStatus.DELETING) {
+ if (fileStatus == FileStatus.DELETE_FAILED || fileStatus == FileStatus.DELETED || fileStatus == FileStatus.DELETING || fileStatus == FileStatus.NOT_FOUND) {
viewHolder.remoteFileStatus.setVisibility(View.VISIBLE);
switch (fileStatus) {
case DELETE_FAILED:
@@ -249,24 +248,28 @@ public class MessageAdapter extends ArrayAdapter<Message> {
case DELETING:
viewHolder.remoteFileStatus.setText(R.string.remote_filestatus_delete_inprogress);
break;
+ case NOT_FOUND:
+ TextViewUtil.setColor(viewHolder.remoteFileStatus, R.color.error);
+ viewHolder.remoteFileStatus.setText(R.string.remote_filestatus_not_found);
+ break;
}
}
}
}
- private void displayInfoMessage(ViewHolder viewHolder, String text, boolean darkBackground) {
+ private void displayInfoMessage(ViewHolder viewHolder, String text) {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody.setText(text);
- viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false));
+ viewHolder.messageBody.setTextColor(getMessageTextColor(viewHolder.darkBackground, false));
viewHolder.messageBody.setTypeface(null, Typeface.ITALIC);
viewHolder.messageBody.setTextIsSelectable(false);
}
- private void displayDecryptionFailed(ViewHolder viewHolder, boolean darkBackground) {
+ private void displayDecryptionFailed(ViewHolder viewHolder) {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
@@ -274,12 +277,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody.setText(getContext().getString(
R.string.decryption_failed));
- viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false));
+ viewHolder.messageBody.setTextColor(getMessageTextColor(viewHolder.darkBackground, false));
viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
viewHolder.messageBody.setTextIsSelectable(false);
}
- private void displayTextMessage(final ViewHolder viewHolder, final Message message, boolean darkBackground) {
+ private void displayTextMessage(final ViewHolder viewHolder, final Message message) {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
@@ -295,12 +298,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
body = message.getBody();
}
final SpannableString formattedBody = new SpannableString(body);
- int i = body.indexOf(Message.MERGE_SEPARATOR);
- while(i >= 0) {
- final int end = i + Message.MERGE_SEPARATOR.length();
- formattedBody.setSpan(new RelativeSizeSpan(0.3f),i,end,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- i = body.indexOf(Message.MERGE_SEPARATOR,end);
- }
if (message.getType() != Message.TYPE_PRIVATE) {
if (message.hasMeCommand()) {
final Spannable span = new SpannableString(formattedBody);
@@ -326,7 +323,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
final Spannable span = new SpannableString(privateMarker + " "
+ formattedBody);
- span.setSpan(new ForegroundColorSpan(getMessageTextColor(darkBackground,false)), 0, privateMarker
+ span.setSpan(new ForegroundColorSpan(getMessageTextColor(viewHolder.darkBackground,false)), 0, privateMarker
.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span.setSpan(new StyleSpan(Typeface.BOLD), 0,
privateMarker.length(),
@@ -366,7 +363,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.messageBody.setText("");
viewHolder.messageBody.setTextIsSelectable(false);
}
- viewHolder.messageBody.setTextColor(this.getMessageTextColor(darkBackground, true));
+ viewHolder.messageBody.setTextColor(this.getMessageTextColor(viewHolder.darkBackground, true));
viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
}
@@ -403,10 +400,15 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.messageBody.setAutoLinkMask(oldAutoLinkMask);
}
- private void displayDownloadableMessage(ViewHolder viewHolder, final Message message, int resId) {
+ private void displayDownloadableMessage(ViewHolder viewHolder, final Message message) {
viewHolder.image.setVisibility(View.GONE);
FileParams fileParams = message.getFileParams();
String btnText;
+ int resId = R.string.download_x_file;
+ if ((message.getTransferable() != null && message.getTransferable().getStatus() == Transferable.STATUS_OFFER_CHECK_FILESIZE)
+ || (null != fileParams && -1 == fileParams.getSize())) {
+ resId = R.string.check_x_filesize;
+ }
if (null != fileParams) {
this.displayFileInfoForFileMessage(message, viewHolder);
btnText = activity.getString(resId, "");
@@ -465,26 +467,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
- viewHolder.messageBody.setVisibility(View.GONE);
- viewHolder.image.setVisibility(View.VISIBLE);
- //TODO: Check what value add the following lines have (compared with setting height/width in XmppActivity.loadBitmap from thumbnail after thumbnail is created)
- /*
- FileParams params = message.getFileParams();
- double target = metrics.density * 288;
- int scalledW;
- int scalledH;
- if (params.width <= params.height) {
- scalledW = (int) (params.width / ((double) params.height / target));
- scalledH = (int) target;
- } else {
- scalledW = (int) target;
- scalledH = (int) (params.height / ((double) params.width / target));
- }
- LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(scalledW, scalledH);
- layoutParams.setMargins(0, (int) (metrics.density * 4), 0, (int) (metrics.density * 4));
- viewHolder.image.setLayoutParams(layoutParams);*/
- //TODO Why should this be calculated by hand???
- activity.loadBitmap(message, viewHolder.image, true);
+
+ ImageUtil.loadBitmap(message, viewHolder.image, viewHolder.messageBody, true);
viewHolder.image.setOnClickListener(new OnClickListener() {
@Override
@@ -511,19 +495,35 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
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/"))) {
+ Transferable transferable = message.getTransferable();
+ if (null != transferable) {
+ switch (transferable.getStatus()) {
+ case Transferable.STATUS_OFFER:
+ case Transferable.STATUS_OFFER_CHECK_FILESIZE:
+ displayDownloadableMessage(viewHolder, message);
+ break;
+ case Transferable.STATUS_UPLOADING:
+ displayFileMessage(message, viewHolder);
+ break;
+ case Transferable.STATUS_DELETED:
+ case Transferable.STATUS_CHECKING:
+ case Transferable.STATUS_FAILED:
+ case Transferable.STATUS_DOWNLOADING:
+ case Transferable.STATUS_UNKNOWN:
+ displayInfoMessage(viewHolder, UIHelper.getMessagePreview(activity, message).first);
+ break;
+ }
+ } else if (FileStatus.CHECKING_FILE_SIZE == message.getFileParams().getFileStatus()) {
+ displayInfoMessage(viewHolder, activity.getString(R.string.checking_remote_filesize));
+ } else if (MessageUtil.isAttachedFileAnImage(message) && FileStatus.DOWNLOADED == message.getFileParams().getFileStatus()) {
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())) {
+ } else if ((MessageUtil.isTypeFileAndDecrypted(message) || FileStatus.DOWNLOADED == message.getFileParams().getFileStatus())
+ && !MessageUtil.needsDownload(message)) {
displayOpenableMessage(viewHolder, message);
- } else if (Message.Decision.NEVER == message.treatAsDownloadable()) {
- displayTextMessage(viewHolder, message, getItemViewType(message) == RECEIVED && !message.isValidInSession());
+ } else if (Message.Decision.NEVER == message.treatAsDownloadable() || !MessageUtil.mayFileRemoteAvailable(message)) {
+ displayTextMessage(viewHolder, message);
} else {
- displayDownloadableMessage(viewHolder, message, R.string.download_x_file);
+ displayDownloadableMessage(viewHolder, message);
}
}
@@ -660,48 +660,28 @@ public class MessageAdapter extends ArrayAdapter<Message> {
this.displayAvatar(message, type, viewHolder);
- boolean darkBackground = (type == RECEIVED && !isInValidSession);
- this.displayStatus(viewHolder, message, type, darkBackground);
+ viewHolder.darkBackground = (type == RECEIVED && !isInValidSession);
+ this.displayStatus(viewHolder, message, type);
- 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.hasFileAttached()) {
- if (message.trusted()
+ if (null != message.getTransferable() || message.hasFileAttached()) {
+ if (!(message.trusted()
&& MessageUtil.needsDownload(message)
&& ConversationsPlusPreferences.autoAcceptFileSize() > 0
- && (message.isHttpUploaded() || ConversationsPlusPreferences.autoDownloadFileLink())) {
- HttpConnectionManager.createNewDownloadConnection(message);
- } else {
- displayFileMessage(message, viewHolder);
+ && message.isHttpUploaded() || ConversationsPlusPreferences.autoDownloadFileLink())) {
+ new AutomaticFileDownload(false).transferFile(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()) {
- displayInfoMessage(viewHolder, activity.getString(R.string.message_decrypting), darkBackground);
+ displayInfoMessage(viewHolder, activity.getString(R.string.message_decrypting));
} else {
- displayInfoMessage(viewHolder, activity.getString(R.string.pgp_message), darkBackground);
+ displayInfoMessage(viewHolder, activity.getString(R.string.pgp_message));
}
} else {
- displayInfoMessage(viewHolder,activity.getString(R.string.install_openkeychain),darkBackground);
+ displayInfoMessage(viewHolder, activity.getString(R.string.install_openkeychain));
if (viewHolder != null) {
viewHolder.message_box
.setOnClickListener(new OnClickListener() {
@@ -714,9 +694,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
} else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) {
- displayDecryptionFailed(viewHolder,darkBackground);
+ displayDecryptionFailed(viewHolder);
} else {
- displayTextMessage(viewHolder, message, darkBackground);
+ displayTextMessage(viewHolder, message);
}
if (type == RECEIVED) {
@@ -812,6 +792,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
protected TextView status_message;
protected TextView encryption;
public TextView remoteFileStatus;
+ protected boolean darkBackground;
}
class BitmapWorkerTask extends AsyncTask<Message, Void, Bitmap> {