From b0780224b5bdd68d74ef514e64e14ce9d37d7b90 Mon Sep 17 00:00:00 2001 From: steckbrief Date: Sat, 5 May 2018 20:28:04 +0200 Subject: introduces new message state model --- .../ui/adapter/MessageAdapter.java | 274 +++++++-------------- 1 file changed, 95 insertions(+), 179 deletions(-) (limited to 'src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java') 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 7c7a6b57..331f8458 100644 --- a/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java +++ b/src/main/java/de/thedevstack/conversationsplus/ui/adapter/MessageAdapter.java @@ -14,10 +14,7 @@ import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; -import android.widget.Button; import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; import java.util.List; @@ -32,6 +29,7 @@ import de.thedevstack.conversationsplus.entities.Message; import de.thedevstack.conversationsplus.entities.Transferable; import de.thedevstack.conversationsplus.enums.FileStatus; +import de.thedevstack.conversationsplus.enums.MessageStatus; import de.thedevstack.conversationsplus.services.avatar.AvatarCache; import de.thedevstack.conversationsplus.services.avatar.AvatarService; import de.thedevstack.conversationsplus.services.filetransfer.http.download.AutomaticFileDownload; @@ -48,12 +46,12 @@ import de.thedevstack.conversationsplus.utils.UIHelper; import de.thedevstack.conversationsplus.utils.ui.TextViewUtil; import de.thedevstack.conversationsplus.utils.ui.ViewUtil; -public class MessageAdapter extends ArrayAdapter { +import static de.thedevstack.conversationsplus.ui.adapter.MessageViewHolder.ME_COMMAND; +import static de.thedevstack.conversationsplus.ui.adapter.MessageViewHolder.RECEIVED; +import static de.thedevstack.conversationsplus.ui.adapter.MessageViewHolder.SENT; +import static de.thedevstack.conversationsplus.ui.adapter.MessageViewHolder.STATUS; - private static final int SENT = 0; - private static final int RECEIVED = 1; - private static final int STATUS = 2; - private static final int ME_COMMAND = 3; +public class MessageAdapter extends ArrayAdapter { private ConversationActivity activity; @@ -81,7 +79,7 @@ public class MessageAdapter extends ArrayAdapter { return ME_COMMAND; } else if (message.getType() == Message.TYPE_STATUS) { return STATUS; - } else if (message.getStatus() <= Message.STATUS_RECEIVED) { + } else if (MessageUtil.isIncomingMessage(message)) { return RECEIVED; } @@ -101,15 +99,15 @@ public class MessageAdapter extends ArrayAdapter { } } - private void displayStatus(ViewHolder viewHolder, Message message, int type) { + private void displayStatus(MessageViewHolder viewHolder, Message message, int type) { String filesize = null; String info = null; boolean error = false; ViewUtil.gone(viewHolder.indicatorReceived); boolean multiReceived = message.getConversation().getMode() == Conversation.MODE_MULTI - && message.getStatus() <= Message.STATUS_RECEIVED; - if (message.hasFileAttached() || message.getTransferable() != null) { + && MessageUtil.isIncomingMessage(message); + if (message.hasFileAttached() || MessageUtil.hasDownloadableLink(message)) { FileParams params = message.getFileParams(); if (null != params) { filesize = UIHelper.getHumanReadableFileSize(params.getSize()); @@ -119,36 +117,45 @@ public class MessageAdapter extends ArrayAdapter { error = true; } } - switch (message.getStatus()) { - case Message.STATUS_WAITING: + Transferable d = message.getTransferable(); + switch (message.getMessageStatus()) { + case WAITING: info = getContext().getString(R.string.waiting); break; - case Message.STATUS_UNSEND: - Transferable d = message.getTransferable(); - if (d != null) { - info = getContext().getString(R.string.sending_file, d.getProgress()); + case TRANSMITTING: + if (null != d) { + int resId = R.string.receiving_file; + if (MessageUtil.isOutgoingMessage(message)) { + resId = R.string.sending_file; + } + info = getContext().getString(resId, d.getProgress()); + } else if (null != message.getFileParams() && FileStatus.NEEDS_UPLOAD == message.getFileParams().getFileStatus()) { // FIXME: Remove when Jingle is migrated + info = getContext().getString(R.string.offering); } else { - info = getContext().getString(R.string.sending); + if (!MessageUtil.needsDownload(message)) { + int resId = R.string.receiving; + if (MessageUtil.isOutgoingMessage(message)) { + resId = R.string.sending; + } + info = getContext().getString(resId); + } } break; - case Message.STATUS_OFFERED: - info = getContext().getString(R.string.offering); - break; - case Message.STATUS_SEND_RECEIVED: + case RECEIVED: if (ConversationsPlusPreferences.indicateReceived()) { viewHolder.indicatorReceived.setVisibility(View.VISIBLE); } break; - case Message.STATUS_SEND_DISPLAYED: + case DISPLAYED: if (ConversationsPlusPreferences.indicateReceived()) { viewHolder.indicatorReceived.setVisibility(View.VISIBLE); } break; - case Message.STATUS_SEND_FAILED: + case FAILED: info = getContext().getString(R.string.send_failed); error = true; break; - case Message.STATUS_SEND_CANCELED: + case CANCELED: info = getContext().getString(R.string.send_canceled); error = true; break; @@ -156,7 +163,6 @@ public class MessageAdapter extends ArrayAdapter { if (multiReceived) { info = UIHelper.getMessageDisplayName(message); } - break; } this.displayEncryptionIndicator(message, viewHolder); @@ -166,7 +172,7 @@ public class MessageAdapter extends ArrayAdapter { this.displayRemoteFileStatus(message, viewHolder); } - private void displayRemoteFileStatus(Message message, ViewHolder viewHolder) { + private void displayRemoteFileStatus(Message message, MessageViewHolder viewHolder) { 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 || fileStatus == FileStatus.NOT_FOUND) { @@ -193,7 +199,7 @@ public class MessageAdapter extends ArrayAdapter { } } - private void displayMessageTime(Message message, ViewHolder viewHolder, String filesize, String info, boolean error, boolean isSent) { + private void displayMessageTime(Message message, MessageViewHolder viewHolder, String filesize, String info, boolean error, boolean isSent) { if (error && isSent) { viewHolder.time.setTextColor(ConversationsPlusColors.warning()); } else { @@ -201,7 +207,7 @@ public class MessageAdapter extends ArrayAdapter { } String formatedTime = UIHelper.readableTimeDifferenceFull(getContext(), message.getTimeSent()); String timeText = null; - if (message.getStatus() <= Message.STATUS_RECEIVED) { + if (MessageUtil.isIncomingMessage(message)) { StringBuilder timeTextBuilder = new StringBuilder(); timeTextBuilder.append((null != formatedTime) ? formatedTime + ((null != info || null != filesize) ? " \u00B7 " : "") : ""); timeTextBuilder.append((null != filesize) ? filesize + ((null != info) ? " \u00B7 " : "") : ""); @@ -227,7 +233,7 @@ public class MessageAdapter extends ArrayAdapter { TextViewUtil.setTextWithoutAutoLink(viewHolder.time, timeText); } - private void displayEncryptionIndicator(Message message, ViewHolder viewHolder) { + private void displayEncryptionIndicator(Message message, MessageViewHolder viewHolder) { if (message.getEncryption() == Message.ENCRYPTION_NONE) { viewHolder.indicator.setVisibility(View.GONE); } else { @@ -260,40 +266,28 @@ public class MessageAdapter extends ArrayAdapter { } } - private void displayInfoMessage(ViewHolder viewHolder, String text) { - if (viewHolder.download_button != null) { - viewHolder.download_button.setVisibility(View.GONE); - } - if (null != viewHolder.image) { - viewHolder.image.setVisibility(View.GONE); - } + private void displayInfoMessage(MessageViewHolder viewHolder, String text) { + ViewUtil.gone(viewHolder.download_button, viewHolder.image); - viewHolder.messageBody.setVisibility(View.VISIBLE); - viewHolder.messageBody.setText(text); + TextViewUtil.showAndSetText(viewHolder.messageBody, text); viewHolder.messageBody.setTextColor(getMessageTextColor(viewHolder.darkBackground, false)); viewHolder.messageBody.setTypeface(null, Typeface.ITALIC); viewHolder.messageBody.setTextIsSelectable(false); } - private void displayDecryptionFailed(ViewHolder viewHolder) { - if (viewHolder.download_button != null) { - viewHolder.download_button.setVisibility(View.GONE); - } - - viewHolder.image.setVisibility(View.GONE); + private void displayDecryptionFailed(MessageViewHolder viewHolder) { + ViewUtil.gone(viewHolder.download_button, viewHolder.image); - viewHolder.messageBody.setVisibility(View.VISIBLE); - viewHolder.messageBody.setText(getContext().getString( - R.string.decryption_failed)); + TextViewUtil.showAndSetText(viewHolder.messageBody, R.string.decryption_failed); 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) { + private void displayTextMessage(final MessageViewHolder viewHolder, final Message message) { ViewUtil.gone(viewHolder.download_button, viewHolder.image); - viewHolder.messageBody.setVisibility(View.VISIBLE); + ViewUtil.visible(viewHolder.messageBody); viewHolder.messageBody.setIncludeFontPadding(true); if (message.getBody() != null) { @@ -317,7 +311,7 @@ public class MessageAdapter extends ArrayAdapter { } } else { String privateMarker; - if (message.getStatus() <= Message.STATUS_RECEIVED) { + if (MessageUtil.isIncomingMessage(message)) { privateMarker = activity.getString(R.string.private_message); } else { final String to; @@ -352,15 +346,14 @@ public class MessageAdapter extends ArrayAdapter { viewHolder.messageBody.setOnLongClickListener(openContextMenu); } - 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); + private void displayDownloadButton(MessageViewHolder viewHolder, String btnText, OnClickListener onClickListener) { + TextViewUtil.showAndSetText(viewHolder.download_button, btnText) + .setOnClickListener(onClickListener); viewHolder.download_button.setOnLongClickListener(openContextMenu); } - private void displayFileInfoForFileMessage(final Message message, ViewHolder viewHolder) { - viewHolder.messageBody.setVisibility(View.VISIBLE); + private void displayFileInfoForFileMessage(final Message message, MessageViewHolder viewHolder) { + ViewUtil.visible(viewHolder.messageBody); StringBuilder fileInfos = new StringBuilder(); String filename = UIHelper.getDisplayFilename(message); fileInfos.append((null != filename && !filename.isEmpty()) ? (filename) : ""); @@ -368,8 +361,8 @@ public class MessageAdapter extends ArrayAdapter { TextViewUtil.setTextWithoutAutoLink(viewHolder.messageBody, fileInfos); } - private void displayDownloadableMessage(ViewHolder viewHolder, final Message message) { - viewHolder.image.setVisibility(View.GONE); + private void displayDownloadableMessage(MessageViewHolder viewHolder, final Message message) { + ViewUtil.gone(viewHolder.image); FileParams fileParams = message.getFileParams(); String btnText; int resId = R.string.download_x_file; @@ -393,8 +386,8 @@ public class MessageAdapter extends ArrayAdapter { }); } - private void displayOpenableMessage(ViewHolder viewHolder, final Message message) { - viewHolder.image.setVisibility(View.GONE); + private void displayOpenableMessage(MessageViewHolder viewHolder, final Message message) { + ViewUtil.gone(viewHolder.image); FileParams fileParams = message.getFileParams(); String btnText; @@ -410,19 +403,18 @@ public class MessageAdapter extends ArrayAdapter { } - private void displayLocationMessage(ViewHolder viewHolder, final Message message) { - viewHolder.image.setVisibility(View.GONE); - viewHolder.messageBody.setVisibility(View.GONE); - viewHolder.download_button.setVisibility(View.VISIBLE); - viewHolder.download_button.setText(R.string.show_location); - viewHolder.download_button.setOnClickListener(new OpenLocationOnClickListener(this.activity, message)); + private void displayLocationMessage(MessageViewHolder viewHolder, final Message message) { + ViewUtil.gone(viewHolder.image, viewHolder.messageBody); + + TextViewUtil.showAndSetText(viewHolder.download_button, R.string.show_location) + .setOnClickListener(new OpenLocationOnClickListener(this.activity, message)); viewHolder.download_button.setOnLongClickListener(openContextMenu); } - private void displayImageMessage(ViewHolder viewHolder, final Message message) { - ViewUtil.gone(viewHolder.download_button); - + private void displayImageMessage(MessageViewHolder viewHolder, final Message message) { + ViewUtil.gone(viewHolder.download_button, viewHolder.messageBody); + ViewUtil.visible(viewHolder.image); ImageUtil.loadBitmap(message, viewHolder.image, viewHolder.messageBody, true); viewHolder.image.setOnClickListener(new OpenFileOnClickListener(this.activity, message)); @@ -430,11 +422,11 @@ public class MessageAdapter extends ArrayAdapter { viewHolder.image.setOnLongClickListener(openContextMenu); } - private View displayStatusMessage(final Message message, ViewHolder viewHolder) { + private View displayStatusMessage(final Message message, MessageViewHolder viewHolder) { final Conversation conversation = message.getConversation(); - viewHolder.status_message.setVisibility(View.VISIBLE); - viewHolder.contact_picture.setVisibility(View.VISIBLE); + ViewUtil.visible(viewHolder.status_message, viewHolder.contact_picture); + if (conversation.getMode() == Conversation.MODE_SINGLE) { viewHolder.contact_picture.setImageBitmap(AvatarCache.get(conversation.getContact(), activity.getPixel(32))); @@ -445,29 +437,20 @@ public class MessageAdapter extends ArrayAdapter { return viewHolder.view; } - private void displayFileMessage(final Message message, ViewHolder viewHolder) { + private void displayFileMessage(final Message message, MessageViewHolder viewHolder) { if (!(message.trusted() && MessageUtil.needsDownload(message) && ConversationsPlusPreferences.autoAcceptFileSize() > 0 && message.isHttpUploaded() || ConversationsPlusPreferences.autoDownloadFileLink())) { - new AutomaticFileDownload(false).transferFile(message); + new AutomaticFileDownload().transferFile(message); } Transferable transferable = message.getTransferable(); 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() - || FileStatus.DELETED == message.getFileParams().getFileStatus() - || FileStatus.DELETING == message.getFileParams().getFileStatus() - || FileStatus.DELETE_FAILED == message.getFileParams().getFileStatus() - || FileStatus.NEEDS_UPLOAD == message.getFileParams().getFileStatus() - || FileStatus.UPLOADED == message.getFileParams().getFileStatus() - || FileStatus.UPLOAD_FAILED == message.getFileParams().getFileStatus() - || (null != transferable - && (transferable.isCanceled() - || Transferable.STATUS_UPLOADING == transferable.getStatus())))) { + && hasFileStatusToShowMessage(message)) { displayImageMessage(viewHolder, message); - } else if ((MessageUtil.isTypeFileAndDecrypted(message) || FileStatus.DOWNLOADED == message.getFileParams().getFileStatus()) + } else if ((MessageUtil.isTypeFileAndDecrypted(message) || hasFileStatusToShowMessage(message)) && !MessageUtil.needsDownload(message)) { displayOpenableMessage(viewHolder, message); } else if (Message.Decision.NEVER == message.treatAsDownloadable() || !MessageUtil.mayFileRemoteAvailable(message)) { @@ -478,10 +461,6 @@ public class MessageAdapter extends ArrayAdapter { case Transferable.STATUS_OFFER_CHECK_FILESIZE: displayDownloadableMessage(viewHolder, message); break; - case Transferable.STATUS_UPLOADING: - // Should not happen, since this is now covered by the other if-statements - // TODO Maybe in Jingle File Transfer?? Needs to be checked! - break; case Transferable.STATUS_DELETED: case Transferable.STATUS_CHECKING: case Transferable.STATUS_FAILED: @@ -495,7 +474,21 @@ public class MessageAdapter extends ArrayAdapter { } } - private void displayAvatar(final Message message, int type, ViewHolder viewHolder) { + private boolean hasFileStatusToShowMessage(Message message) { + Transferable transferable = message.getTransferable(); + return (FileStatus.DOWNLOADED == message.getFileParams().getFileStatus() + || FileStatus.DELETED == message.getFileParams().getFileStatus() + || FileStatus.DELETING == message.getFileParams().getFileStatus() + || FileStatus.DELETE_FAILED == message.getFileParams().getFileStatus() + || FileStatus.NEEDS_UPLOAD == message.getFileParams().getFileStatus() + || FileStatus.UPLOADED == message.getFileParams().getFileStatus() + || FileStatus.UPLOAD_FAILED == message.getFileParams().getFileStatus() + || (null != transferable + && (transferable.isCanceled() + || Transferable.STATUS_UPLOADING == transferable.getStatus()))); + } + + private void displayAvatar(final Message message, int type, MessageViewHolder viewHolder) { if (type == ME_COMMAND || (type == RECEIVED)) { // && message.getConversation().getMode() == Conversation.MODE_MULTI ImageView imageView = viewHolder.contact_picture; if (null != imageView) { @@ -509,79 +502,24 @@ public class MessageAdapter extends ArrayAdapter { } } - 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; - case ME_COMMAND: - viewResId = R.layout.message_mecmd; - break; - } - - return activity.getLayoutInflater().inflate(viewResId, parent, false); - } - - private ViewHolder initializeViewHolderAndView(int type, ViewGroup parent) { - View view = initializeView(type, parent); - ViewHolder viewHolder = new ViewHolder(view); - if (SENT == 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); - 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 (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) { - viewHolder.encryption = (TextView) view.findViewById(R.id.message_encryption); - } - if (STATUS == type) { - viewHolder.contact_picture = ViewUtil.visible(view, R.id.message_photo); - viewHolder.status_message = TextViewUtil.visible(view, R.id.status_message); - } - if (SENT == type) { // This field is only useful for sent messages -> because of deletion of own files -> maybe a use case for recvd possible - viewHolder.remoteFileStatus = TextViewUtil.gone(view, R.id.remote_file_status); - } - view.setTag(viewHolder); - - return viewHolder; - } - @Override public View getView(int position, View view, @NonNull ViewGroup parent) { final Message message = getItem(position); - if (null == message) { + if (null == message + || MessageStatus.DISPLAYED == message.getMessageStatus() + || MessageStatus.RECEIVED == message.getMessageStatus()) { return view; } final boolean isInValidSession = message.isValidInSession(); final Conversation conversation = message.getConversation(); final Account account = conversation.getAccount(); final int type = getItemViewType(position); - ViewHolder viewHolder; + MessageViewHolder viewHolder; if (null == view) { - viewHolder = initializeViewHolderAndView(type, parent); + viewHolder = new MessageViewHolder(this.activity, type, parent); view = viewHolder.view; } else { - viewHolder = (ViewHolder) view.getTag(); + viewHolder = (MessageViewHolder) view.getTag(); if (null == viewHolder) { return view; } @@ -594,7 +532,6 @@ public class MessageAdapter extends ArrayAdapter { this.displayAvatar(message, type, viewHolder); viewHolder.darkBackground = (type == RECEIVED && !isInValidSession); - this.displayStatus(viewHolder, message, type); if (null != message.getTransferable() || message.hasFileAttached() || MessageUtil.hasDownloadableLink(message)) { displayFileMessage(message, viewHolder); @@ -607,21 +544,21 @@ public class MessageAdapter extends ArrayAdapter { } else { displayTextMessage(viewHolder, message); } + this.displayStatus(viewHolder, message, type); if (type == RECEIVED) { if (isInValidSession) { - viewHolder.encryption.setVisibility(View.GONE); + ViewUtil.gone(viewHolder.encryption); } else { viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received_warning); - viewHolder.encryption.setVisibility(View.VISIBLE); - viewHolder.encryption.setText(CryptoHelper.encryptionTypeToText(message.getEncryption())); + TextViewUtil.showAndSetText(viewHolder.encryption, CryptoHelper.encryptionTypeToText(message.getEncryption())); } } return view; } - private void displayPgpEncryptedMessage(ViewHolder viewHolder, Account account) { + private void displayPgpEncryptedMessage(MessageViewHolder viewHolder, Account account) { if (activity.hasPgp()) { if (account.getPgpDecryptionService().isRunning()) { displayInfoMessage(viewHolder, activity.getString(R.string.message_decrypting)); @@ -638,25 +575,4 @@ public class MessageAdapter extends ArrayAdapter { }); } } - - private static class ViewHolder { - protected ViewHolder(View view) { - this.view = view; - } - - protected View view; - - protected LinearLayout message_box; - protected Button download_button; - protected ImageView image; - protected ImageView indicator; - protected ImageView indicatorReceived; - protected TextView time; - protected TextView messageBody; - protected ImageView contact_picture; - protected TextView status_message; - protected TextView encryption; - public TextView remoteFileStatus; - protected boolean darkBackground; - } } \ No newline at end of file -- cgit v1.2.3