From a4cbbd9039541ab6635cf630a17f29b42212aaa6 Mon Sep 17 00:00:00 2001 From: Blaise Date: Mon, 23 Sep 2019 11:01:42 -0500 Subject: [PATCH] Messaging: Contact Colors Adds the option to use individual colors for contacts. Matches the colors used in Contacts. Change-Id: I9f222308a900c5d47ec16f83232bd7f6d9af6cd7 --- res/values/colors.xml | 17 +++++++++++++++++ res/values/config.xml | 3 +++ .../datamodel/media/AvatarRequest.java | 19 +++++++++++++++---- .../messaging/ui/ConversationDrawables.java | 13 +++++++++++-- .../conversation/ConversationMessageView.java | 10 ++++++---- 5 files changed, 52 insertions(+), 10 deletions(-) diff --git a/res/values/colors.xml b/res/values/colors.xml index 2ccf643..b8119bc 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -102,6 +102,23 @@ #6733b5e5 #44000000 + + #DB4437 + #E91E63 + #9C27B0 + #673AB7 + #3F51B5 + #4285F4 + #039BE5 + #0097A7 + #009688 + #0F9D58 + #689F38 + #EF6C00 + #FF5722 + #757575 + + #ffffff #29000000 diff --git a/res/values/config.xml b/res/values/config.xml index 954f5ed..c3038fe 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -18,4 +18,7 @@ 0 + + + true diff --git a/src/com/android/messaging/datamodel/media/AvatarRequest.java b/src/com/android/messaging/datamodel/media/AvatarRequest.java index 6a738c7..c6b06b1 100644 --- a/src/com/android/messaging/datamodel/media/AvatarRequest.java +++ b/src/com/android/messaging/datamodel/media/AvatarRequest.java @@ -17,6 +17,7 @@ package com.android.messaging.datamodel.media; import android.content.Context; import android.content.res.Resources; +import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; @@ -27,6 +28,7 @@ import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.media.ExifInterface; import android.net.Uri; +import android.text.TextUtils; import com.android.messaging.R; import com.android.messaging.util.Assert; @@ -42,10 +44,12 @@ import java.util.List; public class AvatarRequest extends UriImageRequest { private static Bitmap sDefaultPersonBitmap; private static Bitmap sDefaultPersonBitmapLarge; + private TypedArray mColors; public AvatarRequest(final Context context, final AvatarRequestDescriptor descriptor) { super(context, descriptor); + mColors = mContext.getResources().obtainTypedArray(R.array.letter_tile_colors); } @Override @@ -116,7 +120,7 @@ public class AvatarRequest extends UriImageRequest { private Bitmap renderDefaultAvatar(final int width, final int height) { final Bitmap bitmap = getBitmapPool().createOrReuseBitmap(width, height, - getBackgroundColor()); + getBackgroundColor(AvatarUriUtil.getIdentifier(mDescriptor.uri))); final Canvas canvas = new Canvas(bitmap); if (sDefaultPersonBitmap == null) { @@ -158,7 +162,7 @@ public class AvatarRequest extends UriImageRequest { final float halfHeight = height / 2; final int minOfWidthAndHeight = Math.min(width, height); final Bitmap bitmap = getBitmapPool().createOrReuseBitmap(width, height, - getBackgroundColor()); + getBackgroundColor(AvatarUriUtil.getIdentifier(mDescriptor.uri))); final Resources resources = mContext.getResources(); final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL)); @@ -178,8 +182,15 @@ public class AvatarRequest extends UriImageRequest { return bitmap; } - private int getBackgroundColor() { - return mContext.getResources().getColor(R.color.primary_color); + private int getBackgroundColor(final String identifier) { + if (!TextUtils.isEmpty(identifier) && + mContext.getResources().getBoolean(R.bool.contact_colors)) { + int idcolor = Math.abs(identifier.hashCode()) % mColors.length(); + return mColors.getColor(idcolor, + mContext.getResources().getColor(R.color.primary_color)); + } else { + return mContext.getResources().getColor(R.color.primary_color); + } } @Override diff --git a/src/com/android/messaging/ui/ConversationDrawables.java b/src/com/android/messaging/ui/ConversationDrawables.java index cf858e2..46f483f 100644 --- a/src/com/android/messaging/ui/ConversationDrawables.java +++ b/src/com/android/messaging/ui/ConversationDrawables.java @@ -17,6 +17,7 @@ package com.android.messaging.ui; import android.content.Context; import android.content.res.Resources; +import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import com.android.messaging.Factory; @@ -52,6 +53,7 @@ public class ConversationDrawables { private int mIncomingAudioButtonColor; private int mSelectedBubbleColor; private int mThemeColor; + private TypedArray mColors; public static ConversationDrawables get() { if (sInstance == null) { @@ -102,10 +104,11 @@ public class ConversationDrawables { resources.getColor(R.color.message_audio_button_color_incoming); mSelectedBubbleColor = resources.getColor(R.color.message_bubble_color_selected); mThemeColor = resources.getColor(R.color.primary_color); + mColors = resources.obtainTypedArray(R.array.letter_tile_colors); } public Drawable getBubbleDrawable(final boolean selected, final boolean incoming, - final boolean needArrow, final boolean isError) { + final boolean needArrow, final boolean isError, final String identifier) { final Drawable protoDrawable; if (needArrow) { if (incoming) { @@ -127,7 +130,13 @@ public class ConversationDrawables { if (isError) { color = mIncomingErrorBubbleColor; } else { - color = mThemeColor; + if (identifier != null && + mContext.getResources().getBoolean(R.bool.contact_colors)) { + int idcolor = Math.abs(identifier.hashCode()) % mColors.length(); + color = mColors.getColor(idcolor, mThemeColor); + } else { + color = mThemeColor; + } } } else { color = mOutgoingBubbleColor; diff --git a/src/com/android/messaging/ui/conversation/ConversationMessageView.java b/src/com/android/messaging/ui/conversation/ConversationMessageView.java index 282e172..935a23c 100644 --- a/src/com/android/messaging/ui/conversation/ConversationMessageView.java +++ b/src/com/android/messaging/ui/conversation/ConversationMessageView.java @@ -701,7 +701,8 @@ public class ConversationMessageView extends FrameLayout implements View.OnClick isSelected(), incoming, false /* needArrow */, - mData.hasIncomingErrorStatus()); + mData.hasIncomingErrorStatus(), + mData.getSenderContactLookupKey()); textMinHeight = messageTextMinHeightDefault; textTopMargin = messageTopPaddingClustered; textTopPadding = textTopPaddingDefault; @@ -729,7 +730,8 @@ public class ConversationMessageView extends FrameLayout implements View.OnClick isSelected(), incoming, shouldShowMessageBubbleArrow(), - mData.hasIncomingErrorStatus()); + mData.hasIncomingErrorStatus(), + mData.getSenderContactLookupKey()); textMinHeight = messageTextMinHeightDefault; textTopMargin = 0; textTopPadding = textTopPaddingDefault; @@ -1121,7 +1123,7 @@ public class ConversationMessageView extends FrameLayout implements View.OnClick audioView.bindMessagePartData(attachment, mData.getIsIncoming(), isSelected()); audioView.setBackground(ConversationDrawables.get().getBubbleDrawable( isSelected(), mData.getIsIncoming(), false /* needArrow */, - mData.hasIncomingErrorStatus())); + mData.hasIncomingErrorStatus(), mData.getSenderContactLookupKey())); } @Override @@ -1138,7 +1140,7 @@ public class ConversationMessageView extends FrameLayout implements View.OnClick attachment)); personView.setBackground(ConversationDrawables.get().getBubbleDrawable( isSelected(), mData.getIsIncoming(), false /* needArrow */, - mData.hasIncomingErrorStatus())); + mData.hasIncomingErrorStatus(), mData.getSenderContactLookupKey())); final int nameTextColorRes; final int detailsTextColorRes; if (isSelected()) {