1 //*********************************************************
2 //
3 // Copyright (c) Microsoft. All rights reserved.
4 // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
5 // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
6 // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
7 // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
8 //
9 //*********************************************************
10
11 //
12 // App.xaml.cpp
13 // Implementation of the App.xaml class.
14 //
15
16 #include "pch.h"
17 #include "MainPage.xaml.h"
18 #include "AdvancedCapture.xaml.h"
19 #include "Common\SuspensionManager.h"
20
21 using namespace SDKSample;
22 using namespace SDKSample::Common;
23 using namespace SDKSample::MediaCapture;
24
25 using namespace Concurrency;
26 using namespace Platform;
27 using namespace Windows::ApplicationModel;
28 using namespace Windows::ApplicationModel::Activation;
29 using namespace Windows::Foundation;
30 using namespace Windows::Foundation::Collections;
31 using namespace Windows::UI::Core;
32 using namespace Windows::UI::Xaml;
33 using namespace Windows::UI::Xaml::Controls;
34 using namespace Windows::UI::Xaml::Controls::Primitives;
35 using namespace Windows::UI::Xaml::Data;
36 using namespace Windows::UI::Xaml::Input;
37 using namespace Windows::UI::Xaml::Interop;
38 using namespace Windows::UI::Xaml::Media;
39 using namespace Windows::UI::Xaml::Navigation;
40
41 /// <summary>
42 /// Initializes the singleton application object. This is the first line of authored code
43 /// executed, and as such is the logical equivalent of main() or WinMain().
44 /// </summary>
App()45 App::App()
46 {
47 InitializeComponent();
48 this->Suspending += ref new SuspendingEventHandler(this, &SDKSample::App::OnSuspending);
49 }
50
51 /// <summary>
52 /// Invoked when the application is launched normally by the end user. Other entry points will
53 /// be used when the application is launched to open a specific file, to display search results,
54 /// and so forth.
55 /// </summary>
56 /// <param name="pArgs">Details about the launch request and process.</param>
57 void App::OnLaunched(LaunchActivatedEventArgs^ pArgs)
58 {
59 this->LaunchArgs = pArgs;
60
61 // Do not repeat app initialization when already running, just ensure that
62 // the window is active
63 if (pArgs->PreviousExecutionState == ApplicationExecutionState::Running)
64 {
65 Window::Current->Activate();
66 return;
67 }
68
69 // Create a Frame to act as the navigation context and associate it with
70 // a SuspensionManager key
71 auto rootFrame = ref new Frame();
72 SuspensionManager::RegisterFrame(rootFrame, "AppFrame");
73
__anon9c20ffed0102()74 auto prerequisite = task<void>([](){});
75 if (pArgs->PreviousExecutionState == ApplicationExecutionState::Terminated)
76 {
77 // Restore the saved session state only when appropriate, scheduling the
78 // final launch steps after the restore is complete
79 prerequisite = SuspensionManager::RestoreAsync();
80 }
81 prerequisite.then([=]()
__anon9c20ffed0202() 82 {
83 // When the navigation stack isn't restored navigate to the first page,
84 // configuring the new page by passing required information as a navigation
85 // parameter
86 if (rootFrame->Content == nullptr)
87 {
88 if (!rootFrame->Navigate(TypeName(MainPage::typeid)))
89 {
90 throw ref new FailureException("Failed to create initial page");
91 }
92 }
93
94 // Place the frame in the current Window and ensure that it is active
95 Window::Current->Content = rootFrame;
96 Window::Current->Activate();
97 }, task_continuation_context::use_current());
98 }
99
100 /// <summary>
101 /// Invoked when application execution is being suspended. Application state is saved
102 /// without knowing whether the application will be terminated or resumed with the contents
103 /// of memory still intact.
104 /// </summary>
105 /// <param name="sender">The source of the suspend request.</param>
106 /// <param name="e">Details about the suspend request.</param>
107 void App::OnSuspending(Object^ sender, SuspendingEventArgs^ e)
108 {
109 (void) sender; // Unused parameter
110
111 auto deferral = e->SuspendingOperation->GetDeferral();
112 SuspensionManager::SaveAsync().then([=]()
__anon9c20ffed0302() 113 {
114 deferral->Complete();
115 });
116 }
117