Merge changes from topic "template_redesign"

* changes:
  Update variable names to reduce confusion.
  Fix/hack MessagingStyle notifications
  Reduce notification minimized height
  Fix the placement of the work profile and feedback badges.
  Fix HUNs
  Remove the unneeded icon spacing in the InboxStyle.
  Hide app name from minimized notifications
  Notification Title is 16pt in Big state
  Ensure headerless notification with large icon is big enough.
  Round corners of BigPicture
  Increase the expand button touchable area.
  Remove the reply action entirely.
  Notification template redesign; part 1.
  Remove night-mode override of notification_divider_height
This commit is contained in:
Jeff DeCew
2020-11-17 13:21:53 +00:00
committed by Android (Google) Code Review
42 changed files with 1129 additions and 831 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
@@ -92444,7 +92442,6 @@ Lcom/android/internal/R$id;->remote_input_send:I
Lcom/android/internal/R$id;->replaceText:I
Lcom/android/internal/R$id;->replace_app_icon:I
Lcom/android/internal/R$id;->replace_message:I
Lcom/android/internal/R$id;->reply_icon_action:I
Lcom/android/internal/R$id;->resolver_list:I
Lcom/android/internal/R$id;->rew:I
Lcom/android/internal/R$id;->rightSpacer:I

View File

