SEBWIN-821: Implemented configuration values for critical and low battery charge thresholds.

This commit is contained in:
Damian Büchel 2024-01-11 17:35:52 +01:00
parent 8c45af88fb
commit 79dedf12b5
9 changed files with 123 additions and 13 deletions

View file

@ -103,7 +103,6 @@ namespace SafeExamBrowser.Client
messageBox = BuildMessageBox();
nativeMethods = new NativeMethods();
networkAdapter = new NetworkAdapter(ModuleLogger(nameof(NetworkAdapter)), nativeMethods);
powerSupply = new PowerSupply(ModuleLogger(nameof(PowerSupply)));
runtimeProxy = new RuntimeProxy(runtimeHostUri, new ProxyObjectFactory(), ModuleLogger(nameof(RuntimeProxy)), Interlocutor.Client);
systemInfo = new SystemInfo(registry);
taskbar = uiFactory.CreateTaskbar(ModuleLogger("Taskbar"));
@ -128,6 +127,7 @@ namespace SafeExamBrowser.Client
operations.Enqueue(new ConfigurationOperation(context, logger, runtimeProxy));
operations.Enqueue(new DelegateOperation(UpdateAppConfig));
operations.Enqueue(new DelegateOperation(BuildIntegrityModule));
operations.Enqueue(new DelegateOperation(BuildPowerSupply));
operations.Enqueue(new LazyInitializationOperation(BuildClientHostOperation));
operations.Enqueue(new ClientHostDisconnectionOperation(context, logger, FIVE_SECONDS));
operations.Enqueue(new LazyInitializationOperation(BuildKeyboardInterceptorOperation));
@ -265,6 +265,11 @@ namespace SafeExamBrowser.Client
context.IntegrityModule = new IntegrityModule(context.AppConfig, ModuleLogger(nameof(IntegrityModule)));
}
private void BuildPowerSupply()
{
powerSupply = new PowerSupply(ModuleLogger(nameof(PowerSupply)), context.Settings.PowerSupply);
}
private IOperation BuildKeyboardInterceptorOperation()
{
var keyboardInterceptor = new KeyboardInterceptor(ModuleLogger(nameof(KeyboardInterceptor)), nativeMethods, context.Settings.Keyboard);

View file

@ -20,18 +20,24 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
case Keys.UserInterface.ActionCenter.EnableActionCenter:
MapEnableActionCenter(settings, value);
break;
case Keys.UserInterface.ShowAudio:
case Keys.UserInterface.SystemControls.Audio.Show:
MapShowAudio(settings, value);
break;
case Keys.UserInterface.ShowClock:
case Keys.UserInterface.SystemControls.Clock.Show:
MapShowClock(settings, value);
break;
case Keys.UserInterface.ShowKeyboardLayout:
case Keys.UserInterface.SystemControls.KeyboardLayout.Show:
MapShowKeyboardLayout(settings, value);
break;
case Keys.UserInterface.ShowNetwork:
case Keys.UserInterface.SystemControls.Network.Show:
MapShowNetwork(settings, value);
break;
case Keys.UserInterface.SystemControls.PowerSupply.ChargeThresholdCritical:
MapChargeThresholdCritical(settings, value);
break;
case Keys.UserInterface.SystemControls.PowerSupply.ChargeThresholdLow:
MapChargeThresholdLow(settings, value);
break;
case Keys.UserInterface.Taskbar.EnableTaskbar:
MapEnableTaskbar(settings, value);
break;
@ -88,6 +94,22 @@ namespace SafeExamBrowser.Configuration.ConfigurationData.DataMapping
}
}
private void MapChargeThresholdCritical(AppSettings settings, object value)
{
if (value is double threshold)
{
settings.PowerSupply.ChargeThresholdCritical = threshold;
}
}
private void MapChargeThresholdLow(AppSettings settings, object value)
{
if (value is double threshold)
{
settings.PowerSupply.ChargeThresholdLow = threshold;
}
}
private void MapEnableTaskbar(AppSettings settings, object value)
{
if (value is bool enable)

View file

@ -235,6 +235,9 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
settings.Mouse.AllowMiddleButton = false;
settings.Mouse.AllowRightButton = true;
settings.PowerSupply.ChargeThresholdCritical = 0.1;
settings.PowerSupply.ChargeThresholdLow = 0.2;
settings.Proctoring.Enabled = false;
settings.Proctoring.ForceRaiseHandMessage = false;
settings.Proctoring.JitsiMeet.AllowChat = false;

View file

@ -334,10 +334,6 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
internal static class UserInterface
{
internal const string ShowAudio = "audioControlEnabled";
internal const string ShowClock = "showTime";
internal const string ShowKeyboardLayout = "showInputLanguage";
internal const string ShowNetwork = "allowWlan";
internal const string UserInterfaceMode = "touchOptimized";
internal static class ActionCenter
@ -345,6 +341,35 @@ namespace SafeExamBrowser.Configuration.ConfigurationData
internal const string EnableActionCenter = "showSideMenu";
}
internal static class SystemControls
{
internal static class Audio
{
internal const string Show = "audioControlEnabled";
}
internal static class Clock
{
internal const string Show = "showTime";
}
internal static class KeyboardLayout
{
internal const string Show = "showInputLanguage";
}
internal static class Network
{
internal const string Show = "allowWlan";
}
internal static class PowerSupply
{
internal const string ChargeThresholdCritical = "batteryChargeThresholdCritical";
internal const string ChargeThresholdLow = "batteryChargeThresholdLow";
}
}
internal static class Taskbar
{
internal const string EnableTaskbar = "showTaskBar";

View file

@ -72,6 +72,11 @@ namespace SafeExamBrowser.Settings
/// </summary>
public MouseSettings Mouse { get; set; }
/// <summary>
/// All settings related to the power supply.
/// </summary>
public PowerSupplySettings PowerSupply { get; set; }
/// <summary>
/// All proctoring-related settings.
/// </summary>
@ -121,6 +126,7 @@ namespace SafeExamBrowser.Settings
Display = new DisplaySettings();
Keyboard = new KeyboardSettings();
Mouse = new MouseSettings();
PowerSupply = new PowerSupplySettings();
Proctoring = new ProctoringSettings();
Security = new SecuritySettings();
Server = new ServerSettings();

View file

@ -92,6 +92,7 @@
<Compile Include="Service\ServiceSettings.cs" />
<Compile Include="AppSettings.cs" />
<Compile Include="SystemComponents\AudioSettings.cs" />
<Compile Include="SystemComponents\PowerSupplySettings.cs" />
<Compile Include="System\SystemSettings.cs" />
<Compile Include="UserInterface\ActionCenterSettings.cs" />
<Compile Include="UserInterface\TaskbarSettings.cs" />

View file

@ -0,0 +1,29 @@
/*
* Copyright (c) 2023 ETH Zürich, Educational Development and Technology (LET)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
using System;
namespace SafeExamBrowser.Settings.SystemComponents
{
/// <summary>
/// Defines all settings for the power supply system component.
/// </summary>
[Serializable]
public class PowerSupplySettings
{
/// <summary>
/// The threshold below which the charge of the power supply is to be considered critical.
/// </summary>
public double ChargeThresholdCritical { get; set; }
/// <summary>
/// The threshold below which the charge of the power supply is to be considered low.
/// </summary>
public double ChargeThresholdLow { get; set; }
}
}

View file

@ -9,6 +9,7 @@
using System;
using System.Timers;
using SafeExamBrowser.Logging.Contracts;
using SafeExamBrowser.Settings.SystemComponents;
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply.Events;
using PowerLineStatus = System.Windows.Forms.PowerLineStatus;
@ -18,15 +19,20 @@ namespace SafeExamBrowser.SystemComponents.PowerSupply
{
public class PowerSupply : IPowerSupply
{
private readonly ILogger logger;
private readonly PowerSupplySettings settings;
private DateTime lastStatusLog;
private ILogger logger;
private Timer timer;
private double critical;
private double low;
public event StatusChangedEventHandler StatusChanged;
public PowerSupply(ILogger logger)
public PowerSupply(ILogger logger, PowerSupplySettings settings)
{
this.logger = logger;
this.settings = settings;
}
public IPowerSupplyStatus GetStatus()
@ -37,7 +43,7 @@ namespace SafeExamBrowser.SystemComponents.PowerSupply
var status = new PowerSupplyStatus();
status.BatteryCharge = charge;
status.BatteryChargeStatus = charge <= 0.2 ? (charge <= 0.1 ? BatteryChargeStatus.Critical : BatteryChargeStatus.Low) : BatteryChargeStatus.Okay;
status.BatteryChargeStatus = charge <= low ? (charge <= critical ? BatteryChargeStatus.Critical : BatteryChargeStatus.Low) : BatteryChargeStatus.Okay;
status.BatteryTimeRemaining = new TimeSpan(hours, minutes, 0);
status.IsOnline = SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online;
@ -54,12 +60,15 @@ namespace SafeExamBrowser.SystemComponents.PowerSupply
{
const int TWO_SECONDS = 2000;
critical = SanitizeThreshold(settings.ChargeThresholdCritical);
low = SanitizeThreshold(settings.ChargeThresholdLow);
timer = new Timer(TWO_SECONDS);
timer.Elapsed += Timer_Elapsed;
timer.AutoReset = true;
timer.Start();
logger.Info("Started monitoring the power supply.");
logger.Info($"Started monitoring the power supply (battery charge thresholds: low = {low * 100}%, critical = {critical * 100}%).");
}
public void Terminate()
@ -71,6 +80,11 @@ namespace SafeExamBrowser.SystemComponents.PowerSupply
}
}
private double SanitizeThreshold(double value)
{
return value < 0 ? 0 : (value > 1 ? 1 : value);
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
StatusChanged?.Invoke(GetStatus());

View file

@ -134,6 +134,9 @@ namespace SebWindowsConfig
public const string KeyAudioVolumeLevel = "audioVolumeLevel";
public const string KeyAudioSetVolumeLevel = "audioSetVolumeLevel";
public const string KeyBatteryChargeThresholdCritical = "batteryChargeThresholdCritical";
public const string KeyBatteryChargeThresholdLow = "batteryChargeThresholdLow";
//Touch optimized settings
public const String KeyBrowserScreenKeyboard = "browserScreenKeyboard";
@ -655,6 +658,8 @@ namespace SebWindowsConfig
SEBSettings.settingsDefault.Add(SEBSettings.KeyAudioVolumeLevel, 25);
SEBSettings.settingsDefault.Add(SEBSettings.KeyAudioSetVolumeLevel, false);
SEBSettings.settingsDefault.Add(SEBSettings.KeyAllowDeveloperConsole, false);
SEBSettings.settingsDefault.Add(SEBSettings.KeyBatteryChargeThresholdCritical, 0.1);
SEBSettings.settingsDefault.Add(SEBSettings.KeyBatteryChargeThresholdLow, 0.2);
//Touch Settings
SEBSettings.settingsDefault.Add(SEBSettings.KeyBrowserScreenKeyboard, false);