summaryrefslogtreecommitdiff
path: root/core/java/android/app/Notification.java
diff options
context:
space:
mode:
authorJeff DeCew <jeffdq@google.com>2020-11-17 13:21:53 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-11-17 13:21:53 +0000
commit5185c6bf6630744a73dbc29b0204422368dfdc76 (patch)
tree920fc9f76de9ef2c930a019240e31d2e9841288a /core/java/android/app/Notification.java
parent9a8f3712e8f94756ab4a81133c56af30cc93865b (diff)
parent89cc6a1fc321e709312f71f199fa3757a3ee94cb (diff)
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
Diffstat (limited to 'core/java/android/app/Notification.java')
-rw-r--r--core/java/android/app/Notification.java368
1 files changed, 190 insertions, 178 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index e5d17d0da451..70b7d22d51e6 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -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;
- }
- }
- if (replyIconShown || largeIconShown) {
- // The padding to the content
- marginEnd += contentMargin;
+ int iconSize = mContext.getResources().getDimensionPixelSize(
+ R.dimen.notification_right_icon_size);
+ extraMarginEnd = iconSize + 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;