summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/system-current.txt11
-rw-r--r--core/java/android/app/Notification.java138
2 files changed, 148 insertions, 1 deletions
diff --git a/api/system-current.txt b/api/system-current.txt
index 7a0f24c3c9f9..ab064390255e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5478,6 +5478,17 @@ package android.app {
field protected android.app.Notification.Builder mBuilder;
}
+ public static final class Notification.TvExtender implements android.app.Notification.Extender {
+ ctor public Notification.TvExtender();
+ ctor public Notification.TvExtender(android.app.Notification);
+ method public android.app.Notification.Builder extend(android.app.Notification.Builder);
+ method public android.app.PendingIntent getContentIntent();
+ method public android.app.PendingIntent getDeleteIntent();
+ method public boolean isAvailableOnTv();
+ method public android.app.Notification.TvExtender setContentIntent(android.app.PendingIntent);
+ method public android.app.Notification.TvExtender setDeleteIntent(android.app.PendingIntent);
+ }
+
public static final class Notification.WearableExtender implements android.app.Notification.Extender {
ctor public Notification.WearableExtender();
ctor public Notification.WearableExtender(android.app.Notification);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 119b0553d054..69f4cc0bdc9d 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -1520,7 +1520,7 @@ public class Notification implements Parcelable
/**
* Get a hint that this Action should be displayed inline.
*
- * @return {@code true} if the Action should be displayed inline, {@code false}
+ * @return {@code true} if the Action should be displayed inline, {@code false}
* otherwise. The default value is {@code false} if this was never set.
*/
public boolean getHintDisplayActionInline() {
@@ -6948,6 +6948,142 @@ public class Notification implements Parcelable
}
/**
+ * <p>Helper class to add Android TV extensions to notifications. To create a notification
+ * with a TV extension:
+ *
+ * <ol>
+ * <li>Create an {@link Notification.Builder}, setting any desired properties.
+ * <li>Create a {@link TvExtender}.
+ * <li>Set TV-specific properties using the {@code set} methods of
+ * {@link TvExtender}.
+ * <li>Call {@link Notification.Builder#extend(Notification.Extender)}
+ * to apply the extension to a notification.
+ * </ol>
+ *
+ * <pre class="prettyprint">
+ * Notification notification = new Notification.Builder(context)
+ * ...
+ * .extend(new TvExtender()
+ * .set*(...))
+ * .build();
+ * </pre>
+ *
+ * <p>TV extensions can be accessed on an existing notification by using the
+ * {@code TvExtender(Notification)} constructor, and then using the {@code get} methods
+ * to access values.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final class TvExtender implements Extender {
+ private static final String TAG = "TvExtender";
+
+ private static final String EXTRA_TV_EXTENDER = "android.tv.EXTENSIONS";
+ private static final String EXTRA_FLAGS = "flags";
+ private static final String EXTRA_CONTENT_INTENT = "content_intent";
+ private static final String EXTRA_DELETE_INTENT = "delete_intent";
+
+ // Flags bitwise-ored to mFlags
+ private static final int FLAG_AVAILABLE_ON_TV = 0x1;
+
+ private int mFlags;
+ private PendingIntent mContentIntent;
+ private PendingIntent mDeleteIntent;
+
+ /**
+ * Create a {@link TvExtender} with default options.
+ */
+ public TvExtender() {
+ mFlags = FLAG_AVAILABLE_ON_TV;
+ }
+
+ /**
+ * Create a {@link TvExtender} from the TvExtender options of an existing Notification.
+ *
+ * @param notif The notification from which to copy options.
+ */
+ public TvExtender(Notification notif) {
+ Bundle bundle = notif.extras == null ?
+ null : notif.extras.getBundle(EXTRA_TV_EXTENDER);
+ if (bundle != null) {
+ mFlags = bundle.getInt(EXTRA_FLAGS);
+ mContentIntent = bundle.getParcelable(EXTRA_CONTENT_INTENT);
+ mDeleteIntent = bundle.getParcelable(EXTRA_DELETE_INTENT);
+ }
+ }
+
+ /**
+ * Apply a TV extension to a notification that is being built. This is typically called by
+ * the {@link Notification.Builder#extend(Notification.Extender)}
+ * method of {@link Notification.Builder}.
+ */
+ @Override
+ public Notification.Builder extend(Notification.Builder builder) {
+ Bundle bundle = new Bundle();
+
+ bundle.putInt(EXTRA_FLAGS, mFlags);
+ if (mContentIntent != null) {
+ bundle.putParcelable(EXTRA_CONTENT_INTENT, mContentIntent);
+ }
+
+ if (mDeleteIntent != null) {
+ bundle.putParcelable(EXTRA_DELETE_INTENT, mDeleteIntent);
+ }
+
+ builder.getExtras().putBundle(EXTRA_TV_EXTENDER, bundle);
+ return builder;
+ }
+
+ /**
+ * Returns true if this notification should be shown on TV. This method return true
+ * if the notification was extended with a TvExtender.
+ */
+ public boolean isAvailableOnTv() {
+ return (mFlags & FLAG_AVAILABLE_ON_TV) != 0;
+ }
+
+ /**
+ * Supplies a {@link PendingIntent} to be sent when the notification is selected on TV.
+ * If provided, it is used instead of the content intent specified
+ * at the level of Notification.
+ */
+ public TvExtender setContentIntent(PendingIntent intent) {
+ mContentIntent = intent;
+ return this;
+ }
+
+ /**
+ * Returns the TV-specific content intent. If this method returns null, the
+ * main content intent on the notification should be used.
+ *
+ * @see {@link Notification#contentIntent}
+ */
+ public PendingIntent getContentIntent() {
+ return mContentIntent;
+ }
+
+ /**
+ * Supplies a {@link PendingIntent} to send when the notification is cleared explicitly
+ * by the user on TV. If provided, it is used instead of the delete intent specified
+ * at the level of Notification.
+ */
+ public TvExtender setDeleteIntent(PendingIntent intent) {
+ mDeleteIntent = intent;
+ return this;
+ }
+
+ /**
+ * Returns the TV-specific delete intent. If this method returns null, the
+ * main delete intent on the notification should be used.
+ *
+ * @see {@link Notification#deleteIntent}
+ */
+ public PendingIntent getDeleteIntent() {
+ return mDeleteIntent;
+ }
+ }
+
+ /**
* Get an array of Notification objects from a parcelable array bundle field.
* Update the bundle to have a typed array so fetches in the future don't need
* to do an array copy.