Notification template redesign; part 1.

Known issues:
* Sub-par dyson animation
* Sub-par animation of text in the title
* Notification height limits not yet adjusted
* Decorated custom view height limits not yet updated
* HUNs may need to get their own headerless template
* Messaging style notifications are not yet headerless
* Possible [de]colorization bug for grouped icons
* Some notifications still not always expandable

Bug: 163626038
Test: Manual, visual testing
Change-Id: I9e7e2fd689938a13e042c8f6319bd7d0d2252781
This commit is contained in:
Jeff DeCew
2020-10-21 21:51:23 -04:00
parent e84b4b825d
commit 1842262813
27 changed files with 797 additions and 532 deletions

View File

@@ -91659,8 +91659,6 @@ Lcom/android/internal/R$dimen;->notification_expand_button_padding_top:I
Lcom/android/internal/R$dimen;->notification_header_app_name_margin_start:I
Lcom/android/internal/R$dimen;->notification_header_background_height:I
Lcom/android/internal/R$dimen;->notification_header_expand_icon_size:I
Lcom/android/internal/R$dimen;->notification_header_height:I
Lcom/android/internal/R$dimen;->notification_header_icon_margin_end:I
Lcom/android/internal/R$dimen;->notification_header_icon_size:I
Lcom/android/internal/R$dimen;->notification_header_separating_margin:I
Lcom/android/internal/R$dimen;->notification_header_shrink_min_width:I

View File

