Loading core/java/com/android/internal/widget/ConversationLayout.java +37 −15 Original line number Diff line number Diff line Loading @@ -173,6 +173,8 @@ public class ConversationLayout extends FrameLayout private ConversationHeaderData mConversationHeaderData; private int mSpacingForExpander; private int mSpacingForImage; private LinearLayout mConversationContentView; private int mSummarizationStartMargin; public ConversationLayout(@NonNull Context context) { super(context); Loading Loading @@ -337,6 +339,10 @@ public class ConversationLayout extends FrameLayout mAppName.setOnVisibilityChangedListener((visibility) -> { onAppNameVisibilityChanged(); }); mConversationContentView = findViewById(R.id.notification_main_column); mSummarizationStartMargin = getResources().getDimensionPixelSize( R.dimen.notification_2025_content_margin_start_summarization); } @RemotableViewMethod Loading Loading @@ -435,19 +441,7 @@ public class ConversationLayout extends FrameLayout @RemotableViewMethod(asyncImpl = "setIsCollapsedAsync") public void setIsCollapsed(boolean isCollapsed) { mIsCollapsed = isCollapsed; int maxLines = Integer.MAX_VALUE; if (isCollapsed) { if (!TextUtils.isEmpty(mSummarizedContent)) { maxLines = MAX_SUMMARIZATION_LINES; } else { if (android.app.Flags.nmCollapsedLines()) { maxLines = 2; } else { maxLines = 1; } } } mMessagingLinearLayout.setMaxDisplayedLines(maxLines); updateExpandButton(); updateContentEndPaddings(); } Loading Loading @@ -496,7 +490,7 @@ public class ConversationLayout extends FrameLayout List<MessagingMessage> newMessagingMessages; mSummarizedContent = extras.getCharSequence(Notification.EXTRA_SUMMARIZED_CONTENT); if (!TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed) { if (isShowingSummarization()) { Notification.MessagingStyle.Message summary = new Notification.MessagingStyle.Message(mSummarizedContent, 0, ""); newMessagingMessages = Loading Loading @@ -605,6 +599,8 @@ public class ConversationLayout extends FrameLayout setUser(messagingData.getUser()); setUnreadCount(messagingData.getUnreadCount()); updateViewsForSummarization(); // Copy our groups, before they get clobbered ArrayList<MessagingGroup> oldGroups = new ArrayList<>(mGroups); Loading Loading @@ -1101,6 +1097,10 @@ public class ConversationLayout extends FrameLayout return mConversationText.getText(); } private boolean isShowingSummarization() { return !TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed; } private void removeGroups(ArrayList<MessagingGroup> oldGroups) { int size = oldGroups.size(); for (int i = 0; i < size; i++) { Loading Loading @@ -1288,7 +1288,7 @@ public class ConversationLayout extends FrameLayout mMessagingLinearLayout.removeView(newGroup); mMessagingLinearLayout.addView(newGroup, groupIndex); } newGroup.setMessages(group); newGroup.setMessages(group, isShowingSummarization()); } if (Flags.dropNonExistingMessages()) { Loading Loading @@ -1756,6 +1756,28 @@ public class ConversationLayout extends FrameLayout updateContentEndPaddings(); } private void updateViewsForSummarization() { int maxLines = Integer.MAX_VALUE; if (isShowingSummarization()) { maxLines = MAX_SUMMARIZATION_LINES; } else if (mIsCollapsed) { if (android.app.Flags.nmCollapsedLines()) { maxLines = 2; } else { maxLines = 1; } } mMessagingLinearLayout.setMaxDisplayedLines(maxLines); if (isShowingSummarization()) { ViewGroup.LayoutParams lp = mConversationContentView.getLayoutParams(); if (lp != null && lp instanceof MarginLayoutParams) { final MarginLayoutParams mlp = (MarginLayoutParams) lp; mlp.setMarginStart(mSummarizationStartMargin); // this happens before layout, so we don't need to explicitly ask for one } } } @Override public void setMessagingClippingDisabled(boolean clippingDisabled) { mMessagingLinearLayout.setClipBounds(clippingDisabled ? null : mMessagingClipRect); Loading core/java/com/android/internal/widget/MessagingGroup.java +2 −1 Original line number Diff line number Diff line Loading @@ -528,12 +528,13 @@ public class MessagingGroup extends NotificationOptimizedLinearLayout implements } } public void setMessages(List<MessagingMessage> group) { public void setMessages(List<MessagingMessage> group, boolean showingSummarization) { // Let's now make sure all children are added and in the correct order int textMessageIndex = 0; MessagingImageMessage isolatedMessage = null; for (int messageIndex = 0; messageIndex < group.size(); messageIndex++) { MessagingMessage message = group.get(messageIndex); message.updateViewForSummarization(showingSummarization); if (message.getGroup() != this) { message.setMessagingGroup(this); mAddedMessages.add(message); Loading core/java/com/android/internal/widget/MessagingLayout.java +37 −7 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RemoteViews; import android.widget.flags.Flags; Loading Loading @@ -97,6 +98,8 @@ public class MessagingLayout extends FrameLayout private CharSequence mSummarizedContent; private int mSpacingForExpander; private int mSpacingForImage; private LinearLayout mMessageContentView; private int mSummarizationStartMargin; public MessagingLayout(@NonNull Context context) { super(context); Loading Loading @@ -156,6 +159,10 @@ public class MessagingLayout extends FrameLayout int size = Math.max(displayMetrics.widthPixels, displayMetrics.heightPixels); mMessagingClipRect = new Rect(0, 0, size, size); setMessagingClippingDisabled(false); mMessageContentView = findViewById(R.id.notification_main_column); mSummarizationStartMargin = getResources().getDimensionPixelSize( R.dimen.notification_2025_content_margin_start_summarization); } @RemotableViewMethod(asyncImpl = "setAvatarReplacementAsync") Loading Loading @@ -192,10 +199,6 @@ public class MessagingLayout extends FrameLayout @RemotableViewMethod(asyncImpl = "setIsCollapsedAsync") public void setIsCollapsed(boolean isCollapsed) { mIsCollapsed = isCollapsed; if (mIsCollapsed) { mMessagingLinearLayout.setMaxDisplayedLines( android.app.Flags.nmCollapsedLines() ? 2 : 1); } } /** Loading Loading @@ -263,8 +266,7 @@ public class MessagingLayout extends FrameLayout /* isHistoric= */true, usePrecomputedText, false); List<MessagingMessage> newMessagingMessages; mSummarizedContent = extras.getCharSequence(Notification.EXTRA_SUMMARIZED_CONTENT); if (!TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed) { mMessagingLinearLayout.setMaxDisplayedLines(MAX_SUMMARIZATION_LINES); if (isShowingSummarization()) { Notification.MessagingStyle.Message summary = new Notification.MessagingStyle.Message(mSummarizedContent, 0, ""); newMessagingMessages = Loading Loading @@ -346,9 +348,37 @@ public class MessagingLayout extends FrameLayout } } private void updateViewsForSummarization() { int maxLines = Integer.MAX_VALUE; if (isShowingSummarization()) { maxLines = MAX_SUMMARIZATION_LINES; } else if (mIsCollapsed) { if (android.app.Flags.nmCollapsedLines()) { maxLines = 2; } else { maxLines = 1; } } mMessagingLinearLayout.setMaxDisplayedLines(maxLines); if (isShowingSummarization()) { ViewGroup.LayoutParams lp = mMessageContentView.getLayoutParams(); if (lp != null && lp instanceof MarginLayoutParams) { final MarginLayoutParams mlp = (MarginLayoutParams) lp; mlp.setMarginStart(mSummarizationStartMargin); // this happens before layout, so we don't need to explicitly ask for one } } } private boolean isShowingSummarization() { return !TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed; } private void bind(MessagingData messagingData) { setUser(messagingData.getUser()); updateViewsForSummarization(); // Let's now create the views and reorder them accordingly ArrayList<MessagingGroup> oldGroups = new ArrayList<>(mGroups); createGroupViews(messagingData.getGroups(), messagingData.getSenders(), Loading Loading @@ -652,7 +682,7 @@ public class MessagingLayout extends FrameLayout mMessagingLinearLayout.removeView(newGroup); mMessagingLinearLayout.addView(newGroup, groupIndex); } newGroup.setMessages(group); newGroup.setMessages(group, isShowingSummarization()); } if (Flags.dropNonExistingMessages()) { Loading core/java/com/android/internal/widget/MessagingMessage.java +2 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,8 @@ public interface MessagingMessage extends MessagingLinearLayout.MessagingChild { int getVisibility(); default void updateViewForSummarization(boolean summarizationShowing) {} /** * Finalize inflation of the MessagingMessages, which should be called on Main Thread. * @hide Loading core/java/com/android/internal/widget/MessagingTextMessage.java +19 −3 Original line number Diff line number Diff line Loading @@ -92,9 +92,6 @@ public class MessagingTextMessage extends ImageFloatingTextView implements Messa R.layout.notification_template_messaging_text_message, messagingLinearLayout, false); if (useItalics) { createdMessage.setTypeface(Typeface.DEFAULT, Typeface.ITALIC); } createdMessage.addOnLayoutChangeListener(MessagingLayout.MESSAGING_PROPERTY_ANIMATOR); } createdMessage.setMessage(m, usePrecomputedText); Loading Loading @@ -152,6 +149,25 @@ public class MessagingTextMessage extends ImageFloatingTextView implements Messa setTextColor(color); } @Override public void updateViewForSummarization(boolean summarizationShowing) { if (summarizationShowing) { // Summarization text is italic, so we have to add space for it or characters like 'j' // will be cut off setPaddingRelative(mContext.getResources().getDimensionPixelSize( R.dimen.notification_text_message_start_padding_summarization), getPaddingTop(), getPaddingEnd(), getPaddingBottom()); setTypeface(Typeface.create("variable-body-medium", Typeface.ITALIC)); setShadowLayer(25f, 0f, 0f, 0); } else { setPaddingRelative(mContext.getResources().getDimensionPixelSize( R.dimen.notification_text_message_start_padding), getPaddingTop(), getPaddingEnd(), getPaddingBottom()); setTextAppearance(R.style.TextAppearance_DeviceDefault_Notification); setShadowLayer(0f, 0f, 0f, 0); } } @Override public void finalizeInflate() { try { Loading Loading
core/java/com/android/internal/widget/ConversationLayout.java +37 −15 Original line number Diff line number Diff line Loading @@ -173,6 +173,8 @@ public class ConversationLayout extends FrameLayout private ConversationHeaderData mConversationHeaderData; private int mSpacingForExpander; private int mSpacingForImage; private LinearLayout mConversationContentView; private int mSummarizationStartMargin; public ConversationLayout(@NonNull Context context) { super(context); Loading Loading @@ -337,6 +339,10 @@ public class ConversationLayout extends FrameLayout mAppName.setOnVisibilityChangedListener((visibility) -> { onAppNameVisibilityChanged(); }); mConversationContentView = findViewById(R.id.notification_main_column); mSummarizationStartMargin = getResources().getDimensionPixelSize( R.dimen.notification_2025_content_margin_start_summarization); } @RemotableViewMethod Loading Loading @@ -435,19 +441,7 @@ public class ConversationLayout extends FrameLayout @RemotableViewMethod(asyncImpl = "setIsCollapsedAsync") public void setIsCollapsed(boolean isCollapsed) { mIsCollapsed = isCollapsed; int maxLines = Integer.MAX_VALUE; if (isCollapsed) { if (!TextUtils.isEmpty(mSummarizedContent)) { maxLines = MAX_SUMMARIZATION_LINES; } else { if (android.app.Flags.nmCollapsedLines()) { maxLines = 2; } else { maxLines = 1; } } } mMessagingLinearLayout.setMaxDisplayedLines(maxLines); updateExpandButton(); updateContentEndPaddings(); } Loading Loading @@ -496,7 +490,7 @@ public class ConversationLayout extends FrameLayout List<MessagingMessage> newMessagingMessages; mSummarizedContent = extras.getCharSequence(Notification.EXTRA_SUMMARIZED_CONTENT); if (!TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed) { if (isShowingSummarization()) { Notification.MessagingStyle.Message summary = new Notification.MessagingStyle.Message(mSummarizedContent, 0, ""); newMessagingMessages = Loading Loading @@ -605,6 +599,8 @@ public class ConversationLayout extends FrameLayout setUser(messagingData.getUser()); setUnreadCount(messagingData.getUnreadCount()); updateViewsForSummarization(); // Copy our groups, before they get clobbered ArrayList<MessagingGroup> oldGroups = new ArrayList<>(mGroups); Loading Loading @@ -1101,6 +1097,10 @@ public class ConversationLayout extends FrameLayout return mConversationText.getText(); } private boolean isShowingSummarization() { return !TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed; } private void removeGroups(ArrayList<MessagingGroup> oldGroups) { int size = oldGroups.size(); for (int i = 0; i < size; i++) { Loading Loading @@ -1288,7 +1288,7 @@ public class ConversationLayout extends FrameLayout mMessagingLinearLayout.removeView(newGroup); mMessagingLinearLayout.addView(newGroup, groupIndex); } newGroup.setMessages(group); newGroup.setMessages(group, isShowingSummarization()); } if (Flags.dropNonExistingMessages()) { Loading Loading @@ -1756,6 +1756,28 @@ public class ConversationLayout extends FrameLayout updateContentEndPaddings(); } private void updateViewsForSummarization() { int maxLines = Integer.MAX_VALUE; if (isShowingSummarization()) { maxLines = MAX_SUMMARIZATION_LINES; } else if (mIsCollapsed) { if (android.app.Flags.nmCollapsedLines()) { maxLines = 2; } else { maxLines = 1; } } mMessagingLinearLayout.setMaxDisplayedLines(maxLines); if (isShowingSummarization()) { ViewGroup.LayoutParams lp = mConversationContentView.getLayoutParams(); if (lp != null && lp instanceof MarginLayoutParams) { final MarginLayoutParams mlp = (MarginLayoutParams) lp; mlp.setMarginStart(mSummarizationStartMargin); // this happens before layout, so we don't need to explicitly ask for one } } } @Override public void setMessagingClippingDisabled(boolean clippingDisabled) { mMessagingLinearLayout.setClipBounds(clippingDisabled ? null : mMessagingClipRect); Loading
core/java/com/android/internal/widget/MessagingGroup.java +2 −1 Original line number Diff line number Diff line Loading @@ -528,12 +528,13 @@ public class MessagingGroup extends NotificationOptimizedLinearLayout implements } } public void setMessages(List<MessagingMessage> group) { public void setMessages(List<MessagingMessage> group, boolean showingSummarization) { // Let's now make sure all children are added and in the correct order int textMessageIndex = 0; MessagingImageMessage isolatedMessage = null; for (int messageIndex = 0; messageIndex < group.size(); messageIndex++) { MessagingMessage message = group.get(messageIndex); message.updateViewForSummarization(showingSummarization); if (message.getGroup() != this) { message.setMessagingGroup(this); mAddedMessages.add(message); Loading
core/java/com/android/internal/widget/MessagingLayout.java +37 −7 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RemoteViews; import android.widget.flags.Flags; Loading Loading @@ -97,6 +98,8 @@ public class MessagingLayout extends FrameLayout private CharSequence mSummarizedContent; private int mSpacingForExpander; private int mSpacingForImage; private LinearLayout mMessageContentView; private int mSummarizationStartMargin; public MessagingLayout(@NonNull Context context) { super(context); Loading Loading @@ -156,6 +159,10 @@ public class MessagingLayout extends FrameLayout int size = Math.max(displayMetrics.widthPixels, displayMetrics.heightPixels); mMessagingClipRect = new Rect(0, 0, size, size); setMessagingClippingDisabled(false); mMessageContentView = findViewById(R.id.notification_main_column); mSummarizationStartMargin = getResources().getDimensionPixelSize( R.dimen.notification_2025_content_margin_start_summarization); } @RemotableViewMethod(asyncImpl = "setAvatarReplacementAsync") Loading Loading @@ -192,10 +199,6 @@ public class MessagingLayout extends FrameLayout @RemotableViewMethod(asyncImpl = "setIsCollapsedAsync") public void setIsCollapsed(boolean isCollapsed) { mIsCollapsed = isCollapsed; if (mIsCollapsed) { mMessagingLinearLayout.setMaxDisplayedLines( android.app.Flags.nmCollapsedLines() ? 2 : 1); } } /** Loading Loading @@ -263,8 +266,7 @@ public class MessagingLayout extends FrameLayout /* isHistoric= */true, usePrecomputedText, false); List<MessagingMessage> newMessagingMessages; mSummarizedContent = extras.getCharSequence(Notification.EXTRA_SUMMARIZED_CONTENT); if (!TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed) { mMessagingLinearLayout.setMaxDisplayedLines(MAX_SUMMARIZATION_LINES); if (isShowingSummarization()) { Notification.MessagingStyle.Message summary = new Notification.MessagingStyle.Message(mSummarizedContent, 0, ""); newMessagingMessages = Loading Loading @@ -346,9 +348,37 @@ public class MessagingLayout extends FrameLayout } } private void updateViewsForSummarization() { int maxLines = Integer.MAX_VALUE; if (isShowingSummarization()) { maxLines = MAX_SUMMARIZATION_LINES; } else if (mIsCollapsed) { if (android.app.Flags.nmCollapsedLines()) { maxLines = 2; } else { maxLines = 1; } } mMessagingLinearLayout.setMaxDisplayedLines(maxLines); if (isShowingSummarization()) { ViewGroup.LayoutParams lp = mMessageContentView.getLayoutParams(); if (lp != null && lp instanceof MarginLayoutParams) { final MarginLayoutParams mlp = (MarginLayoutParams) lp; mlp.setMarginStart(mSummarizationStartMargin); // this happens before layout, so we don't need to explicitly ask for one } } } private boolean isShowingSummarization() { return !TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed; } private void bind(MessagingData messagingData) { setUser(messagingData.getUser()); updateViewsForSummarization(); // Let's now create the views and reorder them accordingly ArrayList<MessagingGroup> oldGroups = new ArrayList<>(mGroups); createGroupViews(messagingData.getGroups(), messagingData.getSenders(), Loading Loading @@ -652,7 +682,7 @@ public class MessagingLayout extends FrameLayout mMessagingLinearLayout.removeView(newGroup); mMessagingLinearLayout.addView(newGroup, groupIndex); } newGroup.setMessages(group); newGroup.setMessages(group, isShowingSummarization()); } if (Flags.dropNonExistingMessages()) { Loading
core/java/com/android/internal/widget/MessagingMessage.java +2 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,8 @@ public interface MessagingMessage extends MessagingLinearLayout.MessagingChild { int getVisibility(); default void updateViewForSummarization(boolean summarizationShowing) {} /** * Finalize inflation of the MessagingMessages, which should be called on Main Thread. * @hide Loading
core/java/com/android/internal/widget/MessagingTextMessage.java +19 −3 Original line number Diff line number Diff line Loading @@ -92,9 +92,6 @@ public class MessagingTextMessage extends ImageFloatingTextView implements Messa R.layout.notification_template_messaging_text_message, messagingLinearLayout, false); if (useItalics) { createdMessage.setTypeface(Typeface.DEFAULT, Typeface.ITALIC); } createdMessage.addOnLayoutChangeListener(MessagingLayout.MESSAGING_PROPERTY_ANIMATOR); } createdMessage.setMessage(m, usePrecomputedText); Loading Loading @@ -152,6 +149,25 @@ public class MessagingTextMessage extends ImageFloatingTextView implements Messa setTextColor(color); } @Override public void updateViewForSummarization(boolean summarizationShowing) { if (summarizationShowing) { // Summarization text is italic, so we have to add space for it or characters like 'j' // will be cut off setPaddingRelative(mContext.getResources().getDimensionPixelSize( R.dimen.notification_text_message_start_padding_summarization), getPaddingTop(), getPaddingEnd(), getPaddingBottom()); setTypeface(Typeface.create("variable-body-medium", Typeface.ITALIC)); setShadowLayer(25f, 0f, 0f, 0); } else { setPaddingRelative(mContext.getResources().getDimensionPixelSize( R.dimen.notification_text_message_start_padding), getPaddingTop(), getPaddingEnd(), getPaddingBottom()); setTextAppearance(R.style.TextAppearance_DeviceDefault_Notification); setShadowLayer(0f, 0f, 0f, 0); } } @Override public void finalizeInflate() { try { Loading