properly(hopefully) handle app termination and suspension

This commit is contained in:
2020-05-02 19:26:30 +03:00
parent 8b264b792d
commit ce57bf069c
4 changed files with 53 additions and 13 deletions

View File

@@ -7,6 +7,7 @@ using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation; using Windows.ApplicationModel.Activation;
using Windows.Foundation; using Windows.Foundation;
using Windows.Foundation.Collections; using Windows.Foundation.Collections;
using Windows.Storage;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Controls.Primitives;
@@ -22,6 +23,8 @@ namespace PomoTime
/// </summary> /// </summary>
sealed partial class App : Application sealed partial class App : Application
{ {
public RunningState RunningState = new RunningState();
/// <summary> /// <summary>
/// Initializes the singleton application object. This is the first line of authored code /// 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(). /// executed, and as such is the logical equivalent of main() or WinMain().
@@ -50,9 +53,18 @@ namespace PomoTime
rootFrame.NavigationFailed += OnNavigationFailed; 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 // 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, // When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation // configuring the new page by passing required information as a navigation
// parameter // parameter
rootFrame.Navigate(typeof(MainPage), e.Arguments); rootFrame.Navigate(typeof(MainPage), RunningState);
} }
// Ensure the current window is active // Ensure the current window is active
Window.Current.Activate(); Window.Current.Activate();

View File

@@ -66,6 +66,7 @@ namespace PomoTime
Application.Current.Suspending += OnSuspending; Application.Current.Suspending += OnSuspending;
Application.Current.Resuming += OnResuming; Application.Current.Resuming += OnResuming;
this.Loaded += MainPageLoaded; this.Loaded += MainPageLoaded;
ApplicationDataContainer roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings; ApplicationDataContainer roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings;
@@ -104,9 +105,6 @@ namespace PomoTime
BreakMinutes = DefaultBreakMinutes; BreakMinutes = DefaultBreakMinutes;
LongBreakMinutes = DefaultLongBreakMinutes; LongBreakMinutes = DefaultLongBreakMinutes;
} }
MainViewRunningState.MinutesLeft = WorkMinutes;
MainViewRunningState.SecondsLeft = 0;
} }
void timer_Tick() void timer_Tick()
@@ -280,18 +278,26 @@ namespace PomoTime
minutes["LongBreakMinutes"] = LongBreakMinutes; minutes["LongBreakMinutes"] = LongBreakMinutes;
roamingSettings.Values["Minutes"] = minutes; roamingSettings.Values["Minutes"] = minutes;
ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
SuspendTime = DateTime.Now; 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(); deferral.Complete();
} }
private void OnResuming(object sender, Object e) private void FastForwardTime(DateTime since)
{ {
TimeSpan TimeFromSuspend = DateTime.Now - SuspendTime; TimeSpan TimeFromSuspend = DateTime.Now - since;
if(!MainViewRunningState.IsRunning) if (!MainViewRunningState.IsRunning)
{ {
return; return;
} }
if(TimeFromSuspend.TotalSeconds >= MainViewRunningState.MinutesLeft * 60 + MainViewRunningState.SecondsLeft) if (TimeFromSuspend.TotalSeconds >= MainViewRunningState.MinutesLeft * 60 + MainViewRunningState.SecondsLeft)
{ {
MainViewRunningState.IsRunning = false; MainViewRunningState.IsRunning = false;
MainViewRunningState.MinutesLeft = 0; MainViewRunningState.MinutesLeft = 0;
@@ -299,7 +305,7 @@ namespace PomoTime
return; return;
} }
if(TimeFromSuspend.Seconds > MainViewRunningState.SecondsLeft) if (TimeFromSuspend.Seconds > MainViewRunningState.SecondsLeft)
{ {
MainViewRunningState.MinutesLeft -= TimeFromSuspend.Minutes + 1; MainViewRunningState.MinutesLeft -= TimeFromSuspend.Minutes + 1;
MainViewRunningState.SecondsLeft = MainViewRunningState.SecondsLeft + 60 - TimeFromSuspend.Seconds; MainViewRunningState.SecondsLeft = MainViewRunningState.SecondsLeft + 60 - TimeFromSuspend.Seconds;
@@ -308,6 +314,15 @@ namespace PomoTime
MainViewRunningState.MinutesLeft -= TimeFromSuspend.Minutes; MainViewRunningState.MinutesLeft -= TimeFromSuspend.Minutes;
MainViewRunningState.SecondsLeft -= TimeFromSuspend.Seconds; 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) private void MainPageLoaded(object sender, RoutedEventArgs e)
@@ -321,5 +336,18 @@ namespace PomoTime
}); });
}, TimeSpan.FromSeconds(1)); }, 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);
}
} }
} }

View File

@@ -9,7 +9,7 @@
<Identity <Identity
Name="44844StepanUsatyuk.PomoTime" Name="44844StepanUsatyuk.PomoTime"
Publisher="CN=D7EE55C2-4D4B-40F8-8EE5-CC4CEBCE2133" Publisher="CN=D7EE55C2-4D4B-40F8-8EE5-CC4CEBCE2133"
Version="1.0.1.0" /> Version="1.0.2.0" />
<mp:PhoneIdentity PhoneProductId="4d8bddac-8ab7-4c19-b3c7-7b5a27b87594" PhonePublisherId="00000000-0000-0000-0000-000000000000"/> <mp:PhoneIdentity PhoneProductId="4d8bddac-8ab7-4c19-b3c7-7b5a27b87594" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>

View File

@@ -18,7 +18,7 @@
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WindowsXamlEnableOverview>true</WindowsXamlEnableOverview> <WindowsXamlEnableOverview>true</WindowsXamlEnableOverview>
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled> <AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
<PackageCertificateThumbprint>037FCF0D18772F50AACCB9F3A4F9061066C3F0CB</PackageCertificateThumbprint> <PackageCertificateThumbprint>5805544F843D1A5B2C86CA0F6C5FB14BC9E5DA32</PackageCertificateThumbprint>
<GenerateAppInstallerFile>False</GenerateAppInstallerFile> <GenerateAppInstallerFile>False</GenerateAppInstallerFile>
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm> <AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
<AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision> <AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>