diff options
| -rw-r--r-- | api/system-current.txt | 11 | ||||
| -rw-r--r-- | core/java/android/app/Notification.java | 138 |
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. |