Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ae34893 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "feature_audioCrossover" into main

* changes:
  Support hidden audio usage in fade manager configuration
  Add unit tests for default fade duration apis
parents 565f068c 286c4319
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -1689,6 +1689,18 @@ public final class AudioAttributes implements Parcelable {
        return SDK_USAGES.contains(usage);
    }

    /**
     * Query if the usage is a hidden (neither sdk nor SystemApi) usage
     *
     * @param usage the {@link android.media.AudioAttributes usage}
     * @return {@code true} if the usage is {@link AudioAttributes#USAGE_VIRTUAL_SOURCE} or
     *     {@code false} otherwise
     * @hide
     */
    public static boolean isHiddenUsage(@AttributeUsage int usage) {
        return usage == USAGE_VIRTUAL_SOURCE;
    }

    /**
     * Query if the content type is a valid sdk content type
     * @param contentType one of {@link AttributeContentType}
+2 −1
Original line number Diff line number Diff line
@@ -694,7 +694,8 @@ public final class FadeManagerConfiguration implements Parcelable {
    }

    private static boolean isUsageValid(int usage) {
        return AudioAttributes.isSdkUsage(usage) || AudioAttributes.isSystemUsage(usage);
        return AudioAttributes.isSdkUsage(usage) || AudioAttributes.isSystemUsage(usage)
                || AudioAttributes.isHiddenUsage(usage);
    }

    private void ensureFadingIsEnabled() {
+97 −4
Original line number Diff line number Diff line
@@ -45,10 +45,8 @@ import java.util.List;
@RunWith(AndroidJUnit4.class)
@RequiresFlagsEnabled(FLAG_ENABLE_FADE_MANAGER_CONFIGURATION)
public final class FadeManagerConfigurationUnitTest {
    private static final long DEFAULT_FADE_OUT_DURATION_MS =
            FadeManagerConfiguration.getDefaultFadeOutDurationMillis();
    private static final long DEFAULT_FADE_IN_DURATION_MS =
            FadeManagerConfiguration.getDefaultFadeInDurationMillis();
    private static final long DEFAULT_FADE_OUT_DURATION_MS = 2_000;
    private static final long DEFAULT_FADE_IN_DURATION_MS = 1_000;
    private static final long TEST_FADE_OUT_DURATION_MS = 1_500;
    private static final long TEST_FADE_IN_DURATION_MS = 750;
    private static final int TEST_INVALID_USAGE = -10;
@@ -250,6 +248,20 @@ public final class FadeManagerConfigurationUnitTest {
                .isEqualTo(fmcObj.getFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE));
    }

    @Test
    public void testGetDefaultFadeOutDuration() {
        expect.withMessage("Default fade out duration")
                .that(FadeManagerConfiguration.getDefaultFadeOutDurationMillis())
                .isEqualTo(DEFAULT_FADE_OUT_DURATION_MS);
    }

    @Test
    public void testGetDefaultFadeInDuration() {
        expect.withMessage("Default fade in duration")
                .that(FadeManagerConfiguration.getDefaultFadeInDurationMillis())
                .isEqualTo(DEFAULT_FADE_IN_DURATION_MS);
    }

    @Test
    public void testSetFadeState_toDisable() {
        final int fadeState = FadeManagerConfiguration.FADE_STATE_DISABLED;
@@ -746,6 +758,87 @@ public final class FadeManagerConfigurationUnitTest {
                .isEqualTo(FadeManagerConfiguration.CREATOR.createFromParcel(parcel));
    }

    @Test
    public void testGetFadeOutVolumeShaperConfigForUsage_withInvalidUsage_fails() {
        IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
                mFmc.getFadeOutVolumeShaperConfigForUsage(TEST_INVALID_USAGE)
        );

        expect.withMessage("Fade out volume shaper config for invalid usage exception")
                .that(thrown).hasMessageThat().contains("Invalid usage");
    }

    @Test
    public void testGetFadeInVolumeShaperConfigForUsage_withInvalidUsage_fails() {
        IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
                mFmc.getFadeInVolumeShaperConfigForUsage(TEST_INVALID_USAGE)
        );

        expect.withMessage("Fade in volume shaper config for invalid usage exception")
                .that(thrown).hasMessageThat().contains("Invalid usage");
    }

    @Test
    public void testGetFadeVolumeShaperConfigForUsage_forSdkUsages() {
        FadeManagerConfiguration.Builder builder = new FadeManagerConfiguration.Builder();
        for (int usage : AudioAttributes.getSdkUsages()) {
            builder.addFadeableUsage(usage);
            builder.setFadeOutVolumeShaperConfigForUsage(usage, TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
            builder.setFadeInVolumeShaperConfigForUsage(usage, TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
        }
        FadeManagerConfiguration fmc = builder.build();

        for (int usage : AudioAttributes.getSdkUsages()) {
            expect.withMessage("Fade out volume shaper config for sdk usage")
                    .that(fmc.getFadeOutVolumeShaperConfigForUsage(usage))
                    .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
            expect.withMessage("Fade in volume shaper config for sdk usage")
                    .that(fmc.getFadeInVolumeShaperConfigForUsage(usage))
                    .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
        }
    }

    @Test
    public void testGetFadeVolumeShaperConfigForUsage_forSystemUsages() {
        int[] systemUsages = {AudioAttributes.USAGE_CALL_ASSISTANT, AudioAttributes.USAGE_EMERGENCY,
                AudioAttributes.USAGE_SAFETY, AudioAttributes.USAGE_VEHICLE_STATUS,
                AudioAttributes.USAGE_ANNOUNCEMENT};
        FadeManagerConfiguration.Builder builder = new FadeManagerConfiguration.Builder();
        for (int usage : systemUsages) {
            builder.addFadeableUsage(usage);
            builder.setFadeOutVolumeShaperConfigForUsage(usage, TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
            builder.setFadeInVolumeShaperConfigForUsage(usage, TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
        }
        FadeManagerConfiguration fmc = builder.build();

        for (int usage : systemUsages) {
            expect.withMessage("Fade out volume shaper config for system usage")
                    .that(fmc.getFadeOutVolumeShaperConfigForUsage(usage))
                    .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
            expect.withMessage("Fade in volume shaper config for system usage")
                    .that(fmc.getFadeInVolumeShaperConfigForUsage(usage))
                    .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
        }
    }

    @Test
    public void testGetFadeVolumeShaperConfigForUsage_forHiddenUsage() {
        int hiddenUsage = AudioAttributes.USAGE_VIRTUAL_SOURCE;
        FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
                .addFadeableUsage(hiddenUsage)
                .setFadeOutVolumeShaperConfigForUsage(hiddenUsage,
                        TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
                .setFadeInVolumeShaperConfigForUsage(hiddenUsage,
                        TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build();

        expect.withMessage("Fade out volume shaper config for hidden usage")
                .that(fmc.getFadeOutVolumeShaperConfigForUsage(hiddenUsage))
                .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
        expect.withMessage("Fade in volume shaper config for hidden usage")
                .that(fmc.getFadeInVolumeShaperConfigForUsage(hiddenUsage))
                .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
    }

    private static AudioAttributes createAudioAttributesForUsage(int usage) {
        if (AudioAttributes.isSystemUsage(usage)) {
            return new AudioAttributes.Builder().setSystemUsage(usage).build();