SEBWIN-342: Removed UI dependencies from wireless network system component.
This commit is contained in:
parent
dcbdc13338
commit
6f51d266cc
40 changed files with 775 additions and 829 deletions
|
@ -18,6 +18,7 @@ using SafeExamBrowser.SystemComponents.Contracts;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts;
|
using SafeExamBrowser.UserInterface.Contracts;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
using SafeExamBrowser.WindowsApi.Contracts;
|
using SafeExamBrowser.WindowsApi.Contracts;
|
||||||
|
@ -40,12 +41,11 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
|
||||||
private Mock<INotificationInfo> logInfo;
|
private Mock<INotificationInfo> logInfo;
|
||||||
private Mock<INotificationController> logController;
|
private Mock<INotificationController> logController;
|
||||||
private Mock<IPowerSupply> powerSupply;
|
private Mock<IPowerSupply> powerSupply;
|
||||||
// TODO
|
|
||||||
//private Mock<ISystemComponent<ISystemWirelessNetworkControl>> wirelessNetwork;
|
|
||||||
private Mock<ISystemInfo> systemInfo;
|
private Mock<ISystemInfo> systemInfo;
|
||||||
private Mock<ITaskbar> taskbar;
|
private Mock<ITaskbar> taskbar;
|
||||||
private Mock<IText> text;
|
private Mock<IText> text;
|
||||||
private Mock<IUserInterfaceFactory> uiFactory;
|
private Mock<IUserInterfaceFactory> uiFactory;
|
||||||
|
private Mock<IWirelessAdapter> wirelessAdapter;
|
||||||
|
|
||||||
private ShellOperation sut;
|
private ShellOperation sut;
|
||||||
|
|
||||||
|
@ -63,14 +63,13 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
|
||||||
logInfo = new Mock<INotificationInfo>();
|
logInfo = new Mock<INotificationInfo>();
|
||||||
logController = new Mock<INotificationController>();
|
logController = new Mock<INotificationController>();
|
||||||
powerSupply = new Mock<IPowerSupply>();
|
powerSupply = new Mock<IPowerSupply>();
|
||||||
// TODO
|
|
||||||
//wirelessNetwork = new Mock<ISystemComponent<ISystemWirelessNetworkControl>>();
|
|
||||||
systemInfo = new Mock<ISystemInfo>();
|
systemInfo = new Mock<ISystemInfo>();
|
||||||
taskbar = new Mock<ITaskbar>();
|
taskbar = new Mock<ITaskbar>();
|
||||||
taskbarSettings = new TaskbarSettings();
|
taskbarSettings = new TaskbarSettings();
|
||||||
terminationActivator = new Mock<ITerminationActivator>();
|
terminationActivator = new Mock<ITerminationActivator>();
|
||||||
text = new Mock<IText>();
|
text = new Mock<IText>();
|
||||||
uiFactory = new Mock<IUserInterfaceFactory>();
|
uiFactory = new Mock<IUserInterfaceFactory>();
|
||||||
|
wirelessAdapter = new Mock<IWirelessAdapter>();
|
||||||
|
|
||||||
uiFactory.Setup(u => u.CreateNotificationControl(It.IsAny<INotificationInfo>(), It.IsAny<Location>())).Returns(new Mock<INotificationControl>().Object);
|
uiFactory.Setup(u => u.CreateNotificationControl(It.IsAny<INotificationInfo>(), It.IsAny<Location>())).Returns(new Mock<INotificationControl>().Object);
|
||||||
|
|
||||||
|
@ -86,14 +85,13 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
|
||||||
logInfo.Object,
|
logInfo.Object,
|
||||||
logController.Object,
|
logController.Object,
|
||||||
powerSupply.Object,
|
powerSupply.Object,
|
||||||
// TODO
|
|
||||||
//wirelessNetwork.Object,
|
|
||||||
systemInfo.Object,
|
systemInfo.Object,
|
||||||
taskbar.Object,
|
taskbar.Object,
|
||||||
taskbarSettings,
|
taskbarSettings,
|
||||||
terminationActivator.Object,
|
terminationActivator.Object,
|
||||||
text.Object,
|
text.Object,
|
||||||
uiFactory.Object);
|
uiFactory.Object,
|
||||||
|
wirelessAdapter.Object);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
@ -201,14 +199,13 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
|
||||||
uiFactory.Setup(f => f.CreateAudioControl(It.IsAny<IAudio>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
uiFactory.Setup(f => f.CreateAudioControl(It.IsAny<IAudio>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
||||||
uiFactory.Setup(f => f.CreateKeyboardLayoutControl(It.IsAny<IKeyboard>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
uiFactory.Setup(f => f.CreateKeyboardLayoutControl(It.IsAny<IKeyboard>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
||||||
uiFactory.Setup(f => f.CreatePowerSupplyControl(It.IsAny<IPowerSupply>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
uiFactory.Setup(f => f.CreatePowerSupplyControl(It.IsAny<IPowerSupply>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
||||||
uiFactory.Setup(f => f.CreateWirelessNetworkControl(It.IsAny<Location>())).Returns(new Mock<ISystemWirelessNetworkControl>().Object);
|
uiFactory.Setup(f => f.CreateWirelessNetworkControl(It.IsAny<IWirelessAdapter>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
||||||
|
|
||||||
sut.Perform();
|
sut.Perform();
|
||||||
|
|
||||||
audio.Verify(a => a.Initialize(), Times.Once);
|
audio.Verify(a => a.Initialize(), Times.Once);
|
||||||
powerSupply.Verify(p => p.Initialize(), Times.Once);
|
powerSupply.Verify(p => p.Initialize(), Times.Once);
|
||||||
// TODO
|
wirelessAdapter.Verify(w => w.Initialize(), Times.Once);
|
||||||
//wirelessNetwork.Verify(w => w.Initialize(), Times.Once);
|
|
||||||
keyboard.Verify(k => k.Initialize(), Times.Once);
|
keyboard.Verify(k => k.Initialize(), Times.Once);
|
||||||
actionCenter.Verify(a => a.AddSystemControl(It.IsAny<ISystemControl>()), Times.Exactly(4));
|
actionCenter.Verify(a => a.AddSystemControl(It.IsAny<ISystemControl>()), Times.Exactly(4));
|
||||||
taskbar.Verify(t => t.AddSystemControl(It.IsAny<ISystemControl>()), Times.Exactly(4));
|
taskbar.Verify(t => t.AddSystemControl(It.IsAny<ISystemControl>()), Times.Exactly(4));
|
||||||
|
@ -230,14 +227,13 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
|
||||||
uiFactory.Setup(f => f.CreateAudioControl(It.IsAny<IAudio>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
uiFactory.Setup(f => f.CreateAudioControl(It.IsAny<IAudio>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
||||||
uiFactory.Setup(f => f.CreateKeyboardLayoutControl(It.IsAny<IKeyboard>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
uiFactory.Setup(f => f.CreateKeyboardLayoutControl(It.IsAny<IKeyboard>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
||||||
uiFactory.Setup(f => f.CreatePowerSupplyControl(It.IsAny<IPowerSupply>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
uiFactory.Setup(f => f.CreatePowerSupplyControl(It.IsAny<IPowerSupply>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
||||||
uiFactory.Setup(f => f.CreateWirelessNetworkControl(It.IsAny<Location>())).Returns(new Mock<ISystemWirelessNetworkControl>().Object);
|
uiFactory.Setup(f => f.CreateWirelessNetworkControl(It.IsAny<IWirelessAdapter>(), It.IsAny<Location>())).Returns(new Mock<ISystemControl>().Object);
|
||||||
|
|
||||||
sut.Perform();
|
sut.Perform();
|
||||||
|
|
||||||
audio.Verify(a => a.Initialize(), Times.Once);
|
audio.Verify(a => a.Initialize(), Times.Once);
|
||||||
powerSupply.Verify(p => p.Initialize(), Times.Once);
|
powerSupply.Verify(p => p.Initialize(), Times.Once);
|
||||||
// TODO
|
wirelessAdapter.Verify(w => w.Initialize(), Times.Once);
|
||||||
//wirelessNetwork.Verify(w => w.Initialize(), Times.Once);
|
|
||||||
keyboard.Verify(k => k.Initialize(), Times.Once);
|
keyboard.Verify(k => k.Initialize(), Times.Once);
|
||||||
actionCenter.Verify(a => a.AddSystemControl(It.IsAny<ISystemControl>()), Times.Never);
|
actionCenter.Verify(a => a.AddSystemControl(It.IsAny<ISystemControl>()), Times.Never);
|
||||||
taskbar.Verify(t => t.AddSystemControl(It.IsAny<ISystemControl>()), Times.Never);
|
taskbar.Verify(t => t.AddSystemControl(It.IsAny<ISystemControl>()), Times.Never);
|
||||||
|
@ -296,8 +292,7 @@ namespace SafeExamBrowser.Client.UnitTests.Operations
|
||||||
logController.Verify(c => c.Terminate(), Times.Once);
|
logController.Verify(c => c.Terminate(), Times.Once);
|
||||||
powerSupply.Verify(p => p.Terminate(), Times.Once);
|
powerSupply.Verify(p => p.Terminate(), Times.Once);
|
||||||
keyboard.Verify(k => k.Terminate(), Times.Once);
|
keyboard.Verify(k => k.Terminate(), Times.Once);
|
||||||
// TODO
|
wirelessAdapter.Verify(w => w.Terminate(), Times.Once);
|
||||||
//wirelessNetwork.Verify(w => w.Terminate(), Times.Once);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ using SafeExamBrowser.SystemComponents.Audio;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.SystemComponents.Contracts;
|
||||||
using SafeExamBrowser.SystemComponents.Keyboard;
|
using SafeExamBrowser.SystemComponents.Keyboard;
|
||||||
using SafeExamBrowser.SystemComponents.PowerSupply;
|
using SafeExamBrowser.SystemComponents.PowerSupply;
|
||||||
|
using SafeExamBrowser.SystemComponents.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts;
|
using SafeExamBrowser.UserInterface.Contracts;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.MessageBox;
|
using SafeExamBrowser.UserInterface.Contracts.MessageBox;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
|
@ -263,7 +264,7 @@ namespace SafeExamBrowser.Client
|
||||||
var logInfo = new LogNotificationInfo(text);
|
var logInfo = new LogNotificationInfo(text);
|
||||||
var logController = new LogNotificationController(logger, uiFactory);
|
var logController = new LogNotificationController(logger, uiFactory);
|
||||||
var powerSupply = new PowerSupply(new ModuleLogger(logger, nameof(PowerSupply)));
|
var powerSupply = new PowerSupply(new ModuleLogger(logger, nameof(PowerSupply)));
|
||||||
var wirelessNetwork = new WirelessNetwork(new ModuleLogger(logger, nameof(WirelessNetwork)), text);
|
var wirelessAdapter = new WirelessAdapter(new ModuleLogger(logger, nameof(WirelessAdapter)), text);
|
||||||
var activators = new IActionCenterActivator[]
|
var activators = new IActionCenterActivator[]
|
||||||
{
|
{
|
||||||
new KeyboardActivator(new ModuleLogger(logger, nameof(KeyboardActivator))),
|
new KeyboardActivator(new ModuleLogger(logger, nameof(KeyboardActivator))),
|
||||||
|
@ -281,14 +282,13 @@ namespace SafeExamBrowser.Client
|
||||||
logInfo,
|
logInfo,
|
||||||
logController,
|
logController,
|
||||||
powerSupply,
|
powerSupply,
|
||||||
// TODO
|
|
||||||
//wirelessNetwork,
|
|
||||||
systemInfo,
|
systemInfo,
|
||||||
taskbar,
|
taskbar,
|
||||||
configuration.Settings.Taskbar,
|
configuration.Settings.Taskbar,
|
||||||
terminationActivator,
|
terminationActivator,
|
||||||
text,
|
text,
|
||||||
uiFactory);
|
uiFactory,
|
||||||
|
wirelessAdapter);
|
||||||
|
|
||||||
return operation;
|
return operation;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ using SafeExamBrowser.SystemComponents.Contracts;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts;
|
using SafeExamBrowser.UserInterface.Contracts;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
using SafeExamBrowser.WindowsApi.Contracts;
|
using SafeExamBrowser.WindowsApi.Contracts;
|
||||||
|
@ -36,13 +37,13 @@ namespace SafeExamBrowser.Client.Operations
|
||||||
private INotificationInfo logInfo;
|
private INotificationInfo logInfo;
|
||||||
private INotificationController logController;
|
private INotificationController logController;
|
||||||
private IPowerSupply powerSupply;
|
private IPowerSupply powerSupply;
|
||||||
// TODO private ISystemComponent<ISystemWirelessNetworkControl> wirelessNetwork;
|
|
||||||
private ISystemInfo systemInfo;
|
private ISystemInfo systemInfo;
|
||||||
private ITaskbar taskbar;
|
private ITaskbar taskbar;
|
||||||
private TaskbarSettings taskbarSettings;
|
private TaskbarSettings taskbarSettings;
|
||||||
private ITerminationActivator terminationActivator;
|
private ITerminationActivator terminationActivator;
|
||||||
private IText text;
|
private IText text;
|
||||||
private IUserInterfaceFactory uiFactory;
|
private IUserInterfaceFactory uiFactory;
|
||||||
|
private IWirelessAdapter wirelessAdapter;
|
||||||
|
|
||||||
public event ActionRequiredEventHandler ActionRequired { add { } remove { } }
|
public event ActionRequiredEventHandler ActionRequired { add { } remove { } }
|
||||||
public event StatusChangedEventHandler StatusChanged;
|
public event StatusChangedEventHandler StatusChanged;
|
||||||
|
@ -59,13 +60,13 @@ namespace SafeExamBrowser.Client.Operations
|
||||||
INotificationInfo logInfo,
|
INotificationInfo logInfo,
|
||||||
INotificationController logController,
|
INotificationController logController,
|
||||||
IPowerSupply powerSupply,
|
IPowerSupply powerSupply,
|
||||||
// TODO ISystemComponent<ISystemWirelessNetworkControl> wirelessNetwork,
|
|
||||||
ISystemInfo systemInfo,
|
ISystemInfo systemInfo,
|
||||||
ITaskbar taskbar,
|
ITaskbar taskbar,
|
||||||
TaskbarSettings taskbarSettings,
|
TaskbarSettings taskbarSettings,
|
||||||
ITerminationActivator terminationActivator,
|
ITerminationActivator terminationActivator,
|
||||||
IText text,
|
IText text,
|
||||||
IUserInterfaceFactory uiFactory)
|
IUserInterfaceFactory uiFactory,
|
||||||
|
IWirelessAdapter wirelessAdapter)
|
||||||
{
|
{
|
||||||
this.aboutInfo = aboutInfo;
|
this.aboutInfo = aboutInfo;
|
||||||
this.aboutController = aboutController;
|
this.aboutController = aboutController;
|
||||||
|
@ -84,7 +85,7 @@ namespace SafeExamBrowser.Client.Operations
|
||||||
this.text = text;
|
this.text = text;
|
||||||
this.taskbar = taskbar;
|
this.taskbar = taskbar;
|
||||||
this.uiFactory = uiFactory;
|
this.uiFactory = uiFactory;
|
||||||
// TODO this.wirelessNetwork = wirelessNetwork;
|
this.wirelessAdapter = wirelessAdapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult Perform()
|
public OperationResult Perform()
|
||||||
|
@ -173,8 +174,7 @@ namespace SafeExamBrowser.Client.Operations
|
||||||
audio.Initialize();
|
audio.Initialize();
|
||||||
keyboard.Initialize();
|
keyboard.Initialize();
|
||||||
powerSupply.Initialize();
|
powerSupply.Initialize();
|
||||||
// TODO
|
wirelessAdapter.Initialize();
|
||||||
//wirelessNetwork.Initialize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeAboutNotificationForActionCenter()
|
private void InitializeAboutNotificationForActionCenter()
|
||||||
|
@ -283,10 +283,7 @@ namespace SafeExamBrowser.Client.Operations
|
||||||
{
|
{
|
||||||
if (actionCenterSettings.ShowWirelessNetwork)
|
if (actionCenterSettings.ShowWirelessNetwork)
|
||||||
{
|
{
|
||||||
var control = uiFactory.CreateWirelessNetworkControl(Location.ActionCenter);
|
actionCenter.AddSystemControl(uiFactory.CreateWirelessNetworkControl(wirelessAdapter, Location.ActionCenter));
|
||||||
|
|
||||||
// TODO wirelessNetwork.Register(control);
|
|
||||||
actionCenter.AddSystemControl(control);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,10 +291,7 @@ namespace SafeExamBrowser.Client.Operations
|
||||||
{
|
{
|
||||||
if (taskbarSettings.ShowWirelessNetwork)
|
if (taskbarSettings.ShowWirelessNetwork)
|
||||||
{
|
{
|
||||||
var control = uiFactory.CreateWirelessNetworkControl(Location.Taskbar);
|
taskbar.AddSystemControl(uiFactory.CreateWirelessNetworkControl(wirelessAdapter, Location.Taskbar));
|
||||||
|
|
||||||
// TODO wirelessNetwork.Register(control);
|
|
||||||
taskbar.AddSystemControl(control);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,8 +319,7 @@ namespace SafeExamBrowser.Client.Operations
|
||||||
audio.Terminate();
|
audio.Terminate();
|
||||||
keyboard.Terminate();
|
keyboard.Terminate();
|
||||||
powerSupply.Terminate();
|
powerSupply.Terminate();
|
||||||
// TODO
|
wirelessAdapter.Terminate();
|
||||||
//wirelessNetwork.Terminate();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,6 +119,7 @@ namespace SafeExamBrowser.I18n.Contracts
|
||||||
SystemControl_BatteryRemainingCharge,
|
SystemControl_BatteryRemainingCharge,
|
||||||
SystemControl_KeyboardLayoutTooltip,
|
SystemControl_KeyboardLayoutTooltip,
|
||||||
SystemControl_WirelessConnected,
|
SystemControl_WirelessConnected,
|
||||||
|
SystemControl_WirelessConnecting,
|
||||||
SystemControl_WirelessDisconnected,
|
SystemControl_WirelessDisconnected,
|
||||||
SystemControl_WirelessNotAvailable,
|
SystemControl_WirelessNotAvailable,
|
||||||
Version
|
Version
|
||||||
|
|
|
@ -315,6 +315,9 @@
|
||||||
<Entry key="SystemControl_WirelessConnected">
|
<Entry key="SystemControl_WirelessConnected">
|
||||||
Connected to "%%NAME%%"
|
Connected to "%%NAME%%"
|
||||||
</Entry>
|
</Entry>
|
||||||
|
<Entry key="SystemControl_WirelessConnecting">
|
||||||
|
Connecting...
|
||||||
|
</Entry>
|
||||||
<Entry key="SystemControl_WirelessDisconnected">
|
<Entry key="SystemControl_WirelessDisconnected">
|
||||||
Disconnected
|
Disconnected
|
||||||
</Entry>
|
</Entry>
|
||||||
|
|
|
@ -11,5 +11,5 @@ namespace SafeExamBrowser.SystemComponents.Contracts.Audio.Events
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates that the volume of the system audio component has changed.
|
/// Indicates that the volume of the system audio component has changed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public delegate void AudioVolumeChangedEventHandler(double volume, bool muted);
|
public delegate void VolumeChangedEventHandler(double volume, bool muted);
|
||||||
}
|
}
|
|
@ -43,7 +43,7 @@ namespace SafeExamBrowser.SystemComponents.Contracts.Audio
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fired when the volume of the audio device has changed.
|
/// Fired when the volume of the audio device has changed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event AudioVolumeChangedEventHandler VolumeChanged;
|
event VolumeChangedEventHandler VolumeChanged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Mutes the currently active audio device.
|
/// Mutes the currently active audio device.
|
||||||
|
|
|
@ -11,5 +11,5 @@ namespace SafeExamBrowser.SystemComponents.Contracts.Keyboard.Events
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates that the active keyboard layout has changed.
|
/// Indicates that the active keyboard layout has changed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public delegate void KeyboardLayoutChangedEventHandler(IKeyboardLayout layout);
|
public delegate void LayoutChangedEventHandler(IKeyboardLayout layout);
|
||||||
}
|
}
|
|
@ -20,7 +20,7 @@ namespace SafeExamBrowser.SystemComponents.Contracts.Keyboard
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fired when the active keyboard layout changed.
|
/// Fired when the active keyboard layout changed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event KeyboardLayoutChangedEventHandler LayoutChanged;
|
event LayoutChangedEventHandler LayoutChanged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Activates the keyboard layout with the given identifier.
|
/// Activates the keyboard layout with the given identifier.
|
||||||
|
|
|
@ -11,5 +11,5 @@ namespace SafeExamBrowser.SystemComponents.Contracts.PowerSupply.Events
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates that the status of the power supply for the system has changed.
|
/// Indicates that the status of the power supply for the system has changed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public delegate void PowerSupplyStatusChangedEventHandler(IPowerSupplyStatus status);
|
public delegate void StatusChangedEventHandler(IPowerSupplyStatus status);
|
||||||
}
|
}
|
|
@ -18,7 +18,7 @@ namespace SafeExamBrowser.SystemComponents.Contracts.PowerSupply
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fired when the status of the power supply changed.
|
/// Fired when the status of the power supply changed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event PowerSupplyStatusChangedEventHandler StatusChanged;
|
event StatusChangedEventHandler StatusChanged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Retrieves the current status of the power supply.
|
/// Retrieves the current status of the power supply.
|
||||||
|
|
|
@ -53,22 +53,25 @@
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Audio\Events\AudioVolumeChangedEventHandler.cs" />
|
<Compile Include="Audio\Events\VolumeChangedEventHandler.cs" />
|
||||||
<Compile Include="Audio\IAudio.cs" />
|
<Compile Include="Audio\IAudio.cs" />
|
||||||
<Compile Include="PowerSupply\Events\PowerSupplyStatusChangedEventHandler.cs" />
|
<Compile Include="PowerSupply\Events\StatusChangedEventHandler.cs" />
|
||||||
<Compile Include="PowerSupply\IPowerSupply.cs" />
|
<Compile Include="PowerSupply\IPowerSupply.cs" />
|
||||||
<Compile Include="PowerSupply\BatteryChargeStatus.cs" />
|
<Compile Include="PowerSupply\BatteryChargeStatus.cs" />
|
||||||
<Compile Include="Keyboard\Events\KeyboardLayoutChangedEventHandler.cs" />
|
<Compile Include="Keyboard\Events\LayoutChangedEventHandler.cs" />
|
||||||
<Compile Include="Keyboard\IKeyboard.cs" />
|
<Compile Include="Keyboard\IKeyboard.cs" />
|
||||||
<Compile Include="Keyboard\IKeyboardLayout.cs" />
|
<Compile Include="Keyboard\IKeyboardLayout.cs" />
|
||||||
<Compile Include="ISystemComponent.cs" />
|
<Compile Include="ISystemComponent.cs" />
|
||||||
<Compile Include="ISystemInfo.cs" />
|
<Compile Include="ISystemInfo.cs" />
|
||||||
<Compile Include="IUserInfo.cs" />
|
<Compile Include="IUserInfo.cs" />
|
||||||
<Compile Include="IWirelessNetwork.cs" />
|
<Compile Include="WirelessNetwork\Events\NetworksChangedEventHandler.cs" />
|
||||||
|
<Compile Include="WirelessNetwork\Events\StatusChangedEventHandler.cs" />
|
||||||
|
<Compile Include="WirelessNetwork\IWirelessAdapter.cs" />
|
||||||
|
<Compile Include="WirelessNetwork\IWirelessNetwork.cs" />
|
||||||
<Compile Include="OperatingSystem.cs" />
|
<Compile Include="OperatingSystem.cs" />
|
||||||
<Compile Include="PowerSupply\IPowerSupplyStatus.cs" />
|
<Compile Include="PowerSupply\IPowerSupplyStatus.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="WirelessNetworkStatus.cs" />
|
<Compile Include="WirelessNetwork\WirelessNetworkStatus.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
|
|
@ -6,15 +6,10 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace SafeExamBrowser.SystemComponents.Contracts
|
namespace SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork.Events
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines all possible network statuses which can be determined by the application.
|
/// Indicates that the available wireless networks have changed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public enum WirelessNetworkStatus
|
public delegate void NetworksChangedEventHandler();
|
||||||
{
|
|
||||||
Undefined = 0,
|
|
||||||
Connected,
|
|
||||||
Disconnected
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 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/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork.Events
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the wireless network status has changed.
|
||||||
|
/// </summary>
|
||||||
|
public delegate void StatusChangedEventHandler(WirelessNetworkStatus status);
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 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;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork.Events;
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork
|
||||||
|
{
|
||||||
|
public interface IWirelessAdapter : ISystemComponent
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Fired when the available wireless networks changed.
|
||||||
|
/// </summary>
|
||||||
|
event NetworksChangedEventHandler NetworksChanged;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fired when the wireless network status changed.
|
||||||
|
/// </summary>
|
||||||
|
event StatusChangedEventHandler StatusChanged;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates whether the system has an active wireless network adapter.
|
||||||
|
/// </summary>
|
||||||
|
bool IsAvailable { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to connect to the wireless network with the given ID.
|
||||||
|
/// </summary>
|
||||||
|
void Connect(Guid id);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves all currently available networks.
|
||||||
|
/// </summary>
|
||||||
|
IEnumerable<IWirelessNetwork> GetNetworks();
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace SafeExamBrowser.SystemComponents.Contracts
|
namespace SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines a wireless network which can be connected to by the application.
|
/// Defines a wireless network which can be connected to by the application.
|
||||||
|
@ -26,7 +26,7 @@ namespace SafeExamBrowser.SystemComponents.Contracts
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The signal strength of this network, as percentage.
|
/// The signal strength of this network, from <c>0</c> (worst) to <c>100</c> (best).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
int SignalStrength { get; }
|
int SignalStrength { get; }
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 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/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines all possible wireless network statuses which can be determined by the application.
|
||||||
|
/// </summary>
|
||||||
|
public enum WirelessNetworkStatus
|
||||||
|
{
|
||||||
|
Undefined = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A connection has been established.
|
||||||
|
/// </summary>
|
||||||
|
Connected,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A connection is being established.
|
||||||
|
/// </summary>
|
||||||
|
Connecting,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// No connection is established.
|
||||||
|
/// </summary>
|
||||||
|
Disconnected
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,7 +31,7 @@ namespace SafeExamBrowser.SystemComponents.Audio
|
||||||
public bool OutputMuted => audioDevice?.AudioEndpointVolume.Mute == true;
|
public bool OutputMuted => audioDevice?.AudioEndpointVolume.Mute == true;
|
||||||
public double OutputVolume => audioDevice?.AudioEndpointVolume.MasterVolumeLevelScalar ?? 0;
|
public double OutputVolume => audioDevice?.AudioEndpointVolume.MasterVolumeLevelScalar ?? 0;
|
||||||
|
|
||||||
public event AudioVolumeChangedEventHandler VolumeChanged;
|
public event VolumeChangedEventHandler VolumeChanged;
|
||||||
|
|
||||||
public Audio(AudioSettings settings, ILogger logger)
|
public Audio(AudioSettings settings, ILogger logger)
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace SafeExamBrowser.SystemComponents.Keyboard
|
||||||
private ILogger logger;
|
private ILogger logger;
|
||||||
private CultureInfo originalLanguage;
|
private CultureInfo originalLanguage;
|
||||||
|
|
||||||
public event KeyboardLayoutChangedEventHandler LayoutChanged;
|
public event LayoutChangedEventHandler LayoutChanged;
|
||||||
|
|
||||||
public Keyboard(ILogger logger)
|
public Keyboard(ILogger logger)
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace SafeExamBrowser.SystemComponents.PowerSupply
|
||||||
private ILogger logger;
|
private ILogger logger;
|
||||||
private Timer timer;
|
private Timer timer;
|
||||||
|
|
||||||
public event PowerSupplyStatusChangedEventHandler StatusChanged;
|
public event StatusChangedEventHandler StatusChanged;
|
||||||
|
|
||||||
public PowerSupply(ILogger logger)
|
public PowerSupply(ILogger logger)
|
||||||
{
|
{
|
||||||
|
|
|
@ -70,8 +70,8 @@
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="SystemInfo.cs" />
|
<Compile Include="SystemInfo.cs" />
|
||||||
<Compile Include="UserInfo.cs" />
|
<Compile Include="UserInfo.cs" />
|
||||||
<Compile Include="WirelessNetwork.cs" />
|
<Compile Include="WirelessNetwork\WirelessAdapter.cs" />
|
||||||
<Compile Include="WirelessNetworkDefinition.cs" />
|
<Compile Include="WirelessNetwork\WirelessNetwork.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
|
|
|
@ -1,263 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 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;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Timers;
|
|
||||||
using SafeExamBrowser.I18n.Contracts;
|
|
||||||
using SafeExamBrowser.Logging.Contracts;
|
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
|
||||||
using SimpleWifi;
|
|
||||||
using SimpleWifi.Win32;
|
|
||||||
using SimpleWifi.Win32.Interop;
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.SystemComponents
|
|
||||||
{
|
|
||||||
public class WirelessNetwork // TODO: ISystemComponent<ISystemWirelessNetworkControl>
|
|
||||||
{
|
|
||||||
private readonly object @lock = new object();
|
|
||||||
|
|
||||||
// TODOprivate List<ISystemWirelessNetworkControl> controls;
|
|
||||||
private List<WirelessNetworkDefinition> networks;
|
|
||||||
private bool hasWifiAdapter;
|
|
||||||
private ILogger logger;
|
|
||||||
private IText text;
|
|
||||||
private Timer timer;
|
|
||||||
private Wifi wifi;
|
|
||||||
|
|
||||||
public WirelessNetwork(ILogger logger, IText text)
|
|
||||||
{
|
|
||||||
// TODOthis.controls = new List<ISystemWirelessNetworkControl>();
|
|
||||||
this.logger = logger;
|
|
||||||
this.networks = new List<WirelessNetworkDefinition>();
|
|
||||||
this.text = text;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Initialize()
|
|
||||||
{
|
|
||||||
wifi = new Wifi();
|
|
||||||
wifi.ConnectionStatusChanged += Wifi_ConnectionStatusChanged;
|
|
||||||
hasWifiAdapter = !wifi.NoWifiAvailable && !IsTurnedOff();
|
|
||||||
|
|
||||||
if (hasWifiAdapter)
|
|
||||||
{
|
|
||||||
UpdateAvailableNetworks();
|
|
||||||
StartTimer();
|
|
||||||
|
|
||||||
logger.Info("Started monitoring the wireless network adapter.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
logger.Info("Wireless networks cannot be monitored, as there is no hardware adapter available or it is turned off.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
//public void Register(ISystemWirelessNetworkControl control)
|
|
||||||
//{
|
|
||||||
// if (hasWifiAdapter)
|
|
||||||
// {
|
|
||||||
// control.HasWirelessNetworkAdapter = true;
|
|
||||||
// control.NetworkSelected += Control_NetworkSelected;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// control.HasWirelessNetworkAdapter = false;
|
|
||||||
// control.SetInformation(text.Get(TextKey.SystemControl_WirelessNotAvailable));
|
|
||||||
// }
|
|
||||||
|
|
||||||
// lock (@lock)
|
|
||||||
// {
|
|
||||||
// controls.Add(control);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (hasWifiAdapter)
|
|
||||||
// {
|
|
||||||
// UpdateControls();
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
public void Terminate()
|
|
||||||
{
|
|
||||||
if (timer != null)
|
|
||||||
{
|
|
||||||
timer.Stop();
|
|
||||||
logger.Info("Stopped monitoring the wireless network adapter.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
//foreach (var control in controls)
|
|
||||||
//{
|
|
||||||
// control.Close();
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Control_NetworkSelected(Guid id)
|
|
||||||
{
|
|
||||||
lock (@lock)
|
|
||||||
{
|
|
||||||
var network = networks.First(n => n.Id == id);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var request = new AuthRequest(network.AccessPoint);
|
|
||||||
|
|
||||||
logger.Info($"Attempting to connect to '{network.Name}'...");
|
|
||||||
network.AccessPoint.ConnectAsync(request, false, (success) => AccessPoint_OnConnectComplete(network.Name, success));
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
//foreach (var control in controls)
|
|
||||||
//{
|
|
||||||
// control.IsConnecting = true;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
logger.Error($"Failed to connect to wireless network '{network.Name}!'", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AccessPoint_OnConnectComplete(string name, bool success)
|
|
||||||
{
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
logger.Info($"Successfully connected to wireless network '{name}'.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
logger.Error($"Failed to connect to wireless network '{name}!'");
|
|
||||||
}
|
|
||||||
|
|
||||||
lock (@lock)
|
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
//foreach (var control in controls)
|
|
||||||
//{
|
|
||||||
// control.IsConnecting = false;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateAvailableNetworks();
|
|
||||||
UpdateControls();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
|
|
||||||
{
|
|
||||||
UpdateAvailableNetworks();
|
|
||||||
UpdateControls();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Wifi_ConnectionStatusChanged(object sender, WifiStatusEventArgs e)
|
|
||||||
{
|
|
||||||
UpdateAvailableNetworks();
|
|
||||||
UpdateControls();
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool IsTurnedOff()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var client = new WlanClient();
|
|
||||||
|
|
||||||
foreach (var @interface in client.Interfaces)
|
|
||||||
{
|
|
||||||
foreach (var state in @interface.RadioState.PhyRadioState)
|
|
||||||
{
|
|
||||||
if (state.dot11SoftwareRadioState == Dot11RadioState.On && state.dot11HardwareRadioState == Dot11RadioState.On)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
logger.Error("Failed to determine the radio state of the wireless adapter(s)! Assuming it is (all are) turned off...", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateControls()
|
|
||||||
{
|
|
||||||
lock (@lock)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var currentNetwork = networks.FirstOrDefault(n => n.Status == WirelessNetworkStatus.Connected);
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
//foreach (var control in controls)
|
|
||||||
//{
|
|
||||||
// if (wifi.ConnectionStatus == WifiStatus.Disconnected)
|
|
||||||
// {
|
|
||||||
// control.SetInformation(text.Get(TextKey.SystemControl_WirelessDisconnected));
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (currentNetwork != null)
|
|
||||||
// {
|
|
||||||
// control.SetInformation(text.Get(TextKey.SystemControl_WirelessConnected).Replace("%%NAME%%", currentNetwork.Name));
|
|
||||||
// }
|
|
||||||
|
|
||||||
// control.NetworkStatus = ToStatus(wifi.ConnectionStatus);
|
|
||||||
// control.Update(networks.ToList());
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
logger.Error("Failed to update the wireless network adapter status!", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateAvailableNetworks()
|
|
||||||
{
|
|
||||||
lock (@lock)
|
|
||||||
{
|
|
||||||
networks.Clear();
|
|
||||||
|
|
||||||
foreach (var accessPoint in wifi.GetAccessPoints())
|
|
||||||
{
|
|
||||||
// The user may only connect to an already configured wireless network!
|
|
||||||
if (accessPoint.HasProfile)
|
|
||||||
{
|
|
||||||
networks.Add(ToDefinition(accessPoint));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void StartTimer()
|
|
||||||
{
|
|
||||||
const int FIVE_SECONDS = 5000;
|
|
||||||
|
|
||||||
timer = new Timer(FIVE_SECONDS);
|
|
||||||
timer.Elapsed += Timer_Elapsed;
|
|
||||||
timer.AutoReset = true;
|
|
||||||
timer.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private WirelessNetworkDefinition ToDefinition(AccessPoint accessPoint)
|
|
||||||
{
|
|
||||||
return new WirelessNetworkDefinition
|
|
||||||
{
|
|
||||||
AccessPoint = accessPoint,
|
|
||||||
Name = accessPoint.Name,
|
|
||||||
SignalStrength = Convert.ToInt32(accessPoint.SignalStrength),
|
|
||||||
Status = accessPoint.IsConnected ? WirelessNetworkStatus.Connected : WirelessNetworkStatus.Disconnected
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private WirelessNetworkStatus ToStatus(WifiStatus status)
|
|
||||||
{
|
|
||||||
return status == WifiStatus.Connected ? WirelessNetworkStatus.Connected : WirelessNetworkStatus.Disconnected;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,206 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 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;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Timers;
|
||||||
|
using SafeExamBrowser.I18n.Contracts;
|
||||||
|
using SafeExamBrowser.Logging.Contracts;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork.Events;
|
||||||
|
using SimpleWifi;
|
||||||
|
using SimpleWifi.Win32;
|
||||||
|
using SimpleWifi.Win32.Interop;
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.SystemComponents.WirelessNetwork
|
||||||
|
{
|
||||||
|
public class WirelessAdapter : IWirelessAdapter
|
||||||
|
{
|
||||||
|
private readonly object @lock = new object();
|
||||||
|
|
||||||
|
private List<WirelessNetwork> networks;
|
||||||
|
private ILogger logger;
|
||||||
|
private IText text;
|
||||||
|
private Timer timer;
|
||||||
|
private Wifi wifi;
|
||||||
|
|
||||||
|
public bool IsAvailable { get; private set; }
|
||||||
|
|
||||||
|
public event NetworksChangedEventHandler NetworksChanged;
|
||||||
|
public event StatusChangedEventHandler StatusChanged;
|
||||||
|
|
||||||
|
public WirelessAdapter(ILogger logger, IText text)
|
||||||
|
{
|
||||||
|
this.logger = logger;
|
||||||
|
this.networks = new List<WirelessNetwork>();
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Connect(Guid id)
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
{
|
||||||
|
var network = networks.FirstOrDefault(n => n.Id == id);
|
||||||
|
|
||||||
|
if (network != default(WirelessNetwork))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var request = new AuthRequest(network.AccessPoint);
|
||||||
|
|
||||||
|
logger.Info($"Attempting to connect to '{network.Name}'...");
|
||||||
|
network.AccessPoint.ConnectAsync(request, false, (success) => AccessPoint_OnConnectCompleted(network.Name, success));
|
||||||
|
StatusChanged?.Invoke(WirelessNetworkStatus.Connecting);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
logger.Error($"Failed to connect to wireless network '{network.Name}!'", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Warn($"Could not find network with id '{id}'!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<IWirelessNetwork> GetNetworks()
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
{
|
||||||
|
return new List<WirelessNetwork>(networks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
const int FIVE_SECONDS = 5000;
|
||||||
|
|
||||||
|
wifi = new Wifi();
|
||||||
|
wifi.ConnectionStatusChanged += Wifi_ConnectionStatusChanged;
|
||||||
|
IsAvailable = !wifi.NoWifiAvailable && !IsTurnedOff();
|
||||||
|
|
||||||
|
if (IsAvailable)
|
||||||
|
{
|
||||||
|
UpdateAvailableNetworks();
|
||||||
|
|
||||||
|
timer = new Timer(FIVE_SECONDS);
|
||||||
|
timer.Elapsed += Timer_Elapsed;
|
||||||
|
timer.AutoReset = true;
|
||||||
|
timer.Start();
|
||||||
|
|
||||||
|
logger.Info("Started monitoring the wireless network adapter.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Info("Wireless networks cannot be monitored, as there is no hardware adapter available or it is turned off.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Terminate()
|
||||||
|
{
|
||||||
|
if (timer != null)
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
logger.Info("Stopped monitoring the wireless network adapter.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AccessPoint_OnConnectCompleted(string name, bool success)
|
||||||
|
{
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
logger.Info($"Successfully connected to wireless network '{name}'.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Error($"Failed to connect to wireless network '{name}!'");
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateAvailableNetworks();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
|
||||||
|
{
|
||||||
|
UpdateAvailableNetworks();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Wifi_ConnectionStatusChanged(object sender, WifiStatusEventArgs e)
|
||||||
|
{
|
||||||
|
UpdateAvailableNetworks();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsTurnedOff()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var client = new WlanClient();
|
||||||
|
|
||||||
|
foreach (var @interface in client.Interfaces)
|
||||||
|
{
|
||||||
|
foreach (var state in @interface.RadioState.PhyRadioState)
|
||||||
|
{
|
||||||
|
if (state.dot11SoftwareRadioState == Dot11RadioState.On && state.dot11HardwareRadioState == Dot11RadioState.On)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
logger.Error("Failed to determine the radio state of the wireless adapter(s)! Assuming it is (all are) turned off...", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateAvailableNetworks()
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
networks.Clear();
|
||||||
|
|
||||||
|
foreach (var accessPoint in wifi.GetAccessPoints())
|
||||||
|
{
|
||||||
|
// The user may only connect to an already configured wireless network!
|
||||||
|
if (accessPoint.HasProfile)
|
||||||
|
{
|
||||||
|
networks.Add(ToNetwork(accessPoint));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworksChanged?.Invoke();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
logger.Error("Failed to update available networks!", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private WirelessNetwork ToNetwork(AccessPoint accessPoint)
|
||||||
|
{
|
||||||
|
return new WirelessNetwork
|
||||||
|
{
|
||||||
|
AccessPoint = accessPoint,
|
||||||
|
Name = accessPoint.Name,
|
||||||
|
SignalStrength = Convert.ToInt32(accessPoint.SignalStrength),
|
||||||
|
Status = accessPoint.IsConnected ? WirelessNetworkStatus.Connected : WirelessNetworkStatus.Disconnected
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private WirelessNetworkStatus ToStatus(WifiStatus status)
|
||||||
|
{
|
||||||
|
return status == WifiStatus.Connected ? WirelessNetworkStatus.Connected : WirelessNetworkStatus.Disconnected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,12 +7,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SimpleWifi;
|
using SimpleWifi;
|
||||||
|
|
||||||
namespace SafeExamBrowser.SystemComponents
|
namespace SafeExamBrowser.SystemComponents.WirelessNetwork
|
||||||
{
|
{
|
||||||
internal class WirelessNetworkDefinition : IWirelessNetwork
|
internal class WirelessNetwork : IWirelessNetwork
|
||||||
{
|
{
|
||||||
internal AccessPoint AccessPoint { get; set; }
|
internal AccessPoint AccessPoint { get; set; }
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ namespace SafeExamBrowser.SystemComponents
|
||||||
public int SignalStrength { get; set; }
|
public int SignalStrength { get; set; }
|
||||||
public WirelessNetworkStatus Status { get; set; }
|
public WirelessNetworkStatus Status { get; set; }
|
||||||
|
|
||||||
public WirelessNetworkDefinition()
|
public WirelessNetwork()
|
||||||
{
|
{
|
||||||
Id = Guid.NewGuid();
|
Id = Guid.NewGuid();
|
||||||
}
|
}
|
|
@ -15,6 +15,7 @@ using SafeExamBrowser.Logging.Contracts;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Browser;
|
using SafeExamBrowser.UserInterface.Contracts.Browser;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Windows;
|
using SafeExamBrowser.UserInterface.Contracts.Windows;
|
||||||
|
@ -90,6 +91,6 @@ namespace SafeExamBrowser.UserInterface.Contracts
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a system control which allows to change the wireless network connection of the computer.
|
/// Creates a system control which allows to change the wireless network connection of the computer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
ISystemWirelessNetworkControl CreateWirelessNetworkControl(Location location);
|
ISystemControl CreateWirelessNetworkControl(IWirelessAdapter wirelessAdapter, Location location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,6 @@
|
||||||
<Compile Include="Shell\IApplicationControl.cs" />
|
<Compile Include="Shell\IApplicationControl.cs" />
|
||||||
<Compile Include="Shell\INotificationControl.cs" />
|
<Compile Include="Shell\INotificationControl.cs" />
|
||||||
<Compile Include="Shell\ISystemControl.cs" />
|
<Compile Include="Shell\ISystemControl.cs" />
|
||||||
<Compile Include="Shell\ISystemWirelessNetworkControl.cs" />
|
|
||||||
<Compile Include="Shell\ITaskbar.cs" />
|
<Compile Include="Shell\ITaskbar.cs" />
|
||||||
<Compile Include="Shell\Location.cs" />
|
<Compile Include="Shell\Location.cs" />
|
||||||
<Compile Include="Windows\Events\WindowClosingEventHandler.cs" />
|
<Compile Include="Windows\Events\WindowClosingEventHandler.cs" />
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 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 SafeExamBrowser.UserInterface.Contracts.Shell.Events;
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.UserInterface.Contracts.Shell
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The control of the wireless network system component.
|
|
||||||
/// </summary>
|
|
||||||
public interface ISystemWirelessNetworkControl : ISystemControl
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Defines whether the computer has a wireless network adapter.
|
|
||||||
/// </summary>
|
|
||||||
bool HasWirelessNetworkAdapter { set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Indicates to the user that a wireless network connection is being established.
|
|
||||||
/// </summary>
|
|
||||||
bool IsConnecting { set; }
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
///// <summary>
|
|
||||||
///// Sets the current wireless network status.
|
|
||||||
///// </summary>
|
|
||||||
//WirelessNetworkStatus NetworkStatus { set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Event fired when the user selected a wireless network.
|
|
||||||
/// </summary>
|
|
||||||
event WirelessNetworkSelectedEventHandler NetworkSelected;
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
///// <summary>
|
|
||||||
///// Updates the list of available networks.
|
|
||||||
///// </summary>
|
|
||||||
//void Update(IEnumerable<IWirelessNetwork> networks);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -34,10 +34,10 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
||||||
this.layout = layout;
|
this.layout = layout;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeEvents();
|
InitializeLayoutButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeEvents()
|
private void InitializeLayoutButton()
|
||||||
{
|
{
|
||||||
Button.Click += (o, args) => LayoutSelected?.Invoke(this, EventArgs.Empty);
|
Button.Click += (o, args) => LayoutSelected?.Invoke(this, EventArgs.Empty);
|
||||||
CultureCodeTextBlock.Text = layout.CultureCode;
|
CultureCodeTextBlock.Text = layout.CultureCode;
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell.Events;
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
||||||
{
|
{
|
||||||
|
@ -17,34 +17,22 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
||||||
{
|
{
|
||||||
private IWirelessNetwork network;
|
private IWirelessNetwork network;
|
||||||
|
|
||||||
public bool IsCurrent
|
public event EventHandler NetworkSelected;
|
||||||
{
|
|
||||||
set { IsCurrentTextBlock.Visibility = value ? Visibility.Visible : Visibility.Hidden; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string NetworkName
|
|
||||||
{
|
|
||||||
set { NetworkNameTextBlock.Text = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int SignalStrength
|
|
||||||
{
|
|
||||||
set { SignalStrengthTextBlock.Text = $"{value}%"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public event WirelessNetworkSelectedEventHandler NetworkSelected;
|
|
||||||
|
|
||||||
public ActionCenterWirelessNetworkButton(IWirelessNetwork network)
|
public ActionCenterWirelessNetworkButton(IWirelessNetwork network)
|
||||||
{
|
{
|
||||||
this.network = network;
|
this.network = network;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeEvents();
|
InitializeNetworkButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeEvents()
|
private void InitializeNetworkButton()
|
||||||
{
|
{
|
||||||
Button.Click += (o, args) => NetworkSelected?.Invoke(network.Id);
|
Button.Click += (o, args) => NetworkSelected?.Invoke(this, EventArgs.Empty);
|
||||||
|
IsCurrentTextBlock.Visibility = network.Status == WirelessNetworkStatus.Connected ? Visibility.Visible : Visibility.Hidden;
|
||||||
|
NetworkNameTextBlock.Text = network.Name;
|
||||||
|
SignalStrengthTextBlock.Text = $"{network.SignalStrength}%";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,112 +7,35 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using FontAwesome.WPF;
|
using FontAwesome.WPF;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.I18n.Contracts;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell.Events;
|
|
||||||
using SafeExamBrowser.UserInterface.Shared.Utilities;
|
using SafeExamBrowser.UserInterface.Shared.Utilities;
|
||||||
|
|
||||||
namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
||||||
{
|
{
|
||||||
public partial class ActionCenterWirelessNetworkControl : UserControl, ISystemWirelessNetworkControl
|
public partial class ActionCenterWirelessNetworkControl : UserControl, ISystemControl
|
||||||
{
|
{
|
||||||
public bool HasWirelessNetworkAdapter
|
private IWirelessAdapter wirelessAdapter;
|
||||||
|
private IText text;
|
||||||
|
|
||||||
|
public ActionCenterWirelessNetworkControl(IWirelessAdapter wirelessAdapter, IText text)
|
||||||
{
|
{
|
||||||
set
|
this.wirelessAdapter = wirelessAdapter;
|
||||||
{
|
this.text = text;
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
Button.IsEnabled = value;
|
|
||||||
NoAdapterIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsConnecting
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
LoadingIcon.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
|
|
||||||
SignalStrengthIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
NetworkStatusIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public WirelessNetworkStatus NetworkStatus
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
var icon = value == WirelessNetworkStatus.Connected ? FontAwesomeIcon.Check : FontAwesomeIcon.Close;
|
|
||||||
var brush = value == WirelessNetworkStatus.Connected ? Brushes.Green : Brushes.Orange;
|
|
||||||
|
|
||||||
if (value == WirelessNetworkStatus.Disconnected)
|
|
||||||
{
|
|
||||||
SignalStrengthIcon.Child = GetIcon(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(icon, brush);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public event WirelessNetworkSelectedEventHandler NetworkSelected;
|
|
||||||
|
|
||||||
public ActionCenterWirelessNetworkControl()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeWirelessNetworkControl();
|
InitializeWirelessNetworkControl();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
{
|
{
|
||||||
Dispatcher.Invoke(() => Popup.IsOpen = false);
|
Dispatcher.InvokeAsync(() => Popup.IsOpen = false);
|
||||||
}
|
|
||||||
|
|
||||||
public void SetInformation(string text)
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
Button.ToolTip = text;
|
|
||||||
Text.Text = text;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update(IEnumerable<IWirelessNetwork> networks)
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
NetworksStackPanel.Children.Clear();
|
|
||||||
|
|
||||||
foreach (var network in networks)
|
|
||||||
{
|
|
||||||
var button = new ActionCenterWirelessNetworkButton(network);
|
|
||||||
var isCurrent = network.Status == WirelessNetworkStatus.Connected;
|
|
||||||
|
|
||||||
button.IsCurrent = isCurrent;
|
|
||||||
button.NetworkName = network.Name;
|
|
||||||
button.SignalStrength = network.SignalStrength;
|
|
||||||
button.NetworkSelected += (id) => NetworkSelected?.Invoke(id);
|
|
||||||
|
|
||||||
if (isCurrent)
|
|
||||||
{
|
|
||||||
NetworkStatus = network.Status;
|
|
||||||
SignalStrengthIcon.Child = GetIcon(network.SignalStrength);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworksStackPanel.Children.Add(button);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeWirelessNetworkControl()
|
private void InitializeWirelessNetworkControl()
|
||||||
|
@ -125,6 +48,85 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
||||||
Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver));
|
Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver));
|
||||||
Popup.Opened += (o, args) => Grid.Background = Brushes.Gray;
|
Popup.Opened += (o, args) => Grid.Background = Brushes.Gray;
|
||||||
Popup.Closed += (o, args) => Grid.Background = originalBrush;
|
Popup.Closed += (o, args) => Grid.Background = originalBrush;
|
||||||
|
|
||||||
|
if (wirelessAdapter.IsAvailable)
|
||||||
|
{
|
||||||
|
wirelessAdapter.NetworksChanged += WirelessAdapter_NetworksChanged;
|
||||||
|
wirelessAdapter.StatusChanged += WirelessAdapter_StatusChanged;
|
||||||
|
UpdateNetworks();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Button.IsEnabled = false;
|
||||||
|
NoAdapterIcon.Visibility = Visibility.Visible;
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessNotAvailable));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WirelessAdapter_NetworksChanged()
|
||||||
|
{
|
||||||
|
Dispatcher.InvokeAsync(UpdateNetworks);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WirelessAdapter_StatusChanged(WirelessNetworkStatus status)
|
||||||
|
{
|
||||||
|
Dispatcher.InvokeAsync(() => UpdateStatus(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateNetworks()
|
||||||
|
{
|
||||||
|
var status = WirelessNetworkStatus.Disconnected;
|
||||||
|
|
||||||
|
NetworksStackPanel.Children.Clear();
|
||||||
|
|
||||||
|
foreach (var network in wirelessAdapter.GetNetworks())
|
||||||
|
{
|
||||||
|
var button = new ActionCenterWirelessNetworkButton(network);
|
||||||
|
|
||||||
|
button.NetworkSelected += (o, args) => wirelessAdapter.Connect(network.Id);
|
||||||
|
|
||||||
|
if (network.Status == WirelessNetworkStatus.Connected)
|
||||||
|
{
|
||||||
|
status = WirelessNetworkStatus.Connected;
|
||||||
|
SignalStrengthIcon.Child = GetIcon(network.SignalStrength);
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessConnected).Replace("%%NAME%%", network.Name));
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworksStackPanel.Children.Add(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateStatus(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateStatus(WirelessNetworkStatus status)
|
||||||
|
{
|
||||||
|
LoadingIcon.Visibility = Visibility.Collapsed;
|
||||||
|
SignalStrengthIcon.Visibility = Visibility.Visible;
|
||||||
|
NetworkStatusIcon.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case WirelessNetworkStatus.Connected:
|
||||||
|
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(FontAwesomeIcon.Check, Brushes.Green);
|
||||||
|
break;
|
||||||
|
case WirelessNetworkStatus.Connecting:
|
||||||
|
LoadingIcon.Visibility = Visibility.Visible;
|
||||||
|
SignalStrengthIcon.Visibility = Visibility.Collapsed;
|
||||||
|
NetworkStatusIcon.Visibility = Visibility.Collapsed;
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessConnecting));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(FontAwesomeIcon.Close, Brushes.Orange);
|
||||||
|
SignalStrengthIcon.Child = GetIcon(0);
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessDisconnected));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateText(string text)
|
||||||
|
{
|
||||||
|
Button.ToolTip = text;
|
||||||
|
Text.Text = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
private UIElement GetIcon(int signalStrength)
|
private UIElement GetIcon(int signalStrength)
|
||||||
|
|
|
@ -6,45 +6,33 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell.Events;
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
||||||
{
|
{
|
||||||
public partial class TaskbarWirelessNetworkButton : UserControl
|
public partial class TaskbarWirelessNetworkButton : UserControl
|
||||||
{
|
{
|
||||||
private readonly IWirelessNetwork network;
|
private IWirelessNetwork network;
|
||||||
|
|
||||||
public bool IsCurrent
|
public event EventHandler NetworkSelected;
|
||||||
{
|
|
||||||
set { IsCurrentTextBlock.Visibility = value ? Visibility.Visible : Visibility.Hidden; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string NetworkName
|
|
||||||
{
|
|
||||||
set { NetworkNameTextBlock.Text = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int SignalStrength
|
|
||||||
{
|
|
||||||
set { SignalStrengthTextBlock.Text = $"{value}%"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public event WirelessNetworkSelectedEventHandler NetworkSelected;
|
|
||||||
|
|
||||||
public TaskbarWirelessNetworkButton(IWirelessNetwork network)
|
public TaskbarWirelessNetworkButton(IWirelessNetwork network)
|
||||||
{
|
{
|
||||||
this.network = network;
|
this.network = network;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeEvents();
|
InitializeNetworkButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeEvents()
|
private void InitializeNetworkButton()
|
||||||
{
|
{
|
||||||
Button.Click += (o, args) => NetworkSelected?.Invoke(network.Id);
|
Button.Click += (o, args) => NetworkSelected?.Invoke(this, EventArgs.Empty);
|
||||||
|
IsCurrentTextBlock.Visibility = network.Status == WirelessNetworkStatus.Connected ? Visibility.Visible : Visibility.Hidden;
|
||||||
|
NetworkNameTextBlock.Text = network.Name;
|
||||||
|
SignalStrengthTextBlock.Text = $"{network.SignalStrength}%";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,108 +7,35 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using FontAwesome.WPF;
|
using FontAwesome.WPF;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.I18n.Contracts;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell.Events;
|
|
||||||
using SafeExamBrowser.UserInterface.Shared.Utilities;
|
using SafeExamBrowser.UserInterface.Shared.Utilities;
|
||||||
|
|
||||||
namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
||||||
{
|
{
|
||||||
public partial class TaskbarWirelessNetworkControl : UserControl, ISystemWirelessNetworkControl
|
public partial class TaskbarWirelessNetworkControl : UserControl, ISystemControl
|
||||||
{
|
{
|
||||||
public bool HasWirelessNetworkAdapter
|
private IWirelessAdapter wirelessAdapter;
|
||||||
|
private IText text;
|
||||||
|
|
||||||
|
public TaskbarWirelessNetworkControl(IWirelessAdapter wirelessAdapter, IText text)
|
||||||
{
|
{
|
||||||
set
|
this.wirelessAdapter = wirelessAdapter;
|
||||||
{
|
this.text = text;
|
||||||
Dispatcher.InvokeAsync(() =>
|
|
||||||
{
|
|
||||||
Button.IsEnabled = value;
|
|
||||||
NoAdapterIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsConnecting
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
LoadingIcon.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
|
|
||||||
SignalStrengthIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
NetworkStatusIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public WirelessNetworkStatus NetworkStatus
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Dispatcher.InvokeAsync(() =>
|
|
||||||
{
|
|
||||||
var icon = value == WirelessNetworkStatus.Connected ? FontAwesomeIcon.Check : FontAwesomeIcon.Close;
|
|
||||||
var brush = value == WirelessNetworkStatus.Connected ? Brushes.Green : Brushes.Orange;
|
|
||||||
|
|
||||||
if (value == WirelessNetworkStatus.Disconnected)
|
|
||||||
{
|
|
||||||
SignalStrengthIcon.Child = GetIcon(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(icon, brush);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public event WirelessNetworkSelectedEventHandler NetworkSelected;
|
|
||||||
|
|
||||||
public TaskbarWirelessNetworkControl()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeWirelessNetworkControl();
|
InitializeWirelessNetworkControl();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
{
|
{
|
||||||
Popup.IsOpen = false;
|
Dispatcher.InvokeAsync(() => Popup.IsOpen = false);
|
||||||
}
|
|
||||||
|
|
||||||
public void SetInformation(string text)
|
|
||||||
{
|
|
||||||
Dispatcher.InvokeAsync(() => Button.ToolTip = text);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update(IEnumerable<IWirelessNetwork> networks)
|
|
||||||
{
|
|
||||||
Dispatcher.InvokeAsync(() =>
|
|
||||||
{
|
|
||||||
NetworksStackPanel.Children.Clear();
|
|
||||||
|
|
||||||
foreach (var network in networks)
|
|
||||||
{
|
|
||||||
var button = new TaskbarWirelessNetworkButton(network);
|
|
||||||
var isCurrent = network.Status == WirelessNetworkStatus.Connected;
|
|
||||||
|
|
||||||
button.IsCurrent = isCurrent;
|
|
||||||
button.NetworkName = network.Name;
|
|
||||||
button.SignalStrength = network.SignalStrength;
|
|
||||||
button.NetworkSelected += (id) => NetworkSelected?.Invoke(id);
|
|
||||||
|
|
||||||
if (isCurrent)
|
|
||||||
{
|
|
||||||
NetworkStatus = network.Status;
|
|
||||||
SignalStrengthIcon.Child = GetIcon(network.SignalStrength);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworksStackPanel.Children.Add(button);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeWirelessNetworkControl()
|
private void InitializeWirelessNetworkControl()
|
||||||
|
@ -131,6 +58,84 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls
|
||||||
Background = originalBrush;
|
Background = originalBrush;
|
||||||
Button.Background = originalBrush;
|
Button.Background = originalBrush;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (wirelessAdapter.IsAvailable)
|
||||||
|
{
|
||||||
|
wirelessAdapter.NetworksChanged += WirelessAdapter_NetworksChanged;
|
||||||
|
wirelessAdapter.StatusChanged += WirelessAdapter_StatusChanged;
|
||||||
|
UpdateNetworks();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Button.IsEnabled = false;
|
||||||
|
NoAdapterIcon.Visibility = Visibility.Visible;
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessNotAvailable));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WirelessAdapter_NetworksChanged()
|
||||||
|
{
|
||||||
|
Dispatcher.InvokeAsync(UpdateNetworks);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WirelessAdapter_StatusChanged(WirelessNetworkStatus status)
|
||||||
|
{
|
||||||
|
Dispatcher.InvokeAsync(() => UpdateStatus(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateNetworks()
|
||||||
|
{
|
||||||
|
var status = WirelessNetworkStatus.Disconnected;
|
||||||
|
|
||||||
|
NetworksStackPanel.Children.Clear();
|
||||||
|
|
||||||
|
foreach (var network in wirelessAdapter.GetNetworks())
|
||||||
|
{
|
||||||
|
var button = new TaskbarWirelessNetworkButton(network);
|
||||||
|
|
||||||
|
button.NetworkSelected += (o, args) => wirelessAdapter.Connect(network.Id);
|
||||||
|
|
||||||
|
if (network.Status == WirelessNetworkStatus.Connected)
|
||||||
|
{
|
||||||
|
status = WirelessNetworkStatus.Connected;
|
||||||
|
SignalStrengthIcon.Child = GetIcon(network.SignalStrength);
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessConnected).Replace("%%NAME%%", network.Name));
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworksStackPanel.Children.Add(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateStatus(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateStatus(WirelessNetworkStatus status)
|
||||||
|
{
|
||||||
|
LoadingIcon.Visibility = Visibility.Collapsed;
|
||||||
|
SignalStrengthIcon.Visibility = Visibility.Visible;
|
||||||
|
NetworkStatusIcon.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case WirelessNetworkStatus.Connected:
|
||||||
|
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(FontAwesomeIcon.Check, Brushes.Green);
|
||||||
|
break;
|
||||||
|
case WirelessNetworkStatus.Connecting:
|
||||||
|
LoadingIcon.Visibility = Visibility.Visible;
|
||||||
|
SignalStrengthIcon.Visibility = Visibility.Collapsed;
|
||||||
|
NetworkStatusIcon.Visibility = Visibility.Collapsed;
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessConnecting));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(FontAwesomeIcon.Close, Brushes.Orange);
|
||||||
|
SignalStrengthIcon.Child = GetIcon(0);
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessDisconnected));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateText(string text)
|
||||||
|
{
|
||||||
|
Button.ToolTip = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
private UIElement GetIcon(int signalStrength)
|
private UIElement GetIcon(int signalStrength)
|
||||||
|
|
|
@ -19,6 +19,7 @@ using SafeExamBrowser.Logging.Contracts;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts;
|
using SafeExamBrowser.UserInterface.Contracts;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Browser;
|
using SafeExamBrowser.UserInterface.Contracts.Browser;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
|
@ -172,15 +173,15 @@ namespace SafeExamBrowser.UserInterface.Desktop
|
||||||
return splashScreen;
|
return splashScreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ISystemWirelessNetworkControl CreateWirelessNetworkControl(Location location)
|
public ISystemControl CreateWirelessNetworkControl(IWirelessAdapter wirelessAdapter, Location location)
|
||||||
{
|
{
|
||||||
if (location == Location.ActionCenter)
|
if (location == Location.ActionCenter)
|
||||||
{
|
{
|
||||||
return new ActionCenterWirelessNetworkControl();
|
return new ActionCenterWirelessNetworkControl(wirelessAdapter, text);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new TaskbarWirelessNetworkControl();
|
return new TaskbarWirelessNetworkControl(wirelessAdapter, text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,10 +34,10 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
||||||
this.layout = layout;
|
this.layout = layout;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeEvents();
|
InitializeLayoutButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeEvents()
|
private void InitializeLayoutButton()
|
||||||
{
|
{
|
||||||
Button.Click += (o, args) => LayoutSelected?.Invoke(this, EventArgs.Empty);
|
Button.Click += (o, args) => LayoutSelected?.Invoke(this, EventArgs.Empty);
|
||||||
CultureCodeTextBlock.Text = layout.CultureCode;
|
CultureCodeTextBlock.Text = layout.CultureCode;
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell.Events;
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
||||||
{
|
{
|
||||||
|
@ -17,34 +17,22 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
||||||
{
|
{
|
||||||
private IWirelessNetwork network;
|
private IWirelessNetwork network;
|
||||||
|
|
||||||
public bool IsCurrent
|
public event EventHandler NetworkSelected;
|
||||||
{
|
|
||||||
set { IsCurrentTextBlock.Visibility = value ? Visibility.Visible : Visibility.Hidden; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string NetworkName
|
|
||||||
{
|
|
||||||
set { NetworkNameTextBlock.Text = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int SignalStrength
|
|
||||||
{
|
|
||||||
set { SignalStrengthTextBlock.Text = $"{value}%"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public event WirelessNetworkSelectedEventHandler NetworkSelected;
|
|
||||||
|
|
||||||
public ActionCenterWirelessNetworkButton(IWirelessNetwork network)
|
public ActionCenterWirelessNetworkButton(IWirelessNetwork network)
|
||||||
{
|
{
|
||||||
this.network = network;
|
this.network = network;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeEvents();
|
InitializeNetworkButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeEvents()
|
private void InitializeNetworkButton()
|
||||||
{
|
{
|
||||||
Button.Click += (o, args) => NetworkSelected?.Invoke(network.Id);
|
Button.Click += (o, args) => NetworkSelected?.Invoke(this, EventArgs.Empty);
|
||||||
|
IsCurrentTextBlock.Visibility = network.Status == WirelessNetworkStatus.Connected ? Visibility.Visible : Visibility.Hidden;
|
||||||
|
NetworkNameTextBlock.Text = network.Name;
|
||||||
|
SignalStrengthTextBlock.Text = $"{network.SignalStrength}%";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,112 +7,35 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using FontAwesome.WPF;
|
using FontAwesome.WPF;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.I18n.Contracts;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell.Events;
|
|
||||||
using SafeExamBrowser.UserInterface.Shared.Utilities;
|
using SafeExamBrowser.UserInterface.Shared.Utilities;
|
||||||
|
|
||||||
namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
||||||
{
|
{
|
||||||
public partial class ActionCenterWirelessNetworkControl : UserControl, ISystemWirelessNetworkControl
|
public partial class ActionCenterWirelessNetworkControl : UserControl, ISystemControl
|
||||||
{
|
{
|
||||||
public bool HasWirelessNetworkAdapter
|
private IWirelessAdapter wirelessAdapter;
|
||||||
|
private IText text;
|
||||||
|
|
||||||
|
public ActionCenterWirelessNetworkControl(IWirelessAdapter wirelessAdapter, IText text)
|
||||||
{
|
{
|
||||||
set
|
this.wirelessAdapter = wirelessAdapter;
|
||||||
{
|
this.text = text;
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
Button.IsEnabled = value;
|
|
||||||
NoAdapterIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsConnecting
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
LoadingIcon.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
|
|
||||||
SignalStrengthIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
NetworkStatusIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public WirelessNetworkStatus NetworkStatus
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
var icon = value == WirelessNetworkStatus.Connected ? FontAwesomeIcon.Check : FontAwesomeIcon.Close;
|
|
||||||
var brush = value == WirelessNetworkStatus.Connected ? Brushes.Green : Brushes.Orange;
|
|
||||||
|
|
||||||
if (value == WirelessNetworkStatus.Disconnected)
|
|
||||||
{
|
|
||||||
SignalStrengthIcon.Child = GetIcon(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(icon, brush);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public event WirelessNetworkSelectedEventHandler NetworkSelected;
|
|
||||||
|
|
||||||
public ActionCenterWirelessNetworkControl()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeWirelessNetworkControl();
|
InitializeWirelessNetworkControl();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
{
|
{
|
||||||
Dispatcher.Invoke(() => Popup.IsOpen = false);
|
Dispatcher.InvokeAsync(() => Popup.IsOpen = false);
|
||||||
}
|
|
||||||
|
|
||||||
public void SetInformation(string text)
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
Button.ToolTip = text;
|
|
||||||
Text.Text = text;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update(IEnumerable<IWirelessNetwork> networks)
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
NetworksStackPanel.Children.Clear();
|
|
||||||
|
|
||||||
foreach (var network in networks)
|
|
||||||
{
|
|
||||||
var button = new ActionCenterWirelessNetworkButton(network);
|
|
||||||
var isCurrent = network.Status == WirelessNetworkStatus.Connected;
|
|
||||||
|
|
||||||
button.IsCurrent = isCurrent;
|
|
||||||
button.NetworkName = network.Name;
|
|
||||||
button.SignalStrength = network.SignalStrength;
|
|
||||||
button.NetworkSelected += (id) => NetworkSelected?.Invoke(id);
|
|
||||||
|
|
||||||
if (isCurrent)
|
|
||||||
{
|
|
||||||
NetworkStatus = network.Status;
|
|
||||||
SignalStrengthIcon.Child = GetIcon(network.SignalStrength);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworksStackPanel.Children.Add(button);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeWirelessNetworkControl()
|
private void InitializeWirelessNetworkControl()
|
||||||
|
@ -125,12 +48,91 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
||||||
Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver));
|
Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver));
|
||||||
Popup.Opened += (o, args) => Grid.Background = Brushes.Gray;
|
Popup.Opened += (o, args) => Grid.Background = Brushes.Gray;
|
||||||
Popup.Closed += (o, args) => Grid.Background = originalBrush;
|
Popup.Closed += (o, args) => Grid.Background = originalBrush;
|
||||||
|
|
||||||
|
if (wirelessAdapter.IsAvailable)
|
||||||
|
{
|
||||||
|
wirelessAdapter.NetworksChanged += WirelessAdapter_NetworksChanged;
|
||||||
|
wirelessAdapter.StatusChanged += WirelessAdapter_StatusChanged;
|
||||||
|
UpdateNetworks();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Button.IsEnabled = false;
|
||||||
|
NoAdapterIcon.Visibility = Visibility.Visible;
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessNotAvailable));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WirelessAdapter_NetworksChanged()
|
||||||
|
{
|
||||||
|
Dispatcher.InvokeAsync(UpdateNetworks);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WirelessAdapter_StatusChanged(WirelessNetworkStatus status)
|
||||||
|
{
|
||||||
|
Dispatcher.InvokeAsync(() => UpdateStatus(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateNetworks()
|
||||||
|
{
|
||||||
|
var status = WirelessNetworkStatus.Disconnected;
|
||||||
|
|
||||||
|
NetworksStackPanel.Children.Clear();
|
||||||
|
|
||||||
|
foreach (var network in wirelessAdapter.GetNetworks())
|
||||||
|
{
|
||||||
|
var button = new ActionCenterWirelessNetworkButton(network);
|
||||||
|
|
||||||
|
button.NetworkSelected += (o, args) => wirelessAdapter.Connect(network.Id);
|
||||||
|
|
||||||
|
if (network.Status == WirelessNetworkStatus.Connected)
|
||||||
|
{
|
||||||
|
status = WirelessNetworkStatus.Connected;
|
||||||
|
SignalStrengthIcon.Child = GetIcon(network.SignalStrength);
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessConnected).Replace("%%NAME%%", network.Name));
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworksStackPanel.Children.Add(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateStatus(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateStatus(WirelessNetworkStatus status)
|
||||||
|
{
|
||||||
|
LoadingIcon.Visibility = Visibility.Collapsed;
|
||||||
|
SignalStrengthIcon.Visibility = Visibility.Visible;
|
||||||
|
NetworkStatusIcon.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case WirelessNetworkStatus.Connected:
|
||||||
|
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(FontAwesomeIcon.Check, Brushes.Green);
|
||||||
|
break;
|
||||||
|
case WirelessNetworkStatus.Connecting:
|
||||||
|
LoadingIcon.Visibility = Visibility.Visible;
|
||||||
|
SignalStrengthIcon.Visibility = Visibility.Collapsed;
|
||||||
|
NetworkStatusIcon.Visibility = Visibility.Collapsed;
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessConnecting));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(FontAwesomeIcon.Close, Brushes.Orange);
|
||||||
|
SignalStrengthIcon.Child = GetIcon(0);
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessDisconnected));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateText(string text)
|
||||||
|
{
|
||||||
|
Button.ToolTip = text;
|
||||||
|
Text.Text = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
private UIElement GetIcon(int signalStrength)
|
private UIElement GetIcon(int signalStrength)
|
||||||
{
|
{
|
||||||
var icon = signalStrength > 66 ? "100" : (signalStrength > 33 ? "66" : (signalStrength > 0 ? "33" : "0"));
|
var icon = signalStrength > 66 ? "100" : (signalStrength > 33 ? "66" : (signalStrength > 0 ? "33" : "0"));
|
||||||
var uri = new Uri($"pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/WiFi_Light_{icon}.xaml");
|
var uri = new Uri($"pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/WiFi_Light_{icon}.xaml");
|
||||||
var resource = new XamlIconResource(uri);
|
var resource = new XamlIconResource(uri);
|
||||||
|
|
||||||
return IconResourceLoader.Load(resource);
|
return IconResourceLoader.Load(resource);
|
||||||
|
|
|
@ -6,45 +6,33 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell.Events;
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
||||||
{
|
{
|
||||||
public partial class TaskbarWirelessNetworkButton : UserControl
|
public partial class TaskbarWirelessNetworkButton : UserControl
|
||||||
{
|
{
|
||||||
private readonly IWirelessNetwork network;
|
private IWirelessNetwork network;
|
||||||
|
|
||||||
public bool IsCurrent
|
public event EventHandler NetworkSelected;
|
||||||
{
|
|
||||||
set { IsCurrentTextBlock.Visibility = value ? Visibility.Visible : Visibility.Hidden; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string NetworkName
|
|
||||||
{
|
|
||||||
set { NetworkNameTextBlock.Text = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int SignalStrength
|
|
||||||
{
|
|
||||||
set { SignalStrengthTextBlock.Text = $"{value}%"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public event WirelessNetworkSelectedEventHandler NetworkSelected;
|
|
||||||
|
|
||||||
public TaskbarWirelessNetworkButton(IWirelessNetwork network)
|
public TaskbarWirelessNetworkButton(IWirelessNetwork network)
|
||||||
{
|
{
|
||||||
this.network = network;
|
this.network = network;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeEvents();
|
InitializeNetworkButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeEvents()
|
private void InitializeNetworkButton()
|
||||||
{
|
{
|
||||||
Button.Click += (o, args) => NetworkSelected?.Invoke(network.Id);
|
Button.Click += (o, args) => NetworkSelected?.Invoke(this, EventArgs.Empty);
|
||||||
|
IsCurrentTextBlock.Visibility = network.Status == WirelessNetworkStatus.Connected ? Visibility.Visible : Visibility.Hidden;
|
||||||
|
NetworkNameTextBlock.Text = network.Name;
|
||||||
|
SignalStrengthTextBlock.Text = $"{network.SignalStrength}%";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,108 +7,35 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using FontAwesome.WPF;
|
using FontAwesome.WPF;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts;
|
using SafeExamBrowser.I18n.Contracts;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell.Events;
|
|
||||||
using SafeExamBrowser.UserInterface.Shared.Utilities;
|
using SafeExamBrowser.UserInterface.Shared.Utilities;
|
||||||
|
|
||||||
namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
||||||
{
|
{
|
||||||
public partial class TaskbarWirelessNetworkControl : UserControl, ISystemWirelessNetworkControl
|
public partial class TaskbarWirelessNetworkControl : UserControl, ISystemControl
|
||||||
{
|
{
|
||||||
public bool HasWirelessNetworkAdapter
|
private IWirelessAdapter wirelessAdapter;
|
||||||
|
private IText text;
|
||||||
|
|
||||||
|
public TaskbarWirelessNetworkControl(IWirelessAdapter wirelessAdapter, IText text)
|
||||||
{
|
{
|
||||||
set
|
this.wirelessAdapter = wirelessAdapter;
|
||||||
{
|
this.text = text;
|
||||||
Dispatcher.InvokeAsync(() =>
|
|
||||||
{
|
|
||||||
Button.IsEnabled = value;
|
|
||||||
NoAdapterIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsConnecting
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke(() =>
|
|
||||||
{
|
|
||||||
LoadingIcon.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
|
|
||||||
SignalStrengthIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
NetworkStatusIcon.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public WirelessNetworkStatus NetworkStatus
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Dispatcher.InvokeAsync(() =>
|
|
||||||
{
|
|
||||||
var icon = value == WirelessNetworkStatus.Connected ? FontAwesomeIcon.Check : FontAwesomeIcon.Close;
|
|
||||||
var brush = value == WirelessNetworkStatus.Connected ? Brushes.Green : Brushes.Orange;
|
|
||||||
|
|
||||||
if (value == WirelessNetworkStatus.Disconnected)
|
|
||||||
{
|
|
||||||
SignalStrengthIcon.Child = GetIcon(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(icon, brush);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public event WirelessNetworkSelectedEventHandler NetworkSelected;
|
|
||||||
|
|
||||||
public TaskbarWirelessNetworkControl()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitializeWirelessNetworkControl();
|
InitializeWirelessNetworkControl();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
{
|
{
|
||||||
Popup.IsOpen = false;
|
Dispatcher.InvokeAsync(() => Popup.IsOpen = false);
|
||||||
}
|
|
||||||
|
|
||||||
public void SetInformation(string text)
|
|
||||||
{
|
|
||||||
Dispatcher.InvokeAsync(() => Button.ToolTip = text);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update(IEnumerable<IWirelessNetwork> networks)
|
|
||||||
{
|
|
||||||
Dispatcher.InvokeAsync(() =>
|
|
||||||
{
|
|
||||||
NetworksStackPanel.Children.Clear();
|
|
||||||
|
|
||||||
foreach (var network in networks)
|
|
||||||
{
|
|
||||||
var button = new TaskbarWirelessNetworkButton(network);
|
|
||||||
var isCurrent = network.Status == WirelessNetworkStatus.Connected;
|
|
||||||
|
|
||||||
button.IsCurrent = isCurrent;
|
|
||||||
button.NetworkName = network.Name;
|
|
||||||
button.SignalStrength = network.SignalStrength;
|
|
||||||
button.NetworkSelected += (id) => NetworkSelected?.Invoke(id);
|
|
||||||
|
|
||||||
if (isCurrent)
|
|
||||||
{
|
|
||||||
NetworkStatus = network.Status;
|
|
||||||
SignalStrengthIcon.Child = GetIcon(network.SignalStrength);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetworksStackPanel.Children.Add(button);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeWirelessNetworkControl()
|
private void InitializeWirelessNetworkControl()
|
||||||
|
@ -131,12 +58,90 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls
|
||||||
Background = originalBrush;
|
Background = originalBrush;
|
||||||
Button.Background = originalBrush;
|
Button.Background = originalBrush;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (wirelessAdapter.IsAvailable)
|
||||||
|
{
|
||||||
|
wirelessAdapter.NetworksChanged += WirelessAdapter_NetworksChanged;
|
||||||
|
wirelessAdapter.StatusChanged += WirelessAdapter_StatusChanged;
|
||||||
|
UpdateNetworks();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Button.IsEnabled = false;
|
||||||
|
NoAdapterIcon.Visibility = Visibility.Visible;
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessNotAvailable));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WirelessAdapter_NetworksChanged()
|
||||||
|
{
|
||||||
|
Dispatcher.InvokeAsync(UpdateNetworks);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WirelessAdapter_StatusChanged(WirelessNetworkStatus status)
|
||||||
|
{
|
||||||
|
Dispatcher.InvokeAsync(() => UpdateStatus(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateNetworks()
|
||||||
|
{
|
||||||
|
var status = WirelessNetworkStatus.Disconnected;
|
||||||
|
|
||||||
|
NetworksStackPanel.Children.Clear();
|
||||||
|
|
||||||
|
foreach (var network in wirelessAdapter.GetNetworks())
|
||||||
|
{
|
||||||
|
var button = new TaskbarWirelessNetworkButton(network);
|
||||||
|
|
||||||
|
button.NetworkSelected += (o, args) => wirelessAdapter.Connect(network.Id);
|
||||||
|
|
||||||
|
if (network.Status == WirelessNetworkStatus.Connected)
|
||||||
|
{
|
||||||
|
status = WirelessNetworkStatus.Connected;
|
||||||
|
SignalStrengthIcon.Child = GetIcon(network.SignalStrength);
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessConnected).Replace("%%NAME%%", network.Name));
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworksStackPanel.Children.Add(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateStatus(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateStatus(WirelessNetworkStatus status)
|
||||||
|
{
|
||||||
|
LoadingIcon.Visibility = Visibility.Collapsed;
|
||||||
|
SignalStrengthIcon.Visibility = Visibility.Visible;
|
||||||
|
NetworkStatusIcon.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case WirelessNetworkStatus.Connected:
|
||||||
|
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(FontAwesomeIcon.Check, Brushes.Green);
|
||||||
|
break;
|
||||||
|
case WirelessNetworkStatus.Connecting:
|
||||||
|
LoadingIcon.Visibility = Visibility.Visible;
|
||||||
|
SignalStrengthIcon.Visibility = Visibility.Collapsed;
|
||||||
|
NetworkStatusIcon.Visibility = Visibility.Collapsed;
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessConnecting));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
NetworkStatusIcon.Source = ImageAwesome.CreateImageSource(FontAwesomeIcon.Close, Brushes.Orange);
|
||||||
|
SignalStrengthIcon.Child = GetIcon(0);
|
||||||
|
UpdateText(text.Get(TextKey.SystemControl_WirelessDisconnected));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateText(string text)
|
||||||
|
{
|
||||||
|
Button.ToolTip = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
private UIElement GetIcon(int signalStrength)
|
private UIElement GetIcon(int signalStrength)
|
||||||
{
|
{
|
||||||
var icon = signalStrength > 66 ? "100" : (signalStrength > 33 ? "66" : (signalStrength > 0 ? "33" : "0"));
|
var icon = signalStrength > 66 ? "100" : (signalStrength > 33 ? "66" : (signalStrength > 0 ? "33" : "0"));
|
||||||
var uri = new Uri($"pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/WiFi_{icon}.xaml");
|
var uri = new Uri($"pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/WiFi_{icon}.xaml");
|
||||||
var resource = new XamlIconResource(uri);
|
var resource = new XamlIconResource(uri);
|
||||||
|
|
||||||
return IconResourceLoader.Load(resource);
|
return IconResourceLoader.Load(resource);
|
||||||
|
|
|
@ -353,38 +353,38 @@
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Page>
|
||||||
<Page Include="Images\WiFi_Light_66.xaml">
|
<Resource Include="Images\WiFi_Light_66.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Resource>
|
||||||
<Page Include="Images\WiFi_Light_33.xaml">
|
<Resource Include="Images\WiFi_Light_33.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Resource>
|
||||||
<Page Include="Images\WiFi_Light_100.xaml">
|
<Resource Include="Images\WiFi_Light_100.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Resource>
|
||||||
<Page Include="Images\WiFi_Light_0.xaml">
|
<Resource Include="Images\WiFi_Light_0.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Resource>
|
||||||
<Page Include="Images\WiFi_66.xaml">
|
<Resource Include="Images\WiFi_66.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Resource>
|
||||||
<Page Include="Images\WiFi_33.xaml">
|
<Resource Include="Images\WiFi_33.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Resource>
|
||||||
<Page Include="Images\WiFi_100.xaml">
|
<Resource Include="Images\WiFi_100.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Resource>
|
||||||
<Page Include="Images\WiFi_0.xaml">
|
<Resource Include="Images\WiFi_0.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Resource>
|
||||||
<Page Include="Images\SkipBack.xaml">
|
<Page Include="Images\SkipBack.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
|
|
|
@ -19,6 +19,7 @@ using SafeExamBrowser.Logging.Contracts;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
using SafeExamBrowser.SystemComponents.Contracts.Audio;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
using SafeExamBrowser.SystemComponents.Contracts.Keyboard;
|
||||||
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
using SafeExamBrowser.SystemComponents.Contracts.PowerSupply;
|
||||||
|
using SafeExamBrowser.SystemComponents.Contracts.WirelessNetwork;
|
||||||
using SafeExamBrowser.UserInterface.Contracts;
|
using SafeExamBrowser.UserInterface.Contracts;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Browser;
|
using SafeExamBrowser.UserInterface.Contracts.Browser;
|
||||||
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
using SafeExamBrowser.UserInterface.Contracts.Shell;
|
||||||
|
@ -172,15 +173,15 @@ namespace SafeExamBrowser.UserInterface.Mobile
|
||||||
return splashScreen;
|
return splashScreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ISystemWirelessNetworkControl CreateWirelessNetworkControl(Location location)
|
public ISystemControl CreateWirelessNetworkControl(IWirelessAdapter wirelessAdapter, Location location)
|
||||||
{
|
{
|
||||||
if (location == Location.ActionCenter)
|
if (location == Location.ActionCenter)
|
||||||
{
|
{
|
||||||
return new ActionCenterWirelessNetworkControl();
|
return new ActionCenterWirelessNetworkControl(wirelessAdapter, text);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new TaskbarWirelessNetworkControl();
|
return new TaskbarWirelessNetworkControl(wirelessAdapter, text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue