< Summary

Class:DCL.Settings
Assembly:Settings
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Settings/Settings.cs
Covered lines:55
Uncovered lines:61
Coverable lines:116
Total lines:317
Line coverage:47.4% (55 of 116)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Settings()0%440100%
Dispose()0%110100%
LoadQualitySettings()0%4.123050%
LoadGeneralSettings()0%3.192033.33%
LoadAudioSettings()0%3.192033.33%
LoadDefaultSettings()0%2100%
ResetAllSettings()0%6200%
GetDefaultGeneralSettings()0%110100%
GetDefaultAudioSettings()0%110100%
ApplyAutoQualitySettings(...)0%20400%
ApplyQualitySettings(...)0%3.073080%
ApplyGeneralSettings(...)0%12300%
ApplyAudioSettings(...)0%12300%
SubscribeToVirtualAudioMixerEvents()0%110100%
UnsubscribeFromVirtualAudioMixerEvents()0%110100%
ApplyMasterVolume()0%110100%
ApplyVoiceChatSettings(...)0%110100%
ApplyAvatarSFXVolume(...)0%110100%
ApplyUISFXVolume(...)0%110100%
ApplyMusicVolume(...)0%110100%
SaveSettings()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Settings/Settings.cs

#LineLine coverage
 1using UnityEngine;
 2using System;
 3using DCL.Helpers;
 4using DCL.Interface;
 5using UnityEngine.Audio;
 6
 7namespace DCL
 8{
 9    public class Settings : DCL.Singleton<Settings>
 10    {
 11        const string QUALITY_SETTINGS_KEY = "Settings.Quality";
 12        const string GENERAL_SETTINGS_KEY = "Settings.General";
 13        const string AUDIO_SETTINGS_KEY = "Settings.Audio";
 14
 15        public event Action<SettingsData.QualitySettings> OnQualitySettingsChanged;
 16        public event Action<SettingsData.GeneralSettings> OnGeneralSettingsChanged;
 17        public event Action<SettingsData.AudioSettings> OnAudioSettingsChanged;
 18        public event Action OnResetAllSettings;
 19
 020        public SettingsData.QualitySettings qualitySettings { get { return currentQualitySettings; } }
 021        public SettingsData.QualitySettingsData qualitySettingsPresets { get { return qualitySettingsPreset; } }
 022        public SettingsData.GeneralSettings generalSettings { get { return currentGeneralSettings; } }
 023        public SettingsData.AudioSettings audioSettings { get { return currentAudioSettings; } }
 24
 25        private static SettingsData.QualitySettingsData qualitySettingsPreset = null;
 26
 27        public SettingsData.QualitySettingsData autoqualitySettings = null;
 28        public SettingsData.QualitySettings lastValidAutoqualitySet;
 29
 30        private readonly BooleanVariable autosettingsEnabled = null;
 31
 032        public SettingsData.QualitySettings currentQualitySettings { private set; get; }
 33        private SettingsData.GeneralSettings currentGeneralSettings;
 034        public SettingsData.AudioSettings currentAudioSettings { private set; get; }
 35
 36        AudioMixer audioMixer;
 37
 138        public Settings()
 39        {
 140            if (qualitySettingsPreset == null)
 41            {
 142                qualitySettingsPreset = Resources.Load<SettingsData.QualitySettingsData>("ScriptableObjects/QualitySetti
 43            }
 44
 145            if (autoqualitySettings == null)
 46            {
 147                autoqualitySettings = Resources.Load<SettingsData.QualitySettingsData>("ScriptableObjects/AutoQualitySet
 148                lastValidAutoqualitySet = autoqualitySettings[autoqualitySettings.Length / 2];
 49            }
 50
 151            if (autosettingsEnabled == null)
 152                autosettingsEnabled = Resources.Load<BooleanVariable>("ScriptableObjects/AutoQualityEnabled");
 53
 154            LoadQualitySettings();
 155            LoadGeneralSettings();
 156            LoadAudioSettings();
 57
 158            SubscribeToVirtualAudioMixerEvents();
 159            audioMixer = Resources.Load<AudioMixer>("AudioMixer");
 160        }
 61
 62        public void Dispose() {
 263            UnsubscribeFromVirtualAudioMixerEvents();
 264        }
 65
 66        private void LoadQualitySettings()
 67        {
 168            bool isQualitySettingsSet = false;
 169            if (PlayerPrefsUtils.HasKey(QUALITY_SETTINGS_KEY))
 70            {
 71                try
 72                {
 073                    currentQualitySettings = JsonUtility.FromJson<SettingsData.QualitySettings>(PlayerPrefsUtils.GetStri
 074                    isQualitySettingsSet = true;
 075                }
 76                catch (Exception e)
 77                {
 078                    Debug.LogError(e.Message);
 079                }
 80            }
 81
 182            if (!isQualitySettingsSet)
 83            {
 184                currentQualitySettings = qualitySettingsPreset.defaultPreset;
 85            }
 186        }
 87
 88        private void LoadGeneralSettings()
 89        {
 190            currentGeneralSettings = GetDefaultGeneralSettings();
 91
 192            if (PlayerPrefsUtils.HasKey(GENERAL_SETTINGS_KEY))
 93            {
 94                try
 95                {
 096                    object currentSetting = currentGeneralSettings;
 097                    JsonUtility.FromJsonOverwrite(PlayerPrefsUtils.GetString(GENERAL_SETTINGS_KEY), currentSetting);
 098                    currentGeneralSettings = (SettingsData.GeneralSettings)currentSetting;
 099                }
 100                catch (Exception e)
 101                {
 0102                    Debug.LogError(e.Message);
 0103                }
 104            }
 1105        }
 106
 107        private void LoadAudioSettings()
 108        {
 1109            currentAudioSettings = GetDefaultAudioSettings();
 110
 1111            if (PlayerPrefsUtils.HasKey(AUDIO_SETTINGS_KEY))
 112            {
 113                try
 114                {
 0115                    object currentSetting = currentAudioSettings;
 0116                    JsonUtility.FromJsonOverwrite(PlayerPrefsUtils.GetString(AUDIO_SETTINGS_KEY), currentSetting);
 0117                    currentAudioSettings = (SettingsData.AudioSettings)currentSetting;
 0118                }
 119                catch (Exception e)
 120                {
 0121                    Debug.LogError(e.Message);
 0122                }
 123            }
 1124        }
 125
 126        public void LoadDefaultSettings()
 127        {
 0128            autosettingsEnabled.Set(false);
 0129            currentQualitySettings = qualitySettingsPreset.defaultPreset;
 0130            currentGeneralSettings = GetDefaultGeneralSettings();
 0131            currentAudioSettings = GetDefaultAudioSettings();
 132
 0133            ApplyQualitySettings(currentQualitySettings);
 0134            ApplyGeneralSettings(currentGeneralSettings);
 0135            ApplyAudioSettings(currentAudioSettings);
 0136        }
 137
 138        public void ResetAllSettings()
 139        {
 0140            LoadDefaultSettings();
 0141            SaveSettings();
 0142            OnResetAllSettings?.Invoke();
 0143        }
 144
 145        private SettingsData.GeneralSettings GetDefaultGeneralSettings()
 146        {
 1147            return new SettingsData.GeneralSettings()
 148            {
 149                mouseSensitivity = 0.6f,
 150                scenesLoadRadius = 4,
 151                avatarsLODDistance = 16,
 152                maxNonLODAvatars = 20,
 153                voiceChatVolume = 1,
 154                voiceChatAllow = SettingsData.GeneralSettings.VoiceChatAllow.ALL_USERS,
 155                autoqualityOn = false
 156            };
 157        }
 158
 159        private SettingsData.AudioSettings GetDefaultAudioSettings()
 160        {
 1161            return new SettingsData.AudioSettings()
 162            {
 163                masterVolume = 1f,
 164                voiceChatVolume = 1f,
 165                avatarSFXVolume = 1f,
 166                uiSFXVolume = 1f,
 167                sceneSFXVolume = 1f,
 168                musicVolume = 1f,
 169                chatSFXEnabled = true
 170            };
 171        }
 172
 173        /// <summary>
 174        /// Apply the auto quality setting by its index on the array
 175        /// </summary>
 176        /// <param name="index">Index within the autoQualitySettings array</param>
 177        public void ApplyAutoQualitySettings(int index)
 178        {
 0179            if (index < 0 || index >= autoqualitySettings.Length)
 0180                return;
 181
 0182            lastValidAutoqualitySet = autoqualitySettings[index];
 0183            lastValidAutoqualitySet.baseResolution = currentQualitySettings.baseResolution;
 0184            lastValidAutoqualitySet.fpsCap = currentQualitySettings.fpsCap;
 185
 0186            if (currentQualitySettings.Equals(lastValidAutoqualitySet))
 0187                return;
 188
 0189            ApplyQualitySettings(lastValidAutoqualitySet);
 0190        }
 191
 192        public void ApplyQualitySettings(SettingsData.QualitySettings settings)
 193        {
 1194            if (settings.Equals(currentQualitySettings))
 0195                return;
 196
 1197            currentQualitySettings = settings;
 1198            OnQualitySettingsChanged?.Invoke(settings);
 1199        }
 200
 201        public void ApplyGeneralSettings(SettingsData.GeneralSettings settings)
 202        {
 0203            if (settings.Equals(currentGeneralSettings))
 0204                return;
 205
 0206            currentGeneralSettings = settings;
 0207            OnGeneralSettingsChanged?.Invoke(settings);
 0208            autosettingsEnabled.Set(settings.autoqualityOn);
 0209        }
 210
 211        public void ApplyAudioSettings(SettingsData.AudioSettings settings)
 212        {
 0213            if (settings.Equals(currentAudioSettings))
 0214                return;
 215
 0216            currentAudioSettings = settings;
 0217            OnAudioSettingsChanged?.Invoke(settings);
 0218        }
 219
 220        private void SubscribeToVirtualAudioMixerEvents() {
 1221            DataStore.i.virtualAudioMixer.voiceChatVolume.OnChange += ApplyVoiceChatSettings;
 1222            DataStore.i.virtualAudioMixer.musicVolume.OnChange += ApplyMusicVolume;
 1223            DataStore.i.virtualAudioMixer.avatarSFXVolume.OnChange += ApplyAvatarSFXVolume;
 1224            DataStore.i.virtualAudioMixer.uiSFXVolume.OnChange += ApplyUISFXVolume;
 1225        }
 226
 227        private void UnsubscribeFromVirtualAudioMixerEvents() {
 2228            DataStore.i.virtualAudioMixer.voiceChatVolume.OnChange -= ApplyVoiceChatSettings;
 2229            DataStore.i.virtualAudioMixer.musicVolume.OnChange -= ApplyMusicVolume;
 2230            DataStore.i.virtualAudioMixer.avatarSFXVolume.OnChange -= ApplyAvatarSFXVolume;
 2231            DataStore.i.virtualAudioMixer.uiSFXVolume.OnChange -= ApplyUISFXVolume;
 2232        }
 233
 234        public void ApplyMasterVolume() {
 235            // Update the "All" mixer group
 2236            audioMixer.SetFloat("AllBusVolume", Utils.ToAudioMixerGroupVolume(currentAudioSettings.masterVolume));
 237
 238            // Update voice chat volume, as it does not pass through the AudioMixer
 2239            ApplyVoiceChatSettings();
 2240        }
 241
 242        public void ApplyVoiceChatSettings(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) {
 6243            float calculatedVolume = Utils.ToVolumeCurve(DataStore.i.virtualAudioMixer.voiceChatVolume.Get() * currentAu
 6244            WebInterface.ApplySettings(calculatedVolume, (int)currentGeneralSettings.voiceChatAllow);
 6245        }
 246
 247        public void ApplyAvatarSFXVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) {
 2248            audioMixer.SetFloat("AvatarSFXBusVolume", Utils.ToAudioMixerGroupVolume(DataStore.i.virtualAudioMixer.avatar
 2249        }
 250
 251        public void ApplyUISFXVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) {
 2252            audioMixer.SetFloat("UIBusVolume", Utils.ToAudioMixerGroupVolume(DataStore.i.virtualAudioMixer.uiSFXVolume.G
 2253        }
 254
 255        public void ApplyMusicVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) {
 2256            audioMixer.SetFloat("MusicBusVolume", Utils.ToAudioMixerGroupVolume(DataStore.i.virtualAudioMixer.uiSFXVolum
 2257        }
 258
 259        public void SaveSettings()
 260        {
 0261            PlayerPrefsUtils.SetString(GENERAL_SETTINGS_KEY, JsonUtility.ToJson(currentGeneralSettings));
 0262            PlayerPrefsUtils.SetString(QUALITY_SETTINGS_KEY, JsonUtility.ToJson(currentQualitySettings));
 0263            PlayerPrefsUtils.SetString(AUDIO_SETTINGS_KEY, JsonUtility.ToJson(currentAudioSettings));
 0264            PlayerPrefsUtils.Save();
 0265        }
 266    }
 267}
 268
 269namespace DCL.SettingsData
 270{
 271    [Serializable]
 272    public struct GeneralSettings
 273    {
 274        public enum VoiceChatAllow { ALL_USERS, VERIFIED_ONLY, FRIENDS_ONLY }
 275
 276        public float mouseSensitivity;
 277        public float voiceChatVolume;
 278        public VoiceChatAllow voiceChatAllow;
 279        public bool autoqualityOn;
 280        public float scenesLoadRadius;
 281        public float avatarsLODDistance;
 282        public float maxNonLODAvatars;
 283
 284        public bool Equals(GeneralSettings settings)
 285        {
 286            return mouseSensitivity == settings.mouseSensitivity
 287                   && scenesLoadRadius == settings.scenesLoadRadius
 288                   && avatarsLODDistance == settings.avatarsLODDistance
 289                   && maxNonLODAvatars == settings.maxNonLODAvatars
 290                   && voiceChatVolume == settings.voiceChatVolume
 291                   && voiceChatAllow == settings.voiceChatAllow
 292                   && autoqualityOn == settings.autoqualityOn;
 293        }
 294    }
 295
 296    [Serializable]
 297    public struct AudioSettings
 298    {
 299        public float masterVolume;
 300        public float voiceChatVolume;
 301        public float avatarSFXVolume;
 302        public float uiSFXVolume;
 303        public float sceneSFXVolume; // Note(Mordi): Also known as "World SFX"
 304        public float musicVolume;
 305        public bool chatSFXEnabled;
 306
 307        public bool Equals(AudioSettings settings) {
 308            return masterVolume == settings.masterVolume
 309                && voiceChatVolume == settings.voiceChatVolume
 310                && avatarSFXVolume == settings.avatarSFXVolume
 311                && uiSFXVolume == settings.uiSFXVolume
 312                && sceneSFXVolume == settings.sceneSFXVolume
 313                && musicVolume == settings.musicVolume
 314                && chatSFXEnabled == settings.chatSFXEnabled;
 315        }
 316    }
 317}