From ce57bf069ceadbaed0a8562b90069334cbdc837f Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Sat, 2 May 2020 19:26:30 +0300 Subject: [PATCH] properly(hopefully) handle app termination and suspension --- PomoTime/App.xaml.cs | 18 +++++++++++--- PomoTime/MainPage.xaml.cs | 44 ++++++++++++++++++++++++++++------- PomoTime/Package.appxmanifest | 2 +- PomoTime/PomoTime.csproj | 2 +- 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/PomoTime/App.xaml.cs b/PomoTime/App.xaml.cs index 0b14619..8a0eef4 100644 --- a/PomoTime/App.xaml.cs +++ b/PomoTime/App.xaml.cs @@ -7,6 +7,7 @@ using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.Foundation; using Windows.Foundation.Collections; +using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; @@ -22,6 +23,8 @@ namespace PomoTime /// sealed partial class App : Application { + public RunningState RunningState = new RunningState(); + /// /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). @@ -50,9 +53,18 @@ namespace PomoTime rootFrame.NavigationFailed += OnNavigationFailed; - if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) + if (e.PreviousExecutionState == ApplicationExecutionState.Terminated + || e.PreviousExecutionState == ApplicationExecutionState.ClosedByUser) { - //TODO: Load state from previously suspended application + ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; + if (localSettings.Values["MinutesLeft"] != null) + { + RunningState.MinutesLeft = (int)localSettings.Values["MinutesLeft"]; + RunningState.SecondsLeft = (int)localSettings.Values["SecondsLeft"]; + RunningState.IsRunning = (bool)localSettings.Values["IsRunning"]; + RunningState.PreviousShortBreaks = (int)localSettings.Values["PreviousShortBreaks"]; + RunningState.CurrentPeriod = (Period)localSettings.Values["CurrentPeriod"]; + } } // Place the frame in the current Window @@ -66,7 +78,7 @@ namespace PomoTime // When the navigation stack isn't restored navigate to the first page, // configuring the new page by passing required information as a navigation // parameter - rootFrame.Navigate(typeof(MainPage), e.Arguments); + rootFrame.Navigate(typeof(MainPage), RunningState); } // Ensure the current window is active Window.Current.Activate(); diff --git a/PomoTime/MainPage.xaml.cs b/PomoTime/MainPage.xaml.cs index 858b735..88ba535 100644 --- a/PomoTime/MainPage.xaml.cs +++ b/PomoTime/MainPage.xaml.cs @@ -66,6 +66,7 @@ namespace PomoTime Application.Current.Suspending += OnSuspending; Application.Current.Resuming += OnResuming; + this.Loaded += MainPageLoaded; ApplicationDataContainer roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings; @@ -104,9 +105,6 @@ namespace PomoTime BreakMinutes = DefaultBreakMinutes; LongBreakMinutes = DefaultLongBreakMinutes; } - MainViewRunningState.MinutesLeft = WorkMinutes; - MainViewRunningState.SecondsLeft = 0; - } void timer_Tick() @@ -280,18 +278,26 @@ namespace PomoTime minutes["LongBreakMinutes"] = LongBreakMinutes; roamingSettings.Values["Minutes"] = minutes; + ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; SuspendTime = DateTime.Now; + localSettings.Values["SuspendTime"] = SuspendTime.Ticks; + localSettings.Values["MinutesLeft"] = MainViewRunningState.MinutesLeft; + localSettings.Values["SecondsLeft"] = MainViewRunningState.SecondsLeft; + localSettings.Values["IsRunning"] = MainViewRunningState.IsRunning; + localSettings.Values["PreviousShortBreaks"] = MainViewRunningState.PreviousShortBreaks; + localSettings.Values["CurrentPeriod"] = (int)MainViewRunningState.CurrentPeriod; + deferral.Complete(); } - private void OnResuming(object sender, Object e) + private void FastForwardTime(DateTime since) { - TimeSpan TimeFromSuspend = DateTime.Now - SuspendTime; - if(!MainViewRunningState.IsRunning) + TimeSpan TimeFromSuspend = DateTime.Now - since; + if (!MainViewRunningState.IsRunning) { return; } - if(TimeFromSuspend.TotalSeconds >= MainViewRunningState.MinutesLeft * 60 + MainViewRunningState.SecondsLeft) + if (TimeFromSuspend.TotalSeconds >= MainViewRunningState.MinutesLeft * 60 + MainViewRunningState.SecondsLeft) { MainViewRunningState.IsRunning = false; MainViewRunningState.MinutesLeft = 0; @@ -299,7 +305,7 @@ namespace PomoTime return; } - if(TimeFromSuspend.Seconds > MainViewRunningState.SecondsLeft) + if (TimeFromSuspend.Seconds > MainViewRunningState.SecondsLeft) { MainViewRunningState.MinutesLeft -= TimeFromSuspend.Minutes + 1; MainViewRunningState.SecondsLeft = MainViewRunningState.SecondsLeft + 60 - TimeFromSuspend.Seconds; @@ -308,6 +314,15 @@ namespace PomoTime MainViewRunningState.MinutesLeft -= TimeFromSuspend.Minutes; MainViewRunningState.SecondsLeft -= TimeFromSuspend.Seconds; + + } + + private void OnResuming(object sender, Object e) + { + ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; + SuspendTime = new DateTime((long)localSettings.Values["SuspendTime"]); + + FastForwardTime(SuspendTime); } private void MainPageLoaded(object sender, RoutedEventArgs e) @@ -321,5 +336,18 @@ namespace PomoTime }); }, TimeSpan.FromSeconds(1)); } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + MainViewRunningState = (RunningState)e.Parameter; + + ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; + SuspendTime = new DateTime((long)localSettings.Values["SuspendTime"]); + + FastForwardTime(SuspendTime); + } + } } diff --git a/PomoTime/Package.appxmanifest b/PomoTime/Package.appxmanifest index ff494db..b629833 100644 --- a/PomoTime/Package.appxmanifest +++ b/PomoTime/Package.appxmanifest @@ -9,7 +9,7 @@ + Version="1.0.2.0" /> diff --git a/PomoTime/PomoTime.csproj b/PomoTime/PomoTime.csproj index 505b3e3..2876541 100644 --- a/PomoTime/PomoTime.csproj +++ b/PomoTime/PomoTime.csproj @@ -18,7 +18,7 @@ {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} true True - 037FCF0D18772F50AACCB9F3A4F9061066C3F0CB + 5805544F843D1A5B2C86CA0F6C5FB14BC9E5DA32 False SHA256 True