display chat states in conferences

This commit is contained in:
Daniel Gultsch 2017-03-08 10:32:42 +01:00
parent 5ea4322d3f
commit 1fd3bbfe25
6 changed files with 73 additions and 15 deletions

View File

@ -544,12 +544,15 @@ public class MucOptions {
} }
} }
public ArrayList<User> getUsersWithChatState(ChatState state) { public ArrayList<User> getUsersWithChatState(ChatState state, int max) {
synchronized (users) { synchronized (users) {
ArrayList<User> list = new ArrayList<>(); ArrayList<User> list = new ArrayList<>();
for(User user : users) { for(User user : users) {
if (user.chatState == state) { if (user.chatState == state) {
list.add(user); list.add(user);
if (list.size() >= max) {
break;
}
} }
} }
return list; return list;

View File

@ -1284,6 +1284,36 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
} }
} }
} }
} else {
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);
}
if (users.size() > 0) {
Message statusMessage;
if (users.size() == 1) {
MucOptions.User user = users.get(0);
int id = state == ChatState.COMPOSING ? R.string.contact_is_typing : R.string.contact_has_stopped_typing;
statusMessage = Message.createStatusMessage(conversation, getString(id, UIHelper.getDisplayName(user)));
statusMessage.setTrueCounterpart(user.getRealJid());
statusMessage.setCounterpart(user.getFullJid());
} else {
StringBuilder builder = new StringBuilder();
for(MucOptions.User user : users) {
if (builder.length() != 0) {
builder.append(", ");
}
builder.append(UIHelper.getDisplayName(user));
}
int id = state == ChatState.COMPOSING ? R.string.contacts_are_typing : R.string.contacts_have_stopped_typing;
statusMessage = Message.createStatusMessage(conversation, getString(id, builder.toString()));
}
this.messageList.add(statusMessage);
}
} }
} }
} }

View File

