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

Commit b76e698c authored by Vlad Popa's avatar Vlad Popa Committed by Android (Google) Code Review
Browse files

Merge changes I5b812ccf,I54b24397 into main

* changes:
  VolRef: add flags and permission tests
  VolRef: add initial UT to cover volume APIs
parents 9720fee8 abc3ee14
Loading
Loading
Loading
Loading
+27 −21
Original line number Diff line number Diff line
@@ -964,6 +964,8 @@ public class AudioService extends IAudioService.Stub
    private final HardeningEnforcer mHardeningEnforcer;
    private final AudioVolumeGroupHelperBase mAudioVolumeGroupHelper;
    private final Object mSupportedSystemUsagesLock = new Object();
    @GuardedBy("mSupportedSystemUsagesLock")
    private @AttributeSystemUsage int[] mSupportedSystemUsages =
@@ -974,6 +976,13 @@ public class AudioService extends IAudioService.Stub
        return "card=" + card + ";device=" + device;
    }
    private static class AudioVolumeGroupHelper extends AudioVolumeGroupHelperBase {
        @Override
        public List<AudioVolumeGroup> getAudioVolumeGroups() {
            return AudioVolumeGroup.getAudioVolumeGroups();
        }
    }
    public static final class Lifecycle extends SystemService {
        private AudioService mService;
@@ -983,6 +992,7 @@ public class AudioService extends IAudioService.Stub
                              AudioSystemAdapter.getDefaultAdapter(),
                              SystemServerAdapter.getDefaultAdapter(context),
                              SettingsAdapter.getDefaultAdapter(),
                              new AudioVolumeGroupHelper(),
                              new DefaultAudioPolicyFacade(),
                              null);
