< Summary

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

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Equals(...)0%56700%

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
 20        public SettingsData.QualitySettings qualitySettings { get { return currentQualitySettings; } }
 21        public SettingsData.QualitySettingsData qualitySettingsPresets { get { return qualitySettingsPreset; } }
 22        public SettingsData.GeneralSettings generalSettings { get { return currentGeneralSettings; } }
 23        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
 32        public SettingsData.QualitySettings currentQualitySettings { private set; get; }
 33        private SettingsData.GeneralSettings currentGeneralSettings;
 34        public SettingsData.AudioSettings currentAudioSettings { private set; get; }
 35
 36        AudioMixer audioMixer;
 37
 38        public Settings()
 39        {
 40            if (qualitySettingsPreset == null)
 41            {
 42                qualitySettingsPreset = Resources.Load<SettingsData.QualitySettingsData>("ScriptableObjects/QualitySetti
 43            }
 44
 45            if (autoqualitySettings == null)
 46            {
 47                autoqualitySettings = Resources.Load<SettingsData.QualitySettingsData>("ScriptableObjects/AutoQualitySet
 48                lastValidAutoqualitySet = autoqualitySettings[autoqualitySettings.Length / 2];
 49            }
 50
 51            if (autosettingsEnabled == null)
 52                autosettingsEnabled = Resources.Load<BooleanVariable>("ScriptableObjects/AutoQualityEnabled");
 53
 54            LoadQualitySettings();
 55            LoadGeneralSettings();
 56            LoadAudioSettings();
 57
 58            SubscribeToVirtualAudioMixerEvents();
 59            audioMixer = Resources.Load<AudioMixer>("AudioMixer");
 60        }
 61
 62        public void Dispose() {
 63            UnsubscribeFromVirtualAudioMixerEvents();
 64        }
 65
 66        private void LoadQualitySettings()
 67        {
 68            bool isQualitySettingsSet = false;
 69            if (PlayerPrefsUtils.HasKey(QUALITY_SETTINGS_KEY))
 70            {
 71                try
 72                {
 73                    currentQualitySettings = JsonUtility.FromJson<SettingsData.QualitySettings>(PlayerPrefsUtils.GetStri
 74                    isQualitySettingsSet = true;
 75                }
 76                catch (Exception e)
 77                {
 78                    Debug.LogError(e.Message);
 79                }
 80            }
 81
 82            if (!isQualitySettingsSet)
 83            {
 84                currentQualitySettings = qualitySettingsPreset.defaultPreset;
 85            }
 86        }
 87
 88        private void LoadGeneralSettings()
 89        {
 90            currentGeneralSettings = GetDefaultGeneralSettings();
 91
 92            if (PlayerPrefsUtils.HasKey(GENERAL_SETTINGS_KEY))
 93            {
 94                try
 95                {
 96                    object currentSetting = currentGeneralSettings;
 97                    JsonUtility.FromJsonOverwrite(PlayerPrefsUtils.GetString(GENERAL_SETTINGS_KEY), currentSetting);
 98                    currentGeneralSettings = (SettingsData.GeneralSettings)currentSetting;
 99                }
 100                catch (Exception e)
 101                {
 102                    Debug.LogError(e.Message);
 103                }
 104            }
 105        }
 106
 107        private void LoadAudioSettings()
 108        {
 109            currentAudioSettings = GetDefaultAudioSettings();
 110
 111            if (PlayerPrefsUtils.HasKey(AUDIO_SETTINGS_KEY))
 112            {
 113                try
 114                {
 115                    object currentSetting = currentAudioSettings;
 116                    JsonUtility.FromJsonOverwrite(PlayerPrefsUtils.GetString(AUDIO_SETTINGS_KEY), currentSetting);
 117                    currentAudioSettings = (SettingsData.AudioSettings)currentSetting;
 118                }
 119                catch (Exception e)
 120                {
 121                    Debug.LogError(e.Message);
 122                }
 123            }
 124        }
 125
 126        public void LoadDefaultSettings()
 127        {
 128            autosettingsEnabled.Set(false);
 129            currentQualitySettings = qualitySettingsPreset.defaultPreset;
 130            currentGeneralSettings = GetDefaultGeneralSettings();
 131            currentAudioSettings = GetDefaultAudioSettings();
 132
 133            ApplyQualitySettings(currentQualitySettings);
 134            ApplyGeneralSettings(currentGeneralSettings);
 135            ApplyAudioSettings(currentAudioSettings);
 136        }
 137
 138        public void ResetAllSettings()
 139        {
 140            LoadDefaultSettings();
 141            SaveSettings();
 142            OnResetAllSettings?.Invoke();
 143        }
 144
 145        private SettingsData.GeneralSettings GetDefaultGeneralSettings()
 146        {
 147            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        {
 161            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        {
 179            if (index < 0 || index >= autoqualitySettings.Length)
 180                return;
 181
 182            lastValidAutoqualitySet = autoqualitySettings[index];
 183            lastValidAutoqualitySet.baseResolution = currentQualitySettings.baseResolution;
 184            lastValidAutoqualitySet.fpsCap = currentQualitySettings.fpsCap;
 185
 186            if (currentQualitySettings.Equals(lastValidAutoqualitySet))
 187                return;
 188
 189            ApplyQualitySettings(lastValidAutoqualitySet);
 190        }
 191
 192        public void ApplyQualitySettings(SettingsData.QualitySettings settings)
 193        {
 194            if (settings.Equals(currentQualitySettings))
 195                return;
 196
 197            currentQualitySettings = settings;
 198            OnQualitySettingsChanged?.Invoke(settings);
 199        }
 200
 201        public void ApplyGeneralSettings(SettingsData.GeneralSettings settings)
 202        {
 203            if (settings.Equals(currentGeneralSettings))
 204                return;
 205
 206            currentGeneralSettings = settings;
 207            OnGeneralSettingsChanged?.Invoke(settings);
 208            autosettingsEnabled.Set(settings.autoqualityOn);
 209        }
 210
 211        public void ApplyAudioSettings(SettingsData.AudioSettings settings)
 212        {
 213            if (settings.Equals(currentAudioSettings))
 214                return;
 215
 216            currentAudioSettings = settings;
 217            OnAudioSettingsChanged?.Invoke(settings);
 218        }
 219
 220        private void SubscribeToVirtualAudioMixerEvents() {
 221            DataStore.i.virtualAudioMixer.voiceChatVolume.OnChange += ApplyVoiceChatSettings;
 222            DataStore.i.virtualAudioMixer.musicVolume.OnChange += ApplyMusicVolume;
 223            DataStore.i.virtualAudioMixer.avatarSFXVolume.OnChange += ApplyAvatarSFXVolume;
 224            DataStore.i.virtualAudioMixer.uiSFXVolume.OnChange += ApplyUISFXVolume;
 225        }
 226
 227        private void UnsubscribeFromVirtualAudioMixerEvents() {
 228            DataStore.i.virtualAudioMixer.voiceChatVolume.OnChange -= ApplyVoiceChatSettings;
 229            DataStore.i.virtualAudioMixer.musicVolume.OnChange -= ApplyMusicVolume;
 230            DataStore.i.virtualAudioMixer.avatarSFXVolume.OnChange -= ApplyAvatarSFXVolume;
 231            DataStore.i.virtualAudioMixer.uiSFXVolume.OnChange -= ApplyUISFXVolume;
 232        }
 233
 234        public void ApplyMasterVolume() {
 235            // Update the "All" mixer group
 236            audioMixer.SetFloat("AllBusVolume", Utils.ToAudioMixerGroupVolume(currentAudioSettings.masterVolume));
 237
 238            // Update voice chat volume, as it does not pass through the AudioMixer
 239            ApplyVoiceChatSettings();
 240        }
 241
 242        public void ApplyVoiceChatSettings(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) {
 243            float calculatedVolume = Utils.ToVolumeCurve(DataStore.i.virtualAudioMixer.voiceChatVolume.Get() * currentAu
 244            WebInterface.ApplySettings(calculatedVolume, (int)currentGeneralSettings.voiceChatAllow);
 245        }
 246
 247        public void ApplyAvatarSFXVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) {
 248            audioMixer.SetFloat("AvatarSFXBusVolume", Utils.ToAudioMixerGroupVolume(DataStore.i.virtualAudioMixer.avatar
 249        }
 250
 251        public void ApplyUISFXVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) {
 252            audioMixer.SetFloat("UIBusVolume", Utils.ToAudioMixerGroupVolume(DataStore.i.virtualAudioMixer.uiSFXVolume.G
 253        }
 254
 255        public void ApplyMusicVolume(float currentDataStoreVolume = 0f, float previousDataStoreVolume = 0f) {
 256            audioMixer.SetFloat("MusicBusVolume", Utils.ToAudioMixerGroupVolume(DataStore.i.virtualAudioMixer.uiSFXVolum
 257        }
 258
 259        public void SaveSettings()
 260        {
 261            PlayerPrefsUtils.SetString(GENERAL_SETTINGS_KEY, JsonUtility.ToJson(currentGeneralSettings));
 262            PlayerPrefsUtils.SetString(QUALITY_SETTINGS_KEY, JsonUtility.ToJson(currentQualitySettings));
 263            PlayerPrefsUtils.SetString(AUDIO_SETTINGS_KEY, JsonUtility.ToJson(currentAudioSettings));
 264            PlayerPrefsUtils.Save();
 265        }
 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        {
 0286            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}