@ -667,19 +667,28 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
}); });
} else { } else {
viewHolder.status_message.setVisibility(View.VISIBLE); viewHolder.status_message.setVisibility(View.VISIBLE);
viewHolder.contact_picture.setVisibility(View.VISIBLE);
viewHolder.load_more_messages.setVisibility(View.GONE); viewHolder.load_more_messages.setVisibility(View.GONE);
if (conversation.getMode() == Conversation.MODE_SINGLE) {
viewHolder.contact_picture.setImageBitmap(activity
.avatarService().get(conversation.getContact(),
activity.getPixel(32)));
viewHolder.contact_picture.setAlpha(0.5f);
}
viewHolder.status_message.setText(message.getBody()); viewHolder.status_message.setText(message.getBody());
boolean showAvatar;
if (conversation.getMode() == Conversation.MODE_SINGLE) {
showAvatar = true;
loadAvatar(message,viewHolder.contact_picture,activity.getPixel(32));
} else if (message.getCounterpart() != null ){
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; return view;
} else { } else {
loadAvatar(message, viewHolder.contact_picture); loadAvatar(message, viewHolder.contact_picture,activity.getPixel(48));
} }
viewHolder.contact_picture viewHolder.contact_picture
@ -968,14 +977,16 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
class BitmapWorkerTask extends AsyncTask<Message, Void, Bitmap> { class BitmapWorkerTask extends AsyncTask<Message, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference; private final WeakReference<ImageView> imageViewReference;
private Message message = null; private Message message = null;
private final int size;
public BitmapWorkerTask(ImageView imageView) { public BitmapWorkerTask(ImageView imageView, int size) {
imageViewReference = new WeakReference<>(imageView); imageViewReference = new WeakReference<>(imageView);
this.size = size;
} }
@Override @Override
protected Bitmap doInBackground(Message... params) { protected Bitmap doInBackground(Message... params) {
return activity.avatarService().get(params[0], activity.getPixel(48), isCancelled()); return activity.avatarService().get(params[0], size, isCancelled());
} }
@Override @Override
@ -990,9 +1001,9 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
} }
} }
public void loadAvatar(Message message, ImageView imageView) { public void loadAvatar(Message message, ImageView imageView, int size) {
if (cancelPotentialWork(message, imageView)) { if (cancelPotentialWork(message, imageView)) {
final Bitmap bm = activity.avatarService().get(message, activity.getPixel(48), true); final Bitmap bm = activity.avatarService().get(message, size, true);
if (bm != null) { if (bm != null) {
cancelPotentialWork(message, imageView); cancelPotentialWork(message, imageView);
imageView.setImageBitmap(bm); imageView.setImageBitmap(bm);
@ -1000,7 +1011,7 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
} else { } else {
imageView.setBackgroundColor(UIHelper.getColorForName(UIHelper.getMessageDisplayName(message))); imageView.setBackgroundColor(UIHelper.getColorForName(UIHelper.getMessageDisplayName(message)));
imageView.setImageDrawable(null); imageView.setImageDrawable(null);
final BitmapWorkerTask task = new BitmapWorkerTask(imageView); final BitmapWorkerTask task = new BitmapWorkerTask(imageView, size);
final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task); final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task);
imageView.setImageDrawable(asyncDrawable); imageView.setImageDrawable(asyncDrawable);
try { try {

View File

@ -22,6 +22,7 @@ import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.ListItem; import eu.siacs.conversations.entities.ListItem;
import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.MucOptions;
import eu.siacs.conversations.entities.Presence; import eu.siacs.conversations.entities.Presence;
import eu.siacs.conversations.entities.Transferable; import eu.siacs.conversations.entities.Transferable;
import eu.siacs.conversations.ui.XmppActivity; import eu.siacs.conversations.ui.XmppActivity;
@ -254,6 +255,15 @@ public class UIHelper {
|| ((body.charAt(pos + 1) == '<') && (body.length() == pos + 2 || Character.isWhitespace(body.charAt(pos + 2)))); || ((body.charAt(pos + 1) == '<') && (body.length() == pos + 2 || Character.isWhitespace(body.charAt(pos + 2))));
} }
public static String getDisplayName(MucOptions.User user) {
Contact contact = user.getContact();
if (contact != null) {
return contact.getDisplayName();
} else {
return user.getName();
}
}
public static String getFileDescriptionString(final Context context, final Message message) { public static String getFileDescriptionString(final Context context, final Message message) {
if (message.getType() == Message.TYPE_IMAGE) { if (message.getType() == Message.TYPE_IMAGE) {
return context.getString(R.string.image); return context.getString(R.string.image);

View File

@ -34,7 +34,9 @@
android:id="@+id/status_message" android:id="@+id/status_message"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="32dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:gravity="center_vertical"
android:layout_marginLeft="8dp" android:layout_marginLeft="8dp"
android:layout_toEndOf="@+id/message_photo" android:layout_toEndOf="@+id/message_photo"
android:layout_toRightOf="@+id/message_photo" android:layout_toRightOf="@+id/message_photo"

View File

@ -503,6 +503,8 @@
<string name="disable_account">Disable Account</string> <string name="disable_account">Disable Account</string>
<string name="contact_is_typing">%s is typing…</string> <string name="contact_is_typing">%s is typing…</string>
<string name="contact_has_stopped_typing">%s has stopped typing</string> <string name="contact_has_stopped_typing">%s has stopped typing</string>
<string name="contacts_are_typing">%s are typing…</string>
<string name="contacts_have_stopped_typing">%s have stopped typing</string>
<string name="pref_chat_states">Typing notifications</string> <string name="pref_chat_states">Typing notifications</string>
<string name="pref_chat_states_summary">Let your contacts know when you are writing messages to them</string> <string name="pref_chat_states_summary">Let your contacts know when you are writing messages to them</string>
<string name="send_location">Send location</string> <string name="send_location">Send location</string>