@@ -1062,16 +1072,19 @@ public class AudioService extends IAudioService.Stub
    /**
     * @param context
     * @param audioSystem Adapter for {@link AudioSystem}
     * @param systemServer Adapter for privilieged functionality for system server components
     * @param systemServer Adapter for privileged functionality for system server components
     * @param settings Adapter for {@link Settings}
     * @param audioVolumeGroupHelper Adapter for {@link AudioVolumeGroup}
     * @param audioPolicy Interface of a facade to IAudioPolicyManager
     * @param looper Looper to use for the service's message handler. If this is null, an
     *               {@link AudioSystemThread} is created as the messaging thread instead.
     */
    public AudioService(Context context, AudioSystemAdapter audioSystem,
            SystemServerAdapter systemServer, SettingsAdapter settings,
            AudioPolicyFacade audioPolicy, @Nullable Looper looper) {
        this (context, audioSystem, systemServer, settings, audioPolicy, looper,
                context.getSystemService(AppOpsManager.class),
            AudioVolumeGroupHelperBase audioVolumeGroupHelper, AudioPolicyFacade audioPolicy,
            @Nullable Looper looper) {
        this (context, audioSystem, systemServer, settings, audioVolumeGroupHelper,
                audioPolicy, looper, context.getSystemService(AppOpsManager.class),
                PermissionEnforcer.fromContext(context));
    }
@@ -1080,14 +1093,18 @@ public class AudioService extends IAudioService.Stub
     * @param audioSystem Adapter for {@link AudioSystem}
     * @param systemServer Adapter for privilieged functionality for system server components
     * @param settings Adapter for {@link Settings}
     * @param audioVolumeGroupHelper Adapter for {@link AudioVolumeGroup}
     * @param audioPolicy Interface of a facade to IAudioPolicyManager
     * @param looper Looper to use for the service's message handler. If this is null, an
     *               {@link AudioSystemThread} is created as the messaging thread instead.
     * @param appOps {@link AppOpsManager} system service
     * @param enforcer Used for permission enforcing
     */
    @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG)
    public AudioService(Context context, AudioSystemAdapter audioSystem,
            SystemServerAdapter systemServer, SettingsAdapter settings,
            AudioPolicyFacade audioPolicy, @Nullable Looper looper, AppOpsManager appOps,
            @NonNull PermissionEnforcer enforcer) {
            AudioVolumeGroupHelperBase audioVolumeGroupHelper, AudioPolicyFacade audioPolicy,
            @Nullable Looper looper, AppOpsManager appOps, @NonNull PermissionEnforcer enforcer) {
        super(enforcer);
        sLifecycleLogger.enqueue(new EventLogger.StringEvent("AudioService()"));
        mContext = context;
@@ -1096,6 +1113,7 @@ public class AudioService extends IAudioService.Stub
        mAudioSystem = audioSystem;
        mSystemServer = systemServer;
        mAudioVolumeGroupHelper = audioVolumeGroupHelper;
        mSettings = settings;
        mAudioPolicy = audioPolicy;
        mPlatformType = AudioSystem.getPlatformType(context);
@@ -2104,7 +2122,7 @@ public class AudioService extends IAudioService.Stub
        // verify permissions
        super.getAudioVolumeGroups_enforcePermission();
        return AudioVolumeGroup.getAudioVolumeGroups();
        return mAudioVolumeGroupHelper.getAudioVolumeGroups();
    }
    private void checkAllAliasStreamVolumes() {
@@ -3803,7 +3821,7 @@ public class AudioService extends IAudioService.Stub
    }
    /**
     * Loops on aliasted stream, update the mute cache attribute of each
     * Loops on aliased stream, update the mute cache attribute of each
     * {@see AudioService#VolumeStreamState}, and then apply the change.
     * It prevents to unnecessary {@see AudioSystem#setStreamVolume} done for each stream
     * and aliases before mute change changed and after.
@@ -4040,18 +4058,6 @@ public class AudioService extends IAudioService.Stub
        }
    }
    @Nullable
    private AudioVolumeGroup getAudioVolumeGroupById(int volumeGroupId) {
        for (AudioVolumeGroup avg : AudioVolumeGroup.getAudioVolumeGroups()) {
            if (avg.getId() == volumeGroupId) {
                return avg;
            }
        }
        Log.e(TAG, ": invalid volume group id: " + volumeGroupId + " requested");
        return null;
    }
    @Override
    @android.annotation.EnforcePermission(anyOf = {
            MODIFY_AUDIO_SETTINGS_PRIVILEGED,
@@ -8252,7 +8258,7 @@ public class AudioService extends IAudioService.Stub
                index = 1;
            }
            // Set the volume index
            AudioSystem.setVolumeIndexForAttributes(mAudioAttributes, index, device);
            mAudioSystem.setVolumeIndexForAttributes(mAudioAttributes, index, device);
        }
        @GuardedBy("AudioService.VolumeStreamState.class")
+5 −0
Original line number Diff line number Diff line
@@ -551,6 +551,11 @@ public class AudioSystemAdapter implements AudioSystem.RoutingUpdateCallback,
        return AudioSystem.setStreamVolumeIndexAS(stream, index, device);
    }

    /** Same as {@link AudioSystem#setVolumeIndexForAttributes(AudioAttributes, int, int)} */
    public int setVolumeIndexForAttributes(AudioAttributes attributes, int index, int device) {
        return AudioSystem.setVolumeIndexForAttributes(attributes, index, device);
    }

    /**
     * Same as {@link AudioSystem#setPhoneState(int, int)}
     * @param state
+34 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 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.server.audio;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;

import android.media.audiopolicy.AudioVolumeGroup;

import com.android.internal.annotations.VisibleForTesting;

import java.util.ArrayList;
import java.util.List;

/** Abstract class for {@link AudioVolumeGroup} related helper methods. */
@VisibleForTesting(visibility = PACKAGE)
public class AudioVolumeGroupHelperBase {
    public List<AudioVolumeGroup> getAudioVolumeGroups() {
        return new ArrayList<>();
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ public class AbsoluteVolumeBehaviorTest {
    private AudioSystemAdapter mSpyAudioSystem;
    private SystemServerAdapter mSystemServer;
    private SettingsAdapter mSettingsAdapter;
    private AudioVolumeGroupHelperBase mAudioVolumeGroupHelper;
    private TestLooper mTestLooper;

    private AudioService mAudioService;
@@ -93,9 +94,11 @@ public class AbsoluteVolumeBehaviorTest {
        mSpyAudioSystem = spy(new NoOpAudioSystemAdapter());
        mSystemServer = new NoOpSystemServerAdapter();
        mSettingsAdapter = new NoOpSettingsAdapter();
        mAudioVolumeGroupHelper = new AudioVolumeGroupHelperBase();

        mAudioService = new AudioService(mContext, mSpyAudioSystem, mSystemServer,
                mSettingsAdapter, mMockAudioPolicy, mTestLooper.getLooper()) {
                mSettingsAdapter, mAudioVolumeGroupHelper, mMockAudioPolicy,
                mTestLooper.getLooper()) {
            @Override
            public int getDeviceForStream(int stream) {
                return AudioSystem.DEVICE_OUT_SPEAKER;
+8 −4
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ public class AudioDeviceVolumeManagerTest {
    private AudioSystemAdapter mSpyAudioSystem;
    private SystemServerAdapter mSystemServer;
    private SettingsAdapter mSettingsAdapter;
    private AudioVolumeGroupHelperBase mAudioVolumeGroupHelper;
    private TestLooper mTestLooper;
    private AudioPolicyFacade mAudioPolicyMock = mock(AudioPolicyFacade.class);

@@ -71,8 +72,10 @@ public class AudioDeviceVolumeManagerTest {

        mSystemServer = new NoOpSystemServerAdapter();
        mSettingsAdapter = new NoOpSettingsAdapter();
        mAudioVolumeGroupHelper = new AudioVolumeGroupHelperBase();
        mAudioService = new AudioService(mContext, mSpyAudioSystem, mSystemServer,
                mSettingsAdapter, mAudioPolicyMock, mTestLooper.getLooper()) {
                mSettingsAdapter, mAudioVolumeGroupHelper, mAudioPolicyMock,
                mTestLooper.getLooper()) {
            @Override
            public int getDeviceForStream(int stream) {
                return AudioSystem.DEVICE_OUT_SPEAKER;
@@ -82,8 +85,9 @@ public class AudioDeviceVolumeManagerTest {
        mTestLooper.dispatchAll();
    }

    // ------------ AudioDeviceVolumeManager related tests ------------
    @Test
    public void testSetDeviceVolume() {
    public void setDeviceVolume_checkIndex() {
        AudioManager am = mContext.getSystemService(AudioManager.class);
        final int minIndex = am.getStreamMinVolume(AudioManager.STREAM_MUSIC);
        final int maxIndex = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
@@ -110,7 +114,7 @@ public class AudioDeviceVolumeManagerTest {

    @Test
    @RequiresFlagsDisabled(FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME)
    public void testConfigurablePreScaleAbsoluteVolume() throws Exception {
    public void configurablePreScaleAbsoluteVolume_checkIndex() throws Exception {
        AudioManager am = mContext.getSystemService(AudioManager.class);
        final int minIndex = am.getStreamMinVolume(AudioManager.STREAM_MUSIC);
        final int maxIndex = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
@@ -159,7 +163,7 @@ public class AudioDeviceVolumeManagerTest {

    @Test
    @RequiresFlagsEnabled(FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME)
    public void testDisablePreScaleAbsoluteVolume() throws Exception {
    public void disablePreScaleAbsoluteVolume_checkIndex() throws Exception {
        AudioManager am = mContext.getSystemService(AudioManager.class);
        final int minIndex = am.getStreamMinVolume(AudioManager.STREAM_MUSIC);
        final int maxIndex = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
Loading