Merge changes I825b6644,If0143d93,I19311bb8,Ie95434f3 into oc-support-26.0-dev
* changes:
Move MediaStyle big content view code from ImplBase
Move MediaStyle content view code from ImplBase
Move DecoratedCustomViewStyle specific code from ImplBase
Remove builder access from NotifCompatImplBase
diff --git a/v7/appcompat/src/android/support/v7/app/NotificationCompat.java b/v7/appcompat/src/android/support/v7/app/NotificationCompat.java
index 0ebe1ea..450248c 100644
--- a/v7/appcompat/src/android/support/v7/app/NotificationCompat.java
+++ b/v7/appcompat/src/android/support/v7/app/NotificationCompat.java
@@ -32,6 +32,7 @@
import android.support.v4.app.NotificationBuilderWithBuilderAccessor;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v7.appcompat.R;
+import android.view.View;
import android.widget.RemoteViews;
/**
@@ -125,6 +126,9 @@
*/
public static class MediaStyle extends android.support.v4.app.NotificationCompat.Style {
+ private static final int MAX_MEDIA_BUTTONS_IN_COMPACT = 3;
+ private static final int MAX_MEDIA_BUTTONS = 5;
+
int[] mActionsToShowInCompact = null;
MediaSessionCompat.Token mToken;
boolean mShowCancelButton;
@@ -234,18 +238,66 @@
// No custom content view required
return null;
}
- overrideContentView(builder, false);
- return null;
+ return generateContentView();
}
- RemoteViews overrideContentView(
- NotificationBuilderWithBuilderAccessor builder, boolean isDecorated) {
- return NotificationCompatImplBase.overrideContentViewMedia(
- builder, mBuilder.mContext, mBuilder.mContentTitle, mBuilder.mContentText,
- mBuilder.mContentInfo, mBuilder.mNumber, mBuilder.mLargeIcon,
- mBuilder.mSubText, mBuilder.mUseChronometer, mBuilder.getWhenIfShowing(),
- mBuilder.getPriority(), mBuilder.mActions, mActionsToShowInCompact,
- mShowCancelButton, mCancelButtonIntent, isDecorated);
+ RemoteViews generateContentView() {
+ RemoteViews view = NotificationCompatImplBase.applyStandardTemplate(
+ mBuilder.mContext, mBuilder.mContentTitle, mBuilder.mContentText,
+ mBuilder.mContentInfo, mBuilder.mNumber, 0 /* smallIcon */,
+ mBuilder.mLargeIcon, mBuilder.mSubText, mBuilder.mUseChronometer,
+ mBuilder.getWhenIfShowing(), mBuilder.getPriority(),
+ 0 /* color is unused on media */,
+ getContentViewLayoutResource(), true /* fitIn1U */);
+
+ final int numActions = mBuilder.mActions.size();
+ final int numActionsInCompact = mActionsToShowInCompact == null
+ ? 0
+ : Math.min(mActionsToShowInCompact.length, MAX_MEDIA_BUTTONS_IN_COMPACT);
+ view.removeAllViews(R.id.media_actions);
+ if (numActionsInCompact > 0) {
+ for (int i = 0; i < numActionsInCompact; i++) {
+ if (i >= numActions) {
+ throw new IllegalArgumentException(String.format(
+ "setShowActionsInCompactView: action %d out of bounds (max %d)",
+ i, numActions - 1));
+ }
+
+ final NotificationCompat.Action action =
+ mBuilder.mActions.get(mActionsToShowInCompact[i]);
+ final RemoteViews button = generateMediaActionButton(action);
+ view.addView(R.id.media_actions, button);
+ }
+ }
+ if (mShowCancelButton) {
+ view.setViewVisibility(R.id.end_padder, View.GONE);
+ view.setViewVisibility(R.id.cancel_action, View.VISIBLE);
+ view.setOnClickPendingIntent(R.id.cancel_action, mCancelButtonIntent);
+ view.setInt(R.id.cancel_action, "setAlpha", mBuilder.mContext
+ .getResources().getInteger(R.integer.cancel_button_image_alpha));
+ } else {
+ view.setViewVisibility(R.id.end_padder, View.VISIBLE);
+ view.setViewVisibility(R.id.cancel_action, View.GONE);
+ }
+ return view;
+ }
+
+ private RemoteViews generateMediaActionButton(NotificationCompat.Action action) {
+ final boolean tombstone = (action.getActionIntent() == null);
+ RemoteViews button = new RemoteViews(mBuilder.mContext.getPackageName(),
+ R.layout.notification_media_action);
+ button.setImageViewResource(R.id.action0, action.getIcon());
+ if (!tombstone) {
+ button.setOnClickPendingIntent(R.id.action0, action.getActionIntent());
+ }
+ if (Build.VERSION.SDK_INT >= 15) {
+ button.setContentDescription(R.id.action0, action.getTitle());
+ }
+ return button;
+ }
+
+ int getContentViewLayoutResource() {
+ return R.layout.notification_template_media;
}
/**
@@ -258,17 +310,41 @@
// No custom content view required
return null;
}
- return generateBigContentView(false);
+ return generateBigContentView();
}
- RemoteViews generateBigContentView(boolean isDecorated) {
- return NotificationCompatImplBase.generateMediaBigView(
+ RemoteViews generateBigContentView() {
+ final int actionCount = Math.min(mBuilder.mActions.size(), MAX_MEDIA_BUTTONS);
+ RemoteViews big = NotificationCompatImplBase.applyStandardTemplate(
mBuilder.mContext, mBuilder.mContentTitle, mBuilder.mContentText,
- mBuilder.mContentInfo, mBuilder.mNumber, mBuilder.mLargeIcon,
- mBuilder.mSubText, mBuilder.mUseChronometer,
- mBuilder.getWhenIfShowing(), mBuilder.getPriority(), 0,
- mBuilder.mActions, mShowCancelButton, mCancelButtonIntent,
- isDecorated);
+ mBuilder.mContentInfo, mBuilder.mNumber, 0 /* smallIcon */,
+ mBuilder.mLargeIcon, mBuilder.mSubText, mBuilder.mUseChronometer,
+ mBuilder.getWhenIfShowing(), mBuilder.getPriority(),
+ 0 /* color is unused on media */,
+ getBigContentViewLayoutResource(actionCount), false /* fitIn1U */);
+
+ big.removeAllViews(R.id.media_actions);
+ if (actionCount > 0) {
+ for (int i = 0; i < actionCount; i++) {
+ final RemoteViews button = generateMediaActionButton(mBuilder.mActions.get(i));
+ big.addView(R.id.media_actions, button);
+ }
+ }
+ if (mShowCancelButton) {
+ big.setViewVisibility(R.id.cancel_action, View.VISIBLE);
+ big.setInt(R.id.cancel_action, "setAlpha", mBuilder.mContext
+ .getResources().getInteger(R.integer.cancel_button_image_alpha));
+ big.setOnClickPendingIntent(R.id.cancel_action, mCancelButtonIntent);
+ } else {
+ big.setViewVisibility(R.id.cancel_action, View.GONE);
+ }
+ return big;
+ }
+
+ int getBigContentViewLayoutResource(int actionCount) {
+ return actionCount <= 3
+ ? R.layout.notification_template_big_media_narrow
+ : R.layout.notification_template_big_media;
}
}
@@ -303,6 +379,8 @@
*/
public static class DecoratedCustomViewStyle extends Style {
+ private static final int MAX_ACTION_BUTTONS = 3;
+
public DecoratedCustomViewStyle() {
}
@@ -375,17 +453,50 @@
}
private RemoteViews createRemoteViews(RemoteViews innerView, boolean showActions) {
- RemoteViews remoteViews = NotificationCompatImplBase.applyStandardTemplateWithActions(
+ RemoteViews remoteViews = NotificationCompatImplBase.applyStandardTemplate(
mBuilder.mContext, mBuilder.mContentTitle, mBuilder.mContentText,
mBuilder.mContentInfo, mBuilder.mNumber, mBuilder.mNotification.icon,
mBuilder.mLargeIcon, mBuilder.mSubText, mBuilder.mUseChronometer,
mBuilder.getWhenIfShowing(), mBuilder.getPriority(), mBuilder.getColor(),
- R.layout.notification_template_custom_big,
- false /* fitIn1U */, showActions ? mBuilder.mActions : null);
+ R.layout.notification_template_custom_big, false /* fitIn1U */);
+ remoteViews.removeAllViews(R.id.actions);
+ boolean actionsVisible = false;
+ if (showActions && mBuilder.mActions != null) {
+ int numActions = Math.max(mBuilder.mActions.size(), MAX_ACTION_BUTTONS);
+ if (numActions > 0) {
+ actionsVisible = true;
+ for (int i = 0; i < numActions; i++) {
+ final RemoteViews button = generateActionButton(mBuilder.mActions.get(i));
+ remoteViews.addView(R.id.actions, button);
+ }
+ }
+ }
+ int actionVisibility = actionsVisible ? View.VISIBLE : View.GONE;
+ remoteViews.setViewVisibility(R.id.actions, actionVisibility);
+ remoteViews.setViewVisibility(R.id.action_divider, actionVisibility);
NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
remoteViews, innerView);
return remoteViews;
}
+
+ private RemoteViews generateActionButton(NotificationCompat.Action action) {
+ final boolean tombstone = (action.actionIntent == null);
+ RemoteViews button = new RemoteViews(mBuilder.mContext.getPackageName(),
+ tombstone ? R.layout.notification_action_tombstone
+ : R.layout.notification_action);
+ button.setImageViewBitmap(R.id.action_image,
+ NotificationCompatImplBase.createColoredBitmap(mBuilder.mContext,
+ action.getIcon(), mBuilder.mContext.getResources()
+ .getColor(R.color.notification_action_color_filter)));
+ button.setTextViewText(R.id.action_text, action.title);
+ if (!tombstone) {
+ button.setOnClickPendingIntent(R.id.action_container, action.actionIntent);
+ }
+ if (Build.VERSION.SDK_INT >= 15) {
+ button.setContentDescription(R.id.action_container, action.title);
+ }
+ return button;
+ }
}
/**
@@ -458,7 +569,7 @@
boolean createCustomContent = hasContentView
|| mBuilder.getBigContentView() != null;
if (createCustomContent) {
- RemoteViews contentView = overrideContentView(builder, hasContentView);
+ RemoteViews contentView = generateContentView();
if (hasContentView) {
NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
contentView,
@@ -468,17 +579,24 @@
return contentView;
}
} else {
- RemoteViews contentViewMedia = overrideContentView(builder, hasContentView);
+ RemoteViews contentView = generateContentView();
if (hasContentView) {
NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
- contentViewMedia,
+ contentView,
mBuilder.getContentView());
- return contentViewMedia;
+ return contentView;
}
}
return null;
}
+ @Override
+ int getContentViewLayoutResource() {
+ return mBuilder.getContentView() != null
+ ? R.layout.notification_template_media_custom
+ : super.getContentViewLayoutResource();
+ }
+
/**
* @hide
*/
@@ -496,7 +614,7 @@
// No expandable notification
return null;
}
- RemoteViews bigContentView = generateBigContentView(true);
+ RemoteViews bigContentView = generateBigContentView();
NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
bigContentView,
innerView);
@@ -506,6 +624,13 @@
return bigContentView;
}
+ @Override
+ int getBigContentViewLayoutResource(int actionCount) {
+ return actionCount <= 3
+ ? R.layout.notification_template_big_media_narrow_custom
+ : R.layout.notification_template_big_media_custom;
+ }
+
/**
* @hide
*/
@@ -523,7 +648,7 @@
// No expandable notification
return null;
}
- RemoteViews headsUpContentView = generateBigContentView(true);
+ RemoteViews headsUpContentView = generateBigContentView();
NotificationCompatImplBase.buildIntoRemoteViews(mBuilder.mContext,
headsUpContentView,
innerView);
diff --git a/v7/appcompat/src/android/support/v7/app/NotificationCompatImplBase.java b/v7/appcompat/src/android/support/v7/app/NotificationCompatImplBase.java
index 5875962..8df0315 100644
--- a/v7/appcompat/src/android/support/v7/app/NotificationCompatImplBase.java
+++ b/v7/appcompat/src/android/support/v7/app/NotificationCompatImplBase.java
@@ -16,7 +16,6 @@
package android.support.v7.app;
-import android.app.PendingIntent;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
@@ -28,17 +27,13 @@
import android.os.Build;
import android.os.SystemClock;
import android.support.annotation.RequiresApi;
-import android.support.v4.app.NotificationBuilderWithBuilderAccessor;
import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationCompatBase;
import android.support.v7.appcompat.R;
import android.util.TypedValue;
import android.view.View;
import android.widget.RemoteViews;
import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.List;
/**
* Helper class to generate MediaStyle notifications for pre-Lollipop platforms. Overrides
@@ -47,181 +42,7 @@
@RequiresApi(9)
class NotificationCompatImplBase {
- static final int MAX_MEDIA_BUTTONS_IN_COMPACT = 3;
- static final int MAX_MEDIA_BUTTONS = 5;
- private static final int MAX_ACTION_BUTTONS = 3;
-
- @RequiresApi(11)
- public static <T extends NotificationCompatBase.Action> RemoteViews overrideContentViewMedia(
- NotificationBuilderWithBuilderAccessor builder,
- Context context, CharSequence contentTitle, CharSequence contentText,
- CharSequence contentInfo, int number, Bitmap largeIcon, CharSequence subText,
- boolean useChronometer, long when, int priority, List<T> actions,
- int[] actionsToShowInCompact, boolean showCancelButton,
- PendingIntent cancelButtonIntent, boolean isDecoratedCustomView) {
- RemoteViews views = generateContentViewMedia(context, contentTitle, contentText, contentInfo,
- number, largeIcon, subText, useChronometer, when, priority, actions,
- actionsToShowInCompact, showCancelButton, cancelButtonIntent,
- isDecoratedCustomView);
- builder.getBuilder().setContent(views);
- if (showCancelButton) {
- builder.getBuilder().setOngoing(true);
- }
- return views;
- }
-
- @RequiresApi(11)
- private static <T extends NotificationCompatBase.Action> RemoteViews generateContentViewMedia(
- Context context, CharSequence contentTitle, CharSequence contentText,
- CharSequence contentInfo, int number, Bitmap largeIcon, CharSequence subText,
- boolean useChronometer, long when, int priority, List<T> actions,
- int[] actionsToShowInCompact, boolean showCancelButton,
- PendingIntent cancelButtonIntent, boolean isDecoratedCustomView) {
- RemoteViews view = applyStandardTemplate(context, contentTitle, contentText, contentInfo,
- number, 0 /* smallIcon */, largeIcon, subText, useChronometer, when, priority,
- 0 /* color is unused on media */,
- isDecoratedCustomView ? R.layout.notification_template_media_custom
- : R.layout.notification_template_media,
- true /* fitIn1U */);
-
- final int numActions = actions.size();
- final int N = actionsToShowInCompact == null
- ? 0
- : Math.min(actionsToShowInCompact.length, MAX_MEDIA_BUTTONS_IN_COMPACT);
- view.removeAllViews(R.id.media_actions);
- if (N > 0) {
- for (int i = 0; i < N; i++) {
- if (i >= numActions) {
- throw new IllegalArgumentException(String.format(
- "setShowActionsInCompactView: action %d out of bounds (max %d)",
- i, numActions - 1));
- }
-
- final NotificationCompatBase.Action action = actions.get(actionsToShowInCompact[i]);
- final RemoteViews button = generateMediaActionButton(context, action);
- view.addView(R.id.media_actions, button);
- }
- }
- if (showCancelButton) {
- view.setViewVisibility(R.id.end_padder, View.GONE);
- view.setViewVisibility(R.id.cancel_action, View.VISIBLE);
- view.setOnClickPendingIntent(R.id.cancel_action, cancelButtonIntent);
- view.setInt(R.id.cancel_action, "setAlpha",
- context.getResources().getInteger(R.integer.cancel_button_image_alpha));
- } else {
- view.setViewVisibility(R.id.end_padder, View.VISIBLE);
- view.setViewVisibility(R.id.cancel_action, View.GONE);
- }
- return view;
- }
-
- @RequiresApi(11)
- public static <T extends NotificationCompatBase.Action> RemoteViews generateMediaBigView(
- Context context, CharSequence contentTitle, CharSequence contentText,
- CharSequence contentInfo, int number, Bitmap largeIcon, CharSequence subText,
- boolean useChronometer, long when, int priority, int color, List<T> actions,
- boolean showCancelButton, PendingIntent cancelButtonIntent,
- boolean decoratedCustomView) {
- final int actionCount = Math.min(actions.size(), MAX_MEDIA_BUTTONS);
- RemoteViews big = applyStandardTemplate(context, contentTitle, contentText, contentInfo,
- number, 0 /* smallIcon */, largeIcon, subText, useChronometer, when, priority,
- color, /* fitIn1U */getBigMediaLayoutResource(decoratedCustomView, actionCount),
- false);
-
- big.removeAllViews(R.id.media_actions);
- if (actionCount > 0) {
- for (int i = 0; i < actionCount; i++) {
- final RemoteViews button = generateMediaActionButton(context, actions.get(i));
- big.addView(R.id.media_actions, button);
- }
- }
- if (showCancelButton) {
- big.setViewVisibility(R.id.cancel_action, View.VISIBLE);
- big.setInt(R.id.cancel_action, "setAlpha",
- context.getResources().getInteger(R.integer.cancel_button_image_alpha));
- big.setOnClickPendingIntent(R.id.cancel_action, cancelButtonIntent);
- } else {
- big.setViewVisibility(R.id.cancel_action, View.GONE);
- }
- return big;
- }
-
- @RequiresApi(11)
- private static RemoteViews generateMediaActionButton(Context context,
- NotificationCompatBase.Action action) {
- final boolean tombstone = (action.getActionIntent() == null);
- RemoteViews button = new RemoteViews(context.getPackageName(),
- R.layout.notification_media_action);
- button.setImageViewResource(R.id.action0, action.getIcon());
- if (!tombstone) {
- button.setOnClickPendingIntent(R.id.action0, action.getActionIntent());
- }
- if (Build.VERSION.SDK_INT >= 15) {
- button.setContentDescription(R.id.action0, action.getTitle());
- }
- return button;
- }
-
- @RequiresApi(11)
- private static int getBigMediaLayoutResource(boolean decoratedCustomView, int actionCount) {
- if (actionCount <= 3) {
- return decoratedCustomView
- ? R.layout.notification_template_big_media_narrow_custom
- : R.layout.notification_template_big_media_narrow;
- } else {
- return decoratedCustomView
- ? R.layout.notification_template_big_media_custom
- : R.layout.notification_template_big_media;
- }
- }
-
- public static RemoteViews applyStandardTemplateWithActions(Context context,
- CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
- int number, int smallIcon, Bitmap largeIcon, CharSequence subText,
- boolean useChronometer, long when, int priority, int color, int resId, boolean fitIn1U,
- ArrayList<NotificationCompat.Action> actions) {
- RemoteViews remoteViews = applyStandardTemplate(context, contentTitle, contentText,
- contentInfo, number, smallIcon, largeIcon, subText, useChronometer, when, priority,
- color, resId, fitIn1U);
- remoteViews.removeAllViews(R.id.actions);
- boolean actionsVisible = false;
- if (actions != null) {
- int N = actions.size();
- if (N > 0) {
- actionsVisible = true;
- if (N > MAX_ACTION_BUTTONS) N = MAX_ACTION_BUTTONS;
- for (int i = 0; i < N; i++) {
- final RemoteViews button = generateActionButton(context, actions.get(i));
- remoteViews.addView(R.id.actions, button);
- }
- }
- }
- int actionVisibility = actionsVisible ? View.VISIBLE : View.GONE;
- remoteViews.setViewVisibility(R.id.actions, actionVisibility);
- remoteViews.setViewVisibility(R.id.action_divider, actionVisibility);
- return remoteViews;
- }
-
- private static RemoteViews generateActionButton(Context context,
- NotificationCompat.Action action) {
- final boolean tombstone = (action.actionIntent == null);
- RemoteViews button = new RemoteViews(context.getPackageName(),
- tombstone ? getActionTombstoneLayoutResource()
- : getActionLayoutResource());
- button.setImageViewBitmap(R.id.action_image,
- createColoredBitmap(context, action.getIcon(),
- context.getResources().getColor(R.color.notification_action_color_filter)));
- button.setTextViewText(R.id.action_text, action.title);
- if (!tombstone) {
- button.setOnClickPendingIntent(R.id.action_container, action.actionIntent);
- }
- if (Build.VERSION.SDK_INT >= 15) {
- button.setContentDescription(R.id.action_container, action.title);
- }
- return button;
- }
-
- private static Bitmap createColoredBitmap(Context context, int iconId, int color) {
+ static Bitmap createColoredBitmap(Context context, int iconId, int color) {
return createColoredBitmap(context, iconId, color, 0);
}
@@ -240,14 +61,6 @@
return resultBitmap;
}
- private static int getActionLayoutResource() {
- return R.layout.notification_action;
- }
-
- private static int getActionTombstoneLayoutResource() {
- return R.layout.notification_action_tombstone;
- }
-
public static RemoteViews applyStandardTemplate(Context context,
CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
int number, int smallIcon, Bitmap largeIcon, CharSequence subText,