1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.audiopolicytest;
18 
19 import static android.media.audiopolicy.Flags.FLAG_ENABLE_FADE_MANAGER_CONFIGURATION;
20 
21 import static org.junit.Assert.assertThrows;
22 
23 import android.media.AudioAttributes;
24 import android.media.AudioPlaybackConfiguration;
25 import android.media.FadeManagerConfiguration;
26 import android.media.VolumeShaper;
27 import android.os.Parcel;
28 import android.platform.test.annotations.Presubmit;
29 import android.platform.test.annotations.RequiresFlagsEnabled;
30 
31 import androidx.test.ext.junit.runners.AndroidJUnit4;
32 
33 import com.google.common.truth.Expect;
34 
35 import org.junit.Before;
36 import org.junit.Rule;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.List;
43 
44 @Presubmit
45 @RunWith(AndroidJUnit4.class)
46 @RequiresFlagsEnabled(FLAG_ENABLE_FADE_MANAGER_CONFIGURATION)
47 public final class FadeManagerConfigurationUnitTest {
48     private static final long DEFAULT_FADE_OUT_DURATION_MS = 2_000;
49     private static final long DEFAULT_FADE_IN_DURATION_MS = 1_000;
50     private static final long TEST_FADE_OUT_DURATION_MS = 1_500;
51     private static final long TEST_FADE_IN_DURATION_MS = 750;
52     private static final int TEST_INVALID_USAGE = -10;
53     private static final int TEST_INVALID_CONTENT_TYPE = 100;
54     private static final int TEST_INVALID_FADE_STATE = 100;
55     private static final long TEST_INVALID_DURATION = -10;
56     private static final int TEST_UID_1 = 1010001;
57     private static final int TEST_UID_2 = 1000;
58     private static final int TEST_PARCEL_FLAGS = 0;
59     private static final AudioAttributes TEST_MEDIA_AUDIO_ATTRIBUTE =
60             createAudioAttributesForUsage(AudioAttributes.USAGE_MEDIA);
61     private static final AudioAttributes TEST_GAME_AUDIO_ATTRIBUTE =
62             createAudioAttributesForUsage(AudioAttributes.USAGE_GAME);
63     private static final AudioAttributes TEST_NAVIGATION_AUDIO_ATTRIBUTE =
64             new AudioAttributes.Builder().setUsage(
65                     AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
66                     .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
67                     .build();
68     private static final AudioAttributes TEST_ASSISTANT_AUDIO_ATTRIBUTE =
69             new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ASSISTANT)
70                     .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).build();
71     private static final List<Integer> TEST_FADEABLE_USAGES = Arrays.asList(
72             AudioAttributes.USAGE_MEDIA,
73             AudioAttributes.USAGE_GAME
74     );
75     private static final List<Integer> TEST_UNFADEABLE_CONTENT_TYPES = Arrays.asList(
76             AudioAttributes.CONTENT_TYPE_SPEECH
77     );
78 
79     private static final List<Integer> TEST_UNFADEABLE_PLAYER_TYPES = Arrays.asList(
80             AudioPlaybackConfiguration.PLAYER_TYPE_AAUDIO,
81             AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL
82     );
83     private static final VolumeShaper.Configuration TEST_DEFAULT_FADE_OUT_VOLUME_SHAPER_CONFIG =
84             new VolumeShaper.Configuration.Builder()
85                     .setId(FadeManagerConfiguration.VOLUME_SHAPER_SYSTEM_FADE_ID)
86                     .setCurve(/* times= */new float[]{0.f, 0.25f, 1.0f},
87                             /* volumes= */new float[]{1.f, 0.65f, 0.0f})
88                     .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
89                     .setDuration(DEFAULT_FADE_OUT_DURATION_MS)
90                     .build();
91     private static final VolumeShaper.Configuration TEST_DEFAULT_FADE_IN_VOLUME_SHAPER_CONFIG =
92             new VolumeShaper.Configuration.Builder()
93                     .setId(FadeManagerConfiguration.VOLUME_SHAPER_SYSTEM_FADE_ID)
94                     .setCurve(/* times= */new float[]{0.f, 0.50f, 1.0f},
95                             /* volumes= */new float[]{0.f, 0.30f, 1.0f})
96                     .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
97                     .setDuration(DEFAULT_FADE_IN_DURATION_MS)
98                     .build();
99     private static final VolumeShaper.Configuration TEST_FADE_OUT_VOLUME_SHAPER_CONFIG =
100             new VolumeShaper.Configuration.Builder()
101                     .setId(FadeManagerConfiguration.VOLUME_SHAPER_SYSTEM_FADE_ID)
102                     .setCurve(/* times= */new float[]{0.f, 0.25f, 1.0f},
103                             /* volumes= */new float[]{1.f, 0.65f, 0.0f})
104                     .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
105                     .setDuration(TEST_FADE_OUT_DURATION_MS)
106                     .build();
107     private static final VolumeShaper.Configuration TEST_FADE_IN_VOLUME_SHAPER_CONFIG =
108             new VolumeShaper.Configuration.Builder()
109                     .setId(FadeManagerConfiguration.VOLUME_SHAPER_SYSTEM_FADE_ID)
110                     .setCurve(/* times= */new float[]{0.f, 0.50f, 1.0f},
111                             /* volumes= */new float[]{0.f, 0.30f, 1.0f})
112                     .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
113                     .setDuration(TEST_FADE_IN_DURATION_MS)
114                     .build();
115 
116     private FadeManagerConfiguration mFmc;
117 
118     @Rule
119     public final Expect expect = Expect.create();
120 
121     @Before
setUp()122     public void setUp() {
123         mFmc = new FadeManagerConfiguration.Builder().build();
124     }
125 
126 
127     @Test
build()128     public void build() {
129         expect.withMessage("Fade state for default builder")
130                 .that(mFmc.getFadeState())
131                 .isEqualTo(FadeManagerConfiguration.FADE_STATE_ENABLED_DEFAULT);
132         expect.withMessage("Fadeable usages for default builder")
133                 .that(mFmc.getFadeableUsages())
134                 .containsExactlyElementsIn(TEST_FADEABLE_USAGES);
135         expect.withMessage("Unfadeable content types usages for default builder")
136                 .that(mFmc.getUnfadeableContentTypes())
137                 .containsExactlyElementsIn(TEST_UNFADEABLE_CONTENT_TYPES);
138         expect.withMessage("Unfadeable player types for default builder")
139                 .that(mFmc.getUnfadeablePlayerTypes())
140                 .containsExactlyElementsIn(TEST_UNFADEABLE_PLAYER_TYPES);
141         expect.withMessage("Unfadeable uids for default builder")
142                 .that(mFmc.getUnfadeableUids()).isEmpty();
143         expect.withMessage("Unfadeable audio attributes for default builder")
144                 .that(mFmc.getUnfadeableAudioAttributes()).isEmpty();
145         expect.withMessage("Fade out volume shaper config for media usage")
146                 .that(mFmc.getFadeOutVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
147                 .isEqualTo(TEST_DEFAULT_FADE_OUT_VOLUME_SHAPER_CONFIG);
148         expect.withMessage("Fade out duration for game usage")
149                 .that(mFmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_GAME))
150                 .isEqualTo(DEFAULT_FADE_OUT_DURATION_MS);
151         expect.withMessage("Fade in volume shaper config for media uasge")
152                 .that(mFmc.getFadeInVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
153                 .isEqualTo(TEST_DEFAULT_FADE_IN_VOLUME_SHAPER_CONFIG);
154         expect.withMessage("Fade in duration for game audio usage")
155                 .that(mFmc.getFadeInDurationForUsage(AudioAttributes.USAGE_GAME))
156                 .isEqualTo(DEFAULT_FADE_IN_DURATION_MS);
157     }
158 
159     @Test
build_withFadeDurations_succeeds()160     public void build_withFadeDurations_succeeds() {
161         FadeManagerConfiguration fmc = new FadeManagerConfiguration
162                 .Builder(TEST_FADE_OUT_DURATION_MS, TEST_FADE_IN_DURATION_MS).build();
163 
164         expect.withMessage("Fade state for builder with duration").that(fmc.getFadeState())
165                 .isEqualTo(FadeManagerConfiguration.FADE_STATE_ENABLED_DEFAULT);
166         expect.withMessage("Fadeable usages for builder with duration")
167                 .that(fmc.getFadeableUsages())
168                 .containsExactlyElementsIn(TEST_FADEABLE_USAGES);
169         expect.withMessage("Unfadeable content types usages for builder with duration")
170                 .that(fmc.getUnfadeableContentTypes())
171                 .containsExactlyElementsIn(TEST_UNFADEABLE_CONTENT_TYPES);
172         expect.withMessage("Unfadeable player types for builder with duration")
173                 .that(fmc.getUnfadeablePlayerTypes())
174                 .containsExactlyElementsIn(TEST_UNFADEABLE_PLAYER_TYPES);
175         expect.withMessage("Unfadeable uids for builder with duration")
176                 .that(fmc.getUnfadeableUids()).isEmpty();
177         expect.withMessage("Unfadeable audio attributes for builder with duration")
178                 .that(fmc.getUnfadeableAudioAttributes()).isEmpty();
179         expect.withMessage("Fade out volume shaper config for media usage")
180                 .that(fmc.getFadeOutVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
181                 .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
182         expect.withMessage("Fade out duration for game usage")
183                 .that(fmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_GAME))
184                 .isEqualTo(TEST_FADE_OUT_DURATION_MS);
185         expect.withMessage("Fade in volume shaper config for media audio attributes")
186                 .that(fmc.getFadeInVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
187                 .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
188         expect.withMessage("Fade in duration for game audio attributes")
189                 .that(fmc.getFadeInDurationForUsage(AudioAttributes.USAGE_GAME))
190                 .isEqualTo(TEST_FADE_IN_DURATION_MS);
191 
192     }
193 
194     @Test
build_withFadeManagerConfiguration_succeeds()195     public void build_withFadeManagerConfiguration_succeeds() {
196         FadeManagerConfiguration fmcObj = new FadeManagerConfiguration
197                 .Builder(TEST_FADE_OUT_DURATION_MS, TEST_FADE_IN_DURATION_MS).build();
198 
199         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder(fmcObj).build();
200 
201         expect.withMessage("Fade state for copy builder").that(fmc.getFadeState())
202                 .isEqualTo(fmcObj.getFadeState());
203         expect.withMessage("Fadeable usages for copy builder")
204                 .that(fmc.getFadeableUsages())
205                 .containsExactlyElementsIn(fmcObj.getFadeableUsages());
206         expect.withMessage("Unfadeable content types usages for copy builder")
207                 .that(fmc.getUnfadeableContentTypes())
208                 .containsExactlyElementsIn(fmcObj.getUnfadeableContentTypes());
209         expect.withMessage("Unfadeable player types for copy builder")
210                 .that(fmc.getUnfadeablePlayerTypes())
211                 .containsExactlyElementsIn(fmcObj.getUnfadeablePlayerTypes());
212         expect.withMessage("Unfadeable uids for copy builder")
213                 .that(fmc.getUnfadeableUids()).isEqualTo(fmcObj.getUnfadeableUids());
214         expect.withMessage("Unfadeable audio attributes for copy builder")
215                 .that(fmc.getUnfadeableAudioAttributes())
216                 .isEqualTo(fmcObj.getUnfadeableAudioAttributes());
217         expect.withMessage("Fade out volume shaper config for media usage")
218                 .that(fmc.getFadeOutVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
219                 .isEqualTo(fmcObj.getFadeOutVolumeShaperConfigForUsage(
220                         AudioAttributes.USAGE_MEDIA));
221         expect.withMessage("Fade out volume shaper config for game usage")
222                 .that(fmc.getFadeOutVolumeShaperConfigForUsage(AudioAttributes.USAGE_GAME))
223                 .isEqualTo(fmcObj.getFadeOutVolumeShaperConfigForUsage(
224                         AudioAttributes.USAGE_GAME));
225         expect.withMessage("Fade in volume shaper config for media usage")
226                 .that(fmc.getFadeInVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
227                 .isEqualTo(fmcObj.getFadeInVolumeShaperConfigForUsage(
228                         AudioAttributes.USAGE_MEDIA));
229         expect.withMessage("Fade in volume shaper config for game usage")
230                 .that(fmc.getFadeInVolumeShaperConfigForUsage(AudioAttributes.USAGE_GAME))
231                 .isEqualTo(fmcObj.getFadeInVolumeShaperConfigForUsage(
232                         AudioAttributes.USAGE_GAME));
233         expect.withMessage("Fade out volume shaper config for media audio attributes")
234                 .that(fmc.getFadeOutVolumeShaperConfigForAudioAttributes(
235                         TEST_MEDIA_AUDIO_ATTRIBUTE))
236                 .isEqualTo(fmcObj.getFadeOutVolumeShaperConfigForAudioAttributes(
237                         TEST_MEDIA_AUDIO_ATTRIBUTE));
238         expect.withMessage("Fade out duration for game audio attributes")
239                 .that(fmc.getFadeOutDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE))
240                 .isEqualTo(fmcObj.getFadeOutDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE));
241         expect.withMessage("Fade in volume shaper config for media audio attributes")
242                 .that(fmc.getFadeInVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE))
243                 .isEqualTo(fmcObj.getFadeInVolumeShaperConfigForAudioAttributes(
244                         TEST_MEDIA_AUDIO_ATTRIBUTE));
245         expect.withMessage("Fade in duration for game audio attributes")
246                 .that(fmc.getFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE))
247                 .isEqualTo(fmcObj.getFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE));
248     }
249 
250     @Test
build_withCopyConstructor_doesnotChangeOriginal()251     public void build_withCopyConstructor_doesnotChangeOriginal() {
252         FadeManagerConfiguration copyConstructedFmc = new FadeManagerConfiguration.Builder(mFmc)
253                 .setFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_OUT_DURATION_MS)
254                 .setFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_IN_DURATION_MS)
255                 .build();
256 
257         expect.withMessage("Fade out duration for media usage of default constructor")
258                 .that(mFmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA))
259                 .isEqualTo(DEFAULT_FADE_OUT_DURATION_MS);
260         expect.withMessage("Fade out duration for media usage of default constructor")
261                 .that(mFmc.getFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA))
262                 .isEqualTo(DEFAULT_FADE_IN_DURATION_MS);
263         expect.withMessage("Fade out duration for media usage of copy constructor")
264                 .that(copyConstructedFmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA))
265                 .isEqualTo(TEST_FADE_OUT_DURATION_MS);
266         expect.withMessage("Fade out duration for media usage of copy constructor")
267                 .that(copyConstructedFmc.getFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA))
268                 .isEqualTo(TEST_FADE_IN_DURATION_MS);
269     }
270 
271     @Test
build_withCopyConstructor_equals()272     public void build_withCopyConstructor_equals() {
273         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
274                 .setFadeableUsages(List.of(AudioAttributes.USAGE_MEDIA,
275                         AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
276                         AudioAttributes.USAGE_ASSISTANT,
277                         AudioAttributes.USAGE_EMERGENCY))
278                 .setFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_OUT_DURATION_MS)
279                 .setFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_IN_DURATION_MS)
280                 .build();
281 
282         FadeManagerConfiguration copyConstructedFmc =
283                 new FadeManagerConfiguration.Builder(fmc).build();
284 
285         expect.withMessage("Fade manager config constructed using copy constructor").that(fmc)
286                 .isEqualTo(copyConstructedFmc);
287     }
288 
289     @Test
testGetDefaultFadeOutDuration()290     public void testGetDefaultFadeOutDuration() {
291         expect.withMessage("Default fade out duration")
292                 .that(FadeManagerConfiguration.getDefaultFadeOutDurationMillis())
293                 .isEqualTo(DEFAULT_FADE_OUT_DURATION_MS);
294     }
295 
296     @Test
testGetDefaultFadeInDuration()297     public void testGetDefaultFadeInDuration() {
298         expect.withMessage("Default fade in duration")
299                 .that(FadeManagerConfiguration.getDefaultFadeInDurationMillis())
300                 .isEqualTo(DEFAULT_FADE_IN_DURATION_MS);
301     }
302 
303     @Test
testSetFadeState_toDisable()304     public void testSetFadeState_toDisable() {
305         final int fadeState = FadeManagerConfiguration.FADE_STATE_DISABLED;
306         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
307                 .setFadeState(fadeState).build();
308 
309         expect.withMessage("Fade state when disabled").that(fmc.getFadeState())
310                 .isEqualTo(fadeState);
311     }
312 
313     @Test
testSetFadeState_toInvalid_fails()314     public void testSetFadeState_toInvalid_fails() {
315         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
316                 new FadeManagerConfiguration.Builder()
317                         .setFadeState(TEST_INVALID_FADE_STATE).build()
318         );
319 
320         expect.withMessage("Invalid fade state exception").that(thrown)
321                 .hasMessageThat().contains("Unknown fade state");
322     }
323 
324     @Test
testSetFadeVolShaperConfig()325     public void testSetFadeVolShaperConfig() {
326         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
327                 .setFadeOutVolumeShaperConfigForAudioAttributes(TEST_ASSISTANT_AUDIO_ATTRIBUTE,
328                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
329                 .setFadeInVolumeShaperConfigForAudioAttributes(TEST_ASSISTANT_AUDIO_ATTRIBUTE,
330                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build();
331 
332         expect.withMessage("Fade out volume shaper config set for assistant audio attributes")
333                 .that(fmc.getFadeOutVolumeShaperConfigForAudioAttributes(
334                         TEST_ASSISTANT_AUDIO_ATTRIBUTE))
335                 .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
336         expect.withMessage("Fade in volume shaper config set for assistant audio attributes")
337                 .that(fmc.getFadeInVolumeShaperConfigForAudioAttributes(
338                         TEST_ASSISTANT_AUDIO_ATTRIBUTE))
339                 .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
340     }
341 
342     @Test
testSetFadeOutVolShaperConfig_withNullAudioAttributes_fails()343     public void testSetFadeOutVolShaperConfig_withNullAudioAttributes_fails() {
344         NullPointerException thrown = assertThrows(NullPointerException.class, () ->
345                 new FadeManagerConfiguration.Builder()
346                         .setFadeOutVolumeShaperConfigForAudioAttributes(/* audioAttributes= */ null,
347                                 TEST_FADE_OUT_VOLUME_SHAPER_CONFIG).build()
348         );
349 
350         expect.withMessage("Null audio attributes for fade out exception")
351                 .that(thrown).hasMessageThat().contains("cannot be null");
352     }
353 
354     @Test
testSetFadeOutVolShaperConfig_withNullVolumeShaper_getsNull()355     public void testSetFadeOutVolShaperConfig_withNullVolumeShaper_getsNull() {
356         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder(mFmc)
357                 .setFadeOutVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE,
358                         /* VolumeShaper.Configuration= */ null)
359                 .setFadeInVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE,
360                         /* VolumeShaper.Configuration= */ null)
361                 .clearFadeableUsages().addFadeableUsage(AudioAttributes.USAGE_MEDIA).build();
362 
363         expect.withMessage("Fade out volume shaper config set with null value")
364                 .that(fmc.getFadeOutVolumeShaperConfigForAudioAttributes(
365                         TEST_MEDIA_AUDIO_ATTRIBUTE)).isNull();
366     }
367 
368     @Test
testSetFadeInVolShaperConfig_withNullAudioAttributes_fails()369     public void testSetFadeInVolShaperConfig_withNullAudioAttributes_fails() {
370         NullPointerException thrown = assertThrows(NullPointerException.class, () ->
371                 new FadeManagerConfiguration.Builder()
372                         .setFadeInVolumeShaperConfigForAudioAttributes(/* audioAttributes= */ null,
373                                 TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build()
374         );
375 
376         expect.withMessage("Null audio attributes for fade in exception")
377                 .that(thrown).hasMessageThat().contains("cannot be null");
378     }
379 
380     @Test
testSetFadeDuration()381     public void testSetFadeDuration() {
382         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
383                 .setFadeOutDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE,
384                         TEST_FADE_OUT_DURATION_MS)
385                 .setFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE,
386                         TEST_FADE_IN_DURATION_MS).build();
387 
388         expect.withMessage("Fade out duration set for audio attributes")
389                 .that(fmc.getFadeOutDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE))
390                 .isEqualTo(TEST_FADE_OUT_DURATION_MS);
391         expect.withMessage("Fade in duration set for audio attributes")
392                 .that(fmc.getFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE))
393                 .isEqualTo(TEST_FADE_IN_DURATION_MS);
394     }
395 
396     @Test
testSetFadeOutDuration_withNullAudioAttributes_fails()397     public void testSetFadeOutDuration_withNullAudioAttributes_fails() {
398         NullPointerException thrown = assertThrows(NullPointerException.class, () ->
399                 new FadeManagerConfiguration.Builder().setFadeOutDurationForAudioAttributes(
400                         /* audioAttributes= */ null, TEST_FADE_OUT_DURATION_MS).build()
401         );
402 
403         expect.withMessage("Null audio attributes for fade out duration exception").that(thrown)
404                 .hasMessageThat().contains("cannot be null");
405     }
406 
407     @Test
testSetFadeOutDuration_withInvalidDuration_fails()408     public void testSetFadeOutDuration_withInvalidDuration_fails() {
409         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
410                 new FadeManagerConfiguration.Builder().setFadeOutDurationForAudioAttributes(
411                         TEST_NAVIGATION_AUDIO_ATTRIBUTE, TEST_INVALID_DURATION).build()
412         );
413 
414         expect.withMessage("Invalid duration for fade out exception").that(thrown)
415                 .hasMessageThat().contains("not positive");
416     }
417 
418     @Test
testSetFadeInDuration_withNullAudioAttributes_fails()419     public void testSetFadeInDuration_withNullAudioAttributes_fails() {
420         NullPointerException thrown = assertThrows(NullPointerException.class, () ->
421                 new FadeManagerConfiguration.Builder().setFadeInDurationForAudioAttributes(
422                         /* audioAttributes= */ null, TEST_FADE_IN_DURATION_MS).build()
423         );
424 
425         expect.withMessage("Null audio attributes for fade in duration exception").that(thrown)
426                 .hasMessageThat().contains("cannot be null");
427     }
428 
429     @Test
testSetFadeInDuration_withInvalidDuration_fails()430     public void testSetFadeInDuration_withInvalidDuration_fails() {
431         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
432                 new FadeManagerConfiguration.Builder().setFadeInDurationForAudioAttributes(
433                         TEST_NAVIGATION_AUDIO_ATTRIBUTE, TEST_INVALID_DURATION).build()
434         );
435 
436         expect.withMessage("Invalid duration for fade in exception").that(thrown)
437                 .hasMessageThat().contains("not positive");
438     }
439 
440     @Test
testSetFadeableUsages()441     public void testSetFadeableUsages() {
442         final List<Integer> fadeableUsages = List.of(
443                 AudioAttributes.USAGE_VOICE_COMMUNICATION,
444                 AudioAttributes.USAGE_ALARM,
445                 AudioAttributes.USAGE_ASSISTANT
446                 );
447         AudioAttributes aaForVoiceComm = createAudioAttributesForUsage(
448                 AudioAttributes.USAGE_VOICE_COMMUNICATION);
449         AudioAttributes aaForAlarm = createAudioAttributesForUsage(AudioAttributes.USAGE_ALARM);
450         AudioAttributes aaForAssistant = createAudioAttributesForUsage(
451                 AudioAttributes.USAGE_ASSISTANT);
452 
453 
454         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
455                 .setFadeableUsages(fadeableUsages)
456                 .setFadeOutVolumeShaperConfigForAudioAttributes(aaForVoiceComm,
457                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
458                 .setFadeInVolumeShaperConfigForAudioAttributes(aaForVoiceComm,
459                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
460                 .setFadeOutVolumeShaperConfigForAudioAttributes(aaForAlarm,
461                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
462                 .setFadeInVolumeShaperConfigForAudioAttributes(aaForAlarm,
463                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
464                 .setFadeOutVolumeShaperConfigForAudioAttributes(aaForAssistant,
465                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
466                 .setFadeInVolumeShaperConfigForAudioAttributes(aaForAssistant,
467                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build();
468 
469         expect.withMessage("Fadeable usages")
470                 .that(fmc.getFadeableUsages()).isEqualTo(fadeableUsages);
471     }
472 
473     @Test
testSetFadeableUsages_withInvalidUsage_fails()474     public void testSetFadeableUsages_withInvalidUsage_fails() {
475         final List<Integer> fadeableUsages = List.of(
476                 AudioAttributes.USAGE_VOICE_COMMUNICATION,
477                 TEST_INVALID_USAGE,
478                 AudioAttributes.USAGE_ANNOUNCEMENT
479         );
480 
481         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
482                 new FadeManagerConfiguration.Builder().setFadeableUsages(fadeableUsages).build()
483         );
484 
485         expect.withMessage("Fadeable usages set to invalid usage").that(thrown).hasMessageThat()
486                 .contains("Invalid usage");
487     }
488 
489     @Test
testSetFadeableUsages_withNullUsages_fails()490     public void testSetFadeableUsages_withNullUsages_fails() {
491         NullPointerException thrown = assertThrows(NullPointerException.class, () ->
492                 new FadeManagerConfiguration.Builder().setFadeableUsages(/* usages= */ null)
493                         .build()
494         );
495 
496         expect.withMessage("Fadeable usages set to null list").that(thrown).hasMessageThat()
497                 .contains("cannot be null");
498     }
499 
500     @Test
testSetFadeableUsages_withEmptyListClears_addsNewUsage()501     public void testSetFadeableUsages_withEmptyListClears_addsNewUsage() {
502         final List<Integer> fadeableUsages = List.of(
503                 AudioAttributes.USAGE_VOICE_COMMUNICATION,
504                 AudioAttributes.USAGE_ALARM,
505                 AudioAttributes.USAGE_ASSISTANT
506         );
507         FadeManagerConfiguration.Builder fmcBuilder = new FadeManagerConfiguration.Builder()
508                 .setFadeableUsages(fadeableUsages);
509 
510         fmcBuilder.setFadeableUsages(List.of());
511 
512         FadeManagerConfiguration fmc = fmcBuilder
513                 .addFadeableUsage(AudioAttributes.USAGE_MEDIA)
514                 .setFadeOutVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE,
515                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
516                 .setFadeInVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE,
517                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build();
518         expect.withMessage("Fadeable usages set to empty list")
519                 .that(fmc.getFadeableUsages()).isEqualTo(List.of(AudioAttributes.USAGE_MEDIA));
520     }
521 
522 
523     @Test
testAddFadeableUsage()524     public void testAddFadeableUsage() {
525         final int usageToAdd = AudioAttributes.USAGE_ASSISTANT;
526         AudioAttributes aaToAdd = createAudioAttributesForUsage(usageToAdd);
527         List<Integer> updatedUsages = new ArrayList<>(mFmc.getFadeableUsages());
528         updatedUsages.add(usageToAdd);
529 
530         FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration
531                 .Builder(mFmc).addFadeableUsage(usageToAdd)
532                 .setFadeOutVolumeShaperConfigForAudioAttributes(aaToAdd,
533                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
534                 .setFadeInVolumeShaperConfigForAudioAttributes(aaToAdd,
535                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
536                 .build();
537 
538         expect.withMessage("Fadeable usages").that(updatedFmc.getFadeableUsages())
539                 .containsExactlyElementsIn(updatedUsages);
540     }
541 
542     @Test
testAddFadeableUsage_withoutSetFadeableUsages()543     public void testAddFadeableUsage_withoutSetFadeableUsages() {
544         final int newUsage = AudioAttributes.USAGE_ASSISTANT;
545         AudioAttributes aaToAdd = createAudioAttributesForUsage(newUsage);
546 
547         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
548                 .addFadeableUsage(newUsage)
549                 .setFadeOutVolumeShaperConfigForAudioAttributes(aaToAdd,
550                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
551                 .setFadeInVolumeShaperConfigForAudioAttributes(aaToAdd,
552                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
553                 .build();
554 
555         expect.withMessage("Fadeable usages").that(fmc.getFadeableUsages())
556                 .containsExactlyElementsIn(List.of(newUsage));
557     }
558 
559     @Test
testAddFadeableUsage_withInvalidUsage_fails()560     public void testAddFadeableUsage_withInvalidUsage_fails() {
561         List<Integer> setUsages = Arrays.asList(
562                 AudioAttributes.USAGE_VOICE_COMMUNICATION,
563                 AudioAttributes.USAGE_ASSISTANT
564         );
565         AudioAttributes aaForVoiceComm = createAudioAttributesForUsage(
566                 AudioAttributes.USAGE_VOICE_COMMUNICATION);
567         AudioAttributes aaForAssistant = createAudioAttributesForUsage(
568                 AudioAttributes.USAGE_ASSISTANT);
569         FadeManagerConfiguration.Builder fmcBuilder = new FadeManagerConfiguration.Builder()
570                 .setFadeableUsages(setUsages)
571                 .setFadeOutVolumeShaperConfigForAudioAttributes(aaForVoiceComm,
572                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
573                 .setFadeInVolumeShaperConfigForAudioAttributes(aaForVoiceComm,
574                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
575                 .setFadeOutVolumeShaperConfigForAudioAttributes(aaForAssistant,
576                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
577                 .setFadeInVolumeShaperConfigForAudioAttributes(aaForAssistant,
578                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
579 
580         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
581                 fmcBuilder.addFadeableUsage(TEST_INVALID_USAGE)
582         );
583 
584         FadeManagerConfiguration fmc = fmcBuilder.build();
585         expect.withMessage("Fadeable usages ").that(thrown).hasMessageThat()
586                 .contains("Invalid usage");
587         expect.withMessage("Fadeable usages").that(fmc.getFadeableUsages())
588                 .containsExactlyElementsIn(setUsages);
589     }
590 
591     @Test
testClearFadeableUsages()592     public void testClearFadeableUsages() {
593         FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration.Builder(mFmc)
594                 .clearFadeableUsages().addFadeableUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
595                 .build();
596 
597         expect.withMessage("Clear fadeable usages").that(updatedFmc.getFadeableUsages())
598                 .containsExactlyElementsIn(List.of(AudioAttributes.USAGE_VOICE_COMMUNICATION));
599     }
600 
601     @Test
testSetUnfadeableContentTypes()602     public void testSetUnfadeableContentTypes() {
603         final List<Integer> unfadeableContentTypes = List.of(
604                 AudioAttributes.CONTENT_TYPE_MOVIE,
605                 AudioAttributes.CONTENT_TYPE_SONIFICATION
606         );
607         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
608                 .setUnfadeableContentTypes(unfadeableContentTypes).build();
609 
610         expect.withMessage("Unfadeable content types set")
611                 .that(fmc.getUnfadeableContentTypes()).isEqualTo(unfadeableContentTypes);
612     }
613 
614     @Test
testSetUnfadeableContentTypes_withInvalidContentType_fails()615     public void testSetUnfadeableContentTypes_withInvalidContentType_fails() {
616         final List<Integer> invalidUnfadeableContentTypes = List.of(
617                 AudioAttributes.CONTENT_TYPE_MOVIE,
618                 TEST_INVALID_CONTENT_TYPE,
619                 AudioAttributes.CONTENT_TYPE_SONIFICATION
620         );
621 
622         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
623                 new FadeManagerConfiguration.Builder()
624                         .setUnfadeableContentTypes(invalidUnfadeableContentTypes).build()
625         );
626 
627         expect.withMessage("Invalid content type set exception").that(thrown).hasMessageThat()
628                 .contains("Invalid content type");
629     }
630 
631     @Test
testSetUnfadeableContentTypes_withNullContentType_fails()632     public void testSetUnfadeableContentTypes_withNullContentType_fails() {
633         NullPointerException thrown = assertThrows(NullPointerException.class, () ->
634                 new FadeManagerConfiguration.Builder()
635                         .setUnfadeableContentTypes(/* contentType= */ null).build()
636         );
637 
638         expect.withMessage("Null content type set exception").that(thrown).hasMessageThat()
639                 .contains("cannot be null");
640     }
641 
642     @Test
testSetUnfadeableContentTypes_withEmptyList_clearsExistingList()643     public void testSetUnfadeableContentTypes_withEmptyList_clearsExistingList() {
644         final List<Integer> unfadeableContentTypes = List.of(
645                 AudioAttributes.CONTENT_TYPE_MOVIE,
646                 AudioAttributes.CONTENT_TYPE_SONIFICATION
647         );
648         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
649                 .setUnfadeableContentTypes(unfadeableContentTypes).build();
650 
651         FadeManagerConfiguration fmcWithEmptyLsit = new FadeManagerConfiguration.Builder(fmc)
652                 .setUnfadeableContentTypes(List.of()).build();
653 
654         expect.withMessage("Unfadeable content types for empty list")
655                 .that(fmcWithEmptyLsit.getUnfadeableContentTypes()).isEmpty();
656     }
657 
658     @Test
testAddUnfadeableContentType()659     public void testAddUnfadeableContentType() {
660         final int contentTypeToAdd = AudioAttributes.CONTENT_TYPE_MOVIE;
661         List<Integer> upatdedContentTypes = new ArrayList<>(mFmc.getUnfadeableContentTypes());
662         upatdedContentTypes.add(contentTypeToAdd);
663 
664         FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration
665                 .Builder(mFmc).addUnfadeableContentType(contentTypeToAdd).build();
666 
667         expect.withMessage("Unfadeable content types").that(updatedFmc.getUnfadeableContentTypes())
668                 .containsExactlyElementsIn(upatdedContentTypes);
669     }
670 
671     @Test
testAddUnfadeableContentTypes_withoutSetUnfadeableContentTypes()672     public void testAddUnfadeableContentTypes_withoutSetUnfadeableContentTypes() {
673         final int newContentType = AudioAttributes.CONTENT_TYPE_MOVIE;
674 
675         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
676                 .addUnfadeableContentType(newContentType).build();
677 
678         expect.withMessage("Unfadeable content types").that(fmc.getUnfadeableContentTypes())
679                 .containsExactlyElementsIn(List.of(newContentType));
680     }
681 
682     @Test
testAddunfadeableContentTypes_withInvalidContentType_fails()683     public void testAddunfadeableContentTypes_withInvalidContentType_fails() {
684         final List<Integer> unfadeableContentTypes = List.of(
685                 AudioAttributes.CONTENT_TYPE_MOVIE,
686                 AudioAttributes.CONTENT_TYPE_SONIFICATION
687         );
688         FadeManagerConfiguration.Builder fmcBuilder = new FadeManagerConfiguration.Builder()
689                 .setUnfadeableContentTypes(unfadeableContentTypes);
690 
691         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
692                 fmcBuilder.addUnfadeableContentType(TEST_INVALID_CONTENT_TYPE).build()
693         );
694 
695         expect.withMessage("Invalid content types exception").that(thrown).hasMessageThat()
696                 .contains("Invalid content type");
697     }
698 
699     @Test
testClearUnfadeableContentTypes()700     public void testClearUnfadeableContentTypes() {
701         List<Integer> unfadeableContentTypes = new ArrayList<>(Arrays.asList(
702                 AudioAttributes.CONTENT_TYPE_MOVIE,
703                 AudioAttributes.CONTENT_TYPE_SONIFICATION
704         ));
705         final int contentTypeToClear = AudioAttributes.CONTENT_TYPE_MOVIE;
706 
707         FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration.Builder()
708                 .setUnfadeableContentTypes(unfadeableContentTypes)
709                 .clearUnfadeableContentTypes().build();
710 
711         expect.withMessage("Unfadeable content types").that(updatedFmc.getUnfadeableContentTypes())
712                 .isEmpty();
713     }
714 
715     @Test
testSetUnfadeableUids()716     public void testSetUnfadeableUids() {
717         final List<Integer> unfadeableUids = List.of(
718                 TEST_UID_1,
719                 TEST_UID_2
720         );
721         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
722                 .setUnfadeableUids(unfadeableUids).build();
723 
724         expect.withMessage("Unfadeable uids set")
725                 .that(fmc.getUnfadeableUids()).isEqualTo(unfadeableUids);
726     }
727 
728     @Test
testSetUnfadeableUids_withNullUids_fails()729     public void testSetUnfadeableUids_withNullUids_fails() {
730         NullPointerException thrown = assertThrows(NullPointerException.class, () ->
731                 new FadeManagerConfiguration.Builder()
732                         .setUnfadeableUids(/* uids= */ null).build()
733         );
734 
735         expect.withMessage("Null unfadeable uids").that(thrown).hasMessageThat()
736                 .contains("cannot be null");
737     }
738 
739     @Test
testAddUnfadeableUid()740     public void testAddUnfadeableUid() {
741         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
742                 .addUnfadeableUid(TEST_UID_1).build();
743 
744         expect.withMessage("Unfadeable uids")
745                 .that(fmc.getUnfadeableUids()).isEqualTo(List.of(TEST_UID_1));
746     }
747 
748     @Test
testClearUnfadebaleUids()749     public void testClearUnfadebaleUids() {
750         final List<Integer> unfadeableUids = List.of(
751                 TEST_UID_1,
752                 TEST_UID_2
753         );
754         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
755                 .setUnfadeableUids(unfadeableUids).build();
756 
757         FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration.Builder(fmc)
758                 .clearUnfadeableUids().build();
759 
760         expect.withMessage("Unfadeable uids").that(updatedFmc.getUnfadeableUids()).isEmpty();
761     }
762 
763     @Test
testSetUnfadeableAudioAttributes()764     public void testSetUnfadeableAudioAttributes() {
765         final List<AudioAttributes> unfadeableAttrs = List.of(
766                 TEST_ASSISTANT_AUDIO_ATTRIBUTE,
767                 TEST_NAVIGATION_AUDIO_ATTRIBUTE
768         );
769 
770         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
771                 .setUnfadeableAudioAttributes(unfadeableAttrs).build();
772 
773         expect.withMessage("Unfadeable audio attributes")
774                 .that(fmc.getUnfadeableAudioAttributes()).isEqualTo(unfadeableAttrs);
775     }
776 
777     @Test
testSetUnfadeableAudioAttributes_withNullAttributes_fails()778     public void testSetUnfadeableAudioAttributes_withNullAttributes_fails() {
779         NullPointerException thrown = assertThrows(NullPointerException.class, () ->
780                 new FadeManagerConfiguration.Builder()
781                         .setUnfadeableAudioAttributes(/* attrs= */ null).build()
782         );
783 
784         expect.withMessage("Null audio attributes exception").that(thrown).hasMessageThat()
785                 .contains("cannot be null");
786     }
787 
788     @Test
testWriteToParcel_andCreateFromParcel()789     public void testWriteToParcel_andCreateFromParcel() {
790         Parcel parcel = Parcel.obtain();
791 
792         mFmc.writeToParcel(parcel, TEST_PARCEL_FLAGS);
793         parcel.setDataPosition(/* position= */ 0);
794         expect.withMessage("Fade manager configuration write to and create from parcel")
795                 .that(mFmc)
796                 .isEqualTo(FadeManagerConfiguration.CREATOR.createFromParcel(parcel));
797     }
798 
799     @Test
testGetFadeOutVolumeShaperConfigForUsage_withInvalidUsage_fails()800     public void testGetFadeOutVolumeShaperConfigForUsage_withInvalidUsage_fails() {
801         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
802                 mFmc.getFadeOutVolumeShaperConfigForUsage(TEST_INVALID_USAGE)
803         );
804 
805         expect.withMessage("Fade out volume shaper config for invalid usage exception")
806                 .that(thrown).hasMessageThat().contains("Invalid usage");
807     }
808 
809     @Test
testGetFadeInVolumeShaperConfigForUsage_withInvalidUsage_fails()810     public void testGetFadeInVolumeShaperConfigForUsage_withInvalidUsage_fails() {
811         IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
812                 mFmc.getFadeInVolumeShaperConfigForUsage(TEST_INVALID_USAGE)
813         );
814 
815         expect.withMessage("Fade in volume shaper config for invalid usage exception")
816                 .that(thrown).hasMessageThat().contains("Invalid usage");
817     }
818 
819     @Test
testGetFadeVolumeShaperConfigForUsage_forSdkUsages()820     public void testGetFadeVolumeShaperConfigForUsage_forSdkUsages() {
821         FadeManagerConfiguration.Builder builder = new FadeManagerConfiguration.Builder();
822         for (int usage : AudioAttributes.getSdkUsages()) {
823             builder.addFadeableUsage(usage);
824             builder.setFadeOutVolumeShaperConfigForUsage(usage, TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
825             builder.setFadeInVolumeShaperConfigForUsage(usage, TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
826         }
827         FadeManagerConfiguration fmc = builder.build();
828 
829         for (int usage : AudioAttributes.getSdkUsages()) {
830             expect.withMessage("Fade out volume shaper config for sdk usage")
831                     .that(fmc.getFadeOutVolumeShaperConfigForUsage(usage))
832                     .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
833             expect.withMessage("Fade in volume shaper config for sdk usage")
834                     .that(fmc.getFadeInVolumeShaperConfigForUsage(usage))
835                     .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
836         }
837     }
838 
839     @Test
testGetFadeVolumeShaperConfigForUsage_forSystemUsages()840     public void testGetFadeVolumeShaperConfigForUsage_forSystemUsages() {
841         int[] systemUsages = {AudioAttributes.USAGE_CALL_ASSISTANT, AudioAttributes.USAGE_EMERGENCY,
842                 AudioAttributes.USAGE_SAFETY, AudioAttributes.USAGE_VEHICLE_STATUS,
843                 AudioAttributes.USAGE_ANNOUNCEMENT};
844         FadeManagerConfiguration.Builder builder = new FadeManagerConfiguration.Builder();
845         for (int usage : systemUsages) {
846             builder.addFadeableUsage(usage);
847             builder.setFadeOutVolumeShaperConfigForUsage(usage, TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
848             builder.setFadeInVolumeShaperConfigForUsage(usage, TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
849         }
850         FadeManagerConfiguration fmc = builder.build();
851 
852         for (int usage : systemUsages) {
853             expect.withMessage("Fade out volume shaper config for system usage")
854                     .that(fmc.getFadeOutVolumeShaperConfigForUsage(usage))
855                     .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
856             expect.withMessage("Fade in volume shaper config for system usage")
857                     .that(fmc.getFadeInVolumeShaperConfigForUsage(usage))
858                     .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
859         }
860     }
861 
862     @Test
testGetFadeVolumeShaperConfigForUsage_forHiddenUsage()863     public void testGetFadeVolumeShaperConfigForUsage_forHiddenUsage() {
864         int hiddenUsage = AudioAttributes.USAGE_VIRTUAL_SOURCE;
865         FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
866                 .addFadeableUsage(hiddenUsage)
867                 .setFadeOutVolumeShaperConfigForUsage(hiddenUsage,
868                         TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
869                 .setFadeInVolumeShaperConfigForUsage(hiddenUsage,
870                         TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build();
871 
872         expect.withMessage("Fade out volume shaper config for hidden usage")
873                 .that(fmc.getFadeOutVolumeShaperConfigForUsage(hiddenUsage))
874                 .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
875         expect.withMessage("Fade in volume shaper config for hidden usage")
876                 .that(fmc.getFadeInVolumeShaperConfigForUsage(hiddenUsage))
877                 .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
878     }
879 
createAudioAttributesForUsage(int usage)880     private static AudioAttributes createAudioAttributesForUsage(int usage) {
881         if (AudioAttributes.isSystemUsage(usage)) {
882             return new AudioAttributes.Builder().setSystemUsage(usage).build();
883         }
884         return new AudioAttributes.Builder().setUsage(usage).build();
885     }
886 }
887