AudioAttributes.java revision 998ff75484f1eecb6ebef150de4ac8456d22e864
1d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi/*
2d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * Copyright (C) 2014 The Android Open Source Project
3d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi *
4d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * you may not use this file except in compliance with the License.
6d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * You may obtain a copy of the License at
7d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi *
8d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi *
10d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * See the License for the specific language governing permissions and
14d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * limitations under the License.
15d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi */
16d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
17d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivipackage android.media;
18d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
19d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport android.annotation.IntDef;
20b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcel;
21b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcelable;
22d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport android.util.Log;
23d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
24d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.Retention;
25d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.RetentionPolicy;
26d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Collections;
27d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.HashSet;
28a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Triviimport java.util.Iterator;
29d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Set;
30d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
31d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi/**
32d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * A class to encapsulate a collection of attributes describing information about an audio
33d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * player or recorder.
34d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi */
35b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivipublic final class AudioAttributes implements Parcelable {
36d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private final static String TAG = "AudioAttributes";
37d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
38d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
39d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is unknown, or other than the ones defined.
40d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
41d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_UNKNOWN = 0;
42d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
43d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is speech.
44d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
45d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SPEECH = 1;
46d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
47d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is music.
48d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
49d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MUSIC = 2;
50d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
51d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a soundtrack, typically accompanying
52d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a movie or TV program.
53d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
54d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MOVIE = 3;
55d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
56d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a sound used to accompany a user
57d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * action, such as a beep or sound effect expressing a key click, or event, such as the
58d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * type of a sound for a bonus being received in a game. These sounds are mostly synthesized
59d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or short Foley sounds.
60d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
61d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SONIFICATION = 4;
62d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
63d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
64d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is unknown.
65d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
66d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_UNKNOWN = 0;
67d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
68d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is media, such as music, or movie
69d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * soundtracks.
70d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
71d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_MEDIA = 1;
72d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
73d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is voice communications, such as telephony
74d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or VoIP.
75d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
76d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION = 2;
77d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
78d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is in-call signalling, such as with
79d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a "busy" beep, or DTMF tones.
80d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
81d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3;
82d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
83d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is an alarm (e.g. wake-up alarm).
84d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
85d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ALARM = 4;
86d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
87d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification. See other
88d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * notification usages for more specialized uses.
89d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
90d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION = 5;
91d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
92d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is telephony ringtone.
93d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
94d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_TELEPHONY_RINGTONE = 6;
95d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
96d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is a request to enter/end a
97d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication, such as a VoIP communication or video-conference.
98d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
99d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7;
100d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
101d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for an "instant"
102d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication such as a chat, or SMS.
103d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
104d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8;
105d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
106d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for a
107d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * non-immediate type of communication such as e-mail.
108d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
109d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9;
110d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
111d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is to attract the user's attention,
112d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * such as a reminder or low battery warning.
113d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
114d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_EVENT = 10;
115d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
116d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for accessibility, such as with
117d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a screen reader.
118d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
119d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_ACCESSIBILITY = 11;
120d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
121d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is driving or navigation directions.
122d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
123d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12;
124d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
125d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is sonification, such as  with user
126d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * interface sounds.
127d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
128d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_SONIFICATION = 13;
129d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
130d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for game audio.
131d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
132d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_GAME = 14;
133d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
134d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
135d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the audibility of the sound will be ensured by the system.
136d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
137d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_AUDIBILITY_ENFORCED = 0x1 << 0;
138d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
139d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
140d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the playback of the sound is ensured without
141d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * degradation only when going to a secure sink.
142d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
143d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // FIXME not guaranteed yet
144d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // TODO  add OR to getFlags() when supported and in public API
145d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SECURE = 0x1 << 1;
146d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
147d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
148d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag to enable when the stream is associated with SCO usage.
149d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only for dealing with legacy STREAM_BLUETOOTH_SCO
150d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
151d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SCO = 0x1 << 2;
152d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
153d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
154d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mUsage = USAGE_UNKNOWN;
155d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mContentType = CONTENT_TYPE_UNKNOWN;
156d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mFlags = 0x0;
157d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private HashSet<String> mTags;
158a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi    private String mFormattedTags;
159d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
160d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private AudioAttributes() {
161d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
162d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
163d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
164d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the content type.
165d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setContentType(int)}
166d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
167d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getContentType() {
168d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mContentType;
169d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
170d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
171d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
172d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the usage.
173d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setUsage(int)}
174d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
175d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getUsage() {
176d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mUsage;
177d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
178d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
179d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
180d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the flags.
181d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
182d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
183d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getFlags() {
184d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        // only return the flags that are public
185d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return (mFlags & (FLAG_AUDIBILITY_ENFORCED));
186d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
187d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
188d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
189d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
190d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return all the flags, even the non-public ones.
191d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only
192d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
193d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
194d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getAllFlags() {
195d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mFlags;
196d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
197d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
198d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
199b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi     * @hide
200d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the set of tags.
201d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a read-only set of all tags stored as strings.
202d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
203d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public Set<String> getTags() {
204d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return Collections.unmodifiableSet(mTags);
205d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
206d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
207d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
208d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Builder class for {@link AudioAttributes} objects.
209d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
210d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public static class Builder {
211d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mUsage = USAGE_UNKNOWN;
212d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mContentType = CONTENT_TYPE_UNKNOWN;
213d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mFlags = 0x0;
214d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private HashSet<String> mTags = new HashSet<String>();
215d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
216d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
217d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder with the defaults.
218d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
219d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder() {
220d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
221d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
222d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
223d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder from a given AudioAttributes
224d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param aa the AudioAttributes object whose data will be reused in the new Builder.
225d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
226d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
227d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder(AudioAttributes aa) {
228d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mUsage = aa.mUsage;
229d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mContentType = aa.mContentType;
230d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags = aa.mFlags;
231d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags = (HashSet<String>) aa.mTags.clone();
232d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
233d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
234d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
235d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Combines all of the attributes that have been set and return a new
236d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * {@link AudioAttributes} object.
237d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return a new {@link AudioAttributes} object
238d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
239d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
240d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public AudioAttributes build() {
241d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            AudioAttributes aa = new AudioAttributes();
242d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mContentType = mContentType;
243d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mUsage = mUsage;
244d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mFlags = mFlags;
245d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mTags = (HashSet<String>) mTags.clone();
246a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            final Iterator<String> tagIterator = mTags.iterator();
247a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            String allTagsInOne = new String();
248a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            while (tagIterator.hasNext()) {
249a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi                allTagsInOne += tagIterator.next() + ";";
250a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            }
251a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi            aa.mFormattedTags = allTagsInOne;
252d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return aa;
253d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
254d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
255d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
256d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing what is the intended use of the the audio signal,
257d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * such as alarm or ringtone.
258d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param usage one of {@link AudioAttributes#USAGE_UNKNOWN},
259d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_MEDIA},
260d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION},
261d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION_SIGNALLING},
262d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ALARM}, {@link AudioAttributes#USAGE_NOTIFICATION},
263d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_TELEPHONY_RINGTONE},
264d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_REQUEST},
265d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_INSTANT},
266d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_DELAYED},
267d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_EVENT},
268d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_ACCESSIBILITY},
269d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_NAVIGATION_GUIDANCE},
270d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_SONIFICATION},
271d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_GAME}.
272d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
273d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
274d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setUsage(@AttributeUsage int usage) {
275d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (usage) {
276d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_UNKNOWN:
277d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_MEDIA:
278d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION:
279d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION_SIGNALLING:
280d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ALARM:
281d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION:
282d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
283d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
284d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
285d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
286d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_EVENT:
287d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_ACCESSIBILITY:
288d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
289d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_SONIFICATION:
290d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_GAME:
291d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = usage;
292d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
293d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
294d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = USAGE_UNKNOWN;
295d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
296d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
297d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
298d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
299d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
300d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing the content type of the audio signal, such as speech,
301d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * or music.
302d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param contentType the content type values, one of
303d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MOVIE},
304d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MUSIC},
305d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SONIFICATION},
306d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SPEECH},
307d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}.
308d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
309d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
310d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setContentType(@AttributeContentType int contentType) {
311d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (contentType) {
312d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_UNKNOWN:
313d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MOVIE:
314d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MUSIC:
315d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SONIFICATION:
316d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SPEECH:
317d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mContentType = contentType;
318d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
319d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
320d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = CONTENT_TYPE_UNKNOWN;
321d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
322d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
323d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
324d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
325d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
326d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the combination of flags.
327d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param flags the {@link AudioAttributes#FLAG_AUDIBILITY_ENFORCED} flag.
328d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
329d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
330d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setFlags(int flags) {
331d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            flags &= (AudioAttributes.FLAG_AUDIBILITY_ENFORCED | AudioAttributes.FLAG_SCO
332d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    | AudioAttributes.FLAG_SECURE);
333d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags |= flags;
334d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
335d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
336d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
337d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
338b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @hide
339d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Add a custom tag stored as a string
340d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param tag
341d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
342d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
343d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder addTag(String tag) {
344d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags.add(tag);
345d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
346d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
347d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
348d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
349d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Adds attributes inferred from the legacy stream types.
350d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType one of {@link AudioManager#STREAM_VOICE_CALL},
351d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_SYSTEM}, {@link AudioManager#STREAM_RING},
352d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_MUSIC}, {@link AudioManager#STREAM_ALARM},
353d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *    or {@link AudioManager#STREAM_NOTIFICATION}.
354d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
355d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
356d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setLegacyStreamType(int streamType) {
357d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return setInternalLegacyStreamType(streamType);
358d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
359d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
360d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
361d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @hide
362d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * For internal framework use only, enables building from hidden stream types.
363d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType
364d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
365d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
366d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setInternalLegacyStreamType(int streamType) {
367d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch(streamType) {
368d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_VOICE_CALL:
369d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
370d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_VOICE_COMMUNICATION;
371d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
372d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM_ENFORCED:
373d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_AUDIBILITY_ENFORCED;
374d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    // intended fall through, attributes in common with STREAM_SYSTEM
375d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM:
376d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
377d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_ASSISTANCE_SONIFICATION;
378d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
379d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_RING:
380d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
381d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
382d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
383d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_MUSIC:
384d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_MUSIC;
385d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_MEDIA;
386d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
387d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_ALARM:
388d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
389d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_ALARM;
390d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
391d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_NOTIFICATION:
392d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
393d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_NOTIFICATION;
394d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
395d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_BLUETOOTH_SCO:
396d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
397d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_VOICE_COMMUNICATION;
398d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_SCO;
399d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
400d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_DTMF:
401d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
402d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_VOICE_COMMUNICATION_SIGNALLING;
403d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
404d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_TTS:
405d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
406d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mUsage = USAGE_ASSISTANCE_ACCESSIBILITY;
407d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
408d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
409d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    Log.e(TAG, "Invalid stream type " + streamType + " in for AudioAttributes");
410d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
411d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
412d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
413d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    };
414d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
415b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
416b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public int describeContents() {
417b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        return 0;
418b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
419b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
4208df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
4218df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * @hide
4228df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Used to indicate that when parcelling, the tags should be parcelled through the flattened
4238df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * formatted string, not through the array of strings.
4248df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Keep in sync with frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
4258df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * see definition of kAudioAttributesMarshallTagFlattenTags
4268df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
4278df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    public final static int FLATTEN_TAGS = 0x1;
4288df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
4298df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * When adding tags for writeToParcel(Parcel, int), add them in the list of flags (| NEW_FLAG)
4308df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
4318df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    private final static int ALL_PARCEL_FLAGS = FLATTEN_TAGS;
432b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
433b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public void writeToParcel(Parcel dest, int flags) {
434b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mUsage);
435b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mContentType);
436b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mFlags);
4378df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        dest.writeInt(flags & ALL_PARCEL_FLAGS);
4388df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if ((flags & FLATTEN_TAGS) == 0) {
4398df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = new String[mTags.size()];
4408df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            mTags.toArray(tagsArray);
4418df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeStringArray(tagsArray);
4428df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else if ((flags & FLATTEN_TAGS) == FLATTEN_TAGS) {
4438df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeString(mFormattedTags);
4448df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        }
445b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
446b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
447b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    private AudioAttributes(Parcel in) {
448b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mUsage = in.readInt();
449b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mContentType = in.readInt();
450b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mFlags = in.readInt();
4518df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        boolean hasFlattenedTags = ((in.readInt() & FLATTEN_TAGS) == FLATTEN_TAGS);
452b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mTags = new HashSet<String>();
4538df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if (hasFlattenedTags) {
4548df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            mTags.add(in.readString());
4558df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else {
4568df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = in.readStringArray();
4578df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            for (int i = tagsArray.length - 1 ; i >= 0 ; i--) {
4588df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi                mTags.add(tagsArray[i]);
4598df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            }
460b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
461b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
462b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
463b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    /** @hide */
464b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public static final Parcelable.Creator<AudioAttributes> CREATOR
465b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            = new Parcelable.Creator<AudioAttributes>() {
466b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        /**
467b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * Rebuilds an AudioAttributes previously stored with writeToParcel().
468b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @param p Parcel object to read the AudioAttributes from
469b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @return a new AudioAttributes created from the data in the parcel
470b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         */
471b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes createFromParcel(Parcel p) {
472b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes(p);
473b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
474b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes[] newArray(int size) {
475b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes[size];
476b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
477b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    };
478b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
479a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    /** @hide */
480a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    @Override
481a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String toString () {
482a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        return new String("AudioAttributes:"
483a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " usage=" + mUsage
484a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " content=" + mContentType
485a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " flags=0x" + Integer.toHexString(mFlags).toUpperCase()
486a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " tags=" + mTags);
487a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
488a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi
489998ff75484f1eecb6ebef150de4ac8456d22e864Jean-Michel Trivi    /** @hide */
490a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String usageToString() {
491a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        switch(mUsage) {
492a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_UNKNOWN:
493a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_UNKNOWN");
494a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_MEDIA:
495a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_MEDIA");
496a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
497a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
498a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
499a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
500a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ALARM:
501a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ALARM");
502a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION:
503a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
504a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
505a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
506a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
507a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
508a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
509a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_INSTANT");
510a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
511a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_DELAYED");
512a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
513a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_EVENT");
514a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
515a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_ACCESSIBILITY");
516a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
517a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_NAVIGATION_GUIDANCE");
518a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
519a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_SONIFICATION");
520a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_GAME:
521a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_GAME");
522a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            default:
523a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("unknown usage " + mUsage);
524a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        }
525a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
526b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
527d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
528d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
529d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_UNKNOWN,
530d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_MEDIA,
531d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION,
532d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION_SIGNALLING,
533d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ALARM,
534d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION,
535d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_TELEPHONY_RINGTONE,
536d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
537d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
538d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
539d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_EVENT,
540d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_ACCESSIBILITY,
541d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
542d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_SONIFICATION,
543d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_GAME
544d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
545d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
546d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeUsage {}
547d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
548d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
549d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
550d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_UNKNOWN,
551d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SPEECH,
552d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MUSIC,
553d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MOVIE,
554d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SONIFICATION
555d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
556d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
557d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeContentType {}
558d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi}
559