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

Commit 5ca82769 authored by Raj Goparaju's avatar Raj Goparaju
Browse files

Fix deep copy of fade manager config when using copy cosntructor

SparseArray clone is not effective when deep copying. Add a
custom copier to iterate through the sparse array and manually
copy each entry.

Bug: 307354764
Test: m gts && atest -c com.google.android.gts.audio.AudioHostTest
Change-Id: Ia899be2b7a5c1ef2fe7d9f4cde5f36b5e65d3462
parent 04f59b8f
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -836,7 +836,7 @@ public final class FadeManagerConfiguration implements Parcelable {
         */
        public Builder(@NonNull FadeManagerConfiguration fmc) {
            mFadeState = fmc.mFadeState;
            mUsageToFadeWrapperMap = fmc.mUsageToFadeWrapperMap.clone();
            copyUsageToFadeWrapperMapInternal(fmc.mUsageToFadeWrapperMap);
            mAttrToFadeWrapperMap = new ArrayMap<AudioAttributes, FadeVolumeShaperConfigsWrapper>(
                    fmc.mAttrToFadeWrapperMap);
            mFadeableUsages = fmc.mFadeableUsages.clone();
@@ -1459,6 +1459,14 @@ public final class FadeManagerConfiguration implements Parcelable {
            }
        }

        private  void copyUsageToFadeWrapperMapInternal(
                SparseArray<FadeVolumeShaperConfigsWrapper> usageToFadeWrapperMap) {
            for (int index = 0; index < usageToFadeWrapperMap.size(); index++) {
                mUsageToFadeWrapperMap.put(usageToFadeWrapperMap.keyAt(index),
                        new FadeVolumeShaperConfigsWrapper(usageToFadeWrapperMap.valueAt(index)));
            }
        }

        private void validateFadeState(int state) {
            switch(state) {
                case FADE_STATE_DISABLED:
@@ -1551,6 +1559,12 @@ public final class FadeManagerConfiguration implements Parcelable {

        FadeVolumeShaperConfigsWrapper() {}

        FadeVolumeShaperConfigsWrapper(@NonNull FadeVolumeShaperConfigsWrapper wrapper) {
            Objects.requireNonNull(wrapper, "Fade volume shaper configs wrapper cannot be null");
            this.mFadeOutVolShaperConfig = wrapper.mFadeOutVolShaperConfig;
            this.mFadeInVolShaperConfig = wrapper.mFadeInVolShaperConfig;
        }

        public void setFadeOutVolShaperConfig(@Nullable VolumeShaper.Configuration fadeOutConfig) {
            mFadeOutVolShaperConfig = fadeOutConfig;
        }
+40 −2
Original line number Diff line number Diff line
@@ -196,8 +196,7 @@ public final class FadeManagerConfigurationUnitTest {
        FadeManagerConfiguration fmcObj = new FadeManagerConfiguration
                .Builder(TEST_FADE_OUT_DURATION_MS, TEST_FADE_IN_DURATION_MS).build();

        FadeManagerConfiguration fmc = new FadeManagerConfiguration
                .Builder(fmcObj).build();
        FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder(fmcObj).build();

        expect.withMessage("Fade state for copy builder").that(fmc.getFadeState())
                .isEqualTo(fmcObj.getFadeState());
@@ -248,6 +247,45 @@ public final class FadeManagerConfigurationUnitTest {
                .isEqualTo(fmcObj.getFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE));
    }

    @Test
    public void build_withCopyConstructor_doesnotChangeOriginal() {
        FadeManagerConfiguration copyConstructedFmc = new FadeManagerConfiguration.Builder(mFmc)
                .setFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_OUT_DURATION_MS)
                .setFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_IN_DURATION_MS)
                .build();

        expect.withMessage("Fade out duration for media usage of default constructor")
                .that(mFmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA))
                .isEqualTo(DEFAULT_FADE_OUT_DURATION_MS);
        expect.withMessage("Fade out duration for media usage of default constructor")
                .that(mFmc.getFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA))
                .isEqualTo(DEFAULT_FADE_IN_DURATION_MS);
        expect.withMessage("Fade out duration for media usage of copy constructor")
                .that(copyConstructedFmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA))
                .isEqualTo(TEST_FADE_OUT_DURATION_MS);
        expect.withMessage("Fade out duration for media usage of copy constructor")
                .that(copyConstructedFmc.getFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA))
                .isEqualTo(TEST_FADE_IN_DURATION_MS);
    }

    @Test
    public void build_withCopyConstructor_equals() {
        FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
                .setFadeableUsages(List.of(AudioAttributes.USAGE_MEDIA,
                        AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
                        AudioAttributes.USAGE_ASSISTANT,
                        AudioAttributes.USAGE_EMERGENCY))
                .setFadeOutDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_OUT_DURATION_MS)
                .setFadeInDurationForUsage(AudioAttributes.USAGE_MEDIA, TEST_FADE_IN_DURATION_MS)
                .build();

        FadeManagerConfiguration copyConstructedFmc =
                new FadeManagerConfiguration.Builder(fmc).build();

        expect.withMessage("Fade manager config constructed using copy constructor").that(fmc)
                .isEqualTo(copyConstructedFmc);
    }

    @Test
    public void testGetDefaultFadeOutDuration() {
        expect.withMessage("Default fade out duration")