diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2020-03-24 04:26:47 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-03-24 04:26:47 +0000 |
| commit | c1b17d656d39a2278a50a48bf7ea3aaec60e4c97 (patch) | |
| tree | 2f55ff7ae486d2e545ace72d19924d3d67c6c32d /core/java | |
| parent | 1bcb0c6b3506308710a268e00f6f775778b4bbe3 (diff) | |
| parent | d00d01a298bb9e4f38dafe4c902ebf0615895e8b (diff) | |
Merge changes I3f220769,I4c9af08c into rvc-dev
* changes:
Fixed the coloring of the background of the conversation icons
Add back the conversation icon in the expanded view
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/com/android/internal/widget/ConversationLayout.java | 204 | ||||
| -rw-r--r-- | core/java/com/android/internal/widget/ObservableTextView.java | 66 |
2 files changed, 219 insertions, 51 deletions
diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java index 4e7ae8a235e7..bedf55d52391 100644 --- a/core/java/com/android/internal/widget/ConversationLayout.java +++ b/core/java/com/android/internal/widget/ConversationLayout.java @@ -93,7 +93,6 @@ public class ConversationLayout extends FrameLayout private MessagingLinearLayout mMessagingLinearLayout; private boolean mShowHistoricMessages; private ArrayList<MessagingGroup> mGroups = new ArrayList<>(); - private TextView mTitleView; private int mLayoutColor; private int mSenderTextColor; private int mMessageTextColor; @@ -108,8 +107,14 @@ public class ConversationLayout extends FrameLayout private boolean mIsCollapsed; private ImageResolver mImageResolver; private ImageView mConversationIcon; + private View mConversationIconContainer; + private int mConversationIconTopPadding; + private int mConversationIconTopPaddingExpandedGroup; + private int mConversationIconTopPaddingNoAppName; + private int mExpandedGroupMessagePaddingNoAppName; private TextView mConversationText; private View mConversationIconBadge; + private ImageView mConversationIconBadgeBg; private Icon mLargeIcon; private View mExpandButtonContainer; private ViewGroup mExpandButtonAndContentContainer; @@ -117,11 +122,12 @@ public class ConversationLayout extends FrameLayout private MessagingLinearLayout mImageMessageContainer; private int mExpandButtonExpandedTopMargin; private int mBadgedSideMargins; - private int mIconSizeBadged; - private int mIconSizeCentered; + private int mConversationAvatarSize; + private int mConversationAvatarSizeExpanded; private CachingIconView mIcon; private View mImportanceRingView; - private int mExpandedGroupTopMargin; + private int mExpandedGroupSideMargin; + private int mExpandedGroupSideMarginFacePile; private View mConversationFacePile; private int mNotificationBackgroundColor; private CharSequence mFallbackChatName; @@ -133,7 +139,12 @@ public class ConversationLayout extends FrameLayout private boolean mExpandable = true; private int mContentMarginEnd; private Rect mMessagingClipRect; - private TextView mAppName; + private ObservableTextView mAppName; + private boolean mAppNameGone; + private int mFacePileAvatarSize; + private int mFacePileAvatarSizeExpandedGroup; + private int mFacePileProtectionWidth; + private int mFacePileProtectionWidthExpanded; public ConversationLayout(@NonNull Context context) { super(context); @@ -165,14 +176,15 @@ public class ConversationLayout extends FrameLayout int size = Math.max(displayMetrics.widthPixels, displayMetrics.heightPixels); mMessagingClipRect = new Rect(0, 0, size, size); setMessagingClippingDisabled(false); - mTitleView = findViewById(R.id.title); mAvatarSize = getResources().getDimensionPixelSize(R.dimen.messaging_avatar_size); mTextPaint.setTextAlign(Paint.Align.CENTER); mTextPaint.setAntiAlias(true); mConversationIcon = findViewById(R.id.conversation_icon); + mConversationIconContainer = findViewById(R.id.conversation_icon_container); mIcon = findViewById(R.id.icon); mImportanceRingView = findViewById(R.id.conversation_icon_badge_ring); mConversationIconBadge = findViewById(R.id.conversation_icon_badge); + mConversationIconBadgeBg = findViewById(R.id.conversation_icon_badge_bg); mIcon.setOnVisibilityChangedListener((visibility) -> { // Always keep the badge visibility in sync with the icon. This is necessary in cases // Where the icon is being hidden externally like in group children. @@ -192,18 +204,40 @@ public class ConversationLayout extends FrameLayout R.dimen.notification_content_margin_end); mBadgedSideMargins = getResources().getDimensionPixelSize( R.dimen.conversation_badge_side_margin); - mIconSizeBadged = getResources().getDimensionPixelSize( - R.dimen.conversation_icon_size_badged); - mIconSizeCentered = getResources().getDimensionPixelSize( - R.dimen.conversation_icon_size_centered); - mExpandedGroupTopMargin = getResources().getDimensionPixelSize( - R.dimen.conversation_icon_margin_top_centered); + mConversationAvatarSize = getResources().getDimensionPixelSize( + R.dimen.conversation_avatar_size); + mConversationAvatarSizeExpanded = getResources().getDimensionPixelSize( + R.dimen.conversation_avatar_size_group_expanded); + mConversationIconTopPadding = getResources().getDimensionPixelSize( + R.dimen.conversation_icon_container_top_padding); + mConversationIconTopPaddingExpandedGroup = getResources().getDimensionPixelSize( + R.dimen.conversation_icon_container_top_padding_small_avatar); + mConversationIconTopPaddingNoAppName = getResources().getDimensionPixelSize( + R.dimen.conversation_icon_container_top_padding_no_app_name); + mExpandedGroupMessagePaddingNoAppName = getResources().getDimensionPixelSize( + R.dimen.expanded_group_conversation_message_padding_without_app_name); + mExpandedGroupSideMargin = getResources().getDimensionPixelSize( + R.dimen.conversation_badge_side_margin_group_expanded); + mExpandedGroupSideMarginFacePile = getResources().getDimensionPixelSize( + R.dimen.conversation_badge_side_margin_group_expanded_face_pile); mConversationFacePile = findViewById(R.id.conversation_face_pile); + mFacePileAvatarSize = getResources().getDimensionPixelSize( + R.dimen.conversation_face_pile_avatar_size); + mFacePileAvatarSizeExpandedGroup = getResources().getDimensionPixelSize( + R.dimen.conversation_face_pile_avatar_size_group_expanded); + mFacePileProtectionWidth = getResources().getDimensionPixelSize( + R.dimen.conversation_face_pile_protection_width); + mFacePileProtectionWidthExpanded = getResources().getDimensionPixelSize( + R.dimen.conversation_face_pile_protection_width_expanded); mFallbackChatName = getResources().getString( R.string.conversation_title_fallback_one_to_one); mFallbackGroupChatName = getResources().getString( R.string.conversation_title_fallback_group_chat); mAppName = findViewById(R.id.app_name_text); + mAppNameGone = mAppName.getVisibility() == GONE; + mAppName.setOnVisibilityChangedListener((visibility) -> { + onAppNameVisibilityChanged(); + }); } @RemotableViewMethod @@ -234,7 +268,7 @@ public class ConversationLayout extends FrameLayout mIsCollapsed = isCollapsed; mMessagingLinearLayout.setMaxDisplayedLines(isCollapsed ? 1 : Integer.MAX_VALUE); updateExpandButton(); - updateContentPaddings(); + updateContentEndPaddings(); } @RemotableViewMethod @@ -354,21 +388,17 @@ public class ConversationLayout extends FrameLayout } } } else { - if (mIsCollapsed) { - if (mLargeIcon != null) { - mConversationIcon.setVisibility(VISIBLE); - mConversationFacePile.setVisibility(GONE); - mConversationIcon.setImageIcon(mLargeIcon); - } else { - mConversationIcon.setVisibility(GONE); - // This will also inflate it! - mConversationFacePile.setVisibility(VISIBLE); - mConversationFacePile = findViewById(R.id.conversation_face_pile); - bindFacePile(); - } - } else { + if (mLargeIcon != null) { + mConversationIcon.setVisibility(VISIBLE); mConversationFacePile.setVisibility(GONE); + mConversationIcon.setImageIcon(mLargeIcon); + } else { mConversationIcon.setVisibility(GONE); + // This will also inflate it! + mConversationFacePile.setVisibility(VISIBLE); + // rebind the value to the inflated view instead of the stub + mConversationFacePile = findViewById(R.id.conversation_face_pile); + bindFacePile(); } } if (TextUtils.isEmpty(conversationText)) { @@ -384,9 +414,10 @@ public class ConversationLayout extends FrameLayout && TextUtils.equals(conversationText, messageSender); messagingGroup.setCanHideSenderIfFirst(canHide); } + updateAppName(); updateIconPositionAndSize(); updateImageMessages(); - updateAppName(); + updatePaddingsBasedOnContentAvailability(); } private void updateImageMessages() { @@ -425,7 +456,7 @@ public class ConversationLayout extends FrameLayout private void bindFacePile() { // Let's bind the face pile - View bottomBackground = mConversationFacePile.findViewById( + ImageView bottomBackground = mConversationFacePile.findViewById( R.id.conversation_face_pile_bottom_background); applyNotificationBackgroundColor(bottomBackground); ImageView bottomView = mConversationFacePile.findViewById( @@ -463,6 +494,38 @@ public class ConversationLayout extends FrameLayout secondLastIcon = createAvatarSymbol("", "", mLayoutColor); } topView.setImageIcon(secondLastIcon); + + int conversationAvatarSize; + int facepileAvatarSize; + int facePileBackgroundSize; + if (mIsCollapsed) { + conversationAvatarSize = mConversationAvatarSize; + facepileAvatarSize = mFacePileAvatarSize; + facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidth; + } else { + conversationAvatarSize = mConversationAvatarSizeExpanded; + facepileAvatarSize = mFacePileAvatarSizeExpandedGroup; + facePileBackgroundSize = facepileAvatarSize + 2 * mFacePileProtectionWidthExpanded; + } + LayoutParams layoutParams = (LayoutParams) mConversationIcon.getLayoutParams(); + layoutParams.width = conversationAvatarSize; + layoutParams.height = conversationAvatarSize; + mConversationFacePile.setLayoutParams(layoutParams); + + layoutParams = (LayoutParams) bottomView.getLayoutParams(); + layoutParams.width = facepileAvatarSize; + layoutParams.height = facepileAvatarSize; + bottomView.setLayoutParams(layoutParams); + + layoutParams = (LayoutParams) topView.getLayoutParams(); + layoutParams.width = facepileAvatarSize; + layoutParams.height = facepileAvatarSize; + topView.setLayoutParams(layoutParams); + + layoutParams = (LayoutParams) bottomBackground.getLayoutParams(); + layoutParams.width = facePileBackgroundSize; + layoutParams.height = facePileBackgroundSize; + bottomBackground.setLayoutParams(layoutParams); } private void updateAppName() { @@ -477,30 +540,61 @@ public class ConversationLayout extends FrameLayout * update the icon position and sizing */ private void updateIconPositionAndSize() { - int gravity; - int marginStart; - int marginTop; - int iconSize; + int sidemargin; + int conversationAvatarSize; if (mIsOneToOne || mIsCollapsed) { - // Badged format - gravity = Gravity.LEFT; - marginStart = mBadgedSideMargins; - marginTop = mBadgedSideMargins; - iconSize = mIconSizeBadged; + sidemargin = mBadgedSideMargins; + conversationAvatarSize = mConversationAvatarSize; } else { - gravity = Gravity.CENTER_HORIZONTAL; - marginStart = 0; - marginTop = mExpandedGroupTopMargin; - iconSize = mIconSizeCentered; + sidemargin = mConversationFacePile.getVisibility() == VISIBLE + ? mExpandedGroupSideMarginFacePile + : mExpandedGroupSideMargin; + conversationAvatarSize = mConversationAvatarSizeExpanded; } LayoutParams layoutParams = (LayoutParams) mConversationIconBadge.getLayoutParams(); - layoutParams.gravity = gravity; - layoutParams.topMargin = marginTop; - layoutParams.setMarginStart(marginStart); - layoutParams.width = iconSize; - layoutParams.height = iconSize; + layoutParams.topMargin = sidemargin; + layoutParams.setMarginStart(sidemargin); mConversationIconBadge.setLayoutParams(layoutParams); + + if (mConversationIcon.getVisibility() == VISIBLE) { + layoutParams = (LayoutParams) mConversationIcon.getLayoutParams(); + layoutParams.width = conversationAvatarSize; + layoutParams.height = conversationAvatarSize; + mConversationIcon.setLayoutParams(layoutParams); + } + } + + private void updatePaddingsBasedOnContentAvailability() { + int containerTopPadding; + int messagingPadding = 0; + if (mIsOneToOne || mIsCollapsed) { + containerTopPadding = mConversationIconTopPadding; + } else { + if (mAppName.getVisibility() != GONE) { + // The app name is visible, let's center outselves in the two lines + containerTopPadding = mConversationIconTopPaddingExpandedGroup; + } else { + // App name is gone, let's center ourselves int he one remaining line + containerTopPadding = mConversationIconTopPaddingNoAppName; + + // The app name is gone and we're a group, we'll need to add some extra padding + // to the messages, since otherwise it will overlap with the group + messagingPadding = mExpandedGroupMessagePaddingNoAppName; + } + } + + mConversationIconContainer.setPaddingRelative( + mConversationIconContainer.getPaddingStart(), + containerTopPadding, + mConversationIconContainer.getPaddingEnd(), + mConversationIconContainer.getPaddingBottom()); + + mMessagingLinearLayout.setPaddingRelative( + mMessagingLinearLayout.getPaddingStart(), + messagingPadding, + mMessagingLinearLayout.getPaddingEnd(), + mMessagingLinearLayout.getPaddingBottom()); } @RemotableViewMethod @@ -678,11 +772,11 @@ public class ConversationLayout extends FrameLayout @RemotableViewMethod public void setNotificationBackgroundColor(int color) { mNotificationBackgroundColor = color; - applyNotificationBackgroundColor(mConversationIconBadge); + applyNotificationBackgroundColor(mConversationIconBadgeBg); } - private void applyNotificationBackgroundColor(View view) { - view.setBackgroundTintList(ColorStateList.valueOf(mNotificationBackgroundColor)); + private void applyNotificationBackgroundColor(ImageView view) { + view.setImageTintList(ColorStateList.valueOf(mNotificationBackgroundColor)); } @RemotableViewMethod @@ -922,7 +1016,7 @@ public class ConversationLayout extends FrameLayout mExpandButtonContainer.setContentDescription(mContext.getText(contentDescriptionId)); } - private void updateContentPaddings() { + private void updateContentEndPaddings() { // Let's make sure the conversation header can't run into the expand button when we're // collapsed and update the paddings of the content @@ -951,6 +1045,14 @@ public class ConversationLayout extends FrameLayout mContentContainer.getPaddingBottom()); } + private void onAppNameVisibilityChanged() { + boolean appNameGone = mAppName.getVisibility() == GONE; + if (appNameGone != mAppNameGone) { + mAppNameGone = appNameGone; + updatePaddingsBasedOnContentAvailability(); + } + } + public void updateExpandability(boolean expandable, @Nullable OnClickListener onClickListener) { mExpandable = expandable; if (expandable) { @@ -960,7 +1062,7 @@ public class ConversationLayout extends FrameLayout // TODO: handle content paddings to end of layout mExpandButtonContainer.setVisibility(GONE); } - updateContentPaddings(); + updateContentEndPaddings(); } @Override diff --git a/core/java/com/android/internal/widget/ObservableTextView.java b/core/java/com/android/internal/widget/ObservableTextView.java new file mode 100644 index 000000000000..1f3c296f0b60 --- /dev/null +++ b/core/java/com/android/internal/widget/ObservableTextView.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.internal.widget; + +import android.annotation.Nullable; +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.RemoteViews; +import android.widget.TextView; + +import java.util.function.Consumer; + +/** + * A text view whose visibility can be observed. + */ +@RemoteViews.RemoteView +public class ObservableTextView extends TextView { + + private Consumer<Integer> mOnVisibilityChangedListener; + + public ObservableTextView(Context context) { + super(context); + } + + public ObservableTextView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public ObservableTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public ObservableTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void onVisibilityChanged(View changedView, int visibility) { + super.onVisibilityChanged(changedView, visibility); + if (changedView == this) { + if (mOnVisibilityChangedListener != null) { + mOnVisibilityChangedListener.accept(visibility); + } + } + } + + public void setOnVisibilityChangedListener(Consumer<Integer> listener) { + mOnVisibilityChangedListener = listener; + } +} |
