diff options
Diffstat (limited to 'src/main/java/de/pixart/messenger/ui')
-rw-r--r-- | src/main/java/de/pixart/messenger/ui/ConversationFragment.java | 51 | ||||
-rw-r--r-- | src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java | 103 |
2 files changed, 105 insertions, 49 deletions
diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java index 7cfaa5b02..75d599e3f 100644 --- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java +++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java @@ -48,8 +48,10 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -63,6 +65,7 @@ import de.pixart.messenger.entities.DownloadableFile; import de.pixart.messenger.entities.Message; import de.pixart.messenger.entities.MucOptions; import de.pixart.messenger.entities.Presence; +import de.pixart.messenger.entities.ReadByMarker; import de.pixart.messenger.entities.Transferable; import de.pixart.messenger.entities.TransferablePlaceholder; import de.pixart.messenger.http.HttpDownloadConnection; @@ -1368,6 +1371,54 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa if (showLoadMoreMessages(conversation)) { this.messageList.add(0, Message.createLoadMoreMessage(conversation)); } + if (conversation.getMode() == Conversation.MODE_MULTI) { + final MucOptions mucOptions = conversation.getMucOptions(); + final List<MucOptions.User> allUsers = mucOptions.getUsers(); + final Set<ReadByMarker> addedMarkers = new HashSet<>(); + ChatState state = ChatState.COMPOSING; + List<MucOptions.User> users = conversation.getMucOptions().getUsersWithChatState(state, 5); + if (users.size() == 0) { + state = ChatState.PAUSED; + users = conversation.getMucOptions().getUsersWithChatState(state, 5); + } + int markersAdded = 0; + if (mucOptions.membersOnly() && mucOptions.nonanonymous()) { + //addedMarkers.addAll(ReadByMarker.from(users)); + for (int i = this.messageList.size() - 1; i >= 0; --i) { + final Set<ReadByMarker> markersForMessage = messageList.get(i).getReadByMarkers(); + final List<MucOptions.User> shownMarkers = new ArrayList<>(); + for (ReadByMarker marker : markersForMessage) { + if (!ReadByMarker.contains(marker, addedMarkers)) { + addedMarkers.add(marker); //may be put outside this condition. set should do dedup anyway + MucOptions.User user = mucOptions.findUser(marker); + if (user != null && !users.contains(user)) { + shownMarkers.add(user); + } + } + } + final ReadByMarker markerForSender = ReadByMarker.from(messageList.get(i)); + final Message statusMessage; + if (shownMarkers.size() > 1) { + statusMessage = Message.createStatusMessage(conversation, getString(R.string.contacts_have_read_up_to_this_point, UIHelper.concatNames(shownMarkers))); + statusMessage.setCounterparts(shownMarkers); + } else if (shownMarkers.size() == 1) { + statusMessage = Message.createStatusMessage(conversation, getString(R.string.contact_has_read_up_to_this_point, UIHelper.getDisplayName(shownMarkers.get(0)))); + statusMessage.setCounterpart(shownMarkers.get(0).getFullJid()); + statusMessage.setTrueCounterpart(shownMarkers.get(0).getRealJid()); + } else { + statusMessage = null; + } + if (statusMessage != null) { + ++markersAdded; + this.messageList.add(i + 1, statusMessage); + } + addedMarkers.add(markerForSender); + if (ReadByMarker.allUsersRepresented(allUsers, addedMarkers)) { + break; + } + } + } + } } } diff --git a/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java b/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java index f21216039..4653ee3de 100644 --- a/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java +++ b/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java @@ -6,11 +6,13 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; +import android.support.annotation.ColorInt; import android.support.v4.content.ContextCompat; import android.text.Spannable; import android.text.SpannableString; @@ -754,60 +756,42 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie switch (type) { case DATE_SEPARATOR: view = activity.getLayoutInflater().inflate(R.layout.message_date_bubble, parent, false); - viewHolder.status_message = (TextView) view.findViewById(R.id.status_message); + viewHolder.status_message = view.findViewById(R.id.status_message); break; 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.audioPlayer = (RelativeLayout) view.findViewById(R.id.audio_player); - viewHolder.download_button = (Button) view - .findViewById(R.id.download_button); - viewHolder.resend_button = (Button) view - .findViewById(R.id.resend_button); - viewHolder.indicator = (ImageView) view - .findViewById(R.id.security_indicator); - viewHolder.edit_indicator = (ImageView) view.findViewById(R.id.edit_indicator); - viewHolder.image = (ImageView) view - .findViewById(R.id.message_image); - viewHolder.messageBody = (CopyTextView) 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.indicatorRead = (ImageView) view - .findViewById(R.id.indicator_read); + view = activity.getLayoutInflater().inflate(R.layout.message_sent, parent, false); + viewHolder.message_box = view.findViewById(R.id.message_box); + viewHolder.contact_picture = view.findViewById(R.id.message_photo); + viewHolder.audioPlayer = view.findViewById(R.id.audio_player); + viewHolder.download_button = view.findViewById(R.id.download_button); + viewHolder.resend_button = view.findViewById(R.id.resend_button); + viewHolder.indicator = view.findViewById(R.id.security_indicator); + viewHolder.edit_indicator = view.findViewById(R.id.edit_indicator); + viewHolder.image = view.findViewById(R.id.message_image); + viewHolder.messageBody = view.findViewById(R.id.message_body); + viewHolder.time = view.findViewById(R.id.message_time); + viewHolder.indicatorReceived = view.findViewById(R.id.indicator_received); + viewHolder.indicatorRead = view.findViewById(R.id.indicator_read); 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.audioPlayer = (RelativeLayout) view.findViewById(R.id.audio_player); - viewHolder.download_button = (Button) view - .findViewById(R.id.download_button); - viewHolder.indicator = (ImageView) view - .findViewById(R.id.security_indicator); - viewHolder.edit_indicator = (ImageView) view.findViewById(R.id.edit_indicator); - viewHolder.image = (ImageView) view - .findViewById(R.id.message_image); - viewHolder.messageBody = (CopyTextView) 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); + view = activity.getLayoutInflater().inflate(R.layout.message_received, parent, false); + viewHolder.message_box = view.findViewById(R.id.message_box); + viewHolder.contact_picture = view.findViewById(R.id.message_photo); + viewHolder.audioPlayer = view.findViewById(R.id.audio_player); + viewHolder.download_button = view.findViewById(R.id.download_button); + viewHolder.indicator = view.findViewById(R.id.security_indicator); + viewHolder.edit_indicator = view.findViewById(R.id.edit_indicator); + viewHolder.image = view.findViewById(R.id.message_image); + viewHolder.messageBody = view.findViewById(R.id.message_body); + viewHolder.time = view.findViewById(R.id.message_time); + viewHolder.indicatorReceived = view.findViewById(R.id.indicator_received); + viewHolder.encryption = view.findViewById(R.id.message_encryption); break; case STATUS: view = activity.getLayoutInflater().inflate(R.layout.message_status, parent, false); - viewHolder.load_more_messages = (Button) view.findViewById(R.id.load_more_messages); + viewHolder.contact_picture = view.findViewById(R.id.message_photo); + viewHolder.status_message = view.findViewById(R.id.status_message); + viewHolder.load_more_messages = view.findViewById(R.id.load_more_messages); break; default: throw new AssertionError("Unknown view type"); @@ -844,7 +828,22 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie } }); } else { + viewHolder.status_message.setVisibility(View.VISIBLE); viewHolder.load_more_messages.setVisibility(View.GONE); + viewHolder.status_message.setText(message.getBody()); + boolean showAvatar; + if (conversation.getMode() == Conversation.MODE_MULTI && (message.getCounterpart() != null || message.getTrueCounterpart() != null || (message.getCounterparts() != null && message.getCounterparts().size() > 0))) { + showAvatar = true; + loadAvatar(message, viewHolder.contact_picture, activity.getPixel(32)); + } else { + showAvatar = false; + } + if (showAvatar) { + viewHolder.contact_picture.setAlpha(0.5f); + viewHolder.contact_picture.setVisibility(View.VISIBLE); + } else { + viewHolder.contact_picture.setVisibility(View.GONE); + } } return view; } else { @@ -1201,9 +1200,15 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie if (bm != null) { cancelPotentialWork(message, imageView); imageView.setImageBitmap(bm); - imageView.setBackgroundColor(0x00000000); + imageView.setBackgroundColor(Color.TRANSPARENT); } else { - imageView.setBackgroundColor(UIHelper.getColorForName(UIHelper.getMessageDisplayName(message))); + @ColorInt int bg; + if (message.getType() == Message.TYPE_STATUS && message.getCounterparts() != null && message.getCounterparts().size() > 1) { + bg = Color.TRANSPARENT; + } else { + bg = UIHelper.getColorForName(UIHelper.getMessageDisplayName(message)); + } + imageView.setBackgroundColor(bg); imageView.setImageDrawable(null); final BitmapWorkerTask task = new BitmapWorkerTask(imageView, size); final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task); |