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