private void LoadProperties()
 {
     //TODO: Change the place to get and set user settings, because when the app update it change to default.
     if (Settings.Default.PcName == string.Empty)
     {
         ChangePcName(Environment.UserName);
     }
     else
     {
         Voice?.ChangePcName(Settings.Default.PcName);
     }
     NotifyWind  = Settings.Default.NotifyWind;
     NotifyVoice = Settings.Default.NotifyVoice;
     Battery.ChangeHighBatteryLvl(Settings.Default.BatteryHigh);
     Battery.ChangeLowBatteryLvl(Settings.Default.BatteryLow);
     Battery.ChangeAlertStatus(Array.ConvertAll(Settings.Default.AlertStatus.Split(','), bool.Parse));
     PcIdle.ChangeMaxIdleTime(Settings.Default.PcIdleTime);
     TimeBatteryCheck    = Settings.Default.TimeBattChk;
     AuxTimeBatteryCheck = Settings.Default.TimeAuxBattChk;
     Voice?.ChangeNotVolume(Settings.Default.VolNot);
     if (Settings.Default.VoiceName != string.Empty)
     {
         Voice?.ChangeCurrentVoice(Settings.Default.VoiceName);
     }
     else
     {
         Settings.Default.VoiceName = Voice?.CurrentVoice;
         Settings.Default.Save();
     }
 }
        private void TmCheckPower_Tick(object sender, EventArgs e)
        {
            var idleTimeMin = PcIdle.GetIdleTimeMin();

            // Refresh Form data.
            ShowPowerStatus();
            TbIdleTime.Text = idleTimeMin.ToString("D");

            if (NotifyVoice && NotifyWind)
            {
                // Check if activate Voice notification for idle time.
                IdleVoiceNotify = !NotifyWind || idleTimeMin >= PcIdle.MaxIdleTime;
            }

            if (!Battery.CheckPowerLevel())
            {
                Battery.AuxAlert = false;
                return;
            }
            BtnSpeak.Enabled = false;
            if (Battery.AuxAlert && (Voice.AuxNotVolume += 10) > 100)
            {
                Voice.AuxNotVolume = 100;
            }
            NewNotification($"{Settings.Default.PcName}. {Battery.Msg}");
            TmCheckPower.Stop();
            TmWaitForResp.Start();
            GbNextNot.Enabled = true;
            Application.DoEvents();
        }
        //private async Task CheckForUpdates()
        //{
        //    using (var manager = new UpdateManager(@"E:\Documents\Daniel\Google_Drive\PROGRAMACIÓN\C#\BatteryMonitor\Releases"))
        //    {
        //        await manager.UpdateApp();
        //    }
        //}

        #region FormEvents

        private void FormMain_Load(object sender, EventArgs e)
        {
            Battery = new Battery();
            PcIdle  = new PcIdle();
            //Battery.AddPowerModeChanged(PowerModeChanged);
            SystemEvents.PowerModeChanged += PowerModeChanged;
            ShowPowerStatus();
            BtnChecked.EnabledChanged += BtnChecked_EnabledChanged;

            // Get App Name and Version to show in the Form about.
            AppName    = Assembly.GetExecutingAssembly().GetName().Name;
            AppVersion = ApplicationDeployment.IsNetworkDeployed ? $@"v{ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString(4)}" : Assembly.GetExecutingAssembly().GetName().Version.ToString();

            try
            {
                Voice            = new Voice(VoiceCompleted);
                BtnSpeak.Enabled = true;
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message, @"Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            LoadProperties();
            if (Battery.ChargeStatus == BatteryChargeStatus.NoSystemBattery)
            {
                NotifyIcon.Icon = Resources.ico_WithoutBatt;
                Icon            = Resources.ico_WithoutBatt;
                return;
            }
#if !DEBUG
            Height = 390;
#endif
            TmCheckPower.Start();
        }
        private void SettingsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //TODO: Fix the way to pass parameters.
            using (var formSettings = new FormSettings(TimeBatteryCheck, AuxTimeBatteryCheck, PcIdle.MaxIdleTime, Battery.LowBatteryLvl, Battery.HighBatteryLvl, Voice, NotifyWind, NotifyVoice, Battery.AlertStatus))
            {
                //Recall for check if there is an installed voice.
                Voice.GetVoices();
                // SHOW Form
                formSettings.ShowDialog();
                // Check if the user make any change.
                if (!formSettings.HasChanges)
                {
                    return;
                }
                #region Notification
                //Stop timers.
                // Save the Status of the Timer.
                //var isTmCheckPowerEnabled = TmCheckPower.Enabled;
                AlertChecked(false);
                TmCheckPower.Stop();
                TmWaitForResp.Stop();
                //
                Battery.ChangeAlertStatus(new[] { formSettings.ChBoxLowBat, formSettings.ChBoxHighBat });
                Battery.ChangePrevAlert(Any);
                Battery.ResetAlert();
                //Get formSettings values.
                NotifyWind          = formSettings.NotifyWind;
                NotifyVoice         = formSettings.NotifyVoice;
                TimeBatteryCheck    = formSettings.TimeBatChk;
                AuxTimeBatteryCheck = formSettings.AuxTimeBatChk;
                Battery.ChangeLowBatteryLvl(formSettings.LowBattery);
                Battery.ChangeHighBatteryLvl(formSettings.HighBattery);
                PcIdle.ChangeMaxIdleTime(formSettings.IdleTime);

                //Save in properties
                Settings.Default.BatteryHigh    = Battery.HighBatteryLvl;
                Settings.Default.BatteryLow     = Battery.LowBatteryLvl;
                Settings.Default.PcIdleTime     = PcIdle.MaxIdleTime;
                Settings.Default.TimeBattChk    = TimeBatteryCheck;
                Settings.Default.TimeAuxBattChk = AuxTimeBatteryCheck;
                Settings.Default.NotifyWind     = NotifyWind;
                Settings.Default.NotifyVoice    = NotifyVoice;
                Settings.Default.AlertStatus    = string.Join(",", Battery.AlertStatus);
                //Changes timer intervals.
                TmCheckPower.Interval    = (int)TimeBatteryCheck * 1000;
                AuxAlertTime             = (int)(AuxTimeBatteryCheck * 60);
                ProgBarNextAlert.Maximum = AuxAlertTime;
                //Restart timers.
                //TmCheckPower.Enabled = isTmCheckPowerEnabled;
                TmCheckPower.Start();
                #endregion
                #region Voz
                try
                {
                    Settings.Default.VoiceName = formSettings.CurrentVoice;
                    Settings.Default.VolNot    = formSettings.NotifyVolume;
                    Voice.ChangeCurrentVoice(formSettings.CurrentVoice);
                    Voice.ChangeNotVolume(formSettings.NotifyVolume);
                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.Message, @"Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                #endregion
                Voice?.ChangePcName(formSettings.PcName);
                Settings.Default.PcName = formSettings.PcName;
                Settings.Default.Save();
            }
        }