diff --git a/res/drawable-hdpi/ic_profile_default.png b/res/drawable-hdpi/ic_profile_default.png new file mode 100644 index 0000000000..f6ed109ece Binary files /dev/null and b/res/drawable-hdpi/ic_profile_default.png differ diff --git a/res/drawable-mdpi/ic_profile_default.png b/res/drawable-mdpi/ic_profile_default.png new file mode 100644 index 0000000000..c17844bd5d Binary files /dev/null and b/res/drawable-mdpi/ic_profile_default.png differ diff --git a/res/drawable-xhdpi/ic_profile_default.png b/res/drawable-xhdpi/ic_profile_default.png new file mode 100644 index 0000000000..79d9beff28 Binary files /dev/null and b/res/drawable-xhdpi/ic_profile_default.png differ diff --git a/res/drawable-xxhdpi/ic_profile_default.png b/res/drawable-xxhdpi/ic_profile_default.png new file mode 100644 index 0000000000..9e1c67e6cc Binary files /dev/null and b/res/drawable-xxhdpi/ic_profile_default.png differ diff --git a/res/drawable-xxxhdpi/ic_profile_default.png b/res/drawable-xxxhdpi/ic_profile_default.png new file mode 100644 index 0000000000..86a661a7ab Binary files /dev/null and b/res/drawable-xxxhdpi/ic_profile_default.png differ diff --git a/res/layout/conversation_list_activity.xml b/res/layout/conversation_list_activity.xml index 263db68be1..a0cf04f1c8 100644 --- a/res/layout/conversation_list_activity.xml +++ b/res/layout/conversation_list_activity.xml @@ -23,7 +23,8 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - handleDisplaySettings()); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); diff --git a/src/org/thoughtcrime/securesms/components/AvatarImageView.java b/src/org/thoughtcrime/securesms/components/AvatarImageView.java index f16e44d504..8bb1bfae11 100644 --- a/src/org/thoughtcrime/securesms/components/AvatarImageView.java +++ b/src/org/thoughtcrime/securesms/components/AvatarImageView.java @@ -15,6 +15,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.avatars.ContactColors; import org.thoughtcrime.securesms.contacts.avatars.GeneratedContactPhoto; +import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; @@ -57,7 +58,7 @@ public class AvatarImageView extends AppCompatImageView { .into(this); setAvatarClickHandler(recipient, quickContactEnabled); } else { - setImageDrawable(new GeneratedContactPhoto("#").asDrawable(getContext(), ContactColors.UNKNOWN_COLOR.toConversationColor(getContext()), inverted)); + setImageDrawable(new ResourceContactPhoto(R.drawable.ic_profile_default).asDrawable(getContext(), ContactColors.UNKNOWN_COLOR.toConversationColor(getContext()), inverted)); super.setOnClickListener(listener); } } diff --git a/src/org/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto.java b/src/org/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto.java index af1ded0b95..5464486ce0 100644 --- a/src/org/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto.java +++ b/src/org/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto.java @@ -6,6 +6,8 @@ import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.support.annotation.NonNull; +import android.support.annotation.DrawableRes; +import android.support.annotation.Nullable; import android.support.v7.content.res.AppCompatResources; import android.text.TextUtils; @@ -23,37 +25,43 @@ public class GeneratedContactPhoto implements FallbackContactPhoto { private static final Typeface TYPEFACE = Typeface.create("sans-serif-medium", Typeface.NORMAL); private final String name; + private final int fallbackResId; - public GeneratedContactPhoto(@NonNull String name) { - this.name = name; + public GeneratedContactPhoto(@NonNull String name, @DrawableRes int fallbackResId) { + this.name = name; + this.fallbackResId = fallbackResId; } @Override public Drawable asDrawable(Context context, int color) { - return asDrawable(context, color, false); + return asDrawable(context, color,false); } @Override public Drawable asDrawable(Context context, int color, boolean inverted) { int targetSize = context.getResources().getDimensionPixelSize(R.dimen.contact_photo_target_size); + String character = getAbbreviation(name); - Drawable base = TextDrawable.builder() - .beginConfig() - .width(targetSize) - .height(targetSize) - .useFont(TYPEFACE) - .fontSize(ViewUtil.dpToPx(context, 24)) - .textColor(inverted ? color : Color.WHITE) - .endConfig() - .buildRound(getAbbreviation(name), inverted ? Color.WHITE : color); + if (!TextUtils.isEmpty(character)) { + Drawable base = TextDrawable.builder() + .beginConfig() + .width(targetSize) + .height(targetSize) + .useFont(TYPEFACE) + .fontSize(ViewUtil.dpToPx(context, 24)) + .textColor(inverted ? color : Color.WHITE) + .endConfig() + .buildRound(character, inverted ? Color.WHITE : color); - Drawable gradient = context.getResources().getDrawable(ThemeUtil.isDarkTheme(context) ? R.drawable.avatar_gradient_dark - : R.drawable.avatar_gradient_light); + Drawable gradient = context.getResources().getDrawable(ThemeUtil.isDarkTheme(context) ? R.drawable.avatar_gradient_dark + : R.drawable.avatar_gradient_light); + return new LayerDrawable(new Drawable[] { base, gradient }); + } - return new LayerDrawable(new Drawable[] { base, gradient }); + return new ResourceContactPhoto(fallbackResId).asDrawable(context, color, inverted); } - private String getAbbreviation(String name) { + private @Nullable String getAbbreviation(String name) { String[] parts = name.split(" "); StringBuilder builder = new StringBuilder(); int count = 0; @@ -67,7 +75,7 @@ public class GeneratedContactPhoto implements FallbackContactPhoto { } if (builder.length() == 0) { - return "#"; + return null; } else { return builder.toString(); } diff --git a/src/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java b/src/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java index 45c60fc91a..db5ef29d08 100644 --- a/src/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java +++ b/src/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java @@ -92,7 +92,7 @@ public class SingleRecipientNotificationBuilder extends AbstractNotificationBuil } else { setContentTitle(context.getString(R.string.SingleRecipientNotificationBuilder_signal)); - setLargeIcon(new GeneratedContactPhoto("Unknown").asDrawable(context, ContactColors.UNKNOWN_COLOR.toConversationColor(context))); + setLargeIcon(new GeneratedContactPhoto("Unknown", R.drawable.ic_profile_default).asDrawable(context, ContactColors.UNKNOWN_COLOR.toConversationColor(context))); } } diff --git a/src/org/thoughtcrime/securesms/recipients/Recipient.java b/src/org/thoughtcrime/securesms/recipients/Recipient.java index daedd4e23a..602b5b921f 100644 --- a/src/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/src/org/thoughtcrime/securesms/recipients/Recipient.java @@ -425,8 +425,8 @@ public class Recipient implements RecipientModifiedListener { public synchronized @NonNull FallbackContactPhoto getFallbackContactPhoto() { if (isResolving()) return new TransparentContactPhoto(); else if (isGroupRecipient()) return new ResourceContactPhoto(R.drawable.ic_group_white_24dp, R.drawable.ic_group_large); - else if (!TextUtils.isEmpty(name)) return new GeneratedContactPhoto(name); - else return new GeneratedContactPhoto("#"); + else if (!TextUtils.isEmpty(name)) return new GeneratedContactPhoto(name, R.drawable.ic_profile_default); + else return new ResourceContactPhoto(R.drawable.ic_profile_default); } public synchronized @Nullable ContactPhoto getContactPhoto() {