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.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
/// </summary>
sealed partial class App : Application
{
public RunningState RunningState = new RunningState();
/// <summary>
/// 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();

View File

@@ -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);
}
}
}

View File

@@ -9,7 +9,7 @@
<Identity
Name="44844StepanUsatyuk.PomoTime"
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"/>

View File

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