From b7167d35f607647424075dfdaffdad5de7748271 Mon Sep 17 00:00:00 2001 From: dbuechel Date: Thu, 21 Mar 2019 16:05:16 +0100 Subject: [PATCH] SEBWIN-141: Implemented scaffolding for touch-optimized user interface. --- SafeExamBrowser.Client/CompositionRoot.cs | 58 ++- .../SafeExamBrowser.Client.csproj | 4 + .../ConfigurationData/DataValues.cs | 2 + .../Operations/ClientOperation.cs | 3 +- .../ActionCenterApplicationControl.xaml.cs | 1 - .../Images/Chromium.ico | Bin 191596 -> 0 bytes .../Properties/Resources.Designer.cs | 63 --- .../Properties/Resources.resx | 117 ------ .../Properties/Settings.Designer.cs | 26 -- .../Properties/Settings.settings | 7 - ...feExamBrowser.UserInterface.Desktop.csproj | 21 - .../AboutWindow.xaml | 38 ++ .../AboutWindow.xaml.cs | 53 +++ .../ActionCenter.xaml | 29 ++ .../ActionCenter.xaml.cs | 195 +++++++++ .../BrowserWindow.xaml | 68 +++ .../BrowserWindow.xaml.cs | 282 +++++++++++++ .../ActionCenterApplicationButton.xaml | 24 ++ .../ActionCenterApplicationButton.xaml.cs | 66 +++ .../ActionCenterApplicationControl.xaml | 29 ++ .../ActionCenterApplicationControl.xaml.cs | 69 ++++ .../Controls/ActionCenterClock.xaml | 36 ++ .../Controls/ActionCenterClock.xaml.cs | 32 ++ .../ActionCenterKeyboardLayoutButton.xaml | 30 ++ .../ActionCenterKeyboardLayoutButton.xaml.cs | 56 +++ .../ActionCenterKeyboardLayoutControl.xaml | 37 ++ .../ActionCenterKeyboardLayoutControl.xaml.cs | 86 ++++ .../ActionCenterNotificationButton.xaml | 28 ++ .../ActionCenterNotificationButton.xaml.cs | 40 ++ .../ActionCenterPowerSupplyControl.xaml | 51 +++ .../ActionCenterPowerSupplyControl.xaml.cs | 67 +++ .../Controls/ActionCenterQuitButton.xaml | 28 ++ .../Controls/ActionCenterQuitButton.xaml.cs | 36 ++ .../ActionCenterWirelessNetworkButton.xaml | 30 ++ .../ActionCenterWirelessNetworkButton.xaml.cs | 50 +++ .../ActionCenterWirelessNetworkControl.xaml | 42 ++ ...ActionCenterWirelessNetworkControl.xaml.cs | 139 +++++++ .../Controls/TaskbarApplicationControl.xaml | 28 ++ .../TaskbarApplicationControl.xaml.cs | 97 +++++ .../TaskbarApplicationInstanceButton.xaml | 24 ++ .../TaskbarApplicationInstanceButton.xaml.cs | 63 +++ .../Controls/TaskbarClock.xaml | 17 + .../Controls/TaskbarClock.xaml.cs | 32 ++ .../Controls/TaskbarKeyboardLayoutButton.xaml | 30 ++ .../TaskbarKeyboardLayoutButton.xaml.cs | 56 +++ .../TaskbarKeyboardLayoutControl.xaml | 32 ++ .../TaskbarKeyboardLayoutControl.xaml.cs | 99 +++++ .../Controls/TaskbarNotificationButton.xaml | 19 + .../TaskbarNotificationButton.xaml.cs | 39 ++ .../Controls/TaskbarPowerSupplyControl.xaml | 63 +++ .../TaskbarPowerSupplyControl.xaml.cs | 82 ++++ .../Controls/TaskbarQuitButton.xaml | 20 + .../Controls/TaskbarQuitButton.xaml.cs | 41 ++ .../TaskbarWirelessNetworkButton.xaml | 30 ++ .../TaskbarWirelessNetworkButton.xaml.cs | 50 +++ .../TaskbarWirelessNetworkControl.xaml | 36 ++ .../TaskbarWirelessNetworkControl.xaml.cs | 145 +++++++ .../Images/AboutNotification.xaml | 14 + .../Images/Battery.xaml | 11 + .../Images/Keyboard.xaml | 34 ++ .../Images/LogNotification.ico | Bin 0 -> 93319 bytes .../Images/Menu.xaml | 7 + .../Images/NavigateBack.xaml | 12 + .../Images/NavigateForward.xaml | 12 + .../Images/Reload.xaml | 11 + .../Images/SafeExamBrowser.ico | Bin 0 -> 370070 bytes .../Images/ShutDown.xaml | 12 + .../Images/SkipBack.xaml | 11 + .../Images/SplashScreen.png | Bin 0 -> 40053 bytes .../Images/WiFi_0.xaml | 16 + .../Images/WiFi_100.xaml | 16 + .../Images/WiFi_33.xaml | 16 + .../Images/WiFi_66.xaml | 16 + .../Images/WiFi_Light_0.xaml | 16 + .../Images/WiFi_Light_100.xaml | 16 + .../Images/WiFi_Light_33.xaml | 16 + .../Images/WiFi_Light_66.xaml | 16 + .../Images/ZoomPageIn.xaml | 12 + .../Images/ZoomPageOut.xaml | 12 + .../LogWindow.xaml | 21 + .../LogWindow.xaml.cs | 97 +++++ .../MessageBox.cs | 90 ++++ .../PasswordDialog.xaml | 45 ++ .../PasswordDialog.xaml.cs | 106 +++++ .../Properties/AssemblyInfo.cs | 55 +++ .../RuntimeWindow.xaml | 64 +++ .../RuntimeWindow.xaml.cs | 148 +++++++ ...afeExamBrowser.UserInterface.Mobile.csproj | 387 ++++++++++++++++++ .../SplashScreen.xaml | 28 ++ .../SplashScreen.xaml.cs | 132 ++++++ .../Taskbar.xaml | 33 ++ .../Taskbar.xaml.cs | 151 +++++++ .../Templates/Buttons.xaml | 61 +++ .../Templates/Colors.xaml | 5 + .../Templates/ScrollViewers.xaml | 59 +++ .../UserInterfaceFactory.cs | 179 ++++++++ .../Utilities/IconResourceLoader.cs | 71 ++++ .../Utilities/VisualExtensions.cs | 45 ++ .../Utilities/XamlIconResource.cs | 28 ++ .../ViewModels/DateTimeViewModel.cs | 47 +++ .../ViewModels/LogViewModel.cs | 100 +++++ .../ViewModels/ProgressIndicatorViewModel.cs | 132 ++++++ .../ViewModels/RuntimeWindowViewModel.cs | 101 +++++ .../packages.config | 4 + SafeExamBrowser.sln | 10 + 105 files changed, 5179 insertions(+), 242 deletions(-) delete mode 100644 SafeExamBrowser.UserInterface.Desktop/Images/Chromium.ico delete mode 100644 SafeExamBrowser.UserInterface.Desktop/Properties/Resources.Designer.cs delete mode 100644 SafeExamBrowser.UserInterface.Desktop/Properties/Resources.resx delete mode 100644 SafeExamBrowser.UserInterface.Desktop/Properties/Settings.Designer.cs delete mode 100644 SafeExamBrowser.UserInterface.Desktop/Properties/Settings.settings create mode 100644 SafeExamBrowser.UserInterface.Mobile/AboutWindow.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/AboutWindow.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/ActionCenter.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/ActionCenter.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationControl.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationControl.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterClock.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterClock.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutControl.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutControl.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterNotificationButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterNotificationButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterPowerSupplyControl.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterPowerSupplyControl.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterQuitButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterQuitButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkControl.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkControl.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationControl.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationControl.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationInstanceButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationInstanceButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarClock.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarClock.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutControl.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutControl.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarNotificationButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarNotificationButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarPowerSupplyControl.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarPowerSupplyControl.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarQuitButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarQuitButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkButton.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkButton.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkControl.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkControl.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/AboutNotification.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/Battery.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/Keyboard.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/LogNotification.ico create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/Menu.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/NavigateBack.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/NavigateForward.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/Reload.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/SafeExamBrowser.ico create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/ShutDown.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/SkipBack.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/SplashScreen.png create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/WiFi_0.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/WiFi_100.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/WiFi_33.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/WiFi_66.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_0.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_100.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_33.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_66.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/ZoomPageIn.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Images/ZoomPageOut.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/LogWindow.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/LogWindow.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/MessageBox.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/PasswordDialog.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/PasswordDialog.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Properties/AssemblyInfo.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/RuntimeWindow.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/RuntimeWindow.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/SafeExamBrowser.UserInterface.Mobile.csproj create mode 100644 SafeExamBrowser.UserInterface.Mobile/SplashScreen.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/SplashScreen.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Taskbar.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Taskbar.xaml.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Templates/Buttons.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Templates/Colors.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/Templates/ScrollViewers.xaml create mode 100644 SafeExamBrowser.UserInterface.Mobile/UserInterfaceFactory.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Utilities/IconResourceLoader.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Utilities/VisualExtensions.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/Utilities/XamlIconResource.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/ViewModels/DateTimeViewModel.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/ViewModels/LogViewModel.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/ViewModels/ProgressIndicatorViewModel.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/ViewModels/RuntimeWindowViewModel.cs create mode 100644 SafeExamBrowser.UserInterface.Mobile/packages.config diff --git a/SafeExamBrowser.Client/CompositionRoot.cs b/SafeExamBrowser.Client/CompositionRoot.cs index a5b11842..5cb68264 100644 --- a/SafeExamBrowser.Client/CompositionRoot.cs +++ b/SafeExamBrowser.Client/CompositionRoot.cs @@ -23,6 +23,7 @@ using SafeExamBrowser.Contracts.Client; using SafeExamBrowser.Contracts.Communication.Hosts; using SafeExamBrowser.Contracts.Communication.Proxies; using SafeExamBrowser.Contracts.Configuration; +using SafeExamBrowser.Contracts.Configuration.Settings; using SafeExamBrowser.Contracts.Core.OperationModel; using SafeExamBrowser.Contracts.I18n; using SafeExamBrowser.Contracts.Logging; @@ -42,7 +43,6 @@ using SafeExamBrowser.Monitoring.Mouse; using SafeExamBrowser.Monitoring.Processes; using SafeExamBrowser.Monitoring.Windows; using SafeExamBrowser.SystemComponents; -using SafeExamBrowser.UserInterface.Desktop; using SafeExamBrowser.WindowsApi; namespace SafeExamBrowser.Client @@ -54,6 +54,7 @@ namespace SafeExamBrowser.Client private LogLevel logLevel; private string runtimeHostUri; private Guid startupToken; + private UserInterfaceMode uiMode; private IActionCenter actionCenter; private IBrowserApplicationController browserController; @@ -87,14 +88,14 @@ namespace SafeExamBrowser.Client InitializeLogging(); InitializeText(); - actionCenter = new ActionCenter(); + actionCenter = BuildActionCenter(); keyboardLayout = new KeyboardLayout(new ModuleLogger(logger, nameof(KeyboardLayout)), text); - messageBox = new MessageBox(text); + messageBox = BuildMessageBox(); powerSupply = new PowerSupply(new ModuleLogger(logger, nameof(PowerSupply)), text); processMonitor = new ProcessMonitor(new ModuleLogger(logger, nameof(ProcessMonitor)), nativeMethods); - uiFactory = new UserInterfaceFactory(text); + uiFactory = BuildUserInterfaceFactory(); runtimeProxy = new RuntimeProxy(runtimeHostUri, new ProxyObjectFactory(), new ModuleLogger(logger, nameof(RuntimeProxy))); - taskbar = new Taskbar(new ModuleLogger(logger, nameof(Taskbar))); + taskbar = BuildTaskbar(); windowMonitor = new WindowMonitor(new ModuleLogger(logger, nameof(WindowMonitor)), nativeMethods); wirelessNetwork = new WirelessNetwork(new ModuleLogger(logger, nameof(WirelessNetwork)), text); @@ -153,7 +154,7 @@ namespace SafeExamBrowser.Client private void ValidateCommandLineArguments() { var args = Environment.GetCommandLineArgs(); - var hasFive = args?.Length == 5; + var hasFive = args?.Length >= 5; if (hasFive) { @@ -168,6 +169,7 @@ namespace SafeExamBrowser.Client logLevel = level; runtimeHostUri = args[3]; startupToken = token; + uiMode = args.Length == 6 && Enum.TryParse(args[5], out uiMode) ? uiMode : UserInterfaceMode.Desktop; return; } @@ -286,6 +288,50 @@ namespace SafeExamBrowser.Client return new WindowMonitorOperation(configuration.Settings.KioskMode, logger, windowMonitor); } + private IActionCenter BuildActionCenter() + { + switch (uiMode) + { + case UserInterfaceMode.Mobile: + return new UserInterface.Mobile.ActionCenter(); + default: + return new UserInterface.Desktop.ActionCenter(); + } + } + + private IMessageBox BuildMessageBox() + { + switch (uiMode) + { + case UserInterfaceMode.Mobile: + return new UserInterface.Mobile.MessageBox(text); + default: + return new UserInterface.Desktop.MessageBox(text); + } + } + + private ITaskbar BuildTaskbar() + { + switch (uiMode) + { + case UserInterfaceMode.Mobile: + return new UserInterface.Mobile.Taskbar(new ModuleLogger(logger, nameof(UserInterface.Mobile.Taskbar))); + default: + return new UserInterface.Desktop.Taskbar(new ModuleLogger(logger, nameof(UserInterface.Desktop.Taskbar))); + } + } + + private IUserInterfaceFactory BuildUserInterfaceFactory() + { + switch (uiMode) + { + case UserInterfaceMode.Mobile: + return new UserInterface.Mobile.UserInterfaceFactory(text); + default: + return new UserInterface.Desktop.UserInterfaceFactory(text); + } + } + private void UpdateAppConfig() { ClientController.AppConfig = configuration.AppConfig; diff --git a/SafeExamBrowser.Client/SafeExamBrowser.Client.csproj b/SafeExamBrowser.Client/SafeExamBrowser.Client.csproj index 23c1b104..fc59b7b9 100644 --- a/SafeExamBrowser.Client/SafeExamBrowser.Client.csproj +++ b/SafeExamBrowser.Client/SafeExamBrowser.Client.csproj @@ -160,6 +160,10 @@ {A502DF54-7169-4647-94BD-18B192924866} SafeExamBrowser.UserInterface.Desktop + + {89bc24dd-ff31-496e-9816-a160b686a3d4} + SafeExamBrowser.UserInterface.Mobile + {73724659-4150-4792-A94E-42F5F3C1B696} SafeExamBrowser.WindowsApi diff --git a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs index a9a3b9ec..43d5ad77 100644 --- a/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs +++ b/SafeExamBrowser.Configuration/ConfigurationData/DataValues.cs @@ -148,6 +148,8 @@ namespace SafeExamBrowser.Configuration.ConfigurationData settings.Taskbar.EnableTaskbar = true; settings.Taskbar.ShowClock = true; + settings.UserInterfaceMode = UserInterfaceMode.Desktop; + // TODO: Default values for testing of alpha version only, remove for final release! settings.ActionCenter.ShowApplicationLog = true; settings.ActionCenter.ShowKeyboardLayout = true; diff --git a/SafeExamBrowser.Runtime/Operations/ClientOperation.cs b/SafeExamBrowser.Runtime/Operations/ClientOperation.cs index ff46d4d0..a56921e8 100644 --- a/SafeExamBrowser.Runtime/Operations/ClientOperation.cs +++ b/SafeExamBrowser.Runtime/Operations/ClientOperation.cs @@ -105,11 +105,12 @@ namespace SafeExamBrowser.Runtime.Operations var clientLogLevel = Context.Next.Settings.LogLevel.ToString(); var runtimeHostUri = Context.Next.AppConfig.RuntimeAddress; var startupToken = Context.Next.StartupToken.ToString("D"); + var uiMode = Context.Next.Settings.UserInterfaceMode.ToString(); logger.Info("Starting new client process..."); runtimeHost.AllowConnection = true; runtimeHost.ClientReady += clientReadyEventHandler; - ClientProcess = processFactory.StartNew(clientExecutable, clientLogFile, clientLogLevel, runtimeHostUri, startupToken); + ClientProcess = processFactory.StartNew(clientExecutable, clientLogFile, clientLogLevel, runtimeHostUri, startupToken, uiMode); logger.Info("Waiting for client to complete initialization..."); clientReady = clientReadyEvent.WaitOne(timeout_ms); diff --git a/SafeExamBrowser.UserInterface.Desktop/Controls/ActionCenterApplicationControl.xaml.cs b/SafeExamBrowser.UserInterface.Desktop/Controls/ActionCenterApplicationControl.xaml.cs index 25526b32..d4c577c9 100644 --- a/SafeExamBrowser.UserInterface.Desktop/Controls/ActionCenterApplicationControl.xaml.cs +++ b/SafeExamBrowser.UserInterface.Desktop/Controls/ActionCenterApplicationControl.xaml.cs @@ -11,7 +11,6 @@ using System.Windows.Controls; using SafeExamBrowser.Contracts.Applications; using SafeExamBrowser.Contracts.UserInterface.Shell; using SafeExamBrowser.Contracts.UserInterface.Shell.Events; -using SafeExamBrowser.UserInterface.Desktop.Utilities; namespace SafeExamBrowser.UserInterface.Desktop.Controls { diff --git a/SafeExamBrowser.UserInterface.Desktop/Images/Chromium.ico b/SafeExamBrowser.UserInterface.Desktop/Images/Chromium.ico deleted file mode 100644 index 46025b80199b73889d619f6f08d35e1702509c3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191596 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%0A>rK9p&>RH_L->Mljm=k^g%_U(J;n_~+ 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 diff --git a/SafeExamBrowser.UserInterface.Desktop/Properties/Resources.Designer.cs b/SafeExamBrowser.UserInterface.Desktop/Properties/Resources.Designer.cs deleted file mode 100644 index fd280764..00000000 --- a/SafeExamBrowser.UserInterface.Desktop/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace SafeExamBrowser.UserInterface.Desktop.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SafeExamBrowser.UserInterface.Desktop.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/SafeExamBrowser.UserInterface.Desktop/Properties/Resources.resx b/SafeExamBrowser.UserInterface.Desktop/Properties/Resources.resx deleted file mode 100644 index af7dbebb..00000000 --- a/SafeExamBrowser.UserInterface.Desktop/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Desktop/Properties/Settings.Designer.cs b/SafeExamBrowser.UserInterface.Desktop/Properties/Settings.Designer.cs deleted file mode 100644 index a6f031d0..00000000 --- a/SafeExamBrowser.UserInterface.Desktop/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace SafeExamBrowser.UserInterface.Desktop.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/SafeExamBrowser.UserInterface.Desktop/Properties/Settings.settings b/SafeExamBrowser.UserInterface.Desktop/Properties/Settings.settings deleted file mode 100644 index 033d7a5e..00000000 --- a/SafeExamBrowser.UserInterface.Desktop/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Desktop/SafeExamBrowser.UserInterface.Desktop.csproj b/SafeExamBrowser.UserInterface.Desktop/SafeExamBrowser.UserInterface.Desktop.csproj index 2d223ea0..aea4f425 100644 --- a/SafeExamBrowser.UserInterface.Desktop/SafeExamBrowser.UserInterface.Desktop.csproj +++ b/SafeExamBrowser.UserInterface.Desktop/SafeExamBrowser.UserInterface.Desktop.csproj @@ -364,27 +364,9 @@ Code - - True - True - Resources.resx - - - True - Settings.settings - True - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - SettingsSingleFileGenerator - Settings.Designer.cs - @@ -392,9 +374,6 @@ SafeExamBrowser.Contracts - - - diff --git a/SafeExamBrowser.UserInterface.Mobile/AboutWindow.xaml b/SafeExamBrowser.UserInterface.Mobile/AboutWindow.xaml new file mode 100644 index 00000000..88cccf7e --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/AboutWindow.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + This application is subject to the terms of the Mozilla Public License, version 2.0. If a copy of the MPL was not + distributed with this application, you can obtain one at http://mozilla.org/MPL/2.0/. + + + CefSharp (.NET bindings for the Chromium Embedded Framework) + + Copyright © 2010-2019 The CefSharp Authors. All rights reserved. + + + CEF (Chromium Embedded Framework) + + Copyright © 2008-2019 Marshall A. Greenblatt. Portions Copyright © 2006-2009 Google Inc. All rights reserved. + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/AboutWindow.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/AboutWindow.xaml.cs new file mode 100644 index 00000000..bc3f2420 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/AboutWindow.xaml.cs @@ -0,0 +1,53 @@ +/* + * 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.Windows; +using System.Windows.Documents; +using SafeExamBrowser.Contracts.Configuration; +using SafeExamBrowser.Contracts.I18n; +using SafeExamBrowser.Contracts.UserInterface.Windows; +using SafeExamBrowser.Contracts.UserInterface.Windows.Events; + +namespace SafeExamBrowser.UserInterface.Mobile +{ + public partial class AboutWindow : Window, IWindow + { + private AppConfig appConfig; + private IText text; + private WindowClosingEventHandler closing; + + event WindowClosingEventHandler IWindow.Closing + { + add { closing += value; } + remove { closing -= value; } + } + + public AboutWindow(AppConfig appConfig, IText text) + { + this.appConfig = appConfig; + this.text = text; + + InitializeComponent(); + InitializeAboutWindow(); + } + + public void BringToForeground() + { + Activate(); + } + + private void InitializeAboutWindow() + { + Closing += (o, args) => closing?.Invoke(); + VersionInfo.Inlines.Add(new Run($"{text.Get(TextKey.Version)} {appConfig.ProgramVersion}") { FontStyle = FontStyles.Italic }); + VersionInfo.Inlines.Add(new LineBreak()); + VersionInfo.Inlines.Add(new LineBreak()); + VersionInfo.Inlines.Add(new Run(appConfig.ProgramCopyright) { FontSize = 10 }); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/ActionCenter.xaml b/SafeExamBrowser.UserInterface.Mobile/ActionCenter.xaml new file mode 100644 index 00000000..83088909 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/ActionCenter.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/ActionCenter.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/ActionCenter.xaml.cs new file mode 100644 index 00000000..df54e78a --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/ActionCenter.xaml.cs @@ -0,0 +1,195 @@ +/* + * 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.Windows; +using System.Windows.Media.Animation; +using SafeExamBrowser.Contracts.I18n; +using SafeExamBrowser.Contracts.UserInterface.Shell; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; + +namespace SafeExamBrowser.UserInterface.Mobile +{ + public partial class ActionCenter : Window, IActionCenter + { + public bool ShowClock + { + set { Dispatcher.Invoke(() => Clock.Visibility = value ? Visibility.Visible : Visibility.Collapsed); } + } + + public event QuitButtonClickedEventHandler QuitButtonClicked; + + public ActionCenter() + { + InitializeComponent(); + InitializeActionCenter(); + } + + public void AddApplicationControl(IApplicationControl control) + { + if (control is UIElement uiElement) + { + ApplicationPanel.Children.Add(uiElement); + } + } + + public void AddNotificationControl(INotificationControl control) + { + if (control is UIElement uiElement) + { + ControlPanel.Children.Insert(ControlPanel.Children.Count - 2, uiElement); + } + } + + public void AddSystemControl(ISystemControl control) + { + if (control is UIElement uiElement) + { + ControlPanel.Children.Insert(ControlPanel.Children.Count - 2, uiElement); + } + } + + public new void Close() + { + Dispatcher.Invoke(base.Close); + } + + public new void Hide() + { + Dispatcher.Invoke(HideAnimated); + } + + public void InitializeBounds() + { + Dispatcher.Invoke(() => + { + Height = SystemParameters.WorkArea.Height; + Top = 0; + Left = -Width; + }); + } + + public void InitializeText(IText text) + { + QuitButton.ToolTip = text.Get(TextKey.Shell_QuitButton); + QuitButton.Text.Text = text.Get(TextKey.Shell_QuitButton); + } + + public void Register(IActionCenterActivator activator) + { + activator.Activate += Activator_Activate; + activator.Deactivate += Activator_Deactivate; + activator.Toggle += Activator_Toggle; + } + + public new void Show() + { + Dispatcher.Invoke(ShowAnimated); + } + + private void HideAnimated() + { + var storyboard = new Storyboard(); + var animation = new DoubleAnimation + { + EasingFunction = new CircleEase { EasingMode = EasingMode.EaseOut }, + From = 0, + To = -Width, + Duration = new Duration(TimeSpan.FromMilliseconds(500)) + }; + + Storyboard.SetTarget(animation, this); + Storyboard.SetTargetProperty(animation, new PropertyPath(LeftProperty)); + + storyboard.Children.Add(animation); + storyboard.Completed += HideAnimation_Completed; + storyboard.Begin(); + } + + private void ShowAnimated() + { + var storyboard = new Storyboard(); + var animation = new DoubleAnimation + { + EasingFunction = new CircleEase { EasingMode = EasingMode.EaseOut }, + From = -Width, + To = 0, + Duration = new Duration(TimeSpan.FromMilliseconds(500)) + }; + + Storyboard.SetTarget(animation, this); + Storyboard.SetTargetProperty(animation, new PropertyPath(LeftProperty)); + + InitializeBounds(); + base.Show(); + + storyboard.Children.Add(animation); + storyboard.Completed += ShowAnimation_Completed; + storyboard.Begin(); + } + + private void ShowAnimation_Completed(object sender, EventArgs e) + { + Activate(); + Deactivated += ActionCenter_Deactivated; + } + + private void HideAnimation_Completed(object sender, EventArgs e) + { + Deactivated -= ActionCenter_Deactivated; + base.Hide(); + } + + private void ActionCenter_Deactivated(object sender, EventArgs e) + { + HideAnimated(); + } + + private void Activator_Activate() + { + Dispatcher.InvokeAsync(() => + { + if (Visibility != Visibility.Visible) + { + ShowAnimated(); + } + }); + } + + private void Activator_Deactivate() + { + Dispatcher.InvokeAsync(() => + { + if (Visibility == Visibility.Visible) + { + HideAnimated(); + } + }); + } + + private void Activator_Toggle() + { + Dispatcher.InvokeAsync(() => + { + if (Visibility != Visibility.Visible) + { + ShowAnimated(); + } + else + { + HideAnimated(); + } + }); + } + + private void InitializeActionCenter() + { + QuitButton.Clicked += (args) => QuitButtonClicked?.Invoke(args); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml b/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml new file mode 100644 index 00000000..bdc6ece4 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml.cs new file mode 100644 index 00000000..812e4240 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml.cs @@ -0,0 +1,282 @@ +/* + * 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.ComponentModel; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls.Primitives; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using SafeExamBrowser.Contracts.Configuration.Settings; +using SafeExamBrowser.Contracts.Core; +using SafeExamBrowser.Contracts.I18n; +using SafeExamBrowser.Contracts.UserInterface; +using SafeExamBrowser.Contracts.UserInterface.Browser; +using SafeExamBrowser.Contracts.UserInterface.Browser.Events; +using SafeExamBrowser.Contracts.UserInterface.Windows; +using SafeExamBrowser.Contracts.UserInterface.Windows.Events; +using SafeExamBrowser.UserInterface.Mobile.Utilities; + +namespace SafeExamBrowser.UserInterface.Mobile +{ + public partial class BrowserWindow : Window, IBrowserWindow + { + private bool isMainWindow; + private BrowserSettings settings; + private IText text; + private WindowClosingEventHandler closing; + + private BrowserWindowSettings WindowSettings + { + get { return isMainWindow ? settings.MainWindowSettings : settings.AdditionalWindowSettings; } + } + + public bool CanNavigateBackwards { set => Dispatcher.Invoke(() => BackwardButton.IsEnabled = value); } + public bool CanNavigateForwards { set => Dispatcher.Invoke(() => ForwardButton.IsEnabled = value); } + + public event AddressChangedEventHandler AddressChanged; + public event ActionRequestedEventHandler BackwardNavigationRequested; + public event ActionRequestedEventHandler ForwardNavigationRequested; + public event ActionRequestedEventHandler ReloadRequested; + public event ActionRequestedEventHandler ZoomInRequested; + public event ActionRequestedEventHandler ZoomOutRequested; + public event ActionRequestedEventHandler ZoomResetRequested; + + event WindowClosingEventHandler IWindow.Closing + { + add { closing += value; } + remove { closing -= value; } + } + + public BrowserWindow(IBrowserControl browserControl, BrowserSettings settings, bool isMainWindow, IText text) + { + this.isMainWindow = isMainWindow; + this.settings = settings; + this.text = text; + + InitializeComponent(); + InitializeBrowserWindow(browserControl); + } + + public void BringToForeground() + { + Dispatcher.Invoke(() => + { + if (WindowState == WindowState.Minimized) + { + WindowState = WindowState.Normal; + } + + Activate(); + }); + } + + public new void Close() + { + Dispatcher.Invoke(() => + { + Closing -= BrowserWindow_Closing; + closing?.Invoke(); + base.Close(); + }); + } + + public new void Hide() + { + Dispatcher.Invoke(base.Hide); + } + + public new void Show() + { + Dispatcher.Invoke(base.Show); + } + + public void UpdateAddress(string url) + { + Dispatcher.Invoke(() => UrlTextBox.Text = url); + } + + public void UpdateIcon(IIconResource icon) + { + Dispatcher.InvokeAsync(() => Icon = new BitmapImage(icon.Uri)); + } + + public void UpdateLoadingState(bool isLoading) + { + Dispatcher.Invoke(() => + { + LoadingIcon.Visibility = isLoading ? Visibility.Visible : Visibility.Collapsed; + LoadingIcon.Spin = isLoading; + }); + } + + public void UpdateTitle(string title) + { + Dispatcher.Invoke(() => Title = title); + } + + private void BrowserWindow_Closing(object sender, CancelEventArgs e) + { + if (isMainWindow) + { + e.Cancel = true; + } + else + { + closing?.Invoke(); + } + } + + private void BrowserWindow_KeyUp(object sender, KeyEventArgs e) + { + if (e.Key == Key.F5) + { + ReloadRequested?.Invoke(); + } + } + + private CustomPopupPlacement[] MenuPopup_PlacementCallback(Size popupSize, Size targetSize, Point offset) + { + return new[] + { + new CustomPopupPlacement(new Point(targetSize.Width - Toolbar.Margin.Right - popupSize.Width, -2), PopupPrimaryAxis.None) + }; + } + + private void SystemParameters_StaticPropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(SystemParameters.WorkArea)) + { + Dispatcher.InvokeAsync(InitializeBounds); + } + } + + private void UrlTextBox_GotMouseCapture(object sender, MouseEventArgs e) + { + if (UrlTextBox.Tag as bool? != true) + { + UrlTextBox.SelectAll(); + UrlTextBox.Tag = true; + } + } + + private void UrlTextBox_KeyUp(object sender, KeyEventArgs e) + { + if (e.Key == Key.Enter) + { + AddressChanged?.Invoke(UrlTextBox.Text); + } + } + + private void InitializeBrowserWindow(IBrowserControl browserControl) + { + if (browserControl is System.Windows.Forms.Control control) + { + BrowserControlHost.Child = control; + } + + RegisterEvents(); + InitializeBounds(); + ApplySettings(); + LoadIcons(); + LoadText(); + } + + private void RegisterEvents() + { + var originalBrush = MenuButton.Background; + + BackwardButton.Click += (o, args) => BackwardNavigationRequested?.Invoke(); + Closing += BrowserWindow_Closing; + ForwardButton.Click += (o, args) => ForwardNavigationRequested?.Invoke(); + MenuButton.Click += (o, args) => MenuPopup.IsOpen = !MenuPopup.IsOpen; + MenuButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => MenuPopup.IsOpen = MenuPopup.IsMouseOver)); + MenuPopup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(MenuPopup_PlacementCallback); + MenuPopup.Closed += (o, args) => MenuButton.Background = originalBrush; + MenuPopup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => MenuPopup.IsOpen = IsMouseOver)); + MenuPopup.Opened += (o, args) => MenuButton.Background = Brushes.LightGray; + KeyUp += BrowserWindow_KeyUp; + ReloadButton.Click += (o, args) => ReloadRequested?.Invoke(); + SystemParameters.StaticPropertyChanged += SystemParameters_StaticPropertyChanged; + UrlTextBox.GotKeyboardFocus += (o, args) => UrlTextBox.SelectAll(); + UrlTextBox.GotMouseCapture += UrlTextBox_GotMouseCapture; + UrlTextBox.LostKeyboardFocus += (o, args) => UrlTextBox.Tag = null; + UrlTextBox.LostFocus += (o, args) => UrlTextBox.Tag = null; + UrlTextBox.KeyUp += UrlTextBox_KeyUp; + UrlTextBox.MouseDoubleClick += (o, args) => UrlTextBox.SelectAll(); + ZoomInButton.Click += (o, args) => ZoomInRequested?.Invoke(); + ZoomOutButton.Click += (o, args) => ZoomOutRequested?.Invoke(); + ZoomResetButton.Click += (o, args) => ZoomResetRequested?.Invoke(); + } + + private void ApplySettings() + { + UrlTextBox.IsEnabled = WindowSettings.AllowAddressBar; + + ReloadButton.IsEnabled = WindowSettings.AllowReloading; + ReloadButton.Visibility = WindowSettings.AllowReloading ? Visibility.Visible : Visibility.Collapsed; + + BackwardButton.IsEnabled = WindowSettings.AllowBackwardNavigation; + BackwardButton.Visibility = WindowSettings.AllowBackwardNavigation ? Visibility.Visible : Visibility.Collapsed; + + ForwardButton.IsEnabled = WindowSettings.AllowForwardNavigation; + ForwardButton.Visibility = WindowSettings.AllowForwardNavigation ? Visibility.Visible : Visibility.Collapsed; + } + + private void InitializeBounds() + { + if (isMainWindow) + { + if (WindowSettings.FullScreenMode) + { + Top = 0; + Left = 0; + Height = SystemParameters.WorkArea.Height; + Width = SystemParameters.WorkArea.Width; + ResizeMode = ResizeMode.NoResize; + WindowStyle = WindowStyle.None; + } + else + { + WindowState = WindowState.Maximized; + } + } + else + { + Top = 0; + Left = SystemParameters.WorkArea.Width / 2; + Height = SystemParameters.WorkArea.Height; + Width = SystemParameters.WorkArea.Width / 2; + } + } + + private void LoadIcons() + { + var backUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/NavigateBack.xaml"); + var forwardUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/NavigateForward.xaml"); + var menuUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Menu.xaml"); + var reloadUri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Reload.xaml"); + var backward = new XamlIconResource(backUri); + var forward = new XamlIconResource(forwardUri); + var menu = new XamlIconResource(menuUri); + var reload = new XamlIconResource(reloadUri); + + BackwardButton.Content = IconResourceLoader.Load(backward); + ForwardButton.Content = IconResourceLoader.Load(forward); + MenuButton.Content = IconResourceLoader.Load(menu); + ReloadButton.Content = IconResourceLoader.Load(reload); + } + + private void LoadText() + { + ZoomText.Text = text.Get(TextKey.BrowserWindow_ZoomMenuItem); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationButton.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationButton.xaml new file mode 100644 index 00000000..00092feb --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationButton.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationButton.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationButton.xaml.cs new file mode 100644 index 00000000..044d4de7 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationButton.xaml.cs @@ -0,0 +1,66 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using SafeExamBrowser.Contracts.Applications; +using SafeExamBrowser.Contracts.Core; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; +using SafeExamBrowser.UserInterface.Mobile.Utilities; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterApplicationButton : UserControl + { + private IApplicationInfo info; + private IApplicationInstance instance; + + internal event ApplicationControlClickedEventHandler Clicked; + + public ActionCenterApplicationButton(IApplicationInfo info, IApplicationInstance instance = null) + { + this.info = info; + this.instance = instance; + + InitializeComponent(); + InitializeApplicationInstanceButton(); + } + + private void InitializeApplicationInstanceButton() + { + Icon.Content = IconResourceLoader.Load(info.IconResource); + Text.Text = instance?.Name ?? info.Name; + Button.ToolTip = instance?.Name ?? info.Tooltip; + + if (instance != null) + { + instance.IconChanged += Instance_IconChanged; + instance.NameChanged += Instance_NameChanged; + } + } + + private void Instance_IconChanged(IIconResource icon) + { + Dispatcher.InvokeAsync(() => Icon.Content = IconResourceLoader.Load(icon)); + } + + private void Instance_NameChanged(string name) + { + Dispatcher.Invoke(() => + { + Text.Text = name; + Button.ToolTip = name; + }); + } + + private void Button_Click(object sender, RoutedEventArgs e) + { + Clicked?.Invoke(instance?.Id); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationControl.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationControl.xaml new file mode 100644 index 00000000..0ffea172 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationControl.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationControl.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationControl.xaml.cs new file mode 100644 index 00000000..16a82641 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterApplicationControl.xaml.cs @@ -0,0 +1,69 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using SafeExamBrowser.Contracts.Applications; +using SafeExamBrowser.Contracts.UserInterface.Shell; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterApplicationControl : UserControl, IApplicationControl + { + private IApplicationInfo info; + + public event ApplicationControlClickedEventHandler Clicked; + + public ActionCenterApplicationControl(IApplicationInfo info) + { + this.info = info; + + InitializeComponent(); + InitializeApplicationControl(info); + } + + public void RegisterInstance(IApplicationInstance instance) + { + Dispatcher.Invoke(() => + { + var button = new ActionCenterApplicationButton(info, instance); + + button.Clicked += (id) => Clicked?.Invoke(id); + instance.Terminated += (id) => Instance_OnTerminated(id, button); + InstancePanel.Children.Add(button); + + ApplicationName.Visibility = Visibility.Visible; + ApplicationButton.Visibility = Visibility.Collapsed; + }); + } + + private void InitializeApplicationControl(IApplicationInfo info) + { + var button = new ActionCenterApplicationButton(info); + + button.Button.Click += (o, args) => Clicked?.Invoke(); + ApplicationName.Text = info.Name; + ApplicationButton.Content = button; + } + + private void Instance_OnTerminated(InstanceIdentifier id, ActionCenterApplicationButton button) + { + Dispatcher.InvokeAsync(() => + { + InstancePanel.Children.Remove(button); + + if (InstancePanel.Children.Count == 0) + { + ApplicationName.Visibility = Visibility.Collapsed; + ApplicationButton.Visibility = Visibility.Visible; + } + }); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterClock.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterClock.xaml new file mode 100644 index 00000000..a881ffff --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterClock.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterClock.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterClock.xaml.cs new file mode 100644 index 00000000..adc709c1 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterClock.xaml.cs @@ -0,0 +1,32 @@ +/* + * 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.Windows.Controls; +using SafeExamBrowser.UserInterface.Mobile.ViewModels; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterClock : UserControl + { + private DateTimeViewModel model; + + public ActionCenterClock() + { + InitializeComponent(); + InitializeControl(); + } + + private void InitializeControl() + { + model = new DateTimeViewModel(true); + DataContext = model; + TimeTextBlock.DataContext = model; + DateTextBlock.DataContext = model; + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutButton.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutButton.xaml new file mode 100644 index 00000000..58d50726 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutButton.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutButton.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutButton.xaml.cs new file mode 100644 index 00000000..7777afbc --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutButton.xaml.cs @@ -0,0 +1,56 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterKeyboardLayoutButton : UserControl + { + private IKeyboardLayout layout; + + public event KeyboardLayoutSelectedEventHandler LayoutSelected; + + public string CultureCode + { + set { CultureCodeTextBlock.Text = value; } + } + + public bool IsCurrent + { + set { IsCurrentTextBlock.Visibility = value ? Visibility.Visible : Visibility.Hidden; } + } + + public string LayoutName + { + set { LayoutNameTextBlock.Text = value; } + } + + public Guid LayoutId + { + get { return layout.Id; } + } + + public ActionCenterKeyboardLayoutButton(IKeyboardLayout layout) + { + this.layout = layout; + + InitializeComponent(); + InitializeEvents(); + } + + private void InitializeEvents() + { + Button.Click += (o, args) => LayoutSelected?.Invoke(layout.Id); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutControl.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutControl.xaml new file mode 100644 index 00000000..d2afcb4a --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutControl.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutControl.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutControl.xaml.cs new file mode 100644 index 00000000..1807cc17 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterKeyboardLayoutControl.xaml.cs @@ -0,0 +1,86 @@ +/* + * 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.Threading.Tasks; +using System.Windows.Controls; +using System.Windows.Media; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterKeyboardLayoutControl : UserControl, ISystemKeyboardLayoutControl + { + public event KeyboardLayoutSelectedEventHandler LayoutSelected; + + public ActionCenterKeyboardLayoutControl() + { + InitializeComponent(); + InitializeKeyboardLayoutControl(); + } + + public void Add(IKeyboardLayout layout) + { + Dispatcher.Invoke(() => + { + var button = new ActionCenterKeyboardLayoutButton(layout); + + button.LayoutSelected += Button_LayoutSelected; + button.CultureCode = layout.CultureCode; + button.LayoutName = layout.Name; + + LayoutsStackPanel.Children.Add(button); + }); + } + + public void Close() + { + Dispatcher.Invoke(() => Popup.IsOpen = false); + } + + public void SetCurrent(IKeyboardLayout layout) + { + Dispatcher.Invoke(() => + { + foreach (var child in LayoutsStackPanel.Children) + { + if (child is ActionCenterKeyboardLayoutButton layoutButton) + { + layoutButton.IsCurrent = layout.Id == layoutButton.LayoutId; + } + } + + Text.Text = layout.Name; + }); + } + + public void SetInformation(string text) + { + Dispatcher.Invoke(() => Button.ToolTip = text); + } + + private void InitializeKeyboardLayoutControl() + { + var originalBrush = Grid.Background; + + Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; + Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = Popup.IsMouseOver)); + Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); + Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; + Popup.Closed += (o, args) => Grid.Background = originalBrush; + } + + private void Button_LayoutSelected(Guid id) + { + Popup.IsOpen = false; + LayoutSelected?.Invoke(id); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterNotificationButton.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterNotificationButton.xaml new file mode 100644 index 00000000..578d84a0 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterNotificationButton.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterNotificationButton.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterNotificationButton.xaml.cs new file mode 100644 index 00000000..8f7ec048 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterNotificationButton.xaml.cs @@ -0,0 +1,40 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using SafeExamBrowser.Contracts.Client; +using SafeExamBrowser.Contracts.UserInterface.Shell; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; +using SafeExamBrowser.UserInterface.Mobile.Utilities; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterNotificationButton : UserControl, INotificationControl + { + public event NotificationControlClickedEventHandler Clicked; + + public ActionCenterNotificationButton(INotificationInfo info) + { + InitializeComponent(); + InitializeNotificationIcon(info); + } + + private void Icon_Click(object sender, RoutedEventArgs e) + { + Clicked?.Invoke(); + } + + private void InitializeNotificationIcon(INotificationInfo info) + { + Icon.Content = IconResourceLoader.Load(info.IconResource); + IconButton.ToolTip = info.Tooltip; + Text.Text = info.Tooltip; + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterPowerSupplyControl.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterPowerSupplyControl.xaml new file mode 100644 index 00000000..7c5c6725 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterPowerSupplyControl.xaml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterPowerSupplyControl.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterPowerSupplyControl.xaml.cs new file mode 100644 index 00000000..5a6c269d --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterPowerSupplyControl.xaml.cs @@ -0,0 +1,67 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterPowerSupplyControl : UserControl, ISystemPowerSupplyControl + { + private double BATTERY_CHARGE_MAX_WIDTH; + + public ActionCenterPowerSupplyControl() + { + InitializeComponent(); + BATTERY_CHARGE_MAX_WIDTH = BatteryCharge.Width; + } + + public void Close() + { + } + + public void SetBatteryCharge(double charge, BatteryChargeStatus status) + { + Dispatcher.InvokeAsync(() => + { + var width = BATTERY_CHARGE_MAX_WIDTH * charge; + + width = width > BATTERY_CHARGE_MAX_WIDTH ? BATTERY_CHARGE_MAX_WIDTH : width; + width = width < 0 ? 0 : width; + + BatteryCharge.Width = width; + BatteryCharge.Fill = status == BatteryChargeStatus.Low ? Brushes.Orange : BatteryCharge.Fill; + BatteryCharge.Fill = status == BatteryChargeStatus.Critical ? Brushes.Red : BatteryCharge.Fill; + Warning.Visibility = status == BatteryChargeStatus.Critical ? Visibility.Visible : Visibility.Collapsed; + }); + } + + public void SetPowerGridConnection(bool connected) + { + Dispatcher.InvokeAsync(() => PowerPlug.Visibility = connected ? Visibility.Visible : Visibility.Collapsed); + } + + public void SetInformation(string text) + { + Dispatcher.InvokeAsync(() => Text.Text = text); + } + + public void ShowCriticalBatteryWarning(string warning) + { + Dispatcher.InvokeAsync(() => Button.ToolTip = warning); + } + + public void ShowLowBatteryInfo(string info) + { + Dispatcher.InvokeAsync(() => Button.ToolTip = info); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterQuitButton.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterQuitButton.xaml new file mode 100644 index 00000000..9d924722 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterQuitButton.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterQuitButton.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterQuitButton.xaml.cs new file mode 100644 index 00000000..3ebcc509 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterQuitButton.xaml.cs @@ -0,0 +1,36 @@ +/* + * 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.ComponentModel; +using System.Windows.Controls; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; +using SafeExamBrowser.UserInterface.Mobile.Utilities; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterQuitButton : UserControl + { + public event QuitButtonClickedEventHandler Clicked; + + public ActionCenterQuitButton() + { + InitializeComponent(); + InitializeControl(); + } + + private void InitializeControl() + { + var uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/ShutDown.xaml"); + var resource = new XamlIconResource(uri); + + Icon.Content = IconResourceLoader.Load(resource); + Button.Click += (o, args) => Clicked?.Invoke(new CancelEventArgs()); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkButton.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkButton.xaml new file mode 100644 index 00000000..0d4451ea --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkButton.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkButton.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkButton.xaml.cs new file mode 100644 index 00000000..04929d32 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkButton.xaml.cs @@ -0,0 +1,50 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterWirelessNetworkButton : UserControl + { + private IWirelessNetwork network; + + public bool IsCurrent + { + 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) + { + this.network = network; + + InitializeComponent(); + InitializeEvents(); + } + + private void InitializeEvents() + { + Button.Click += (o, args) => NetworkSelected?.Invoke(network.Id); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkControl.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkControl.xaml new file mode 100644 index 00000000..5bdf5973 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkControl.xaml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkControl.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkControl.xaml.cs new file mode 100644 index 00000000..38b07766 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/ActionCenterWirelessNetworkControl.xaml.cs @@ -0,0 +1,139 @@ +/* + * 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.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using FontAwesome.WPF; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; +using SafeExamBrowser.UserInterface.Mobile.Utilities; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class ActionCenterWirelessNetworkControl : UserControl, ISystemWirelessNetworkControl + { + public bool HasWirelessNetworkAdapter + { + set + { + 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(); + InitializeWirelessNetworkControl(); + } + + public void Close() + { + Dispatcher.Invoke(() => Popup.IsOpen = false); + } + + public void SetInformation(string text) + { + Dispatcher.Invoke(() => + { + Button.ToolTip = text; + Text.Text = text; + }); + } + + public void Update(IEnumerable 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() + { + var originalBrush = Grid.Background; + + SignalStrengthIcon.Child = GetIcon(0); + Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; + Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = Popup.IsMouseOver)); + Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); + Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; + Popup.Closed += (o, args) => Grid.Background = originalBrush; + } + + private UIElement GetIcon(int signalStrength) + { + 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 resource = new XamlIconResource(uri); + + return IconResourceLoader.Load(resource); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationControl.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationControl.xaml new file mode 100644 index 00000000..c2eca719 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationControl.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationInstanceButton.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationInstanceButton.xaml.cs new file mode 100644 index 00000000..8aab1fee --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarApplicationInstanceButton.xaml.cs @@ -0,0 +1,63 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using SafeExamBrowser.Contracts.Applications; +using SafeExamBrowser.Contracts.Core; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; +using SafeExamBrowser.UserInterface.Mobile.Utilities; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class TaskbarApplicationInstanceButton : UserControl + { + private IApplicationInfo info; + private IApplicationInstance instance; + + internal event ApplicationControlClickedEventHandler Clicked; + + public TaskbarApplicationInstanceButton(IApplicationInstance instance, IApplicationInfo info) + { + this.info = info; + this.instance = instance; + + InitializeComponent(); + InitializeApplicationInstanceButton(); + } + + private void InitializeApplicationInstanceButton() + { + Icon.Content = IconResourceLoader.Load(info.IconResource); + Text.Text = instance.Name; + Button.ToolTip = instance.Name; + + instance.IconChanged += Instance_IconChanged; + instance.NameChanged += Instance_NameChanged; + } + + private void Instance_IconChanged(IIconResource icon) + { + Dispatcher.InvokeAsync(() => Icon.Content = IconResourceLoader.Load(icon)); + } + + private void Instance_NameChanged(string name) + { + Dispatcher.Invoke(() => + { + Text.Text = name; + Button.ToolTip = name; + }); + } + + private void Button_Click(object sender, RoutedEventArgs e) + { + Clicked?.Invoke(instance.Id); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarClock.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarClock.xaml new file mode 100644 index 00000000..8569e435 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarClock.xaml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarClock.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarClock.xaml.cs new file mode 100644 index 00000000..fca0aa72 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarClock.xaml.cs @@ -0,0 +1,32 @@ +/* + * 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.Windows.Controls; +using SafeExamBrowser.UserInterface.Mobile.ViewModels; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class TaskbarClock : UserControl + { + private DateTimeViewModel model; + + public TaskbarClock() + { + InitializeComponent(); + InitializeControl(); + } + + private void InitializeControl() + { + model = new DateTimeViewModel(false); + DataContext = model; + TimeTextBlock.DataContext = model; + DateTextBlock.DataContext = model; + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutButton.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutButton.xaml new file mode 100644 index 00000000..c4092845 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutButton.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutButton.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutButton.xaml.cs new file mode 100644 index 00000000..0d046da2 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutButton.xaml.cs @@ -0,0 +1,56 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class TaskbarKeyboardLayoutButton : UserControl + { + private IKeyboardLayout layout; + + public event KeyboardLayoutSelectedEventHandler LayoutSelected; + + public string CultureCode + { + set { CultureCodeTextBlock.Text = value; } + } + + public bool IsCurrent + { + set { IsCurrentTextBlock.Visibility = value ? Visibility.Visible : Visibility.Hidden; } + } + + public string LayoutName + { + set { LayoutNameTextBlock.Text = value; } + } + + public Guid LayoutId + { + get { return layout.Id; } + } + + public TaskbarKeyboardLayoutButton(IKeyboardLayout layout) + { + this.layout = layout; + + InitializeComponent(); + InitializeEvents(); + } + + private void InitializeEvents() + { + Button.Click += (o, args) => LayoutSelected?.Invoke(layout.Id); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutControl.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutControl.xaml new file mode 100644 index 00000000..7145d747 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutControl.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutControl.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutControl.xaml.cs new file mode 100644 index 00000000..30aedb1c --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarKeyboardLayoutControl.xaml.cs @@ -0,0 +1,99 @@ +/* + * 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.Linq; +using System.Threading.Tasks; +using System.Windows.Controls; +using System.Windows.Media; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class TaskbarKeyboardLayoutControl : UserControl, ISystemKeyboardLayoutControl + { + public event KeyboardLayoutSelectedEventHandler LayoutSelected; + + public TaskbarKeyboardLayoutControl() + { + InitializeComponent(); + InitializeKeyboardLayoutControl(); + } + + public void Add(IKeyboardLayout layout) + { + Dispatcher.Invoke(() => + { + var button = new TaskbarKeyboardLayoutButton(layout); + + button.LayoutSelected += Button_LayoutSelected; + button.CultureCode = layout.CultureCode; + button.LayoutName = layout.Name; + + LayoutsStackPanel.Children.Add(button); + }); + } + + public void Close() + { + Dispatcher.Invoke(() => Popup.IsOpen = false); + } + + public void SetCurrent(IKeyboardLayout layout) + { + Dispatcher.Invoke(() => + { + var name = layout.Name?.Length > 3 ? String.Join(string.Empty, layout.Name.Split(' ').Where(s => Char.IsLetter(s.First())).Select(s => s.First())) : layout.Name; + + foreach (var child in LayoutsStackPanel.Children) + { + if (child is TaskbarKeyboardLayoutButton layoutButton) + { + layoutButton.IsCurrent = layout.Id == layoutButton.LayoutId; + } + } + + LayoutCultureCode.Text = layout.CultureCode; + }); + } + + public void SetInformation(string text) + { + Dispatcher.Invoke(() => Button.ToolTip = text); + } + + private void InitializeKeyboardLayoutControl() + { + var originalBrush = Button.Background; + + Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; + Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = Popup.IsMouseOver)); + Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); + + Popup.Opened += (o, args) => + { + Background = Brushes.LightGray; + Button.Background = Brushes.LightGray; + }; + + Popup.Closed += (o, args) => + { + Background = originalBrush; + Button.Background = originalBrush; + }; + } + + private void Button_LayoutSelected(Guid id) + { + Popup.IsOpen = false; + LayoutSelected?.Invoke(id); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarNotificationButton.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarNotificationButton.xaml new file mode 100644 index 00000000..7486e8b3 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarNotificationButton.xaml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarPowerSupplyControl.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarPowerSupplyControl.xaml.cs new file mode 100644 index 00000000..7a564e5f --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarPowerSupplyControl.xaml.cs @@ -0,0 +1,82 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Threading; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class TaskbarPowerSupplyControl : UserControl, ISystemPowerSupplyControl + { + private double BATTERY_CHARGE_MAX_WIDTH; + + public TaskbarPowerSupplyControl() + { + InitializeComponent(); + BATTERY_CHARGE_MAX_WIDTH = BatteryCharge.Width; + } + + public void Close() + { + Popup.IsOpen = false; + } + + public void SetBatteryCharge(double charge, BatteryChargeStatus status) + { + Dispatcher.InvokeAsync(() => + { + var width = BATTERY_CHARGE_MAX_WIDTH * charge; + + width = width > BATTERY_CHARGE_MAX_WIDTH ? BATTERY_CHARGE_MAX_WIDTH : width; + width = width < 0 ? 0 : width; + + BatteryCharge.Width = width; + BatteryCharge.Fill = status == BatteryChargeStatus.Low ? Brushes.Orange : BatteryCharge.Fill; + BatteryCharge.Fill = status == BatteryChargeStatus.Critical ? Brushes.Red : BatteryCharge.Fill; + Warning.Visibility = status == BatteryChargeStatus.Critical ? Visibility.Visible : Visibility.Collapsed; + }); + } + + public void SetPowerGridConnection(bool connected) + { + Dispatcher.InvokeAsync(() => PowerPlug.Visibility = connected ? Visibility.Visible : Visibility.Collapsed); + } + + public void SetInformation(string text) + { + Dispatcher.InvokeAsync(() => Button.ToolTip = text); + } + + public void ShowCriticalBatteryWarning(string warning) + { + Dispatcher.InvokeAsync(() => ShowPopup(warning)); + } + + public void ShowLowBatteryInfo(string info) + { + Dispatcher.InvokeAsync(() => ShowPopup(info)); + } + + private void ShowPopup(string text) + { + Popup.IsOpen = true; + PopupText.Text = text; + Background = Brushes.LightGray; + } + + private void Button_Click(object sender, RoutedEventArgs e) + { + Popup.IsOpen = false; + Background = Brushes.Transparent; + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarQuitButton.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarQuitButton.xaml new file mode 100644 index 00000000..06d89d2e --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarQuitButton.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkButton.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkButton.xaml.cs new file mode 100644 index 00000000..40d9da00 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkButton.xaml.cs @@ -0,0 +1,50 @@ +/* + * 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.Windows; +using System.Windows.Controls; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class TaskbarWirelessNetworkButton : UserControl + { + private readonly IWirelessNetwork network; + + public bool IsCurrent + { + 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) + { + this.network = network; + + InitializeComponent(); + InitializeEvents(); + } + + private void InitializeEvents() + { + Button.Click += (o, args) => NetworkSelected?.Invoke(network.Id); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkControl.xaml b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkControl.xaml new file mode 100644 index 00000000..402b5750 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkControl.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkControl.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkControl.xaml.cs new file mode 100644 index 00000000..4042bac0 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Controls/TaskbarWirelessNetworkControl.xaml.cs @@ -0,0 +1,145 @@ +/* + * 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.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using FontAwesome.WPF; +using SafeExamBrowser.Contracts.SystemComponents; +using SafeExamBrowser.Contracts.UserInterface.Shell; +using SafeExamBrowser.Contracts.UserInterface.Shell.Events; +using SafeExamBrowser.UserInterface.Mobile.Utilities; + +namespace SafeExamBrowser.UserInterface.Mobile.Controls +{ + public partial class TaskbarWirelessNetworkControl : UserControl, ISystemWirelessNetworkControl + { + public bool HasWirelessNetworkAdapter + { + set + { + 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(); + InitializeWirelessNetworkControl(); + } + + public void Close() + { + Popup.IsOpen = false; + } + + public void SetInformation(string text) + { + Dispatcher.InvokeAsync(() => Button.ToolTip = text); + } + + public void Update(IEnumerable 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() + { + var originalBrush = Button.Background; + + SignalStrengthIcon.Child = GetIcon(0); + Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; + Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = Popup.IsMouseOver)); + Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); + + Popup.Opened += (o, args) => + { + Background = Brushes.LightGray; + Button.Background = Brushes.LightGray; + }; + + Popup.Closed += (o, args) => + { + Background = originalBrush; + Button.Background = originalBrush; + }; + } + + private UIElement GetIcon(int signalStrength) + { + 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 resource = new XamlIconResource(uri); + + return IconResourceLoader.Load(resource); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/AboutNotification.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/AboutNotification.xaml new file mode 100644 index 00000000..7d70c974 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/AboutNotification.xaml @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/Battery.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/Battery.xaml new file mode 100644 index 00000000..998b72d4 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/Battery.xaml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/Keyboard.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/Keyboard.xaml new file mode 100644 index 00000000..f90b0365 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/Keyboard.xaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/LogNotification.ico b/SafeExamBrowser.UserInterface.Mobile/Images/LogNotification.ico new file mode 100644 index 0000000000000000000000000000000000000000..1c7fb20fad24c38b6af9d1cab61178061535adc5 GIT binary patch literal 93319 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 Ht + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/NavigateBack.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/NavigateBack.xaml new file mode 100644 index 00000000..571e4427 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/NavigateBack.xaml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/NavigateForward.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/NavigateForward.xaml new file mode 100644 index 00000000..957c1f83 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/NavigateForward.xaml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/Reload.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/Reload.xaml new file mode 100644 index 00000000..eb620713 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/Reload.xaml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/SafeExamBrowser.ico b/SafeExamBrowser.UserInterface.Mobile/Images/SafeExamBrowser.ico new file mode 100644 index 0000000000000000000000000000000000000000..abdc46352095c00898c3d43cbc6a1d2336b80d46 GIT binary patch literal 370070 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
o(~c3>)EzNV}twl9lOaJ{gzAU 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
DX8_`z2#@boXZ&X0iqhk^SckT2c% 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 literal 0 HcmV?d00001 diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/ShutDown.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/ShutDown.xaml new file mode 100644 index 00000000..a73e0262 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/ShutDown.xaml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/SkipBack.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/SkipBack.xaml new file mode 100644 index 00000000..f7ff20bf --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/SkipBack.xaml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/SplashScreen.png b/SafeExamBrowser.UserInterface.Mobile/Images/SplashScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..c56dd2b0dbb3fb7f0a9aa43fc4b40e32edba8d9f GIT binary patch literal 40053 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 + + + + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_100.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_100.xaml new file mode 100644 index 00000000..74fd45d8 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_100.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_33.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_33.xaml new file mode 100644 index 00000000..da1e2a15 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_33.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_66.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_66.xaml new file mode 100644 index 00000000..f6b214bc --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_66.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_0.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_0.xaml new file mode 100644 index 00000000..07d4c0f4 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_0.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_100.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_100.xaml new file mode 100644 index 00000000..849e6b15 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_100.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_33.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_33.xaml new file mode 100644 index 00000000..3c1820c4 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_33.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_66.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_66.xaml new file mode 100644 index 00000000..006337de --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/WiFi_Light_66.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/ZoomPageIn.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/ZoomPageIn.xaml new file mode 100644 index 00000000..e7f4acab --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/ZoomPageIn.xaml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/Images/ZoomPageOut.xaml b/SafeExamBrowser.UserInterface.Mobile/Images/ZoomPageOut.xaml new file mode 100644 index 00000000..74a53e6c --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/Images/ZoomPageOut.xaml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.UserInterface.Mobile/LogWindow.xaml b/SafeExamBrowser.UserInterface.Mobile/LogWindow.xaml new file mode 100644 index 00000000..fa88dc2a --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/LogWindow.xaml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/SafeExamBrowser.UserInterface.Mobile/LogWindow.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/LogWindow.xaml.cs new file mode 100644 index 00000000..9302f8fe --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/LogWindow.xaml.cs @@ -0,0 +1,97 @@ +/* + * 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.ComponentModel; +using System.Windows; +using SafeExamBrowser.Contracts.I18n; +using SafeExamBrowser.Contracts.Logging; +using SafeExamBrowser.Contracts.UserInterface.Windows; +using SafeExamBrowser.Contracts.UserInterface.Windows.Events; +using SafeExamBrowser.UserInterface.Mobile.ViewModels; + +namespace SafeExamBrowser.UserInterface.Mobile +{ + public partial class LogWindow : Window, IWindow + { + private ILogger logger; + private LogViewModel model; + private WindowClosingEventHandler closing; + + event WindowClosingEventHandler IWindow.Closing + { + add { closing += value; } + remove { closing -= value; } + } + + public LogWindow(ILogger logger, IText text) + { + InitializeComponent(); + + this.logger = logger; + this.model = new LogViewModel(text, ScrollViewer, LogContent); + + InitializeLogWindow(); + } + + public void BringToForeground() + { + Dispatcher.Invoke(() => + { + if (WindowState == WindowState.Minimized) + { + WindowState = WindowState.Normal; + } + + Activate(); + }); + } + + public new void Close() + { + Dispatcher.Invoke(base.Close); + } + + public new void Hide() + { + Dispatcher.Invoke(base.Hide); + } + + public new void Show() + { + Dispatcher.Invoke(base.Show); + } + + private void InitializeLogWindow() + { + DataContext = model; + Closing += LogWindow_Closing; + Loaded += LogWindow_Loaded; + } + + private void LogWindow_Loaded(object sender, RoutedEventArgs e) + { + var log = logger.GetLog(); + + foreach (var content in log) + { + model.Notify(content); + } + + logger.Subscribe(model); + logger.Debug("Opened log window."); + } + + private void LogWindow_Closing(object sender, CancelEventArgs e) + { + logger.Unsubscribe(model); + logger.Debug("Closed log window."); + + closing?.Invoke(); + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/MessageBox.cs b/SafeExamBrowser.UserInterface.Mobile/MessageBox.cs new file mode 100644 index 00000000..81aad442 --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/MessageBox.cs @@ -0,0 +1,90 @@ +/* + * 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.Windows; +using SafeExamBrowser.Contracts.I18n; +using SafeExamBrowser.Contracts.UserInterface.MessageBox; +using SafeExamBrowser.Contracts.UserInterface.Windows; +using MessageBoxResult = SafeExamBrowser.Contracts.UserInterface.MessageBox.MessageBoxResult; + +namespace SafeExamBrowser.UserInterface.Mobile +{ + public class MessageBox : IMessageBox + { + private IText text; + + public MessageBox(IText text) + { + this.text = text; + } + + public MessageBoxResult Show(string message, string title, MessageBoxAction action = MessageBoxAction.Confirm, MessageBoxIcon icon = MessageBoxIcon.Information, IWindow parent = null) + { + var result = default(System.Windows.MessageBoxResult); + + if (parent is Window window) + { + result = window.Dispatcher.Invoke(() => System.Windows.MessageBox.Show(window, message, title, ToButton(action), ToImage(icon))); + } + else + { + result = System.Windows.MessageBox.Show(message, title, ToButton(action), ToImage(icon)); + } + + return ToResult(result); + } + + public MessageBoxResult Show(TextKey message, TextKey title, MessageBoxAction action = MessageBoxAction.Confirm, MessageBoxIcon icon = MessageBoxIcon.Information, IWindow parent = null) + { + return Show(text.Get(message), text.Get(title), action, icon, parent); + } + + private MessageBoxButton ToButton(MessageBoxAction action) + { + switch (action) + { + case MessageBoxAction.YesNo: + return MessageBoxButton.YesNo; + default: + return MessageBoxButton.OK; + } + } + + private MessageBoxImage ToImage(MessageBoxIcon icon) + { + switch (icon) + { + case MessageBoxIcon.Error: + return MessageBoxImage.Error; + case MessageBoxIcon.Question: + return MessageBoxImage.Question; + case MessageBoxIcon.Warning: + return MessageBoxImage.Warning; + default: + return MessageBoxImage.Information; + } + } + + private MessageBoxResult ToResult(System.Windows.MessageBoxResult result) + { + switch (result) + { + case System.Windows.MessageBoxResult.Cancel: + return MessageBoxResult.Cancel; + case System.Windows.MessageBoxResult.No: + return MessageBoxResult.No; + case System.Windows.MessageBoxResult.OK: + return MessageBoxResult.Ok; + case System.Windows.MessageBoxResult.Yes: + return MessageBoxResult.Yes; + default: + return MessageBoxResult.None; + } + } + } +} diff --git a/SafeExamBrowser.UserInterface.Mobile/PasswordDialog.xaml b/SafeExamBrowser.UserInterface.Mobile/PasswordDialog.xaml new file mode 100644 index 00000000..45d7b52f --- /dev/null +++ b/SafeExamBrowser.UserInterface.Mobile/PasswordDialog.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +