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;
20d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Triviimport android.annotation.NonNull;
216894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Triviimport android.annotation.SystemApi;
22f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Triviimport android.os.Bundle;
23b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcel;
24b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Triviimport android.os.Parcelable;
25cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Triviimport android.text.TextUtils;
26d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport android.util.Log;
27e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Triviimport android.util.SparseIntArray;
28d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
29d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.Retention;
30d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.lang.annotation.RetentionPolicy;
31d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Collections;
32d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.HashSet;
33e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Triviimport java.util.Objects;
34d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Triviimport java.util.Set;
35d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
36d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi/**
37d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi * A class to encapsulate a collection of attributes describing information about an audio
3804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * stream.
3904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <p><code>AudioAttributes</code> supersede the notion of stream types (see for instance
4004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link AudioManager#STREAM_MUSIC} or {@link AudioManager#STREAM_ALARM}) for defining the
4104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * behavior of audio playback. Attributes allow an application to specify more information than is
4204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * conveyed in a stream type by allowing the application to define:
4304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <ul>
4404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>usage: "why" you are playing a sound, what is this sound used for. This is achieved with
4504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     the "usage" information. Examples of usage are {@link #USAGE_MEDIA} and {@link #USAGE_ALARM}.
4604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     These two examples are the closest to stream types, but more detailed use cases are
4704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     available. Usage information is more expressive than a stream type, and allows certain
4804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     platforms or routing policies to use this information for more refined volume or routing
4904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     decisions. Usage is the most important information to supply in <code>AudioAttributes</code>
5004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     and it is recommended to build any instance with this information supplied, see
5104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     {@link AudioAttributes.Builder} for exceptions.</li>
5204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>content type: "what" you are playing. The content type expresses the general category of
5304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     the content. This information is optional. But in case it is known (for instance
5404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     {@link #CONTENT_TYPE_MOVIE} for a movie streaming service or {@link #CONTENT_TYPE_MUSIC} for
5504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     a music playback application) this information might be used by the audio framework to
5604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     selectively configure some audio post-processing blocks.</li>
5704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <li>flags: "how" is playback to be affected, see the flag definitions for the specific playback
5804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi *     behaviors they control. </li>
5904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * </ul>
6004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <p><code>AudioAttributes</code> are used for example in one of the {@link AudioTrack}
6104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * constructors (see {@link AudioTrack#AudioTrack(AudioAttributes, AudioFormat, int, int, int)}),
6204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * to configure a {@link MediaPlayer}
6304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * (see {@link MediaPlayer#setAudioAttributes(AudioAttributes)} or a
6404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link android.app.Notification} (see {@link android.app.Notification#audioAttributes}). An
6504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * <code>AudioAttributes</code> instance is built through its builder,
6604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi * {@link AudioAttributes.Builder}.
67d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi */
68b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivipublic final class AudioAttributes implements Parcelable {
69d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private final static String TAG = "AudioAttributes";
70d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
71d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
72d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is unknown, or other than the ones defined.
73d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
74d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_UNKNOWN = 0;
75d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
76d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is speech.
77d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
78d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SPEECH = 1;
79d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
80d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is music.
81d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
82d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MUSIC = 2;
83d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
84d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a soundtrack, typically accompanying
85d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a movie or TV program.
86d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
87d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_MOVIE = 3;
88d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
89d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Content type value to use when the content type is a sound used to accompany a user
90d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * action, such as a beep or sound effect expressing a key click, or event, such as the
91d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * type of a sound for a bonus being received in a game. These sounds are mostly synthesized
92d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or short Foley sounds.
93d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
94d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int CONTENT_TYPE_SONIFICATION = 4;
95d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
96d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
97d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is unknown.
98d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
99d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_UNKNOWN = 0;
100d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
101d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is media, such as music, or movie
102d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * soundtracks.
103d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
104d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_MEDIA = 1;
105d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
106d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is voice communications, such as telephony
107d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * or VoIP.
108d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
109d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION = 2;
110d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
111d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is in-call signalling, such as with
112d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a "busy" beep, or DTMF tones.
113d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
114d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_VOICE_COMMUNICATION_SIGNALLING = 3;
115d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
116d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is an alarm (e.g. wake-up alarm).
117d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
118d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ALARM = 4;
119d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
120d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification. See other
121d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * notification usages for more specialized uses.
122d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
123d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION = 5;
124d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
125d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is telephony ringtone.
126d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
12789c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_RINGTONE = 6;
12889c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi    /**
129d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is a request to enter/end a
130d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication, such as a VoIP communication or video-conference.
131d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
132d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7;
133d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
134d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for an "instant"
135d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * communication such as a chat, or SMS.
136d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
137d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8;
138d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
139d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is notification for a
140d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * non-immediate type of communication such as e-mail.
141d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
142d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9;
143d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
144d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is to attract the user's attention,
145d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * such as a reminder or low battery warning.
146d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
147d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_NOTIFICATION_EVENT = 10;
148d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
149d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for accessibility, such as with
150d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * a screen reader.
151d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
152d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_ACCESSIBILITY = 11;
153d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
154d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is driving or navigation directions.
155d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
156d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12;
157d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
158d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is sonification, such as  with user
159d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * interface sounds.
160d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
161d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_ASSISTANCE_SONIFICATION = 13;
162d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
163d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Usage value to use when the usage is for game audio.
164d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
165d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int USAGE_GAME = 14;
1668fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi    /**
1678fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     * @hide
1688fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     * Usage value to use when feeding audio to the platform and replacing "traditional" audio
1698fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     * source, such as audio capture devices.
1708fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi     */
1718fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi    public final static int USAGE_VIRTUAL_SOURCE = 15;
172d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
173d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
174e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * IMPORTANT: when adding new usage types, add them to SDK_USAGES and update SUPPRESSIBLE_USAGES
175e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     *            if applicable.
176e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     */
177e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi
178e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    /**
179e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * @hide
180e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * Denotes a usage for notifications that do not expect immediate intervention from the user,
181e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * will be muted when the Zen mode disables notifications
182e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * @see #SUPPRESSIBLE_USAGES
183e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     */
184e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    public final static int SUPPRESSIBLE_NOTIFICATION = 1;
185e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    /**
186e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * @hide
187e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * Denotes a usage for notifications that do expect immediate intervention from the user,
188e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * will be muted when the Zen mode disables calls
189e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * @see #SUPPRESSIBLE_USAGES
190e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     */
191e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    public final static int SUPPRESSIBLE_CALL = 2;
192e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi
193e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    /**
194e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * @hide
195e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * Array of all usage types for calls and notifications to assign the suppression behavior,
196e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * used by the Zen mode restrictions.
197e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * @see com.android.server.notification.ZenModeHelper
198e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     */
199e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    public static final SparseIntArray SUPPRESSIBLE_USAGES;
200e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi
201e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    static {
202e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi        SUPPRESSIBLE_USAGES = new SparseIntArray();
203e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi        SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION,                      SUPPRESSIBLE_NOTIFICATION);
204e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi        SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_RINGTONE,             SUPPRESSIBLE_CALL);
205e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi        SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_REQUEST,SUPPRESSIBLE_CALL);
206e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi        SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_INSTANT,SUPPRESSIBLE_NOTIFICATION);
207e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi        SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_DELAYED,SUPPRESSIBLE_NOTIFICATION);
208e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi        SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_EVENT,                SUPPRESSIBLE_NOTIFICATION);
209e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    }
210e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi
211e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    /**
212e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * @hide
213e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     * Array of all usage types exposed in the SDK that applications can use.
214e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi     */
215e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    public final static int[] SDK_USAGES = {
216e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_UNKNOWN,
217e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_MEDIA,
218e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_VOICE_COMMUNICATION,
219e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_VOICE_COMMUNICATION_SIGNALLING,
220e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_ALARM,
221e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_NOTIFICATION,
222e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_NOTIFICATION_RINGTONE,
223e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
224e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
225e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
226e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_NOTIFICATION_EVENT,
227e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_ASSISTANCE_ACCESSIBILITY,
228e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
229e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_ASSISTANCE_SONIFICATION,
230e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi            USAGE_GAME
231e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    };
232e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi
233e743bda5dec3c81ed6292c06b97b0c9f41464907Jean-Michel Trivi    /**
234d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the audibility of the sound will be ensured by the system.
235d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
236d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_AUDIBILITY_ENFORCED = 0x1 << 0;
237d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
238d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
239d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag defining a behavior where the playback of the sound is ensured without
240d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * degradation only when going to a secure sink.
241d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
242d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    // FIXME not guaranteed yet
2436894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    // TODO  add in FLAG_ALL_PUBLIC when supported and in public API
244d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SECURE = 0x1 << 1;
245d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
246d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
247d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Flag to enable when the stream is associated with SCO usage.
248d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only for dealing with legacy STREAM_BLUETOOTH_SCO
249d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
250d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public final static int FLAG_SCO = 0x1 << 2;
2516894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    /**
2526894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * @hide
2536894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * Flag defining a behavior where the system ensures that the playback of the sound will
2546894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * be compatible with its use as a broadcast for surrounding people and/or devices.
2556894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     * Ensures audibility with no or minimal post-processing applied.
2566894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi     */
2576894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    @SystemApi
2586894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    public final static int FLAG_BEACON = 0x1 << 3;
259d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
260b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent    /**
261b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent     * Flag requesting the use of an output stream supporting hardware A/V synchronization.
262b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent     */
263b634e1b6d6bda56128c354b1803b04b537e3799dEric Laurent    public final static int FLAG_HW_AV_SYNC = 0x1 << 4;
264d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
265bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent    /**
266bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * @hide
267bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * Flag requesting capture from the source used for hardware hotword detection.
268bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * To be used with capture preset MediaRecorder.AudioSource.HOTWORD or
269bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     * MediaRecorder.AudioSource.VOICE_RECOGNITION.
270bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent     */
271bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent    @SystemApi
272bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent    public final static int FLAG_HW_HOTWORD = 0x1 << 5;
273bdad1afa92a6e7cd688061d5432f25a3dd15b64eEric Laurent
274bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    /**
275bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     * @hide
276bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     * Flag requesting audible playback even under limited interruptions.
277bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     */
278bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    @SystemApi
279bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    public final static int FLAG_BYPASS_INTERRUPTION_POLICY = 0x1 << 6;
280bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock
281bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    /**
282bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     * @hide
283bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     * Flag requesting audible playback even when the underlying stream is muted.
284bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock     */
285bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    @SystemApi
286bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock    public final static int FLAG_BYPASS_MUTE = 0x1 << 7;
287bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock
288dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk    /**
2892050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * Flag requesting a low latency path when creating an AudioTrack.
290dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk     * When using this flag, the sample rate must match the native sample rate
291dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk     * of the device. Effects processing is also unavailable.
2922050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     *
2932050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * Note that if this flag is used without specifying a bufferSizeInBytes then the
2942050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * AudioTrack's actual buffer size may be too small. It is recommended that a fairly
2952050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * large buffer should be specified when the AudioTrack is created.
2962050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * Then the actual size can be reduced by calling
2972050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * {@link AudioTrack#setBufferSizeInFrames(int)}. The buffer size can be optimized
2982050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * by lowering it after each write() call until the audio glitches, which is detected by calling
2992050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * {@link AudioTrack#getUnderrunCount()}. Then the buffer size can be increased
3002050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * until there are no glitches.
3012050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * This tuning step should be done while playing silence.
3022050f6cb431a6d86734f0e998ca7916619144e3fPhil Burk     * This technique provides a compromise between latency and glitch rate.
303dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk     */
304dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk    public final static int FLAG_LOW_LATENCY = 0x1 << 8;
305dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk
3066894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi    private final static int FLAG_ALL = FLAG_AUDIBILITY_ENFORCED | FLAG_SECURE | FLAG_SCO |
307bbfd31a5d4f126167e20fa8bd256c810cf8c2c85John Spurlock            FLAG_BEACON | FLAG_HW_AV_SYNC | FLAG_HW_HOTWORD | FLAG_BYPASS_INTERRUPTION_POLICY |
308dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk            FLAG_BYPASS_MUTE | FLAG_LOW_LATENCY;
309dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk    private final static int FLAG_ALL_PUBLIC = FLAG_AUDIBILITY_ENFORCED |
310dd73142b53e8f693c17335ea4895b84d37ccbae4Phil Burk            FLAG_HW_AV_SYNC | FLAG_LOW_LATENCY;
3116894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi
312d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mUsage = USAGE_UNKNOWN;
313d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mContentType = CONTENT_TYPE_UNKNOWN;
314701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    private int mSource = MediaRecorder.AudioSource.AUDIO_SOURCE_INVALID;
315d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private int mFlags = 0x0;
316d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private HashSet<String> mTags;
317a1d80e3b1d210c60c6881a55ed39a4077ff66080Jean-Michel Trivi    private String mFormattedTags;
318f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    private Bundle mBundle; // lazy-initialized, may be null
319d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
320d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    private AudioAttributes() {
321d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
322d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
323d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
324d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the content type.
325d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setContentType(int)}
326d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
327d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getContentType() {
328d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mContentType;
329d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
330d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
331d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
332d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the usage.
333d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setUsage(int)}
334d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
335d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getUsage() {
336d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return mUsage;
337d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
338d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
339d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
340701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * @hide
341701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * Return the capture preset.
342701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     * @return one of the values that can be set in {@link Builder#setCapturePreset(int)} or a
343701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     *    negative value if none has been set.
344701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi     */
3451b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi    @SystemApi
346701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    public int getCapturePreset() {
347701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        return mSource;
348701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    }
349701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
350701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi    /**
351d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the flags.
352d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
353d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
354d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getFlags() {
355d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        // only return the flags that are public
3566894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi        return (mFlags & (FLAG_ALL_PUBLIC));
357d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
358d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
359d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
360d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @hide
361d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return all the flags, even the non-public ones.
362d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Internal use only
363d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a combined mask of all flags
364d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
36500a009204e51997249d60eab4f147eff566e2b1fEric Laurent    @SystemApi
366d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public int getAllFlags() {
3676894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi        return (mFlags & FLAG_ALL);
368d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
369d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
370d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
371b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi     * @hide
372f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi     * Return the Bundle of data.
373f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi     * @return a copy of the Bundle for this instance, may be null.
374f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi     */
375f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    @SystemApi
376f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    public Bundle getBundle() {
377f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        if (mBundle == null) {
378f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            return mBundle;
379f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        } else {
380f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            return new Bundle(mBundle);
381f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        }
382f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    }
383f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi
384f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    /**
385f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi     * @hide
386d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Return the set of tags.
387d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * @return a read-only set of all tags stored as strings.
388d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
389d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public Set<String> getTags() {
390d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        return Collections.unmodifiableSet(mTags);
391d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    }
392d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
393d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /**
394d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     * Builder class for {@link AudioAttributes} objects.
39504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <p> Here is an example where <code>Builder</code> is used to define the
39604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * {@link AudioAttributes} to be used by a new <code>AudioTrack</code> instance:
39704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *
39804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <pre class="prettyprint">
39904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * AudioTrack myTrack = new AudioTrack(
40004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *         new AudioAttributes.Builder()
40104f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .setUsage(AudioAttributes.USAGE_MEDIA)
40204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
40304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *             .build(),
40404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *         myFormat, myBuffSize, AudioTrack.MODE_STREAM, mySession);
40504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * </pre>
40604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     *
40704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <p>By default all types of information (usage, content type, flags) conveyed by an
40804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * <code>AudioAttributes</code> instance are set to "unknown". Unknown information will be
40904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * interpreted as a default value that is dependent on the context of use, for instance a
41004f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi     * {@link MediaPlayer} will use a default usage of {@link AudioAttributes#USAGE_MEDIA}.
411d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi     */
412d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public static class Builder {
413d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mUsage = USAGE_UNKNOWN;
414d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mContentType = CONTENT_TYPE_UNKNOWN;
415701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        private int mSource = MediaRecorder.AudioSource.AUDIO_SOURCE_INVALID;
416d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private int mFlags = 0x0;
417d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        private HashSet<String> mTags = new HashSet<String>();
418f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        private Bundle mBundle;
419d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
420d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
421d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder with the defaults.
42204f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * By default, usage and content type are respectively {@link AudioAttributes#USAGE_UNKNOWN}
42304f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * and {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}, and flags are 0. It is recommended to
42404f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * configure the usage (with {@link #setUsage(int)}) or deriving attributes from a legacy
42504f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * stream type (with {@link #setLegacyStreamType(int)}) before calling {@link #build()}
42604f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * to override any default playback behavior in terms of routing and volume management.
427d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
428d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder() {
429d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
430d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
431d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
432d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Constructs a new Builder from a given AudioAttributes
433d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param aa the AudioAttributes object whose data will be reused in the new Builder.
434d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
435d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
436d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder(AudioAttributes aa) {
437d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mUsage = aa.mUsage;
438d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mContentType = aa.mContentType;
439d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags = aa.mFlags;
440d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags = (HashSet<String>) aa.mTags.clone();
441d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
442d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
443d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
444d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Combines all of the attributes that have been set and return a new
445d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * {@link AudioAttributes} object.
446d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return a new {@link AudioAttributes} object
447d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
448d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        @SuppressWarnings("unchecked") // for cloning of mTags
449d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public AudioAttributes build() {
450d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            AudioAttributes aa = new AudioAttributes();
451d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mContentType = mContentType;
452d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mUsage = mUsage;
453701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            aa.mSource = mSource;
454d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mFlags = mFlags;
455d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            aa.mTags = (HashSet<String>) mTags.clone();
456cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            aa.mFormattedTags = TextUtils.join(";", mTags);
457f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            if (mBundle != null) {
458f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                aa.mBundle = new Bundle(mBundle);
459f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            }
460d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return aa;
461d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
462d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
463d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
464d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing what is the intended use of the the audio signal,
465d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * such as alarm or ringtone.
466d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param usage one of {@link AudioAttributes#USAGE_UNKNOWN},
467d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_MEDIA},
468d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION},
469d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_VOICE_COMMUNICATION_SIGNALLING},
470d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ALARM}, {@link AudioAttributes#USAGE_NOTIFICATION},
47189c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_RINGTONE},
472d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_REQUEST},
473d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_INSTANT},
474d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_COMMUNICATION_DELAYED},
475d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_NOTIFICATION_EVENT},
476d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_ACCESSIBILITY},
477d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_NAVIGATION_GUIDANCE},
478d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_ASSISTANCE_SONIFICATION},
479d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#USAGE_GAME}.
480d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
481d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
482d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setUsage(@AttributeUsage int usage) {
483d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (usage) {
484d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_UNKNOWN:
485d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_MEDIA:
486d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION:
487d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_VOICE_COMMUNICATION_SIGNALLING:
488d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ALARM:
489d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION:
49089c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi                case USAGE_NOTIFICATION_RINGTONE:
491d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
492d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
493d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
494d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_NOTIFICATION_EVENT:
495d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_ACCESSIBILITY:
496d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
497d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_ASSISTANCE_SONIFICATION:
498d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case USAGE_GAME:
4998fdb0d4defb6ee2ca8057d3442ead36b408b6c17Jean-Michel Trivi                case USAGE_VIRTUAL_SOURCE:
500d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = usage;
501d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
502d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
503d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = USAGE_UNKNOWN;
504d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
505d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
506d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
507d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
508d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
509d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the attribute describing the content type of the audio signal, such as speech,
510d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * or music.
511d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param contentType the content type values, one of
512d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MOVIE},
513d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_MUSIC},
514d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SONIFICATION},
515d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_SPEECH},
516d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *     {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}.
517d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
518d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
519d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setContentType(@AttributeContentType int contentType) {
520d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch (contentType) {
521d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_UNKNOWN:
522d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MOVIE:
523d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_MUSIC:
524d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SONIFICATION:
525d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case CONTENT_TYPE_SPEECH:
526d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mContentType = contentType;
527d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     break;
528d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
529d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                     mUsage = CONTENT_TYPE_UNKNOWN;
530d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
531d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
532d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
533d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
534d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
535d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Sets the combination of flags.
53626d2fdbba3dab2b46db3c68514cad6f428b88406Jean-Michel Trivi         * @param flags a combination of {@link AudioAttributes#FLAG_AUDIBILITY_ENFORCED},
53726d2fdbba3dab2b46db3c68514cad6f428b88406Jean-Michel Trivi         *    {@link AudioAttributes#FLAG_HW_AV_SYNC}.
538d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
539d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
540d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setFlags(int flags) {
5416894cd38ebb619a0b7e47831b623655c9c0f6e12Jean-Michel Trivi            flags &= AudioAttributes.FLAG_ALL;
542d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mFlags |= flags;
543d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
544d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
545d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
546d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
547b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @hide
548f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         * Adds a Bundle of data
549f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         * @param bundle a non-null Bundle
550f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         * @return the same builder instance
551f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         */
552f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        @SystemApi
553f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        public Builder addBundle(@NonNull Bundle bundle) {
554f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            if (bundle == null) {
555f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                throw new IllegalArgumentException("Illegal null bundle");
556f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            }
557f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            if (mBundle == null) {
558f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                mBundle = new Bundle(bundle);
559f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            } else {
560f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                mBundle.putAll(bundle);
561f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            }
562f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            return this;
563f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        }
564f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi
565f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        /**
566f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi         * @hide
567d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * Add a custom tag stored as a string
568d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param tag
569d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
570d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
571d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder addTag(String tag) {
572d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            mTags.add(tag);
573d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
574d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
575d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
576d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
57704f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * Sets attributes as inferred from the legacy stream types.
57804f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * Use this method when building an {@link AudioAttributes} instance to initialize some of
57904f55a490d0479f73ac5b749eeb7716d9a2d17dbJean-Michel Trivi         * the attributes by information derived from a legacy stream type.
580d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType one of {@link AudioManager#STREAM_VOICE_CALL},
581d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_SYSTEM}, {@link AudioManager#STREAM_RING},
582d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *   {@link AudioManager#STREAM_MUSIC}, {@link AudioManager#STREAM_ALARM},
583d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         *    or {@link AudioManager#STREAM_NOTIFICATION}.
584d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
585d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
586d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setLegacyStreamType(int streamType) {
587d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return setInternalLegacyStreamType(streamType);
588d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
589d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
590d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        /**
591d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @hide
592d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * For internal framework use only, enables building from hidden stream types.
593d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @param streamType
594d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         * @return the same Builder instance.
595d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi         */
596d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        public Builder setInternalLegacyStreamType(int streamType) {
597d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            switch(streamType) {
598d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_VOICE_CALL:
599d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
600d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
601d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM_ENFORCED:
602d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_AUDIBILITY_ENFORCED;
603d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    // intended fall through, attributes in common with STREAM_SYSTEM
604d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_SYSTEM:
605d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
606d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
607d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_RING:
608d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
609d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
610d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_MUSIC:
611d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_MUSIC;
612d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
613d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_ALARM:
614d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
615d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
616d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_NOTIFICATION:
617d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
618d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
619d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_BLUETOOTH_SCO:
620d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
621d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mFlags |= FLAG_SCO;
622d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
623d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_DTMF:
624d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SONIFICATION;
625d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
626d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                case AudioSystem.STREAM_TTS:
627d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    mContentType = CONTENT_TYPE_SPEECH;
628d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                    break;
629d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi                default:
630701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    Log.e(TAG, "Invalid stream type " + streamType + " for AudioAttributes");
631701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            }
632c1601f73b98b004b6210631830d2184255037948Jean-Michel Trivi            mUsage = usageForLegacyStreamType(streamType);
633701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            return this;
634701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        }
635701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
636701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        /**
637701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @hide
638701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * Sets the capture preset.
639701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * Use this audio attributes configuration method when building an {@link AudioRecord}
640701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * instance with {@link AudioRecord#AudioRecord(AudioAttributes, AudioFormat, int)}.
641701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @param preset one of {@link MediaRecorder.AudioSource#DEFAULT},
642701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         *     {@link MediaRecorder.AudioSource#MIC}, {@link MediaRecorder.AudioSource#CAMCORDER},
643a7cc59c3187711d390c5a483d26c463a1bcbd331rago         *     {@link MediaRecorder.AudioSource#VOICE_RECOGNITION},
644a7cc59c3187711d390c5a483d26c463a1bcbd331rago         *     {@link MediaRecorder.AudioSource#VOICE_COMMUNICATION} or
645a7cc59c3187711d390c5a483d26c463a1bcbd331rago         *     {@link MediaRecorder.AudioSource#UNPROCESSED}
646701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @return the same Builder instance.
647701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         */
6481b3541d5eedb332ea01066b4a78a2d06d5304044Jean-Michel Trivi        @SystemApi
649701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        public Builder setCapturePreset(int preset) {
650701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            switch (preset) {
651701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.DEFAULT:
652701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.MIC:
653701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.CAMCORDER:
654701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.VOICE_RECOGNITION:
655701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                case MediaRecorder.AudioSource.VOICE_COMMUNICATION:
656a7cc59c3187711d390c5a483d26c463a1bcbd331rago                case MediaRecorder.AudioSource.UNPROCESSED:
657701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    mSource = preset;
658701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    break;
659701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                default:
660701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                    Log.e(TAG, "Invalid capture preset " + preset + " for AudioAttributes");
661701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            }
662701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            return this;
663701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        }
664701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi
665701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        /**
666701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @hide
667ce4483cb83afb3a42a32ef2cb00cf04d6f9018fdBenson Huang         * Same as {@link #setCapturePreset(int)} but authorizes the use of HOTWORD,
66800a009204e51997249d60eab4f147eff566e2b1fEric Laurent         * REMOTE_SUBMIX and RADIO_TUNER.
669701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @param preset
670701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         * @return the same Builder instance.
671701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi         */
67200a009204e51997249d60eab4f147eff566e2b1fEric Laurent        @SystemApi
673701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        public Builder setInternalCapturePreset(int preset) {
674701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            if ((preset == MediaRecorder.AudioSource.HOTWORD)
675ce4483cb83afb3a42a32ef2cb00cf04d6f9018fdBenson Huang                    || (preset == MediaRecorder.AudioSource.REMOTE_SUBMIX)
67600a009204e51997249d60eab4f147eff566e2b1fEric Laurent                    || (preset == MediaRecorder.AudioSource.RADIO_TUNER)) {
677701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                mSource = preset;
678701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi            } else {
679701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi                setCapturePreset(preset);
680d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            }
681d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi            return this;
682d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        }
683d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    };
684d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
685b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
686b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public int describeContents() {
687b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        return 0;
688b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
689b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
6908df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
6918df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * @hide
6928df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Used to indicate that when parcelling, the tags should be parcelled through the flattened
6938df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * formatted string, not through the array of strings.
6948df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * Keep in sync with frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
6958df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * see definition of kAudioAttributesMarshallTagFlattenTags
6968df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
6978df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    public final static int FLATTEN_TAGS = 0x1;
698f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi
699f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    private final static int ATTR_PARCEL_IS_NULL_BUNDLE = -1977;
700f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi    private final static int ATTR_PARCEL_IS_VALID_BUNDLE = 1980;
701f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi
7028df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    /**
7038df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     * When adding tags for writeToParcel(Parcel, int), add them in the list of flags (| NEW_FLAG)
7048df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi     */
7058df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    private final static int ALL_PARCEL_FLAGS = FLATTEN_TAGS;
706b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    @Override
707b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public void writeToParcel(Parcel dest, int flags) {
708b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mUsage);
709b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mContentType);
710701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        dest.writeInt(mSource);
711b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        dest.writeInt(mFlags);
7128df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        dest.writeInt(flags & ALL_PARCEL_FLAGS);
7138df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if ((flags & FLATTEN_TAGS) == 0) {
7148df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = new String[mTags.size()];
7158df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            mTags.toArray(tagsArray);
7168df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeStringArray(tagsArray);
7178df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else if ((flags & FLATTEN_TAGS) == FLATTEN_TAGS) {
7188df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            dest.writeString(mFormattedTags);
7198df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        }
720f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        if (mBundle == null) {
721f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            dest.writeInt(ATTR_PARCEL_IS_NULL_BUNDLE);
722f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        } else {
723f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            dest.writeInt(ATTR_PARCEL_IS_VALID_BUNDLE);
724f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            dest.writeBundle(mBundle);
725f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        }
726b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
727b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
728b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    private AudioAttributes(Parcel in) {
729b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mUsage = in.readInt();
730b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mContentType = in.readInt();
731701d6ff12f36bf5e9de0dafdaced06744fd411ebJean-Michel Trivi        mSource = in.readInt();
732b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mFlags = in.readInt();
7338df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        boolean hasFlattenedTags = ((in.readInt() & FLATTEN_TAGS) == FLATTEN_TAGS);
734b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        mTags = new HashSet<String>();
7358df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        if (hasFlattenedTags) {
736cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mFormattedTags = new String(in.readString());
737cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mTags.add(mFormattedTags);
7388df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        } else {
7398df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            String[] tagsArray = in.readStringArray();
7408df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            for (int i = tagsArray.length - 1 ; i >= 0 ; i--) {
7418df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi                mTags.add(tagsArray[i]);
7428df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi            }
743cc58c76cf038343020331060d19ae39308f2a5cfJean-Michel Trivi            mFormattedTags = TextUtils.join(";", mTags);
744b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
745f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        switch (in.readInt()) {
746f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            case ATTR_PARCEL_IS_NULL_BUNDLE:
747f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                mBundle = null;
748f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                break;
749f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            case ATTR_PARCEL_IS_VALID_BUNDLE:
750f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                mBundle = new Bundle(in.readBundle());
751f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                break;
752f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi            default:
753f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                Log.e(TAG, "Illegal value unmarshalling AudioAttributes, can't initialize bundle");
754f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        }
755b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    }
756b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
757b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    public static final Parcelable.Creator<AudioAttributes> CREATOR
758b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            = new Parcelable.Creator<AudioAttributes>() {
759b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        /**
760b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * Rebuilds an AudioAttributes previously stored with writeToParcel().
761b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @param p Parcel object to read the AudioAttributes from
762b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         * @return a new AudioAttributes created from the data in the parcel
763b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi         */
764b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes createFromParcel(Parcel p) {
765b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes(p);
766b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
767b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        public AudioAttributes[] newArray(int size) {
768b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi            return new AudioAttributes[size];
769b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi        }
770b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi    };
771b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
772e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    @Override
773e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    public boolean equals(Object o) {
774e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        if (this == o) return true;
775e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        if (o == null || getClass() != o.getClass()) return false;
776e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
777e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        AudioAttributes that = (AudioAttributes) o;
778e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
779e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi        return ((mContentType == that.mContentType)
780e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mFlags == that.mFlags)
781e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mSource == that.mSource)
782e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mUsage == that.mUsage)
783e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                //mFormattedTags is never null due to assignment in Builder or unmarshalling
784e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi                && (mFormattedTags.equals(that.mFormattedTags)));
785e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    }
786e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
787e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    @Override
788e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    public int hashCode() {
789f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi        return Objects.hash(mContentType, mFlags, mSource, mUsage, mFormattedTags, mBundle);
790e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi    }
791e9c19a5a8e020b11935511b37f51f9007994f4b6Jean-Michel Trivi
792a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    @Override
793a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String toString () {
794a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        return new String("AudioAttributes:"
795a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " usage=" + mUsage
796a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " content=" + mContentType
797a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                + " flags=0x" + Integer.toHexString(mFlags).toUpperCase()
798f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                + " tags=" + mFormattedTags
799f82f746903729314e09ebe0e05b0c97d33a876c7Jean-Michel Trivi                + " bundle=" + (mBundle == null ? "null" : mBundle.toString()));
800a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
801a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi
802998ff75484f1eecb6ebef150de4ac8456d22e864Jean-Michel Trivi    /** @hide */
803a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    public String usageToString() {
8047b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        return usageToString(mUsage);
8057b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
8067b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
8077b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
8087b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static String usageToString(int usage) {
8097b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(usage) {
810a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_UNKNOWN:
811a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_UNKNOWN");
812a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_MEDIA:
813a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_MEDIA");
814a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
815a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_VOICE_COMMUNICATION");
816a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
81745228bf3e0c0c99be912dc9c8c663f4e8ce96233Zach Johnson                return new String("USAGE_VOICE_COMMUNICATION_SIGNALLING");
818a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ALARM:
819a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ALARM");
820a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION:
821a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION");
82289c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi            case USAGE_NOTIFICATION_RINGTONE:
82345228bf3e0c0c99be912dc9c8c663f4e8ce96233Zach Johnson                return new String("USAGE_NOTIFICATION_RINGTONE");
824a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
82545228bf3e0c0c99be912dc9c8c663f4e8ce96233Zach Johnson                return new String("USAGE_NOTIFICATION_COMMUNICATION_REQUEST");
826a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
827a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_INSTANT");
828a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
829a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_COMMUNICATION_DELAYED");
830a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
831a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_NOTIFICATION_EVENT");
832a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
833a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_ACCESSIBILITY");
834a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
835a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_NAVIGATION_GUIDANCE");
836a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
837a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_ASSISTANCE_SONIFICATION");
838a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            case USAGE_GAME:
839a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi                return new String("USAGE_GAME");
840a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi            default:
8417b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return new String("unknown usage " + usage);
8427b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        }
8437b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    }
8447b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock
8457b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    /** @hide */
8467b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock    public static int usageForLegacyStreamType(int streamType) {
8477b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock        switch(streamType) {
8487b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_VOICE_CALL:
8497b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
8507b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM_ENFORCED:
8517b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_SYSTEM:
8527b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_SONIFICATION;
8537b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_RING:
85489c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi                return USAGE_NOTIFICATION_RINGTONE;
8557b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_MUSIC:
8567b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_MEDIA;
8577b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_ALARM:
8587b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ALARM;
8597b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_NOTIFICATION:
8607b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_NOTIFICATION;
8617b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_BLUETOOTH_SCO:
8627b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION;
8637b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_DTMF:
8647b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_VOICE_COMMUNICATION_SIGNALLING;
8657b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            case AudioSystem.STREAM_TTS:
8667b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_ASSISTANCE_ACCESSIBILITY;
8677b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock            default:
8687b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock                return USAGE_UNKNOWN;
869a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi        }
870a8b6bd88cfb010c9e9aa1339e504fd593919e1e0Jean-Michel Trivi    }
871d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    /**
872d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * @hide
873d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * CANDIDATE FOR PUBLIC (or at least SYSTEM) API
874d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * Returns the stream type matching the given attributes for volume control.
875d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * Use this method to derive the stream type needed to configure the volume
876d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * control slider in an {@link Activity} with {@link Activity#setVolumeControlStream(int)}.
877d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * <BR>Do not use this method to set the stream type on an audio player object
878d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * (e.g. {@link AudioTrack}, {@link MediaPlayer}), use <code>AudioAttributes</code> instead.
879d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * @param aa non-null AudioAttributes.
880d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     * @return a valid stream type for <code>Activity</code> or stream volume control that matches
881d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     *     the attributes, or {@link AudioManager#USE_DEFAULT_STREAM_TYPE} if there isn't a direct
882d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     *     match. Note that <code>USE_DEFAULT_STREAM_TYPE</code> is not a valid value
883d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     *     for {@link AudioManager#setStreamVolume(int, int, int)}.
884d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi     */
885d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    public static int getVolumeControlStream(@NonNull AudioAttributes aa) {
886d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi        if (aa == null) {
887d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi            throw new IllegalArgumentException("Invalid null audio attributes");
888d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi        }
889d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi        return toVolumeStreamType(true /*fromGetVolumeControlStream*/, aa);
890d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    }
891b45c27303339e5baa9fe40e4f8ecd211e382982fJean-Michel Trivi
8923d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi    /**
8933d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * @hide
8943d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * Only use to get which stream type should be used for volume control, NOT for audio playback
8953d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * (all audio playback APIs are supposed to take AudioAttributes as input parameters)
8963d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * @param aa non-null AudioAttributes.
8973d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     * @return a valid stream type for volume control that matches the attributes.
8983d22bf04e399123e07ae9c2075784b63c8678d04Jean-Michel Trivi     */
899d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    public static int toLegacyStreamType(@NonNull AudioAttributes aa) {
900d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi        return toVolumeStreamType(false /*fromGetVolumeControlStream*/, aa);
901d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    }
902d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi
903d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi    private static int toVolumeStreamType(boolean fromGetVolumeControlStream, AudioAttributes aa) {
90409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // flags to stream type mapping
90509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_AUDIBILITY_ENFORCED) == FLAG_AUDIBILITY_ENFORCED) {
906d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi            return fromGetVolumeControlStream ?
907d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                    AudioSystem.STREAM_SYSTEM : AudioSystem.STREAM_SYSTEM_ENFORCED;
90809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
90909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        if ((aa.getFlags() & FLAG_SCO) == FLAG_SCO) {
910d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi            return fromGetVolumeControlStream ?
911d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                    AudioSystem.STREAM_VOICE_CALL : AudioSystem.STREAM_BLUETOOTH_SCO;
91209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
91309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
91409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        // usage to stream type mapping
91509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        switch (aa.getUsage()) {
91609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_MEDIA:
91709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_GAME:
91809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_ACCESSIBILITY:
91909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
92009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_MUSIC;
92109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ASSISTANCE_SONIFICATION:
92209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_SYSTEM;
92309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION:
92409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_VOICE_CALL;
92509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_VOICE_COMMUNICATION_SIGNALLING:
926d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                return fromGetVolumeControlStream ?
927d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                        AudioSystem.STREAM_VOICE_CALL : AudioSystem.STREAM_DTMF;
92809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_ALARM:
92909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_ALARM;
93089c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi            case USAGE_NOTIFICATION_RINGTONE:
93109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_RING;
93209818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION:
93309818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
93409818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
93509818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
93609818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_NOTIFICATION_EVENT:
93709818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi                return AudioSystem.STREAM_NOTIFICATION;
93809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            case USAGE_UNKNOWN:
939d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                return fromGetVolumeControlStream ?
940d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                        AudioManager.USE_DEFAULT_STREAM_TYPE : AudioSystem.STREAM_MUSIC;
94109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi            default:
942d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                if (fromGetVolumeControlStream) {
943d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                    throw new IllegalArgumentException("Unknown usage value " + aa.getUsage() +
944d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                            " in audio attributes");
945d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                } else {
946d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                    return AudioSystem.STREAM_MUSIC;
947d1d5a0a0801a2d73becb7424f2608f42816a97e8Jean-Michel Trivi                }
94809818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi        }
94909818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    }
95009818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi
95109818c15500a04eac6b9998144c1ca54b8a54109Jean-Michel Trivi    /** @hide */
952d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
953d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_UNKNOWN,
954d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_MEDIA,
955d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION,
956d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_VOICE_COMMUNICATION_SIGNALLING,
957d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ALARM,
958d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION,
95989c3b29a9bfa0ae9858b913bc1ab6604c4613a15Jean-Michel Trivi        USAGE_NOTIFICATION_RINGTONE,
960d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
961d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
962d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
963d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_NOTIFICATION_EVENT,
964d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_ACCESSIBILITY,
965d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
966d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_ASSISTANCE_SONIFICATION,
967d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        USAGE_GAME
968d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
969d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
970d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeUsage {}
971d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi
972d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    /** @hide */
973d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @IntDef({
974d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_UNKNOWN,
975d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SPEECH,
976d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MUSIC,
977d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_MOVIE,
978d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi        CONTENT_TYPE_SONIFICATION
979d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    })
980d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    @Retention(RetentionPolicy.SOURCE)
981d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi    public @interface AttributeContentType {}
982d60e875a97867c1a6ed84325bb70f7ffe8ce4521Jean-Michel Trivi}
983