Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74303cfe authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Add Notification topics.

Topics are tags that developers can add to group notifications
by theme. Users will be able to block notifications by topic.

Bug: 22451710
Change-Id: I5b4677da66b21933f479f5e56c18ca563810b43b
parent 560bd7c7
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -4759,6 +4759,7 @@ package android.app {
    method public android.graphics.drawable.Icon getLargeIcon();
    method public android.graphics.drawable.Icon getLargeIcon();
    method public android.graphics.drawable.Icon getSmallIcon();
    method public android.graphics.drawable.Icon getSmallIcon();
    method public java.lang.String getSortKey();
    method public java.lang.String getSortKey();
    method public android.app.Notification.Topic[] getTopics();
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
    field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
    field public static final java.lang.String CATEGORY_ALARM = "alarm";
    field public static final java.lang.String CATEGORY_ALARM = "alarm";
@@ -4923,6 +4924,7 @@ package android.app {
    method public android.app.Notification.Builder addAction(android.app.Notification.Action);
    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 addExtras(android.os.Bundle);
    method public android.app.Notification.Builder addPerson(java.lang.String);
    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 build();
    method public android.app.Notification.Builder extend(android.app.Notification.Extender);
    method public android.app.Notification.Builder extend(android.app.Notification.Extender);
    method public android.os.Bundle getExtras();
    method public android.os.Bundle getExtras();
@@ -5030,6 +5032,16 @@ package android.app {
    field protected android.app.Notification.Builder mBuilder;
    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 {
  public static final class Notification.WearableExtender implements android.app.Notification.Extender {
    ctor public Notification.WearableExtender();
    ctor public Notification.WearableExtender();
    ctor public Notification.WearableExtender(android.app.Notification);
    ctor public Notification.WearableExtender(android.app.Notification);
+12 −0
Original line number Original line Diff line number Diff line
@@ -4876,6 +4876,7 @@ package android.app {
    method public android.graphics.drawable.Icon getLargeIcon();
    method public android.graphics.drawable.Icon getLargeIcon();
    method public android.graphics.drawable.Icon getSmallIcon();
    method public android.graphics.drawable.Icon getSmallIcon();
    method public java.lang.String getSortKey();
    method public java.lang.String getSortKey();
    method public android.app.Notification.Topic[] getTopics();
    method public void writeToParcel(android.os.Parcel, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
    field public static final android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
    field public static final java.lang.String CATEGORY_ALARM = "alarm";
    field public static final java.lang.String CATEGORY_ALARM = "alarm";
@@ -5040,6 +5041,7 @@ package android.app {
    method public android.app.Notification.Builder addAction(android.app.Notification.Action);
    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 addExtras(android.os.Bundle);
    method public android.app.Notification.Builder addPerson(java.lang.String);
    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 build();
    method public android.app.Notification.Builder extend(android.app.Notification.Extender);
    method public android.app.Notification.Builder extend(android.app.Notification.Extender);
    method public android.os.Bundle getExtras();
    method public android.os.Bundle getExtras();
@@ -5147,6 +5149,16 @@ package android.app {
    field protected android.app.Notification.Builder mBuilder;
    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 {
  public static final class Notification.WearableExtender implements android.app.Notification.Extender {
    ctor public Notification.WearableExtender();
    ctor public Notification.WearableExtender();
    ctor public Notification.WearableExtender(android.app.Notification);
    ctor public Notification.WearableExtender(android.app.Notification);
+135 −0
Original line number Original line Diff line number Diff line
@@ -62,6 +62,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.Objects;


/**
/**
 * A class that represents how a persistent notification is to be presented to
 * A class that represents how a persistent notification is to be presented to
@@ -1361,6 +1362,95 @@ public class Notification implements Parcelable
     */
     */
    public Notification publicVersion;
    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.
     * Constructs a Notification object with default values.
     * You might want to consider using {@link Builder} instead.
     * You might want to consider using {@link Builder} instead.
@@ -1487,6 +1577,8 @@ public class Notification implements Parcelable
        }
        }


        color = parcel.readInt();
        color = parcel.readInt();

        topics = parcel.createTypedArray(Topic.CREATOR); // may be null
    }
    }


    @Override
    @Override
@@ -1587,6 +1679,13 @@ public class Notification implements Parcelable


        that.color = this.color;
        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) {
        if (!heavy) {
            that.lightenPayload(); // will clean out extras
            that.lightenPayload(); // will clean out extras
        }
        }
@@ -1759,6 +1858,8 @@ public class Notification implements Parcelable
        }
        }


        parcel.writeInt(color);
        parcel.writeInt(color);

        parcel.writeTypedArray(topics, 0); // null ok
    }
    }


    /**
    /**
@@ -1895,6 +1996,18 @@ public class Notification implements Parcelable
            sb.append(" publicVersion=");
            sb.append(" publicVersion=");
            sb.append(publicVersion.toString());
            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(")");
        sb.append(")");
        return sb.toString();
        return sb.toString();
    }
    }
@@ -2105,6 +2218,7 @@ public class Notification implements Parcelable
        private final NotificationColorUtil mColorUtil;
        private final NotificationColorUtil mColorUtil;
        private ArrayList<String> mPeople;
        private ArrayList<String> mPeople;
        private int mColor = COLOR_DEFAULT;
        private int mColor = COLOR_DEFAULT;
        private List<Topic> mTopics = new ArrayList<>();


        /**
        /**
         * The user that built the notification originally.
         * The user that built the notification originally.
@@ -2874,6 +2988,19 @@ public class Notification implements Parcelable
            return this;
            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() {
        private Drawable getProfileBadgeDrawable() {
            // Note: This assumes that the current user can read the profile badge of the
            // Note: This assumes that the current user can read the profile badge of the
            // originating user.
            // originating user.
@@ -3364,6 +3491,10 @@ public class Notification implements Parcelable
                n.publicVersion = new Notification();
                n.publicVersion = new Notification();
                mPublicVersion.cloneInto(n.publicVersion, true);
                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().
            // Note: If you're adding new fields, also update restoreFromNotitification().
            return n;
            return n;
        }
        }
@@ -3605,6 +3736,10 @@ public class Notification implements Parcelable


            mPublicVersion = n.publicVersion;
            mPublicVersion = n.publicVersion;


            if (n.topics != null) {
                Collections.addAll(mTopics, n.topics);
            }

            // Extras.
            // Extras.
            Bundle extras = n.extras;
            Bundle extras = n.extras;
            mOriginatingUserId = extras.getInt(EXTRA_ORIGINATING_USERID);
            mOriginatingUserId = extras.getInt(EXTRA_ORIGINATING_USERID);