using System;
using System.Windows;
using System.Windows.Navigation;
using Juick.Classes;
using Juick.ViewModels;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
namespace Juick
{
public partial class App : Application
{
public void NavigateTo(Uri param)
{
var page = (PhoneApplicationPage)RootFrame.Content;
var service = page.NavigationService;
page.Dispatcher.BeginInvoke(() =>
{
service.Navigate(param);
});
}
private static AppViewModel _context = null;
public static AppViewModel AppContext
{
get
{
// Delay creation of the view model until necessary
if (_context == null) {
_context = new AppViewModel();
_context.Pages.Add(new PageViewModel(_context) { RestUri = "/home?1=1", Caption = "My feed"});
_context.Pages.Add(new PageViewModel(_context) { RestUri = "/messages?1=1", Caption = "Last"});
_context.Pages.Add(new PageViewModel(_context) { RestUri = "/messages?1=1&popular=1", Caption = "Top"});
_context.Pages.Add(new PageViewModel(_context) { RestUri = "/messages?1=1&media=all", Caption = "Images" });
};
return _context;
}
}
///
/// Provides easy access to the root frame of the Phone Application.
///
/// The root frame of the Phone Application.
public PhoneApplicationFrame RootFrame { get; private set; }
///
/// Constructor for the Application object.
///
public App()
{
// Global handler for uncaught exceptions.
UnhandledException += Application_UnhandledException;
// Standard Silverlight initialization
InitializeComponent();
// Phone-specific initialization
InitializePhoneApplication();
// Show graphics profiling information while debugging.
if (System.Diagnostics.Debugger.IsAttached)
{
// Display the current frame rate counters.
Current.Host.Settings.EnableFrameRateCounter = true;
// Show the areas of the app that are being redrawn in each frame.
//Application.Current.Host.Settings.EnableRedrawRegions = true;
// Enable non-production analysis visualization mode,
// which shows areas of a page that are handed off to GPU with a colored overlay.
//Application.Current.Host.Settings.EnableCacheVisualization = true;
// Disable the application idle detection by setting the UserIdleDetectionMode property of the
// application's PhoneApplicationService object to Disabled.
// Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
// and consume battery power when the user is not using the phone.
PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
}
}
// Code to execute when the application is launching (eg, from Start)
// This code will not execute when the application is reactivated
private void Application_Launching(object sender, LaunchingEventArgs e)
{
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)
{
if (e.IsApplicationInstancePreserved == false)
{
RootFrame.UriMapper = new MyUriMapper();
}
}
// Code to execute when the application is deactivated (sent to background)
// This code will not execute when the application is closing
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
// Ensure that required application state is persisted here.
}
// Code to execute when the application is closing (eg, user hit Back)
// This code will not execute when the application is deactivated
private void Application_Closing(object sender, ClosingEventArgs e)
{
}
// Code to execute if a navigation fails
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
// A navigation has failed; break into the debugger
System.Diagnostics.Debugger.Break();
}
}
// Code to execute on Unhandled Exceptions
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
// An unhandled exception has occurred; break into the debugger
System.Diagnostics.Debugger.Break();
}
}
#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()
{
if (phoneApplicationInitialized)
return;
// Create the frame but don't set it as RootVisual yet; this allows the splash
// screen to remain active until the application is ready to render.
RootFrame = new PhoneApplicationFrame();
RootFrame.Navigated += CompleteInitializePhoneApplication;
// 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("ShareContent") || e.Uri.ToString().Contains("mid"))
{
_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("/LaunchPage.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)
{
// Set the root visual to allow the application to render
if (RootVisual != RootFrame)
RootVisual = RootFrame;
// Remove this handler since it is no longer needed
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
}
}