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 } }