summaryrefslogtreecommitdiff
path: root/Juick/App.xaml.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Juick/App.xaml.cs')
-rw-r--r--Juick/App.xaml.cs124
1 files changed, 123 insertions, 1 deletions
diff --git a/Juick/App.xaml.cs b/Juick/App.xaml.cs
index 03e0d10..1e91f38 100644
--- a/Juick/App.xaml.cs
+++ b/Juick/App.xaml.cs
@@ -95,13 +95,17 @@ namespace Juick
null,
"/ApplicationWideTile.png",
null);
+ RootFrame.UriMapper = new MyUriMapper();
}
// Code to execute when the application is activated (brought to foreground)
// This code will not execute when the application is first launched
private void Application_Activated(object sender, ActivatedEventArgs e)
{
- // Ensure that application state is restored appropriately
+ if (e.IsApplicationInstancePreserved == false)
+ {
+ RootFrame.UriMapper = new MyUriMapper();
+ }
}
// Code to execute when the application is deactivated (sent to background)
@@ -139,9 +143,26 @@ namespace Juick
#region Phone application initialization
+ public enum SessionType
+ {
+ None,
+ Home,
+ DeepLink
+ }
+
// Avoid double-initialization
private bool phoneApplicationInitialized = false;
+ // Set to Home when the app is launched from Primary tile.
+ // Set to DeepLink when the app is launched from Deep Link.
+ private SessionType _sessionType = SessionType.None;
+
+ // Set to true when the page navigation is being reset
+ private bool _wasRelaunched = false;
+
+ // set to true when 5 min passed since the app was relaunched
+ private bool _mustClearPagestack = false;
+
// Do not add any additional code to this method
private void InitializePhoneApplication()
{
@@ -156,10 +177,87 @@ namespace Juick
// Handle navigation failures
RootFrame.NavigationFailed += RootFrame_NavigationFailed;
+ RootFrame.Navigated += CheckForResetNavigation;
+
+ RootFrame.Navigating += RootFrame_Navigating;
+
+ RootFrame.UriMapper = new MyUriMapper();
+
// Ensure we don't initialize again
phoneApplicationInitialized = true;
}
+ void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
+ {
+ // If the session type is None or New, check the navigation Uri to determine if the
+ // navigation is a deep link or if it points to the app's main page.
+ if (_sessionType == SessionType.None && e.NavigationMode == NavigationMode.New)
+ {
+ // This block will run if the current navigation is part of the app's intial launch
+
+
+ // Keep track of Session Type
+ if (e.Uri.ToString().Contains("DeepLink=true"))
+ {
+ _sessionType = SessionType.DeepLink;
+ }
+ else if (e.Uri.ToString().Contains("/MainPage.xaml"))
+ {
+ _sessionType = SessionType.Home;
+ }
+ }
+
+
+
+ if (e.NavigationMode == NavigationMode.Reset)
+ {
+ // This block will execute if the current navigation is a relaunch.
+ // If so, another navigation will be coming, so this records that a relaunch just happened
+ // so that the next navigation can use this info.
+ _wasRelaunched = true;
+ }
+ else if (e.NavigationMode == NavigationMode.New && _wasRelaunched)
+ {
+ // This block will run if the previous navigation was a relaunch
+ _wasRelaunched = false;
+
+ if (e.Uri.ToString().Contains("ShareContent") || e.Uri.ToString().Contains("mid"))
+ {
+ // This block will run if the launch Uri contains "DeepLink=true" which
+ // was specified when the secondary tile was created in MainPage.xaml.cs
+
+ _sessionType = SessionType.DeepLink;
+ // The app was relaunched via a Deep Link.
+ // The page stack will be cleared.
+ }
+ else if (e.Uri.OriginalString.Contains("/MainPage.xaml"))
+ {
+ // This block will run if the navigation Uri is the main page
+ if (_sessionType == SessionType.DeepLink)
+ {
+ // When the app was previously launched via Deep Link and relaunched via Main Tile, we need to clear the page stack.
+ _sessionType = SessionType.Home;
+ }
+ else
+ {
+ if (!_mustClearPagestack)
+ {
+ //The app was previously launched via Main Tile and relaunched via Main Tile. Cancel the navigation to resume.
+ e.Cancel = true;
+ RootFrame.Navigated -= ClearBackStackAfterReset;
+ }
+ }
+ }
+
+ _mustClearPagestack = false;
+ }
+ else if (e.NavigationMode == NavigationMode.New && !_wasRelaunched && e.Uri.ToString().Contains("/MainPage.xaml"))
+ {
+ // Home button: Any time we do a forward nav to "MainPage" we assume it's from the Home button, so we clear the backstack
+ RootFrame.Navigated += ClearBackStackAfterReset;
+ }
+ }
+
// Do not add any additional code to this method
private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
{
@@ -171,6 +269,30 @@ namespace Juick
RootFrame.Navigated -= CompleteInitializePhoneApplication;
}
+ private void CheckForResetNavigation(object sender, NavigationEventArgs e)
+ {
+ // If the app has received a 'reset' navigation, then we need to check
+ // on the next navigation to see if the page stack should be reset
+ if (e.NavigationMode == NavigationMode.Reset)
+ RootFrame.Navigated += ClearBackStackAfterReset;
+ }
+
+ private void ClearBackStackAfterReset(object sender, NavigationEventArgs e)
+ {
+ // Unregister the event so it doesn't get called again
+ RootFrame.Navigated -= ClearBackStackAfterReset;
+
+ // Only clear the stack for 'new' (forward) and 'refresh' navigations
+ if (e.NavigationMode != NavigationMode.New)
+ return;
+
+ // For UI consistency, clear the entire page stack
+ while (RootFrame.RemoveBackEntry() != null)
+ {
+ ; // do nothing
+ }
+ }
+
#endregion
}
} \ No newline at end of file