diff --git a/Admin/AdminSettingsUC.xaml b/Admin/AdminSettingsUC.xaml
index 41592f2..56b7d45 100644
--- a/Admin/AdminSettingsUC.xaml
+++ b/Admin/AdminSettingsUC.xaml
@@ -4,9 +4,21 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SafeBagDE70.Admin"
+ xmlns:hc="https://handyorg.github.io/handycontrol"
+
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Admin/AdminSettingsUC.xaml.cs b/Admin/AdminSettingsUC.xaml.cs
index cc51e5c..76a60e9 100644
--- a/Admin/AdminSettingsUC.xaml.cs
+++ b/Admin/AdminSettingsUC.xaml.cs
@@ -1,6 +1,12 @@
-using System;
+using HandyControl.Controls;
+using Microsoft.Win32;
+using SafeBagDE70.API;
+using Serilog;
+using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Linq;
+using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
@@ -12,6 +18,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
+using System.Windows.Threading;
namespace SafeBagDE70.Admin
{
@@ -20,9 +27,155 @@ namespace SafeBagDE70.Admin
///
public partial class AdminSettingsUC : UserControl
{
+ string appName = "";
public AdminSettingsUC()
{
InitializeComponent();
+ LoadStartupSetting();
+ timePicker.SelectedTime = Properties.Settings.Default.RestartTime;
+ SetupAutoRestart();
+ }
+
+ private void LoadStartupSetting()
+ {
+ // Open the registry key for the current user's startup applications
+ RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false);
+ appName = Assembly.GetEntryAssembly()?.GetName().Name;
+ if (key != null)
+ {
+ // Check if the app is already set to start with Windows
+ string value = key.GetValue(appName) as string;
+
+ // If the app is listed in the startup items, set the checkbox to checked
+ cbStartWithWindows.IsChecked = value != null;
+ }
+ }
+ private void cbStartWithWindows_Checked(object sender, RoutedEventArgs e)
+ {
+ // Add the app to startup when the checkbox is checked
+ AddApplicationToStartup();
+ }
+
+ private void cbStartWithWindows_Unchecked(object sender, RoutedEventArgs e)
+ {
+ // Remove the app from startup when the checkbox is unchecked
+ RemoveApplicationFromStartup();
+ }
+
+ private void AddApplicationToStartup()
+ {
+ // Get the path to the executable
+ string exePath = Process.GetCurrentProcess().MainModule.FileName;
+
+ // Open the registry key for the current user's startup applications
+ RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
+
+ if (key != null)
+ {
+ // Add the application to the startup list
+ key.SetValue(appName, exePath);
+ }
+ }
+
+ private void RemoveApplicationFromStartup()
+ {
+ // Open the registry key for the current user's startup applications
+ RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
+
+ if (key != null)
+ {
+ // Remove the application from the startup list
+ key.DeleteValue(appName, false);
+ }
+ }
+
+ private void timePicker_SelectedTimeChanged(object sender, HandyControl.Data.FunctionEventArgs e)
+ {
+ if(timePicker.SelectedTime!= Properties.Settings.Default.RestartTime)
+ {
+ Properties.Settings.Default.RestartTime = timePicker.SelectedTime == null ? DateTime.Today.AddHours(2) : (DateTime)timePicker.SelectedTime;
+ Properties.Settings.Default.Save();
+ SetupAutoRestart();
+ }
+
+ }
+ private DispatcherTimer timer;
+ private DispatcherTimer checkFlagTimer;
+ private void SetupAutoRestart()
+ {
+ DateTime now = DateTime.Now;
+ var dt = Properties.Settings.Default.RestartTime;
+ DateTime nextRestart = DateTime.Today.AddHours(dt.Hour).AddMinutes(dt.Minute).AddSeconds(dt.Second);
+
+ // If the restart time for today has already passed, set it for tomorrow
+ if (nextRestart <= now)
+ {
+ nextRestart = nextRestart.AddDays(1);
+ }
+
+ TimeSpan timeUntilRestart = nextRestart - now;
+
+ if (timer != null)
+ {
+ timer.Stop();
+ }
+
+ // Set up the timer to wait until the specified restart time
+ if (timer != null)
+ {
+ try
+ {
+ timer.Tick -= Timer_Tick;
+ timer.Stop();
+ }
+ catch (Exception ex)
+ {
+ }
+ }
+ timer = new DispatcherTimer
+ {
+ Interval = timeUntilRestart
+ };
+ timer.Tick += Timer_Tick;
+ timer.Start();
+ }
+ private void Timer_Tick(object sender, EventArgs e)
+ {
+ timer.Stop();
+
+ if (checkFlagTimer != null)
+ {
+ checkFlagTimer.Stop();
+ }
+
+ checkFlagTimer = new DispatcherTimer
+ {
+ Interval = TimeSpan.FromSeconds(30)
+ };
+ checkFlagTimer.Tick += CheckFlagTimer_Tick;
+ checkFlagTimer.Start();
+ }
+
+ private void CheckFlagTimer_Tick(object? sender, EventArgs e)
+ {
+ checkFlagTimer.IsEnabled = false;
+ if (AppData.GetTransactionCode() == "")
+ {
+ Log.Information("Restart app");
+ AppData.DeviceStatus.Description = "Restart App";
+ APIModels.SendEvent(AppData.DeviceStatus);
+ RestartApplication();
+ }
+ checkFlagTimer.IsEnabled = true;
+ }
+
+ private void RestartApplication()
+ {
+ string exePath = Process.GetCurrentProcess().MainModule.FileName;
+
+ Process.Start(exePath);
+
+ System.Windows.Application.Current.Shutdown();
}
}
}
diff --git a/Admin/AdminWindow.xaml b/Admin/AdminWindow.xaml
index 0c6b9c6..75944f9 100644
--- a/Admin/AdminWindow.xaml
+++ b/Admin/AdminWindow.xaml
@@ -58,7 +58,7 @@
Margin="10"
Click="SettingsButton_Click"/>
+
diff --git a/Admin/AdminWindow.xaml.cs b/Admin/AdminWindow.xaml.cs
index f761aeb..cc59835 100644
--- a/Admin/AdminWindow.xaml.cs
+++ b/Admin/AdminWindow.xaml.cs
@@ -1,6 +1,7 @@
using HandyControl.Tools.Extension;
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -23,12 +24,14 @@ namespace SafeBagDE70.Admin
LogViewerUC loguc;
AdminConfigurationUC configuration;
UserManageUC userManage;
+ AdminSettingsUC settings;
public AdminWindow()
{
InitializeComponent();
loguc= new LogViewerUC();
configuration = new AdminConfigurationUC();
userManage=new UserManageUC();
+ settings = new AdminSettingsUC();
this.MainContentControl.Content = loguc;
this.Loaded += AdminWindow_Loaded;
}
@@ -55,7 +58,7 @@ namespace SafeBagDE70.Admin
private void SettingsButton_Click(object sender, RoutedEventArgs e)
{
-
+ this.MainContentControl.Content = settings;
}
private void ReportsButton_Click(object sender, RoutedEventArgs e)
@@ -69,11 +72,31 @@ namespace SafeBagDE70.Admin
}
private void btnShutdownApp_Click(object sender, RoutedEventArgs e)
- {
- var bResult = MessageBox.Show("LƯU Ý, THAO TÁC NÀY SẼ LÀM MẤT TẤT CẢ DỮ LIỆU ĐANG THAO TÁC. " +
- "CHỈ THỰC HIỆN KHI KHÔNG CÓ NGƯỜI DÙNG ĐANG THAO TÁC TRÊN MÁY","CẢNH BÁO",MessageBoxButton.OKCancel);
- if (bResult == MessageBoxResult.OK)
+ {
+ if (AppData.GetTransactionCode() != "")
{
+ MessageBox.Show("LƯU Ý, THAO TÁC NÀY SẼ LÀM MẤT TẤT CẢ DỮ LIỆU ĐANG THAO TÁC. " +
+ "HÃY HOÀN TẤT GIAO DỊCH ĐỂ TIẾP TỤC", "CẢNH BÁO", MessageBoxButton.OK);
+ }
+ else
+ {
+ System.Windows.Application.Current.Shutdown();
+ }
+ }
+
+ private void btnRestartApp_Click(object sender, RoutedEventArgs e)
+ {
+ if (AppData.GetTransactionCode() != "")
+ {
+ MessageBox.Show("LƯU Ý, THAO TÁC NÀY SẼ LÀM MẤT TẤT CẢ DỮ LIỆU ĐANG THAO TÁC. " +
+ "HÃY HOÀN TẤT GIAO DỊCH ĐỂ TIẾP TỤC", "CẢNH BÁO", MessageBoxButton.OK);
+ }
+ else
+ {
+ string exePath = Process.GetCurrentProcess().MainModule.FileName;
+
+ Process.Start(exePath);
+
System.Windows.Application.Current.Shutdown();
}
}
diff --git a/App.config b/App.config
new file mode 100644
index 0000000..4ba075d
--- /dev/null
+++ b/App.config
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/App.xaml.cs b/App.xaml.cs
index dab39cc..6e444b9 100644
--- a/App.xaml.cs
+++ b/App.xaml.cs
@@ -131,5 +131,11 @@ namespace SafeBagDE70
window.Width = screen.WorkingArea.Width;
window.Height = screen.WorkingArea.Height;
}
+ protected override void OnExit(ExitEventArgs e)
+ {
+ // Release the mutex when the application is closed
+ mutex?.ReleaseMutex();
+ base.OnExit(e);
+ }
}
}
diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..6c6f244
--- /dev/null
+++ b/Properties/Settings.Designer.cs
@@ -0,0 +1,37 @@
+//------------------------------------------------------------------------------
+//
+// 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 SafeBagDE70.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.10.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;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public global::System.DateTime RestartTime {
+ get {
+ return ((global::System.DateTime)(this["RestartTime"]));
+ }
+ set {
+ this["RestartTime"] = value;
+ }
+ }
+ }
+}
diff --git a/Properties/Settings.settings b/Properties/Settings.settings
new file mode 100644
index 0000000..8146184
--- /dev/null
+++ b/Properties/Settings.settings
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SafeBagDE70.csproj b/SafeBagDE70.csproj
index b808a53..b0ea94c 100644
--- a/SafeBagDE70.csproj
+++ b/SafeBagDE70.csproj
@@ -97,6 +97,11 @@
Code
+
+ True
+ True
+ Settings.settings
+
Code
@@ -114,4 +119,11 @@
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
diff --git a/VirtualKeyboard/VKeyboard.cs b/VirtualKeyboard/VKeyboard.cs
index 744a6b6..4769a26 100644
--- a/VirtualKeyboard/VKeyboard.cs
+++ b/VirtualKeyboard/VKeyboard.cs
@@ -47,26 +47,34 @@ namespace VirtualKeyboard.Wpf
public static Task OpenAsync(string initialValue = "")
{
- if (_windowHost != null) throw new InvalidOperationException();
-
_tcs = new TaskCompletionSource();
- _windowHost = (Window)Activator.CreateInstance(_hostType);
- _windowHost.DataContext = new VirtualKeyboardViewModel(initialValue);
- ((ContentControl)_windowHost.FindName(_keyboardValueName)).Content = new KeyboardValueView();
- ((ContentControl)_windowHost.FindName(_keyboardName)).Content = new VirtualKeyboardView();
- void handler(object s, CancelEventArgs a)
+ try
{
- var result = GetResult();
- ((Window)s).Closing -= handler;
- _windowHost = null;
- _tcs?.SetResult(result);
- _tcs = null;
+ if (_windowHost != null) throw new InvalidOperationException();
+
+
+ _windowHost = (Window)Activator.CreateInstance(_hostType);
+ _windowHost.DataContext = new VirtualKeyboardViewModel(initialValue);
+ ((ContentControl)_windowHost.FindName(_keyboardValueName)).Content = new KeyboardValueView();
+ ((ContentControl)_windowHost.FindName(_keyboardName)).Content = new VirtualKeyboardView();
+ void handler(object s, CancelEventArgs a)
+ {
+ var result = GetResult();
+ ((Window)s).Closing -= handler;
+ _windowHost = null;
+ _tcs?.SetResult(result);
+ _tcs = null;
+ }
+
+ _windowHost.Closing += handler;
+
+ _windowHost.Owner = Application.Current.MainWindow;
+ _windowHost.Show();
+
}
+ catch (Exception ex) {
- _windowHost.Closing += handler;
-
- _windowHost.Owner = Application.Current.MainWindow;
- _windowHost.Show();
+ }
return _tcs.Task;
}