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

Commit e303658f authored by Alan Huang's avatar Alan Huang
Browse files

Add the Spatial audio toggle in SoundSettings

The Spatial audio toggle will be showed only on supported devices

Test: robotest, manual checked the UI, but not the actual functionality due to
doesn't have supported device in hand

Bug: 191870827
Change-Id: I7db264902b03fddb7808676d8cb98cbe045deda1
parent 8ab5c92a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -8489,6 +8489,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);
    }
}