AudioAttributes.java revision 04f55a490d0479f73ac5b749eeb7716d9a2d17db
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;
206894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Triviimport android.annotation.SystemApi;
21b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcel;
22b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcelable;
23cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Triviimport android.text.TextUtils;
24d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport android.util.Log;
25d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
26d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.Retention;
27d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.RetentionPolicy;
28d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Collections;
29d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.HashSet;
30a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Triviimport java.util.Iterator;
31e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Triviimport java.util.Objects;
32d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Set;
33d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
34d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi/**
35d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * A class to encapsulate a collection of attributes describing information about an audio
3604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * stream.
3704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <p><code>AudioAttributes</code> supersede the notion of stream types (see for instance
3804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link AudioManager#STREAM_MUSIC} or {@link AudioManager#STREAM_ALARM}) for defining the
3904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * behavior of audio playback. Attributes allow an application to specify more information than is
4004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * conveyed in a stream type by allowing the application to define:
4104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <ul>
4204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>usage: "why" you are playing a sound, what is this sound used for. This is achieved with
4304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     the "usage" information. Examples of usage are {@link #USAGE_MEDIA} and {@link #USAGE_ALARM}.
4404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     These two examples are the closest to stream types, but more detailed use cases are
4504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     available. Usage information is more expressive than a stream type, and allows certain
4604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     platforms or routing policies to use this information for more refined volume or routing
4704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     decisions. Usage is the most important information to supply in <code>AudioAttributes</code>
4804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     and it is recommended to build any instance with this information supplied, see
4904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     {@link AudioAttributes.Builder} for exceptions.</li>
5004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>content type: "what" you are playing. The content type expresses the general category of
5104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     the content. This information is optional. But in case it is known (for instance
5204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     {@link #CONTENT_TYPE_MOVIE} for a movie streaming service or {@link #CONTENT_TYPE_MUSIC} for
5304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     a music playback application) this information might be used by the audio framework to
5404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     selectively configure some audio post-processing blocks.</li>
5504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>flags: "how" is playback to be affected, see the flag definitions for the specific playback
5604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     behaviors they control. </li>
5704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * </ul>
5804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <p><code>AudioAttributes</code> are used for example in one of the {@link AudioTrack}
5904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * constructors (see {@link AudioTrack#AudioTrack(AudioAttributes, AudioFormat, int, int, int)}),
6004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * to configure a {@link MediaPlayer}
6104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * (see {@link MediaPlayer#setAudioAttributes(AudioAttributes)} or a
6204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link android.app.Notification} (see {@link android.app.Notification#audioAttributes}). An
6304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <code>AudioAttributes</code> instance is built through its builder,
6404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link AudioAttributes.Builder}.
65d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi */
66b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivipublic final class AudioAttributes implements Parcelable {
67d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private final static String TAG = "AudioAttributes";
68d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
69d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
70d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is unknown, or other than the ones defined.
71d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
72d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_UNKNOWN = 0;
73d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
74d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is speech.
75d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
76d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SPEECH = 1;
77d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
78d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is music.
79d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
80d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MUSIC = 2;
81d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
82d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a soundtrack, typically accompanying
83d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a movie or TV program.
84d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
85d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MOVIE = 3;
86d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
87d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a sound used to accompany a user
88d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * action, such as a beep or sound effect expressing a key click, or event, such as the
89d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * type of a sound for a bonus being received in a game. These sounds are mostly synthesized
90d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or short Foley sounds.
91d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
92d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SONIFICATION = 4;
93d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
94d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
95d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is unknown.
96d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
97d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_UNKNOWN = 0;
98d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
99d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is media, such as music, or movie
100d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * soundtracks.
101d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
102d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_MEDIA = 1;
103d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
104d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is voice communications, such as telephony
105d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or VoIP.
106d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
107d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION = 2;
108d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
109d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is in-call signalling, such as with
110d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a "busy" beep, or DTMF tones.
111d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
112d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3;
113d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
114d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is an alarm (e.g. wake-up alarm).
115d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
116d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ALARM = 4;
117d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
118d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification. See other
119d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * notification usages for more specialized uses.
120d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
121d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION = 5;
122d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
123d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is telephony ringtone.
124d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
12589c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_RINGTONE = 6;
12689c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi    /**
127d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is a request to enter/end a
128d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication, such as a VoIP communication or video-conference.
129d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
130d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7;
131d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
132d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for an "instant"
133d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication such as a chat, or SMS.
134d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
135d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8;
136d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
137d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for a
138d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * non-immediate type of communication such as e-mail.
139d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
140d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9;
141d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
142d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is to attract the user's attention,
143d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * such as a reminder or low battery warning.
144d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
145d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_EVENT = 10;
146d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
147d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for accessibility, such as with
148d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a screen reader.
149d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
150d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_ACCESSIBILITY = 11;
151d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
152d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is driving or navigation directions.
153d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
154d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12;
155d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
156d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is sonification, such as  with user
157d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * interface sounds.
158d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
159d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_SONIFICATION = 13;
160d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
161d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for game audio.
162d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
163d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_GAME = 14;
164d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
165d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
166d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the audibility of the sound will be ensured by the system.
167d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
168d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_AUDIBILITY_ENFORCED = 0x1 << 0;
169d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
170d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
171d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the playback of the sound is ensured without
172d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * degradation only when going to a secure sink.
173d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
174d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // FIXME not guaranteed yet
1756894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    // TODO  add in FLAG_ALL_PUBLIC when supported and in public API
176d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SECURE = 0x1 << 1;
177d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
178d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
179d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag to enable when the stream is associated with SCO usage.
180d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only for dealing with legacy STREAM_BLUETOOTH_SCO
181d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
182d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SCO = 0x1 << 2;
1836894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    /**
1846894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * @hide
1856894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * Flag defining a behavior where the system ensures that the playback of the sound will
1866894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * be compatible with its use as a broadcast for surrounding people and/or devices.
1876894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * Ensures audibility with no or minimal post-processing applied.
1886894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     */
1896894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    @SystemApi
1906894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    public final static int FLAG_BEACON = 0x1 << 3;
191d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
192b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent    /**
193b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent     * Flag requesting the use of an output stream supporting hardware A/V synchronization.
194b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent     */
195b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent    public final static int FLAG_HW_AV_SYNC = 0x1 << 4;
196d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
1976894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    private final static int FLAG_ALL = FLAG_AUDIBILITY_ENFORCED | FLAG_SECURE | FLAG_SCO |
1986894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi            FLAG_BEACON | FLAG_HW_AV_SYNC;
19956340fc2e87985fb3d396b63b28168bf57ebe7ceEric Laurent    private final static int FLAG_ALL_PUBLIC = FLAG_AUDIBILITY_ENFORCED | FLAG_HW_AV_SYNC;
2006894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi
201d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mUsage = USAGE_UNKNOWN;
202d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mContentType = CONTENT_TYPE_UNKNOWN;
203701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    private int mSource = MediaRecorder.AudioSource.AUDIO_SOURCE_INVALID;
204d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mFlags = 0x0;
205d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private HashSet<String> mTags;
206a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi    private String mFormattedTags;
207d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
208d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private AudioAttributes() {
209d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
210d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
211d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
212d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the content type.
213d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setContentType(int)}
214d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
215d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getContentType() {
216d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mContentType;
217d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
218d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
219d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
220d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the usage.
221d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setUsage(int)}
222d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
223d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getUsage() {
224d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mUsage;
225d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
226d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
227d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
228701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * @hide
229701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * CANDIDATE FOR PUBLIC API
230701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * Return the capture preset.
231701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setCapturePreset(int)} or a
232701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     *    negative value if none has been set.
233701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     */
234701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    public int getCapturePreset() {
235701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        return mSource;
236701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    }
237701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
238701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    /**
239d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the flags.
240d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
241d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
242d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getFlags() {
243d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        // only return the flags that are public
2446894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi        return (mFlags & (FLAG_ALL_PUBLIC));
245d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
246d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
247d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
248d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
249d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return all the flags, even the non-public ones.
250d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only
251d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
252d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
253d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getAllFlags() {
2546894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi        return (mFlags & FLAG_ALL);
255d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
256d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
257d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
258b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi     * @hide
259d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the set of tags.
260d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a read-only set of all tags stored as strings.
261d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
262d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public Set<String> getTags() {
263d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return Collections.unmodifiableSet(mTags);
264d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
265d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
266d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
267d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Builder class for {@link AudioAttributes} objects.
26804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <p> Here is an example where <code>Builder</code> is used to define the
26904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * {@link AudioAttributes} to be used by a new <code>AudioTrack</code> instance:
27004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *
27104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <pre class="prettyprint">
27204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * AudioTrack myTrack = new AudioTrack(
27304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *         new AudioAttributes.Builder()
27404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .setUsage(AudioAttributes.USAGE_MEDIA)
27504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
27604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .build(),
27704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *         myFormat, myBuffSize, AudioTrack.MODE_STREAM, mySession);
27804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * </pre>
27904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *
28004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <p>By default all types of information (usage, content type, flags) conveyed by an
28104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <code>AudioAttributes</code> instance are set to "unknown". Unknown information will be
28204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * interpreted as a default value that is dependent on the context of use, for instance a
28304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * {@link MediaPlayer} will use a default usage of {@link AudioAttributes#USAGE_MEDIA}.
284d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
285d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public static class Builder {
286d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mUsage = USAGE_UNKNOWN;
287d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mContentType = CONTENT_TYPE_UNKNOWN;
288701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        private int mSource = MediaRecorder.AudioSource.AUDIO_SOURCE_INVALID;
289d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mFlags = 0x0;
290d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private HashSet<String> mTags = new HashSet<String>();
291d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
292d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
293d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder with the defaults.
29404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * By default, usage and content type are respectively {@link AudioAttributes#USAGE_UNKNOWN}
29504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * and {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}, and flags are 0. It is recommended to
29604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * configure the usage (with {@link #setUsage(int)}) or deriving attributes from a legacy
29704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * stream type (with {@link #setLegacyStreamType(int)}) before calling {@link #build()}
29804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * to override any default playback behavior in terms of routing and volume management.
299d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
300d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder() {
301d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
302d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
303d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
304d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder from a given AudioAttributes
305d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param aa the AudioAttributes object whose data will be reused in the new Builder.
306d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
307d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
308d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder(AudioAttributes aa) {
309d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mUsage = aa.mUsage;
310d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mContentType = aa.mContentType;
311d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags = aa.mFlags;
312d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags = (HashSet<String>) aa.mTags.clone();
313d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
314d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
315d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
316d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Combines all of the attributes that have been set and return a new
317d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * {@link AudioAttributes} object.
318d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return a new {@link AudioAttributes} object
319d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
320d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
321d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public AudioAttributes build() {
322d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            AudioAttributes aa = new AudioAttributes();
323d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mContentType = mContentType;
324d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mUsage = mUsage;
325701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            aa.mSource = mSource;
326d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mFlags = mFlags;
327d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mTags = (HashSet<String>) mTags.clone();
328cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            aa.mFormattedTags = TextUtils.join(";", mTags);
329d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return aa;
330d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
331d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
332d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
333d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing what is the intended use of the the audio signal,
334d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * such as alarm or ringtone.
335d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param usage one of {@link AudioAttributes#USAGE_UNKNOWN},
336d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_MEDIA},
337d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION},
338d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION_SIGNALLING},
339d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ALARM}, {@link AudioAttributes#USAGE_NOTIFICATION},
34089c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_RINGTONE},
341d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_REQUEST},
342d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_INSTANT},
343d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_DELAYED},
344d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_EVENT},
345d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_ACCESSIBILITY},
346d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_NAVIGATION_GUIDANCE},
347d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_SONIFICATION},
348d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_GAME}.
349d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
350d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
351d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setUsage(@AttributeUsage int usage) {
352d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (usage) {
353d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_UNKNOWN:
354d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_MEDIA:
355d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION:
356d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION_SIGNALLING:
357d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ALARM:
358d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION:
35989c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi                case USAGE_NOTIFICATION_RINGTONE:
360d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
361d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
362d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
363d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_EVENT:
364d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_ACCESSIBILITY:
365d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
366d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_SONIFICATION:
367d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_GAME:
368d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = usage;
369d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
370d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
371d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = USAGE_UNKNOWN;
372d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
373d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
374d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
375d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
376d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
377d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing the content type of the audio signal, such as speech,
378d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * or music.
379d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param contentType the content type values, one of
380d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MOVIE},
381d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MUSIC},
382d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SONIFICATION},
383d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SPEECH},
384d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}.
385d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
386d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
387d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setContentType(@AttributeContentType int contentType) {
388d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (contentType) {
389d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_UNKNOWN:
390d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MOVIE:
391d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MUSIC:
392d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SONIFICATION:
393d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SPEECH:
394d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mContentType = contentType;
395d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
396d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
397d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = CONTENT_TYPE_UNKNOWN;
398d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
399d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
400d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
401d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
402d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
403d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the combination of flags.
404d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param flags the {@link AudioAttributes#FLAG_AUDIBILITY_ENFORCED} flag.
405d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
406d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
407d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setFlags(int flags) {
4086894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi            flags &= AudioAttributes.FLAG_ALL;
409d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags |= flags;
410d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
411d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
412d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
413d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
414b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @hide
415d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Add a custom tag stored as a string
416d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param tag
417d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
418d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
419d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder addTag(String tag) {
420d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags.add(tag);
421d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
422d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
423d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
424d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
42504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * Sets attributes as inferred from the legacy stream types.
42604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * Use this method when building an {@link AudioAttributes} instance to initialize some of
42704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * the attributes by information derived from a legacy stream type.
428d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType one of {@link AudioManager#STREAM_VOICE_CALL},
429d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_SYSTEM}, {@link AudioManager#STREAM_RING},
430d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_MUSIC}, {@link AudioManager#STREAM_ALARM},
431d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *    or {@link AudioManager#STREAM_NOTIFICATION}.
432d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
433d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
434d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setLegacyStreamType(int streamType) {
435d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return setInternalLegacyStreamType(streamType);
436d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
437d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
438d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
439d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @hide
440d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * For internal framework use only, enables building from hidden stream types.
441d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType
442d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
443d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
444d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setInternalLegacyStreamType(int streamType) {
445d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch(streamType) {
446d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_VOICE_CALL:
447d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
448d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
449d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM_ENFORCED:
450d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_AUDIBILITY_ENFORCED;
451d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    // intended fall through, attributes in common with STREAM_SYSTEM
452d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM:
453d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
454d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
455d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_RING:
456d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
457d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
458d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_MUSIC:
459d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_MUSIC;
460d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
461d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_ALARM:
462d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
463d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
464d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_NOTIFICATION:
465d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
466d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
467d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_BLUETOOTH_SCO:
468d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
469d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_SCO;
470d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
471d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_DTMF:
472d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
473d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
474d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_TTS:
475d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
476d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
477d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
478701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    Log.e(TAG, "Invalid stream type " + streamType + " for AudioAttributes");
479701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            }
480c1601f73b98b004b6210631830d2184255037948Jean-Michel Trivi            mUsage = usageForLegacyStreamType(streamType);
481701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            return this;
482701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        }
483701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
484701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        /**
485701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @hide
486701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * Sets the capture preset.
487701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * Use this audio attributes configuration method when building an {@link AudioRecord}
488701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * instance with {@link AudioRecord#AudioRecord(AudioAttributes, AudioFormat, int)}.
489701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @param preset one of {@link MediaRecorder.AudioSource#DEFAULT},
490701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         *     {@link MediaRecorder.AudioSource#MIC}, {@link MediaRecorder.AudioSource#CAMCORDER},
491701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         *     {@link MediaRecorder.AudioSource#VOICE_RECOGNITION} or
492701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         *     {@link MediaRecorder.AudioSource#VOICE_COMMUNICATION}.
493701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @return the same Builder instance.
494701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         */
495701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        public Builder setCapturePreset(int preset) {
496701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            switch (preset) {
497701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.DEFAULT:
498701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.MIC:
499701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.CAMCORDER:
500701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.VOICE_RECOGNITION:
501701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.VOICE_COMMUNICATION:
502701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    mSource = preset;
503701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    break;
504701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                default:
505701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    Log.e(TAG, "Invalid capture preset " + preset + " for AudioAttributes");
506701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            }
507701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            return this;
508701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        }
509701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
510701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        /**
511701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @hide
512701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * Same as {@link #setCapturePreset(int)} but authorizes the use of HOTWORD and
513701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * REMOTE_SUBMIX.
514701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @param preset
515701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @return the same Builder instance.
516701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         */
517701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        public Builder setInternalCapturePreset(int preset) {
518701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            if ((preset == MediaRecorder.AudioSource.HOTWORD)
519701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    || (preset == MediaRecorder.AudioSource.REMOTE_SUBMIX)) {
520701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                mSource = preset;
521701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            } else {
522701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                setCapturePreset(preset);
523d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
524d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
525d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
526d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    };
527d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
528b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
529b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public int describeContents() {
530b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        return 0;
531b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
532b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
5338df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
5348df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * @hide
5358df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Used to indicate that when parcelling, the tags should be parcelled through the flattened
5368df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * formatted string, not through the array of strings.
5378df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Keep in sync with frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
5388df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * see definition of kAudioAttributesMarshallTagFlattenTags
5398df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
5408df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    public final static int FLATTEN_TAGS = 0x1;
5418df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
5428df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * When adding tags for writeToParcel(Parcel, int), add them in the list of flags (| NEW_FLAG)
5438df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
5448df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    private final static int ALL_PARCEL_FLAGS = FLATTEN_TAGS;
545b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
546b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public void writeToParcel(Parcel dest, int flags) {
547b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mUsage);
548b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mContentType);
549701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        dest.writeInt(mSource);
550b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mFlags);
5518df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        dest.writeInt(flags & ALL_PARCEL_FLAGS);
5528df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if ((flags & FLATTEN_TAGS) == 0) {
5538df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = new String[mTags.size()];
5548df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            mTags.toArray(tagsArray);
5558df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeStringArray(tagsArray);
5568df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else if ((flags & FLATTEN_TAGS) == FLATTEN_TAGS) {
5578df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeString(mFormattedTags);
5588df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        }
559b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
560b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
561b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    private AudioAttributes(Parcel in) {
562b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mUsage = in.readInt();
563b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mContentType = in.readInt();
564701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        mSource = in.readInt();
565b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mFlags = in.readInt();
5668df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        boolean hasFlattenedTags = ((in.readInt() & FLATTEN_TAGS) == FLATTEN_TAGS);
567b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mTags = new HashSet<String>();
5688df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if (hasFlattenedTags) {
569cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mFormattedTags = new String(in.readString());
570cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mTags.add(mFormattedTags);
5718df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else {
5728df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = in.readStringArray();
5738df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            for (int i = tagsArray.length - 1 ; i >= 0 ; i--) {
5748df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi                mTags.add(tagsArray[i]);
5758df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            }
576cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mFormattedTags = TextUtils.join(";", mTags);
577b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
578b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
579b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
580b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public static final Parcelable.Creator<AudioAttributes> CREATOR
581b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            = new Parcelable.Creator<AudioAttributes>() {
582b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        /**
583b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * Rebuilds an AudioAttributes previously stored with writeToParcel().
584b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @param p Parcel object to read the AudioAttributes from
585b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @return a new AudioAttributes created from the data in the parcel
586b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         */
587b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes createFromParcel(Parcel p) {
588b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes(p);
589b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
590b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes[] newArray(int size) {
591b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes[size];
592b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
593b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    };
594b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
595e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    @Override
596e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    public boolean equals(Object o) {
597e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        if (this == o) return true;
598e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        if (o == null || getClass() != o.getClass()) return false;
599e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
600e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        AudioAttributes that = (AudioAttributes) o;
601e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
602e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        return ((mContentType == that.mContentType)
603e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mFlags == that.mFlags)
604e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mSource == that.mSource)
605e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mUsage == that.mUsage)
606e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                //mFormattedTags is never null due to assignment in Builder or unmarshalling
607e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mFormattedTags.equals(that.mFormattedTags)));
608e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    }
609e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
610e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    @Override
611e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    public int hashCode() {
612e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        return Objects.hash(mContentType, mFlags, mSource, mUsage, mFormattedTags);
613e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    }
614e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
615a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    @Override
616a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String toString () {
617a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        return new String("AudioAttributes:"
618a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " usage=" + mUsage
619a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " content=" + mContentType
620a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " flags=0x" + Integer.toHexString(mFlags).toUpperCase()
621cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi                + " tags=" + mFormattedTags);
622a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
623a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi
624998ff75484f1eecb6ebef150de4ac8456d22e864Jean-Michel Trivi    /** @hide */
625a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String usageToString() {
6267b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        return usageToString(mUsage);
6277b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
6287b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
6297b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
6307b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static String usageToString(int usage) {
6317b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(usage) {
632a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_UNKNOWN:
633a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_UNKNOWN");
634a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_MEDIA:
635a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_MEDIA");
636a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
637a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
638a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
639a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
640a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ALARM:
641a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ALARM");
642a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION:
643a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
64489c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi            case USAGE_NOTIFICATION_RINGTONE:
645a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
646a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
647a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
648a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
649a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_INSTANT");
650a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
651a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_DELAYED");
652a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
653a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_EVENT");
654a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
655a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_ACCESSIBILITY");
656a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
657a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_NAVIGATION_GUIDANCE");
658a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
659a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_SONIFICATION");
660a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_GAME:
661a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_GAME");
662a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            default:
6637b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return new String("unknown usage " + usage);
6647b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        }
6657b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
6667b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
6677b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
6687b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static int usageForLegacyStreamType(int streamType) {
6697b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(streamType) {
6707b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_VOICE_CALL:
6717b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
6727b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM_ENFORCED:
6737b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM:
6747b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_SONIFICATION;
6757b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_RING:
67689c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi                return USAGE_NOTIFICATION_RINGTONE;
6777b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_MUSIC:
6787b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_MEDIA;
6797b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_ALARM:
6807b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ALARM;
6817b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_NOTIFICATION:
6827b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_NOTIFICATION;
6837b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_BLUETOOTH_SCO:
6847b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
6857b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_DTMF:
6867b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION_SIGNALLING;
6877b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_TTS:
6887b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_ACCESSIBILITY;
6897b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            default:
6907b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_UNKNOWN;
691a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        }
692a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
693b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
694d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
69509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    public static int toLegacyStreamType(AudioAttributes aa) {
69609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // flags to stream type mapping
69709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_AUDIBILITY_ENFORCED) == FLAG_AUDIBILITY_ENFORCED) {
69809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            return AudioSystem.STREAM_SYSTEM_ENFORCED;
69909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
70009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_SCO) == FLAG_SCO) {
70109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            return AudioSystem.STREAM_BLUETOOTH_SCO;
70209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
70309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
70409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // usage to stream type mapping
70509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        switch (aa.getUsage()) {
70609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_MEDIA:
70709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_GAME:
70809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
70909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
71009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_MUSIC;
71109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
71209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_SYSTEM;
71309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
71409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_VOICE_CALL;
71509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
71609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_DTMF;
71709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ALARM:
71809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_ALARM;
71989c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi            case USAGE_NOTIFICATION_RINGTONE:
72009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_RING;
72109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION:
72209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
72309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
72409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
72509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
72609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_NOTIFICATION;
72709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_UNKNOWN:
72809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            default:
72909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_MUSIC;
73009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
73109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    }
73209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
73309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    /** @hide */
734d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
735d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_UNKNOWN,
736d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_MEDIA,
737d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION,
738d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION_SIGNALLING,
739d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ALARM,
740d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION,
74189c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi        USAGE_NOTIFICATION_RINGTONE,
742d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
743d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
744d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
745d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_EVENT,
746d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_ACCESSIBILITY,
747d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
748d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_SONIFICATION,
749d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_GAME
750d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
751d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
752d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeUsage {}
753d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
754d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
755d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
756d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_UNKNOWN,
757d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SPEECH,
758d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MUSIC,
759d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MOVIE,
760d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SONIFICATION
761d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
762d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
763d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeContentType {}
764d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi}
765