1f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk/**
2f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * Copyright (C) 2018 The Android Open Source Project
3f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk *
4f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * Licensed under the Apache License, Version 2.0 (the "License");
5f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * you may not use this file except in compliance with the License.
6f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * You may obtain a copy of the License at
7f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk *
8f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk *      http://www.apache.org/licenses/LICENSE-2.0
9f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk *
10f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * Unless required by applicable law or agreed to in writing, software
11f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * distributed under the License is distributed on an "AS IS" BASIS,
12f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * See the License for the specific language governing permissions and
14f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * limitations under the License.
15f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk */
16f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
17f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykpackage android.hardware.radio;
18f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
19f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport android.annotation.IntDef;
20f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport android.annotation.NonNull;
21f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport android.annotation.SystemApi;
22f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport android.os.Parcel;
23f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport android.os.Parcelable;
24f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
25f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport java.lang.annotation.Retention;
26f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport java.lang.annotation.RetentionPolicy;
27f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport java.util.Collection;
28f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport java.util.Map;
29f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykimport java.util.Objects;
30f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
31f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk/**
32f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk * @hide
33f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk */
34f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk@SystemApi
35f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczykpublic final class Announcement implements Parcelable {
36f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
37f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** DAB alarm, RDS emergency program type (PTY 31). */
38f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public static final int TYPE_EMERGENCY = 1;
39f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** DAB warning. */
40f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public static final int TYPE_WARNING = 2;
41f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** DAB road traffic, RDS TA, HD Radio transportation. */
42f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public static final int TYPE_TRAFFIC = 3;
43f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** Weather. */
44f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public static final int TYPE_WEATHER = 4;
45f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** News. */
46f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public static final int TYPE_NEWS = 5;
47f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** DAB event, special event. */
48f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public static final int TYPE_EVENT = 6;
49f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** DAB sport report, RDS sports. */
50f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public static final int TYPE_SPORT = 7;
51f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** All others. */
52f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public static final int TYPE_MISC = 8;
53f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** @hide */
54f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    @IntDef(prefix = { "TYPE_" }, value = {
55f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        TYPE_EMERGENCY,
56f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        TYPE_WARNING,
57f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        TYPE_TRAFFIC,
58f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        TYPE_WEATHER,
59f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        TYPE_NEWS,
60f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        TYPE_EVENT,
61f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        TYPE_SPORT,
62f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        TYPE_MISC,
63f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    })
64f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    @Retention(RetentionPolicy.SOURCE)
65f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public @interface Type {}
66f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
67f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /**
68f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk     * Listener of announcement list events.
69f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk     */
70f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public interface OnListUpdatedListener {
71f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        /**
72f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk         * An event called whenever a list of active announcements change.
73f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk         *
74f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk         * The entire list is sent each time a new announcement appears or any ends broadcasting.
75f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk         *
76f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk         * @param activeAnnouncements a full list of active announcements
77f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk         */
78f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        void onListUpdated(Collection<Announcement> activeAnnouncements);
79f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    }
80f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
81f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    @NonNull private final ProgramSelector mSelector;
82f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    @Type private final int mType;
83f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    @NonNull private final Map<String, String> mVendorInfo;
84f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
85f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    /** @hide */
86f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public Announcement(@NonNull ProgramSelector selector, @Type int type,
87f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk            @NonNull Map<String, String> vendorInfo) {
88f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        mSelector = Objects.requireNonNull(selector);
89f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        mType = Objects.requireNonNull(type);
90f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        mVendorInfo = Objects.requireNonNull(vendorInfo);
91f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    }
92f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
93f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    private Announcement(@NonNull Parcel in) {
94f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        mSelector = in.readTypedObject(ProgramSelector.CREATOR);
95f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        mType = in.readInt();
96f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        mVendorInfo = Utils.readStringMap(in);
97f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    }
98f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
99f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    @Override
100f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public void writeToParcel(Parcel dest, int flags) {
101f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        dest.writeTypedObject(mSelector, 0);
102f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        dest.writeInt(mType);
103f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        Utils.writeStringMap(dest, mVendorInfo);
104f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    }
105f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
106f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    @Override
107f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public int describeContents() {
108f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        return 0;
109f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    }
110f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
111f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public static final Parcelable.Creator<Announcement> CREATOR =
112f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk            new Parcelable.Creator<Announcement>() {
113f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        public Announcement createFromParcel(Parcel in) {
114f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk            return new Announcement(in);
115f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        }
116f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
117f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        public Announcement[] newArray(int size) {
118f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk            return new Announcement[size];
119f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        }
120f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    };
121f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
122f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public @NonNull ProgramSelector getSelector() {
123f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        return mSelector;
124f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    }
125f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
126f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public @Type int getType() {
127f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        return mType;
128f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    }
129f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk
130f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    public @NonNull Map<String, String> getVendorInfo() {
131f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk        return mVendorInfo;
132f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk    }
133f151a7b3377e956fedd4f3e63afc880c35310219Tomasz Wasilczyk}
134