display chat states in conferences
This commit is contained in:
parent
5ea4322d3f
commit
1fd3bbfe25
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -251,7 +252,16 @@ public class UIHelper {
|
||||||
|
|
||||||
private static boolean isPositionFollowedByBigGrin(CharSequence body, int pos) {
|
private static boolean isPositionFollowedByBigGrin(CharSequence body, int pos) {
|
||||||
return body.length() <= pos + 1
|
return body.length() <= pos + 1
|
||||||
|| ((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) {
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue