mirror of
https://github.com/oxen-io/session-android.git
synced 2025-04-30 09:50:50 +00:00
Show something for unnamed groups, allow us to have different default photos for groups vs. individuals
This commit is contained in:
parent
877ed8f59c
commit
25324a45b3
@ -67,6 +67,7 @@
|
|||||||
<string name="ConversationActivity_forward_message_prefix">FWD</string>
|
<string name="ConversationActivity_forward_message_prefix">FWD</string>
|
||||||
<string name="ConversationActivity_group_conversation_recipients">Group Conversation Recipients</string>
|
<string name="ConversationActivity_group_conversation_recipients">Group Conversation Recipients</string>
|
||||||
<string name="ConversationActivity_group_conversation">Group Conversation</string>
|
<string name="ConversationActivity_group_conversation">Group Conversation</string>
|
||||||
|
<string name="ConversationActivity_unnamed_group">Unnamed Group</string>
|
||||||
<string name="ConversationActivity_d_recipients_in_group">%d members</string>
|
<string name="ConversationActivity_d_recipients_in_group">%d members</string>
|
||||||
<string name="ConversationActivity_d_recipients_in_group_singular">1 member</string>
|
<string name="ConversationActivity_d_recipients_in_group_singular">1 member</string>
|
||||||
<string name="ConversationActivity_saving_draft">Saving draft...</string>
|
<string name="ConversationActivity_saving_draft">Saving draft...</string>
|
||||||
|
@ -24,6 +24,9 @@ import android.content.DialogInterface;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
@ -32,6 +35,7 @@ import android.provider.ContactsContract;
|
|||||||
import android.telephony.PhoneNumberUtils;
|
import android.telephony.PhoneNumberUtils;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.InputType;
|
import android.text.InputType;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.ContextMenu;
|
import android.view.ContextMenu;
|
||||||
@ -57,6 +61,7 @@ import org.thoughtcrime.securesms.components.EmojiToggle;
|
|||||||
import org.thoughtcrime.securesms.components.RecipientsPanel;
|
import org.thoughtcrime.securesms.components.RecipientsPanel;
|
||||||
import org.thoughtcrime.securesms.contacts.ContactAccessor;
|
import org.thoughtcrime.securesms.contacts.ContactAccessor;
|
||||||
import org.thoughtcrime.securesms.contacts.ContactAccessor.ContactData;
|
import org.thoughtcrime.securesms.contacts.ContactAccessor.ContactData;
|
||||||
|
import org.thoughtcrime.securesms.contacts.ContactPhotoFactory;
|
||||||
import org.thoughtcrime.securesms.crypto.KeyExchangeInitiator;
|
import org.thoughtcrime.securesms.crypto.KeyExchangeInitiator;
|
||||||
import org.thoughtcrime.securesms.crypto.KeyExchangeProcessor;
|
import org.thoughtcrime.securesms.crypto.KeyExchangeProcessor;
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||||
@ -80,6 +85,7 @@ import org.thoughtcrime.securesms.sms.OutgoingEncryptedMessage;
|
|||||||
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
|
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
|
||||||
import org.thoughtcrime.securesms.util.ActionBarUtil;
|
import org.thoughtcrime.securesms.util.ActionBarUtil;
|
||||||
import org.thoughtcrime.securesms.util.BitmapDecodingException;
|
import org.thoughtcrime.securesms.util.BitmapDecodingException;
|
||||||
|
import org.thoughtcrime.securesms.util.BitmapUtil;
|
||||||
import org.thoughtcrime.securesms.util.CharacterCalculator;
|
import org.thoughtcrime.securesms.util.CharacterCalculator;
|
||||||
import org.thoughtcrime.securesms.util.DynamicLanguage;
|
import org.thoughtcrime.securesms.util.DynamicLanguage;
|
||||||
import org.thoughtcrime.securesms.util.DynamicTheme;
|
import org.thoughtcrime.securesms.util.DynamicTheme;
|
||||||
@ -486,8 +492,12 @@ public class ConversationActivity extends PassphraseRequiredSherlockFragmentActi
|
|||||||
}
|
}
|
||||||
} else if (isGroupConversation()) {
|
} else if (isGroupConversation()) {
|
||||||
if (isPushGroupConversation()) {
|
if (isPushGroupConversation()) {
|
||||||
Log.i(TAG, "name: " + getRecipients().getPrimaryRecipient().getName() + ", number: " + getRecipients().getPrimaryRecipient().getNumber() + ", avatar?: " + (getRecipients().getPrimaryRecipient().getContactPhoto() != null));
|
final String groupName = getRecipients().getPrimaryRecipient().getName();
|
||||||
title = getRecipients().getPrimaryRecipient().getName();
|
title = (!TextUtils.isEmpty(groupName)) ? groupName : getString(R.string.ConversationActivity_unnamed_group);
|
||||||
|
final Bitmap avatar = getRecipients().getPrimaryRecipient().getContactPhoto();
|
||||||
|
if (avatar != null) {
|
||||||
|
getSupportActionBar().setIcon(new BitmapDrawable(getResources(), BitmapUtil.getCroppedBitmap(avatar)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
title = getString(R.string.ConversationActivity_group_conversation);
|
title = getString(R.string.ConversationActivity_group_conversation);
|
||||||
|
@ -27,6 +27,7 @@ import android.provider.Contacts.Intents;
|
|||||||
import android.provider.ContactsContract.QuickContact;
|
import android.provider.ContactsContract.QuickContact;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
import android.text.SpannableStringBuilder;
|
import android.text.SpannableStringBuilder;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.text.style.StyleSpan;
|
import android.text.style.StyleSpan;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -66,7 +67,6 @@ public class ConversationListItem extends RelativeLayout
|
|||||||
private boolean read;
|
private boolean read;
|
||||||
|
|
||||||
private ImageView contactPhotoImage;
|
private ImageView contactPhotoImage;
|
||||||
private QuickContactBadge contactPhotoBadge;
|
|
||||||
|
|
||||||
private final Handler handler = new Handler();
|
private final Handler handler = new Handler();
|
||||||
private int distributionType;
|
private int distributionType;
|
||||||
@ -87,7 +87,6 @@ public class ConversationListItem extends RelativeLayout
|
|||||||
this.fromView = (TextView) findViewById(R.id.from);
|
this.fromView = (TextView) findViewById(R.id.from);
|
||||||
this.dateView = (TextView) findViewById(R.id.date);
|
this.dateView = (TextView) findViewById(R.id.date);
|
||||||
|
|
||||||
this.contactPhotoBadge = (QuickContactBadge) findViewById(R.id.contact_photo_badge);
|
|
||||||
this.contactPhotoImage = (ImageView) findViewById(R.id.contact_photo_image);
|
this.contactPhotoImage = (ImageView) findViewById(R.id.contact_photo_image);
|
||||||
|
|
||||||
initializeContactWidgetVisibility();
|
initializeContactWidgetVisibility();
|
||||||
@ -167,14 +166,30 @@ public class ConversationListItem extends RelativeLayout
|
|||||||
int attributes[] = new int[] {R.attr.conversation_list_item_count_color};
|
int attributes[] = new int[] {R.attr.conversation_list_item_count_color};
|
||||||
TypedArray colors = context.obtainStyledAttributes(attributes);
|
TypedArray colors = context.obtainStyledAttributes(attributes);
|
||||||
|
|
||||||
String fromString = from.toShortString();
|
final String fromString;
|
||||||
|
final boolean isUnnamedGroup = from.isGroupRecipient() && TextUtils.isEmpty(from.getPrimaryRecipient().getName());
|
||||||
|
if (isUnnamedGroup) {
|
||||||
|
fromString = context.getString(R.string.ConversationActivity_unnamed_group);
|
||||||
|
} else {
|
||||||
|
fromString = from.toShortString();
|
||||||
|
}
|
||||||
SpannableStringBuilder builder = new SpannableStringBuilder(fromString);
|
SpannableStringBuilder builder = new SpannableStringBuilder(fromString);
|
||||||
|
|
||||||
if (!read) {
|
|
||||||
builder.setSpan(new StyleSpan(Typeface.BOLD), 0, builder.length(),
|
final int typeface;
|
||||||
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
|
if (isUnnamedGroup) {
|
||||||
|
if (!read) typeface = Typeface.BOLD_ITALIC;
|
||||||
|
else typeface = Typeface.ITALIC;
|
||||||
|
} else if (!read) {
|
||||||
|
typeface = Typeface.BOLD;
|
||||||
|
} else {
|
||||||
|
typeface = Typeface.NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
builder.setSpan(new StyleSpan(typeface), 0, builder.length(),
|
||||||
|
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||||
|
|
||||||
|
|
||||||
colors.recycle();
|
colors.recycle();
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,15 @@ public class ContactPhotoFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Bitmap getDefaultGroupPhoto(Context context) {
|
||||||
|
synchronized (defaultPhotoLock) {
|
||||||
|
if (defaultContactPhoto == null)
|
||||||
|
defaultContactPhoto = BitmapFactory.decodeResource(context.getResources(),
|
||||||
|
R.drawable.ic_contact_picture);
|
||||||
|
return defaultContactPhoto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static Bitmap getLocalUserContactPhoto(Context context, Uri uri) {
|
public static Bitmap getLocalUserContactPhoto(Context context, Uri uri) {
|
||||||
if (uri == null) return getDefaultContactPhoto(context);
|
if (uri == null) return getDefaultContactPhoto(context);
|
||||||
|
|
||||||
|
@ -66,16 +66,19 @@ public class RecipientProvider {
|
|||||||
|
|
||||||
Recipient recipient;
|
Recipient recipient;
|
||||||
RecipientDetails details;
|
RecipientDetails details;
|
||||||
|
|
||||||
String number = CanonicalAddressDatabase.getInstance(context).getAddressFromId(String.valueOf(recipientId));
|
String number = CanonicalAddressDatabase.getInstance(context).getAddressFromId(String.valueOf(recipientId));
|
||||||
|
final boolean isGroupRecipient = GroupUtil.isEncodedGroup(number);
|
||||||
|
|
||||||
if (GroupUtil.isEncodedGroup(number)) details = getGroupRecipientDetails(context, number);
|
if (isGroupRecipient) details = getGroupRecipientDetails(context, number);
|
||||||
else details = getRecipientDetails(context, number);
|
else details = getRecipientDetails(context, number);
|
||||||
|
|
||||||
if (details != null) {
|
if (details != null) {
|
||||||
recipient = new Recipient(details.name, number, recipientId, details.contactUri, details.avatar);
|
recipient = new Recipient(details.name, number, recipientId, details.contactUri, details.avatar);
|
||||||
} else {
|
} else {
|
||||||
recipient = new Recipient(null, number, recipientId, null, ContactPhotoFactory.getDefaultContactPhoto(context));
|
final Bitmap defaultPhoto = isGroupRecipient
|
||||||
|
? ContactPhotoFactory.getDefaultGroupPhoto(context)
|
||||||
|
: ContactPhotoFactory.getDefaultContactPhoto(context);
|
||||||
|
recipient = new Recipient(null, number, recipientId, null, defaultPhoto);
|
||||||
}
|
}
|
||||||
|
|
||||||
recipientCache.put(recipientId, recipient);
|
recipientCache.put(recipientId, recipient);
|
||||||
@ -86,12 +89,13 @@ public class RecipientProvider {
|
|||||||
Log.w("RecipientProvider", "Cache miss [ASYNC]!");
|
Log.w("RecipientProvider", "Cache miss [ASYNC]!");
|
||||||
|
|
||||||
final String number = CanonicalAddressDatabase.getInstance(context).getAddressFromId(String.valueOf(recipientId));
|
final String number = CanonicalAddressDatabase.getInstance(context).getAddressFromId(String.valueOf(recipientId));
|
||||||
|
final boolean isGroupRecipient = GroupUtil.isEncodedGroup(number);
|
||||||
|
|
||||||
Callable<RecipientDetails> task = new Callable<RecipientDetails>() {
|
Callable<RecipientDetails> task = new Callable<RecipientDetails>() {
|
||||||
@Override
|
@Override
|
||||||
public RecipientDetails call() throws Exception {
|
public RecipientDetails call() throws Exception {
|
||||||
if (GroupUtil.isEncodedGroup(number)) return getGroupRecipientDetails(context, number);
|
if (isGroupRecipient) return getGroupRecipientDetails(context, number);
|
||||||
else return getRecipientDetails(context, number);
|
else return getRecipientDetails(context, number);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -99,7 +103,10 @@ public class RecipientProvider {
|
|||||||
|
|
||||||
asyncRecipientResolver.submit(future);
|
asyncRecipientResolver.submit(future);
|
||||||
|
|
||||||
Recipient recipient = new Recipient(number, ContactPhotoFactory.getDefaultContactPhoto(context), recipientId, future);
|
final Bitmap defaultPhoto = isGroupRecipient
|
||||||
|
? ContactPhotoFactory.getDefaultGroupPhoto(context)
|
||||||
|
: ContactPhotoFactory.getDefaultContactPhoto(context);
|
||||||
|
Recipient recipient = new Recipient(number, defaultPhoto, recipientId, future);
|
||||||
recipientCache.put(recipientId, recipient);
|
recipientCache.put(recipientId, recipient);
|
||||||
|
|
||||||
return recipient;
|
return recipient;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user