summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt12
-rw-r--r--api/system-current.txt12
-rw-r--r--core/java/android/app/Notification.java135
3 files changed, 159 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt
index eb6ad09eedbe..4a1a4582e1b4 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -4760,6 +4760,7 @@ package android.app {
method public android.graphics.drawable.Icon getLargeIcon();
method public android.graphics.drawable.Icon getSmallIcon();
method public java.lang.String getSortKey();
+ method public android.app.Notification.Topic[] getTopics();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
field public static final java.lang.String CATEGORY_ALARM = "alarm";
@@ -4924,6 +4925,7 @@ package android.app {
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.Builder addPerson(java.lang.String);
+ method public android.app.Notification.Builder addTopic(android.app.Notification.Topic);
method public android.app.Notification build();
method public android.app.Notification.Builder extend(android.app.Notification.Extender);
method public android.os.Bundle getExtras();
@@ -5031,6 +5033,16 @@ package android.app {
field protected android.app.Notification.Builder mBuilder;
}
+ public static class Notification.Topic implements android.os.Parcelable {
+ ctor public Notification.Topic(java.lang.String, java.lang.CharSequence);
+ method public android.app.Notification.Topic clone();
+ method public int describeContents();
+ method public java.lang.String getId();
+ method public java.lang.CharSequence getLabel();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.Notification.Topic> CREATOR;
+ }
+
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/api/system-current.txt b/api/system-current.txt
index 64ea3b82a279..ecea9b09e69e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -4877,6 +4877,7 @@ package android.app {
method public android.graphics.drawable.Icon getLargeIcon();
method public android.graphics.drawable.Icon getSmallIcon();
method public java.lang.String getSortKey();
+ method public android.app.Notification.Topic[] getTopics();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
field public static final java.lang.String CATEGORY_ALARM = "alarm";
@@ -5041,6 +5042,7 @@ package android.app {
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.Builder addPerson(java.lang.String);
+ method public android.app.Notification.Builder addTopic(android.app.Notification.Topic);
method public android.app.Notification build();
method public android.app.Notification.Builder extend(android.app.Notification.Extender);
method public android.os.Bundle getExtras();
@@ -5148,6 +5150,16 @@ package android.app {
field protected android.app.Notification.Builder mBuilder;
}
+ public static class Notification.Topic implements android.os.Parcelable {
+ ctor public Notification.Topic(java.lang.String, java.lang.CharSequence);
+ method public android.app.Notification.Topic clone();
+ method public int describeContents();
+ method public java.lang.String getId();
+ method public java.lang.CharSequence getLabel();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.Notification.Topic> CREATOR;
+ }
+
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 55aec5906cac..db18722f9448 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -62,6 +62,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
/**
* A class that represents how a persistent notification is to be presented to
@@ -1362,6 +1363,95 @@ public class Notification implements Parcelable
public Notification publicVersion;
/**
+ * Structure to encapsulate a topic that is shown in Notification settings.
+ * It must include an id and label.
+ */
+ public static class Topic implements Parcelable {
+ private final String id;
+ private final CharSequence label;
+
+ public Topic(String id, CharSequence label) {
+ this.id = id;
+ this.label = safeCharSequence(label);
+ }
+
+ private Topic(Parcel in) {
+ if (in.readInt() != 0) {
+ id = in.readString();
+ } else {
+ id = null;
+ }
+ label = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public CharSequence getLabel() {
+ return label;
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder(Topic.class.getSimpleName()).append('[')
+ .append("id=").append(id)
+ .append(",label=").append(label)
+ .append(']').toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof Topic)) return false;
+ if (o == this) return true;
+ final Topic other = (Topic) o;
+ return Objects.equals(other.id, id)
+ && Objects.equals(other.label, label);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, label);
+ }
+
+ @Override
+ public Topic clone() {
+ return new Topic(id, label);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ if (id != null) {
+ out.writeInt(1);
+ out.writeString(id);
+ } else {
+ out.writeInt(0);
+ }
+ TextUtils.writeToParcel(label, out, flags);
+ }
+ public static final Parcelable.Creator<Topic> CREATOR =
+ new Parcelable.Creator<Topic>() {
+ public Topic createFromParcel(Parcel in) {
+ return new Topic(in);
+ }
+ public Topic[] newArray(int size) {
+ return new Topic[size];
+ }
+ };
+ }
+
+ private Topic[] topics;
+
+ public Topic[] getTopics() {
+ return topics;
+ }
+
+ /**
* Constructs a Notification object with default values.
* You might want to consider using {@link Builder} instead.
*/
@@ -1487,6 +1577,8 @@ public class Notification implements Parcelable
}
color = parcel.readInt();
+
+ topics = parcel.createTypedArray(Topic.CREATOR); // may be null
}
@Override
@@ -1587,6 +1679,13 @@ public class Notification implements Parcelable
that.color = this.color;
+ if (this.topics != null) {
+ that.topics = new Topic[this.topics.length];
+ for(int i=0; i<this.topics.length; i++) {
+ that.topics[i] = this.topics[i].clone();
+ }
+ }
+
if (!heavy) {
that.lightenPayload(); // will clean out extras
}
@@ -1759,6 +1858,8 @@ public class Notification implements Parcelable
}
parcel.writeInt(color);
+
+ parcel.writeTypedArray(topics, 0); // null ok
}
/**
@@ -1895,6 +1996,18 @@ public class Notification implements Parcelable
sb.append(" publicVersion=");
sb.append(publicVersion.toString());
}
+ if (topics != null) {
+ sb.append("topics=[");
+ int N = topics.length;
+ if (N > 0) {
+ for (int i = 0; i < N-1; i++) {
+ sb.append(topics[i]);
+ sb.append(',');
+ }
+ sb.append(topics[N-1]);
+ }
+ sb.append("]");
+ }
sb.append(")");
return sb.toString();
}
@@ -2105,6 +2218,7 @@ public class Notification implements Parcelable
private final NotificationColorUtil mColorUtil;
private ArrayList<String> mPeople;
private int mColor = COLOR_DEFAULT;
+ private List<Topic> mTopics = new ArrayList<>();
/**
* The user that built the notification originally.
@@ -2874,6 +2988,19 @@ public class Notification implements Parcelable
return this;
}
+ /**
+ * Add a topic to this notification. Topics are typically displayed in Notification
+ * settings.
+ * <p>
+ * Every topic must have an id and a textual label.
+ *
+ * @param topic The topic to add.
+ */
+ public Builder addTopic(Topic topic) {
+ mTopics.add(topic);
+ return this;
+ }
+
private Drawable getProfileBadgeDrawable() {
// Note: This assumes that the current user can read the profile badge of the
// originating user.
@@ -3364,6 +3491,10 @@ public class Notification implements Parcelable
n.publicVersion = new Notification();
mPublicVersion.cloneInto(n.publicVersion, true);
}
+ if (mTopics.size() > 0) {
+ n.topics = new Topic[mTopics.size()];
+ mTopics.toArray(n.topics);
+ }
// Note: If you're adding new fields, also update restoreFromNotitification().
return n;
}
@@ -3605,6 +3736,10 @@ public class Notification implements Parcelable
mPublicVersion = n.publicVersion;
+ if (n.topics != null) {
+ Collections.addAll(mTopics, n.topics);
+ }
+
// Extras.
Bundle extras = n.extras;
mOriginatingUserId = extras.getInt(EXTRA_ORIGINATING_USERID);