Add support for extendable actions to Notification.

Change-Id: I2945a6994a28fc454af3f84e75c96d7619547f01
This commit is contained in:
Griff Hazen
2014-05-15 22:26:18 -07:00
parent 0ade263c28
commit 959591e3ba
2 changed files with 135 additions and 19 deletions

View File

@@ -3984,6 +3984,7 @@ package android.app {
ctor public Notification.Action(int, java.lang.CharSequence, android.app.PendingIntent);
method public android.app.Notification.Action clone();
method public int describeContents();
method public android.os.Bundle getExtras();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
field public android.app.PendingIntent actionIntent;
@@ -3991,6 +3992,14 @@ package android.app {
field public java.lang.CharSequence title;
}
public static class Notification.Action.Builder {
ctor public Notification.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
ctor public Notification.Action.Builder(android.app.Notification.Action);
method public android.app.Notification.Action.Builder addExtras(android.os.Bundle);
method public android.app.Notification.Action build();
method public android.os.Bundle getExtras();
}
public static class Notification.BigPictureStyle extends android.app.Notification.Style {
ctor public Notification.BigPictureStyle();
ctor public Notification.BigPictureStyle(android.app.Notification.Builder);
@@ -4011,6 +4020,7 @@ package android.app {
public static class Notification.Builder {
ctor public Notification.Builder(android.content.Context);
method public android.app.Notification.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
method public android.app.Notification.Builder addAction(android.app.Notification.Action);
method public android.app.Notification.Builder addExtras(android.os.Bundle);
method public android.app.Notification build();
method public android.os.Bundle getExtras();

View File

@@ -16,8 +16,6 @@
package android.app;
import com.android.internal.R;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -37,6 +35,8 @@ import android.view.View;
import android.widget.ProgressBar;
import android.widget.RemoteViews;
import com.android.internal.R;
import java.text.NumberFormat;
import java.util.ArrayList;
@@ -128,7 +128,7 @@ public class Notification implements Parcelable
* leave it at its default value of 0.
*
* @see android.widget.ImageView#setImageLevel
* @see android.graphics.drawable#setLevel
* @see android.graphics.drawable.Drawable#setLevel
*/
public int iconLevel;
@@ -653,10 +653,13 @@ public class Notification implements Parcelable
* It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is
* selected by the user.
* <p>
* Apps should use {@link Builder#addAction(int, CharSequence, PendingIntent)} to create and
* attach actions.
* Apps should use {@link Notification.Builder#addAction(int, CharSequence, PendingIntent)}
* or {@link Notification.Builder#addAction(Notification.Action)}
* to attach actions.
*/
public static class Action implements Parcelable {
private final Bundle mExtras;
/**
* Small icon representing the action.
*/
@@ -670,22 +673,102 @@ public class Notification implements Parcelable
* may be rendered in a disabled presentation by the system UI.
*/
public PendingIntent actionIntent;
private Action() { }
private Action(Parcel in) {
icon = in.readInt();
title = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
if (in.readInt() == 1) {
actionIntent = PendingIntent.CREATOR.createFromParcel(in);
}
mExtras = in.readBundle();
}
/**
* Use {@link Builder#addAction(int, CharSequence, PendingIntent)}.
* Use {@link Notification.Builder#addAction(int, CharSequence, PendingIntent)}.
*/
public Action(int icon, CharSequence title, PendingIntent intent) {
this(icon, title, intent, new Bundle());
}
private Action(int icon, CharSequence title, PendingIntent intent, Bundle extras) {
this.icon = icon;
this.title = title;
this.actionIntent = intent;
this.mExtras = extras != null ? extras : new Bundle();
}
/**
* Get additional metadata carried around with this Action.
*/
public Bundle getExtras() {
return mExtras;
}
/**
* Builder class for {@link Action} objects.
*/
public static class Builder {
private final int mIcon;
private final CharSequence mTitle;
private final PendingIntent mIntent;
private final Bundle mExtras;
/**
* Construct a new builder for {@link Action} object.
* @param icon icon to show for this action
* @param title the title of the action
* @param intent the {@link PendingIntent} to fire when users trigger this action
*/
public Builder(int icon, CharSequence title, PendingIntent intent) {
this(icon, title, intent, new Bundle());
}
/**
* Construct a new builder for {@link Action} object using the fields from an
* {@link Action}.
* @param action the action to read fields from.
*/
public Builder(Action action) {
this(action.icon, action.title, action.actionIntent, new Bundle(action.mExtras));
}
private Builder(int icon, CharSequence title, PendingIntent intent, Bundle extras) {
mIcon = icon;
mTitle = title;
mIntent = intent;
mExtras = extras;
}
/**
* Merge additional metadata into this builder.
*
* <p>Values within the Bundle will replace existing extras values in this Builder.
*
* @see Notification.Action#extras
*/
public Builder addExtras(Bundle extras) {
if (extras != null) {
mExtras.putAll(extras);
}
return this;
}
/**
* Get the metadata Bundle used by this Builder.
*
* <p>The returned Bundle is shared with this Builder.
*/
public Bundle getExtras() {
return mExtras;
}
/**
* Combine all of the options that have been set and return a new {@link Action}
* object.
* @return the built action
*/
public Action build() {
return new Action(mIcon, mTitle, mIntent, mExtras);
}
}
@Override
@@ -693,8 +776,8 @@ public class Notification implements Parcelable
return new Action(
this.icon,
this.title,
this.actionIntent // safe to alias
);
this.actionIntent, // safe to alias
new Bundle(this.mExtras));
}
@Override
public int describeContents() {
@@ -710,9 +793,10 @@ public class Notification implements Parcelable
} else {
out.writeInt(0);
}
out.writeBundle(mExtras);
}
public static final Parcelable.Creator<Action> CREATOR
= new Parcelable.Creator<Action>() {
public static final Parcelable.Creator<Action> CREATOR =
new Parcelable.Creator<Action>() {
public Action createFromParcel(Parcel in) {
return new Action(in);
}
@@ -1640,11 +1724,13 @@ public class Notification implements Parcelable
*
* @see Notification#extras
*/
public Builder addExtras(Bundle bag) {
if (mExtras == null) {
mExtras = new Bundle(bag);
} else {
mExtras.putAll(bag);
public Builder addExtras(Bundle extras) {
if (extras != null) {
if (mExtras == null) {
mExtras = new Bundle(extras);
} else {
mExtras.putAll(extras);
}
}
return this;
}
@@ -1661,8 +1747,8 @@ public class Notification implements Parcelable
*
* @see Notification#extras
*/
public Builder setExtras(Bundle bag) {
mExtras = bag;
public Builder setExtras(Bundle extras) {
mExtras = extras;
return this;
}
@@ -1705,6 +1791,26 @@ public class Notification implements Parcelable
return this;
}
/**
* Add an action to this notification. Actions are typically displayed by
* the system as a button adjacent to the notification content.
* <p>
* Every action must have an icon (32dp square and matching the
* <a href="{@docRoot}design/style/iconography.html#action-bar">Holo
* Dark action bar</a> visual style), a textual label, and a {@link PendingIntent}.
* <p>
* A notification in its expanded form can display up to 3 actions, from left to right in
* the order they were added. Actions will not be displayed when the notification is
* collapsed, however, so be sure that any essential functions may be accessed by the user
* in some other way (for example, in the Activity pointed to by {@link #contentIntent}).
*
* @param action The action to add.
*/
public Builder addAction(Action action) {
mActions.add(action);
return this;
}
/**
* Add a rich notification style to be applied at build time.
*