Loading core/java/android/app/Notification.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -5817,7 +5817,7 @@ public class Notification implements Parcelable PorterDuff.Mode.SRC_ATOP); PorterDuff.Mode.SRC_ATOP); } } contentView.setInt(R.id.notification_header, "setOriginalIconColor", contentView.setInt(R.id.icon, "setOriginalIconColor", colorable ? color : NotificationHeaderView.NO_COLOR); colorable ? color : NotificationHeaderView.NO_COLOR); } } Loading core/java/android/view/NotificationHeaderView.java +1 −7 Original line number Original line Diff line number Diff line Loading @@ -65,7 +65,6 @@ public class NotificationHeaderView extends ViewGroup { private View mMicIcon; private View mMicIcon; private View mAppOps; private View mAppOps; private View mAudiblyAlertedIcon; private View mAudiblyAlertedIcon; private int mIconColor; private boolean mExpanded; private boolean mExpanded; private boolean mShowExpandButtonAtEnd; private boolean mShowExpandButtonAtEnd; private boolean mShowWorkBadgeAtEnd; private boolean mShowWorkBadgeAtEnd; Loading Loading @@ -315,13 +314,8 @@ public class NotificationHeaderView extends ViewGroup { updateTouchListener(); updateTouchListener(); } } @RemotableViewMethod public void setOriginalIconColor(int color) { mIconColor = color; } public int getOriginalIconColor() { public int getOriginalIconColor() { return mIconColor; return mIcon.getOriginalIconColor(); } } public int getOriginalNotificationColor() { public int getOriginalNotificationColor() { Loading core/java/com/android/internal/widget/CachingIconView.java +47 −2 Original line number Original line Diff line number Diff line Loading @@ -46,6 +46,9 @@ public class CachingIconView extends ImageView { private boolean mForceHidden; private boolean mForceHidden; private int mDesiredVisibility; private int mDesiredVisibility; private Consumer<Integer> mOnVisibilityChangedListener; private Consumer<Integer> mOnVisibilityChangedListener; private Consumer<Boolean> mOnForceHiddenChangedListener; private int mIconColor; private boolean mWillBeForceHidden; @UnsupportedAppUsage @UnsupportedAppUsage public CachingIconView(Context context, @Nullable AttributeSet attrs) { public CachingIconView(Context context, @Nullable AttributeSet attrs) { Loading Loading @@ -184,10 +187,18 @@ public class CachingIconView extends ImageView { /** /** * Set the icon to be forcibly hidden, even when it's visibility is changed to visible. * Set the icon to be forcibly hidden, even when it's visibility is changed to visible. * This is necessary since we still want to keep certain views hidden when their visibility * is modified from other sources like the shelf. */ */ public void setForceHidden(boolean forceHidden) { public void setForceHidden(boolean forceHidden) { if (forceHidden != mForceHidden) { mForceHidden = forceHidden; mForceHidden = forceHidden; mWillBeForceHidden = false; updateVisibility(); updateVisibility(); if (mOnForceHiddenChangedListener != null) { mOnForceHiddenChangedListener.accept(forceHidden); } } } } @Override @Override Loading @@ -209,4 +220,38 @@ public class CachingIconView extends ImageView { public void setOnVisibilityChangedListener(Consumer<Integer> listener) { public void setOnVisibilityChangedListener(Consumer<Integer> listener) { mOnVisibilityChangedListener = listener; mOnVisibilityChangedListener = listener; } } public void setOnForceHiddenChangedListener(Consumer<Boolean> listener) { mOnForceHiddenChangedListener = listener; } public boolean isForceHidden() { return mForceHidden; } @RemotableViewMethod public void setOriginalIconColor(int color) { mIconColor = color; } public int getOriginalIconColor() { return mIconColor; } /** * @return if the view will be forceHidden after an animation */ public boolean willBeForceHidden() { return mWillBeForceHidden; } /** * Set that this view will be force hidden after an animation * * @param forceHidden if it will be forcehidden */ public void setWillBeForceHidden(boolean forceHidden) { mWillBeForceHidden = forceHidden; } } } core/java/com/android/internal/widget/ConversationLayout.java +98 −7 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.internal.widget; import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_EXTERNAL; import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_EXTERNAL; import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_INLINE; import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_INLINE; import static com.android.internal.widget.MessagingPropertyAnimator.ALPHA_IN; import static com.android.internal.widget.MessagingPropertyAnimator.ALPHA_OUT; import android.annotation.AttrRes; import android.annotation.AttrRes; import android.annotation.NonNull; import android.annotation.NonNull; Loading Loading @@ -106,7 +108,7 @@ public class ConversationLayout extends FrameLayout private CharSequence mNameReplacement; private CharSequence mNameReplacement; private boolean mIsCollapsed; private boolean mIsCollapsed; private ImageResolver mImageResolver; private ImageResolver mImageResolver; private ImageView mConversationIcon; private CachingIconView mConversationIcon; private View mConversationIconContainer; private View mConversationIconContainer; private int mConversationIconTopPadding; private int mConversationIconTopPadding; private int mConversationIconTopPaddingExpandedGroup; private int mConversationIconTopPaddingExpandedGroup; Loading @@ -114,7 +116,7 @@ public class ConversationLayout extends FrameLayout private int mExpandedGroupMessagePaddingNoAppName; private int mExpandedGroupMessagePaddingNoAppName; private TextView mConversationText; private TextView mConversationText; private View mConversationIconBadge; private View mConversationIconBadge; private ImageView mConversationIconBadgeBg; private CachingIconView mConversationIconBadgeBg; private Icon mLargeIcon; private Icon mLargeIcon; private View mExpandButtonContainer; private View mExpandButtonContainer; private ViewGroup mExpandButtonAndContentContainer; private ViewGroup mExpandButtonAndContentContainer; Loading @@ -125,7 +127,7 @@ public class ConversationLayout extends FrameLayout private int mConversationAvatarSize; private int mConversationAvatarSize; private int mConversationAvatarSizeExpanded; private int mConversationAvatarSizeExpanded; private CachingIconView mIcon; private CachingIconView mIcon; private View mImportanceRingView; private CachingIconView mImportanceRingView; private int mExpandedGroupSideMargin; private int mExpandedGroupSideMargin; private int mExpandedGroupSideMarginFacePile; private int mExpandedGroupSideMarginFacePile; private View mConversationFacePile; private View mConversationFacePile; Loading @@ -140,11 +142,15 @@ public class ConversationLayout extends FrameLayout private int mContentMarginEnd; private int mContentMarginEnd; private Rect mMessagingClipRect; private Rect mMessagingClipRect; private ObservableTextView mAppName; private ObservableTextView mAppName; private ViewGroup mActions; private int mConversationContentStart; private int mInternalButtonPadding; private boolean mAppNameGone; private boolean mAppNameGone; private int mFacePileAvatarSize; private int mFacePileAvatarSize; private int mFacePileAvatarSizeExpandedGroup; private int mFacePileAvatarSizeExpandedGroup; private int mFacePileProtectionWidth; private int mFacePileProtectionWidth; private int mFacePileProtectionWidthExpanded; private int mFacePileProtectionWidthExpanded; private boolean mImportantConversation; public ConversationLayout(@NonNull Context context) { public ConversationLayout(@NonNull Context context) { super(context); super(context); Loading @@ -168,6 +174,7 @@ public class ConversationLayout extends FrameLayout protected void onFinishInflate() { protected void onFinishInflate() { super.onFinishInflate(); super.onFinishInflate(); mMessagingLinearLayout = findViewById(R.id.notification_messaging); mMessagingLinearLayout = findViewById(R.id.notification_messaging); mActions = findViewById(R.id.actions); mMessagingLinearLayout.setMessagingLayout(this); mMessagingLinearLayout.setMessagingLayout(this); mImageMessageContainer = findViewById(R.id.conversation_image_message_container); mImageMessageContainer = findViewById(R.id.conversation_image_message_container); // We still want to clip, but only on the top, since views can temporarily out of bounds // We still want to clip, but only on the top, since views can temporarily out of bounds Loading @@ -186,9 +193,41 @@ public class ConversationLayout extends FrameLayout mConversationIconBadge = findViewById(R.id.conversation_icon_badge); mConversationIconBadge = findViewById(R.id.conversation_icon_badge); mConversationIconBadgeBg = findViewById(R.id.conversation_icon_badge_bg); mConversationIconBadgeBg = findViewById(R.id.conversation_icon_badge_bg); mIcon.setOnVisibilityChangedListener((visibility) -> { mIcon.setOnVisibilityChangedListener((visibility) -> { // Always keep the badge visibility in sync with the icon. This is necessary in cases // Let's hide the background directly or in an animated way boolean isGone = visibility == GONE; int oldVisibility = mConversationIconBadgeBg.getVisibility(); boolean wasGone = oldVisibility == GONE; if (wasGone != isGone) { // Keep the badge gone state in sync with the icon. This is necessary in cases // Where the icon is being hidden externally like in group children. mConversationIconBadgeBg.animate().cancel(); mConversationIconBadgeBg.setVisibility(visibility); } // Let's handle the importance ring which can also be be gone normally oldVisibility = mImportanceRingView.getVisibility(); wasGone = oldVisibility == GONE; visibility = !mImportantConversation ? GONE : visibility; isGone = visibility == GONE; if (wasGone != isGone) { // 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. // Where the icon is being hidden externally like in group children. mConversationIconBadge.setVisibility(visibility); mImportanceRingView.animate().cancel(); mImportanceRingView.setVisibility(visibility); } }); // When the small icon is gone, hide the rest of the badge mIcon.setOnForceHiddenChangedListener((forceHidden) -> { animateViewForceHidden(mConversationIconBadgeBg, forceHidden); animateViewForceHidden(mImportanceRingView, forceHidden); }); // When the conversation icon is gone, hide the whole badge mConversationIcon.setOnForceHiddenChangedListener((forceHidden) -> { animateViewForceHidden(mConversationIconBadgeBg, forceHidden); animateViewForceHidden(mImportanceRingView, forceHidden); animateViewForceHidden(mIcon, forceHidden); }); }); mConversationText = findViewById(R.id.conversation_text); mConversationText = findViewById(R.id.conversation_text); mExpandButtonContainer = findViewById(R.id.expand_button_container); mExpandButtonContainer = findViewById(R.id.expand_button_container); Loading Loading @@ -238,6 +277,33 @@ public class ConversationLayout extends FrameLayout mAppName.setOnVisibilityChangedListener((visibility) -> { mAppName.setOnVisibilityChangedListener((visibility) -> { onAppNameVisibilityChanged(); onAppNameVisibilityChanged(); }); }); mConversationContentStart = getResources().getDimensionPixelSize( R.dimen.conversation_content_start); mInternalButtonPadding = getResources().getDimensionPixelSize(R.dimen.button_padding_horizontal_material) + getResources().getDimensionPixelSize(R.dimen.button_inset_horizontal_material); } private void animateViewForceHidden(CachingIconView view, boolean forceHidden) { boolean nowForceHidden = view.willBeForceHidden() || view.isForceHidden(); if (forceHidden == nowForceHidden) { // We are either already forceHidden or will be return; } view.animate().cancel(); view.setWillBeForceHidden(forceHidden); view.animate() .scaleX(forceHidden ? 0.5f : 1.0f) .scaleY(forceHidden ? 0.5f : 1.0f) .alpha(forceHidden ? 0.0f : 1.0f) .setInterpolator(forceHidden ? ALPHA_OUT : ALPHA_IN) .setDuration(160); if (view.getVisibility() != VISIBLE) { view.setForceHidden(forceHidden); } else { view.animate().withEndAction(() -> view.setForceHidden(forceHidden)); } view.animate().start(); } } @RemotableViewMethod @RemotableViewMethod Loading @@ -255,9 +321,14 @@ public class ConversationLayout extends FrameLayout */ */ @RemotableViewMethod @RemotableViewMethod public void setIsImportantConversation(boolean isImportantConversation) { public void setIsImportantConversation(boolean isImportantConversation) { mImportantConversation = isImportantConversation; mImportanceRingView.setVisibility(isImportantConversation ? VISIBLE : GONE); mImportanceRingView.setVisibility(isImportantConversation ? VISIBLE : GONE); } } public boolean isImportantConversation() { return mImportantConversation; } /** /** * Set this layout to show the collapsed representation. * Set this layout to show the collapsed representation. * * Loading Loading @@ -363,7 +434,6 @@ public class ConversationLayout extends FrameLayout private void updateConversationLayout() { private void updateConversationLayout() { // Set avatar and name // Set avatar and name CharSequence conversationText = mConversationTitle; CharSequence conversationText = mConversationTitle; // TODO: display the secondary text somewhere if (mIsOneToOne) { if (mIsOneToOne) { // Let's resolve the icon / text from the last sender // Let's resolve the icon / text from the last sender mConversationIcon.setVisibility(VISIBLE); mConversationIcon.setVisibility(VISIBLE); Loading Loading @@ -418,6 +488,27 @@ public class ConversationLayout extends FrameLayout updateIconPositionAndSize(); updateIconPositionAndSize(); updateImageMessages(); updateImageMessages(); updatePaddingsBasedOnContentAvailability(); updatePaddingsBasedOnContentAvailability(); updateActionListPadding(); } private void updateActionListPadding() { if (mActions == null) { return; } View firstAction = mActions.getChildAt(0); if (firstAction != null) { // Let's visually position the first action where the content starts int paddingStart = mConversationContentStart; MarginLayoutParams layoutParams = (MarginLayoutParams) firstAction.getLayoutParams(); paddingStart -= layoutParams.getMarginStart(); paddingStart -= mInternalButtonPadding; mActions.setPaddingRelative(paddingStart, mActions.getPaddingTop(), mActions.getPaddingEnd(), mActions.getPaddingBottom()); } } } private void updateImageMessages() { private void updateImageMessages() { Loading core/java/com/android/internal/widget/MessagingPropertyAnimator.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -32,7 +32,7 @@ import com.android.internal.R; */ */ public class MessagingPropertyAnimator implements View.OnLayoutChangeListener { public class MessagingPropertyAnimator implements View.OnLayoutChangeListener { private static final long APPEAR_ANIMATION_LENGTH = 210; private static final long APPEAR_ANIMATION_LENGTH = 210; private static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f); public static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f); public static final Interpolator ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f); public static final Interpolator ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f); private static final int TAG_TOP_ANIMATOR = R.id.tag_top_animator; private static final int TAG_TOP_ANIMATOR = R.id.tag_top_animator; private static final int TAG_TOP = R.id.tag_top_override; private static final int TAG_TOP = R.id.tag_top_override; Loading Loading
core/java/android/app/Notification.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -5817,7 +5817,7 @@ public class Notification implements Parcelable PorterDuff.Mode.SRC_ATOP); PorterDuff.Mode.SRC_ATOP); } } contentView.setInt(R.id.notification_header, "setOriginalIconColor", contentView.setInt(R.id.icon, "setOriginalIconColor", colorable ? color : NotificationHeaderView.NO_COLOR); colorable ? color : NotificationHeaderView.NO_COLOR); } } Loading
core/java/android/view/NotificationHeaderView.java +1 −7 Original line number Original line Diff line number Diff line Loading @@ -65,7 +65,6 @@ public class NotificationHeaderView extends ViewGroup { private View mMicIcon; private View mMicIcon; private View mAppOps; private View mAppOps; private View mAudiblyAlertedIcon; private View mAudiblyAlertedIcon; private int mIconColor; private boolean mExpanded; private boolean mExpanded; private boolean mShowExpandButtonAtEnd; private boolean mShowExpandButtonAtEnd; private boolean mShowWorkBadgeAtEnd; private boolean mShowWorkBadgeAtEnd; Loading Loading @@ -315,13 +314,8 @@ public class NotificationHeaderView extends ViewGroup { updateTouchListener(); updateTouchListener(); } } @RemotableViewMethod public void setOriginalIconColor(int color) { mIconColor = color; } public int getOriginalIconColor() { public int getOriginalIconColor() { return mIconColor; return mIcon.getOriginalIconColor(); } } public int getOriginalNotificationColor() { public int getOriginalNotificationColor() { Loading
core/java/com/android/internal/widget/CachingIconView.java +47 −2 Original line number Original line Diff line number Diff line Loading @@ -46,6 +46,9 @@ public class CachingIconView extends ImageView { private boolean mForceHidden; private boolean mForceHidden; private int mDesiredVisibility; private int mDesiredVisibility; private Consumer<Integer> mOnVisibilityChangedListener; private Consumer<Integer> mOnVisibilityChangedListener; private Consumer<Boolean> mOnForceHiddenChangedListener; private int mIconColor; private boolean mWillBeForceHidden; @UnsupportedAppUsage @UnsupportedAppUsage public CachingIconView(Context context, @Nullable AttributeSet attrs) { public CachingIconView(Context context, @Nullable AttributeSet attrs) { Loading Loading @@ -184,10 +187,18 @@ public class CachingIconView extends ImageView { /** /** * Set the icon to be forcibly hidden, even when it's visibility is changed to visible. * Set the icon to be forcibly hidden, even when it's visibility is changed to visible. * This is necessary since we still want to keep certain views hidden when their visibility * is modified from other sources like the shelf. */ */ public void setForceHidden(boolean forceHidden) { public void setForceHidden(boolean forceHidden) { if (forceHidden != mForceHidden) { mForceHidden = forceHidden; mForceHidden = forceHidden; mWillBeForceHidden = false; updateVisibility(); updateVisibility(); if (mOnForceHiddenChangedListener != null) { mOnForceHiddenChangedListener.accept(forceHidden); } } } } @Override @Override Loading @@ -209,4 +220,38 @@ public class CachingIconView extends ImageView { public void setOnVisibilityChangedListener(Consumer<Integer> listener) { public void setOnVisibilityChangedListener(Consumer<Integer> listener) { mOnVisibilityChangedListener = listener; mOnVisibilityChangedListener = listener; } } public void setOnForceHiddenChangedListener(Consumer<Boolean> listener) { mOnForceHiddenChangedListener = listener; } public boolean isForceHidden() { return mForceHidden; } @RemotableViewMethod public void setOriginalIconColor(int color) { mIconColor = color; } public int getOriginalIconColor() { return mIconColor; } /** * @return if the view will be forceHidden after an animation */ public boolean willBeForceHidden() { return mWillBeForceHidden; } /** * Set that this view will be force hidden after an animation * * @param forceHidden if it will be forcehidden */ public void setWillBeForceHidden(boolean forceHidden) { mWillBeForceHidden = forceHidden; } } }
core/java/com/android/internal/widget/ConversationLayout.java +98 −7 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.internal.widget; import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_EXTERNAL; import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_EXTERNAL; import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_INLINE; import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_INLINE; import static com.android.internal.widget.MessagingPropertyAnimator.ALPHA_IN; import static com.android.internal.widget.MessagingPropertyAnimator.ALPHA_OUT; import android.annotation.AttrRes; import android.annotation.AttrRes; import android.annotation.NonNull; import android.annotation.NonNull; Loading Loading @@ -106,7 +108,7 @@ public class ConversationLayout extends FrameLayout private CharSequence mNameReplacement; private CharSequence mNameReplacement; private boolean mIsCollapsed; private boolean mIsCollapsed; private ImageResolver mImageResolver; private ImageResolver mImageResolver; private ImageView mConversationIcon; private CachingIconView mConversationIcon; private View mConversationIconContainer; private View mConversationIconContainer; private int mConversationIconTopPadding; private int mConversationIconTopPadding; private int mConversationIconTopPaddingExpandedGroup; private int mConversationIconTopPaddingExpandedGroup; Loading @@ -114,7 +116,7 @@ public class ConversationLayout extends FrameLayout private int mExpandedGroupMessagePaddingNoAppName; private int mExpandedGroupMessagePaddingNoAppName; private TextView mConversationText; private TextView mConversationText; private View mConversationIconBadge; private View mConversationIconBadge; private ImageView mConversationIconBadgeBg; private CachingIconView mConversationIconBadgeBg; private Icon mLargeIcon; private Icon mLargeIcon; private View mExpandButtonContainer; private View mExpandButtonContainer; private ViewGroup mExpandButtonAndContentContainer; private ViewGroup mExpandButtonAndContentContainer; Loading @@ -125,7 +127,7 @@ public class ConversationLayout extends FrameLayout private int mConversationAvatarSize; private int mConversationAvatarSize; private int mConversationAvatarSizeExpanded; private int mConversationAvatarSizeExpanded; private CachingIconView mIcon; private CachingIconView mIcon; private View mImportanceRingView; private CachingIconView mImportanceRingView; private int mExpandedGroupSideMargin; private int mExpandedGroupSideMargin; private int mExpandedGroupSideMarginFacePile; private int mExpandedGroupSideMarginFacePile; private View mConversationFacePile; private View mConversationFacePile; Loading @@ -140,11 +142,15 @@ public class ConversationLayout extends FrameLayout private int mContentMarginEnd; private int mContentMarginEnd; private Rect mMessagingClipRect; private Rect mMessagingClipRect; private ObservableTextView mAppName; private ObservableTextView mAppName; private ViewGroup mActions; private int mConversationContentStart; private int mInternalButtonPadding; private boolean mAppNameGone; private boolean mAppNameGone; private int mFacePileAvatarSize; private int mFacePileAvatarSize; private int mFacePileAvatarSizeExpandedGroup; private int mFacePileAvatarSizeExpandedGroup; private int mFacePileProtectionWidth; private int mFacePileProtectionWidth; private int mFacePileProtectionWidthExpanded; private int mFacePileProtectionWidthExpanded; private boolean mImportantConversation; public ConversationLayout(@NonNull Context context) { public ConversationLayout(@NonNull Context context) { super(context); super(context); Loading @@ -168,6 +174,7 @@ public class ConversationLayout extends FrameLayout protected void onFinishInflate() { protected void onFinishInflate() { super.onFinishInflate(); super.onFinishInflate(); mMessagingLinearLayout = findViewById(R.id.notification_messaging); mMessagingLinearLayout = findViewById(R.id.notification_messaging); mActions = findViewById(R.id.actions); mMessagingLinearLayout.setMessagingLayout(this); mMessagingLinearLayout.setMessagingLayout(this); mImageMessageContainer = findViewById(R.id.conversation_image_message_container); mImageMessageContainer = findViewById(R.id.conversation_image_message_container); // We still want to clip, but only on the top, since views can temporarily out of bounds // We still want to clip, but only on the top, since views can temporarily out of bounds Loading @@ -186,9 +193,41 @@ public class ConversationLayout extends FrameLayout mConversationIconBadge = findViewById(R.id.conversation_icon_badge); mConversationIconBadge = findViewById(R.id.conversation_icon_badge); mConversationIconBadgeBg = findViewById(R.id.conversation_icon_badge_bg); mConversationIconBadgeBg = findViewById(R.id.conversation_icon_badge_bg); mIcon.setOnVisibilityChangedListener((visibility) -> { mIcon.setOnVisibilityChangedListener((visibility) -> { // Always keep the badge visibility in sync with the icon. This is necessary in cases // Let's hide the background directly or in an animated way boolean isGone = visibility == GONE; int oldVisibility = mConversationIconBadgeBg.getVisibility(); boolean wasGone = oldVisibility == GONE; if (wasGone != isGone) { // Keep the badge gone state in sync with the icon. This is necessary in cases // Where the icon is being hidden externally like in group children. mConversationIconBadgeBg.animate().cancel(); mConversationIconBadgeBg.setVisibility(visibility); } // Let's handle the importance ring which can also be be gone normally oldVisibility = mImportanceRingView.getVisibility(); wasGone = oldVisibility == GONE; visibility = !mImportantConversation ? GONE : visibility; isGone = visibility == GONE; if (wasGone != isGone) { // 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. // Where the icon is being hidden externally like in group children. mConversationIconBadge.setVisibility(visibility); mImportanceRingView.animate().cancel(); mImportanceRingView.setVisibility(visibility); } }); // When the small icon is gone, hide the rest of the badge mIcon.setOnForceHiddenChangedListener((forceHidden) -> { animateViewForceHidden(mConversationIconBadgeBg, forceHidden); animateViewForceHidden(mImportanceRingView, forceHidden); }); // When the conversation icon is gone, hide the whole badge mConversationIcon.setOnForceHiddenChangedListener((forceHidden) -> { animateViewForceHidden(mConversationIconBadgeBg, forceHidden); animateViewForceHidden(mImportanceRingView, forceHidden); animateViewForceHidden(mIcon, forceHidden); }); }); mConversationText = findViewById(R.id.conversation_text); mConversationText = findViewById(R.id.conversation_text); mExpandButtonContainer = findViewById(R.id.expand_button_container); mExpandButtonContainer = findViewById(R.id.expand_button_container); Loading Loading @@ -238,6 +277,33 @@ public class ConversationLayout extends FrameLayout mAppName.setOnVisibilityChangedListener((visibility) -> { mAppName.setOnVisibilityChangedListener((visibility) -> { onAppNameVisibilityChanged(); onAppNameVisibilityChanged(); }); }); mConversationContentStart = getResources().getDimensionPixelSize( R.dimen.conversation_content_start); mInternalButtonPadding = getResources().getDimensionPixelSize(R.dimen.button_padding_horizontal_material) + getResources().getDimensionPixelSize(R.dimen.button_inset_horizontal_material); } private void animateViewForceHidden(CachingIconView view, boolean forceHidden) { boolean nowForceHidden = view.willBeForceHidden() || view.isForceHidden(); if (forceHidden == nowForceHidden) { // We are either already forceHidden or will be return; } view.animate().cancel(); view.setWillBeForceHidden(forceHidden); view.animate() .scaleX(forceHidden ? 0.5f : 1.0f) .scaleY(forceHidden ? 0.5f : 1.0f) .alpha(forceHidden ? 0.0f : 1.0f) .setInterpolator(forceHidden ? ALPHA_OUT : ALPHA_IN) .setDuration(160); if (view.getVisibility() != VISIBLE) { view.setForceHidden(forceHidden); } else { view.animate().withEndAction(() -> view.setForceHidden(forceHidden)); } view.animate().start(); } } @RemotableViewMethod @RemotableViewMethod Loading @@ -255,9 +321,14 @@ public class ConversationLayout extends FrameLayout */ */ @RemotableViewMethod @RemotableViewMethod public void setIsImportantConversation(boolean isImportantConversation) { public void setIsImportantConversation(boolean isImportantConversation) { mImportantConversation = isImportantConversation; mImportanceRingView.setVisibility(isImportantConversation ? VISIBLE : GONE); mImportanceRingView.setVisibility(isImportantConversation ? VISIBLE : GONE); } } public boolean isImportantConversation() { return mImportantConversation; } /** /** * Set this layout to show the collapsed representation. * Set this layout to show the collapsed representation. * * Loading Loading @@ -363,7 +434,6 @@ public class ConversationLayout extends FrameLayout private void updateConversationLayout() { private void updateConversationLayout() { // Set avatar and name // Set avatar and name CharSequence conversationText = mConversationTitle; CharSequence conversationText = mConversationTitle; // TODO: display the secondary text somewhere if (mIsOneToOne) { if (mIsOneToOne) { // Let's resolve the icon / text from the last sender // Let's resolve the icon / text from the last sender mConversationIcon.setVisibility(VISIBLE); mConversationIcon.setVisibility(VISIBLE); Loading Loading @@ -418,6 +488,27 @@ public class ConversationLayout extends FrameLayout updateIconPositionAndSize(); updateIconPositionAndSize(); updateImageMessages(); updateImageMessages(); updatePaddingsBasedOnContentAvailability(); updatePaddingsBasedOnContentAvailability(); updateActionListPadding(); } private void updateActionListPadding() { if (mActions == null) { return; } View firstAction = mActions.getChildAt(0); if (firstAction != null) { // Let's visually position the first action where the content starts int paddingStart = mConversationContentStart; MarginLayoutParams layoutParams = (MarginLayoutParams) firstAction.getLayoutParams(); paddingStart -= layoutParams.getMarginStart(); paddingStart -= mInternalButtonPadding; mActions.setPaddingRelative(paddingStart, mActions.getPaddingTop(), mActions.getPaddingEnd(), mActions.getPaddingBottom()); } } } private void updateImageMessages() { private void updateImageMessages() { Loading
core/java/com/android/internal/widget/MessagingPropertyAnimator.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -32,7 +32,7 @@ import com.android.internal.R; */ */ public class MessagingPropertyAnimator implements View.OnLayoutChangeListener { public class MessagingPropertyAnimator implements View.OnLayoutChangeListener { private static final long APPEAR_ANIMATION_LENGTH = 210; private static final long APPEAR_ANIMATION_LENGTH = 210; private static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f); public static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f); public static final Interpolator ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f); public static final Interpolator ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f); private static final int TAG_TOP_ANIMATOR = R.id.tag_top_animator; private static final int TAG_TOP_ANIMATOR = R.id.tag_top_animator; private static final int TAG_TOP = R.id.tag_top_override; private static final int TAG_TOP = R.id.tag_top_override; Loading