@@ -4868,13 +4868,15 @@ public class Notification implements Parcelable
mN.mUsesStandardHeader = false;
}
private RemoteViews applyStandardTemplate(int resId, TemplateBindResult result) {
return applyStandardTemplate(resId, mParams.reset().fillTextsFrom(this),
result);
private RemoteViews applyStandardTemplate(int resId, int viewType,
TemplateBindResult result) {
return applyStandardTemplate(resId,
mParams.reset().viewType(viewType).fillTextsFrom(this), result);
}
private RemoteViews applyStandardTemplate(int resId, StandardTemplateParams p,
TemplateBindResult result) {
p.headerless(resId == getBaseLayoutResource());
RemoteViews contentView = new BuilderRemoteViews(mContext.getApplicationInfo(), resId);
resetStandardTemplate(contentView);
@@ -4884,7 +4886,7 @@ public class Notification implements Parcelable
bindNotificationHeader(contentView, p);
bindLargeIconAndReply(contentView, p, result);
boolean showProgress = handleProgressBar(contentView, ex, p);
if (p.title != null) {
if (p.title != null && p.title.length() > 0) {
contentView.setViewVisibility(R.id.title, View.VISIBLE);
contentView.setTextViewText(R.id.title, processTextSpans(p.title));
setTextViewColorPrimary(contentView, R.id.title, p);
@@ -5099,53 +5101,56 @@ public class Notification implements Parcelable
}
}
private void bindLargeIconAndReply(RemoteViews contentView, StandardTemplateParams p,
TemplateBindResult result) {
private void bindLargeIconAndReply(RemoteViews contentView,
@NonNull StandardTemplateParams p,
@Nullable TemplateBindResult result) {
if (result == null) {
result = new TemplateBindResult();
}
boolean largeIconShown = bindLargeIcon(contentView, p);
boolean replyIconShown = bindReplyIcon(contentView, p);
boolean iconContainerVisible = largeIconShown || replyIconShown;
contentView.setViewVisibility(R.id.right_icon_container,
iconContainerVisible ? View.VISIBLE : View.GONE);
int marginEnd = calculateMarginEnd(largeIconShown, replyIconShown);
contentView.setViewLayoutMarginEnd(R.id.line1, marginEnd);
contentView.setViewLayoutMarginEnd(R.id.text, marginEnd);
contentView.setViewLayoutMarginEnd(R.id.progress, marginEnd);
if (result != null) {
result.setIconMarginEnd(marginEnd);
result.setRightIconContainerVisible(iconContainerVisible);
calculateLargeIconMarginEnd(largeIconShown, result);
calculateReplyIconMarginEnd(replyIconShown, result);
if (p.mHeaderless) {
// views in the headerless (collapsed) state
contentView.setViewLayoutMarginEnd(R.id.notification_standard_view_column,
result.getHeadingExtraMarginEnd());
} else {
// views in states with a header (big states)
contentView.setInt(R.id.notification_header, "setTopLineExtraMarginEnd",
result.getHeadingExtraMarginEnd());
contentView.setViewLayoutMarginEnd(R.id.line1, result.getTitleMarginEnd());
}
}
private int calculateMarginEnd(boolean largeIconShown, boolean replyIconShown) {
int marginEnd = 0;
private void calculateLargeIconMarginEnd(boolean largeIconShown,
@NonNull TemplateBindResult result) {
int contentMargin = mContext.getResources().getDimensionPixelSize(
R.dimen.notification_content_margin_end);
int iconSize = mContext.getResources().getDimensionPixelSize(
R.dimen.notification_right_icon_size);
if (replyIconShown) {
// The size of the reply icon
marginEnd += iconSize;
int expanderSize = mContext.getResources().getDimensionPixelSize(
R.dimen.notification_header_expand_icon_size) - contentMargin;
int extraMarginEnd = 0;
if (largeIconShown) {
int iconSize = mContext.getResources().getDimensionPixelSize(
R.dimen.notification_right_icon_size);
extraMarginEnd = iconSize + contentMargin;
}
result.setRightIconState(largeIconShown, extraMarginEnd, expanderSize);
}
private void calculateReplyIconMarginEnd(boolean replyIconShown,
@NonNull TemplateBindResult result) {
int marginEnd = 0;
if (replyIconShown) {
int iconSize = mContext.getResources().getDimensionPixelSize(
R.dimen.notification_reply_icon_size);
int contentMargin = mContext.getResources().getDimensionPixelSize(
R.dimen.notification_content_margin_end);
int replyInset = mContext.getResources().getDimensionPixelSize(
R.dimen.notification_reply_inset);
// We're subtracting the inset of the reply icon to make sure it's
// aligned nicely on the right, and remove it from the following padding
marginEnd -= replyInset * 2;
marginEnd = iconSize + contentMargin - replyInset * 2;
}
if (largeIconShown) {
// adding size of the right icon
marginEnd += iconSize;
if (replyIconShown) {
// We also add some padding to the reply icon if it's around
marginEnd += contentMargin;
}
}
if (replyIconShown || largeIconShown) {
// The padding to the content
marginEnd += contentMargin;
}
return marginEnd;
result.setReplyIconState(replyIconShown, marginEnd);
}
/**
@@ -5156,7 +5161,10 @@ public class Notification implements Parcelable
if (mN.mLargeIcon == null && mN.largeIcon != null) {
mN.mLargeIcon = Icon.createWithBitmap(mN.largeIcon);
}
boolean showLargeIcon = mN.mLargeIcon != null && !p.hideLargeIcon;
// Hide the large icon in Heads Up view, because the icon is partly within header,
// which for HUNs will be hidden and cropped.
boolean showLargeIcon = mN.mLargeIcon != null && !p.hideLargeIcon
&& p.mViewType != StandardTemplateParams.VIEW_TYPE_HEADS_UP;
if (showLargeIcon) {
contentView.setViewVisibility(R.id.right_icon, View.VISIBLE);
contentView.setImageViewIcon(R.id.right_icon, mN.mLargeIcon);
@@ -5170,7 +5178,7 @@ public class Notification implements Parcelable
* @return if the reply icon is visible
*/
private boolean bindReplyIcon(RemoteViews contentView, StandardTemplateParams p) {
boolean actionVisible = !p.hideReplyIcon;
boolean actionVisible = !p.hideReplyIcon && !p.mHeaderless;
Action action = null;
if (actionVisible) {
action = findReplyAction();
@@ -5375,10 +5383,10 @@ public class Notification implements Parcelable
R.dimen.notification_content_margin);
}
private RemoteViews applyStandardTemplateWithActions(int layoutId,
private RemoteViews applyStandardTemplateWithActions(int layoutId, int viewType,
TemplateBindResult result) {
return applyStandardTemplateWithActions(layoutId, mParams.reset().fillTextsFrom(this),
result);
return applyStandardTemplateWithActions(layoutId,
mParams.reset().viewType(viewType).fillTextsFrom(this), result);
}
private static List<Notification.Action> filterOutContextualActions(
@@ -5518,7 +5526,8 @@ public class Notification implements Parcelable
return styleView;
}
}
return applyStandardTemplate(getBaseLayoutResource(), null /* result */);
return applyStandardTemplate(getBaseLayoutResource(),
StandardTemplateParams.VIEW_TYPE_NORMAL, null /* result */);
}
private boolean useExistingRemoteView() {
@@ -5533,12 +5542,14 @@ public class Notification implements Parcelable
RemoteViews result = null;
if (mN.bigContentView != null && useExistingRemoteView()) {
return mN.bigContentView;
} else if (mStyle != null) {
}
if (mStyle != null) {
result = mStyle.makeBigContentView();
hideLine1Text(result);
} else if (mActions.size() != 0) {
}
if (result == null) {
result = applyStandardTemplateWithActions(getBigBaseLayoutResource(),
null /* result */);
StandardTemplateParams.VIEW_TYPE_BIG, null /* result */);
}
makeHeaderExpanded(result);
return result;
@@ -5551,7 +5562,9 @@ public class Notification implements Parcelable
* @hide
*/
public RemoteViews makeNotificationHeader() {
return makeNotificationHeader(mParams.reset().fillTextsFrom(this));
return makeNotificationHeader(mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_MINIMIZED)
.fillTextsFrom(this));
}
/**
@@ -5624,7 +5637,9 @@ public class Notification implements Parcelable
// We only want at most a single remote input history to be shown here, otherwise
// the content would become squished.
StandardTemplateParams p = mParams.reset().fillTextsFrom(this)
StandardTemplateParams p = mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_HEADS_UP)
.fillTextsFrom(this)
.setMaxRemoteInputHistory(1);
return applyStandardTemplateWithActions(getBigBaseLayoutResource(),
p,
@@ -5672,7 +5687,9 @@ public class Notification implements Parcelable
}
mN.extras = publicExtras;
RemoteViews view;
StandardTemplateParams params = mParams.reset().fillTextsFrom(this);
StandardTemplateParams params = mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_PUBLIC)
.fillTextsFrom(this);
if (isLowPriority) {
params.forceDefaultColor();
}
@@ -5696,6 +5713,7 @@ public class Notification implements Parcelable
*/
public RemoteViews makeLowPriorityContentView(boolean useRegularSubtext) {
StandardTemplateParams p = mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_MINIMIZED)
.forceDefaultColor()
.fillTextsFrom(this);
if (!useRegularSubtext || TextUtils.isEmpty(mParams.summaryText)) {
@@ -6563,7 +6581,10 @@ public class Notification implements Parcelable
}
protected RemoteViews getStandardView(int layoutId) {
StandardTemplateParams p = mBuilder.mParams.reset().fillTextsFrom(mBuilder);
// TODO(jeffdq): set the view type based on the layout resource?
StandardTemplateParams p = mBuilder.mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_UNSPECIFIED)
.fillTextsFrom(mBuilder);
return getStandardView(layoutId, p, null);
}
@@ -6892,7 +6913,8 @@ public class Notification implements Parcelable
mBuilder.mN.largeIcon = null;
}
StandardTemplateParams p = mBuilder.mParams.reset().fillTextsFrom(mBuilder);
StandardTemplateParams p = mBuilder.mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_BIG).fillTextsFrom(mBuilder);
RemoteViews contentView = getStandardView(mBuilder.getBigPictureLayoutResource(),
p, null /* result */);
if (mSummaryTextSet) {
@@ -7106,11 +7128,13 @@ public class Notification implements Parcelable
* @hide
*/
public RemoteViews makeBigContentView() {
StandardTemplateParams p = mBuilder.mParams.reset().fillTextsFrom(mBuilder).text(null);
StandardTemplateParams p = mBuilder.mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_BIG)
.fillTextsFrom(mBuilder).text(null);
TemplateBindResult result = new TemplateBindResult();
RemoteViews contentView = getStandardView(mBuilder.getBigTextLayoutResource(), p,
result);
contentView.setInt(R.id.big_text, "setImageEndMargin", result.getIconMarginEnd());
contentView.setInt(R.id.big_text, "setImageEndMargin", result.getTextMarginEnd());
CharSequence bigTextText = mBuilder.processLegacyText(mBigText);
if (TextUtils.isEmpty(bigTextText)) {
@@ -7124,7 +7148,7 @@ public class Notification implements Parcelable
contentView.setViewVisibility(R.id.big_text,
TextUtils.isEmpty(bigTextText) ? View.GONE : View.VISIBLE);
contentView.setBoolean(R.id.big_text, "setHasImage",
result.isRightIconContainerVisible());
result.isReplyIconVisible());
return contentView;
}
@@ -7708,6 +7732,8 @@ public class Notification implements Parcelable
Icon largeIcon = mBuilder.mN.mLargeIcon;
TemplateBindResult bindResult = new TemplateBindResult();
StandardTemplateParams p = mBuilder.mParams.reset()
.viewType(isCollapsed ? StandardTemplateParams.VIEW_TYPE_NORMAL
: StandardTemplateParams.VIEW_TYPE_BIG)
.hasProgress(false)
.title(conversationTitle)
.text(null)
@@ -7725,7 +7751,7 @@ public class Notification implements Parcelable
if (!isConversationLayout) {
// also update the end margin if there is an image
contentView.setViewLayoutMarginEnd(R.id.notification_messaging,
bindResult.getIconMarginEnd());
bindResult.getHeadingExtraMarginEnd());
}
contentView.setInt(R.id.status_bar_latest_event_content, "setLayoutColor",
mBuilder.isColorized(p)
@@ -8213,7 +8239,9 @@ public class Notification implements Parcelable
* @hide
*/
public RemoteViews makeBigContentView() {
StandardTemplateParams p = mBuilder.mParams.reset().fillTextsFrom(mBuilder).text(null);
StandardTemplateParams p = mBuilder.mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_BIG)
.fillTextsFrom(mBuilder).text(null);
TemplateBindResult result = new TemplateBindResult();
RemoteViews contentView = getStandardView(mBuilder.getInboxLayoutResource(), p, result);
@@ -8266,7 +8294,7 @@ public class Notification implements Parcelable
mBuilder.setTextViewColorSecondary(contentView, rowIds[i], p);
contentView.setViewPadding(rowIds[i], 0, topPadding, 0, 0);
handleInboxImageMargin(contentView, rowIds[i], first,
result.getIconMarginEnd());
result.getHeadingFullMarginEnd());
if (first) {
onlyViewId = rowIds[i];
} else {
@@ -8533,8 +8561,9 @@ public class Notification implements Parcelable
}
private RemoteViews makeMediaContentView() {
StandardTemplateParams p = mBuilder.mParams.reset().hasProgress(false).fillTextsFrom(
mBuilder);
StandardTemplateParams p = mBuilder.mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_NORMAL)
.hasProgress(false).fillTextsFrom(mBuilder);
RemoteViews view = mBuilder.applyStandardTemplate(
R.layout.notification_template_material_media, p,
null /* result */);
@@ -8580,8 +8609,9 @@ public class Notification implements Parcelable
if (!mBuilder.mN.hasLargeIcon() && actionCount <= actionsInCompact) {
return null;
}
StandardTemplateParams p = mBuilder.mParams.reset().hasProgress(false).fillTextsFrom(
mBuilder);
StandardTemplateParams p = mBuilder.mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_BIG)
.hasProgress(false).fillTextsFrom(mBuilder);
RemoteViews big = mBuilder.applyStandardTemplate(
R.layout.notification_template_material_big_media, p , null /* result */);
@@ -8680,16 +8710,18 @@ public class Notification implements Parcelable
}
TemplateBindResult result = new TemplateBindResult();
RemoteViews remoteViews = mBuilder.applyStandardTemplateWithActions(
mBuilder.getBigBaseLayoutResource(), result);
buildIntoRemoteViewContent(remoteViews, headsUpContentView, result);
mBuilder.getBigBaseLayoutResource(),
StandardTemplateParams.VIEW_TYPE_HEADS_UP, result);
buildIntoRemoteViewContent(remoteViews, headsUpContentView, result, false);
return remoteViews;
}
private RemoteViews makeStandardTemplateWithCustomContent(RemoteViews customContent) {
TemplateBindResult result = new TemplateBindResult();
RemoteViews remoteViews = mBuilder.applyStandardTemplate(
mBuilder.getBaseLayoutResource(), result);
buildIntoRemoteViewContent(remoteViews, customContent, result);
mBuilder.getBaseLayoutResource(),
StandardTemplateParams.VIEW_TYPE_NORMAL, result);
buildIntoRemoteViewContent(remoteViews, customContent, result, true);
return remoteViews;
}
@@ -8697,18 +8729,16 @@ public class Notification implements Parcelable
RemoteViews bigContentView = mBuilder.mN.bigContentView == null
? mBuilder.mN.contentView
: mBuilder.mN.bigContentView;
if (mBuilder.mActions.size() == 0) {
return makeStandardTemplateWithCustomContent(bigContentView);
}
TemplateBindResult result = new TemplateBindResult();
RemoteViews remoteViews = mBuilder.applyStandardTemplateWithActions(
mBuilder.getBigBaseLayoutResource(), result);
buildIntoRemoteViewContent(remoteViews, bigContentView, result);
mBuilder.getBigBaseLayoutResource(),
StandardTemplateParams.VIEW_TYPE_BIG, result);
buildIntoRemoteViewContent(remoteViews, bigContentView, result, false);
return remoteViews;
}
private void buildIntoRemoteViewContent(RemoteViews remoteViews,
RemoteViews customContent, TemplateBindResult result) {
RemoteViews customContent, TemplateBindResult result, boolean headerless) {
int childIndex = -1;
if (customContent != null) {
// Need to clone customContent before adding, because otherwise it can no longer be
@@ -8722,11 +8752,14 @@ public class Notification implements Parcelable
remoteViews.setIntTag(R.id.notification_main_column,
com.android.internal.R.id.notification_custom_view_index_tag,
childIndex);
// also update the end margin if there is an image
Resources resources = mBuilder.mContext.getResources();
int endMargin = resources.getDimensionPixelSize(
R.dimen.notification_content_margin_end) + result.getIconMarginEnd();
remoteViews.setViewLayoutMarginEnd(R.id.notification_main_column, endMargin);
if (!headerless) {
// also update the end margin to account for the large icon or expander
Resources resources = mBuilder.mContext.getResources();
int endMargin = resources.getDimensionPixelSize(
R.dimen.notification_content_margin_end) + result.getTitleMarginEnd();
remoteViews.setViewLayoutMarginEnd(R.id.notification_main_column,
endMargin);
}
}
/**
@@ -10962,35 +10995,78 @@ public class Notification implements Parcelable
* A result object where information about the template that was created is saved.
*/
private static class TemplateBindResult {
int mIconMarginEnd;
boolean mRightIconContainerVisible;
boolean mRightIconVisible;
int mRightIconMarginEnd;
int mExpanderSize;
boolean mReplyIconVisible;
int mReplyIconMarginEnd;
/**
* Get the margin end that needs to be added to any fields that may overlap
* with the right actions.
* @return the margin end that needs to be added to the heading so that it won't overlap
* with the large icon. This value includes the space required to accommodate the large
* icon, but should be added to the space needed to accommodate the expander. This does
* not include the 16dp content margin that all notification views must have.
*/
public int getIconMarginEnd() {
return mIconMarginEnd;
public int getHeadingExtraMarginEnd() {
return mRightIconMarginEnd;
}
/**
* @return the margin end that needs to be added to the heading so that it won't overlap
* with the large icon. This value includes the space required to accommodate the large
* icon as well as the expander. This does not include the 16dp content margin that all
* notification views must have.
*/
public int getHeadingFullMarginEnd() {
return mRightIconMarginEnd + mExpanderSize;
}
/**
* @return the margin end that needs to be added to the title text of the big state
* so that it won't overlap with either the large icon or the reply action.
*/
public int getTitleMarginEnd() {
return mRightIconVisible ? getHeadingFullMarginEnd() : mReplyIconMarginEnd;
}
/**
* @return the margin end that needs to be added to the topmost content of the big state
* so that it won't overlap with the reply action.
*/
public int getTextMarginEnd() {
return mReplyIconMarginEnd;
}
/**
* Is the icon container visible on the right size because of the reply button or the
* right icon.
*/
public boolean isRightIconContainerVisible() {
return mRightIconContainerVisible;
public boolean isReplyIconVisible() {
return mReplyIconVisible;
}
public void setIconMarginEnd(int iconMarginEnd) {
this.mIconMarginEnd = iconMarginEnd;
public void setReplyIconState(boolean visible, int marginEnd) {
mReplyIconVisible = visible;
mReplyIconMarginEnd = marginEnd;
}
public void setRightIconContainerVisible(boolean iconContainerVisible) {
mRightIconContainerVisible = iconContainerVisible;
public void setRightIconState(boolean visible, int marginEnd, int expanderSize) {
mRightIconVisible = visible;
mRightIconMarginEnd = marginEnd;
mExpanderSize = expanderSize;
}
}
private static class StandardTemplateParams {
public static int VIEW_TYPE_UNSPECIFIED = 0;
public static int VIEW_TYPE_NORMAL = 1;
public static int VIEW_TYPE_BIG = 2;
public static int VIEW_TYPE_HEADS_UP = 3;
public static int VIEW_TYPE_MINIMIZED = 4;
public static int VIEW_TYPE_PUBLIC = 5;
int mViewType = VIEW_TYPE_UNSPECIFIED;
boolean mHeaderless;
boolean hasProgress = true;
CharSequence title;
CharSequence text;
@@ -11003,6 +11079,8 @@ public class Notification implements Parcelable
boolean forceDefaultColor = false;
final StandardTemplateParams reset() {
mViewType = VIEW_TYPE_UNSPECIFIED;
mHeaderless = false;
hasProgress = true;
title = null;
text = null;
@@ -11014,6 +11092,16 @@ public class Notification implements Parcelable
return this;
}
final StandardTemplateParams viewType(int viewType) {
mViewType = viewType;
return this;
}
public StandardTemplateParams headerless(boolean headerless) {
mHeaderless = headerless;
return this;
}
final StandardTemplateParams hasProgress(boolean hasProgress) {
this.hasProgress = hasProgress;
return this;

View File

@@ -27,6 +27,7 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import android.widget.RemoteViews;
import com.android.internal.R;
@@ -41,15 +42,14 @@ import java.util.ArrayList;
* @hide
*/
@RemoteViews.RemoteView
public class NotificationHeaderView extends ViewGroup {
private final int mChildMinWidth;
public class NotificationHeaderView extends FrameLayout {
private final int mContentEndMargin;
private final int mHeadingEndMargin;
private OnClickListener mExpandClickListener;
private HeaderTouchListener mTouchListener = new HeaderTouchListener();
private NotificationTopLineView mTopLineView;
private NotificationExpandButton mExpandButton;
private CachingIconView mIcon;
private int mHeaderTextMarginEnd;
private Drawable mBackground;
private boolean mEntireHeaderClickable;
private boolean mExpandOnlyOnButton;
@@ -82,8 +82,8 @@ public class NotificationHeaderView extends ViewGroup {
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
Resources res = getResources();
mChildMinWidth = res.getDimensionPixelSize(R.dimen.notification_header_shrink_min_width);
mContentEndMargin = res.getDimensionPixelSize(R.dimen.notification_content_margin_end);
mHeadingEndMargin = res.getDimensionPixelSize(R.dimen.notification_heading_margin_end);
mEntireHeaderClickable = res.getBoolean(R.bool.config_notificationHeaderClickableForExpand);
}
@@ -96,108 +96,6 @@ public class NotificationHeaderView extends ViewGroup {
setClipToPadding(false);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int givenWidth = MeasureSpec.getSize(widthMeasureSpec);
final int givenHeight = MeasureSpec.getSize(heightMeasureSpec);
int wrapContentWidthSpec = MeasureSpec.makeMeasureSpec(givenWidth,
MeasureSpec.AT_MOST);
int wrapContentHeightSpec = MeasureSpec.makeMeasureSpec(givenHeight,
MeasureSpec.AT_MOST);
int totalWidth = getPaddingStart();
int iconWidth = getPaddingEnd();
for (int i = 0; i < getChildCount(); i++) {
final View child = getChildAt(i);
if (child.getVisibility() == GONE) {
// We'll give it the rest of the space in the end
continue;
}
final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
int childWidthSpec = getChildMeasureSpec(wrapContentWidthSpec,
lp.leftMargin + lp.rightMargin, lp.width);
int childHeightSpec = getChildMeasureSpec(wrapContentHeightSpec,
lp.topMargin + lp.bottomMargin, lp.height);
child.measure(childWidthSpec, childHeightSpec);
// Icons that should go at the end
if (child == mExpandButton) {
iconWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth();
} else {
totalWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth();
}
}
// Ensure that there is at least enough space for the icons
int endMargin = Math.max(mHeaderTextMarginEnd, iconWidth);
if (totalWidth > givenWidth - endMargin) {
int overFlow = totalWidth - givenWidth + endMargin;
// We are overflowing; shrink the top line
shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mTopLineView,
mChildMinWidth);
}
setMeasuredDimension(givenWidth, givenHeight);
}
private int shrinkViewForOverflow(int heightSpec, int overFlow, View targetView,
int minimumWidth) {
final int oldWidth = targetView.getMeasuredWidth();
if (overFlow > 0 && targetView.getVisibility() != GONE && oldWidth > minimumWidth) {
// we're still too big
int newSize = Math.max(minimumWidth, oldWidth - overFlow);
int childWidthSpec = MeasureSpec.makeMeasureSpec(newSize, MeasureSpec.AT_MOST);
targetView.measure(childWidthSpec, heightSpec);
overFlow -= oldWidth - newSize;
}
return overFlow;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int left = getPaddingStart();
int end = getMeasuredWidth();
int childCount = getChildCount();
int ownHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
if (child.getVisibility() == GONE) {
continue;
}
int childHeight = child.getMeasuredHeight();
MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams();
int layoutLeft;
int layoutRight;
int top = (int) (getPaddingTop() + (ownHeight - childHeight) / 2.0f);
int bottom = top + childHeight;
// Icons that should go at the end
if (child == mExpandButton) {
if (end == getMeasuredWidth()) {
layoutRight = end - mContentEndMargin;
} else {
layoutRight = end - params.getMarginEnd();
}
layoutLeft = layoutRight - child.getMeasuredWidth();
end = layoutLeft - params.getMarginStart();
} else {
left += params.getMarginStart();
int right = left + child.getMeasuredWidth();
layoutLeft = left;
layoutRight = right;
left = right + params.getMarginEnd();
}
if (getLayoutDirection() == LAYOUT_DIRECTION_RTL) {
int ltrLeft = layoutLeft;
layoutLeft = getWidth() - layoutRight;
layoutRight = getWidth() - ltrLeft;
}
child.layout(layoutLeft, top, layoutRight, bottom);
}
updateTouchListener();
}
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new MarginLayoutParams(getContext(), attrs);
}
/**
* Set a {@link Drawable} to be displayed as a background on the header.
*/
@@ -252,23 +150,34 @@ public class NotificationHeaderView extends ViewGroup {
}
/**
* Sets the margin end for the text portion of the header, excluding right-aligned elements
* @param headerTextMarginEnd margin size
* Sets the extra margin at the end of the top line of left-aligned text + icons.
* This value will have the margin required to accommodate the expand button added to it.
*
* @param extraMarginEnd extra margin
*/
@RemotableViewMethod
public void setHeaderTextMarginEnd(int headerTextMarginEnd) {
if (mHeaderTextMarginEnd != headerTextMarginEnd) {
mHeaderTextMarginEnd = headerTextMarginEnd;
requestLayout();
}
public void setTopLineExtraMarginEnd(int extraMarginEnd) {
mTopLineView.setHeaderTextMarginEnd(extraMarginEnd + mHeadingEndMargin);
}
/**
* Get the current margin end value for the header text
* @return margin size
* Get the current margin end value for the header text.
* Add this to {@link #getTopLineBaseMarginEnd()} to get the total margin of the top line.
*
* @return extra margin
*/
public int getHeaderTextMarginEnd() {
return mHeaderTextMarginEnd;
public int getTopLineExtraMarginEnd() {
return mTopLineView.getHeaderTextMarginEnd() - mHeadingEndMargin;
}
/**
* Get the base margin at the end of the top line view.
* Add this to {@link #getTopLineExtraMarginEnd()} to get the total margin of the top line.
*
* @return base margin
*/
public int getTopLineBaseMarginEnd() {
return mHeadingEndMargin;
}
/**

View File

@@ -40,7 +40,8 @@ public class NotificationTopLineView extends ViewGroup {
private final int mGravityY;
private final int mChildMinWidth;
private final int mContentEndMargin;
private View mAppName;
@Nullable private View mAppName;
@Nullable private View mTitle;
private View mHeaderText;
private View mSecondaryHeaderText;
private OnClickListener mFeedbackListener;
@@ -92,6 +93,7 @@ public class NotificationTopLineView extends ViewGroup {
protected void onFinishInflate() {
super.onFinishInflate();
mAppName = findViewById(R.id.app_name_text);
mTitle = findViewById(R.id.title);
mHeaderText = findViewById(R.id.header_text);
mSecondaryHeaderText = findViewById(R.id.header_text_secondary);
mProfileBadge = findViewById(R.id.profile_badge);
@@ -144,9 +146,17 @@ public class NotificationTopLineView extends ViewGroup {
int endMargin = Math.max(mHeaderTextMarginEnd, iconWidth);
if (totalWidth > givenWidth - endMargin) {
int overFlow = totalWidth - givenWidth + endMargin;
// We are overflowing, lets shrink the app name first
overFlow = shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mAppName,
mChildMinWidth);
if (mAppName != null) {
// We are overflowing, lets shrink the app name first
overFlow = shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mAppName,
mChildMinWidth);
}
if (mTitle != null) {
// still overflowing, we shrink the title text
overFlow = shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mTitle,
mChildMinWidth);
}
// still overflowing, we shrink the header text
overFlow = shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mHeaderText, 0);
@@ -298,6 +308,13 @@ public class NotificationTopLineView extends ViewGroup {
return mHeaderTextMarginEnd;
}
/**
* Set padding at the start of the view.
*/
public void setPaddingStart(int paddingStart) {
setPaddingRelative(paddingStart, getPaddingTop(), getPaddingEnd(), getPaddingBottom());
}
private class HeaderTouchListener implements OnTouchListener {
private Rect mFeedbackRect;

View File

@@ -98,12 +98,14 @@ public class MediaNotificationView extends FrameLayout {
mMainColumn.setLayoutParams(params);
reMeasure = true;
}
// TODO(b/172652345): validate all this logic (especially positioning of expand button)
// margin for the entire header line
int headerMarginEnd = imageEndMargin;
// margin for the header text (not including the expand button and other icons)
int headerTextMarginEnd = size + imageEndMargin;
if (headerTextMarginEnd != mHeader.getHeaderTextMarginEnd()) {
mHeader.setHeaderTextMarginEnd(headerTextMarginEnd);
int headerExtraMarginEnd = Math.max(0,
size + imageEndMargin - mHeader.getTopLineBaseMarginEnd());
if (headerExtraMarginEnd != mHeader.getTopLineExtraMarginEnd()) {
mHeader.setTopLineExtraMarginEnd(headerExtraMarginEnd);
reMeasure = true;
}
params = (MarginLayoutParams) mHeader.getLayoutParams();

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 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.
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="#333" />
</shape>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 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.
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<solid android:color="#00000000" />
</shape>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2014 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.
@@ -14,50 +13,54 @@
limitations under the License.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/actions_container"
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/actions_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/notification_action_list_margin_top"
android:layout_gravity="bottom"
>
<LinearLayout
android:id="@+id/actions_container_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/notification_action_list_margin_top"
android:layout_gravity="bottom">
android:gravity="end"
android:orientation="horizontal"
android:paddingEnd="@dimen/bubble_gone_padding_end"
android:background="@color/notification_action_list_background_color"
>
<LinearLayout
android:id="@+id/actions_container_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
<com.android.internal.widget.NotificationActionListLayout
android:id="@+id/actions"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="@dimen/notification_action_list_height"
android:orientation="horizontal"
android:paddingEnd="@dimen/bubble_gone_padding_end"
android:background="@color/notification_action_list_background_color"
android:gravity="center_vertical"
android:paddingStart="@dimen/notification_actions_padding_start"
android:visibility="gone"
>
<!-- actions will be added here -->
</com.android.internal.widget.NotificationActionListLayout>
<com.android.internal.widget.NotificationActionListLayout
android:id="@+id/actions"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="@dimen/notification_action_list_height"
android:orientation="horizontal"
android:gravity="center_vertical"
android:visibility="gone"
>
<!-- actions will be added here -->
</com.android.internal.widget.NotificationActionListLayout>
<ImageView
android:id="@+id/snooze_button"
android:layout_width="@dimen/notification_actions_icon_size"
android:layout_height="@dimen/notification_actions_icon_size"
android:layout_gravity="center_vertical|end"
android:visibility="gone"
android:scaleType="centerInside"
/>
<ImageView
android:id="@+id/snooze_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_vertical|end"
android:visibility="gone"
android:scaleType="centerInside"
/>
<ImageView
android:id="@+id/bubble_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center_vertical|end"
android:visibility="gone"
android:scaleType="centerInside"
/>
<ImageView
android:id="@+id/bubble_button"
android:layout_width="@dimen/notification_actions_icon_size"
android:layout_height="@dimen/notification_actions_icon_size"
android:layout_gravity="center_vertical|end"
android:visibility="gone"
android:scaleType="centerInside"
/>
</LinearLayout>
</FrameLayout>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2015 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,40 +13,66 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
<!-- extends ViewGroup -->
<!-- extends FrameLayout -->
<NotificationHeaderView
xmlns:android="http://schemas.android.com/apk/res/android"
android:theme="@style/Theme.DeviceDefault.Notification"
android:id="@+id/notification_header"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="@dimen/notification_header_height"
android:layout_height="@dimen/notification_header_solo_height"
android:layout_marginBottom="@dimen/notification_header_margin_bottom"
android:clipChildren="false"
style="?attr/notificationHeaderStyle">
<!-- Wrapper used to expand the width of the "space" containing the icon programmatically -->
<FrameLayout
android:id="@+id/header_icon_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:gravity="center_vertical"
android:orientation="horizontal"
android:theme="@style/Theme.DeviceDefault.Notification"
>
<com.android.internal.widget.CachingIconView
android:id="@+id/icon"
android:layout_width="?attr/notificationHeaderIconSize"
android:layout_height="?attr/notificationHeaderIconSize"
android:layout_marginEnd="@dimen/notification_header_icon_margin_end"
android:layout_gravity="center"
<com.android.internal.widget.CachingIconView
android:id="@+id/icon"
android:layout_width="@dimen/notification_icon_circle_size"
android:layout_height="@dimen/notification_icon_circle_size"
android:layout_gravity="center_vertical|start"
android:layout_marginStart="@dimen/notification_icon_circle_start"
android:background="@drawable/notification_icon_circle"
android:padding="@dimen/notification_icon_circle_padding"
/>
</FrameLayout>
<include layout="@layout/notification_template_top_line" />
<!-- extends ViewGroup -->
<NotificationTopLineView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/notification_top_line"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:clipChildren="false"
android:gravity="center_vertical"
android:paddingEnd="@dimen/notification_heading_margin_end"
android:paddingStart="@dimen/notification_content_margin_start"
android:theme="@style/Theme.DeviceDefault.Notification"
>
<TextView
android:id="@+id/app_name_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/notification_header_separating_margin"
android:singleLine="true"
android:textAppearance="?attr/notificationHeaderTextAppearance"
android:visibility="?attr/notificationHeaderAppNameVisibility"
/>
<include layout="@layout/notification_top_line_views" />
</NotificationTopLineView>
<com.android.internal.widget.NotificationExpandButton
android:id="@+id/expand_button"
android:background="@null"
android:layout_width="@dimen/notification_header_expand_icon_size"
android:layout_height="@dimen/notification_header_expand_icon_size"
android:layout_marginStart="4dp"
android:paddingTop="@dimen/notification_expand_button_padding_top"
android:visibility="gone"
android:layout_gravity="center_vertical|end"
android:contentDescription="@string/expand_button_content_description_collapsed"
android:paddingTop="@dimen/notification_expand_button_padding_top"
android:scaleType="center"
android:visibility="gone"
/>
</NotificationHeaderView>
</NotificationHeaderView>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2014 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,25 +19,102 @@
android:id="@+id/status_bar_latest_event_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="base" >
<include layout="@layout/notification_template_header" />
<LinearLayout
android:id="@+id/notification_main_column"
android:minHeight="@dimen/notification_headerless_min_height"
android:tag="base"
>
<com.android.internal.widget.CachingIconView
android:id="@+id/icon"
android:layout_width="@dimen/notification_icon_circle_size"
android:layout_height="@dimen/notification_icon_circle_size"
android:layout_gravity="center_vertical|start"
android:layout_marginStart="@dimen/notification_icon_circle_start"
android:background="@drawable/notification_icon_circle"
android:padding="@dimen/notification_icon_circle_padding"
/>
<com.android.internal.widget.RemeasuringLinearLayout
android:id="@+id/notification_standard_view_column"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:layout_marginBottom="@dimen/notification_content_margin"
android:orientation="vertical" >
<include layout="@layout/notification_template_part_line1" />
<include layout="@layout/notification_template_text" />
<include
android:layout_gravity="center_vertical"
android:layout_marginBottom="@dimen/notification_headerless_margin_vertical"
android:layout_marginTop="@dimen/notification_headerless_margin_vertical"
android:orientation="vertical"
>
<!-- extends ViewGroup -->
<NotificationTopLineView
android:id="@+id/notification_top_line"
android:layout_width="wrap_content"
android:layout_height="@dimen/notification_headerless_line_height"
android:layout_marginEnd="@dimen/notification_heading_margin_end"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:clipChildren="false"
android:theme="@style/Theme.DeviceDefault.Notification"
>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:singleLine="true"
android:textAlignment="viewStart"
android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title"
/>
<include layout="@layout/notification_top_line_views" />
</NotificationTopLineView>
<com.android.internal.widget.RemeasuringLinearLayout
android:id="@+id/notification_main_column"
android:layout_width="match_parent"
android:layout_height="@dimen/notification_progress_bar_height"
android:layout_marginTop="@dimen/notification_progress_margin_top"
layout="@layout/notification_template_progress" />
</LinearLayout>
<include layout="@layout/notification_template_right_icon" />
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/notification_heading_margin_end"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:orientation="vertical"
>
<include
layout="@layout/notification_template_text"
android:layout_width="match_parent"
android:layout_height="@dimen/notification_headerless_line_height"
android:layout_marginTop="0dp"
/>
<include
layout="@layout/notification_template_progress"
android:layout_width="match_parent"
android:layout_height="@dimen/notification_headerless_line_height"
/>
</com.android.internal.widget.RemeasuringLinearLayout>
</com.android.internal.widget.RemeasuringLinearLayout>
<ImageView
android:id="@+id/right_icon"
android:layout_width="@dimen/notification_right_icon_size"
android:layout_height="@dimen/notification_right_icon_size"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="@dimen/notification_header_expand_icon_size"
android:background="@drawable/notification_large_icon_outline"
android:importantForAccessibility="no"
android:scaleType="centerCrop"
/>
<com.android.internal.widget.NotificationExpandButton
android:id="@+id/expand_button"
android:layout_width="@dimen/notification_header_expand_icon_size"
android:layout_height="@dimen/notification_header_expand_icon_size"
android:layout_gravity="center_vertical|end"
android:background="@null"
android:contentDescription="@string/expand_button_content_description_collapsed"
android:paddingTop="@dimen/notification_expand_button_padding_top"
android:scaleType="center"
android:visibility="gone"
/>
</FrameLayout>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2014 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,19 +20,30 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:clipChildren="false"
android:tag="big" >
android:tag="big"
>
<LinearLayout
android:id="@+id/notification_action_list_margin_target"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/notification_action_list_height"
android:orientation="vertical" >
android:id="@+id/notification_action_list_margin_target"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/notification_action_list_height"
android:orientation="vertical"
>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="top" >
<include layout="@layout/notification_template_header" />
android:layout_gravity="top"
>
<include
layout="@layout/notification_template_header"
android:layout_width="match_parent"
android:layout_height="@dimen/notification_header_big_height"
/>
<LinearLayout
android:id="@+id/notification_main_column"
android:layout_width="match_parent"
@@ -41,28 +51,41 @@
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:orientation="vertical" >
android:orientation="vertical"
>
<include layout="@layout/notification_template_part_line1" />
<include layout="@layout/notification_template_text" />
<include
android:layout_width="match_parent"
android:layout_height="@dimen/notification_progress_bar_height"
android:layout_marginTop="@dimen/notification_progress_margin_top"
layout="@layout/notification_template_progress" />
layout="@layout/notification_template_progress"
/>
</LinearLayout>
<include layout="@layout/notification_template_right_icon" />
<include layout="@layout/notification_template_reply_icon" />
</FrameLayout>
<ViewStub
android:layout="@layout/notification_material_reply_text"
android:id="@+id/notification_material_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<include layout="@layout/notification_template_smart_reply_container"
android:layout_height="wrap_content"
/>
<include
layout="@layout/notification_template_smart_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:layout_marginTop="@dimen/notification_content_margin" />
android:layout_marginTop="@dimen/notification_content_margin"
/>
<include layout="@layout/notification_material_action_list" />
</LinearLayout>
</FrameLayout>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2014 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,22 +24,28 @@
android:tag="bigMediaNarrow"
>
<!-- The size will actually be determined at runtime -->
<ImageView android:id="@+id/right_icon"
<ImageView
android:id="@+id/right_icon"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_gravity="top|end"
android:scaleType="centerCrop"
/>
<include layout="@layout/notification_template_header"
/>
<include
layout="@layout/notification_template_header"
android:layout_width="match_parent"
android:layout_height="@dimen/media_notification_header_height"
android:layout_gravity="start"/>
android:layout_gravity="start"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/notification_media_content"
>
<LinearLayout
android:id="@+id/notification_main_column"
android:layout_width="match_parent"
@@ -52,38 +57,49 @@
android:minHeight="@dimen/notification_min_content_height"
android:orientation="vertical"
>
<include layout="@layout/notification_template_part_line1" />
<include layout="@layout/notification_template_text" />
</LinearLayout>
<LinearLayout
android:id="@+id/media_actions"
android:orientation="horizontal"
android:layoutDirection="ltr"
style="@style/NotificationMediaActionContainer" >
style="@style/NotificationMediaActionContainer"
>
<include
layout="@layout/notification_material_media_action"
android:id="@+id/action0"
/>
/>
<include
layout="@layout/notification_material_media_action"
android:id="@+id/action1"
/>
/>
<include
layout="@layout/notification_material_media_action"
android:id="@+id/action2"
/>
/>
<include
layout="@layout/notification_material_media_action"
android:id="@+id/action3"
/>
/>
<include
layout="@layout/notification_material_media_action"
android:id="@+id/action4"
/>
/>
</LinearLayout>
<ViewStub android:id="@+id/notification_media_seekbar_container"
<ViewStub
android:id="@+id/notification_media_seekbar_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
/>
</LinearLayout>
</com.android.internal.widget.MediaNotificationView>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2014 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,61 +14,84 @@
~ limitations under the License
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/status_bar_latest_event_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="bigPicture"
android:clipChildren="false"
>
<include layout="@layout/notification_template_header" />
<include
layout="@layout/notification_template_header"
android:layout_width="match_parent"
android:layout_height="@dimen/notification_header_big_height"
/>
<include layout="@layout/notification_template_right_icon" />
<include layout="@layout/notification_template_reply_icon" />
<LinearLayout
android:id="@+id/notification_action_list_margin_target"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:clipToPadding="false"
android:orientation="vertical"
>
android:id="@+id/notification_action_list_margin_target"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:clipToPadding="false"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/notification_main_column"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:orientation="vertical">
<include layout="@layout/notification_template_part_line1"/>
<include layout="@layout/notification_template_progress"
android:layout_width="match_parent"
android:layout_height="@dimen/notification_progress_bar_height"
android:layout_marginTop="@dimen/notification_progress_margin_top"/>
<include layout="@layout/notification_template_text"/>
</LinearLayout>
<ImageView
android:id="@+id/big_picture"
android:orientation="vertical"
>
<include layout="@layout/notification_template_part_line1" />
<include
layout="@layout/notification_template_progress"
android:layout_width="match_parent"
android:layout_height="0dp"
android:adjustViewBounds="true"
android:layout_weight="1"
android:layout_marginTop="13dp"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:scaleType="centerCrop"
android:layout_height="@dimen/notification_progress_bar_height"
android:layout_marginTop="@dimen/notification_progress_margin_top"
/>
<ViewStub android:layout="@layout/notification_material_reply_text"
android:id="@+id/notification_material_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<include layout="@layout/notification_template_smart_reply_container"
<include layout="@layout/notification_template_text" />
</LinearLayout>
<ImageView
android:id="@+id/big_picture"
android:layout_width="match_parent"
android:layout_height="0dp"
android:adjustViewBounds="true"
android:layout_weight="1"
android:layout_marginTop="13dp"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:scaleType="centerCrop"
/>
<ViewStub
android:layout="@layout/notification_material_reply_text"
android:id="@+id/notification_material_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<include
layout="@layout/notification_template_smart_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:layout_marginTop="@dimen/notification_content_margin" />
android:layout_marginTop="@dimen/notification_content_margin"
/>
<include layout="@layout/notification_material_action_list" />
</LinearLayout>
</FrameLayout>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2014 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,24 +14,31 @@
~ limitations under the License
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/status_bar_latest_event_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:tag="bigText"
>
<include layout="@layout/notification_template_header" />
<include
layout="@layout/notification_template_header"
android:layout_width="match_parent"
android:layout_height="@dimen/notification_header_big_height"
/>
<com.android.internal.widget.RemeasuringLinearLayout
android:id="@+id/notification_action_list_margin_target"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:layout_marginBottom="@dimen/notification_action_list_height"
android:clipToPadding="false"
android:orientation="vertical">
android:id="@+id/notification_action_list_margin_target"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:layout_marginBottom="@dimen/notification_action_list_height"
android:clipToPadding="false"
android:orientation="vertical"
>
<com.android.internal.widget.RemeasuringLinearLayout
android:id="@+id/notification_main_column"
@@ -46,13 +52,19 @@
android:orientation="vertical"
android:layout_weight="1"
>
<include layout="@layout/notification_template_part_line1" />
<include layout="@layout/notification_template_progress"
<include
layout="@layout/notification_template_progress"
android:layout_width="match_parent"
android:layout_height="@dimen/notification_progress_bar_height"
android:layout_marginTop="@dimen/notification_progress_margin_top"
android:layout_marginBottom="6dp"/>
<com.android.internal.widget.ImageFloatingTextView android:id="@+id/big_text"
android:layout_marginBottom="6dp"
/>
<com.android.internal.widget.ImageFloatingTextView
android:id="@+id/big_text"
style="@style/Widget.DeviceDefault.Notification.Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -64,17 +76,25 @@
/>
</com.android.internal.widget.RemeasuringLinearLayout>
<ViewStub android:layout="@layout/notification_material_reply_text"
android:id="@+id/notification_material_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<include layout="@layout/notification_template_smart_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:layout_marginTop="@dimen/notification_content_margin" />
<ViewStub
android:layout="@layout/notification_material_reply_text"
android:id="@+id/notification_material_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<include
layout="@layout/notification_template_smart_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:layout_marginTop="@dimen/notification_content_margin"
/>
<include layout="@layout/notification_material_action_list" />
</com.android.internal.widget.RemeasuringLinearLayout>
<include layout="@layout/notification_template_right_icon" />
<include layout="@layout/notification_template_reply_icon" />
</FrameLayout>

View File

@@ -359,8 +359,8 @@
/>
<com.android.internal.widget.NotificationExpandButton
android:id="@+id/expand_button"
android:layout_width="@dimen/notification_header_expand_icon_size"
android:layout_height="@dimen/notification_header_expand_icon_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawable="@drawable/ic_expand_notification"
android:clickable="false"

View File

@@ -129,4 +129,5 @@
<include layout="@layout/notification_material_action_list" />
</LinearLayout>
<include layout="@layout/notification_template_right_icon" />
<include layout="@layout/notification_template_reply_icon" />
</FrameLayout>

View File

@@ -57,5 +57,6 @@
android:layout_marginEnd="@dimen/notification_content_margin_end" />
<include layout="@layout/notification_material_action_list" />
</com.android.internal.widget.RemeasuringLinearLayout>
<include layout="@layout/notification_template_right_icon"/>
<include layout="@layout/notification_template_right_icon" />
<include layout="@layout/notification_template_reply_icon" />
</com.android.internal.widget.MessagingLayout>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2015 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
-->
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/reply_icon_action"
android:layout_width="@dimen/notification_reply_icon_size"
android:layout_height="@dimen/notification_reply_icon_size"
android:layout_gravity="top|end"
android:layout_marginEnd="8dp"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:contentDescription="@string/notification_reply_button_accessibility"
android:scaleType="centerCrop"
android:src="@drawable/ic_reply_notification" />

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2015 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,29 +13,15 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
<!-- The view only has 8dp padding at the end instead of notification_content_margin_end,
since the reply icon has an inset of 8dp and we want it to visually start at the start of the
icon. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/right_icon_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:layout_marginEnd="8dp"
android:layout_gravity="top|end">
<ImageView android:id="@+id/right_icon"
android:layout_width="@dimen/notification_right_icon_size"
android:layout_height="@dimen/notification_right_icon_size"
android:layout_gravity="top|end"
android:layout_marginEnd="8dp"
android:scaleType="centerCrop"
android:importantForAccessibility="no" />
<ImageView android:id="@+id/reply_icon_action"
android:layout_width="@dimen/notification_right_icon_size"
android:layout_height="@dimen/notification_right_icon_size"
android:layout_gravity="top|end"
android:contentDescription="@string/notification_reply_button_accessibility"
android:scaleType="centerCrop"
android:src="@drawable/ic_reply_notification"/>
</LinearLayout>
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/right_icon"
android:layout_width="@dimen/notification_right_icon_size"
android:layout_height="@dimen/notification_right_icon_size"
android:layout_gravity="top|end"
android:layout_marginEnd="@dimen/notification_header_expand_icon_size"
android:layout_marginTop="@dimen/notification_right_icon_big_margin_top"
android:background="@drawable/notification_large_icon_outline"
android:importantForAccessibility="no"
android:scaleType="centerCrop"
/>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2016 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,7 +13,8 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
<com.android.internal.widget.ImageFloatingTextView xmlns:android="http://schemas.android.com/apk/res/android"
<com.android.internal.widget.ImageFloatingTextView
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Widget.DeviceDefault.Notification.Text"
android:id="@+id/text"
android:layout_width="match_parent"

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2015 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,25 +13,13 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
<!-- extends ViewGroup -->
<NotificationTopLineView
xmlns:android="http://schemas.android.com/apk/res/android"
android:theme="@style/Theme.DeviceDefault.Notification"
android:id="@+id/notification_top_line"
android:layout_width="wrap_content"
android:layout_height="@dimen/notification_header_height"
android:clipChildren="false"
>
<TextView
android:id="@+id/app_name_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?attr/notificationHeaderTextAppearance"
android:layout_marginStart="@dimen/notification_header_app_name_margin_start"
android:layout_marginEnd="@dimen/notification_header_separating_margin"
android:visibility="?attr/notificationHeaderAppNameVisibility"
android:singleLine="true"
/>
<!--
This layout file should be included inside a NotificationTopLineView, usually after either a
<TextView android:id="@+id/app_name_text"/> or <TextView android:id="@+id/title"/>
-->
<merge
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/header_text_secondary_divider"
android:layout_width="wrap_content"
@@ -41,7 +28,9 @@
android:layout_marginStart="@dimen/notification_header_separating_margin"
android:layout_marginEnd="@dimen/notification_header_separating_margin"
android:text="@string/notification_header_divider_symbol"
android:visibility="gone"/>
android:visibility="gone"
/>
<TextView
android:id="@+id/header_text_secondary"
android:layout_width="wrap_content"
@@ -50,7 +39,9 @@
android:layout_marginStart="@dimen/notification_header_separating_margin"
android:layout_marginEnd="@dimen/notification_header_separating_margin"
android:visibility="gone"
android:singleLine="true"/>
android:singleLine="true"
/>
<TextView
android:id="@+id/header_text_divider"
android:layout_width="wrap_content"
@@ -59,7 +50,9 @@
android:layout_marginStart="@dimen/notification_header_separating_margin"
android:layout_marginEnd="@dimen/notification_header_separating_margin"
android:text="@string/notification_header_divider_symbol"
android:visibility="gone"/>
android:visibility="gone"
/>
<TextView
android:id="@+id/header_text"
android:layout_width="wrap_content"
@@ -68,7 +61,9 @@
android:layout_marginStart="@dimen/notification_header_separating_margin"
android:layout_marginEnd="@dimen/notification_header_separating_margin"
android:visibility="gone"
android:singleLine="true"/>
android:singleLine="true"
/>
<TextView
android:id="@+id/time_divider"
android:layout_width="wrap_content"
@@ -78,7 +73,9 @@
android:layout_marginEnd="@dimen/notification_header_separating_margin"
android:text="@string/notification_header_divider_symbol"
android:singleLine="true"
android:visibility="gone"/>
android:visibility="gone"
/>
<DateTimeView
android:id="@+id/time"
android:textAppearance="@style/TextAppearance.Material.Notification.Time"
@@ -88,7 +85,9 @@
android:layout_marginEnd="@dimen/notification_header_separating_margin"
android:showRelative="true"
android:singleLine="true"
android:visibility="gone" />
android:visibility="gone"
/>
<ViewStub
android:id="@+id/chronometer"
android:layout_width="wrap_content"
@@ -98,6 +97,7 @@
android:layout="@layout/notification_template_part_chronometer"
android:visibility="gone"
/>
<ImageView
android:id="@+id/alerted_icon"
android:layout_width="@dimen/notification_alerted_size"
@@ -108,7 +108,8 @@
android:visibility="gone"
android:contentDescription="@string/notification_alerted_content_description"
android:src="@drawable/ic_notifications_alerted"
/>
/>
<ImageButton
android:id="@+id/feedback"
android:layout_width="@dimen/notification_feedback_size"
@@ -121,7 +122,8 @@
android:background="?android:selectableItemBackgroundBorderless"
android:visibility="gone"
android:contentDescription="@string/notification_feedback_indicator"
/>
/>
<ImageView
android:id="@+id/profile_badge"
android:layout_width="@dimen/notification_badge_size"
@@ -132,5 +134,5 @@
android:visibility="gone"
android:contentDescription="@string/notification_work_profile_content_description"
/>
</NotificationTopLineView>
</merge>

View File

@@ -207,12 +207,15 @@
<!-- Default padding for dialogs. -->
<dimen name="dialog_padding">16dp</dimen>
<!-- The margin on the start of the content view -->
<dimen name="notification_content_margin_start">16dp</dimen>
<!-- The margin on the start of the content view (accommodates the icon) -->
<dimen name="notification_content_margin_start">52dp</dimen>
<!-- The margin on the end of the content view. -->
<!-- The margin on the end of most content views (ignores the expander) -->
<dimen name="notification_content_margin_end">16dp</dimen>
<!-- The margin on the end of the top-line content views (accommodates the expander) -->
<dimen name="notification_heading_margin_end">48dp</dimen>
<!-- The inset of the reply icon. -->
<dimen name="notification_reply_inset">8dp</dimen>
@@ -228,6 +231,13 @@
<!-- The height of the notification action list -->
<dimen name="notification_action_emphasized_height">48dp</dimen>
<!-- The padding of the actions in non-conversation layout. For conversations, the analogous
value is calculated in ConversationLayout#updateActionListPadding() -->
<dimen name="notification_actions_padding_start">36dp</dimen>
<!-- The size of icons for visual actions in the notification_material_action_list -->
<dimen name="notification_actions_icon_size">48dp</dimen>
<!-- Size of the stroke with for the emphasized notification button style -->
<dimen name="emphasized_button_stroke_width">1dp</dimen>
@@ -243,8 +253,11 @@
<!-- The top margin before the notification progress bar. -->
<dimen name="notification_progress_margin_top">8dp</dimen>
<!-- height of the notification header (for icon and package name) -->
<dimen name="notification_header_height">50dp</dimen>
<!-- height of the notification header when the notification is alone (minimized / groups) -->
<dimen name="notification_header_solo_height">48dp</dimen>
<!-- height of the notification header when in a "big" layout -->
<dimen name="notification_header_big_height">56dp</dimen>
<!-- The height of the background for a notification header on a group -->
<dimen name="notification_header_background_height">49.5dp</dimen>
@@ -258,12 +271,18 @@
<!-- The margin at the bottom of the notification header. -->
<dimen name="notification_header_margin_bottom">0dp</dimen>
<!-- The end margin after the application icon in the notification header -->
<dimen name="notification_header_icon_margin_end">3dp</dimen>
<!-- size (width and height) of the icon in the notification header -->
<dimen name="notification_header_icon_size">18dp</dimen>
<!-- size (width and height) of the circle around the icon in the notification header -->
<dimen name="notification_icon_circle_size">24dp</dimen>
<!-- padding between the notification icon and the circle containing it -->
<dimen name="notification_icon_circle_padding">4dp</dimen>
<!-- start margin of the icon circle in the notification view -->
<dimen name="notification_icon_circle_start">16dp</dimen>
<!-- size (width and height) of the icon in the notification header -->
<dimen name="notification_header_icon_size_ambient">18dp</dimen>
@@ -276,12 +295,21 @@
<!-- The margin before and after each of the items in the conversation header. -->
<dimen name="notification_conversation_header_separating_margin">4dp</dimen>
<!-- The absolute size of the notification expand icon. -2 for wrap_content. -->
<dimen name="notification_header_expand_icon_size">-2px</dimen>
<!-- The absolute size of the notification expand icon. -->
<dimen name="notification_header_expand_icon_size">48dp</dimen>
<!-- The top padding for the notification expand button. -->
<dimen name="notification_expand_button_padding_top">1dp</dimen>
<!-- vertical margin for the headerless notification content -->
<dimen name="notification_headerless_margin_vertical">18dp</dimen>
<!-- The height of each of the 1 or 2 lines in the headerless notification template -->
<dimen name="notification_headerless_line_height">20sp</dimen>
<!-- vertical margin for the headerless notification content -->
<dimen name="notification_headerless_min_height">56dp</dimen>
<!-- Height of a small notification in the status bar -->
<dimen name="notification_min_height">106dp</dimen>
@@ -310,7 +338,7 @@
<dimen name="media_notification_expanded_image_margin_bottom">20dp</dimen>
<!-- The absolute height for the header in a media notification. -->
<dimen name="media_notification_header_height">@dimen/notification_header_height</dimen>
<dimen name="media_notification_header_height">@dimen/notification_header_big_height</dimen>
<!-- The margin of the content to an image-->
<dimen name="notification_content_image_margin_end">8dp</dimen>
@@ -679,7 +707,11 @@
<!-- The maximum width of a image in a media notification. The images will be reduced to that width in case they are bigger.-->
<dimen name="notification_media_image_max_width">280dp</dimen>
<!-- The size of the right icon -->
<dimen name="notification_right_icon_size">36dp</dimen>
<dimen name="notification_right_icon_size">52dp</dimen>
<!-- The top margin of the right icon in the "big" notification states -->
<dimen name="notification_right_icon_big_margin_top">16dp</dimen>
<!-- The size of the reply icon -->
<dimen name="notification_reply_icon_size">36dp</dimen>
<!-- The alpha of a disabled notification button -->
<item type="dimen" format="float" name="notification_action_disabled_alpha">0.5</item>
@@ -702,6 +734,8 @@
<dimen name="messaging_avatar_size">@dimen/notification_right_icon_size</dimen>
<dimen name="conversation_avatar_size">52dp</dimen>
<!-- start margin of the icon circle in the conversation's skin of the header -->
<dimen name="conversation_icon_circle_start">28dp</dimen>
<!-- Start of the content in the conversation template -->
<dimen name="conversation_content_start">80dp</dimen>
<!-- Size of the expand button in the conversation layout -->

View File

@@ -218,6 +218,7 @@
<java-symbol type="id" name="inbox_text6" />
<java-symbol type="id" name="status_bar_latest_event_content" />
<java-symbol type="id" name="notification_main_column" />
<java-symbol type="id" name="notification_standard_view_column" />
<java-symbol type="id" name="sms_short_code_confirm_message" />
<java-symbol type="id" name="sms_short_code_detail_layout" />
<java-symbol type="id" name="sms_short_code_detail_message" />
@@ -2871,14 +2872,13 @@
<java-symbol type="dimen" name="notification_header_shrink_min_width" />
<java-symbol type="dimen" name="notification_content_margin_start" />
<java-symbol type="dimen" name="notification_content_margin_end" />
<java-symbol type="dimen" name="notification_heading_margin_end" />
<java-symbol type="dimen" name="notification_reply_inset" />
<java-symbol type="dimen" name="notification_content_margin_top" />
<java-symbol type="dimen" name="notification_content_margin" />
<java-symbol type="dimen" name="notification_header_background_height" />
<java-symbol type="dimen" name="notification_header_height" />
<java-symbol type="dimen" name="notification_header_expand_icon_size" />
<java-symbol type="dimen" name="notification_expand_button_padding_top" />
<java-symbol type="dimen" name="notification_header_icon_margin_end" />
<java-symbol type="dimen" name="notification_header_icon_size" />
<java-symbol type="dimen" name="notification_header_app_name_margin_start" />
<java-symbol type="dimen" name="notification_header_separating_margin" />
@@ -3379,6 +3379,7 @@
<java-symbol type="dimen" name="notification_media_image_max_width"/>
<java-symbol type="dimen" name="notification_media_image_max_height"/>
<java-symbol type="dimen" name="notification_right_icon_size"/>
<java-symbol type="dimen" name="notification_reply_icon_size"/>
<java-symbol type="dimen" name="notification_custom_view_max_image_height"/>
<java-symbol type="dimen" name="notification_custom_view_max_image_width"/>
@@ -3399,8 +3400,6 @@
<java-symbol type="bool" name="config_allowEscrowTokenForTrustAgent"/>
<java-symbol type="string" name="config_defaultTrustAgent" />
<!-- Time picker -->
<java-symbol type="id" name="right_icon_container"/>
<java-symbol type="id" name="reply_icon_action"/>
<java-symbol type="id" name="toggle_mode"/>
<java-symbol type="id" name="input_mode"/>
@@ -3935,8 +3934,9 @@
<java-symbol type="dimen" name="importance_ring_anim_max_stroke_width" />
<java-symbol type="dimen" name="importance_ring_size" />
<java-symbol type="dimen" name="conversation_icon_size_badged" />
<java-symbol type="dimen" name="conversation_icon_circle_start" />
<java-symbol type="dimen" name="notification_icon_circle_start" />
<java-symbol type="id" name="header_icon_container" />
<java-symbol type="attr" name="notificationHeaderTextAppearance" />
<java-symbol type="string" name="conversation_single_line_name_display" />
<java-symbol type="string" name="conversation_single_line_image_placeholder" />

View File

@@ -33,6 +33,7 @@ import com.android.systemui.statusbar.notification.row.NotificationContentView;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
/**
* A Util to manage {@link android.view.NotificationHeaderView} objects and their redundancies.
@@ -324,13 +325,15 @@ public class NotificationHeaderUtil {
@Override
public boolean compare(View parent, View child, Object parentData, Object childData) {
TextView parentView = (TextView) parent;
CharSequence parentText = parentView == null ? "" : parentView.getText();
TextView childView = (TextView) child;
return parentView.getText().equals(childView.getText());
CharSequence childText = childView == null ? "" : childView.getText();
return Objects.equals(parentText, childText);
}
@Override
public boolean isEmpty(View view) {
return TextUtils.isEmpty(((TextView) view).getText());
return view == null || TextUtils.isEmpty(((TextView) view).getText());
}
}
@@ -369,7 +372,9 @@ public class NotificationHeaderUtil {
@Override
public void apply(View parent, View view, boolean apply, boolean reset) {
view.setVisibility(apply ? View.GONE : View.VISIBLE);
if (view != null) {
view.setVisibility(apply ? View.GONE : View.VISIBLE);
}
}
}

View File

@@ -318,30 +318,13 @@ public class NotificationContentView extends FrameLayout {
// We need to update the expanded and the collapsed header to have exactly the same with to
// have the expand buttons laid out at the same location.
NotificationHeaderView contractedHeader = mContractedWrapper.getNotificationHeader();
if (contractedHeader != null) {
if (mExpandedChild != null
&& mExpandedWrapper.getNotificationHeader() != null) {
NotificationHeaderView expandedHeader = mExpandedWrapper.getNotificationHeader();
int headerTextMargin = expandedHeader.getHeaderTextMarginEnd();
if (headerTextMargin != contractedHeader.getHeaderTextMarginEnd()) {
contractedHeader.setHeaderTextMarginEnd(headerTextMargin);
return true;
}
} else {
int paddingEnd = mNotificationContentMarginEnd;
if (contractedHeader.getPaddingEnd() != paddingEnd) {
contractedHeader.setPadding(
contractedHeader.isLayoutRtl()
? paddingEnd
: contractedHeader.getPaddingLeft(),
contractedHeader.getPaddingTop(),
contractedHeader.isLayoutRtl()
? contractedHeader.getPaddingLeft()
: paddingEnd,
contractedHeader.getPaddingBottom());
return true;
}
if (contractedHeader != null && mExpandedWrapper != null
&& mExpandedWrapper.getNotificationHeader() != null) {
NotificationHeaderView expandedHeader = mExpandedWrapper.getNotificationHeader();
int headerTextMargin = expandedHeader.getTopLineExtraMarginEnd();
if (headerTextMargin != contractedHeader.getTopLineExtraMarginEnd()) {
contractedHeader.setTopLineExtraMarginEnd(headerTextMargin);
return true;
}
}
return false;

View File

@@ -28,7 +28,6 @@ import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
@@ -63,8 +62,8 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
private TextView mAppNameText;
private ImageView mWorkProfileImage;
private View mAudiblyAlertedIcon;
private FrameLayout mIconContainer;
private View mFeedbackIcon;
private View mRightIcon;
private boolean mIsLowPriority;
private boolean mTransformLowPriorityTitle;
@@ -103,11 +102,11 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
}
protected void resolveHeaderViews() {
mIconContainer = mView.findViewById(com.android.internal.R.id.header_icon_container);
mIcon = mView.findViewById(com.android.internal.R.id.icon);
mHeaderText = mView.findViewById(com.android.internal.R.id.header_text);
mAppNameText = mView.findViewById(com.android.internal.R.id.app_name_text);
mExpandButton = mView.findViewById(com.android.internal.R.id.expand_button);
mRightIcon = mView.findViewById(com.android.internal.R.id.right_icon);
mWorkProfileImage = mView.findViewById(com.android.internal.R.id.profile_badge);
mNotificationHeader = mView.findViewById(com.android.internal.R.id.notification_header);
mNotificationTopLine = mView.findViewById(com.android.internal.R.id.notification_top_line);
@@ -145,6 +144,9 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
updateCropToPaddingForImageViews();
Notification notification = row.getEntry().getSbn().getNotification();
mIcon.setTag(ImageTransformState.ICON_TAG, notification.getSmallIcon());
if (mRightIcon != null) {
mRightIcon.setClipToOutline(true);
}
// We need to reset all views that are no longer transforming in case a view was previously
// transformed, but now we decided to transform its container instead.
@@ -165,19 +167,16 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
MarginLayoutParams layoutParams = (MarginLayoutParams) mAppNameText.getLayoutParams();
layoutParams.setMarginStart(0);
}
if (mIconContainer != null) {
MarginLayoutParams layoutParams = (MarginLayoutParams) mIconContainer.getLayoutParams();
layoutParams.width =
mIconContainer.getContext().getResources().getDimensionPixelSize(
com.android.internal.R.dimen.conversation_content_start);
final int marginStart =
mIconContainer.getContext().getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_content_margin_start);
layoutParams.setMarginStart(marginStart * -1);
if (mNotificationTopLine != null) {
int paddingStart = mNotificationTopLine.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.conversation_content_start);
mNotificationTopLine.setPaddingStart(paddingStart);
}
if (mIcon != null) {
MarginLayoutParams layoutParams = (MarginLayoutParams) mIcon.getLayoutParams();
layoutParams.setMarginEnd(0);
int marginStart = mIcon.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.conversation_icon_circle_start);
layoutParams.setMarginStart(marginStart);
}
}
@@ -189,20 +188,20 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
com.android.internal.R.style.TextAppearance_DeviceDefault_Notification_Info);
mAppNameText.setTextAppearance(textAppearance);
MarginLayoutParams layoutParams = (MarginLayoutParams) mAppNameText.getLayoutParams();
final int marginStart = mAppNameText.getContext().getResources().getDimensionPixelSize(
final int marginStart = mAppNameText.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_header_app_name_margin_start);
layoutParams.setMarginStart(marginStart);
}
if (mIconContainer != null) {
MarginLayoutParams layoutParams = (MarginLayoutParams) mIconContainer.getLayoutParams();
layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
layoutParams.setMarginStart(0);
if (mNotificationTopLine != null) {
int paddingStart = mNotificationTopLine.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_content_margin_start);
mNotificationTopLine.setPaddingStart(paddingStart);
}
if (mIcon != null) {
MarginLayoutParams layoutParams = (MarginLayoutParams) mIcon.getLayoutParams();
final int marginEnd = mIcon.getContext().getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_header_icon_margin_end);
layoutParams.setMarginEnd(marginEnd);
int marginStart = mIcon.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_icon_circle_start);
layoutParams.setMarginStart(marginStart);
}
}

View File

@@ -2907,17 +2907,6 @@
column="12"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.dimen.notification_header_height` appears to be unused"
errorLine1=" &lt;dimen name=&quot;notification_header_height&quot;>53dp&lt;/dimen>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/dimens.xml"
line="473"
column="12"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.dimen.speed_bump_height` appears to be unused"