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

Commit 58edb69d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add the Spatial audio toggle in SoundSettings" into sc-v2-dev am: a448a917 am: edc5e940

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/15884455

Change-Id: Iedbf25f530937ae35e7b772873df994036c1d237
parents cd2990bd edc5e940
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -8502,6 +8502,9 @@
    <!-- Sound: Title for the other sounds option and associated settings page. [CHAR LIMIT=30] -->
    <string name="other_sound_settings">Other sounds</string>
    <!-- Sound: Title for the option enabling spatializer effect. [CHAR LIMIT=30] -->
    <string name="spatial_audio_title">Spatial audio</string>
    <!-- Sound: Other sounds: Title for the option enabling touch sounds for dial pad tones. [CHAR LIMIT=30] -->
    <string name="dial_pad_tones_title">Dial pad tones</string>
+7 −0
Original line number Diff line number Diff line
@@ -154,6 +154,13 @@
        android:ringtoneType="alarm"
        android:order="-60"/>

    <!-- Spatial audio -->
    <SwitchPreference
        android:key="spatial_audio"
        android:title="@string/spatial_audio_title"
        android:order="-55"
        settings:controller="com.android.settings.notification.SpatialAudioPreferenceController"/>

    <!-- Dial pad tones -->
    <SwitchPreference
        android:key="dial_pad_tones"
+56 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.notification;

import android.content.Context;
import android.media.AudioManager;
import android.media.Spatializer;

import com.android.settings.core.TogglePreferenceController;

/**
 * The controller of the Spatial audio setting in the SoundSettings.
 */
public class SpatialAudioPreferenceController extends TogglePreferenceController {

    private static final String KEY_SPATIAL_AUDIO = "spatial_audio";

    private final Spatializer mSpatializer;

    public SpatialAudioPreferenceController(Context context) {
        super(context, KEY_SPATIAL_AUDIO);
        AudioManager audioManager = context.getSystemService(AudioManager.class);
        mSpatializer = audioManager.getSpatializer();
    }

    @Override
    public int getAvailabilityStatus() {
        return mSpatializer.getImmersiveAudioLevel() == Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE
                ? UNSUPPORTED_ON_DEVICE : AVAILABLE;
    }

    @Override
    public boolean isChecked() {
        return mSpatializer.isEnabled();
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        mSpatializer.setEnabled(isChecked);
        return isChecked == isChecked();
    }
}
+91 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.notification;

import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.media.AudioManager;
import android.media.Spatializer;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

@Ignore("b/200896161")
@RunWith(RobolectricTestRunner.class)
public class SpatialAudioPreferenceControllerTest {

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private Context mContext;
    @Mock
    private AudioManager mAudioManager;
    @Mock
    private Spatializer mSpatializer;

    private SpatialAudioPreferenceController mController;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = spy(RuntimeEnvironment.application);
        when(mContext.getSystemService(AudioManager.class)).thenReturn(mAudioManager);
        when(mAudioManager.getSpatializer()).thenReturn(mSpatializer);
        mController = new SpatialAudioPreferenceController(mContext);
    }

    @Test
    public void getAvailabilityStatus_levelNone_shouldReturnUnsupported() {
        when(mSpatializer.getImmersiveAudioLevel()).thenReturn(
                Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE);
        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
    }

    @Test
    public void getAvailabilityStatus_levelMultiChannel_shouldReturnAvailable() {
        when(mSpatializer.getImmersiveAudioLevel()).thenReturn(
                Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_MULTICHANNEL);
        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
    }

    @Test
    public void setChecked_withTrue_shouldEnableSpatializer() {
        mController.setChecked(true);

        verify(mSpatializer).setEnabled(true);
    }

    @Test
    public void setChecked_withFalse_shouldDisableSpatializer() {
        mController.setChecked(false);

        verify(mSpatializer).setEnabled(false);
    }
}