< Summary

Class:DCL.Settings
Assembly:Settings
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Settings/Settings.cs
Covered lines:51
Uncovered lines:61
Coverable lines:112
Total lines:314
Line coverage:45.5% (51 of 112)
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
 462        public void Dispose() { UnsubscribeFromVirtualAudioMixerEvents(); }
 63
 64        private void LoadQualitySettings()
 65        {
 166            bool isQualitySettingsSet = false;
 167            if (PlayerPrefsUtils.HasKey(QUALITY_SETTINGS_KEY))
 68            {
 69                try
 70                {
 071                    currentQualitySettings = JsonUtility.FromJson<SettingsData.QualitySettings>(PlayerPrefsUtils.GetStri
 072                    isQualitySettingsSet = true;
 073                }
 74                catch (Exception e)
 75                {
 076                    Debug.LogError(e.Message);
 077                }
 78            }
 79
 180            if (!isQualitySettingsSet)
 81            {
 182                currentQualitySettings = qualitySettingsPreset.defaultPreset;
 83            }
 184        }
 85
 86        private void LoadGeneralSettings()
 87        {
 188            currentGeneralSettings = GetDefaultGeneralSettings();
 89
 190            if (PlayerPrefsUtils.HasKey(GENERAL_SETTINGS_KEY))
 91            {
 92                try
 93                {
 094                    object currentSetting = currentGeneralSettings;
 095                    JsonUtility.FromJsonOverwrite(PlayerPrefsUtils.GetString(GENERAL_SETTINGS_KEY), currentSetting);
 096                    currentGeneralSettings = (SettingsData.GeneralSettings)currentSetting;
 097                }
 98                catch (Exception e)
 99                {
 0100                    Debug.LogError(e.Message);
 0101                }
 102            }
 1103        }
 104
 105        private void LoadAudioSettings()
 106        {
 1107            currentAudioSettings = GetDefaultAudioSettings();
 108
 1109            if (PlayerPrefsUtils.HasKey(AUDIO_SETTINGS_KEY))
 110            {
 111                try
 112                {
 0113                    object currentSetting = currentAudioSettings;
 0114                    JsonUtility.FromJsonOverwrite(PlayerPrefsUtils.GetString(AUDIO_SETTINGS_KEY), currentSetting);
 0115                    currentAudioSettings = (SettingsData.AudioSettings)currentSetting;
 0116                }
 117                catch (Exception e)
 118                {
 0119                    Debug.LogError(e.Message);
 0120                }
 121            }
 1122        }
 123
 124        public void LoadDefaultSettings()
 125        {
 0126            autosettingsEnabled.Set(false);
 0127            currentQualitySettings = qualitySettingsPreset.defaultPreset;
 0128            currentGeneralSettings = GetDefaultGeneralSettings();
 0129            currentAudioSettings = GetDefaultAudioSettings();
 130
 0131            ApplyQualitySettings(currentQualitySettings);
 0132            ApplyGeneralSettings(currentGeneralSettings);
 0133            ApplyAudioSettings(currentAudioSettings);
 0134        }
 135
 136        public void ResetAllSettings()
 137        {
 0138            LoadDefaultSettings();
 0139            SaveSettings();
 0140            OnResetAllSettings?.Invoke();
 0141        }
 142
 143        private SettingsData.GeneralSettings GetDefaultGeneralSettings()
 144        {
 1145            return new SettingsData.GeneralSettings()
 146            {
 147                mouseSensitivity = 0.6f,
 148                scenesLoadRadius = 4,
 149                avatarsLODDistance = 16,
 150                maxNonLODAvatars = DataStore.DataStore_AvatarsLOD.DEFAULT_MAX_AVATAR,
 151                voiceChatVolume = 1,
 152                voiceChatAllow = SettingsData.GeneralSettings.VoiceChatAllow.ALL_USERS,
 153                autoqualityOn = false
 154            };
 155        }
 156
 157        private SettingsData.AudioSettings GetDefaultAudioSettings()
 158        {
 1159            return new SettingsData.AudioSettings()
 160            {
 161                masterVolume = 1f,
 162                voiceChatVolume = 1f,
 163                avatarSFXVolume = 1f,
 164                uiSFXVolume = 1f,
 165                sceneSFXVolume = 1f,
 166                musicVolume = 1f,
 167                chatSFXEnabled = true
 168            };
 169        }
 170
 171        /// <summary>
 172        /// Apply the auto quality setting by its index on the array
 173        /// </summary>
 174        /// <param name="index">Index within the autoQualitySettings array</param>
 175        public void ApplyAutoQualitySettings(int index)
 176        {
 0177            if (index < 0 || index >= autoqualitySettings.Length)
 0178                return;
 179
 0180            lastValidAutoqualitySet = autoqualitySettings[index];
 0181            lastValidAutoqualitySet.baseResolution = currentQualitySettings.baseResolution;
 0182            lastValidAutoqualitySet.fpsCap = currentQualitySettings.fpsCap;
 183
 0184            if (currentQualitySettings.Equals(lastValidAutoqualitySet))
 0185                return;
 186
 0187            ApplyQualitySettings(lastValidAutoqualitySet);
 0188        }
 189
 190        public void ApplyQualitySettings(SettingsData.QualitySettings settings)
 191        {
 1192            if (settings.Equals(currentQualitySettings))
 0193                return;
 194
 1195            currentQualitySettings = settings;
 1196            OnQualitySettingsChanged?.Invoke(settings);
 1197        }
 198
 199        public void ApplyGeneralSettings(SettingsData.GeneralSettings settings)
 200        {
 0201            if (settings.Equals(currentGeneralSettings))
 0202                return;
 203
 0204            currentGeneralSettings = settings;
 0205            OnGeneralSettingsChanged?.Invoke(settings);
 0206            autosettingsEnabled.Set(settings.autoqualityOn);
 0207        }
 208
 209        public void ApplyAudioSettings(SettingsData.AudioSettings settings)
 210        {
 0211            if (settings.Equals(currentAudioSettings))
 0212                return;
 213
 0214            currentAudioSettings = settings;
 0215            OnAudioSettingsChanged?.Invoke(settings);
 0216        }
 217
 218        private void SubscribeToVirtualAudioMixerEvents()
 219        {
 1220            DataStore.i.virtualAudioMixer.voiceChatVolume.OnChange += ApplyVoiceChatSettings;
 1221            DataStore.i.virtualAudioMixer.musicVolume.OnChange += ApplyMusicVolume;
 1222            DataStore.i.virtualAudioMixer.avatarSFXVolume.OnChange += ApplyAvatarSFXVolume;
 1223            DataStore.i.virtualAudioMixer.uiSFXVolume.OnChange += ApplyUISFXVolume;
 1224        }
 225
 226        private void UnsubscribeFromVirtualAudioMixerEvents()
 227        {
 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        {
 236            // Update the "All" mixer group
 2237            audioMixer.SetFloat("AllBusVolume", Utils.ToAudioMixerGroupVolume(currentAudioSettings.masterVolume));
 238
 239            // Update voice chat volume, as it does not pass through the AudioMixer
 2240            ApplyVoiceChatSettings();
 2241        }
 242
 243        public void ApplyVoiceChatSettings(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f)
 244        {
 6245            float calculatedVolume = Utils.ToVolumeCurve(DataStore.i.virtualAudioMixer.voiceChatVolume.Get() * currentAu
 6246            WebInterface.ApplySettings(calculatedVolume, (int)currentGeneralSettings.voiceChatAllow);
 6247        }
 248
 4249        public void ApplyAvatarSFXVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) { audioM
 250
 4251        public void ApplyUISFXVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) { audioMixer
 252
 4253        public void ApplyMusicVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) { audioMixer
 254
 255        public void SaveSettings()
 256        {
 0257            PlayerPrefsUtils.SetString(GENERAL_SETTINGS_KEY, JsonUtility.ToJson(currentGeneralSettings));
 0258            PlayerPrefsUtils.SetString(QUALITY_SETTINGS_KEY, JsonUtility.ToJson(currentQualitySettings));
 0259            PlayerPrefsUtils.SetString(AUDIO_SETTINGS_KEY, JsonUtility.ToJson(currentAudioSettings));
 0260            PlayerPrefsUtils.Save();
 0261        }
 262    }
 263}
 264
 265namespace DCL.SettingsData
 266{
 267    [Serializable]
 268    public struct GeneralSettings
 269    {
 270        public enum VoiceChatAllow { ALL_USERS, VERIFIED_ONLY, FRIENDS_ONLY }
 271
 272        public float mouseSensitivity;
 273        public float voiceChatVolume;
 274        public VoiceChatAllow voiceChatAllow;
 275        public bool autoqualityOn;
 276        public float scenesLoadRadius;
 277        public float avatarsLODDistance;
 278        public float maxNonLODAvatars;
 279
 280        public bool Equals(GeneralSettings settings)
 281        {
 282            return mouseSensitivity == settings.mouseSensitivity
 283                   && scenesLoadRadius == settings.scenesLoadRadius
 284                   && avatarsLODDistance == settings.avatarsLODDistance
 285                   && maxNonLODAvatars == settings.maxNonLODAvatars
 286                   && voiceChatVolume == settings.voiceChatVolume
 287                   && voiceChatAllow == settings.voiceChatAllow
 288                   && autoqualityOn == settings.autoqualityOn;
 289        }
 290    }
 291
 292    [Serializable]
 293    public struct AudioSettings
 294    {
 295        public float masterVolume;
 296        public float voiceChatVolume;
 297        public float avatarSFXVolume;
 298        public float uiSFXVolume;
 299        public float sceneSFXVolume; // Note(Mordi): Also known as "World SFX"
 300        public float musicVolume;
 301        public bool chatSFXEnabled;
 302
 303        public bool Equals(AudioSettings settings)
 304        {
 305            return masterVolume == settings.masterVolume
 306                   && voiceChatVolume == settings.voiceChatVolume
 307                   && avatarSFXVolume == settings.avatarSFXVolume
 308                   && uiSFXVolume == settings.uiSFXVolume
 309                   && sceneSFXVolume == settings.sceneSFXVolume
 310                   && musicVolume == settings.musicVolume
 311                   && chatSFXEnabled == settings.chatSFXEnabled;
 312        }
 313    }
 314}