@@ -384,6 +384,7 @@ public class Notification implements Parcelable
private static final ArraySet<Integer> STANDARD_LAYOUTS = new ArraySet<>();
static {
STANDARD_LAYOUTS.add(R.layout.notification_template_material_base);
STANDARD_LAYOUTS.add(R.layout.notification_template_material_heads_up_base);
STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_base);
STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_picture);
STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_text);
@@ -4886,13 +4887,16 @@ 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()
|| resId == getHeadsUpBaseLayoutResource());
RemoteViews contentView = new BuilderRemoteViews(mContext.getApplicationInfo(), resId);
resetStandardTemplate(contentView);
@@ -4900,9 +4904,9 @@ public class Notification implements Parcelable
final Bundle ex = mN.extras;
updateBackgroundColor(contentView, p);
bindNotificationHeader(contentView, p);
bindLargeIconAndReply(contentView, p, result);
bindLargeIconAndApplyMargin(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);
@@ -5117,53 +5121,39 @@ public class Notification implements Parcelable
}
}
private void bindLargeIconAndReply(RemoteViews contentView, StandardTemplateParams p,
TemplateBindResult result) {
private void bindLargeIconAndApplyMargin(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);
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 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;
}
int expanderSize = mContext.getResources().getDimensionPixelSize(
R.dimen.notification_header_expand_icon_size) - contentMargin;
int extraMarginEnd = 0;
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;
}
int iconSize = mContext.getResources().getDimensionPixelSize(
R.dimen.notification_right_icon_size);
extraMarginEnd = iconSize + contentMargin;
}
if (replyIconShown || largeIconShown) {
// The padding to the content
marginEnd += contentMargin;
}
return marginEnd;
result.setRightIconState(largeIconShown, extraMarginEnd, expanderSize);
}
/**
@@ -5183,54 +5173,12 @@ public class Notification implements Parcelable
return showLargeIcon;
}
/**
* Bind the reply icon.
* @return if the reply icon is visible
*/
private boolean bindReplyIcon(RemoteViews contentView, StandardTemplateParams p) {
boolean actionVisible = !p.hideReplyIcon;
Action action = null;
if (actionVisible) {
action = findReplyAction();
actionVisible = action != null;
}
if (actionVisible) {
contentView.setViewVisibility(R.id.reply_icon_action, View.VISIBLE);
contentView.setDrawableTint(R.id.reply_icon_action,
false /* targetBackground */,
getNeutralColor(p),
PorterDuff.Mode.SRC_ATOP);
contentView.setOnClickPendingIntent(R.id.reply_icon_action, action.actionIntent);
contentView.setRemoteInputs(R.id.reply_icon_action, action.mRemoteInputs);
} else {
contentView.setRemoteInputs(R.id.reply_icon_action, null);
}
contentView.setViewVisibility(R.id.reply_icon_action,
actionVisible ? View.VISIBLE : View.GONE);
return actionVisible;
}
private Action findReplyAction() {
ArrayList<Action> actions = mActions;
if (mOriginalActions != null) {
actions = mOriginalActions;
}
int numActions = actions.size();
for (int i = 0; i < numActions; i++) {
Action action = actions.get(i);
if (hasValidRemoteInput(action)) {
return action;
}
}
return null;
}
private void bindNotificationHeader(RemoteViews contentView, StandardTemplateParams p) {
bindSmallIcon(contentView, p);
bindHeaderAppName(contentView, p);
bindHeaderText(contentView, p);
bindHeaderTextSecondary(contentView, p);
bindHeaderChronometerAndTime(contentView, p);
boolean hasTextToLeft = bindHeaderAppName(contentView, p);
hasTextToLeft |= bindHeaderTextSecondary(contentView, p, hasTextToLeft);
hasTextToLeft |= bindHeaderText(contentView, p, hasTextToLeft);
bindHeaderChronometerAndTime(contentView, p, hasTextToLeft);
bindProfileBadge(contentView, p);
bindAlertedIcon(contentView, p);
bindFeedbackIcon(contentView, p);
@@ -5252,10 +5200,12 @@ public class Notification implements Parcelable
}
private void bindHeaderChronometerAndTime(RemoteViews contentView,
StandardTemplateParams p) {
StandardTemplateParams p, boolean hasTextToLeft) {
if (showsTimeOrChronometer()) {
contentView.setViewVisibility(R.id.time_divider, View.VISIBLE);
setTextViewColorSecondary(contentView, R.id.time_divider, p);
if (hasTextToLeft) {
contentView.setViewVisibility(R.id.time_divider, View.VISIBLE);
setTextViewColorSecondary(contentView, R.id.time_divider, p);
}
if (mN.extras.getBoolean(EXTRA_SHOW_CHRONOMETER)) {
contentView.setViewVisibility(R.id.chronometer, View.VISIBLE);
contentView.setLong(R.id.chronometer, "setBase",
@@ -5276,7 +5226,11 @@ public class Notification implements Parcelable
}
}
private void bindHeaderText(RemoteViews contentView, StandardTemplateParams p) {
/**
* @return true if the header text will be visible
*/
private boolean bindHeaderText(RemoteViews contentView, StandardTemplateParams p,
boolean hasTextToLeft) {
CharSequence summaryText = p.summaryText;
if (summaryText == null && mStyle != null && mStyle.mSummaryTextSet
&& mStyle.hasSummaryInHeader()) {
@@ -5293,20 +5247,32 @@ public class Notification implements Parcelable
processLegacyText(summaryText)));
setTextViewColorSecondary(contentView, R.id.header_text, p);
contentView.setViewVisibility(R.id.header_text, View.VISIBLE);
contentView.setViewVisibility(R.id.header_text_divider, View.VISIBLE);
setTextViewColorSecondary(contentView, R.id.header_text_divider, p);
if (hasTextToLeft) {
contentView.setViewVisibility(R.id.header_text_divider, View.VISIBLE);
setTextViewColorSecondary(contentView, R.id.header_text_divider, p);
}
return true;
}
return false;
}
private void bindHeaderTextSecondary(RemoteViews contentView, StandardTemplateParams p) {
/**
* @return true if the secondary header text will be visible
*/
private boolean bindHeaderTextSecondary(RemoteViews contentView, StandardTemplateParams p,
boolean hasTextToLeft) {
if (!TextUtils.isEmpty(p.headerTextSecondary)) {
contentView.setTextViewText(R.id.header_text_secondary, processTextSpans(
processLegacyText(p.headerTextSecondary)));
setTextViewColorSecondary(contentView, R.id.header_text_secondary, p);
contentView.setViewVisibility(R.id.header_text_secondary, View.VISIBLE);
contentView.setViewVisibility(R.id.header_text_secondary_divider, View.VISIBLE);
setTextViewColorSecondary(contentView, R.id.header_text_secondary_divider, p);
if (hasTextToLeft) {
contentView.setViewVisibility(R.id.header_text_secondary_divider, View.VISIBLE);
setTextViewColorSecondary(contentView, R.id.header_text_secondary_divider, p);
}
return true;
}
return false;
}
/**
@@ -5343,13 +5309,23 @@ public class Notification implements Parcelable
return String.valueOf(name);
}
private void bindHeaderAppName(RemoteViews contentView, StandardTemplateParams p) {
/**
* @return true if the app name will be visible
*/
private boolean bindHeaderAppName(RemoteViews contentView, StandardTemplateParams p) {
if (p.mViewType == StandardTemplateParams.VIEW_TYPE_MINIMIZED) {
contentView.setViewVisibility(R.id.app_name_text, View.GONE);
return false;
}
contentView.setViewVisibility(R.id.app_name_text, View.VISIBLE);
contentView.setTextViewText(R.id.app_name_text, loadHeaderAppName());
if (isColorized(p)) {
setTextViewColorPrimary(contentView, R.id.app_name_text, p);
} else {
contentView.setTextColor(R.id.app_name_text, getSecondaryTextColor(p));
}
return true;
}
private boolean isColorized(StandardTemplateParams p) {
@@ -5393,10 +5369,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(
@@ -5536,7 +5512,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() {
@@ -5551,12 +5528,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;
@@ -5569,7 +5548,9 @@ public class Notification implements Parcelable
* @hide
*/
public RemoteViews makeNotificationHeader() {
return makeNotificationHeader(mParams.reset().fillTextsFrom(this));
return makeNotificationHeader(mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_GROUP_HEADER)
.fillTextsFrom(this));
}
/**
@@ -5642,9 +5623,11 @@ 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(),
return applyStandardTemplateWithActions(getHeadsUpBaseLayoutResource(),
p,
null /* result */);
}
@@ -5690,7 +5673,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();
}
@@ -5714,6 +5699,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)) {
@@ -6199,6 +6185,10 @@ public class Notification implements Parcelable
return R.layout.notification_template_material_base;
}
private int getHeadsUpBaseLayoutResource() {
return R.layout.notification_template_material_heads_up_base;
}
private int getBigBaseLayoutResource() {
return R.layout.notification_template_material_big_base;
}
@@ -6610,7 +6600,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);
}
@@ -6939,7 +6932,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) {
@@ -7144,6 +7138,7 @@ public class Notification implements Parcelable
@Override
public RemoteViews makeHeadsUpContentView(boolean increasedHeight) {
if (increasedHeight && mBuilder.mActions.size() > 0) {
// TODO(b/163626038): pass VIEW_TYPE_HEADS_UP?
return makeBigContentView();
}
return super.makeHeadsUpContentView(increasedHeight);
@@ -7153,11 +7148,10 @@ public class Notification implements Parcelable
* @hide
*/
public RemoteViews makeBigContentView() {
StandardTemplateParams p = mBuilder.mParams.reset().fillTextsFrom(mBuilder).text(null);
TemplateBindResult result = new TemplateBindResult();
RemoteViews contentView = getStandardView(mBuilder.getBigTextLayoutResource(), p,
result);
contentView.setInt(R.id.big_text, "setImageEndMargin", result.getIconMarginEnd());
StandardTemplateParams p = mBuilder.mParams.reset()
.viewType(StandardTemplateParams.VIEW_TYPE_BIG)
.fillTextsFrom(mBuilder).text(null);
RemoteViews contentView = getStandardView(mBuilder.getBigTextLayoutResource(), p, null);
CharSequence bigTextText = mBuilder.processLegacyText(mBigText);
if (TextUtils.isEmpty(bigTextText)) {
@@ -7170,8 +7164,6 @@ public class Notification implements Parcelable
mBuilder.setTextViewColorSecondary(contentView, R.id.big_text, p);
contentView.setViewVisibility(R.id.big_text,
TextUtils.isEmpty(bigTextText) ? View.GONE : View.VISIBLE);
contentView.setBoolean(R.id.big_text, "setHasImage",
result.isRightIconContainerVisible());
return contentView;
}
@@ -7755,11 +7747,12 @@ 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)
.hideLargeIcon(hideRightIcons || isOneToOne)
.hideReplyIcon(hideRightIcons)
.headerTextSecondary(conversationTitle);
RemoteViews contentView = mBuilder.applyStandardTemplateWithActions(
isConversationLayout
@@ -7772,7 +7765,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)
@@ -8260,7 +8253,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);
@@ -8312,8 +8307,6 @@ public class Notification implements Parcelable
mBuilder.processTextSpans(mBuilder.processLegacyText(str)));
mBuilder.setTextViewColorSecondary(contentView, rowIds[i], p);
contentView.setViewPadding(rowIds[i], 0, topPadding, 0, 0);
handleInboxImageMargin(contentView, rowIds[i], first,
result.getIconMarginEnd());
if (first) {
onlyViewId = rowIds[i];
} else {
@@ -8359,20 +8352,6 @@ public class Notification implements Parcelable
}
return false;
}
private void handleInboxImageMargin(RemoteViews contentView, int id, boolean first,
int marginEndValue) {
int endMargin = 0;
if (first) {
final int max = mBuilder.mN.extras.getInt(EXTRA_PROGRESS_MAX, 0);
final boolean ind = mBuilder.mN.extras.getBoolean(EXTRA_PROGRESS_INDETERMINATE);
boolean hasProgress = max != 0 || ind;
if (!hasProgress) {
endMargin = marginEndValue;
}
}
contentView.setViewLayoutMarginEnd(id, endMargin);
}
}
/**
@@ -8580,8 +8559,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 */);
@@ -8627,8 +8607,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 */);
@@ -8727,16 +8708,18 @@ public class Notification implements Parcelable
}
TemplateBindResult result = new TemplateBindResult();
RemoteViews remoteViews = mBuilder.applyStandardTemplateWithActions(
mBuilder.getBigBaseLayoutResource(), result);
buildIntoRemoteViewContent(remoteViews, headsUpContentView, result);
mBuilder.getHeadsUpBaseLayoutResource(),
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;
}
@@ -8744,18 +8727,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
@@ -8769,11 +8750,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);
}
}
/**
@@ -11009,35 +10993,57 @@ 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;
/**
* 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;
}
/**
* Is the icon container visible on the right size because of the reply button or the
* right icon.
* @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 boolean isRightIconContainerVisible() {
return mRightIconContainerVisible;
public int getHeadingFullMarginEnd() {
return mRightIconMarginEnd + mExpanderSize;
}
public void setIconMarginEnd(int iconMarginEnd) {
this.mIconMarginEnd = iconMarginEnd;
/**
* @return the margin end that needs to be added to the title text of the big state
* so that it won't overlap with the large icon, but assuming the text can run under
* the expander when that icon is not visible.
*/
public int getTitleMarginEnd() {
return mRightIconVisible ? getHeadingFullMarginEnd() : 0;
}
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;
public static int VIEW_TYPE_GROUP_HEADER = 6;
int mViewType = VIEW_TYPE_UNSPECIFIED;
boolean mHeaderless;
boolean hasProgress = true;
CharSequence title;
CharSequence text;
@@ -11045,11 +11051,12 @@ public class Notification implements Parcelable
CharSequence summaryText;
int maxRemoteInputHistory = Style.MAX_REMOTE_INPUT_HISTORY_LINES;
boolean hideLargeIcon;
boolean hideReplyIcon;
boolean allowColorization = true;
boolean forceDefaultColor = false;
final StandardTemplateParams reset() {
mViewType = VIEW_TYPE_UNSPECIFIED;
mHeaderless = false;
hasProgress = true;
title = null;
text = null;
@@ -11061,6 +11068,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;
@@ -11091,11 +11108,6 @@ public class Notification implements Parcelable
return this;
}
final StandardTemplateParams hideReplyIcon(boolean hideReplyIcon) {
this.hideReplyIcon = hideReplyIcon;
return this;
}
final StandardTemplateParams disallowColorization() {
this.allowColorization = false;
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

@@ -26,9 +26,6 @@ import android.widget.RemoteViews;
import com.android.internal.R;
import java.util.Arrays;
import java.util.List;
/**
* The top line of content in a notification view.
* This includes the text views and badges but excludes the icon and the expander.
@@ -39,16 +36,14 @@ import java.util.List;
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;
private HeaderTouchListener mTouchListener = new HeaderTouchListener();
private View mProfileBadge;
private View mFeedbackIcon;
private int mHeaderTextMarginEnd;
private List<View> mIconsAtEnd;
private int mMaxAscent;
private int mMaxDescent;
@@ -71,7 +66,6 @@ public class NotificationTopLineView extends ViewGroup {
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);
// NOTE: Implementation only supports TOP, BOTTOM, and CENTER_VERTICAL gravities,
// with CENTER_VERTICAL being the default.
@@ -92,11 +86,10 @@ 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);
mFeedbackIcon = findViewById(R.id.feedback);
mIconsAtEnd = Arrays.asList(mProfileBadge, mFeedbackIcon);
}
@Override
@@ -109,7 +102,6 @@ public class NotificationTopLineView extends ViewGroup {
int wrapContentHeightSpec = MeasureSpec.makeMeasureSpec(givenHeight,
MeasureSpec.AT_MOST);
int totalWidth = getPaddingStart();
int iconWidth = getPaddingEnd();
int maxChildHeight = -1;
mMaxAscent = -1;
mMaxDescent = -1;
@@ -125,12 +117,7 @@ public class NotificationTopLineView extends ViewGroup {
int childHeightSpec = getChildMeasureSpec(wrapContentHeightSpec,
lp.topMargin + lp.bottomMargin, lp.height);
child.measure(childWidthSpec, childHeightSpec);
// Icons that should go at the end
if (mIconsAtEnd.contains(child)) {
iconWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth();
} else {
totalWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth();
}
totalWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth();
int childBaseline = child.getBaseline();
int childHeight = child.getMeasuredHeight();
if (childBaseline != -1) {
@@ -141,12 +128,20 @@ public class NotificationTopLineView extends ViewGroup {
}
// Ensure that there is at least enough space for the icons
int endMargin = Math.max(mHeaderTextMarginEnd, iconWidth);
int endMargin = Math.max(mHeaderTextMarginEnd, getPaddingEnd());
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);
@@ -174,7 +169,6 @@ public class NotificationTopLineView extends ViewGroup {
@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 = b - t;
int childSpace = ownHeight - mPaddingTop - mPaddingBottom;
@@ -228,22 +222,12 @@ public class NotificationTopLineView extends ViewGroup {
childTop = mPaddingTop;
}
// Icons that should go at the end
if (mIconsAtEnd.contains(child)) {
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();
}
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;
@@ -298,6 +282,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

@@ -134,7 +134,6 @@ public class ConversationLayout extends FrameLayout
private CachingIconView mConversationIconBadgeBg;
private Icon mLargeIcon;
private View mExpandButtonContainer;
private View mExpandButtonInnerContainer;
private ViewGroup mExpandButtonAndContentContainer;
private NotificationExpandButton mExpandButton;
private MessagingLinearLayout mImageMessageContainer;
@@ -266,7 +265,6 @@ public class ConversationLayout extends FrameLayout
mConversationHeader = findViewById(R.id.conversation_header);
mContentContainer = findViewById(R.id.notification_action_list_margin_target);
mExpandButtonAndContentContainer = findViewById(R.id.expand_button_and_content_container);
mExpandButtonInnerContainer = findViewById(R.id.expand_button_inner_container);
mExpandButton = findViewById(R.id.expand_button);
mExpandButtonExpandedTopMargin = getResources().getDimensionPixelSize(
R.dimen.conversation_expand_button_top_margin_expanded);
@@ -1217,25 +1215,18 @@ public class ConversationLayout extends FrameLayout
}
private void updateExpandButton() {
int drawableId;
int contentDescriptionId;
int gravity;
int topMargin = 0;
ViewGroup newContainer;
if (mIsCollapsed) {
drawableId = R.drawable.ic_expand_notification;
contentDescriptionId = R.string.expand_button_content_description_collapsed;
gravity = Gravity.CENTER;
newContainer = mExpandButtonAndContentContainer;
} else {
drawableId = R.drawable.ic_collapse_notification;
contentDescriptionId = R.string.expand_button_content_description_expanded;
gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
topMargin = mExpandButtonExpandedTopMargin;
newContainer = this;
}
mExpandButton.setImageDrawable(getContext().getDrawable(drawableId));
mExpandButton.setColorFilter(mExpandButton.getOriginalNotificationColor());
mExpandButton.setExpanded(!mIsCollapsed);
// We need to make sure that the expand button is in the linearlayout pushing over the
// content when collapsed, but allows the content to flow under it when expanded.
@@ -1250,8 +1241,6 @@ public class ConversationLayout extends FrameLayout
layoutParams.gravity = gravity;
layoutParams.topMargin = topMargin;
mExpandButton.setLayoutParams(layoutParams);
mExpandButtonInnerContainer.setContentDescription(mContext.getText(contentDescriptionId));
}
private void updateContentEndPaddings() {
@@ -1298,7 +1287,7 @@ public class ConversationLayout extends FrameLayout
mExpandable = expandable;
if (expandable) {
mExpandButtonContainer.setVisibility(VISIBLE);
mExpandButtonInnerContainer.setOnClickListener(onClickListener);
mExpandButton.setOnClickListener(onClickListener);
mConversationIconContainer.setOnClickListener(onClickListener);
} else {
mExpandButtonContainer.setVisibility(GONE);

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

@@ -23,6 +23,7 @@ import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.RemotableViewMethod;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Button;
import android.widget.ImageView;
@@ -36,33 +37,58 @@ import com.android.internal.R;
@RemoteViews.RemoteView
public class NotificationExpandButton extends ImageView {
private final int mMinTouchTargetSize;
private boolean mExpanded;
private int mOriginalNotificationColor;
public NotificationExpandButton(Context context) {
super(context);
this(context, null, 0, 0);
}
public NotificationExpandButton(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
this(context, attrs, 0, 0);
}
public NotificationExpandButton(Context context, @Nullable AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
this(context, attrs, defStyleAttr, 0);
}
public NotificationExpandButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mMinTouchTargetSize = (int) (getResources().getDisplayMetrics().density * 48 + 0.5);
}
/**
* Show the touchable area of the view for a11y.
* If the parent is the touch container, then that view's bounds are the touchable area.
*/
@Override
public void getBoundsOnScreen(Rect outRect, boolean clipToParent) {
super.getBoundsOnScreen(outRect, clipToParent);
ViewGroup parent = (ViewGroup) getParent();
if (parent != null && parent.getId() == R.id.expand_button_touch_container) {
parent.getBoundsOnScreen(outRect, clipToParent);
} else {
super.getBoundsOnScreen(outRect, clipToParent);
}
extendRectToMinTouchSize(outRect);
}
/**
* Determined if the given point should be touchable.
* If the parent is the touch container, then any point in that view should be touchable.
*/
@Override
public boolean pointInView(float localX, float localY, float slop) {
ViewGroup parent = (ViewGroup) getParent();
if (parent != null && parent.getId() == R.id.expand_button_touch_container) {
// If our parent is checking with us, then the point must be within its bounds.
return true;
}
return super.pointInView(localX, localY, slop);
}
@RemotableViewMethod
public void setOriginalNotificationColor(int color) {
mOriginalNotificationColor = color;
@@ -81,11 +107,14 @@ public class NotificationExpandButton extends ImageView {
}
private void extendRectToMinTouchSize(Rect rect) {
int touchTargetSize = (int) (getResources().getDisplayMetrics().density * 48);
rect.left = rect.centerX() - touchTargetSize / 2;
rect.right = rect.left + touchTargetSize;
rect.top = rect.centerY() - touchTargetSize / 2;
rect.bottom = rect.top + touchTargetSize;
if (rect.width() < mMinTouchTargetSize) {
rect.left = rect.centerX() - mMinTouchTargetSize / 2;
rect.right = rect.left + mMinTouchTargetSize;
}
if (rect.height() < mMinTouchTargetSize) {
rect.top = rect.centerY() - mMinTouchTargetSize / 2;
rect.bottom = rect.top + mMinTouchTargetSize;
}
}
@Override

View File

@@ -0,0 +1,81 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.widget;
import android.annotation.Nullable;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import android.widget.RemoteViews;
/**
* This custom subclass of FrameLayout enforces that its calculated height be no larger than the
* standard height of a notification. This is not required in the normal case, as the
* NotificationContentView gets this same value from the ExpandableNotificationRow, and enforces it
* as a maximum. It is required in the case of the HUN version of the headerless notification,
* because that style puts the actions below the headerless portion. If we don't cap this, then in
* certain situations (larger fonts, decorated custom views) the contents of the headerless
* notification push on the margins and increase the size of that view, which causes the actions to
* be cropped on the bottom by the HUN notification max height.
*/
@RemoteViews.RemoteView
public class NotificationMaxHeightFrameLayout extends FrameLayout {
private final int mNotificationMaxHeight;
public NotificationMaxHeightFrameLayout(Context context) {
this(context, null, 0, 0);
}
public NotificationMaxHeightFrameLayout(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0, 0);
}
public NotificationMaxHeightFrameLayout(Context context, @Nullable AttributeSet attrs,
int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public NotificationMaxHeightFrameLayout(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
// `notification_min_height` refers to "minimized" not "minimum"; it is a max height
mNotificationMaxHeight = getFontScaledHeight(mContext,
com.android.internal.R.dimen.notification_min_height);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (MeasureSpec.getSize(heightMeasureSpec) > mNotificationMaxHeight) {
final int mode = MeasureSpec.getMode(heightMeasureSpec);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(mNotificationMaxHeight, mode);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/**
* NOTE: This is copied from com.android.systemui.statusbar.notification.NotificationUtils
*
* @param dimenId the dimen to look up
* @return the font scaled dimen as if it were in sp but doesn't shrink sizes below dp
*/
private static int getFontScaledHeight(Context context, int dimenId) {
final int dimensionPixelSize = context.getResources().getDimensionPixelSize(dimenId);
final float factor = Math.max(1.0f, context.getResources().getDisplayMetrics().scaledDensity
/ context.getResources().getDisplayMetrics().density);
return (int) (dimensionPixelSize * factor);
}
}

View File

@@ -1,32 +0,0 @@
<!--
~ Copyright (C) 2017 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
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:inset="@dimen/notification_reply_inset">
<vector android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000000"
android:strokeWidth="1"
android:pathData="M16,10 L6.83,10 L9,7.83 L10.41,6.42 L9,5 L3,11 L9,17 L10.41,15.59 L9,14.17 L6.83,12 L16,12 C17.65,12 19,13.35 19,15 L19,19 L21,19 L21,15 C21,12.24 18.76,10 16,10 Z" />
<path
android:fillColor="#000000"
android:strokeWidth="1"
android:pathData="M16,10 L6.83,10 L9,7.83 L10.41,6.42 L9,5 L3,11 L9,17 L10.41,15.59 L9,14.17 L6.83,12 L16,12 C17.65,12 19,13.35 19,15 L19,19 L21,19 L21,15 C21,12.24 18.76,10 16,10 Z" />
</vector>
</inset>

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="16dp" />
<solid android:color="#00000000" />
</shape>

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");
@@ -15,30 +14,115 @@
~ limitations under the License
-->
<FrameLayout
<com.android.internal.widget.NotificationMaxHeightFrameLayout
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: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" />
</FrameLayout>
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_marginTop="@dimen/notification_right_icon_headerless_margin"
android:layout_marginBottom="@dimen/notification_right_icon_headerless_margin"
android:layout_marginEnd="@dimen/notification_header_expand_icon_size"
android:background="@drawable/notification_large_icon_outline"
android:importantForAccessibility="no"
android:scaleType="centerCrop"
/>
<FrameLayout
android:id="@+id/expand_button_touch_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end">
<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:contentDescription="@string/expand_button_content_description_collapsed"
android:paddingTop="@dimen/notification_expand_button_padding_top"
android:scaleType="center"
/>
</FrameLayout>
</com.android.internal.widget.NotificationMaxHeightFrameLayout>

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,40 @@
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" />
</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,83 @@
~ 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" />
<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:background="@drawable/notification_big_picture_outline"
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,24 @@
/>
</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" />
</FrameLayout>

View File

@@ -33,6 +33,7 @@
android:clipToPadding="false"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:importantForAccessibility="no"
>
<FrameLayout
@@ -206,17 +207,19 @@
android:visibility="gone"
/>
<ImageView
android:id="@+id/alerted_icon"
android:layout_width="@dimen/notification_alerted_size"
android:layout_height="@dimen/notification_alerted_size"
<ImageButton
android:id="@+id/feedback"
android:layout_width="@dimen/notification_feedback_size"
android:layout_height="@dimen/notification_feedback_size"
android:layout_gravity="center"
android:layout_marginStart="4dp"
android:layout_marginStart="@dimen/notification_header_separating_margin"
android:background="?android:selectableItemBackgroundBorderless"
android:contentDescription="@string/notification_feedback_indicator"
android:paddingTop="2dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_feedback_indicator"
android:visibility="gone"
android:contentDescription="@string/notification_alerted_content_description"
android:src="@drawable/ic_notifications_alerted"/>
/>
<ImageView
android:id="@+id/profile_badge"
@@ -228,7 +231,21 @@
android:scaleType="fitCenter"
android:visibility="gone"
android:contentDescription="@string/notification_work_profile_content_description"
/>
/>
<ImageView
android:id="@+id/alerted_icon"
android:layout_width="@dimen/notification_alerted_size"
android:layout_height="@dimen/notification_alerted_size"
android:layout_gravity="center"
android:layout_marginStart="4dp"
android:contentDescription="@string/notification_alerted_content_description"
android:paddingTop="2dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_notifications_alerted"
android:visibility="gone"
/>
<LinearLayout
android:id="@+id/app_ops"
android:layout_height="wrap_content"
@@ -268,19 +285,6 @@
android:contentDescription="@string/notification_appops_overlay_active"
/>
</LinearLayout>
<ImageButton
android:id="@+id/feedback"
android:layout_width="@dimen/notification_feedback_size"
android:layout_height="@dimen/notification_feedback_size"
android:layout_marginStart="@dimen/notification_header_separating_margin"
android:paddingTop="2dp"
android:layout_gravity="center"
android:scaleType="fitCenter"
android:src="@drawable/ic_feedback_indicator"
android:background="?android:selectableItemBackgroundBorderless"
android:visibility="gone"
android:contentDescription="@string/notification_feedback_indicator"
/>
</LinearLayout>
<!-- Messages -->
@@ -320,7 +324,7 @@
collapsed layout while the parent makes sure that we're never laid out bigger
than the messaging content.-->
<LinearLayout
android:id="@+id/expand_button_inner_container"
android:id="@+id/expand_button_touch_container"
android:layout_width="wrap_content"
android:layout_height="@dimen/conversation_expand_button_size"
android:paddingStart="16dp"
@@ -359,12 +363,11 @@
/>
<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"
android:importantForAccessibility="no"
android:contentDescription="@string/expand_button_content_description_collapsed"
/>
</LinearLayout>
</FrameLayout>

View File

@@ -0,0 +1,65 @@
<?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.
~ 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
-->
<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:orientation="vertical"
android:clipChildren="false"
android:tag="headsUp"
>
<com.android.internal.widget.RemeasuringLinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:orientation="vertical"
>
<include
layout="@layout/notification_template_material_base"
android:id="@null"
/>
<com.android.internal.widget.RemeasuringLinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="-12dp"
android:clipChildren="false"
android:orientation="vertical"
>
<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>
</com.android.internal.widget.RemeasuringLinearLayout>
</FrameLayout>

View File

@@ -57,5 +57,5 @@
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" />
</com.android.internal.widget.MessagingLayout>

View File

@@ -22,7 +22,7 @@
android:orientation="horizontal"
>
<TextView android:id="@+id/title"
android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title"
android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.BigTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"

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,11 +13,12 @@
~ 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"
android:layout_height="wrap_content"
android:layout_height="@dimen/notification_text_height"
android:layout_gravity="top"
android:layout_marginTop="@dimen/notification_text_margin_top"
android:ellipsize="marquee"

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,17 +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"
android:layout_height="@dimen/notification_alerted_size"
android:layout_marginStart="4dp"
android:baseline="10dp"
android:scaleType="fitCenter"
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 +110,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 +122,17 @@
android:visibility="gone"
android:contentDescription="@string/notification_work_profile_content_description"
/>
</NotificationTopLineView>
<ImageView
android:id="@+id/alerted_icon"
android:layout_width="@dimen/notification_alerted_size"
android:layout_height="@dimen/notification_alerted_size"
android:layout_marginStart="4dp"
android:baseline="10dp"
android:contentDescription="@string/notification_alerted_content_description"
android:scaleType="fitCenter"
android:src="@drawable/ic_notifications_alerted"
android:visibility="gone"
/>
</merge>

View File

@@ -207,14 +207,14 @@
<!-- 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 inset of the reply icon. -->
<dimen name="notification_reply_inset">8dp</dimen>
<!-- The margin on the end of the top-line content views (accommodates the expander) -->
<dimen name="notification_heading_margin_end">48dp</dimen>
<!-- The margin for text at the end of the image view for media notifications -->
<dimen name="notification_media_image_margin_end">72dp</dimen>
@@ -228,11 +228,18 @@
<!-- 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>
<!-- height of the content margin to accomodate for the header -->
<dimen name="notification_content_margin_top">46dp</dimen>
<dimen name="notification_content_margin_top">50dp</dimen>
<!-- height of the content margin that is applied at the end of the notification content -->
<dimen name="notification_content_margin">20dp</dimen>
@@ -243,8 +250,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 +268,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,14 +292,23 @@
<!-- 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>
<dimen name="notification_min_height">76dp</dimen>
<!-- The width of the big icons in notifications. -->
<dimen name="notification_large_icon_width">64dp</dimen>
@@ -310,7 +335,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>
@@ -426,6 +451,8 @@
<dimen name="notification_text_size">14sp</dimen>
<!-- Size of notification text titles (see TextAppearance.StatusBar.EventContent.Title) -->
<dimen name="notification_title_text_size">14sp</dimen>
<!-- Size of big notification text titles (see TextAppearance.StatusBar.EventContent.BigTitle) -->
<dimen name="notification_big_title_text_size">16sp</dimen>
<!-- Size of smaller notification text (see TextAppearance.StatusBar.EventContent.Line2, Info, Time) -->
<dimen name="notification_subtext_size">12sp</dimen>
<!-- Top padding for notifications in the standard layout. -->
@@ -444,7 +471,10 @@
<dimen name="notification_large_icon_circle_padding">11dp</dimen>
<!-- The margin on top of the text of the notification -->
<dimen name="notification_text_margin_top">0.5dp</dimen>
<dimen name="notification_text_margin_top">6dp</dimen>
<!-- Height of a single line text view in a notification -->
<dimen name="notification_text_height">20sp</dimen>
<!-- The padding on top of inbox style elements -->
<dimen name="notification_inbox_item_top_padding">5dp</dimen>
@@ -679,7 +709,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 and bottom margin of the right icon in the normal notification states -->
<dimen name="notification_right_icon_headerless_margin">12dp</dimen>
<!-- The top margin of the right icon in the "big" notification states -->
<dimen name="notification_right_icon_big_margin_top">16dp</dimen>
<!-- The alpha of a disabled notification button -->
<item type="dimen" format="float" name="notification_action_disabled_alpha">0.5</item>
@@ -700,8 +734,10 @@
<!-- The maximum size of the grayscale icon -->
<dimen name="notification_grayscale_icon_max_size">256dp</dimen>
<dimen name="messaging_avatar_size">@dimen/notification_right_icon_size</dimen>
<dimen name="messaging_avatar_size">36dp</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

@@ -290,6 +290,9 @@ easier.
<style name="TextAppearance.DeviceDefault.Notification.Title" parent="TextAppearance.Material.Notification.Title">
<item name="fontFamily">@string/config_headlineFontFamilyMedium</item>
</style>
<style name="TextAppearance.DeviceDefault.Notification.BigTitle" parent="TextAppearance.Material.Notification.BigTitle">
<item name="fontFamily">@string/config_headlineFontFamilyMedium</item>
</style>
<style name="TextAppearance.DeviceDefault.Notification.Reply" parent="TextAppearance.Material.Notification.Reply">
<item name="fontFamily">@string/config_bodyFontFamily</item>
</style>

View File

@@ -477,6 +477,11 @@ please see styles_device_defaults.xml.
<item name="textSize">@dimen/notification_title_text_size</item>
</style>
<style name="TextAppearance.Material.Notification.BigTitle">
<item name="fontFamily">sans-serif-medium</item>
<item name="textSize">@dimen/notification_big_title_text_size</item>
</style>
<style name="TextAppearance.Material.Notification.Line2">
<item name="textSize">@dimen/notification_subtext_size</item>
</style>

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" />
@@ -2184,6 +2185,7 @@
<java-symbol type="layout" name="notification_material_action_list" />
<java-symbol type="layout" name="notification_material_action_tombstone" />
<java-symbol type="layout" name="notification_template_material_base" />
<java-symbol type="layout" name="notification_template_material_heads_up_base" />
<java-symbol type="layout" name="notification_template_material_big_base" />
<java-symbol type="layout" name="notification_template_material_big_picture" />
<java-symbol type="layout" name="notification_template_material_inbox" />
@@ -2873,14 +2875,12 @@
<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_reply_inset" />
<java-symbol type="dimen" name="notification_heading_margin_end" />
<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" />
@@ -3401,9 +3401,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"/>
<java-symbol type="id" name="input_header"/>
@@ -3937,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" />
@@ -3949,7 +3947,7 @@
<java-symbol type="id" name="conversation_icon_badge_ring" />
<java-symbol type="id" name="conversation_icon_badge_bg" />
<java-symbol type="id" name="expand_button_container" />
<java-symbol type="id" name="expand_button_inner_container" />
<java-symbol type="id" name="expand_button_touch_container" />
<java-symbol type="id" name="messaging_group_content_container" />
<java-symbol type="id" name="expand_button_and_content_container" />
<java-symbol type="id" name="conversation_header" />

View File

@@ -16,8 +16,6 @@
-->
<resources>
<!-- The height of the divider between the individual notifications. -->
<dimen name="notification_divider_height">1dp</dimen>
<!-- Height of the background gradient behind the screenshot UI (taller in dark mode) -->
<dimen name="screenshot_bg_protection_height">375dp</dimen>

View File

@@ -133,17 +133,23 @@
<!-- Height of a small notification in the status bar which was used before android P -->
<dimen name="notification_min_height_before_p">92dp</dimen>
<!-- Height of a small notification in the status bar which was used before android S -->
<dimen name="notification_min_height_before_s">106dp</dimen>
<!-- Height of a large notification in the status bar -->
<dimen name="notification_max_height">294dp</dimen>
<!-- Height of a heads up notification in the status bar for legacy custom views -->
<dimen name="notification_max_heads_up_height_legacy">128dp</dimen>
<!-- Height of a heads up notification in the status bar for custom views before andoid P -->
<!-- Height of a heads up notification in the status bar for custom views before android P -->
<dimen name="notification_max_heads_up_height_before_p">148dp</dimen>
<!-- Height of a heads up notification in the status bar for custom views before android S -->
<dimen name="notification_max_heads_up_height_before_s">162dp</dimen>
<!-- Height of a heads up notification in the status bar -->
<dimen name="notification_max_heads_up_height">162dp</dimen>
<dimen name="notification_max_heads_up_height">132dp</dimen>
<!-- Height of a heads up notification in the status bar -->
<dimen name="notification_max_heads_up_height_increased">188dp</dimen>

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

@@ -28,6 +28,7 @@ public interface TransformableView {
int TRANSFORMING_VIEW_IMAGE = 3;
int TRANSFORMING_VIEW_PROGRESS = 4;
int TRANSFORMING_VIEW_ACTIONS = 5;
int TRANSFORMING_VIEW_EXPANDER = 6;
/**
* Get the current state of a view in a transform animation

View File

@@ -456,9 +456,6 @@ public class TransformState {
if (view instanceof ImageView) {
ImageTransformState result = ImageTransformState.obtain();
result.initFrom(view, transformInfo);
if (view.getId() == com.android.internal.R.id.reply_icon_action) {
((TransformState) result).setIsSameAsAnyView(true);
}
return result;
}
if (view instanceof ProgressBar) {

View File

@@ -35,7 +35,6 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Path;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.AnimationDrawable;
@@ -71,6 +70,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.widget.CachingIconView;
import com.android.internal.widget.MessagingLayout;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
@@ -154,14 +154,16 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private int mIconTransformContentShift;
private int mMaxHeadsUpHeightBeforeN;
private int mMaxHeadsUpHeightBeforeP;
private int mMaxHeadsUpHeightBeforeS;
private int mMaxHeadsUpHeight;
private int mMaxHeadsUpHeightIncreased;
private int mNotificationMinHeightBeforeN;
private int mNotificationMinHeightBeforeP;
private int mNotificationMinHeight;
private int mNotificationMinHeightLarge;
private int mNotificationMinHeightMedia;
private int mNotificationMaxHeight;
private int mMaxSmallHeightBeforeN;
private int mMaxSmallHeightBeforeP;
private int mMaxSmallHeightBeforeS;
private int mMaxSmallHeight;
private int mMaxSmallHeightLarge;
private int mMaxSmallHeightMedia;
private int mMaxExpandedHeight;
private int mIncreasedPaddingBetweenElements;
private int mNotificationLaunchHeight;
private boolean mMustStayOnScreen;
@@ -647,28 +649,48 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
!= com.android.internal.R.id.status_bar_latest_event_content;
boolean beforeN = mEntry.targetSdk < Build.VERSION_CODES.N;
boolean beforeP = mEntry.targetSdk < Build.VERSION_CODES.P;
int minHeight;
boolean beforeS = mEntry.targetSdk < Build.VERSION_CODES.S;
int smallHeight;
View expandedView = layout.getExpandedChild();
boolean isMediaLayout = expandedView != null
&& expandedView.findViewById(com.android.internal.R.id.media_actions) != null;
boolean isMessagingLayout = layout.getContractedChild() instanceof MessagingLayout;
boolean showCompactMediaSeekbar = mMediaManager.getShowCompactMediaSeekbar();
if (customView && beforeP && !mIsSummaryWithChildren) {
minHeight = beforeN ? mNotificationMinHeightBeforeN : mNotificationMinHeightBeforeP;
if (customView && beforeS && !mIsSummaryWithChildren) {
if (beforeN) {
smallHeight = mMaxSmallHeightBeforeN;
} else if (beforeP) {
smallHeight = mMaxSmallHeightBeforeP;
} else {
smallHeight = mMaxSmallHeightBeforeS;
}
} else if (isMediaLayout && showCompactMediaSeekbar) {
minHeight = mNotificationMinHeightMedia;
smallHeight = mMaxSmallHeightMedia;
} else if (isMessagingLayout) {
// TODO(b/173204301): MessagingStyle notifications currently look broken when we enforce
// the standard notification height, so we have to afford them more vertical space to
// make sure we don't crop them terribly. We actually need to revisit this and give
// them a headerless design, then remove this hack.
smallHeight = mMaxSmallHeightLarge;
} else if (mUseIncreasedCollapsedHeight && layout == mPrivateLayout) {
minHeight = mNotificationMinHeightLarge;
smallHeight = mMaxSmallHeightLarge;
} else {
minHeight = mNotificationMinHeight;
smallHeight = mMaxSmallHeight;
}
boolean headsUpCustom = layout.getHeadsUpChild() != null &&
layout.getHeadsUpChild().getId()
!= com.android.internal.R.id.status_bar_latest_event_content;
int headsUpHeight;
if (headsUpCustom && beforeP) {
headsUpHeight = beforeN ? mMaxHeadsUpHeightBeforeN : mMaxHeadsUpHeightBeforeP;
if (headsUpCustom && beforeS) {
if (beforeN) {
headsUpHeight = mMaxHeadsUpHeightBeforeN;
} else if (beforeP) {
headsUpHeight = mMaxHeadsUpHeightBeforeP;
} else {
headsUpHeight = mMaxHeadsUpHeightBeforeS;
}
} else if (mUseIncreasedHeadsUpHeight && layout == mPrivateLayout) {
headsUpHeight = mMaxHeadsUpHeightIncreased;
} else {
@@ -679,7 +701,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
if (headsUpWrapper != null) {
headsUpHeight = Math.max(headsUpHeight, headsUpWrapper.getMinLayoutHeight());
}
layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight);
layout.setHeights(smallHeight, headsUpHeight, mMaxExpandedHeight);
}
@NonNull
@@ -1598,22 +1620,26 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
private void initDimens() {
mNotificationMinHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext,
mMaxSmallHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_min_height_legacy);
mNotificationMinHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext,
mMaxSmallHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_min_height_before_p);
mNotificationMinHeight = NotificationUtils.getFontScaledHeight(mContext,
mMaxSmallHeightBeforeS = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_min_height_before_s);
mMaxSmallHeight = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_min_height);
mNotificationMinHeightLarge = NotificationUtils.getFontScaledHeight(mContext,
mMaxSmallHeightLarge = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_min_height_increased);
mNotificationMinHeightMedia = NotificationUtils.getFontScaledHeight(mContext,
mMaxSmallHeightMedia = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_min_height_media);
mNotificationMaxHeight = NotificationUtils.getFontScaledHeight(mContext,
mMaxExpandedHeight = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_height);
mMaxHeadsUpHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_heads_up_height_legacy);
mMaxHeadsUpHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_heads_up_height_before_p);
mMaxHeadsUpHeightBeforeS = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_heads_up_height_before_s);
mMaxHeadsUpHeight = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_heads_up_height);
mMaxHeadsUpHeightIncreased = NotificationUtils.getFontScaledHeight(mContext,

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

@@ -40,6 +40,8 @@ public class NotificationBigPictureTemplateViewWrapper extends NotificationTempl
public void onContentUpdated(ExpandableNotificationRow row) {
super.onContentUpdated(row);
updateImageTag(row.getEntry().getSbn());
// Round the corners of the big picture content
mView.findViewById(com.android.internal.R.id.big_picture).setClipToOutline(true);
}
private void updateImageTag(StatusBarNotification notification) {

View File

@@ -50,7 +50,6 @@ class NotificationConversationTemplateViewWrapper constructor(
private lateinit var conversationBadgeBg: View
private lateinit var expandButton: View
private lateinit var expandButtonContainer: View
private lateinit var expandButtonInnerContainer: View
private lateinit var imageMessageContainer: ViewGroup
private lateinit var messagingLinearLayout: MessagingLinearLayout
private lateinit var conversationTitleView: View
@@ -70,8 +69,6 @@ class NotificationConversationTemplateViewWrapper constructor(
expandButton = requireViewById(com.android.internal.R.id.expand_button)
expandButtonContainer =
requireViewById(com.android.internal.R.id.expand_button_container)
expandButtonInnerContainer =
requireViewById(com.android.internal.R.id.expand_button_inner_container)
importanceRing = requireViewById(com.android.internal.R.id.conversation_icon_badge_ring)
appName = requireViewById(com.android.internal.R.id.app_name_text)
conversationTitleView = requireViewById(com.android.internal.R.id.conversation_text)
@@ -137,7 +134,7 @@ class NotificationConversationTemplateViewWrapper constructor(
)
}
override fun getExpandButton() = expandButtonInnerContainer
override fun getExpandButton() = super.getExpandButton()
override fun setShelfIconVisible(visible: Boolean) {
if (conversationLayout.isImportantConversation) {

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);
}
}
@@ -241,8 +240,9 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
protected void updateTransformedTypes() {
mTransformationHelper.reset();
mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_ICON,
mIcon);
mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_ICON, mIcon);
mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_EXPANDER,
mExpandButton);
mTransformationHelper.addViewTransformingToSimilar(mWorkProfileImage);
if (mIsLowPriority && mHeaderText != null) {
mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_TITLE,

View File

@@ -16,14 +16,14 @@
package com.android.systemui.statusbar.notification.row.wrapper;
import static android.view.View.VISIBLE;
import static com.android.systemui.statusbar.notification.row.ExpandableNotificationRow.DEFAULT_HEADER_VISIBLE_AMOUNT;
import android.app.PendingIntent;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
import android.view.View;
@@ -56,7 +56,6 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp
private TextView mTitle;
private TextView mText;
protected View mActionsContainer;
private ImageView mReplyAction;
private int mContentHeight;
private int mMinHeightHint;
@@ -64,6 +63,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp
private ArraySet<PendingIntent> mCancelledPendingIntents = new ArraySet<>();
private UiOffloadThread mUiOffloadThread;
private View mRemoteInputHistory;
private boolean mCanHideHeader;
private float mHeaderTranslation;
protected NotificationTemplateViewWrapper(Context ctx, View view,
@@ -156,7 +156,6 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp
}
mActionsContainer = mView.findViewById(com.android.internal.R.id.actions_container);
mActions = mView.findViewById(com.android.internal.R.id.actions);
mReplyAction = mView.findViewById(com.android.internal.R.id.reply_icon_action);
mRemoteInputHistory = mView.findViewById(
com.android.internal.R.id.notification_material_reply_container);
updatePendingIntentCancellations();
@@ -190,31 +189,6 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp
});
}
}
if (mReplyAction != null) {
// Let's reset the view on update, assuming the new pending intent isn't cancelled
// anymore. The color filter automatically resets when it's updated.
mReplyAction.setEnabled(true);
performOnPendingIntentCancellation(mReplyAction, () -> {
if (mReplyAction != null && mReplyAction.isEnabled()) {
mReplyAction.setEnabled(false);
// The visual appearance doesn't look disabled enough yet, let's add the
// alpha as well. Since Alpha doesn't play nicely right now with the
// transformation, we rather blend it manually with the background color.
Drawable drawable = mReplyAction.getDrawable().mutate();
PorterDuffColorFilter colorFilter =
(PorterDuffColorFilter) drawable.getColorFilter();
float disabledAlpha = mView.getResources().getFloat(
com.android.internal.R.dimen.notification_action_disabled_alpha);
if (colorFilter != null) {
int color = colorFilter.getColor();
color = blendColorWithBackground(color, disabledAlpha);
drawable.mutate().setColorFilter(color, colorFilter.getMode());
} else {
mReplyAction.setAlpha(disabledAlpha);
}
}
});
}
}
private int blendColorWithBackground(int color, float alpha) {
@@ -259,22 +233,16 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp
}
}
@Override
public boolean disallowSingleClick(float x, float y) {
if (mReplyAction != null && mReplyAction.getVisibility() == View.VISIBLE) {
if (isOnView(mReplyAction, x, y) || isOnView(mPicture, x, y)) {
return true;
}
}
return super.disallowSingleClick(x, y);
}
@Override
public void onContentUpdated(ExpandableNotificationRow row) {
// Reinspect the notification. Before the super call, because the super call also updates
// the transformation types and we need to have our values set by then.
resolveTemplateViews(row.getEntry().getSbn());
super.onContentUpdated(row);
// With the modern templates, a large icon visually overlaps the header, so we can't
// simply hide the header -- just show the
mCanHideHeader = mNotificationHeader != null
&& (mPicture == null || mPicture.getVisibility() != VISIBLE);
if (row.getHeaderVisibleAmount() != DEFAULT_HEADER_VISIBLE_AMOUNT) {
setHeaderVisibleAmount(row.getHeaderVisibleAmount());
}
@@ -333,14 +301,14 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp
@Override
public int getHeaderTranslation(boolean forceNoHeader) {
return forceNoHeader ? mFullHeaderTranslation : (int) mHeaderTranslation;
return forceNoHeader && mCanHideHeader ? mFullHeaderTranslation : (int) mHeaderTranslation;
}
@Override
public void setHeaderVisibleAmount(float headerVisibleAmount) {
super.setHeaderVisibleAmount(headerVisibleAmount);
float headerTranslation = 0f;
if (mNotificationHeader != null) {
if (mCanHideHeader && mNotificationHeader != null) {
mNotificationHeader.setAlpha(headerVisibleAmount);
headerTranslation = (1.0f - headerVisibleAmount) * mFullHeaderTranslation;
}

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"