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

Commit b8a57ee7 authored by Vlad Popa's avatar Vlad Popa Committed by Automerger Merge Worker
Browse files

Merge "CSD: Add TestApi for resetting all CSD timeouts" into udc-dev am: 2ba0b435

parents 151be6c1 2ba0b435
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -6806,7 +6806,9 @@ public class AudioManager {

    /**
     * @hide
     * Sets the computed sound dose value to {@code csd}
     * Sets the computed sound dose value to {@code csd}. A negative value will
     * reset all the CSD related timeouts: after a momentary exposure warning and
     * before the momentary exposure reaches RS2 (see IEC62368-1 10.6.5)
     */
    @TestApi
    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
@@ -6850,7 +6852,7 @@ public class AudioManager {

    /**
     * @hide
     * Returns whether CSD is enabled on this device.
     * Returns whether CSD is enabled and supported by the HAL on this device.
     */
    @TestApi
    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
+22 −17
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.server.audio;
import static android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED;
import static android.Manifest.permission.REMOTE_AUDIO_PLAYBACK;
import static android.app.BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT;
import static android.media.AudioManager.RINGER_MODE_NORMAL;
@@ -313,7 +314,7 @@ public class AudioService extends IAudioService.Stub
     * volumes will be updated in case of a change.
     * @param alias if true, STREAM_NOTIFICATION is aliased to STREAM_RING
     */
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public void setNotifAliasRingForTest(boolean alias) {
        super.setNotifAliasRingForTest_enforcePermission();
        boolean update = (mNotifAliasRing != alias);
@@ -3867,7 +3868,7 @@ public class AudioService extends IAudioService.Stub
    @Override
    @android.annotation.EnforcePermission(anyOf = {
            android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED,
            MODIFY_AUDIO_SETTINGS_PRIVILEGED,
            android.Manifest.permission.MODIFY_AUDIO_ROUTING
    })
    /** @see AudioManager#setVolumeGroupVolumeIndex(int, int, int) */
@@ -3914,7 +3915,7 @@ public class AudioService extends IAudioService.Stub
    @Override
    @android.annotation.EnforcePermission(anyOf = {
            android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED,
            MODIFY_AUDIO_SETTINGS_PRIVILEGED,
            android.Manifest.permission.MODIFY_AUDIO_ROUTING
    })
    /** @see AudioManager#getVolumeGroupVolumeIndex(int) */
@@ -3933,7 +3934,7 @@ public class AudioService extends IAudioService.Stub
    /** @see AudioManager#getVolumeGroupMaxVolumeIndex(int) */
    @android.annotation.EnforcePermission(anyOf = {
            android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED,
            MODIFY_AUDIO_SETTINGS_PRIVILEGED,
            android.Manifest.permission.MODIFY_AUDIO_ROUTING
    })
    public int getVolumeGroupMaxVolumeIndex(int groupId) {
@@ -3949,7 +3950,7 @@ public class AudioService extends IAudioService.Stub
    /** @see AudioManager#getVolumeGroupMinVolumeIndex(int) */
    @android.annotation.EnforcePermission(anyOf = {
            android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED,
            MODIFY_AUDIO_SETTINGS_PRIVILEGED,
            android.Manifest.permission.MODIFY_AUDIO_ROUTING
    })
    public int getVolumeGroupMinVolumeIndex(int groupId) {
@@ -5075,7 +5076,7 @@ public class AudioService extends IAudioService.Stub
     * @see AudioManager#addOnStreamAliasingChangedListener(Executor, Runnable)
     * @see AudioManager#removeOnStreamAliasingChangedListener(Runnable)
     */
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public void registerStreamAliasingDispatcher(IStreamAliasingDispatcher isad, boolean register) {
        super.registerStreamAliasingDispatcher_enforcePermission();
        Objects.requireNonNull(isad);
@@ -5103,7 +5104,7 @@ public class AudioService extends IAudioService.Stub
     * @see AudioManager#getIndependentStreamTypes()
     * @return the list of non-aliased stream types
     */
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public ArrayList<Integer> getIndependentStreamTypes() {
        super.getIndependentStreamTypes_enforcePermission();
@@ -5125,7 +5126,7 @@ public class AudioService extends IAudioService.Stub
     * @param sourceStreamType the stream type for which the alias is queried
     * @return the stream alias
     */
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public @AudioManager.PublicStreamTypes
    int getStreamTypeAlias(@AudioManager.PublicStreamTypes int sourceStreamType) {
        super.getStreamTypeAlias_enforcePermission();
@@ -5140,7 +5141,7 @@ public class AudioService extends IAudioService.Stub
     * @return true when volume control is performed through volume groups, false if it uses
     *     stream types.
     */
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public boolean isVolumeControlUsingVolumeGroups() {
        super.isVolumeControlUsingVolumeGroups_enforcePermission();
@@ -10528,49 +10529,53 @@ public class AudioService extends IAudioService.Stub
    }
    @Override
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public float getOutputRs2UpperBound() {
        super.getOutputRs2UpperBound_enforcePermission();
        return mSoundDoseHelper.getOutputRs2UpperBound();
    }
    @Override
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public void setOutputRs2UpperBound(float rs2Value) {
        super.setOutputRs2UpperBound_enforcePermission();
        mSoundDoseHelper.setOutputRs2UpperBound(rs2Value);
    }
    @Override
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public float getCsd() {
        super.getCsd_enforcePermission();
        return mSoundDoseHelper.getCsd();
    }
    @Override
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public void setCsd(float csd) {
        super.setCsd_enforcePermission();
        if (csd < 0.0f) {
            mSoundDoseHelper.resetCsdTimeouts();
        } else {
            mSoundDoseHelper.setCsd(csd);
        }
    }
    @Override
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public void forceUseFrameworkMel(boolean useFrameworkMel) {
        super.forceUseFrameworkMel_enforcePermission();
        mSoundDoseHelper.forceUseFrameworkMel(useFrameworkMel);
    }
    @Override
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public void forceComputeCsdOnAllDevices(boolean computeCsdOnAllDevices) {
        super.forceComputeCsdOnAllDevices_enforcePermission();
        mSoundDoseHelper.forceComputeCsdOnAllDevices(computeCsdOnAllDevices);
    }
    @Override
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED)
    public boolean isCsdEnabled() {
        super.isCsdEnabled_enforcePermission();
        return mSoundDoseHelper.isCsdEnabled();
+44 −3
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import static com.android.server.audio.AudioService.MIN_STREAM_VOLUME;
import static com.android.server.audio.AudioService.MSG_SET_DEVICE_VOLUME;
import static com.android.server.audio.AudioService.SAFE_MEDIA_VOLUME_MSG_START;

import static java.lang.Math.floor;

import android.annotation.NonNull;
import android.app.AlarmManager;
import android.app.PendingIntent;
@@ -94,6 +96,8 @@ public class SoundDoseHelper {

    private static final int MOMENTARY_EXPOSURE_TIMEOUT_MS = (20 * 3600 * 1000); // 20 hours

    private static final int MOMENTARY_EXPOSURE_TIMEOUT_UNINITIALIZED = -1;

    // 30s after boot completed
    private static final int SAFE_VOLUME_CONFIGURE_TIMEOUT_MS = 30000;

@@ -147,6 +151,9 @@ public class SoundDoseHelper {
     */
    private final SparseIntArray mSafeMediaVolumeDevices = new SparseIntArray();

    /** Used for testing to enforce safe media on all devices */
    private boolean mForceSafeMediaOnAllDevices = false;

    // mMusicActiveMs is the cumulative time of music activity since safe volume was disabled.
    // When this time reaches UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX, the safe media volume is re-enabled
    // automatically. mMusicActiveMs is rounded to a multiple of MUSIC_ACTIVE_POLL_PERIOD_MS.
@@ -170,7 +177,7 @@ public class SoundDoseHelper {
    private float mCurrentCsd = 0.f;

    @GuardedBy("mCsdStateLock")
    private long mLastMomentaryExposureTimeMs = -1;
    private long mLastMomentaryExposureTimeMs = MOMENTARY_EXPOSURE_TIMEOUT_UNINITIALIZED;

    // dose at which the next dose reached warning occurs
    @GuardedBy("mCsdStateLock")
@@ -364,6 +371,7 @@ public class SoundDoseHelper {
        SoundDoseRecord[] doseRecordsArray;
        synchronized (mCsdStateLock) {
            mCurrentCsd = csd;
            mNextCsdWarning = (float) floor(csd + 1.0);

            mDoseRecords.clear();

@@ -389,6 +397,22 @@ public class SoundDoseHelper {
        }
    }

    void resetCsdTimeouts() {
        if (!mEnableCsd) {
            return;
        }

        synchronized (mSafeMediaVolumeStateLock) {
            mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_ACTIVE;
            mMusicActiveMs = 0;
            saveMusicActiveMs();
        }

        synchronized (mCsdStateLock) {
            mLastMomentaryExposureTimeMs = MOMENTARY_EXPOSURE_TIMEOUT_UNINITIALIZED;
        }
    }

    void forceUseFrameworkMel(boolean useFrameworkMel) {
        if (!mEnableCsd) {
            return;
@@ -423,10 +447,27 @@ public class SoundDoseHelper {
        } catch (RemoteException e) {
            Log.e(TAG, "Exception while forcing CSD computation on all devices", e);
        }

        mForceSafeMediaOnAllDevices = computeCsdOnAllDevices;
    }

    boolean isCsdEnabled() {
        return mEnableCsd;
        if (!mEnableCsd) {
            return false;
        }

        final ISoundDose soundDose = mSoundDose.get();
        if (soundDose == null) {
            Log.w(TAG, "Sound dose interface not initialized");
            return false;
        }

        try {
            return soundDose.isSoundDoseHalSupported();
        } catch (RemoteException e) {
            Log.e(TAG, "Exception while forcing CSD computation on all devices", e);
        }
        return false;
    }

    /*package*/ int safeMediaVolumeIndex(int device) {
@@ -490,7 +531,7 @@ public class SoundDoseHelper {
    private boolean checkSafeMediaVolume_l(int streamType, int index, int device) {
        return (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE)
                    && (AudioService.mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC)
                    && safeDevicesContains(device)
                    && (safeDevicesContains(device) || mForceSafeMediaOnAllDevices)
                    && (index > safeMediaVolumeIndex(device));
    }