Repository: microsoft/BuildCast Branch: master Commit: 311844a26c4a Files: 109 Total size: 1.6 MB Directory structure: gitextract__mzsbjjj/ ├── .gitignore ├── LICENSE ├── README.md ├── SECURITY.md ├── design/ │ └── BuildCast.xd └── src/ ├── BuildCast/ │ ├── App.xaml │ ├── App.xaml.cs │ ├── Assets/ │ │ ├── BuildCastIcon.ai │ │ └── build2016windowsdevfeed.xml │ ├── BuildCast.csproj │ ├── Controls/ │ │ ├── CustomMTC.xaml │ │ ├── CustomMTC.xaml.cs │ │ ├── CustomMediaPlayer.xaml │ │ ├── CustomMediaPlayer.xaml.cs │ │ ├── RemoteControl.xaml │ │ ├── RemoteControl.xaml.cs │ │ ├── TimeControl.cs │ │ └── Timeline.cs │ ├── DataModel/ │ │ ├── Episode.cs │ │ ├── EpisodePlaybackState.cs │ │ ├── EpisodeWithState.cs │ │ ├── Favorite.cs │ │ ├── Feed.cs │ │ ├── FeedStore.cs │ │ ├── InkNote.cs │ │ ├── InkNoteData.cs │ │ ├── LocalStorageContext.cs │ │ └── NowPlayingState.cs │ ├── GlobalSuppressions.cs │ ├── Helpers/ │ │ ├── AsyncHelpers.cs │ │ ├── BackgroundDownloadHelper.cs │ │ ├── BufferingVisualManager.cs │ │ ├── DateTimeHelper.cs │ │ ├── EnumToBooleanConverter.cs │ │ ├── EpisodeCommands.cs │ │ ├── Json.cs │ │ ├── LinqExtensions.cs │ │ ├── NavigationAnimationHelpers.cs │ │ ├── RelayCommand.cs │ │ ├── SettingsStorageExtensions.cs │ │ ├── TitleBarHelper.cs │ │ ├── UIHelpers.cs │ │ ├── ValueSetHelper.cs │ │ └── VisualHelpers.cs │ ├── Microsoft.BuildCast.ruleset │ ├── Migrations/ │ │ ├── 20170927020747_initial.Designer.cs │ │ ├── 20170927020747_initial.cs │ │ └── LocalStorageContextModelSnapshot.cs │ ├── Package.appxmanifest │ ├── Properties/ │ │ ├── AssemblyInfo.cs │ │ └── Default.rd.xml │ ├── Services/ │ │ ├── ElementThemeExtended.cs │ │ ├── IAvailableSystemsObserver.cs │ │ ├── IFullscreenPage.cs │ │ ├── IPlayerService.cs │ │ ├── IRemoteConnection.cs │ │ ├── IRemotePlayerService.cs │ │ ├── IRemoteSystemDescription.cs │ │ ├── Navigation/ │ │ │ ├── FrameAdapter.cs │ │ │ ├── IFrameAdapter.cs │ │ │ ├── INavigableTo.cs │ │ │ ├── INavigationCommand.cs │ │ │ ├── INavigationService.cs │ │ │ ├── IPageWithViewModel.cs │ │ │ └── NavigationService.cs │ │ ├── PlayerService.cs │ │ ├── RemotePlayService.cs │ │ ├── ThemeSelectorService.cs │ │ └── ViewModeService.cs │ ├── Strings/ │ │ └── en-us/ │ │ └── Resources.resw │ ├── Styles/ │ │ ├── Common.xaml │ │ └── Settings.xaml │ ├── Themes/ │ │ ├── Branded.xaml │ │ ├── BrandedXbox.xaml │ │ ├── Generic.xaml │ │ └── Stock.xaml │ ├── ViewModels/ │ │ ├── DownloadsViewModel.cs │ │ ├── EpisodeDetailsViewModel.cs │ │ ├── FavoritesViewModel.cs │ │ ├── FeedDetailsViewModel.cs │ │ ├── HomeViewModel.cs │ │ ├── InkNoteViewModel.cs │ │ ├── NotesViewModel.cs │ │ ├── PlayerViewModel.cs │ │ └── SettingsViewModel.cs │ └── Views/ │ ├── Downloads.xaml │ ├── Downloads.xaml.cs │ ├── EpisodeDetails.xaml │ ├── EpisodeDetails.xaml.cs │ ├── Favorites.xaml │ ├── Favorites.xaml.cs │ ├── FeedDetails.xaml │ ├── FeedDetails.xaml.cs │ ├── Home.xaml │ ├── Home.xaml.cs │ ├── InkNote.xaml │ ├── InkNote.xaml.cs │ ├── NavigationRoot.xaml │ ├── NavigationRoot.xaml.cs │ ├── NoteDataTemplateSelector.cs │ ├── Notes.xaml │ ├── Notes.xaml.cs │ ├── Player.xaml │ ├── Player.xaml.cs │ ├── PopupPlayer.xaml │ ├── PopupPlayer.xaml.cs │ ├── SettingsPage.xaml │ └── SettingsPage.xaml.cs └── BuildCast.sln ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ # Visual Studio 2015 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # NUNIT *.VisualState.xml TestResult.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c # DNX project.lock.json artifacts/ *_i.c *_p.c *_i.h *.ilk *.meta *.obj *.pch *.pdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db *.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx *.sap # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # JustCode is a .NET coding add-in .JustCode # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # NCrunch _NCrunch_* .*crunch*.local.xml nCrunchTemp_* # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # TODO: Comment the next line if you want to checkin your web deploy settings # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # Microsoft Azure Web App publish settings. Comment the next line if you want to # checkin your Azure Web App publish settings, but sensitive information contained # in these scripts will be unencrypted PublishScripts/ # NuGet Packages *.nupkg # The packages folder can be ignored because of Package Restore **/packages/* # except build/, which is used as an MSBuild target. !**/packages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/packages/repositories.config # NuGet v3's project.json files produces more ignoreable files *.nuget.props *.nuget.targets # Microsoft Azure Build Output csx/ *.build.csdef # Microsoft Azure Emulator ecf/ rcf/ # Windows Store app package directories and files AppPackages/ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !*.[Cc]ache/ # Others ClientBin/ ~$* *~ *.dbmdl *.dbproj.schemaview *.pfx *.publishsettings node_modules/ orleans.codegen.cs # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ # RIA/Silverlight projects Generated_Code/ # Backup & report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm # SQL Server files *.mdf *.ldf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings # Microsoft Fakes FakesAssemblies/ # GhostDoc plugin setting file *.GhostDoc.xml # Node.js Tools for Visual Studio .ntvs_analysis.dat # Visual Studio 6 build log *.plg # Visual Studio 6 workspace options file *.opt # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts **/*.DesktopClient/ModelManifest.xml **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions # Paket dependency manager .paket/paket.exe paket-files/ # FAKE - F# Make .fake/ # JetBrains Rider .idea/ *.sln.iml ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) Microsoft Corporation. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE ================================================ FILE: README.md ================================================ --- topic: sample languages: - csharp products: - windows - windows-uwp --- # BuildCast Video Player UWP Sample BuildCast is an end-to-end sample built to showcase the [Microsoft Fluent Design System](https://fluent.microsoft.com/) as well as other capabilities of the Universal Windows Platform. It permits browsing, downloading and playback of select video podcasts including a sampling of the most popular ones from Channel 9 as well as some popular Windows tech enthusiast feeds. It has other features such as ink notes, bookmarks and remote playback. This sample was initially shown and discussed at the 2017 Build conference during the [Build Amazing Apps with Fluent Design](https://channel9.msdn.com/Events/Build/2017/B8034) talk. # Features At a high level this sample demonstrates usage of: - Fluent design system (Acrylic material, Reveal highlight, Connected animations, ParallaxView, an Adobe XD UX Prototype etc) - XAML controls and features (NavigationView, swipe commanding, context menu with icons and SVG assets, LoadedImageService, conditional XAML etc) - Media playback including picture-in-picture and fullscreen views - Inking and smart ink - Project Rome and AppServices - Background download service, Entity Framework and SQLite - Windows composition APIs (InteractionTracker, implicit animations, scene lighting) - Notifications with progress bar - Share contract ## Run the sample ### Prepare your environment This sample requires Visual Studio 2017 with Update 5 and the Windows 10 Software Development Kit (SDK) version 16299, Windows 10 OS - Fall Creators Update. * [Get a copy of Visual Studio 2017 Update 4 with support for building Universal Windows apps]( https://www.visualstudio.com/downloads/) [includes SDK 16299] * [Get the latest Windows 10 Fall Creator's Update](https://www.microsoft.com/en-us/windows) [10.0.16299.0 or later] * [Get the Windows 10 Insider SDK 16299](https://developer.microsoft.com/en-US/windows/downloads/windows-10-sdk) as a standalone download. Additionally, to receive the latest updates to Windows and the development tools, and to help shape their development, join the [Windows Insider Program](https://insider.windows.com/ "Become a Windows Insider"). ### Run After opening the Visual Studio solution, set your startup project as **BuildCast**, the architecture to AMD64 or x86, and press F5 to run. ## Code at a glance The table below shows the platform features used in the application and where abouts to find them in the sample. ### Release Notes Update 1 October 2017 - Add the Adobe XD UX prototype file - Add back Spectrum Analyzer visualization to now playing - On startup, app will check for cached media changes at filesystem level and update database state to match this - Improved commanding on favorites, downloads, notes - Design tweaks - Known issues where there will be code changes have all been moved to issues on github - Bug fixes ### Known Issues - Download progress reported via toasts / action center will not update when the app quits, even though the download will proceed using background transfer service. This is due to a known platform gap - Deploying / running BuildCast on a XBOX will result in the app crashing due to a platform bug that is being investigated. [More details here](https://developercommunity.visualstudio.com/content/problem/130393/net-uwp-applications-with-a-targetplatformminversi.html). - A number of warnings have not been addressed - Things that didn't make it from the Build talk: - TreeView control: did not ship in the final Fall Creator's update - 360 video playback: this will come in a future update to the app ### App details ### Frameworks | Framework | Usage | Code file | | :-------------- | :-------------- | --------------: | | [Entity framework](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/overview) | ORM to store objects in SQLite | [LocalStorageContext.cs](src/BuildCast/DataModel/LocalStorageContext.cs) | | [SQLite in UWP](https://blogs.windows.com/buildingapps/2017/02/06/using-sqlite-databases-uwp-apps/) | Primary mechanism for persistence | N/A | | [.NET Standard 2.0](https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-standard-2-0/) | Provides System.Tuple | [NowPlayingState.cs](src/BuildCast/DataModel/NowPlayingState.cs) | ### App features | App feature | Description | Code file | | :-------------- | :-------------- | --------------: | | [Adobe XD](www.adobe.com/products/xd.html) UX Prototype| Acrylic material image | [BuildCast.xd](design/BuildCast.xd) | | [Acrylic material](https://docs.microsoft.com/en-us/windows/uwp/style/acrylic) | Acrylic material usage
Acrylic material image | [Branded.xaml](src/BuildCast/Themes/Branded.xaml) | | [Reveal highlight](https://docs.microsoft.com/en-us/windows/uwp/style/reveal) | Reveal highlight usage
Reveal highlight image | [CustomMTC.xaml](src/BuildCast/Controls/CustomMTC.xaml) | | [NavigationView](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/navigationview) | NavigationView usage
NavigationView image | [NavigationRoot.xaml](src/BuildCast/Views/NavigationRoot.xaml) | | [Connected animations](https://docs.microsoft.com/en-us/windows/uwp/style/connected-animation) | Used in connected transitions between pages | [FeedDetails.xaml.cs](src/BuildCast/Views/FeedDetails.xaml.cs) | | [Inking](https://docs.microsoft.com/en-us/windows/uwp/input-and-devices/pen-and-stylus-interactions) | Ink annotation on video frame
Ink annotation image | [InkNote.xaml.cs](src/BuildCast/Views/InkNote.xaml.cs) | | [Smart Ink](https://docs.microsoft.com/en-us/windows/uwp/input-and-devices/pen-and-stylus-interactions) | Recognize and convert images to glyphs and emoji
Ink recognition image
2nd ink recognition image | [InkNote.xaml.cs](src/BuildCast/Views/InkNote.xaml.cs) | | Emoji picker | Select emoji
Emoji picker image | [InkNote.xaml.cs](src/BuildCast/Views/InkNote.xaml.cs) | | [Context menus with icons](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/menus) | Context menus with icons
Context menus image | [FeedDetails.xaml](src/BuildCast/Views/FeedDetails.xaml) | | [Swipe commanding](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/collection-commanding) | Swipe controls on lists
swipe image | [FeedDetails.xaml](src/BuildCast/Views/FeedDetails.xaml) | | [Mnemonics/Access Keys](https://docs.microsoft.com/en-us/windows/uwp/input-and-devices/access-keys) | Mnemonics usage
Mnenomics image | [EpisodeDetails.xaml](src/BuildCast/Views/EpisodeDetails.xaml) | | [Command bar](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/app-bars) | Command bar usage
Command bar image | [Player.xaml](src/BuildCast/Views/Player.xaml) | | [Coordinated animations](https://docs.microsoft.com/en-us/windows/uwp/style/connected-animation) | Used in connected transitions between pages | [FeedDetails.xaml.cs](src/BuildCast/Views/FeedDetails.xaml.cs) | | [Conditional XAML](https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/conditional-xaml) | NavigationView loads based on OS version support | [NavigationRoot.xaml](src/BuildCast/Views/NavigationRoot.xaml) | | [SVG](https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Controls.Image) | BuildCast logo on homepage | [Home.xaml](src/BuildCast/Views/Home.xaml) | | [Adaptive state triggers](https://blogs.msdn.microsoft.com/cdndevs/2015/06/26/uwp-new-features-of-visual-state-manager-part-1/) | UI optimizations for assorted screen sizes
Adaptive layout image | [Home.xaml](src/BuildCast/Views/Home.xaml) | | [ParallaxView](https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Controls.Parallaxview) | Home screen parallax layout
ParallaxView image | [Home.xaml](src/BuildCast/Views/Home.xaml) | | [Lighting](https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Composition.Effects.SceneLightingEffect) | Buffering animation | [BufferingVisualManager.cs](src/BuildCast/Helpers/BufferingVisualManager.cs) | | [Interaction tracker](https://docs.microsoft.com/en-us/uwp/api/windows.ui.composition.interactions.interactiontracker) | Interaction tracker
Interaction tracker image | [Timeline.cs](src/BuildCast/Controls/Timeline.cs) | | [Layout animations](https://docs.microsoft.com/en-us/windows/uwp/composition/using-the-visual-layer-with-xaml) | Layout animations | [Home.xaml.cs](src/BuildCast/Views/Home.xaml.cs) | | [LoadedImageSurface](https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.media.loadedimagesurface) | Composition Surface for Images | [CustomMediaPlayer.xaml.cs](src/BuildCast/Controls/CustomMediaPlayer.xaml.cs) | |[Composition expression language](https://docs.microsoft.com/en-us/windows/uwp/composition/composition-animation) | Timeline animations | [Timeline.cs](src/BuildCast/Controls/Timeline.cs) | | [Implicit animations](https://docs.microsoft.com/en-us/windows/uwp/composition/using-the-visual-layer-with-xaml) | Poster frame fade out when video starts playing | [VisualHelpers.cs](src/BuildCast/Helpers/VisualHelpers.cs) | | [Compact overlay mode](https://blogs.msdn.microsoft.com/universal-windows-app-model/2017/02/11/compactoverlay-mode-aka-picture-in-picture/) | Picture-in-picture support
Virtual surfaces image | [ViewModeService.cs](src/BuildCast/Services/ViewModeService.cs) | | Spectrum Analyzer | Realtime visualization of audio spectra for currently playing clip
Full screen mode image | [player.xaml.cs](src/BuildCast/Views/Player.xaml.cs) | | [Full screen mode](https://docs.microsoft.com/en-us/uwp/api/Windows.UI.ViewManagement.ApplicationView#Methods_) | Full screen mode for video
Full screen mode image | [ViewModeService.cs](src/BuildCast/Services/ViewModeService.cs) | | [Share contract](https://docs.microsoft.com/en-us/windows/uwp/app-to-app/share-data) | Share the annotated frame
Share contract image | [InkNote.xaml.cs](src/BuildCast/Views/InkNote.xaml.cs) | | [Background transfer service](https://docs.microsoft.com/en-us/uwp/api/windows.networking.backgroundtransfer) | Video download for offline viewing | [BackgroundDownloadHelper.cs](src/BuildCast/Helpers/BackgroundDownloadHelper.cs) | | [BTS toast completion notifications](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-adaptive-interactive-toasts) | Toast display upon background download completion
Background completion image | [BackgroundDownloadHelper.cs](src/BuildCast/Helpers/BackgroundDownloadHelper.cs) | | [Toast progress bars](https://blogs.msdn.microsoft.com/tiles_and_toasts/2017/02/01/progress-ui-and-data-binding-inside-toast-notifications-windows-10-creators-update/) | Visual download progress indicator
Toast progress image | [BackgroundDownloadHelper.cs](src/BuildCast/Helpers/BackgroundDownloadHelper.cs) | | [CodeFileName.extension](Folder/Folder/CodeFileName.extension#L25) | | [App services](https://docs.microsoft.com/en-us/windows/uwp/launch-resume/how-to-create-and-consume-an-app-service) | Support Rome based remote control | [RemotePlayService.cs](src/BuildCast/Services/RemotePlayService.cs) | | [Media Composition API](https://docs.microsoft.com/en-us/uwp/api/Windows.Graphics.Imaging.BitmapEncoder) | Extract frame for Ink annotations from local file | [PlayerService.cs](src/BuildCast/Services/PlayerService.cs) | | [Template studio](https://blogs.windows.com/buildingapps/2017/05/16/announcing-windows-template-studio/) | Theming, settings model
Settings image | | # Contributing While we expect to at a later date, this project is not currently accepting contributions. For now, if you have any feedback or questions, please open an Issue on GitHub for the team. This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments Copyright © Microsoft Corporation. All rights reserved. This program/project is and its use is subject to the [MIT License](LICENSE) ================================================ FILE: SECURITY.md ================================================ ## Security Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. ## Reporting Security Issues **Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. ## Preferred Languages We prefer all communications to be in English. ## Policy Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). ================================================ FILE: src/BuildCast/App.xaml ================================================  ================================================ FILE: src/BuildCast/App.xaml.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Linq; using System.Threading.Tasks; using Autofac; using BuildCast.DataModel; using BuildCast.Helpers; using BuildCast.Services; using BuildCast.Services.Navigation; using BuildCast.ViewModels; using BuildCast.Views; using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.ApplicationModel.AppService; using Windows.ApplicationModel.Background; using Windows.Foundation.Collections; using Windows.System.Profile; using Windows.UI.ViewManagement; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Hosting; using Windows.UI.Xaml.Navigation; namespace BuildCast { /// /// Provides application-specific behavior to supplement the default Application class. /// public sealed partial class App : Application { private IContainer _container; private BackgroundTaskDeferral appServiceDeferral; private NavigationRoot rootPage; /// /// Initializes a new instance of the class. /// executed, and as such is the logical equivalent of main() or WinMain(). /// public App() { this.InitializeComponent(); this.Suspending += OnSuspending; LocalStorageContext.CheckMigrations(); this.RequiresPointerMode = ApplicationRequiresPointerMode.WhenRequested; } public static AppServiceConnection Connection { get; set; } public NavigationRoot GetNavigationRoot() { if (Window.Current.Content is NavigationRoot) { return Window.Current.Content as NavigationRoot; } else if (Window.Current.Content is Frame) { return ((Frame)Window.Current.Content).Content as NavigationRoot; } throw new Exception("Window content is unknown type"); } public Frame GetFrame() { var root = GetNavigationRoot(); return root.AppFrame; } /// /// Invoked when the application is launched normally by the end user. Other entry points /// will be used such as when the application is launched to open a specific file. /// /// Details about the launch request and process. protected async override void OnLaunched(LaunchActivatedEventArgs args) { //XBOX support if (AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Xbox") { ApplicationView.GetForCurrentView().SetDesiredBoundsMode(ApplicationViewBoundsMode.UseCoreWindow); bool result = ApplicationViewScaling.TrySetDisableLayoutScaling(true); } await InitializeAsync(); InitWindow(skipWindowCreation: args.PrelaunchActivated); // Tasks after activation await StartupAsync(); await Window.Current.Dispatcher.RunIdleAsync(async (s) => await BackgroundDownloadHelper.AttachToDownloads()); } protected override void OnWindowCreated(WindowCreatedEventArgs args) { base.OnWindowCreated(args); } protected async override void OnActivated(IActivatedEventArgs args) { await InitializeAsync(); InitWindow(skipWindowCreation: false); if (args.Kind == ActivationKind.Protocol) { Window.Current.Activate(); // Tasks after activation await StartupAsync(); } } protected async override void OnBackgroundActivated(BackgroundActivatedEventArgs args) { var instance = args?.TaskInstance; await BackgroundDownloadHelper.CheckCompletionResult(instance); base.OnBackgroundActivated(args); if (args.TaskInstance.TriggerDetails is AppServiceTriggerDetails details && _container != null) { var remotePlayerService = _container.Resolve(); remotePlayerService.RemoteActivation(args.TaskInstance.GetDeferral(), details.AppServiceConnection); appServiceDeferral = args.TaskInstance.GetDeferral(); Connection = details.AppServiceConnection; Connection.RequestReceived += OnRequestReceived; Connection.ServiceClosed += AppServiceConnection_ServiceClosed; } } private void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args) { var deferral = args.GetDeferral(); Console.WriteLine(args.Request.Message); deferral.Complete(); appServiceDeferral.Complete(); } private void OnAppServicesCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) { appServiceDeferral.Complete(); } private void AppServiceConnection_ServiceClosed(AppServiceConnection sender, AppServiceClosedEventArgs args) { appServiceDeferral.Complete(); } private void InitWindow(bool skipWindowCreation) { var builder = new ContainerBuilder(); rootPage = Window.Current.Content as NavigationRoot; bool initApp = rootPage == null && !skipWindowCreation; // Do not repeat app initialization when the Window already has content, // just ensure that the window is active if (initApp) { // Create a Frame to act as the navigation context and navigate to the first page rootPage = new NavigationRoot(); FrameAdapter adapter = new FrameAdapter(rootPage.AppFrame); builder.RegisterInstance(adapter) .AsImplementedInterfaces(); builder.RegisterType(); // The feed details view model needs to be a singleton in order to better accomodate Connected Animation builder.RegisterType() .SingleInstance(); builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); builder.RegisterType() .AsImplementedInterfaces() .SingleInstance(); builder.RegisterType() .AsImplementedInterfaces(); builder.RegisterInstance(PlayerService.Current) .AsImplementedInterfaces() .SingleInstance(); _container = builder.Build(); rootPage.InitializeNavigationService(_container.Resolve()); adapter.NavigationFailed += OnNavigationFailed; // Place the frame in the current Window Window.Current.Content = rootPage; Window.Current.Activate(); } } private async Task InitializeAsync() { await ThemeSelectorService.InitializeAsync(); await Task.CompletedTask; } private async Task StartupAsync() { BuildCast.Services.ThemeSelectorService.SetRequestedTheme(); await FeedStore.CheckDownloadsPresent(); await Task.CompletedTask; } private async System.Threading.Tasks.Task FixFeedItemThumbnail(Feed feed, Episode feedItem) { var feedItems = await feed.GetEpisodes(); var matchedItem = feedItems.FirstOrDefault(uri => uri.Key == feedItem.Key); if (matchedItem != null) { feedItem = matchedItem; } return feedItem; } private void ParseProtocolData(ValueSet playbackData, out Feed feed, out Episode feedItem, out TimeSpan timespan) { var values = playbackData.GetValueSet("feed"); feed = Feed.BuildFeedFromValueSet(values); values = playbackData.GetValueSet("feeditem"); feedItem = Episode.BuildFromValueSet(values); timespan = playbackData.GetTimeSpan("ElapsedTime"); } /// /// Invoked when Navigation to a certain page fails /// /// The Frame which failed navigation /// Details about the navigation failure private void OnNavigationFailed(object sender, NavigationFailedEventArgs e) { throw new Exception("Failed to load Page " + e.SourcePageType.FullName); } /// /// Invoked when application execution is being suspended. Application state is saved /// without knowing whether the application will be terminated or resumed with the contents /// of memory still intact. /// /// The source of the suspend request. /// Details about the suspend request. private void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); deferral.Complete(); } } } ================================================ FILE: src/BuildCast/Assets/BuildCastIcon.ai ================================================ %PDF-1.5 % 1 0 obj <>/OCGs[5 0 R 21 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream Adobe Illustrator CC 2017 (Windows) 2017-10-06T13:36:49-07:00 2017-10-06T13:40:17-07:00 2017-10-06T13:40:17-07:00 256 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//2Q== 1 False False 32.000000 32.000000 Pixels Default Swatch Group 0 Document application/pdf BuildCastIcon proof:pdf uuid:18d859fb-8be1-4c4d-bb5e-99b9731ed62b uuid:73685081-2781-4ec9-9bdf-6b0c098d612f Adobe PDF library 15.00 endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>>>/Thumb 26 0 R/TrimBox[0.0 0.0 32.0 32.0]/Type/Page>> endobj 23 0 obj <>stream HlTKnTA ܿS[b p* 43ye]sjχp~O|?_~^_<>WZtѣ<<<:N*3V9؊rrqDs"KGy8NUV]:Q ZT]۔0/&/1Dao&jI,'2F0.3" y3&l5rMֈmmLqJOT{ c?C@#CJ(8ɇBXD6)=<eFH l_B " P’BzV m3}(b#v֋ ^x iW=%$@">‚92hn4ZP;4<;i` Wy\V/q tNڠh߹{ǑSf($-ފA4v同)FXD.e@:c^3WuymEh[`?#2  endstream endobj 26 0 obj <>stream 8;Xp,*>JPW(]\SI%<2~> endstream endobj 27 0 obj [/Indexed/DeviceRGB 255 28 0 R] endobj 28 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 21 0 obj <> endobj 29 0 obj [/View/Design] endobj 30 0 obj <>>> endobj 25 0 obj <> endobj 24 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 21.1.0 %%For: (James Clarke) () %%Title: (BuildCastIcon.ai) %%CreationDate: 10/6/2017 1:40 PM %%Canvassize: 16383 %%BoundingBox: 2 -1 32 30 %%HiResBoundingBox: 2 -0.089002939723287 31.9395093917847 30 %%DocumentProcessColors: %AI5_FileFormat 13.0 %AI12_BuildNumber: 326 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 0 32 32 %AI3_TemplateBox: 16.5 15.5 16.5 15.5 %AI3_TileBox: -272.960000991821 -368 304.9599609375 400 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: -45 62.75 8 2012 1504 18 0 0 153 233 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -45 62.75 8 2012 1504 18 0 0 153 233 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:-358 -652 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 33 0 obj <>stream %%BoundingBox: 2 -1 32 30 %%HiResBoundingBox: 2 -0.089002939723287 31.9395093917847 30 %AI7_Thumbnail: 128 128 8 %%BeginData: 2039 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFFFFFFFF %%EndData endstream endobj 34 0 obj <>stream %AI12_CompressedDataxݽv*90zg-8IIDls&m1ffO:7jT*i-|H:Lh鯵,59"?{h,Oz4f *f_Ֆ7<&Yiߏ5Qk_R4⓫'딚a{O6Q4tUn ˤ)a3!6/0SҤ9u,?~(QlB<I[FL sLgEddvyО|Kdɜ9>#Q_4#ݕɇ}IEOA7eS}T$Ð:R0# 񩶸jxЛ fu('@ZlF}[!׏q MP_ nȔJsIw6!f|y}|,ƒ܇E~UeCc#8EE)\2 ^̆iS @v zp0$AО2qL#dҬeKck-LH#"pz<.&CA M^>vי,zћy0KEx#AywB_ЕlC]om)K!)Kjy,(2:P~zcMf)Ó x2ĆO!Bh`zD۟֔ /\0C%%_ҸiSu^/P';# WÈu77~[IߣDEfn;T'`{wx<7(^LCUPCrOh8>?h\ty]g?M'ݖ"߻1%C4VCP"쪵l]D4V"AHƢ,} NAe{)X~P-[&;X`h2)⇟S<ݓIɷxGIo šM 7bBal讉#a4_ȥE0ҙ +!+_x81hV3lY>ͲjwV_]3,CNFҁ+f_ Ëf?IEkѳ;Yw`._>` ~Zy1Je]?ЙW75\tה ~=Mxu.B{}h*w[vP4.rA1kv{YꫭPP?Əoqd?z)amw7パK>H :ꃫKޠ%uФ5'&꒘K3Ihl(&jnH)7RPmzgЬ\( A86΃$5vC |HO|.V$m#q]jn#ao&?2A:AwzRJxMrO?橶OLRq0Wk0Dz+[cTS~?cgLDv8q{0+5BEs'F_8dِ!{fc!ƨ-/`@Ad&4&5~)q1蒍Pl[x@R&)-֠)wB^m6o_jP2a uw5+`q\ F]2yC9X8iVtgNԡ!fsIe;ܴQ{kcswe[Cɸ;<ҥuԺwC^9Bͬ0՚r:Bc ߡ atа9FIRmMq1'DJ;% Hkç5z6;;tȾ@NFOgMn + ToƒlLT.:j,Vf@[Pw4T""ڎ?dI{w`ɡ@iQEYӈ}<^2 YIR l5[^w1IӻB0-¨bgQu%D Ly)/` 4'tI^Iȩ7#I^MwU7ڈl er? tuQ$tUqp!G٣#B2`&D\6,Ϧ}C $zӚqj:wR{|ڕG:"^Gdt7PK=rBLy)Jhf{L|JzɉufCMp !ntMi^w vM˜/;2QIXՄ)ux*uu%E Z^9 }^\UCaVܠo;x&a͊^ K8ȹ!a5u+qͶTP_yX]Wb6e=Z ȥ9Vhz`RcUe,e/Ib ׷i͸ 8XT-="CD'fl/UfO ,Pj~뒡e$O$Um&7w|E/#.jMlf/:#mʹQj LW:4f=SMd#EU4Qm%a{'K=NA KnsKCZZ7&-Mh:SLȀGʿÁ<}n!@HB\`(*6Kx<xEsί*@Å |˶dC{pҢʻ*Uy}0B>Q&mMyih׎$t XE2q@v"Pbr0^N![}9_8G 0kנluMMs+ <#uI% @f=0k,[į6Er'9TRQ{rRV9j# 6O(#/"́ 2cUXod^AN wPNZl2YgBv],<- B#t$4~6B)~Jv 秽sѸ;:Jh(,uh VbLg gr -8<4RrLxٰĒGalWu~&a,#CtS K۾=es ]D\TԗwAC]8(v8RfJ)t&=x7,s3#IkBd4&H+-5y`)U ɿC?ȷEgעd}n\sʺwK5m95p2l=z5mKSyO*kM~ɐ|5z]mR{eR6פHCT19`I"p06 åNo-7qq{/Qh( wBfZQ/}4M \C&{jOv\Kfrg#ɒ'y6 Sy Ƃ'e8ѩ2JϝOdP۲gN6l1RКзweW(R#pu(xN0̧^O"l?%iRk#> 繛E=zo|$JLeB``ktOm|u;Sj7c^tzڻSFM7p@ \͡~$@Tb[!<1K@•ZyE2Vmu=%ֶ JVj6&m>APW!c {?R?4j웏 jg\s>LB 7A? >!>>CL E[ uB3k*X^W; w/`э2 Qhj7j]/"nY1hb3S,-W BZQT}_yZS<pͽ^oPeN9TԺ8hsI=:m()2Ry6<$rHΔR0Q] rY7^p1㮞z5%>%Y !rez/eLٱ4;s7=Pbڍ6e9Þ,Dǐ+ވ&)HĈF( Vx J&}cvjC~44 *aԻ )*xXv\vtkޓGf`p9x;EL<hc2L#Ǧb(89,hE)e2lr}`0WV]N&q.zkS4'Pi0Pą E-kl4x rU{%vͿSIrM3N)Gw=\ zمF0+%vslW|nZ)&;M>< ۗy^pEl{Wb=wU[4ӟ(_ 'Ru~mgp ޓ$Os1/KKačNat/am/fl!x2<12W`dywUώslm6Y<7)?Tﯪ;6YԹt۽昣z)-\;g7#0v:9-zy Oa7Ԙ˃[#Qw}YGEs/(X-Fg_bdY(wW@~j> I$;׍$S7k)$pSnhI eY˱aokl{n|.۠*`T%%A}.PKtx&tkBn u{y}::A'oHkd@0`m@MfsP'zUtru kӺt+ԍ S;BQgcF-&7Ma0]ƆA@jUP=oZujU|$\fR *҆(9Cȼw'q'{ `Ey=S1gP7w>?W 6֥]Ꟗܠ6ۍ3!E2NPqm+=}"bc3aIZyZ>l3'P7֤Ʋi<>4]W2_2ss `Fˇ?_YCmlmPϸ@}L02IhtkC4f yrJԚx|¯]Ww]޼, T0sv tr *Jh^T]eG3Գ_\wzDLOW^k.PﯙJj,NTjǀ`f^y'M؍Ԭs=a6<~٣+w)7XQbAG{*z7PTJÄ65U[N+PM.ƇʯKVla?fӕ @#㣰]Ej2i@zR|MMv2O/`M\"l. `c%ƒ~It}F>ڟ?4tj8?6oO?/&W CXs:r} `ΗۭKlm}=Rol_Ǻ[ԧruHshpSi۵V*߱= m%Ű+^>0_0-'޹>m[6^_N[#no@Z!̭F.5:ٲ=]]ԧ)z;,5\Le{B:e,1ǒaC:oWyƫ‰=xƿ#Ur r5":cQ6EMEBUYaT!pL\:7ӼgHq޷u%iEA-WJXDjlt^Y-p T/*S}?kB0E;fBc5{VlvW OC A[Ogw \" kaM]s]-`L\ WZ|:C']Sz:]bBE#ʲRNORWC盢iem^yܝiKSS>UtaO)\dp[T7vY3}MBo+;tԐJ(0=Ի>vs_d2fAR a~O*b\kvJKĐbS*u㡆es`voG{ڠ/:ZM AG g/z/ gĵ5ykv;tbCO6OshwlDxyRɍ0 ɇ6IS0qWnmk5TF'B—+l⯪_o440PY63ӏ?Z>XLp!_\!w4#R(jBFR/?Te3Xи"gTt '^+*8#{'69Ǟ$8{;{+drթUYwL9F3/"WIaM ; tQh6ou]YLJlsuFW(j̸&9h49ŭ7+nNͪ+w\al?cFRH{UXR#=M 0C6>,`6ǁFn'1uj:Xt "H6%mnh6SS9."'5qkTFU*/.xE{xIazQanն@54<hжY섯)BU[(cJŝ{o'' | H{4t 2w;uGZ b9ׂxu7V SX߄s8,ҺcO!hj8$:8'vGvw$X4#!7^H|Άb0Vs sѣ5y?:ы9]rϣV+;5bG4ѹĚ K3Gf1Ex4J{ qz\&1#⧰>m=LYq[vJuc<:|y} ×3OE9#󫹯ُMǢ)@l\#9ƽK@Uk>R=ޘ{rIJ_z^=hbyqX7ϔT>R3p 16M(hnՉJS $,! ?!f5 @7mfP/=^T,g]g6ɂB/YULzOS 1(+=<™@蠧(ػ^gf[xJ9X5+AәߵABL1R2 V*$daZ'~װoeά̂007 "yh8lj]\xrv:댿N4t3@QfyDee1c>0ҝ+4=7=wT|N# ҨLNipα&EGb2,Jpf2*%iR}Ё8xיxdSY澃@J2S{7_:>YH0Cm,XPrr\ɂjL&uJ5ܮxwtZ>࿈r>Z>ϻO5n/[.^]˷d+]ϻ,ϻoV8s9w-Bk)rvZ>񘿜;{zsr>[M;lʘRv{%qZjfXcN۪[em*7L,kҌPeiI?3ŹmByl;EE nCUY^ffghlew@'=ǔǒx@xQiD'*mŞ=C>>6ZQ旐p3U"\1&+h/qN+ _Faݼ-,Kyyp_bRtvqT*ޅb>ЖNo?r꒩8s<-=OSρ{m.:@z\Ā/L@%HH+;ET녕-f#hZ΁wBc0Žp8oV,1.e/uۘ2ⷌ>A:֨IM& Л veR^|LV3'| W!ρ)#zN>aͣyКoh?ۻT)f37ŏ7W&Wsk ?j6)C]G(c+VWu\I?:yN;Fu]tl񖨁G A~dKFWyCv5rBA@ƂleY.hi@ЉvĂlF%+RHl :&vLjҫ.PƻOXkqe$7GJs1 { G?"A9ZHrY@qa;zupo؎7~AKQa$,g饱{WcjHKul{1<CI>ken-2o^J̣XDeِ.Λ!ֳ2ϖ;lKS3V;/E*Dh+hL2϶6Zqޢ+l`9n.)`œBR/as33Vnzyٰ霋JIGyMtk G)(#@.!qhZ덟ͩꍟCɏ7~~xoA< $Tsazi!G^ pqIG>l ߎhN)ywLk]6v6th|:%pniǃ~ #p&f;8٥奅6[%">,H{YH,֭-H;H{*u;ڿ(X[IMa1wa0޹jU#Eyk<s*ʛF)ʣ=QNa]gI uy(,Fe܍`ߗr.l+K&ێ6.>9cyZT{?"~n7gќ{k(W<'3|] 6{.):Dw?z7JgRV_WxTܓ+yPK_vTL zS[5De- (?_f_^j&vxVwu^'eK]݋&7bD~[>6ҡvnG[2V{ݱIWobOz^wUU7r `Oώ[Uxyrx`@]poA"([>K% 87ݢRx:hDnǎ^(MIJ8:ip^{bE՝^T՛,wzP fL'{ftvalÚz) ylfFw&&}M}<7ٺ2TlfO-S\BfhZaܮ;&(MSyF9|.cj|>!9Y⺩>}}ɩU}E9eβj>>Dڂ fw+sl>Mՙ )>}Y@awMb \wq[Tէxk -s2yB V5.0{a==|Ͼ嫆]紆K/3p*Eq}N]-i+,^DaSU"k,Bma.s39UM:/sZ>>9 jww>c@ V%{>>#?s٦4u>|%"Yw0ЙSnԡ5a?%ω,Q{-1IG0c_k~vSwaO hM]5'Sjۘ͡gzF1aĔRظL{2񫹡=ifOP/3#mGGs_G{eMѽs]gT?[0.%=3?Wy]k6}3s1mq_x%ŏcŴ-wRMi/ffB* =(urXF{;FÞN+burbw!,lFяlQc-[P*1IJ{%_ںOrco 5"!QT7(gTjGݭI8\p%N2Sffb]mŖt(W;X:P ncw("ΆZP-y sdz5]xTFʓ< 2nUL=lqqucO^CõT\MwJ~]M+Fuٜۊ.ǞK\c""MA񶱴5V`5m+.P5Kj CLr].*>%͝S%tҔ/1]2oEX~0Z+=޹y~2-yWj^Ũu;(;sZ`[ &@JsKTUק-8p- UOp郪_^+}ym+,q>ɠT6[) D]|LSQsJz䛁G:<ܩL`VUYLlZYC}Gcaz?^}'Gv6 KTlO ~s<^r;9$t%vg L:Ӥ8Ԓruut:c ik<@fa yI3y7N%s+lOPTUSLrV==T켎{1-r/0{ *`kuAض%_fJ@y} 4H,r Ӵ{Ή4j@H 4;LDxrGTAUZf%XhG=nVH[/ItzD'3@I{R$#N'*IE]{,ItzDOگ$1'=SI2y9^Vh?vY'Ap^VHfJ=.+l =?rY!mn ͡?xYeS-v5ũV3\xH\e2Sf;^CEuDwK 8Պ\xzy0L9߅6kvq.,(1'!5ۅ.So;4L* au%+)h.<&PdX i=pᡆ 犝)C/[P1C= 4 )"C(;MZ=9.0xLӅ;f7jzA/Uo;뤻ѣHr^zroGDstH^%pP#䵻34_wr*M%nԹֱzfqXOF̍>àf±dzU&uQ`UWxt0DTq(QuCz3nL㬰3)Of&uB;{ZK'xr _{iJ:n"m!*-_Տm,.H{kgM·g{| xx|< ')O֗^_5n~mLx\d# ^\DeoG+/ .*J&ܲV+%x_nYX]N^sYE SɶJxfa _#0,aϹ~Fj_NU9WWzp[r$>0!O*$Å*u෋՚&wQ2qhE{.焌ZiR~Jw~A.}V,GQg[/APK[U V޿oe2dT8}UnjLReZ1q^Ǻ'NlĜ->|lrd=C'_A=^4 ֘X96Fjl|Sq,7njs8KF3 g߮#-$ՏlmuA UKs筏24if$DVdۉrm".Ykҩz ~qz|np"Q.i#( Oj,Z7f}]5J;1}֕n\_iU?}jW|>)Yޫ&uG t{"6[jnu]w?|_}V 'Z~5;m~(3~YwV{,W|܂_oM/C ("-nrziY0Ōs,oAA?A/cZNNxW9\6T(mubs]Uyp#S=3,aI}?_ůHR?T|U=!S .hs#) 3. =;Y=M^ S]7vLVnnl?'lÃǣ y7p"x G='|{8UK4tG[`H:{o*\yKRfqrdѢ~HnY:hh*"JZUvZv<`"Π=Z'A?`lvLj-`h:gr+nm!ω,f)n!bĵP@+ Y!>d ˳jy/&F:~.ogWí:{U jkTs+)ܚ|ƋIA66l16\9+I4{zeTu> W7򖔓`O~`*FY$7ไf/{h5-U-~ ,AN+'۷ zejT)`3))%KmDl;]'B )([QmQ(oZ!TMCd%!9Wߌzi~ط >kRPːL4v۩۱1#rt.%?_@cc|NA"j{DžxsӀL5>(+4g(@BimMwXKFll[/)Ud.ZGw ji 8pc7 DBj-'r҂%,*l f9a'L)42ag32L]Ld)nݛs֬ٯxa,{c=vF8C~g@@oYܒ`S>8/:X,.Pd-6=|z쬞l 49ysmiF$`n/AEa1?hJ[NkEj3Cz'[d _ɑQ22R7U:(ltv7}5384.}f%ȭzsjjPO_/TJ0I_d_~6^Xuyj?I[EZ}ݸ?MgV,=~_gWߔv'W_x5>Yz7v"W_{%%?K#q%%9D- _mL#-;Nm&J/Өt4nEt[QZ1TOzrfcҺ1Yܑi^+j͸,9.>GҁZ 8!vJvu~3Υ{ 1Dϸo_1Δ&?mn6 m ^ />҃]\s[X.?u# =ʡt&(>!>Kİlf L->Q B})s(oJzJB{j+5ihS#bMϽܮN#fց6g6&A91kAرiЦmIN^iǦA[R="O ] xA3H$=oK~[{`gɮ4=0*0[)x2>؏KJAًA5apx-o')nA"͕SqN&q38LR'IҊ_ ">:N$8J j20%vKsEOS[vsp"LєV[hOʴ߯H>նj|[""&R6)sW{ufMRϣOB P[&BxC;keCajϺ DcY;§瑤#~bg鿙0/P_u4?y71 zisUdY?a|KR?1|0'QQKpUϢf[/kz1Ukb2s*ْߒYvt}K2ۮz#YUYH60z.븹J`&Kۙ SRo`@t!vzKN^ gs'd|hh7ȸs7QAV/..9㋒]6_տ̷z>v$ow½NJ-zs&˜mDqsE"PW)׹kAErSy iw>s[nWOVb(dӊe3G8:(|>!Z Z$'Rg7ͬيQ/Db2d|؞L$9LUFѩX<kW:u^a' 9Ûl`Dyl+1$PWx%DP4xq}# {aQspR샃Mm Xq&Pd*n NS8U' FqA5'hoHe1S#ֻ<gqTX7ov)QԒ^w+>bս_ErmCuyyw@Pl6TGժ)bEA1]@bf tPyJ`-q'oHI6<5ul|[O1SSxi첗eZxub7Ik1}i?7e!l1kH(=t^4$([f<僇U^^g`t0m96xobOkc;1!lE[I4>}wi.@3Eh|A$9SIY,H;f(6# 6m,*`},@.}ЮH<ԁ4 ea#I"> yI+θveR`ӕ&i}W >-,RF>u~svv*q4yf@vJK9JrO9R Q~jV*1QZw"R] @BG=UIϲ"\,׊p4&;`fW JpYG([srޭ^*2DJ͏_$4ĝdD 8⩷ Cq1*k|@O=izc;Wu:[ < VBM*LTu{C8Kn3SAox|=T`Hגv/H2VdF8oLP<7<_+y~^x2$Mע4K ِ/g&blE"'`GH „ hJ m~SʓNOˡ|Hy E`d+4GQ}%}?Oi _Q5&oG/˄NCLM&cӹ\.˦9A ٤( fl:NY53icC8r(<"ϋeA 6 r9!\. K9'fEcTZ+̈B6Bx6M ',P&P L%0 cy, L8B&gB6S4JgX%ӿMH)\ZD)fzQfC9x /da60 ¤Y( FӰd!1)"|Bzg8s `n`  1*S8g|:",&(ٜ&Yq<XϠ1A!``Q8X-!6i o |+LL:'eYX > E@H個4a3Y3Go KaEdh$, f 0 ۰@r . l( ϣ<dfY!ܒd,C Bd`0<,eEGs U4H c[$TxsNeI9SFPҰ0OX""d0#y8#@Sbj$n?93F At\30h ,+sJc 1j3-Ȋ [b7 AR9X D&`b||~lAE4-74i&:Ck9~%L9LV` h PcX6dhh $r f !y HX +̉l4bFm'"rA' `CmҙlZA@ ,LeIW eE) RBH},iQT y<Ӡ@A0kd  Pk-X qxD4yTr=t5 $23.lF3NnX=C7 y`xЍ(>%` , 6>0`́Q2@hg3l@Q!s!kNO .&a^h~HWrCc[ 59(!K@B? yu1j endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 22 0 obj [21 0 R] endobj 35 0 obj <> endobj xref 0 36 0000000004 65535 f 0000000016 00000 n 0000000159 00000 n 0000008794 00000 n 0000000000 00000 f 0000036415 00000 n 0000000000 00000 f 0000008845 00000 n 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000036485 00000 n 0000036516 00000 n 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000010610 00000 n 0000036601 00000 n 0000009165 00000 n 0000010910 00000 n 0000010797 00000 n 0000009889 00000 n 0000010048 00000 n 0000010096 00000 n 0000010681 00000 n 0000010712 00000 n 0000010984 00000 n 0000011158 00000 n 0000012447 00000 n 0000014694 00000 n 0000036626 00000 n trailer <]>> startxref 36820 %%EOF ================================================ FILE: src/BuildCast/Assets/build2016windowsdevfeed.xml ================================================ Build 2017 Sessions Rev9 Sessions for Build 2017 https://s.ch9.ms/Events/Build/2017 en Project Rome Project Rome

]]>
https://s.ch9.ms/Events/Build/2017/C9R11 https://s.ch9.ms/Events/Build/2017/C9R11 Project Rome 1424 Mon, 22 May 2017 13:47:40 GMT https://s.ch9.ms/Events/Build/2017/C9R11
Overview of new Bot Framework features Over 100 new features have been added to the Bot Framwork at //Build. This talk provides a tour of what's new and what's changed.

]]>
https://s.ch9.ms/Events/Build/2017/C9R03 https://s.ch9.ms/Events/Build/2017/C9R03 Over 100 new features have been added to the Bot Framwork at //Build. This talk provides a tour of what's new and what's changed. 954 Thu, 11 May 2017 20:06:39 GMT https://s.ch9.ms/Events/Build/2017/C9R03 Chris Mullins
Bluetooth: Bluetooth GATT Server - Part 3 of 3 GATT Server opens up a myriad of Bluetooth Smart (LE) device scenarios. Learn about publishing a GATT server, notifications, and checking for Bluetooth radio hardware capabilities.

]]>
https://s.ch9.ms/Events/Build/2017/P4179 https://s.ch9.ms/Events/Build/2017/P4179 GATT Server opens up a myriad of Bluetooth Smart (LE) device scenarios. Learn about publishing a GATT server, notifications, and checking for Bluetooth radio hardware capabilities. 542 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4179 Frank Gorgenyi, Steffen Froehlich
Bluetooth: Unpaired Bluetooth LE Device Connectivity - Part 2 of 3 Pair no more! With the Windows 10 Creators Update, you can now communicate with your Bluetooth Smart (LE) devices without pairing.

]]>
https://s.ch9.ms/Events/Build/2017/P4178 https://s.ch9.ms/Events/Build/2017/P4178 Pair no more! With the Windows 10 Creators Update, you can now communicate with your Bluetooth Smart (LE) devices without pairing. 533 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4178 Frank Gorgenyi, Steffen Froehlich
Bluetooth: Intro to Bluetooth LE Explorer - Part 1 of 3 ]]> https://s.ch9.ms/Events/Build/2017/P4177 https://s.ch9.ms/Events/Build/2017/P4177 Learn about our new Bluetooth UWP sample app aimed to help you code and debug your Bluetooth apps. Quickly view the Gatt Services and characteristics on your peripheral or create a virtual peripheral in seconds. (Final) 724 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4177 Frank Gorgenyi, Steffen Froehlich Tips and tricks for creating performant UI in UWP ]]> https://s.ch9.ms/Events/Build/2017/P4173 https://s.ch9.ms/Events/Build/2017/P4173 Give your Windows 10 UWP app UI that next level of polish. An app with great UX should not only look good but should also be fast and fluid. This talk covers some tips and tricks for working with XAML and the Visual Layer to keep in mind that will help ensure a beautiful and adaptive, yet snappy, user experience. 1520 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4173 David Li, Robert Mikhayelyan What’s new for multi-tasking in UWP? ]]> https://s.ch9.ms/Events/Build/2017/P4172 https://s.ch9.ms/Events/Build/2017/P4172 This session provides an overview of the methods for running in the background on a scenario-by-scenario basis. Scenarios include Media Playback, Media Capture, Location Tracking, Bluetooth, Media Processing and others running in the background. We also cover how enterprises can enable and control background activity via MDM/Group Policy for the apps used in their enterprise. 1726 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4172 Chris Cortes Windows 10 on ARM ]]> https://s.ch9.ms/Events/Build/2017/P4171 https://s.ch9.ms/Events/Build/2017/P4171 For the first time ever, our customers will be able to experience the Windows they know with all the apps, and peripherals they require, on a mobile, power efficient, always-connected cellular PC. Watch to learn more and see Windows PCs running on Qualcomm Snapdragon processors. 797 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4171 Arun Kishan, Hari Pulapaka App Diagnostics #1: The new App Diagnostics APIs ]]> https://s.ch9.ms/Events/Build/2017/P4169 https://s.ch9.ms/Events/Build/2017/P4169 In this session, we examine the whole surface of the new app diagnostic APIs, how the API hierarchy models the kernel and platform runtime functionality, and what’s here in the Creators Update and coming in the next release. We also walk through building a UWP version of Task Manager. 1121 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4169 Andrew Whitechapel Dev Center: Advanced pricing, sales and release scheduling ]]> https://s.ch9.ms/Events/Build/2017/P4166 https://s.ch9.ms/Events/Build/2017/P4166 Learn about the exciting new features in Dev Center that provide you the ability to maximize user acquisition app revenue through conditional targeting of deals and discounts to a subset of users. We also explore how Dev Center puts you in precise control of your product’s release, pricing, and go-live date to align with your region specific marketing activities. 760 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4166 Bernardo Zamora Enable natural pen interaction by using Ink Analysis to better understand users’ ink The Creator’s Update brings new InkAnalysis APIs, allowing the user to ink naturally and enabling the system to recognize handwriting, shapes, document structure, lists, and more. We walk through how to take advantage of these APIs and share code samples.

]]>
https://s.ch9.ms/Events/Build/2017/P4165 https://s.ch9.ms/Events/Build/2017/P4165 The Creator’s Update brings new InkAnalysis APIs, allowing the user to ink naturally and enabling the system to recognize handwriting, shapes, document structure, lists, and more. We walk through how to take advantage of these APIs and share code samples. 1309 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4165 Jianfeng Lin
Microsoft Universal User Acquisition Platform ]]> https://s.ch9.ms/Events/Build/2017/P4154 https://s.ch9.ms/Events/Build/2017/P4154 In this session aimed at publishers wanting to acquire and re-engage with users, learn about how to acquire users using Microsoft Universal User Acquisition Platform, Dev Center Campaign experiences, analytics, API, and variety of ad formats to match your app's user experience perfectly. 552 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4154 Anusha Subramanian How to add an in-app purchase flow to your desktop app leveraging the Desktop Bridge ]]> https://s.ch9.ms/Events/Build/2017/P4148 https://s.ch9.ms/Events/Build/2017/P4148 Whether your app is free or not, you can sell content, other apps, or new app functionality (such as unlocking the next level of a game) from right within your desktop application. You can easily integrate in-app purchase flow to your app, thanks to the Desktop Bridge; you can do it from any desktop application such as: WPF, WinForms, MFC, or even Visual Basic 6. The Desktop Bridge also allow your application to leverage from simplified and trusted deployment, easier monetization, and the ability to modernize your app with the all latest Windows 10 features. Features that were available only for UWPs are now available to any desktop app. 839 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4148 Vladimir Postel Dev Center analytics for Win32 developers ]]> https://s.ch9.ms/Events/Build/2017/P4118 https://s.ch9.ms/Events/Build/2017/P4118 Developers who publish UWP apps in the Windows Store get the benefit of access to analytics and insights about app performance and reliability, along with services to engage customers and create monetization opportunities. In this session, learn how Win32 application developers can get similar analytics and insights benefits within Dev Center, with access to health, usage, and install reports – even though their desktop applications aren’t published through the Windows Store using the Desktop Bridge. Win32 developers can use these analytics to assess the reliability of their desktop applications to ultimately provide a better experience to their customers. 1098 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4118 Sonia Carlson Maximizing user engagement with customized app content ]]> https://s.ch9.ms/Events/Build/2017/P4116 https://s.ch9.ms/Events/Build/2017/P4116 Learn about the new advanced targeting capabilities in Dev Center. Show customized app content at runtime to incentivize customer behavior, optimize engagement, and increase monetization. 728 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4116 Yamil Hernandez Go big! Optimizing your applications for large screen experiences  Organizations are modernizing their workspaces with Surface Hubs and large screen devices to support group collaboration and workplace transformation. Capture these environments with powerful, captivating apps that are designed for collaboration. From the conference room to the developer bullpen your immersive apps will enable you to reach new users. In this session learn how you can optimize your Windows applications for large screen experiences. Learn how you can leverage the responsive, immersive 84” 4K display with up to 100 points of touch and three concurrent inking streams to developed enhanced functionality.

]]>
https://s.ch9.ms/Events/Build/2017/P4115 https://s.ch9.ms/Events/Build/2017/P4115 Organizations are modernizing their workspaces with Surface Hubs and large screen devices to support group collaboration and workplace transformation. Capture these environments with powerful, captivating apps that are designed for collaboration. From the conference room to the developer bullpen your immersive apps will enable you to reach new users. In this session learn how you can optimize your Windows applications for large screen experiences. Learn how you can leverage the responsive, immersive 84” 4K display with up to 100 points of touch and three concurrent inking streams to developed enhanced functionality. 1384 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4115 Mark Rideout
Bot conversations for apps ]]> https://s.ch9.ms/Events/Build/2017/P4114 https://s.ch9.ms/Events/Build/2017/P4114 The same bot that you create as a Cortana skill or a Skype bot can be accessed from applications. Learn how to access the bot’s intelligence in the cloud with voice, text, and UI input and create rich a conversation experience for apps. 1167 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4114 Khuram Shahid A quick lap around Microsoft Ad Monetization Platform ]]> https://s.ch9.ms/Events/Build/2017/P4112 https://s.ch9.ms/Events/Build/2017/P4112 Learn about new Microsoft Monetization Platform that will help accelerate audience growth, boost monetization, and simplify your ad business for your apps. Get an overview of the new server-side Microsoft Monetization Platform, and learn about new ad experiences – native, playable, and video. Hear about new capabilities to drive installs and re-engage through Microsoft Universal App Promotion. 1117 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4112 Kiran Bangalore UWP Apps file access improvements ]]> https://s.ch9.ms/Events/Build/2017/P4102 https://s.ch9.ms/Events/Build/2017/P4102 Windows makes it easy to bring existing code into UWP apps, and we see that virtually every app will access the file system at some point. This session covers how to open and enumerate files using familiar APIs, including strategies for optimizing some of your existing file access code. 760 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4102 Adam Wilson, steve maillet Surface Dial: What’s new in the Creators Update? ]]> https://s.ch9.ms/Events/Build/2017/P4100 https://s.ch9.ms/Events/Build/2017/P4100 In the Windows 10 Creators Update, we’ve given developers and users more power and flexibility in how they take advantage of the Surface Dial. In this session, we show you the new features supported in the RadialController APIs – including new gestures like press-and-rotate; more control over input and output with off-UI thread input for UWPs and haptic feedback interfaces; and additional menu customization with font glyph support and menu suppression. 1574 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4100 Connor Weins Production tracing with Event Tracing for Windows (ETW) ]]> https://s.ch9.ms/Events/Build/2017/P4099 https://s.ch9.ms/Events/Build/2017/P4099 An overview of ETW and the frameworks built around it, including WPP, manifests, Event Log, and the new TraceLogging framework. 1855 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4099 Doug Cook Innovate faster with Windows as a Service (WaaS) ]]> https://s.ch9.ms/Events/Build/2017/P4087 https://s.ch9.ms/Events/Build/2017/P4087 Windows 10 and Windows as a service (WaaS) enable significantly shorter product cycles while maintaining high quality and an innovative community-centric approach to app development. This session explains the benefits of decoupling app releases from the Windows lifecycle, how to take advantage of the new building, deploying, and servicing model, as well as the new features being released to Windows. We share best practices, tools, and services that Microsoft is developing to make the transition easier for our app development partners. This includes critical considerations such as maintaining compatibility, leveraging app telemetry, and engaging with Microsoft. 1364 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4087 Ethel García Simon Matachana, Steve DiAcetis Beyond App Containers: Gaining privileged access to hardware inside your Windows app using custom capabilities Ever wished you could provide an immersive Windows app experience by leveraging hardware capabilities that were previously off-limits from within an app container? Look no further. Custom capabilities empowers hardware owners (IHVs) to expose hardware capabilities to Windows app developers and manage them securely. This session provides an overview about custom capabilities; how to gain access and use them within your Windows application. A code walkthrough using a sample application illustrates the high level app development process.

]]>
https://s.ch9.ms/Events/Build/2017/P4086 https://s.ch9.ms/Events/Build/2017/P4086 Ever wished you could provide an immersive Windows app experience by leveraging hardware capabilities that were previously off-limits from within an app container? Look no further. Custom capabilities empowers hardware owners (IHVs) to expose hardware capabilities to Windows app developers and manage them securely. This session provides an overview about custom capabilities; how to gain access and use them within your Windows application. A code walkthrough using a sample application illustrates the high level app development process. 1046 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4086 Viraf Gandhi, Ben McGregor
Windows High DPI Improvements for Desktop ]]> https://s.ch9.ms/Events/Build/2017/P4085 https://s.ch9.ms/Events/Build/2017/P4085 High DPI displays are becoming commonplace. Unfortunately, many non-UWP desktop applications can become blurry or can be sized incorrectly when used on a system that has both high and low DPI displays. In this session, learn what Windows offers to help you update your application to render properly in both high DPI and changing-DPI scenarios. We also cover some of the improvements that are coming to Windows that will give you a better experience when using Windows on high DPI hardware. 1382 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4085 James Clarke, Peter Felts UI Testing: What's new with WinAppDriver ]]> https://s.ch9.ms/Events/Build/2017/P4084 https://s.ch9.ms/Events/Build/2017/P4084 UI Testing: What's New with WinAppDriver 505 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4084 Yosef Durr OpenType variable fonts: How to use fewer fonts and get a lot more typographic richness The OpenType font format has been extended with an exciting new technology, OpenType Font Variations. An OpenType variable font is a single font that can behave like many separate fonts by supporting continuous variation between different designs defined in the font. This is the biggest development in OpenType since the introduction of OpenType itself! In this video, we give an overview of OpenType variable fonts, show how some of the capabilities of variable fonts may already be accessible in your existing apps, and describe new DirectWrite APIs that will enable you to take advantage of the full capabilities of this new OpenType format.

]]>
https://s.ch9.ms/Events/Build/2017/P4081 https://s.ch9.ms/Events/Build/2017/P4081 The OpenType font format has been extended with an exciting new technology, OpenType Font Variations. An OpenType variable font is a single font that can behave like many separate fonts by supporting continuous variation between different designs defined in the font. This is the biggest development in OpenType since the introduction of OpenType itself! In this video, we give an overview of OpenType variable fonts, show how some of the capabilities of variable fonts may already be accessible in your existing apps, and describe new DirectWrite APIs that will enable you to take advantage of the full capabilities of this new OpenType format. 1919 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4081 Peter Constable, Shrinath Shanbhag
Vector iconography: Using SVG images in your app SVG is the de facto standard for vector graphics images, with ubiquitous authoring support and an ever-growing prominence on the web. With Windows 10 Creators Update, you can finally bring the convenience and efficiency of SVG images to your Windows app. Use XAML to draw SVG images with a single line of code, or use powerful new APIs in Direct2D to parse, render, and manipulate SVG images. In this presentation we cover what parts of SVG are supported; when to use SVG; and how to load, draw, and manipulate SVG images.

]]>
https://s.ch9.ms/Events/Build/2017/P4078 https://s.ch9.ms/Events/Build/2017/P4078 SVG is the de facto standard for vector graphics images, with ubiquitous authoring support and an ever-growing prominence on the web. With Windows 10 Creators Update, you can finally bring the convenience and efficiency of SVG images to your Windows app. Use XAML to draw SVG images with a single line of code, or use powerful new APIs in Direct2D to parse, render, and manipulate SVG images. In this presentation we cover what parts of SVG are supported; when to use SVG; and how to load, draw, and manipulate SVG images. 749 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4078 Rick Manning
What's new in Accessibility & How to Get Started for Developers In this video, the Windows Accessibility PM lead provides an overview of recent investments designed to make Windows 10 more usable for people with disabilities and to make it easier for developers to create accessible experiences. Hear about the Windows’ accessibility vision and features that are coming to market later in 2017. Learn how developers can create accessible experiences and where to go for additional information and support. This is a great introduction for someone who is new to accessibility or for someone looking to get up to speed on the latest news.

]]>
https://s.ch9.ms/Events/Build/2017/P4072 https://s.ch9.ms/Events/Build/2017/P4072 In this video, the Windows Accessibility PM lead provides an overview of recent investments designed to make Windows 10 more usable for people with disabilities and to make it easier for developers to create accessible experiences. Hear about the Windows’ accessibility vision and features that are coming to market later in 2017. Learn how developers can create accessible experiences and where to go for additional information and support. This is a great introduction for someone who is new to accessibility or for someone looking to get up to speed on the latest news. 1666 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4072 Jeff Petty
Desktop Bridge Apps & User Transition ]]> https://s.ch9.ms/Events/Build/2017/P4067 https://s.ch9.ms/Events/Build/2017/P4067 The Windows 10 Creators Update will enable desktop app developers to provide a smooth user transition from the previous desktop app to the store version. This topic includes transition of the user’s taskbar pin(s), start menu tile(s), file type associations, and protocol handlers. In addition, we cover best practices to migrate user data and uninstall the previous desktop app. Users will be encouraged to download the store version of their desktop apps. If the user already has the previous desktop version of the app, the transition experience should be as seamless as possible. 1167 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4067 Arian Ghotbi Lighting up HDR and advanced color in DirectX Windows 10 Creators Update allows you to build apps and experiences that exploit the full color capabilities of HDR (high dynamic range), WCG (wide color gamut), and other advanced color displays. Wow your users with vivid, lifelike games, media and other visual content that use brighter peak luminance, more saturated colors, and greater precision than was possible in Windows before. We give a primer on HDR and color concepts and show you how to build amazing advanced color experiences in DirectX.

]]>
https://s.ch9.ms/Events/Build/2017/P4061 https://s.ch9.ms/Events/Build/2017/P4061 Windows 10 Creators Update allows you to build apps and experiences that exploit the full color capabilities of HDR (high dynamic range), WCG (wide color gamut), and other advanced color displays. Wow your users with vivid, lifelike games, media and other visual content that use brighter peak luminance, more saturated colors, and greater precision than was possible in Windows before. We give a primer on HDR and color concepts and show you how to build amazing advanced color experiences in DirectX. 1525 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4061 Simon Tao
Collect and analyze crashes for your Windows apps ]]> https://s.ch9.ms/Events/Build/2017/P4057 https://s.ch9.ms/Events/Build/2017/P4057 Most every app crashes sometimes. When it happens, it's important to understand when and why so you can address problems quickly and keep your users happy. In this video, we show you how to enable crash reporting and analyze crash data for your UWP app through the new Windows Crash beacon in Visual Studio Mobile Center. 933 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4057 Francis Zhou, Ela Malani My People: the Taskbar is a Window to your app ]]> https://s.ch9.ms/Events/Build/2017/P4056 https://s.ch9.ms/Events/Build/2017/P4056 In Windows 10, UWP app developers can take advantage of new experiences that allow contacts provided by their apps to be elevated in Windows. Developers can build apps that makes it possible for the user to pin their favorite people to the taskbar, enabling quick and easy communication and sharing. Also, with the Windows 10 update, developers can take advantage of a direct line of sharing with people via the new “people first” experience in the share picker. This session covers the experiences developers can now build using the My People framework that will drive increased acquisition and engagement with your app in Windows 10. 777 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4056 Tony Pendolino, Allison O'Mahony Advancing commerce: Bring a fast and easy checkout experience to your customers across the web, UWP platform, and bots ]]> https://s.ch9.ms/Events/Build/2017/P4055 https://s.ch9.ms/Events/Build/2017/P4055 eCommerce has grown significantly over the past few years and Microsoft is ready to help online businesses grow even faster. We are introducing the Windows/Microsoft Edge Payment Request API with the release of the Creators Update. Customers using Edge, apps, or bots will now be able to store their payment information with Microsoft and use those payment instruments to complete payment requests. The ability to quickly retrieve payment information is aimed at improving checkout experience as well as the completion rate of purchases. Join us to learn about how the Payment Request API can improve the payment experience for your project. 949 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4055 Molly Dalton, Jonathan Cutler, Stan Chang universal+windows+platform+uwp web+platform monetization UWP Bridges for Retail Applications This session explores two bridging technologies which enable UWP applications on Windows desktop to interact with a wide variety of peripherals used in retail environments. The OPOS Bridge allows your UWP application to interact with OPOS enabled peripherals using the Windows.Devices.PointOfService namespace, while the Desktop Bridge allows you to access even more peripheral types from your application using third party extensions such as OPOS or POS for .NET even if they are not supported in UWP at this time.

]]>
https://s.ch9.ms/Events/Build/2017/P4050 https://s.ch9.ms/Events/Build/2017/P4050 This session explores two bridging technologies which enable UWP applications on Windows desktop to interact with a wide variety of peripherals used in retail environments. The OPOS Bridge allows your UWP application to interact with OPOS enabled peripherals using the Windows.Devices.PointOfService namespace, while the Desktop Bridge allows you to access even more peripheral types from your application using third party extensions such as OPOS or POS for .NET even if they are not supported in UWP at this time. 1001 Thu, 11 May 2017 17:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4050 Marcus Breda, Terry Warwick
What is new in Insights APIs in Microsoft Graph Learn about the new updates to Trending and other APIs in Microsoft Graph that provide contextual insights based on users' activity in the service.

]]>
https://s.ch9.ms/Events/Build/2017/P4180 https://s.ch9.ms/Events/Build/2017/P4180 Learn about the new updates to Trending and other APIs in Microsoft Graph that provide contextual insights based on users' activity in the service. 499 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4180 Mário Henriques office microsoft+graph
Add custom data to Microsoft Graph Learn how to add you own data into Microsoft Graph.

]]>
https://s.ch9.ms/Events/Build/2017/P4153 https://s.ch9.ms/Events/Build/2017/P4153 Learn how to add you own data into Microsoft Graph. 876 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4153 Dan Kershaw microsoft+graph
Microsoft Graph - Delta Query and Webhooks Learn how to keep your app current with all data updates using webhooks and delta query in Microsoft Graph.

]]>
https://s.ch9.ms/Events/Build/2017/P4152 https://s.ch9.ms/Events/Build/2017/P4152 Learn how to keep your app current with all data updates using webhooks and delta query in Microsoft Graph. 780 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4152 Jeff Sakowicz office microsoft+graph
Build smart productivity apps with Microsoft Graph JavaScript SDK  Lean how to use the Microsoft Graph JS SDK to build your next integration with Office 365 with JS, TypeScript, and Node.js.

]]>
https://s.ch9.ms/Events/Build/2017/P4137 https://s.ch9.ms/Events/Build/2017/P4137 Lean how to use the Microsoft Graph JS SDK to build your next integration with Office 365 with JS, TypeScript, and Node.js. 876 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4137 Dan Silver office microsoft+graph
Build End-to-End Solutions using Microsoft Graph and Common Data Service Microsoft provides a platform for building end-to-end solutions. This sample show cases how professional developers can build people centric, data rich apps that leverage productivity and business data from Microsoft Graph and Common Data Service. And how power users can leverage that data further to create apps, flows, and dashboards.

Microsoft Graph is the unified API for Microsoft services. That includes Office 365, Azure Active Directory, and many others.

Microsoft Common Data Service or CDS is a focal point for a business's data. Professional developers can write applications that interact with that data in CDS and power users can take advantage of PowerApps, Flow, and PowerBI to create apps, design workflows, and perform deep analytics over that data without writing any code.

Microsoft Graph gives you access to rich data from Microsoft services. Once you bring that data to CDS, you can combine it with other business data that your business depends on. Then you can build rich applications and workflows with easy to use building blocks (such as PowerApps, Flow, PowerBI) whether you know how to write code or not. So using Microsoft Graph and Common Data Service developers can not only build people centric, data rich apps but the app can be extended by power users who are not regular coders to have additional experiences.

]]>
https://s.ch9.ms/Events/Build/2017/P4136 https://s.ch9.ms/Events/Build/2017/P4136 Microsoft provides a platform for building end-to-end solutions. This sample show cases how professional developers can build people centric, data rich apps that leverage productivity and business data from Microsoft Graph and Common Data Service. And how power users can leverage that data further to create apps, flows, and dashboards. Microsoft Graph is the unified API for Microsoft services. That includes Office 365, Azure Active Directory, and many others. Microsoft Common Data Service or CDS is a focal point for a business's data. Professional developers can write applications that interact with that data in CDS and power users can take advantage of PowerApps, Flow, and PowerBI to create apps, design workflows, and perform deep analytics over that data without writing any code. Microsoft Graph gives you access to rich data from Microsoft services. Once you bring that data to CDS, you can combine it with other business data that your business depends on. Then you can build rich applications and workflows with easy to use building blocks (such as PowerApps, Flow, PowerBI) whether you know how to write code or not. So using Microsoft Graph and Common Data Service developers can not only build people centric, data rich apps but the app can be extended by power users who are not regular coders to have additional experiences. 874 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4136 Chris Garty, Suresh Jayabalan office microsoft+graph
Build bots in Skype for Business ]]> https://s.ch9.ms/Events/Build/2017/P4135 https://s.ch9.ms/Events/Build/2017/P4135 Coming soon 988 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4135 David Newman office Build applications with Microsoft Visio ]]> https://s.ch9.ms/Events/Build/2017/P4133 https://s.ch9.ms/Events/Build/2017/P4133 Hear about what's new with Visio APIs, and more. 633 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4133 Rahul Mittal, Rohan Shah office Notify your users through your Microsoft Teams app ]]> https://s.ch9.ms/Events/Build/2017/P4132 https://s.ch9.ms/Events/Build/2017/P4132 Learn how your app can reach out and engage directly with users. Creating an actionable message in a Connector allows you not only to push information from your service directly into a channel, but users can interact and push updates back to you. Additionally, your app can now have private or team-wide notifications appear in a user’s activity feed to alert them of important updates. With the Microsoft Teams Developer Platform, you can make your service available to users within Teams in contexts that make sense. The Teams developer platform makes it easy for you to integrate your own service, whether you develop custom apps for your team or SaaS applications for teams around the world. Learn more about the Microsoft Teams developer platform at https://Dev.Office.com/Microsoft-Teams Download sample code: https://aka.ms/teamsSamples Download sample manifests: https://aka.ms/teamsManifests Register as a developer: https://aka.ms/devregister Submit your app: https://aka.ms/submitTeamsApp 702 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4132 Andrew Spiziri office Office add-in single sign-on ]]> https://s.ch9.ms/Events/Build/2017/P4131 https://s.ch9.ms/Events/Build/2017/P4131 This session offers an intro into how to implement SSO in Office add-ins. 575 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4131 Tim McConnell office Actionable Messages in Outlook ]]> https://s.ch9.ms/Events/Build/2017/P4127 https://s.ch9.ms/Events/Build/2017/P4127 Learn how to build solutions with Actionable Messages in Microsoft Outlook. 782 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4127 David Claux office Build a great bot for your Microsoft Teams app ]]> https://s.ch9.ms/Events/Build/2017/P4126 https://s.ch9.ms/Events/Build/2017/P4126 Learn how to build a great bot for Microsoft Teams. These bots let users interact with your service through conversations in Teams. With the Microsoft Teams Developer Platform, you can make your service available to users within Teams in contexts that make sense. The Teams developer platform makes it easy for you to integrate your own service, whether you develop custom apps for your team or SaaS applications for teams around the world. Learn more about the Microsoft Teams developer platform at https://Dev.Office.com/Microsoft-Teams Download sample code: https://aka.ms/teamsSamples Download sample manifests: https://aka.ms/teamsManifests Register as a developer: https://aka.ms/devregister Submit your app: https://aka.ms/submitTeamsApp 661 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4126 Larry Jin Latest on Excel Extensibility ]]> https://s.ch9.ms/Events/Build/2017/P4125 https://s.ch9.ms/Events/Build/2017/P4125 Explore the latest news on Microsoft Excel development. 591 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4125 Sudhi Ramamurthy office Catch up on Outlook APIs in Microsoft Graph Learn about recent updates in Microsoft Graph for accessing Outlook mail, calendar, contacts and more for millions of commercial and consumer users. Learn about the new updates to People APIs in Microsoft Graph that provide information about the people who are important to you across mail, contacts, and social networks and with powerful search capabilities.

]]>
https://s.ch9.ms/Events/Build/2017/P4123 https://s.ch9.ms/Events/Build/2017/P4123 Learn about recent updates in Microsoft Graph for accessing Outlook mail, calendar, contacts and more for millions of commercial and consumer users. Learn about the new updates to People APIs in Microsoft Graph that provide information about the people who are important to you across mail, contacts, and social networks and with powerful search capabilities. 832 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4123 Shreedevi Padmasini microsoft+graph
Migrating your app to Azure and extending it for global scale ]]> https://s.ch9.ms/Events/Build/2017/P4122 https://s.ch9.ms/Events/Build/2017/P4122 You have been told to move your on-premises app to the cloud and make it run reliably at scale. Sounds simple enough – but how practical is it and where do you start? Come join us on the journey of a three-tier app as it grows from a developer desktop all the way to a multi-region, multi-instance cloud scale deployment that is resilient to failures. Want to be part of the adventure? Download the code samples and instructions and try it out yourself. 1467 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4122 Steven Follis Advanced cross-platform mobile apps with Azure Mobile Apps and Xamarin ]]> https://s.ch9.ms/Events/Build/2017/P4121 https://s.ch9.ms/Events/Build/2017/P4121 Creating connected mobile applications often requires some form of backend infrastructure. In this session, you'll learn how to reuse your existing .NET skills to quickly build web services into your Xamarin apps, leveraging the power of Azure App Service. See how simple it is to integrate the Azure App Service Mobile Apps SDK to integrate online/offline data synchronization, file storage, push notifications, and a lot more in just a few minutes. Whether you're a new mobile developer or an experienced enterprise team lead, Azure App Service and Xamarin give you everything you need to build better apps. 1129 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4121 James Montemagno Azure CLI 2.0 ]]> https://s.ch9.ms/Events/Build/2017/P4119 https://s.ch9.ms/Events/Build/2017/P4119 Learn about the next generation of Azure CLI – optimized to support bash and other command line environments natively and providing a powerful but simple set of commands for administering Azure resources. 619 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4119 Jason Shaver Building cloud connected .NET apps with Visual Studio 2017 ]]> https://s.ch9.ms/Events/Build/2017/P4117 https://s.ch9.ms/Events/Build/2017/P4117 You've seen it time and time again—the true power of the .NET is being able to write applications that can run on various platforms. In this session we look at this in action. We look at an end-to-end solution that leverages UWP applications targeting IoT and desktop, all powered by an Azure backend. 807 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4117 Karan Nandwani, Ricardo Minguez Application Insights for .NET Microservices and Containers ]]> https://s.ch9.ms/Events/Build/2017/P4113 https://s.ch9.ms/Events/Build/2017/P4113 Come to this session to learn how you can use Application Insights to tame the complexity of .NET microservices and containers. We take a quick tour of how to make the most of the Application Map and Analytics with Service Fabric and Docker with Service Fabric and Kubernetes. 1024 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4113 Dan Taylor visual+studio docker application+insights service+fabric microservices Java on Azure ]]> https://s.ch9.ms/Events/Build/2017/P4111 https://s.ch9.ms/Events/Build/2017/P4111 Learn how you can use Java on Azure and develop, deploy and debug web apps, functions, container-based apps, and big data apps using your favorite Java IDEs and frameworks. 835 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4111 Asir Selvasingh Package management 101 ]]> https://s.ch9.ms/Events/Build/2017/P4110 https://s.ch9.ms/Events/Build/2017/P4110 You make use of components more and more in software development with NPM, Maven and NuGet. Come learn how Visual Studio Team Services can help you manage your teams packages. 514 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4110 Alex Mullans, Calvin Jones visual+studio+team+services Get my ASP.NET 4 app running in containers in Azure ]]> https://s.ch9.ms/Events/Build/2017/P4107 https://s.ch9.ms/Events/Build/2017/P4107 Containers, containers, containers – I know I need to get going, but what can they do for my &quot;old&quot; ASP.NET MVC 4 application? And how can that help me get on a path to modern DevOps, cloud and easy maintenance? 1021 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4107 Mikkel Mork Hegnhoj azure visual+studio service+fabric microservices visual+studio+team+services Build a CI/CD pipeline from Visual Studio ]]> https://s.ch9.ms/Events/Build/2017/P4105 https://s.ch9.ms/Events/Build/2017/P4105 In this video Donovan Brown shows you how to use the new Continuous Delivery Extension for Visual Studio to build a complete CI/CD pipeline in Visual Studio Team Service and deploy to Azure. 864 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4105 Donovan Brown visual+studio OSS-based DevOps - All Roads lead to Azure, Part I: CI/CD with Jenkins and Netflix Spinnaker In this session, learn how to build, test, and deploy to Azure using best-of-breed tools such as Jenkins and Netflix Spinnaker.

]]>
https://s.ch9.ms/Events/Build/2017/P4104 https://s.ch9.ms/Events/Build/2017/P4104 In this session, learn how to build, test, and deploy to Azure using best-of-breed tools such as Jenkins and Netflix Spinnaker. 787 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4104 Arun Chandrasekhar
What's new in ChakraCore ]]> https://s.ch9.ms/Events/Build/2017/P4103 https://s.ch9.ms/Events/Build/2017/P4103 In this session we cover the updates to ChakraCore in the last year and lay out the road ahead. We talk about the progress we've made around performance, language support, emerging technologies like WebAssembly and Time Travel debugging. We also talk about how Chakra is now available across multiple OS platforms and the work we've been doing with the Node.js core project to help solve some of the key problems with Node.js like providing a stable Node API for native module developers. 1094 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4103 Brian Terlson Git at scale ]]> https://s.ch9.ms/Events/Build/2017/P4101 https://s.ch9.ms/Events/Build/2017/P4101 Learn how Microsoft uses Git in large teams, and how you can make use of the advanced Pull Request and Code Review features in Visual Studio Team Services. Peek under hood to understand how Microsoft makes large repos and servers scale to support some of the most demanding needs of any software engineering team. 881 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4101 Edward Thomson A lap around R Tools 1.0 for Visual Studio 2017 ]]> https://s.ch9.ms/Events/Build/2017/P4096 https://s.ch9.ms/Events/Build/2017/P4096 R Tools for Visual Studio is a new, open source and free tool for R users built on top of the powerful Visual Studio IDE. In this talk, we take you on a tour of its features and show how they can help you be a more productive R user. We look at: integrated debugging support; variable/data frame visualization; plotting and help integration; using the Editor and REPL in concert with each other; RMarkdown and Shiny integration using Microsoft Excel and SQL Server; Extensions and source control. We also demo our R remoting feature that allows developers to execute R code on SQL Server. 1015 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4096 John Lam azure visual+studio r data+science A lap around Python tools in Visual Studio ]]> https://s.ch9.ms/Events/Build/2017/P4095 https://s.ch9.ms/Events/Build/2017/P4095 Learn about the Data Science workload in Visual Studio and how it can help developers install the latest and greatest Python tools and distributions for Windows. We look at using these tools to solve machine learning problems within minutes, debug Python code running on a remote VM, and some nifty new REPL features. We demonstrate how the Cookiecutter Explorer can help developers get started with Microsoft Azure faster, and how it is easier than ever to deploy web apps to Azure App Service from the comfort of Visual Studio. 1127 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4095 Steve Dower, Usman Anwer visual+studio python Building cross platform applications with ReactNative ]]> https://s.ch9.ms/Events/Build/2017/P4080 https://s.ch9.ms/Events/Build/2017/P4080 React Native is a great way to build mobile applications for iOS, Android, and Windows using JavaScript. Learn about the tools from Microsoft to super charge your React Native developer workflow. See how VSCode can enable IntelliSense and inline debugging of React Native apps. Set up an automated DevOps workflow, understand user behavior using analytics, collect crash reports and distribute your app to end users and testers seamlessly. Use CodePush to update apps instantly and deliver the latest updates to users quickly. 1388 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4080 Parashuram Narasimhan visual+studio visual+studio+code Learn how to deliver a compelling test-drive experience on Microsoft AppSource ]]> https://s.ch9.ms/Events/Build/2017/P4077 https://s.ch9.ms/Events/Build/2017/P4077 More and more business users are looking for easier ways to discover and try apps before engaging IT. Having a compelling test-drive or trial experience is a cornerstone for your success in the marketplace. If your application uses Microsoft Azure, Microsoft Dynamics 365, PowerApps, Power BI, Microsoft Flow, etc then join us to learn how you can leverage Microsoft AppSource provisioning and Test Drive management framework to create a frictionless trial experience. 1774 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4077 Satish Thomas, Shefy Manayil Kareem Bot Human Handoff ]]> https://s.ch9.ms/Events/Build/2017/P4075 https://s.ch9.ms/Events/Build/2017/P4075 Bots can’t replace our human agents, but they can augment the customer service experience. This session explores how we can use a bot to initiate a conversation with a customer, and then hand off context to a human agent. 1191 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4075 Hannah Krager bots artificial+intelligence bot+framework The next generation of HockeyApp: Visual Studio Mobile Center In this video, Ian previews the first step in our [transition plan](https://hockeyapp.net/mobile-center): using your existing HockeyApp apps inside Mobile Center. This will be initially limited to HockeyApp Preseason customers and will expand over the coming months to all HockeyApp customers.

]]>
https://s.ch9.ms/Events/Build/2017/P4069 https://s.ch9.ms/Events/Build/2017/P4069 In this video, Ian previews the first step in our [transition plan](https://hockeyapp.net/mobile-center): using your existing HockeyApp apps inside Mobile Center. This will be initially limited to HockeyApp Preseason customers and will expand over the coming months to all HockeyApp customers. 524 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4069 Ian Janicki visual+studio hockeyapp
Transform your monitoring and diagnostics with machine learning and big data ]]> https://s.ch9.ms/Events/Build/2017/P4068 https://s.ch9.ms/Events/Build/2017/P4068 Analyzing tons of telemetry data, whether structured or unstructured, and deriving insights to fix problems is complex and tedious. It is further complicated when you need to correlate datasets across applications and systems and deliver information instantaneously. Monitoring solutions in Microsoft Azure such as Application Insights and OMS Insight &amp; Analytics can analyze billions of data points and terabytes of log data at scale to provide immediate actionable insights. This session demonstrates how developers and IT pros can use the log analytics, big data querying, and machine learning capabilities in these solutions to easily do deep mining and advanced analysis of telemetry from their apps, services, and infrastructure, so they can detect and diagnose service issues that are not readily apparent. 1018 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4068 Evgeny Ternovsky Designing conversational UI for bots (and humans) ]]> https://s.ch9.ms/Events/Build/2017/P4066 https://s.ch9.ms/Events/Build/2017/P4066 The Bot Framework enables you to quickly build and publish a bot to engage with users on many of the popular messaging services like Skype, Microsoft Teams, Facebook Messenger, and Slack. But to many designers and developers, designing an “app” UI as a conversation in a messaging windows is a new and daunting prospect. In this session, you'll learn how to design a conversational UI that feels as fast, as fluid, and as natural as a messaging conversation between friends, while driving user engagement for your bot. 2373 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4066 Chris Mayo bots artificial+intelligence bot+framework A Whirlwind Tour of Microsoft Security Risk Detection Hear from the developers of Microsoft Security Risk Detection how they built a service that brings a suite of security testing tools to you in an easy to use package. You will see “under the hood” of the service, including details of the technology used and how we used Azure to build a multi-tenant, scalable service. You will learn about why we made different design decisions guided by experience at Microsoft and how you can use this learning for your own organization.

]]>
https://s.ch9.ms/Events/Build/2017/P4065 https://s.ch9.ms/Events/Build/2017/P4065 Hear from the developers of Microsoft Security Risk Detection how they built a service that brings a suite of security testing tools to you in an easy to use package. You will see “under the hood” of the service, including details of the technology used and how we used Azure to build a multi-tenant, scalable service. You will learn about why we made different design decisions guided by experience at Microsoft and how you can use this learning for your own organization. 2067 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4065 William Blum, Marina Polishchuk artificial+intelligence security risk+detection
Authentication in Cortana Skills ]]> https://s.ch9.ms/Events/Build/2017/P4063 https://s.ch9.ms/Events/Build/2017/P4063 Cortana Skills can make calls to other services that require authentication, such as the Microsoft Graph. The easiest way to implement this for a service that requires OAuth 2.0 authentication is to configure a Connected Service for your skill and let Cortana manage the authentication token which is passed to your skill on invocation. Alternatively, you can manage the authentication entirely within your skills service which requires more work but gives greater flexibility. In this session, we’ll walk through how to configure a Connected Service and how to access the authentication tokens within your skill service to make authenticated calls, and we’ll cover how to implement skill-managed authentication. 1560 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4063 Andy Wigley, Nafis Zaman artificial+intelligence cortanta+skills cortana Delivering world-class game experiences using Microsoft Azure: Lessons learned from titles like Halo, Hitman, and Walking Dead ]]> https://s.ch9.ms/Events/Build/2017/P4062 https://s.ch9.ms/Events/Build/2017/P4062 Learn how major titles like Halo, Hitman, and Walking Dead are using Azure to build great experiences for their players. Building game servers, storing data, and managing game analytics may be easier than you think. You could be building mobile, PC or console games. You could be an Indie-developer or a large game studio. Azure has a lot of services to offer to build amazing game experiences, save money, and monetize your player base. If you have an existing backend infrastructure or are planning to create a new solution from scratch, Azure provides you the flexibility and security to get your game running quickly at global hyper scale. Learn about sample codes, reference architectures and partner solutions on Azure to quickly build your next game on cloud. 3205 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4062 Gowtham Prasad How your applications can benefit from AI using Bing APIs on Microsoft Cognitive Services ]]> https://s.ch9.ms/Events/Build/2017/P4060 https://s.ch9.ms/Events/Build/2017/P4060 Bing APIs on Cognitive Services provides a wealth of AI capabilities for you to use in your enterprise or mobile applications. Learn how easy it is to incorporate knowledge and intelligence into your applications and take your business to the next level. 715 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4060 Ansuman Kar, Brian King artificial+intelligence cognitive+services bing Unleashing Visual Studio Power for Projectless Code ]]> https://s.ch9.ms/Events/Build/2017/P4053 https://s.ch9.ms/Events/Build/2017/P4053 Visual Studio 2017 introduced a new way to work with codebases that don’t have projects and solutions. Remember creating artificial projects just to group files together and open them in Visual Studio? Not anymore. Learn how to bring the power of Visual Studio to any codebase and tune your favorite IDE features just right. Increase adoption of your language or platform by extending the Visual Studio open folder experience. 828 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4053 Viktor Veis How To Fuzz It – Microsoft Security Risk Detection in Practice ]]> https://s.ch9.ms/Events/Build/2017/P4051 https://s.ch9.ms/Events/Build/2017/P4051 You will learn how you can use Microsoft Security Risk Detection to find serious issues in your code, then how you can take action to manage the risk. You will see a sample library and application that hide problems, then learn how you can find these problems and reproduce them. After the session, you can download the code to study and understand the kinds of issues that Security Risk Detection helps you find. You will also learn how the broader Microsoft platform helps you manage risks from these issues. 1717 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4051 David Molnar artificial+intelligence security risk+detection Designing mobile applications ]]> https://s.ch9.ms/Events/Build/2017/P4048 https://s.ch9.ms/Events/Build/2017/P4048 Mobile applications present a unique set of design challenges and opportunities that differ from traditional desktop and browser based applications. With powerful cross-platform solutions like Xamarin you can now deliver more, more quickly. In this presentation, learn about the constraints of devices and platform ecosystems, how to optimize your workflow to address them early, and how to effectively iterate over your app's design to ensure you deliver the best possible user experience. 1051 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4048 David Ortinau xamarin+test+cloud Azure IoT: A Developers' deep dive ]]> https://s.ch9.ms/Events/Build/2017/P4046 https://s.ch9.ms/Events/Build/2017/P4046 From connecting devices to Microsoft Azure to deploying, configuring, and monitoring an IoT Solution, we walk through what's available for developers in Azure IoT platform, SDKs, and tools. Whether you are a hardcore C device developer, a C# or Java expert, a Node.js aficionado, a data and analytics guru, or if you just wonder what IoT is made of and has to offer, this demo-packed session is for you. 1748 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4046 Olivier Bloch internet+of+things Azure VNet for containers ]]> https://s.ch9.ms/Events/Build/2017/P4045 https://s.ch9.ms/Events/Build/2017/P4045 Azure SDN stack offers comprehensive network virtualization functions to virtual machines running in Microsoft Azure. It provides the ability to host VMs in an isolated private network (Virtual Networks), high performance load balancing (SLB), scalable network ACLs (Network Security Groups), custom route tables (User defined Routes) and private connectivity to on-premises (Express Route). In this talk, Mario Lopez and Narayan Annamalai talk about Microsoft’s latest open source CNI plugin that will impart and integrate the rich SDN stack to containers running in Azure. 1837 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4045 Narayan Annamalai, Mario Lopez Real-time sentiment built on the Azure IoT Stack ]]> https://s.ch9.ms/Events/Build/2017/P4044 https://s.ch9.ms/Events/Build/2017/P4044 Learn how Microsoft Pulse, a cloud-based sentiment collection platform, leveraged the Azure stack to enable hundreds of thousands of users to provide real-time feedback and see real-time results during major broadcast events like State of the Union and the 2016 Election Debates. Talking points include Quick Pulse Voting UI/Walkthrough, with an explanation of the product, why scalability and real-time responses are important. We describe the technical problem – the need to scale to accept data from hundreds of thousands of concurrent users engaging (pulsing) every five seconds, quickly tally the data by demographics, and report back results so that users can see the sentiment response to what is being talked about. We also discuss actual numbers (peak votes/time series, total round trip time, concurrent users). We talk about the pipeline of the pulse round-trip (i.e., user clicks the button, request goes to WebAPI front-end, event hubs, picked up by the aggregator services, tabulated, cached in Redis and reported back down to the client via SignalR). Finally, we cover other architectures that were considered, and discuss what worked, what could have worked better, and what might work. 1309 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4044 Joel Narwold Gain visibility into your apps with Azure Application Insights ]]> https://s.ch9.ms/Events/Build/2017/P4043 https://s.ch9.ms/Events/Build/2017/P4043 In the world of constantly evolving apps and continuous deployments, knowing what is happening with your app and users can make or break your customer experience. You want to proactively detect issues as they occur and fix them, before they start affecting your users. Application Insights, an intelligent Application Performance Monitoring service, provides instant analytics over your application logs and telemetry. It includes fast, easy, and non-intrusive analytics tools to interactively diagnose problems and answer challenging questions. It also integrates seamlessly with your existing DevOps workflows. For instance, you can surface performance data in Visual Studio, link to releases and work items in Visual Studio Team Services, and access telemetry in Azure Monitor and Operations Management Suite (OMS). Join us to experience the latest capabilities through a live demo and learn about our strategy and roadmap. 1532 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4043 Rahul Bagaria application+insights Smart buildings: Connecting Buildings to the Cloud ]]> https://s.ch9.ms/Events/Build/2017/P4041 https://s.ch9.ms/Events/Build/2017/P4041 A technical overview of Microsoft’s own use of the Azure Gateway SDK, Azure IoT Hub, Stream Analytics, SQL databases, Power BI, and Microsoft Dynamics 365 Field Services to monitor building equipment (HVAC, Power Meters, etc.) on the Redmond campus and send this data into IoT Hub where it is analyzed and presented to our facility management organization to detect failures, optimize equipment functionality, and manage work orders. In this talk we discuss Microsoft’s experience in using this data to manage our own campus equipment live in Microsoft building 19. After this overview, we detail the architecture of the gateway solution (built using the Azure Gateway SDK), including how the gateway talks to legacy building equipment using the BACnet protocol, converts this information into a JSON payload, and then sends this information to IoT Hub and the IoT suite for further processing. 1604 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4041 Chris Segura PowerApps, Flow and extending them using Azure pro developer tools ]]> https://s.ch9.ms/Events/Build/2017/P4039 https://s.ch9.ms/Events/Build/2017/P4039 PowerApps and Microsoft Flow make it easy to build rich business applications that work across mobile and web and quickly automate workflows without writing a single line of code. Join this session to learn how you can easily build PowerApps and Flow connecting to various data sources, and how to extend your app by adding custom business logic using Azure Functions as custom APIs. 2502 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4039 Stephen Siciliano, Archana Nair Using StorSimple data with services in Azure (Media Services, HDInsights, AzureML, etc.) ]]> https://s.ch9.ms/Events/Build/2017/P4038 https://s.ch9.ms/Events/Build/2017/P4038 StorSimple provides the benefits of on-premises storage with seamless and secure extension of storage into the cloud. Microsoft recently introduced new data management services that enable using the data (sent up to Azure) with Azure Media Services, Azure HDInsight, AzureML, Azure Search, etc. Developers and IT professionals can build end-to-end scenarios, get insights on stale and orphaned data, and more within minutes. Data can be searched and analyzed without impact on production. 1531 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4038 Vivek N Darera What’s new in the Azure Portal ]]> https://s.ch9.ms/Events/Build/2017/P4036 https://s.ch9.ms/Events/Build/2017/P4036 Come and learn how Azure Portal can help you manage your IaaS stack and how to make the most of your DevOps workflows. Learn about newly-added services and the roadmap for user experiences in Microsoft Azure. 2624 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4036 Leon Welicki Agile app development with Azure API Management ]]> https://s.ch9.ms/Events/Build/2017/P4034 https://s.ch9.ms/Events/Build/2017/P4034 Customers use Azure API Management to catalog, publish, protect, and monitor their APIs; managing their API lifecycle from design to deprecation. In this fast-paced, hands-on presentation we demonstrate how API Management can be used to accelerate your app development. We show how you can decouple front-end and back-end development and allow both sides to work at their own speed. Learn how Azure API Management helps API developers design and evolve an API; easily implement it using a microservices approach; ensure app developers stay abreast of API changes and upgrade to new releases when ready; and enable operators to secure, protect and monitor the APIs in production. 1896 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4034 Darrel Miller Securing web applications using Web Application Firewall ]]> https://s.ch9.ms/Events/Build/2017/P4033 https://s.ch9.ms/Events/Build/2017/P4033 Application Gateway is a layer 7 load balancer providing Application Delivery Controller as a service in Microsoft Azure. It provides various advanced load balancing choices like SSL termination, session affinity, URL path-based routing and multi-site hosting. Application Gateway also offers web application firewall (WAF) capability to help protect your applications from common web exploits as identified by OWASP (Open Web Application Security Project) top 10 web vulnerabilities. Learn how to protect your applications from the increasingly prevalent web vulnerabilities without modifying your application code. We discuss available protection features, monitoring, and eliminating false positives from your application deployment. We also show how to integrate WAF with Microsoft Azure Security Center and Azure Monitor for continuous monitoring, alerting, and health dashboard for all of your web applications in Azure. 1512 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4033 Amit Srivastava System performance is a feature: Understanding system health through telemetry (a continuation of real-time sentiment built on the Azure IoT Stack) ]]> https://s.ch9.ms/Events/Build/2017/P4032 https://s.ch9.ms/Events/Build/2017/P4032 You just recovered from a major site outage. Luckily, the impact was low – but what you think caused the problem is still just a theory. Learn how Microsoft Pulse, a cloud-based sentiment collection platform, with the help of the Azure Customer Advisory Team (Azure CAT) introduced structured logging and telemetry best practices to gain insight into system performance and health. 965 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4032 Joel Narwold Azure Active Directory v2 endpoint and MSAL: What's new ]]> https://s.ch9.ms/Events/Build/2017/P4031 https://s.ch9.ms/Events/Build/2017/P4031 Cloud and mobile applications have different sign-in requirements than traditional on-premises applications. The Microsoft Azure Active Directory v2 endpoint provides a simple solution to sign in Microsoft personal accounts and Azure Active Directory work and school accounts. In this session, learn what is new with the v2 endpoint and with the Microsoft Authentication Library (MSAL). Discussion include when to use the Azure AD v1 endpoint and the Active Directory Authentication Library (ADAL), versus the v2 endpoint and MSAL. 2144 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4031 Stuart Kwan Leverage Azure instance metadata for instance bootstrap and runtime ]]> https://s.ch9.ms/Events/Build/2017/P4029 https://s.ch9.ms/Events/Build/2017/P4029 Bootstrapping your applications in Microsoft Azure sometimes requires more than just running a VM and starting your application via script/extension. At times your application would need to know which instance certain services need to run and the current size of VM. How do you know information about the location of the VM when you get a support call for your application? Azure Instance Metadata provides information like VMName, location, IP address, etc. for a running VM on Azure via a REST endpoint. 1030 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4029 Hariharan Jayaraman 360° monitoring for your Microsoft Azure apps ]]> https://s.ch9.ms/Events/Build/2017/P4028 https://s.ch9.ms/Events/Build/2017/P4028 Learn how our largest customers have used Azure Monitor to design end-to-end monitoring for their Azure applications. Join us to learn how to monitor resource utilization using Azure Monitor metrics, and monitor changes to your Azure resources using the Azure Monitor activity log. Understand how you can track the health of Azure platform using resource health, and get alerts from Azure service notifications. We show you how to integrate Azure Monitor with your insights, APM, and alerting products to get you started quickly. 1914 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4028 Dushyant Gill, John Kemnetz, Oren Rosenbloom Optimize Your Azure Marketplace Offering ]]> https://s.ch9.ms/Events/Build/2017/P4026 https://s.ch9.ms/Events/Build/2017/P4026 Wondering how you can increase your lead gen? Are you fully leveraging the new Seller Insights report, publishing portal updates, Test Drives and Quick Start templates. Don’t miss out. Learn how you can optimize your offerings and improve customer engagement by using the new features available in Azure Marketplace. Finally, learn how you can take your application and publish it as a product offering on Azure Marketplace. 2234 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4026 Dina Vaccari application+insights Introducing Azure Network Watcher ]]> https://s.ch9.ms/Events/Build/2017/P4024 https://s.ch9.ms/Events/Build/2017/P4024 Explore solution, architectural, and programmatic experiences in building and enhancing network monitoring capabilities in Microsoft Azure. Use common open source tools with a combination of Azure services to build powerful solutions. 1422 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4024 Abhishek Pathak, Matt Reat Enterprise integration and hybrid ]]> https://s.ch9.ms/Events/Build/2017/P4023 https://s.ch9.ms/Events/Build/2017/P4023 The cloud is changing the way we build and run software, but not all software will be in the cloud or in a single cloud. This session shows how Azure integration services enable you to build new integrated solutions in the cloud that leverage on-premises and cross cloud resources. LogicApps, API Management, and Service Bus provide you with the tools you need integrate your existing applications and services and give you the scale and efficiency of Azure to run and manage them. 3256 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4023 Kevin Lam, Jon Fancey OSS just made me PaaS out ]]> https://s.ch9.ms/Events/Build/2017/P4021 https://s.ch9.ms/Events/Build/2017/P4021 Messaging is a key component of any cloud application. Building on the success of open protocols such as AMQP we have continued the open source approach with our clients as well. Find out how OSS makes an impact on PaaS and gives customers a stake in how the service goes to market. 499 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4021 Justin Conway ASP.NET Core + Azure Service Fabric ]]> https://s.ch9.ms/Events/Build/2017/P4020 https://s.ch9.ms/Events/Build/2017/P4020 Learn how to use ASP.NET Core in Azure Service Fabric to host scalable, highly-available web applications and HTTP services. 894 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4020 Vaclav Turecek Securing your app data with Microsoft SQL Server 2017 ]]> https://s.ch9.ms/Events/Build/2017/P4018 https://s.ch9.ms/Events/Build/2017/P4018 Join us for an overview of strategy and best practices to build secure applications using SQL Server. SQL Server offers a versatile toolset of security capabilities, which enable you to protect sensitive data and meet stringent compliance requirements. You’ll leave with an understanding of how these capabilities fit together to protect your application as a whole, including the new security enhancements available in the latest version of SQL Server. 1053 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4018 Tommy Mullaney sql+server security data-driven+apps Lambda Architecture for Connected Car Fleet Management ]]> https://s.ch9.ms/Events/Build/2017/P4017 https://s.ch9.ms/Events/Build/2017/P4017 IoT scenarios of moving devices often require extensive geospatial processing capabilities. In this presentation, we show how you can use Azure Stream Analytics and Azure Data Lake/U-SQL to build geo-spatial cold/hot path analysis (lambda architecture) for connected cars. 1387 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4017 Michael Rys, Sam Chandrashekhar azure data+lake Demystifying Cloud Data Services for an App Developer We've learned about all of the different services that are available in Azure for storage and processing, but when it comes to architecting our solution, it's always a question of which service fits our need best. In this on-demand session, we break down the features of each of the different data services in Azure and answer the question "When to use what." We highlight the advantages each service has and talk through some best practices for designing your application.

]]>
https://s.ch9.ms/Events/Build/2017/P4016 https://s.ch9.ms/Events/Build/2017/P4016 We've learned about all of the different services that are available in Azure for storage and processing, but when it comes to architecting our solution, it's always a question of which service fits our need best. In this on-demand session, we break down the features of each of the different data services in Azure and answer the question &quot;When to use what.&quot; We highlight the advantages each service has and talk through some best practices for designing your application. 2030 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4016 Wee-Hyong Tok, Romit Girdhar intelligent+app data analytics
Evolving SQL workloads from software to SaaS: Data for devs immersion ]]> https://s.ch9.ms/Events/Build/2017/P4013 https://s.ch9.ms/Events/Build/2017/P4013 In this modern era; applications must recover from user errors efficiently, must be optimized for transactional performance, provide real-time insights into app transactions, must be secure and complaint, and support seamless integration to cloud, hybrid scenarios and other data types/systems. These applications must also learn and adapt to deliver more powerful experiences using cloud-based data services, applications, and intelligence. In this session we use a scenario-based hands-on lab program (immersion), to offer you a cohesive and consistent experience to build modern on-premises/cloud based applications with intelligence. Build hack-free, high performance, scalable applications using Microsoft SQL Server, Microsoft ML and Azure data services. 1518 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4013 Tara Shankar Jana azure+sql+database sql+server data-driven+apps Azure Cosmos DB: Build planet scale mobile apps in minutes ]]> https://s.ch9.ms/Events/Build/2017/P4012 https://s.ch9.ms/Events/Build/2017/P4012 Coming soon 981 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4012 Kirill Gavrylyuk azure xamarin nosql Azure Cosmos DB: API for MongoDB Azure Cosmos DB (formerly known as Azure DocumentDB) natively supports multiple APIs; one of which is the API for MongoDB. Use existing code, applications, drivers, and tools to work with Azure Cosmos DB. Benefit from the fully managed and scalable Azure database, while continuing to use familiar skills and tools for MongoDB. Come and watch this video to learn about the feature and how to migrate to this cosmic-scale database, Azure Cosmos DB.

]]>
https://s.ch9.ms/Events/Build/2017/P4011 https://s.ch9.ms/Events/Build/2017/P4011 Azure Cosmos DB (formerly known as Azure DocumentDB) natively supports multiple APIs; one of which is the API for MongoDB. Use existing code, applications, drivers, and tools to work with Azure Cosmos DB. Benefit from the fully managed and scalable Azure database, while continuing to use familiar skills and tools for MongoDB. Come and watch this video to learn about the feature and how to migrate to this cosmic-scale database, Azure Cosmos DB. 695 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4011 Andrew Hoh azure nosql
A lap around Azure HDInsight and Cosmos DB Open Source Analytics + NoSQL Recently, we released the Spark Connector for our distributed NoSQL service – Azure Cosmos DB (formerly known as Azure DocumentDB). By connecting Apache Spark running on top Azure HDInsight to Azure Cosmos DB, you can accelerate your ability to solve fast-moving data science problems and machine learning. The Spark to Azure Cosmos DB connector efficiently exploits the native Cosmos DB managed indexes and enables updateable columns when performing analytics, push-down predicate filtering against fast-changing globally-distributed data, ranging from IoT, data science, and analytics scenarios. Come learn how you can perform blazing fast planet-scale data processing with Azure Cosmos DB and HDInsight.

]]>
https://s.ch9.ms/Events/Build/2017/P4010 https://s.ch9.ms/Events/Build/2017/P4010 Recently, we released the Spark Connector for our distributed NoSQL service – Azure Cosmos DB (formerly known as Azure DocumentDB). By connecting Apache Spark running on top Azure HDInsight to Azure Cosmos DB, you can accelerate your ability to solve fast-moving data science problems and machine learning. The Spark to Azure Cosmos DB connector efficiently exploits the native Cosmos DB managed indexes and enables updateable columns when performing analytics, push-down predicate filtering against fast-changing globally-distributed data, ranging from IoT, data science, and analytics scenarios. Come learn how you can perform blazing fast planet-scale data processing with Azure Cosmos DB and HDInsight. 1779 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4010 Andrew Liu, Raghav Mohan
Modernize your database development lifecycle with SQL Server Data Tools in Visual Studio ]]> https://s.ch9.ms/Events/Build/2017/P4009 https://s.ch9.ms/Events/Build/2017/P4009 Learn how SQL Server Data Tools (SSDT) turns Visual Studio into a powerful environment for database development. Easily build, debug, maintain, and refactor databases inside Visual Studio with a declarative model that spans all the phases of database development and easily enables continuous integration and deployment for your databases. Work offline with a database project, or work directly with a connected database instance in Azure SQL Database, Azure SQL Data Warehouse, and SQL Server running on Windows, Linux, or Docker, on-premises or in any cloud. 428 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4009 Tara Raj visual+studio sql+server devops Get to the cloud faster with Azure SQLDB Managed Instance and Database Migration Service ]]> https://s.ch9.ms/Events/Build/2017/P4008 https://s.ch9.ms/Events/Build/2017/P4008 A new, expanded Azure SQL Database offers fully-managed server instance with greater compatibility with SQL Server application features and more, and the ability to move hundreds of databases at once using the Database Migration Service. It provides security isolation with Azure Virtual Network, along with built-in HADR, built-in intelligent performance tuning, and intelligent security services that are already available in Azure SQL Database. To reduce the friction of transitioning your relational database estate to public cloud, expanded Azure SQL Database provides SQL Server application compatibility including commonly used cross database references using three-part names, CLR, SQL Agent, Transactional Replication, Change Data Capture, Service Broker, and a lot more. We showcase a five-step seamless migration experience from your on-premises SQL Server instances to expanded Azure SQL Database using the newly announced Azure Database Migration Service. 559 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4008 Lindsey Allen, Harini Gupta azure+sql+database sql+server Microsoft R Server: Development to deployment workflow Microsoft R Server versions work in different platforms but the development to deployment workflow is almost same in all environments. In this session, we develop a simple machine learning solution to demonstrate end-to-end workflow with compute and web nodes of Microsoft R Server stand-alone version.

]]>
https://s.ch9.ms/Events/Build/2017/P4005 https://s.ch9.ms/Events/Build/2017/P4005 Microsoft R Server versions work in different platforms but the development to deployment workflow is almost same in all environments. In this session, we develop a simple machine learning solution to demonstrate end-to-end workflow with compute and web nodes of Microsoft R Server stand-alone version. 989 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4005 Mustafa Kasap ml+server
Lift and shift any runtime into U-SQL for large scale processing ]]> https://s.ch9.ms/Events/Build/2017/P4004 https://s.ch9.ms/Events/Build/2017/P4004 One of U-SQL’s major strengths is to scale out user code over your large data lake assets. This presentation first shows how we have used the U-SQL extensibility model to give you access to Python and then shows how to run Java from within U-SQL. 1459 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4004 Michael Rys data+lake Speedup Interactive Analytics on Petabytes of Data on Azure ]]> https://s.ch9.ms/Events/Build/2017/P4002 https://s.ch9.ms/Events/Build/2017/P4002 One challenge faced by almost every Hadoop user is how to enable the near-time BI capability during the data volume grows, with low-latency and seamless integration with the tools you are already familiar with, such as Microsoft Excel and Microsoft Power BI. Here comes Kylin. Apache Kylin is a top-level project of Apache Software Foundation, which provides SQL interface and multi-dimensional analysis(OLAP) on Hadoop. Kyligence is a leading data intelligence company founded by the core Apache Kylin PMC members to speed up the development and evolution of open source Apache Kylin. In this session, Kyligence introduces how to enable interactive analytics on extremely large datasets on the Microsoft Azure Cloud. Together with Azure HDInsight, Kyligence Cloud service could provision Hadoop Infrastructure and KAP into customer’s Azure environment. KAP loads data from Azure Blob storage and generates cube index based on the user designed data model. By leveraging Kyligence Cloud service and Microsoft Azure, analysts can focus on the data model and analysis requirement only, without the scale limitation of extremely large datasets. 1930 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4002 Yang Li Advanced SQL Server on Linux (Docker) via Entity Framework (EF) ]]> https://s.ch9.ms/Events/Build/2017/P4001 https://s.ch9.ms/Events/Build/2017/P4001 It’s SQL Server as you already know it today, but it’s now native to Linux. It works with your data, your favorite tools, application frameworks (Entity Framework) and programming languages. In this session, we pull the code for an application running in cloud to a Linux-based machine. We test and enhance the application for performance (using EF, in-memory) and security against SQL vNext (Linux). Then we re-deploy the changes using DevOps to Azure with just a flip of d, show how the application works across platforms, on-premises, and in the cloud. Best part, all of it will be done in ten minutes. 1040 Wed, 10 May 2017 18:00:00 GMT https://s.ch9.ms/Events/Build/2017/P4001 Tara Shankar Jana sql+server linux entity+framework Azure Cosmos DB: NoSQL capabilities everyone should know about ]]> https://s.ch9.ms/Events/Build/2017/T6058 https://s.ch9.ms/Events/Build/2017/T6058 Microsoft Azure provides a fully managed NoSQL database service built for fast and predictable performance, high availability, elastic scaling, global distribution, and ease of development. As a schema-free NoSQL database, the service provides rich and familiar SQL query capabilities with consistent low latencies on JSON data - ensuring that 99% of your reads are served under 10 milliseconds and 99% of your writes are served under 15 milliseconds. These unique benefits make it a great fit for web, mobile, gaming, IoT, AI, and many other applications that need seamless scale and global replication. Come and learn about the NoSQL capabilities in Azure Cosmos DB that every developer should know about. 1283 Tue, 09 May 2017 21:22:24 GMT https://s.ch9.ms/Events/Build/2017/T6058 Aravind Ramachandran azure nosql documentdb graph+database cosmosdb Open Q&A: .NET panel ]]> https://s.ch9.ms/Events/Build/2017/B8902 https://s.ch9.ms/Events/Build/2017/B8902 The .NET Core 2.0 roadmap was just announced and we saw some samples of the updated framework and tools in action. We’ve learned about the future of ASP.NET Core and how .NET Standard 2.0 will make our coding processes simpler. Bring your top questions for the team that is building the next generation of the .NET Framework. 3547 Tue, 09 May 2017 19:23:31 GMT https://s.ch9.ms/Events/Build/2017/B8902 Damian Edwards, Mike Harsh, Scott Hunter, Immo Landwerth, ​Richard Lander .net open+source asp.net .NET Standard 2.0, UWP support and UI futures Join us as we meet with Scott Hunter, Tim Heuer, and Miguel de Icaza to discuss the latest updates around .NET and UWP

]]>
https://s.ch9.ms/Events/Build/2017/C9L13 https://s.ch9.ms/Events/Build/2017/C9L13 Join us as we meet with Scott Hunter, Tim Heuer, and Miguel de Icaza to discuss the latest updates around .NET and UWP 1496 Tue, 09 May 2017 16:05:04 GMT https://s.ch9.ms/Events/Build/2017/C9L13 Miguel de Icaza, Scott Hunter, Tim Heuer, Seth Juarez .net uwp
Windows Template Studio In this Channel 9 Live session we meet with Clint Rutkas, Michael Crump, and Matt Lacey to discuss the latest updates on Windows.

To find out more about Windows Template Studio, head to https://aka.ms/wts.  If you want to install, go to https://aka.ms/wtsinstall.

]]>
https://s.ch9.ms/Events/Build/2017/C9L12 https://s.ch9.ms/Events/Build/2017/C9L12 In this Channel 9 Live session we meet with Clint Rutkas, Michael Crump, and Matt Lacey to discuss the latest updates on Windows. To find out more about Windows Template Studio, head to https://aka.ms/wts. If you want to install, go to https://aka.ms/wtsinstall. 1299 Tue, 09 May 2017 16:04:56 GMT https://s.ch9.ms/Events/Build/2017/C9L12 Clint Rutkas, Seth Juarez, Michael Crump, Matt Lacey windows
Visual Studio Mobile Center Find out the latest updates around the Visual Studio Mobile Center in this Channel 9 Live session with Keith Ballinger, Thomas Dohmke, and Ryan J. Salva

]]>
https://s.ch9.ms/Events/Build/2017/C9L27 https://s.ch9.ms/Events/Build/2017/C9L27 Find out the latest updates around the Visual Studio Mobile Center in this Channel 9 Live session with Keith Ballinger, Thomas Dohmke, and Ryan J. Salva 1465 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L27 Ryan J. Salva, Thomas Dohmke, Keith Ballinger visual+studio
Visual Studio Q&A In this Q&A session around Visual Studio on Channel 9 Live, we're joined by Tim Sneath, Amanda Silver, and Saqib Shaikh

]]>
https://s.ch9.ms/Events/Build/2017/C9L26 https://s.ch9.ms/Events/Build/2017/C9L26 In this Q&amp;A session around Visual Studio on Channel 9 Live, we're joined by Tim Sneath, Amanda Silver, and Saqib Shaikh 1529 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L26 Tim Sneath, Seth Juarez, Amanda Silver, Saqib Shaikh visual+studio
TypeScript with Anders Hejlsberg Join Anders Hejlsberg in this Channel 9 Live session to learn about his latest TypeScript updates

]]>
https://s.ch9.ms/Events/Build/2017/C9L25 https://s.ch9.ms/Events/Build/2017/C9L25 Join Anders Hejlsberg in this Channel 9 Live session to learn about his latest TypeScript updates 2012 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L25 Anders Hejlsberg, Seth Juarez
Visual Studio for Mac and Xamarin Live Player In this Channel 9 Live session find out the latest Build 2017 updates from Miguel de Icaza, Joseph Hill, James Montemagno, and Mikayla Hutchinson

]]>
https://s.ch9.ms/Events/Build/2017/C9L24 https://s.ch9.ms/Events/Build/2017/C9L24 In this Channel 9 Live session find out the latest Build 2017 updates from Miguel de Icaza, Joseph Hill, James Montemagno, and Mikayla Hutchinson 1400 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L24 Miguel de Icaza, Joseph Hill, Seth Juarez, James Montemagno, Mikayla Hutchinson visual+studio xamarin
Microsoft Graph Join Yina, Tejas, Ryan, and Andrew as we discuss the latest updates around Microsoft Graph in this Channel 9 Live session

]]>
https://s.ch9.ms/Events/Build/2017/C9L23 https://s.ch9.ms/Events/Build/2017/C9L23 Join Yina, Tejas, Ryan, and Andrew as we discuss the latest updates around Microsoft Graph in this Channel 9 Live session 1701 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L23 Andrew Coates, Tejas Patel, Yina Arenas, Ryan Gregg microsoft+graph
Microsoft Fluent Design System In this session, we meet with Bojana Ostojic, Albert Shum, and Paul Gusmorino to discuss their latest Build 2017 updates

]]>
https://s.ch9.ms/Events/Build/2017/C9L22 https://s.ch9.ms/Events/Build/2017/C9L22 In this session, we meet with Bojana Ostojic, Albert Shum, and Paul Gusmorino to discuss their latest Build 2017 updates 1605 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L22 Albert Shum, Seth Juarez, Paul Gusmorino, Bojana Ostojic
Languages with Mads, Dustin, Phillip and Anthony Join us as we chat about languages with Mads Torgersen, Dustin Campbell, Phillip Carter, and Anthony D. Green in this Channel 9 Live session

]]>
https://s.ch9.ms/Events/Build/2017/C9L21 https://s.ch9.ms/Events/Build/2017/C9L21 Join us as we chat about languages with Mads Torgersen, Dustin Campbell, Phillip Carter, and Anthony D. Green in this Channel 9 Live session 1206 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L21 Mads Torgersen, Dustin Campbell, Anthony D. Green, Seth Juarez, Phillip Carter
SQL Unplugged In this Channel 9 Live session we'll discuss all things SQL with Scott Klein, Rohan Kumar, and Lindsey Allen

]]>
https://s.ch9.ms/Events/Build/2017/C9L20 https://s.ch9.ms/Events/Build/2017/C9L20 In this Channel 9 Live session we'll discuss all things SQL with Scott Klein, Rohan Kumar, and Lindsey Allen 1678 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L20 Scott Klein, Rohan Kumar sql
SharePoint Framework In this Channel 9 Live session we're joining Daniel Kogan and Vesa Juvonen to discuss the latest updates around SharePoint Framework

]]>
https://s.ch9.ms/Events/Build/2017/C9L19 https://s.ch9.ms/Events/Build/2017/C9L19 In this Channel 9 Live session we're joining Daniel Kogan and Vesa Juvonen to discuss the latest updates around SharePoint Framework 1389 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L19 Andrew Coates, Vesa Juvonen, Daniel Kogan sharepoint
.NET Standard 2.0 and .NET Core 2.0 Join us as we chat with Scott Hunter, Immo Landwerth, Richard Lander, and Damian Edwards about the latest updates to .NET Standard 2.0 and .NET Core 2.0

]]>
https://s.ch9.ms/Events/Build/2017/C9L18 https://s.ch9.ms/Events/Build/2017/C9L18 Join us as we chat with Scott Hunter, Immo Landwerth, Richard Lander, and Damian Edwards about the latest updates to .NET Standard 2.0 and .NET Core 2.0 1479 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L18 Damian Edwards, Scott Hunter, Seth Juarez, Immo Landwerth, ​Richard Lander .net
Windows Subsystem for Linux - Update In this Channel 9 Live session, find out more about Windows Subsystem for Linux from Jack Hammons, Gilles Khouzam, and Ben Hillis

]]>
https://s.ch9.ms/Events/Build/2017/C9L17 https://s.ch9.ms/Events/Build/2017/C9L17 In this Channel 9 Live session, find out more about Windows Subsystem for Linux from Jack Hammons, Gilles Khouzam, and Ben Hillis 1792 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L17 Seth Juarez, Ben Hillis, Gilles Khouzam, Jack Hammons
Microsoft Teams Developer Platform Join us as we chat with Larry Jin around his Build 2017 updates

]]>
https://s.ch9.ms/Events/Build/2017/C9L16 https://s.ch9.ms/Events/Build/2017/C9L16 Join us as we chat with Larry Jin around his Build 2017 updates 1726 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L16 Seth Juarez, Larry Jin
C++ Panel In this Channel 9 Live session, join our veteran niner, Charles Torre, as he hosts a panel on C++

]]>
https://s.ch9.ms/Events/Build/2017/C9L15 https://s.ch9.ms/Events/Build/2017/C9L15 In this Channel 9 Live session, join our veteran niner, Charles Torre, as he hosts a panel on C&#43;&#43; 1856 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L15 Marian Luparu, Charles Torre, Stephan T. Lavavej, Gabriel Dos Reis, Kenny Kerr
Mark Russinovich Unplugged Join us as we connect with Mark Russinovich to discuss his latest Build updates

]]>
https://s.ch9.ms/Events/Build/2017/C9L14 https://s.ch9.ms/Events/Build/2017/C9L14 Join us as we connect with Mark Russinovich to discuss his latest Build updates 1636 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L14 Mark Russinovich, Seth Juarez
Cloud Developer Advocacy John Papa talks to the new cloud advocates about winning the hearts and minds of developers around the world.

]]>
https://s.ch9.ms/Events/Build/2017/C9L11 https://s.ch9.ms/Events/Build/2017/C9L11 John Papa talks to the new cloud advocates about winning the hearts and minds of developers around the world. 1655 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L11 John Papa, Brian Peek, Shayne Boyer, Bernd Verst, Bryan Liston
Keynote Recap with Kevin Gallo Join us as we meet with Kevin Gallo to discuss his keynote updates

]]>
https://s.ch9.ms/Events/Build/2017/C9L10 https://s.ch9.ms/Events/Build/2017/C9L10 Join us as we meet with Kevin Gallo to discuss his keynote updates 1319 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L10 Kevin Gallo, Seth Juarez
Distributed Applications with Docker and Service Fabric In this session we meet with Corey Sanders and Mark Fussell to discuss some of the latest Build 2017 announcements

]]>
https://s.ch9.ms/Events/Build/2017/C9L09 https://s.ch9.ms/Events/Build/2017/C9L09 In this session we meet with Corey Sanders and Mark Fussell to discuss some of the latest Build 2017 announcements 1658 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L09 Mark Fussell, Seth Juarez, Corey Sanders docker
CosmosDB In this session we meet with Syam Kumar Nair and Seth Juarez to discuss some of the latest Build 2017 announcements around CosmosDB

]]>
https://s.ch9.ms/Events/Build/2017/C9L08 https://s.ch9.ms/Events/Build/2017/C9L08 In this session we meet with Syam Kumar Nair and Seth Juarez to discuss some of the latest Build 2017 announcements around CosmosDB 1482 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L08 Seth Juarez, Syam Kumar Nair
Azure Cloud Shell In this session we meet with Brendan Burns to discuss some of the latest Azure announcements

]]>
https://s.ch9.ms/Events/Build/2017/C9L07 https://s.ch9.ms/Events/Build/2017/C9L07 In this session we meet with Brendan Burns to discuss some of the latest Azure announcements 1875 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L07 Charles Torre, Brendan Burns azure
Azure IoT Edge In this session we meet with Sam George to discuss some of the latest Azure announcements

]]>
https://s.ch9.ms/Events/Build/2017/C9L06 https://s.ch9.ms/Events/Build/2017/C9L06 In this session we meet with Sam George to discuss some of the latest Azure announcements 1616 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L06 Seth Juarez, Sam George azure
Azure Functions In this session we meet with Chris Anderson and Nir Mashkowski to discuss some of the latest updates around Azure Functions

]]>
https://s.ch9.ms/Events/Build/2017/C9L05 https://s.ch9.ms/Events/Build/2017/C9L05 In this session we meet with Chris Anderson and Nir Mashkowski to discuss some of the latest updates around Azure Functions 1633 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L05 Charles Torre, Nir Mashkowski, Chris Anderson azure
Azure Database for PostgreSQL and MySQL Join our Channel 9 Live session with Tony Petrossian, Sunil Kamath, Jason M. Anderson, and Gebi Liang to discuss the latest Azure announcements from Build 2017

]]>
https://s.ch9.ms/Events/Build/2017/C9L04 https://s.ch9.ms/Events/Build/2017/C9L04 Join our Channel 9 Live session with Tony Petrossian, Sunil Kamath, Jason M. Anderson, and Gebi Liang to discuss the latest Azure announcements from Build 2017 1719 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L04 Tony Petrossian, Seth Juarez, Gebi Liang, Jason M. Anderson, Sunil Kamath azure
Project Emma - Empowering people with Parkinson's In this session, we find out how technologies are being used to improve the lives of those with Parkinson's disease

]]>
https://s.ch9.ms/Events/Build/2017/C9L03 https://s.ch9.ms/Events/Build/2017/C9L03 In this session, we find out how technologies are being used to improve the lives of those with Parkinson's disease 1233 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L03 Seth Juarez, Haiyan Zhang, Emma Lawton
Microsoft AI Join Steven Guggenheimer and Seth Juarez to find out about their latest AI updates

]]>
https://s.ch9.ms/Events/Build/2017/C9L02 https://s.ch9.ms/Events/Build/2017/C9L02 Join Steven Guggenheimer and Seth Juarez to find out about their latest AI updates 1655 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L02 Seth Juarez, Steven Guggenheimer
Keynote Recap with Scott Guthrie In this session we discuss some of the news and announcements from the day 1 keynote of Build 2017

]]>
https://s.ch9.ms/Events/Build/2017/C9L01 https://s.ch9.ms/Events/Build/2017/C9L01 In this session we discuss some of the news and announcements from the day 1 keynote of Build 2017 1587 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/C9L01 Seth Juarez, Scott Guthrie
Jig.Space: Using 3D game technology in progressive web apps with BabylonJS ]]> https://s.ch9.ms/Events/Build/2017/T6098-R3 https://s.ch9.ms/Events/Build/2017/T6098-R3 Join Jig.Space to learn how to apply technology that's usually reserved for games in non-gaming applications. Devs with a gaming background will find a wealth of information about applything those skills to progress web apps. 955 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6098-R3 Numa Berton, Zac Duff web+platform media mixed+reality Sketchable and Surface Dial Integration ]]> https://s.ch9.ms/Events/Build/2017/T6095-R3 https://s.ch9.ms/Events/Build/2017/T6095-R3 Sketchable is a hybrid journal and canvas application that allows users to scribble a note, snap, and edit a picture, or paint a masterpiece using ink. During this session, Sketchable details their integration with the Surface Dial and showcases how they have been able to utilize the new APIs in Windows Creator’s update to provide a more customized user experience using both ink and Dial. 855 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6095-R3 Miles Harris, Ryan Harris Node.js everywhere ]]> https://s.ch9.ms/Events/Build/2017/T6056 https://s.ch9.ms/Events/Build/2017/T6056 The traditional full stack was web frontend development and cloud platform backend work, but if you talk to developers today this has vastly changed. A new full stack is emerging that includes the traditional web frontend and cloud platform backend, but also includes mobile phones and tablets, API services, desktop (who thought that would explode?) and IoT. Developers are tasked to build and manage one application that has to manage all of this. And, the program environment of choice for the full stack developer: Node.js. This presentation is delivered by the Node.js Foundation community manager, who talks a bit about the history of Node.js; why it's becoming the first choice for the full stack developer; and how Node.js functions everywhere from web frontend development to IoT to create a single platform for developers to create the herculean applications of today. 829 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6056 Mikeal Rogers internet+of+things node.js App engagement in Windows Timeline and Cortana with User Activities and Project Rome ]]> https://s.ch9.ms/Events/Build/2017/B8108 https://s.ch9.ms/Events/Build/2017/B8108 Learn how to make your app integrate with the Activity Cloud in Windows Timeline and Cortana to supercharge app engagement. Use the new UserActivity API, Apps for Website (AFW), Adaptive Cards and MS Graph to tell Windows and Cortana how and when to get customer back into you app. 2845 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8108 Shawn Henry, Juan Oviedo Introducing Fluent Design ]]> https://s.ch9.ms/Events/Build/2017/B8066 https://s.ch9.ms/Events/Build/2017/B8066 Microsoft is advancing its design system with Fluent Design to engage users, empower creators, and scale to a new generation of devices and inputs. Come learn about this transformation of the design principles, visuals, and interactions and the opportunity it represents for you. See how Fluent Design is being applied across Windows 10 devices and apps to create beautiful, engaging, and intuitive experiences. Get a sneak peek at the great support for Fluent Design across guidelines, platform, and tools. Join us and other designers, developers, and creators of all kinds as we all become Fluent. 3234 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8066 Paul Gusmorino, Bojana Ostojic ux universal+windows+platform+uwp design Build Amazing Apps with Fluent Design ]]> https://s.ch9.ms/Events/Build/2017/B8034 https://s.ch9.ms/Events/Build/2017/B8034 An app with Fluent Design draws you in and makes you want to use it. It’s smooth. It’s effortless. It’s beautiful. In this session, we’ll show you how easy it is to use familiar technologies like XAML and C# to create apps that bring Fluent Design to life on Windows 10 across a range of devices and inputs. We’ll cover the different elements of the design system and how to use the latest controls, animations, effects, and other platform capabilities to captivate your customers. We’ll build an app together showing the source and sharing guidelines, tips, tricks, and other resources. We’ll channel our creative energy, we’ll transcend our medium, and we’ll code a Fluent Design experience. 3655 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8034 James Clarke, Paul Gusmorino ux universal+windows+platform+uwp effects+-and-+animation Microsoft Security Risk Detection – Artificial Intelligence Powered Risk Detection for Your Applications ]]> https://s.ch9.ms/Events/Build/2017/T6076 https://s.ch9.ms/Events/Build/2017/T6076 Microsoft Security Risk Detection, formerly “Project Springfield,” packages pioneering artificial intelligence into a scalable cloud service that helps you find issues in code you build, code you buy, or code you are moving to the cloud. You will see how Security Risk Detection fits into these scenarios. You will learn about the issues Security Risk Detection can help you find and actions you can take. Finally, watch to the end for a new frontier in Microsoft’s journey to help developers everywhere be more secure. 959 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6076 David Molnar artificial+intelligence security risk+detection openid+connect postgresql postgres Azure Resource Manager templates: Life after (first) deployment ]]> https://s.ch9.ms/Events/Build/2017/B8107 https://s.ch9.ms/Events/Build/2017/B8107 This session explores new capabilities which simplify template authoring, best practices for template-driven upgrades, and integrated instrumentation with Azure Monitor. It covers sharing and monetizing templates with ARM Service Catalog and Managed Applications, and how to orchestrate bulk deployments with Azure Deployment Manager. 3620 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8107 Ryan Jones azure Security testing in the cloud, at scale using Microsoft Security Risk Detection ]]> https://s.ch9.ms/Events/Build/2017/B8077 https://s.ch9.ms/Events/Build/2017/B8077 Microsoft Security Risk Detection, formerly “Project Springfield,” packages pioneering artificial intelligence into a scalable cloud service that helps you find issues in code you build, code you buy, or code you are moving to the cloud. You will see how Security Risk Detection fits into these scenarios. You will learn about the issues Security Risk Detection can help you find and actions you can take. Finally, watch to the end for a new frontier in Microsoft’s journey to help developers everywhere be more secure. 2397 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8077 Dave Tamasi artificial+intelligence security risk+detection Enabling intelligence at the edge with Azure IoT Edge ]]> https://s.ch9.ms/Events/Build/2017/B8049 https://s.ch9.ms/Events/Build/2017/B8049 IoT scenarios in many verticals require a combination of intelligence at the edge, and the power of cloud. Distributing and optimizing how much processing will happen on the edge and how much in the cloud remains an interesting design challenge to enable hybrid scenarios. Azure IoT provides the ability to deploy, update, orchestrate, and monitor a variety of workloads, including advanced analytics, at the edge. 3155 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8049 Briton Zurcher, Sam George, Arjmand Samuel internet+of+things How to build globally-distributed, fast, billion-user applications with Azure Cosmos DB Join this session to learn about the NEW Azure Cosmos DB, Microsoft’s globally distributed database service designed to enable you to build planet-scale applications. We will help you understand how to start leveraging Cosmos DB for your applications and discuss some of its differentiating features. We will talk about its multi-model (Key-Value, Document & Graph Database) capability and show you how easy it is to port over your existing code and data from popular open source NoSQL Databases. In this session, we will also be inviting customers on stage to discuss their experiences using the service to build scalable applications. By the end of this session, you will have learned how you can use Cosmos DB in a variety of scenarios including fraud detection, event messaging, IoT sensor-data anomaly detection and online recommendations and personalization.

]]>
https://s.ch9.ms/Events/Build/2017/B8047 https://s.ch9.ms/Events/Build/2017/B8047 Join this session to learn about the NEW Azure Cosmos DB, Microsoft’s globally distributed database service designed to enable you to build planet-scale applications. We will help you understand how to start leveraging Cosmos DB for your applications and discuss some of its differentiating features. We will talk about its multi-model (Key-Value, Document &amp; Graph Database) capability and show you how easy it is to port over your existing code and data from popular open source NoSQL Databases. In this session, we will also be inviting customers on stage to discuss their experiences using the service to build scalable applications. By the end of this session, you will have learned how you can use Cosmos DB in a variety of scenarios including fraud detection, event messaging, IoT sensor-data anomaly detection and online recommendations and personalization. 2987 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8047 Rimma Nehme, Erik Paulson, Stephen Stchur game+development nosql documentdb cosmos+db graph+database
How to get started with the new Azure DBMS for PostgreSQL. ]]> https://s.ch9.ms/Events/Build/2017/B8046 https://s.ch9.ms/Events/Build/2017/B8046 Join this session to learn about Microsoft’s latest announcement of managed PostgreSQL database on Azure. In this breakout, we will learn from two early adopting customers, how they've leveraged this latest database service to innovate faster. We will learn from their experience of using the managed PostgreSQL service, including migrating to the service, and discuss next steps in their application journey. We will walk through some of the key service features and discuss how you as a developer can migrate your existing applications or develop new applications that use this managed PostgreSQL in Azure. If you’re a developer with applications that use PostgreSQL today, whether on-premises or cloud, and want to learn about how this new managed service can help, this session is for you! 3414 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8046 Eric Spear, Irakliy Khaburzaniya, Sunil Kamath data How to get started with the new Azure DBMS for MySQL. ]]> https://s.ch9.ms/Events/Build/2017/B8045 https://s.ch9.ms/Events/Build/2017/B8045 Join this session to learn about Microsoft’s managed MySQL offering in Azure. We’ll walk through Microsoft’s strategy for supporting Open-Source database systems in Azure and what it means to you as a developer as you look to develop or deploy applications that use MySQL in Azure. An overview of the architecture of the service along with how Azure Database for MySQL is integrated with other Azure Services such as Web Apps will also be discussed and demo’d. If you’re a developer with applications using MySQL today, whether on-prem or already in Azure today, this session is for you! 3723 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8045 Gebi Liang, Jason M. Anderson, Matt Williams data mysql Snapshot debugging and profiling in Microsoft Azure: Next generation diagnostics for your in-production cloud apps ]]> https://s.ch9.ms/Events/Build/2017/B8027 https://s.ch9.ms/Events/Build/2017/B8027 This session showcases the latest in tooling that will streamline your processes to resolve issues that you might encounter in your apps deployed to the cloud. Do you add logging, redeploy, and reiterate today? Do you wish you could inspect code on all server nodes without affecting performance or pausing execution? We go demo-heavy, so you get to know the capabilities of the new Visual Studio Snapshot Debugger in a production environment. Also, see how automatic snapshotting and profiling features of Application Insights will help you detect logic and performance issues in your production app and amaze your boss as you rapidly pinpoint the line of code that requires fixing. Come prepared to leave with new insight! 3582 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8027 Dan Taylor, Nikhil Joglekar Cloud4Good: Building an inclusive chat bot for athletes with disabilities In February 2017, Microsoft Canada partnered with viaSport British Columbia to build an inclusive chat bot for athletes with disabilities. In this session, we demo how the Microsoft Bot Framework and Microsoft Cognitive Services APIs were used to build an bot to streamline access to highly relevant resources for people in the inclusive sporting community; improve the tone in conversations around disabilities by correcting offensive and outdated terminology; and provide viaSport with a richer way to understand and serve this community. #Cloud4Good Technologies showcased: Bot Framework, Language Understanding Intelligent Service (LUIS) API, Bing Web Search, Bing Spell Check

]]>
https://s.ch9.ms/Events/Build/2017/T6999 https://s.ch9.ms/Events/Build/2017/T6999 In February 2017, Microsoft Canada partnered with viaSport British Columbia to build an inclusive chat bot for athletes with disabilities. In this session, we demo how the Microsoft Bot Framework and Microsoft Cognitive Services APIs were used to build an bot to streamline access to highly relevant resources for people in the inclusive sporting community; improve the tone in conversations around disabilities by correcting offensive and outdated terminology; and provide viaSport with a richer way to understand and serve this community. #Cloud4Good Technologies showcased: Bot Framework, Language Understanding Intelligent Service (LUIS) API, Bing Web Search, Bing Spell Check 1129 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6999 Sage Franch
How to really share code with Xamarin Join us for a fast paced talk where we share our experiences around this topic, and how we use the MVVM (Model-View-View-Model) pattern to make this happen. We also show how we can extend the code to Xbox One.

]]>
https://s.ch9.ms/Events/Build/2017/T6998 https://s.ch9.ms/Events/Build/2017/T6998 Join us for a fast paced talk where we share our experiences around this topic, and how we use the MVVM (Model-View-View-Model) pattern to make this happen. We also show how we can extend the code to Xbox One. 1152 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6998 Tess Ferrandez, Peter Bryntesson
How View360 is using Microsoft Azure to improve its telecom tower monitoring IoT solution ]]> https://s.ch9.ms/Events/Build/2017/T6997 https://s.ch9.ms/Events/Build/2017/T6997 This talk describes why View360 technologies chose Microsoft Azure to enhance their telecom tower monitoring solution. We focus on their existing architecture, challenges, and proposed architecture. We also discuss the challenges faced during implementation and how we overcame them as a team to resolve those challenges. 1443 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6997 Sudhir Rawat Workspace utilization with Azure IoT ]]> https://s.ch9.ms/Events/Build/2017/T6996 https://s.ch9.ms/Events/Build/2017/T6996 This session demonstrates how to use sensors to capture real-time information in a workspace to visualize and analyze how it is utilized. It goes through technologies in Azure IoT Suite to accomplish this. 1235 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6996 Dag König IoT technologies for the Mitreo archaeological site ]]> https://s.ch9.ms/Events/Build/2017/T6995 https://s.ch9.ms/Events/Build/2017/T6995 In this session, see how we combined Azure IoT Hub, Stream Analytics, Azure Web Apps and Azure SQL Database in order to create an IoT architecture for the remote monitoring of the Mitreo archaeological site, starting from a project which didn’t use Microsoft technology. 1183 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6995 Erica Barone Driving a refrigerated truck to Azure: Making an IoT solution more SaaS-ready with Quarta and TechnoKom ]]> https://s.ch9.ms/Events/Build/2017/T6994 https://s.ch9.ms/Events/Build/2017/T6994 Thousands of trucks around Russia move refrigerated goods from place to place every day, and on each of those trucks, TechnoKom and Quarta are monitoring the refrigeration units. In this story, we explain how we moved the old monitoring solution and interface to a cloud architecture with Microsoft Azure. 1030 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6994 Stas Pavlov How Azure enables time tracking ]]> https://s.ch9.ms/Events/Build/2017/T6993 https://s.ch9.ms/Events/Build/2017/T6993 The presentation walks through every aspect needed in order to create an extendable and fully-fledged cloud connected notification system integrated into a Xamarin Forms app (Android) for time tracking and notifying purposes. The same concepts were used for Norsk Tid on their time tracking application. 1236 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6993 Anders Gill An IoT solution for Blue Dynamic to gauge customer visits to brick-and-mortar stores ]]> https://s.ch9.ms/Events/Build/2017/T6992 https://s.ch9.ms/Events/Build/2017/T6992 Come to see how easily you can transform your retail business from a programmatic approach to a personalized customer experience using some of the latest Azure technologies like Cognitive services, IoT, Azure FX, etc. 1456 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6992 Jan Pospisil Early detection of cancer: Developing NLP classifiers to analyze biomedical literature ]]> https://s.ch9.ms/Events/Build/2017/T6991 https://s.ch9.ms/Events/Build/2017/T6991 microRNAs are bio-markers, which may indicate cancer and other diseases even at early stage. We partnered with Miroculus, a startup developing an affordable blood test to diagnose cancer and other genetic diseases. Together, we developed a pipeline and an NLP classifier to detect relations between genes and micro-RNAs in medical research documents. The generalized code and leanings are open sourced and shared on Github. 1179 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6991 Limor Lahiani Sound and vision: Visual anomalies from audio data using deep learning ]]> https://s.ch9.ms/Events/Build/2017/T6990 https://s.ch9.ms/Events/Build/2017/T6990 We walk you through an effort by Sierra Systems with help from Microsoft and the Microsoft Cognitive Toolkit to detect and classify oil pipeline leaks, using audio data from a sensor ball deployed by Pure Technologies. We convert this audio data into images and use state-of-the-art Deep Learning techniques in the realm of image recognition to find ‘visual’ anomalies and tell leaks from everyday events. 1285 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6990 Anthony Bulk, Michael Lanzetta Connecting sensors, sports, and AI ]]> https://s.ch9.ms/Events/Build/2017/T6989 https://s.ch9.ms/Events/Build/2017/T6989 Our goal is to help athletes improve their performance by providing insights and advice even when the coach is not around. In our study, we partnered with top athletes, sports organizations, including world-class athletes, data scientists and created an open source SensorKit to simplify data collection and processing from Bluetooth enabled sensors to the cloud and machine learning models. Being able to tell, just by looking at the data, an intermediate athlete from an expert, is truly an AI task that requires an integration of sensors, machine learning and cloud based intelligence. 1265 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6989 Kevin Ashley Guide Dogs: Improving speech recognition on iOS to help the blind navigate ]]> https://s.ch9.ms/Events/Build/2017/T6988 https://s.ch9.ms/Events/Build/2017/T6988 Based on a solution developed for Guide Dogs for the Blind, developers can create great voice recognition and command execution on iOS using Microsoft Cognitive Services and LUIS. 988 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6988 Andrei Ermilov Creating immersive experiences on the web, from mobiles to VR devices, with WebVR Today on the web you can create immersive 3D experiences for all modern mobiles and for VR devices as well. We’ll start showing you how Babylon.js helped Neo-Pangea build the Make Mars Home VR experience from National Geographic. We’ll explain with concrete code samples how to build a similar web app. Then, we’ll show you how to go even further supporting more powerful devices such as the Mixed Reality headsets or the HTC Vive & Oculus Rift devices. Get ready for VR on the web thanks to our 20 min of demos & code!

]]>
https://s.ch9.ms/Events/Build/2017/T6987 https://s.ch9.ms/Events/Build/2017/T6987 Today on the web you can create immersive 3D experiences for all modern mobiles and for VR devices as well. We’ll start showing you how Babylon.js helped Neo-Pangea build the Make Mars Home VR experience from National Geographic. We’ll explain with concrete code samples how to build a similar web app. Then, we’ll show you how to go even further supporting more powerful devices such as the Mixed Reality headsets or the HTC Vive &amp; Oculus Rift devices. Get ready for VR on the web thanks to our 20 min of demos &amp; code! 1311 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6987 David Rousset, David Catuhe
Project Fortis: Accelerating UN humanitarian aid planning and response with GraphQL ]]> https://s.ch9.ms/Events/Build/2017/T6986 https://s.ch9.ms/Events/Build/2017/T6986 How can humanitarian aid field experts use social media to gain insight, understand trends, and track key humanitarian issues? What can social media tell us that first hand data can’t? How can social media alert experts identify emerging trends that could have a profound impact? These are some of the questions that Microsoft and the United Nations set out to investigate and understand when we started working together on Project Fortis. What we learned was that by using advanced Machine Learning techniques, Apache Spark, GraphQL, React, integrated social media with a range of public and privately available data, and applying powerful data visualization techniques, we could indeed provide deeper insight and awareness to humanitarian disasters (i.e., refugee displacement, terrorist attacks, disease outbreaks, famine, etc.) Project Fortis was born. Project Fortis grew into a customizable tool that enables anyone to define a set of topics, a set of social media sources, and geography to track and monitor on their own. This talk focuses on the architecture of Fortis and how GraphQL was used to provide further insights into the post-gaddafi humanitarian situation in Libya. 1095 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6986 Erik Schlegel, Max Zilberman A real world use for Blockchain: Certification and attestation of Office documents ]]> https://s.ch9.ms/Events/Build/2017/T6985 https://s.ch9.ms/Events/Build/2017/T6985 Blockchain is the latest buzzword but what can actually be done with the blockchain today? This session looks at an attestation and certification blockchain use case which can be used today. It looks at the code from the user in Microsoft Office to the transaction on the chain and talks about the present issues of using the blockchain. All demo and code, no Powerpoint! 1205 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6985 Michael Platt Fraud detection for a mobile banking app using Cortana Intelligence Suite ]]> https://s.ch9.ms/Events/Build/2017/T6984 https://s.ch9.ms/Events/Build/2017/T6984 Are you interested in how to build a hybrid solution for transactions of data coming from an on-premises system and getting extracted, stored, feature selected, a feature vector built and scored in the cloud with a feedback loop to on-premises systems? Come to this talk to hear about lessons learned, design pattern, solution architecture, and code snippets. 1322 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6984 Michael Hlobil Unlocking Fusion with Containers and Kubernetes ]]> https://s.ch9.ms/Events/Build/2017/T6983 https://s.ch9.ms/Events/Build/2017/T6983 Containers and Kubernetes are the perfect storm for data scientists. General Fusion, a Canadian cleantech company, is leveraging Kubernetes and Pachyderm, a container-based data science platform, to help in their development of the world’s first fusion energy power plant. In this talk, we share the strategies and lessons learned by General Fusion to build a reproducible data workflow to help physicists and data scientists make sense of data generated from their prototype plasma injectors. 1177 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6983 Brendan Cassidy, Jason Poon Building a smart glucometer with IoT Hub ]]> https://s.ch9.ms/Events/Build/2017/T6982 https://s.ch9.ms/Events/Build/2017/T6982 IoT is valuable when you create a smarter world based on the devices that are in your every day life. Medilync (https://www.medilync.com/) is a medical devices company that is creating a smart glucometer connected to IoT Hub. By collecting the data and applying machine learning to it as it’s being collected, they are able to change the nature of the conversation with the doctor as well as proactively predict potential hypoglycemic events. This talk goes through the realities of building a connected device from how to implement the IoT Hub SDK on the device, connectivity to IoT Hub, bidirectional communications with the device and what programming is needed to consume the data on the back end. Then we dive into the some of the ML models to show how those are built, operationalized, and utilized. http://joshholmes.com/blog/aboutme/ for bio and photos and the like. 1277 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6982 Josh Holmes (DPE) Building Fluent Robots: How we developed a smart cache for LUIS and conversational robotics ]]> https://s.ch9.ms/Events/Build/2017/T6981 https://s.ch9.ms/Events/Build/2017/T6981 In robotics natural language processing provides a level of personalization and comfort that leads to increased trust and productivity. Microsoft offers LUIS, an intent and entity recognition service, that converts natural language text into actionable data. We recently partnered with the R&amp;D department of Roboteam, an innovative global robotics company, that was interested in using LUIS to provide natural interaction to it’s robots, but required low latency lookups and offline support. In this talk attendees learn about LUIS and how to use the Smart Conversational Client API, to enables client side LUIS caching and offline support for their applications. 843 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6981 Ari Bornstein Tag and detect: Object detection made easy ]]> https://s.ch9.ms/Events/Build/2017/T6980 https://s.ch9.ms/Events/Build/2017/T6980 In recent years, machine learning-based algorithms have become a popular choice for solving computer vision tasks. Training these algorithms, however, often requires a large quantity of labeled data that is traditionally difficult to prepare. In this talk, we present a recent collaboration between the Microsoft Partner Catalyst team and InSoundz, an audio-tracking startup, to build an Object Detection System using CNTK, Microsoft’s Deep Learning framework. As part of the project, the Partner Catalyst Team has developed the “Visual Object Tagging Tool,” which provides an end-to-end solution for building training sets for Object Detection algorithms from video files, as well as the ability to review the Object Detection Model on new data. As part of the talk, we demonstrate how to build an Object Detection Model using CNTK and the Visual Object Tagging Tool. 1134 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6980 Ari Bornstein, Guy Etgar, Nadav Bar How Azure and Blockchain solved Webjet's Reconciliation Challenge ]]> https://s.ch9.ms/Events/Build/2017/T6979 https://s.ch9.ms/Events/Build/2017/T6979 Webjet is a travel booking conglomerate operating predominantly in Asia-Pacific. Webjet has grown through acquisition of mature companies with different technology stacks, leading to a lack of a unified bookkeeping system. These disparate systems have created discrepancies in the closing entries of Webjet companies, resulting in an expensive and time-consuming reconciliation process. In this talk, we will show how the use of Azure and Blockchain helped Webjet reconcile their records. 960 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6979 Ali Hajimirza Computer vision for humanitarian impact: Building an image processing pipeline with the Red Cross Building technology that has a humanitarian impact is always a worthy a goal. Come learn how Microsoft and the Red Cross collaborated to build an image classification pipeline using serverless architecture and Microsoft Cognitive Services to empower scenarios like reuniting refugee families.

]]>
https://s.ch9.ms/Events/Build/2017/T6978 https://s.ch9.ms/Events/Build/2017/T6978 Building technology that has a humanitarian impact is always a worthy a goal. Come learn how Microsoft and the Red Cross collaborated to build an image classification pipeline using serverless architecture and Microsoft Cognitive Services to empower scenarios like reuniting refugee families. 1094 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6978 Jason Fox
Chat bots for the Win: Autonomous support using Cherwell Service Management and the Microsoft Bot Framework ]]> https://s.ch9.ms/Events/Build/2017/T6977 https://s.ch9.ms/Events/Build/2017/T6977 Join us to see how the Microsoft Bot Framework is being used to bring about a better experience for Cherwell users. Instead of requiring people to come to IT service management tools and systems to submit requests and report issues, the future of service management is all about providing services to people where they are, using the tools and technologies that they already use every day. We’ll dig in and show how the Bot Framework allows us to easily add support features into various chat clients. 1034 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6977 Thiago Almeida, John Hellyer NodeRT: Using native Windows features from Node.js and Electron ]]> https://s.ch9.ms/Events/Build/2017/T6976 https://s.ch9.ms/Events/Build/2017/T6976 Cross-platform JavaScript-based technologies such as Node.js and Electron have gained traction within the developer community in recent years. While these technologies enable a “write once, run everywhere” approach, in certain instances, a deeper integration with the hosting operating system may be required. In this talk, we describe a recent collaboration between the Partner Catalyst team at Microsoft and the Slack Desktop team, which introduces native Windows notification APIs to the Electron platform. The core of the solution is comprised of NodeRT, which exposes the entire Windows Runtime stack to Node.js and Electron. The talk features a deep dive into the workings of NodeRT and how it was built, and demonstrates how it can be used in your Node.js and Electron apps. 968 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6976 Felix Rieseberg, Nadav Bar Advanced architecture and development practices when engineering Cortana skills for multiple device types ]]> https://s.ch9.ms/Events/Build/2017/T6974 https://s.ch9.ms/Events/Build/2017/T6974 Voice is the new UI. Capital One is a pioneer in creating voice-driven skills and will talk about their engineering approach to a Cortana skill optimized for both screens and headless devices, and in a way that is agile, flexible, fast, efficient and secure. 1254 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6974 Eric Miles, James Kresge Creating natural conversational interfaces for robots using the power of Microsoft cloud ]]> https://s.ch9.ms/Events/Build/2017/T6973 https://s.ch9.ms/Events/Build/2017/T6973 Learn how Microsoft is collaborating with ASUS to explore how to make the robot Zenbo communicate better with humans and understand the world by using the power of billions of entities from Bing, Microsoft Cognitive Services, Microsoft Azure and Bot Framework. 1050 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6973 Mat Velloso Advanced LUIS models enabling rich query support in bots and Cortana skills ]]> https://s.ch9.ms/Events/Build/2017/T6972 https://s.ch9.ms/Events/Build/2017/T6972 Gigseekr is a new live music discovery service committed to helping you find and stay up to date with events. Gigseekr talks about how they have built their solutions around the Microsoft Bot Framework, Azure Search, and now Cortana skills, and in particular about advanced application of co-operating LUIS.ai models to handle a wide variety of natural language queries. 1205 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6972 David Hamilton Automated provisioning of Azure Functions on CarMax.com ]]> https://s.ch9.ms/Events/Build/2017/T6971-R2 https://s.ch9.ms/Events/Build/2017/T6971-R2 CarMax, the largest used car dealer in the United States, sees more than 15 million visitors per month to their website hosted in Microsoft Azure. CarMax engineers discuss wins and lessons learned in building scalable and fault-isolated microservices using (1) Azure Functions, Service Bus and other Azure PaaS offerings and (2) automated provisioning using ARM templates. 1222 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6971-R2 Chris Ferguson, Pallavi Athale Automated provisioning of Azure Functions on CarMax.com ]]> https://s.ch9.ms/Events/Build/2017/T6971-R1 https://s.ch9.ms/Events/Build/2017/T6971-R1 CarMax, the largest used car dealer in the United States, sees more than 15 million visitors per month to their website hosted in Microsoft Azure. CarMax engineers discuss wins and lessons learned in building scalable and fault-isolated microservices using (1) Azure Functions, Service Bus and other Azure PaaS offerings and (2) automated provisioning using ARM templates. 1246 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6971-R1 Chris Ferguson, Pallavi Athale How Brainshark is making salespeople better through artificial intelligence and Microsoft HoloLens ]]> https://s.ch9.ms/Events/Build/2017/T6969-R2 https://s.ch9.ms/Events/Build/2017/T6969-R2 Brainshark is working on building a platform that combines HoloLens, Azure Cognitive Services and Azure Machine Learning to put humans in an interactive meeting simulation, and score their performance using objective ML models. Come and check out this highly interactive session where we demonstrate how we built a real-world simulator powered by advanced Azure services in real time. We also show you how we are able to leverage Azure Cognitive Services and a custom Azure ML model to provide objective feedback on public speaking and presentation skills using a microservice approach based on Azure functions, WebJobs, and API Apps. Look under the hood and see how we’re leveraging next generation Microsoft technologies to improve human to human interactions. 1255 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6969-R2 Chris Caruso, Dan Cokely, Michael Ferioli How Brainshark is making salespeople better through artificial intelligence and Microsoft HoloLens ]]> https://s.ch9.ms/Events/Build/2017/T6969-R1 https://s.ch9.ms/Events/Build/2017/T6969-R1 Brainshark is working on building a platform that combines HoloLens, Azure Cognitive Services and Azure Machine Learning to put humans in an interactive meeting simulation, and score their performance using objective ML models. Come and check out this highly interactive session where we demonstrate how we built a real-world simulator powered by advanced Azure services in real time. We also show you how we are able to leverage Azure Cognitive Services and a custom Azure ML model to provide objective feedback on public speaking and presentation skills using a microservice approach based on Azure functions, WebJobs, and API Apps. Look under the hood and see how we’re leveraging next generation Microsoft technologies to improve human to human interactions. 1288 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6969-R1 Chris Caruso, Dan Cokely, Michael Ferioli Service Fabric architecture in the Swiss Re Digital Platform: An IoT scenario ]]> https://s.ch9.ms/Events/Build/2017/T6968-R2 https://s.ch9.ms/Events/Build/2017/T6968-R2 Service Fabric builds the foundation of the digital platform at Swiss Re. The platform is highly scalable and able to process millions of messages. This session demonstrates how to process and enrich messages in Service Fabric using reliable actors and state full/stateless services. Swiss Re starts with an architecture overview of the solution and will then immediately dive into the implementation. We show two parts in detail: how to consume messages from EventHubs at scale by leveraging stateful services; and using Stream Analytics with the Avro protocol to prepare hopping windows for maneuver detection. 1241 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6968-R2 Alan Wales, Jürg Staub Service Fabric architecture in the Swiss Re Digital Platform: An IoT scenario ]]> https://s.ch9.ms/Events/Build/2017/T6968-R1 https://s.ch9.ms/Events/Build/2017/T6968-R1 Service Fabric builds the foundation of the digital platform at Swiss Re. The platform is highly scalable and able to process millions of messages. This session demonstrates how to process and enrich messages in Service Fabric using reliable actors and state full/stateless services. Swiss Re starts with an architecture overview of the solution and will then immediately dive into the implementation. We show two parts in detail: how to consume messages from EventHubs at scale by leveraging stateful services; and using Stream Analytics with the Avro protocol to prepare hopping windows for maneuver detection. 1255 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6968-R1 Alan Wales, Jürg Staub Developer's Guide to the Galaxy #WinDev, Part 1 ]]> https://s.ch9.ms/Events/Build/2017/T6967 https://s.ch9.ms/Events/Build/2017/T6967 Bleeding edge Windows 10 demos wrapped in a bit of fun. Mixed Reality, My People, shoulder taps, WebVR, composition, Progressive Web Apps, UWP Community Toolkit and more. No slides, just demos and code. 1733 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6967 Jeff Burtoft Building touch enabled restaurant tables with Windows 10 IoT and UWP Learn about the Interactive Table: an IoT device that provides a new way for collaborative experiences in public places.

]]>
https://s.ch9.ms/Events/Build/2017/T6966 https://s.ch9.ms/Events/Build/2017/T6966 Learn about the Interactive Table: an IoT device that provides a new way for collaborative experiences in public places. 902 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6966 Dymtro Kostyk windows+iot
Creating robots with Windows 10 IoT Core Coming soon

]]>
https://s.ch9.ms/Events/Build/2017/T6965 https://s.ch9.ms/Events/Build/2017/T6965 Coming soon 932 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6965 Morgan Bell windows+iot
Enrichment Panel: Developer Non-profits Standing Out Through Technology ]]> https://s.ch9.ms/Events/Build/2017/T6963 https://s.ch9.ms/Events/Build/2017/T6963 Diversity in technology and learning to code are two hot topics in the tech world, as both create solutions empowering future diverse leaders in all STEM fields. Join this group of local thought leaders for a dynamic conversation about empowering youth and underrepresented communities who are creating change in Seattle’s tech industry. We hope you’ll take these learnings and apply them in your own communities to help bridge the gap of diversity in tech. 2114 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6963 Leadership Panel: Women Leaders Standing Out Through Technology ]]> https://s.ch9.ms/Events/Build/2017/T6962 https://s.ch9.ms/Events/Build/2017/T6962 Don’t miss this inspiring panel of professional women as they share their stories and offer worldly advice about being fearless, standing out as successful leaders, and how they make a difference for themselves and others. 2385 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6962 How Microsoft gets the most out of games with UWP ]]> https://s.ch9.ms/Events/Build/2017/T6960 https://s.ch9.ms/Events/Build/2017/T6960 Come meet a developer who has been on the front line of Microsoft platform game development for nearly a decade, from Win32, to Xbox, and now the Windows Store. Get insights into how UWP games have evolved on Windows and are coming home to the Xbox One family of consoles. 1096 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6960 James Yarrow Diversity and Accessibility as Technical Differentiators ]]> https://s.ch9.ms/Events/Build/2017/T6958 https://s.ch9.ms/Events/Build/2017/T6958 Come hear from three professionals who have used their diverse backgrounds to learn how to improve accessibility and create awesome products that solve real problems. This panel will inspire you to use technology to make a difference for others. 1615 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6958 Developer's Guide to the Galaxy #WinDev, Part 2 ]]> https://s.ch9.ms/Events/Build/2017/T6957 https://s.ch9.ms/Events/Build/2017/T6957 Bleeding edge Windows 10 demos wrapped in a bit of fun. Mixed Reality, My People, shoulder taps, WebVR, composition, Progressive Web Apps, UWP Community Toolkit and more. No slides, just demos and code. 1852 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6957 Jeff Burtoft Cloud4Good Project: Harnessing Azure Functions to aid in the search for missing children ]]> https://s.ch9.ms/Events/Build/2017/T6956 https://s.ch9.ms/Events/Build/2017/T6956 Children today are technology natives, harnessing technology to play, share, and learn. With this empowerment comes responsibility, both of parents and of the children themselves. Who kids chat with online and what they share can come at a price should it fall into the wrong hands. This challenge is something that keep CEO Amanda Pick and the team at Missing Children Society of Canada (MCSC) up at night as more and more predators are using online sources to lure children. Last year 45,000 children in Canada went missing. The sole mission of Calgary-based non-profit MCSC is to bring every child home. Part of their challenge is acquiring information on a child (such as last-known whereabouts and contacts) and providing that information to local law enforcement. Alongside members of the City of Calgary and Calgary Police, MCSC partnered with Microsoft in an innovation workshop to understand how Azure Functions, Xamarin, and DevOps best practices can better address their need to quickly provide police with information about children who are reported missing. The resulting application used the following services and practices: Azure Functions, Azure Storage, Continuous Integration, Infrastructure as Code, Visual Studio Team Services, and Xamarin Tools. The goal of the initial 4-day project was to enable MCSC to use automated Azure functionality to extract last-known coordinates, who the child was in contact with, and the sentiment of conversation from social-media platforms such as Twitter and Facebook. The innovation workshop team comprised members from Microsoft, MCSC, Calgary Police, and the City of Calgary. Attend this session to learn how Azure Function utilization was instrumental in acquiring information from the Twitter API which cut down research time from 30 days to 30 minutes to further aid police in the search for missing children. #Cloud4Good 815 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6956 Anthony Bartolo Ink Analysis in SOLIDWORKS ]]> https://s.ch9.ms/Events/Build/2017/T6116-R2 https://s.ch9.ms/Events/Build/2017/T6116-R2 SOLIDWORKS offers complete 3D software tools that let you create, simulate, publish, and manage your data. During this session, SOLIDWORKS illustrates their integration with Ink Analysis APIs to show how users can use the pen to create the basis for their 3D designs more naturally and without the need to pre-identify which shapes they want to draw. The new tools using Ink Analysis APIs allow users to create conceptual sketches and generate the sketch geometry that they can use for their 3D creations in a new and more natural way. 1027 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6116-R2 Kevin Berni universal+windows+platform+uwp ink Ink Analysis in SOLIDWORKS ]]> https://s.ch9.ms/Events/Build/2017/T6116-R1 https://s.ch9.ms/Events/Build/2017/T6116-R1 SOLIDWORKS offers complete 3D software tools that let you create, simulate, publish, and manage your data. During this session, SOLIDWORKS illustrates their integration with Ink Analysis APIs to show how users can use the pen to create the basis for their 3D designs more naturally and without the need to pre-identify which shapes they want to draw. The new tools using Ink Analysis APIs allow users to create conceptual sketches and generate the sketch geometry that they can use for their 3D creations in a new and more natural way. 1096 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6116-R1 Kevin Berni universal+windows+platform+uwp ink Design and prototype with Adobe XD: Even if you’re a developer ]]> https://s.ch9.ms/Events/Build/2017/T6114-R2 https://s.ch9.ms/Events/Build/2017/T6114-R2 Experience Design (Xd) is new powerful UI/X design and prototyping tool from Adobe. See how important it is to create captivating and engaging app UI for your next app. Adobe Xd has built in UWP templates to get you started quickly and accurately. This demonstration shows you how to design a UWP app, prototype behaviors or transitions, and share your design with others. 1377 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6114-R2 Andrew Shorten, Jonathan Pimento ux universal+windows+platform+uwp tools Design and prototype with Adobe XD: Even if you’re a developer ]]> https://s.ch9.ms/Events/Build/2017/T6114-R1 https://s.ch9.ms/Events/Build/2017/T6114-R1 Experience Design (Xd) is new powerful UI/X design and prototyping tool from Adobe. See how important it is to create captivating and engaging app UI for your next app. Adobe Xd has built in UWP templates to get you started quickly and accurately. This demonstration shows you how to design a UWP app, prototype behaviors or transitions, and share your design with others. 1367 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6114-R1 Andrew Shorten, Jonathan Pimento ux universal+windows+platform+uwp tools How business can enable their digital transformation with TeamViewer ]]> https://s.ch9.ms/Events/Build/2017/T6113-R2 https://s.ch9.ms/Events/Build/2017/T6113-R2 Come and learn how TeamViewer leveraged new innovations like UWP and Desktop Bridge so you can benefit and accelerate your digital transformation. 1003 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6113-R2 Alfredo Patron windows+store desktop+bridge How business can enable their digital transformation with TeamViewer ]]> https://s.ch9.ms/Events/Build/2017/T6113-R1 https://s.ch9.ms/Events/Build/2017/T6113-R1 Come and learn how TeamViewer leveraged new innovations like UWP and Desktop Bridge so you can benefit and accelerate your digital transformation. 854 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6113-R1 Alfredo Patron windows+store desktop+bridge Build data driven solutions using Microsoft Visio ]]> https://s.ch9.ms/Events/Build/2017/T6111 https://s.ch9.ms/Events/Build/2017/T6111 Learn to create data driven solutions using Visio, one the most advance diagramming tools, on both web and desktop. 1173 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6111 Kulo Rajasekaran, Rishabh Agrawal Sapho connects legacy systems with Microsoft Teams ]]> https://s.ch9.ms/Events/Build/2017/T6110 https://s.ch9.ms/Events/Build/2017/T6110 Microsoft Teams is new and exciting, however it is not obvious how to connect in legacy on-premises systems. In this Tech Talk, we will show how Sapho detects events in legacy systems including SAP ERP and Oracle EBS and turns the events into actionable cards in Microsoft Teams, as well as how users can query those systems with bot questions. 1186 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6110 Peter Yared Black Marble: What did UWP ever do for us? ]]> https://s.ch9.ms/Events/Build/2017/T6109-R2 https://s.ch9.ms/Events/Build/2017/T6109-R2 Come hear how UWP transformed our experience of developing an enterprise grade application for operational policing. 1163 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6109-R2 Robert Hogg, James Croft universal+windows+platform+uwp Black Marble: What did UWP ever do for us? ]]> https://s.ch9.ms/Events/Build/2017/T6109-R1 https://s.ch9.ms/Events/Build/2017/T6109-R1 Come hear how UWP transformed our experience of developing an enterprise grade application for operational policing. 1069 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6109-R1 Robert Hogg, James Croft universal+windows+platform+uwp Using Microsoft Graph to connect to Office 365 data ]]> https://s.ch9.ms/Events/Build/2017/T6108 https://s.ch9.ms/Events/Build/2017/T6108 Come find out how you can incorporate Microsoft Graph in your apps to pull in the most relevant user, group, file, mail and more pieces of information to build an engaging experience. 1166 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6108 Yina Arenas office office+365 Kodi goes Windows Store with the Desktop Bridge ]]> https://s.ch9.ms/Events/Build/2017/T6107-R2 https://s.ch9.ms/Events/Build/2017/T6107-R2 Kodi is a free and open source software media player and entertainment hub. Last September, we made our app available in the Windows Store using the Desktop Bridge and reached millions of Windows 10 users. In this presentation we discuss our experience with the Desktop Bridge and demo some cool new Kodi features. 1202 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6107-R2 Pär Björklund windows+store desktop+bridge Kodi goes Windows Store with the Desktop Bridge ]]> https://s.ch9.ms/Events/Build/2017/T6107-R1 https://s.ch9.ms/Events/Build/2017/T6107-R1 Kodi is a free and open source software media player and entertainment hub. Last September, we made our app available in the Windows Store using the Desktop Bridge and reached millions of Windows 10 users. In this presentation we discuss our experience with the Desktop Bridge and demo some cool new Kodi features. 1212 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6107-R1 Pär Björklund windows+store desktop+bridge ByteCubed: Making the move to mixed reality ]]> https://s.ch9.ms/Events/Build/2017/T6106-R2 https://s.ch9.ms/Events/Build/2017/T6106-R2 Mixed reality opens up new ways of interacting with the world and working with each other. In this session, we'll describe how we took a traditional analog business process and found new opportunities to deliver value to the national security and public safety community with the Microsoft HoloLens. We will also share some tips and tricks for designing mixed reality experiences and building them in Unity3D that can help developers and designers new to Windows Holographic build high-quality experiences faster. 1256 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6106-R2 Jordan Higgins universal+windows+platform+uwp hololens ByteCubed: Making the move to mixed reality ]]> https://s.ch9.ms/Events/Build/2017/T6106-R1 https://s.ch9.ms/Events/Build/2017/T6106-R1 Mixed reality opens up new ways of interacting with the world and working with each other. In this session, we'll describe how we took a traditional analog business process and found new opportunities to deliver value to the national security and public safety community with the Microsoft HoloLens. We will also share some tips and tricks for designing mixed reality experiences and building them in Unity3D that can help developers and designers new to Windows Holographic build high-quality experiences faster. 1094 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6106-R1 Jordan Higgins universal+windows+platform+uwp hololens Immersive technology at Merck: Using Microsoft HoloLens to reimagine the molecular R&D process ]]> https://s.ch9.ms/Events/Build/2017/T6105-R1 https://s.ch9.ms/Events/Build/2017/T6105-R1 In Spring 2016, Merck’s Applied Technology Team asked Infusion to review some use-cases that they had identified for Immersive Technology. They were curious about our understanding of the hardware market for these devices. We closed a short, one-person, five-week engagement to review their identified scenarios and suggest what areas of AR/VR/MR were most suitable and what devices would be the best fit. Upon delivering a report that identified HoloLens as the front-runner, due to their scenarios being best realized in mixed reality, Merck engaged us to develop a prototype for one use-case. 1388 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6105-R1 Jeremy Bibby, Giovanna Scapin, Prashant Shah universal+windows+platform+uwp hololens Random Salad Games: How to monetize your Windows app, acquire users, and make a million dollars doing it ]]> https://s.ch9.ms/Events/Build/2017/T6104-R3 https://s.ch9.ms/Events/Build/2017/T6104-R3 The Microsoft Cloud Monetization Platform provides effective ways to make money from your app. In this session, learn how to integrate ads into your app from the founders of Random Salad Games. Discover how to promote your app, acquire users, and hear some of the optimization tips that helped Random Salad Games earn a million dollars on the Windows Platform. Attendees with published app will get free app promotion credits and optimization tips to promote their app after the session. 1290 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6104-R3 Jake Poznanski, Sam Kaufmann windows+store monetization Random Salad Games: How to monetize your Windows app, acquire users, and make a million dollars doing it ]]> https://s.ch9.ms/Events/Build/2017/T6104-R2 https://s.ch9.ms/Events/Build/2017/T6104-R2 The Microsoft Cloud Monetization Platform provides effective ways to make money from your app. In this session, learn how to integrate ads into your app from the founders of Random Salad Games. Discover how to promote your app, acquire users, and hear some of the optimization tips that helped Random Salad Games earn a million dollars on the Windows Platform. Attendees with published app will get free app promotion credits and optimization tips to promote their app after the session. 1292 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6104-R2 Jake Poznanski, Sam Kaufmann windows+store monetization Random Salad Games: How to monetize your Windows app, acquire users, and make a million dollars doing it ]]> https://s.ch9.ms/Events/Build/2017/T6104-R1 https://s.ch9.ms/Events/Build/2017/T6104-R1 The Microsoft Cloud Monetization Platform provides effective ways to make money from your app. In this session, learn how to integrate ads into your app from the founders of Random Salad Games. Discover how to promote your app, acquire users, and hear some of the optimization tips that helped Random Salad Games earn a million dollars on the Windows Platform. Attendees with published app will get free app promotion credits and optimization tips to promote their app after the session. 1263 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6104-R1 Jake Poznanski, Sam Kaufmann windows+store monetization Ayzenberg/Praeses: Jurisdiction Unlimited: Extending Jurisdiction Online to Microsoft HoloLens, so building inspectors make better decisions, faster, for increased safety ]]> https://s.ch9.ms/Events/Build/2017/T6103-R3 https://s.ch9.ms/Events/Build/2017/T6103-R3 Between paper notes, retyping data, and underwriter verification, the entire inspection process can take up to three months. Jurisdiction Unlimited is a Mixed Reality extension of the existing Jurisdiction Online software solution from Praeses, targeted at improving the efficiency and accuracy of the jurisdictional inspection and risk evaluation processes. By increasing data quality, communicating contextual data more effectively, and streamlining the data entry system, this will ultimately lead to a safer community. This demo shows a work-in-progress build of the Jurisdiction Unlimited Proof of Concept, showing a functional slice of what the application could do to resolve industry issues, within a specific scenario and a scripted/self-contained Unity environment. We show how an inspector will go through an inspection process using Jurisdiction Unlimited, resolve an existing violation and add a new one, easily add annotations and interact with past annotations, submit their inspection, and review findings with stakeholders. 1393 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6103-R3 Matt Bretz universal+windows+platform+uwp hololens Ayzenberg/Praeses: Jurisdiction Unlimited: Extending Jurisdiction Online to Microsoft HoloLens, so building inspectors make better decisions, faster, for increased safety ]]> https://s.ch9.ms/Events/Build/2017/T6103-R2 https://s.ch9.ms/Events/Build/2017/T6103-R2 Between paper notes, retyping data, and underwriter verification, the entire inspection process can take up to three months. Jurisdiction Unlimited is a Mixed Reality extension of the existing Jurisdiction Online software solution from Praeses, targeted at improving the efficiency and accuracy of the jurisdictional inspection and risk evaluation processes. By increasing data quality, communicating contextual data more effectively, and streamlining the data entry system, this will ultimately lead to a safer community. This demo shows a work-in-progress build of the Jurisdiction Unlimited Proof of Concept, showing a functional slice of what the application could do to resolve industry issues, within a specific scenario and a scripted/self-contained Unity environment. We show how an inspector will go through an inspection process using Jurisdiction Unlimited, resolve an existing violation and add a new one, easily add annotations and interact with past annotations, submit their inspection, and review findings with stakeholders. 1272 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6103-R2 Matt Bretz universal+windows+platform+uwp hololens Ayzenberg/Praeses: Jurisdiction Unlimited: Extending Jurisdiction Online to Microsoft HoloLens, so building inspectors make better decisions, faster, for increased safety ]]> https://s.ch9.ms/Events/Build/2017/T6103-R1 https://s.ch9.ms/Events/Build/2017/T6103-R1 Between paper notes, retyping data, and underwriter verification, the entire inspection process can take up to three months. Jurisdiction Unlimited is a Mixed Reality extension of the existing Jurisdiction Online software solution from Praeses, targeted at improving the efficiency and accuracy of the jurisdictional inspection and risk evaluation processes. By increasing data quality, communicating contextual data more effectively, and streamlining the data entry system, this will ultimately lead to a safer community. This demo shows a work-in-progress build of the Jurisdiction Unlimited Proof of Concept, showing a functional slice of what the application could do to resolve industry issues, within a specific scenario and a scripted/self-contained Unity environment. We show how an inspector will go through an inspection process using Jurisdiction Unlimited, resolve an existing violation and add a new one, easily add annotations and interact with past annotations, submit their inspection, and review findings with stakeholders. 1294 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6103-R1 Matt Bretz universal+windows+platform+uwp hololens Drawboard: Building a business by differentiating on UWP and Microsoft Surface Learn how we identified an opportunity to create an app on UWP and Surface and successfully commercialize it. In this chat, we explain how we matched the purpose of the app with differentiating features of the platform to wow our audiences.

]]>
https://s.ch9.ms/Events/Build/2017/T6102-R2 https://s.ch9.ms/Events/Build/2017/T6102-R2 Learn how we identified an opportunity to create an app on UWP and Surface and successfully commercialize it. In this chat, we explain how we matched the purpose of the app with differentiating features of the platform to wow our audiences. 1054 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6102-R2 Nick Waggoner, Alistair Michener
Drawboard: Building a business by differentiating on UWP and Microsoft Surface Learn how we identified an opportunity to create an app on UWP and Surface and successfully commercialize it. In this chat, we explain how we matched the purpose of the app with differentiating features of the platform to wow our audiences.

]]>
https://s.ch9.ms/Events/Build/2017/T6102-R1 https://s.ch9.ms/Events/Build/2017/T6102-R1 Learn how we identified an opportunity to create an app on UWP and Surface and successfully commercialize it. In this chat, we explain how we matched the purpose of the app with differentiating features of the platform to wow our audiences. 1006 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6102-R1 Nick Waggoner, Alistair Michener
Bullclip: Differentiating UX with UWP experiences in a connected devices environment In this chat, we cover why we chose UWP before other mobile platforms as our first mobile app in a connected devices environment. We also chat about leveraging the UWP and Surface user experiences to create a delightful app, and how Bullclip uses Project Orleans for real-time collaboration on PDF.

]]>
https://s.ch9.ms/Events/Build/2017/T6101-R2 https://s.ch9.ms/Events/Build/2017/T6101-R2 In this chat, we cover why we chose UWP before other mobile platforms as our first mobile app in a connected devices environment. We also chat about leveraging the UWP and Surface user experiences to create a delightful app, and how Bullclip uses Project Orleans for real-time collaboration on PDF. 971 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6101-R2 Lindsay Kubasik, Alistair Michener
Bullclip: Differentiating UX with UWP experiences in a connected devices environment In this chat, we cover why we chose UWP before other mobile platforms as our first mobile app in a connected devices environment. We also chat about leveraging the UWP and Surface user experiences to create a delightful app, and how Bullclip uses Project Orleans for real-time collaboration on PDF.

]]>
https://s.ch9.ms/Events/Build/2017/T6101-R1 https://s.ch9.ms/Events/Build/2017/T6101-R1 In this chat, we cover why we chose UWP before other mobile platforms as our first mobile app in a connected devices environment. We also chat about leveraging the UWP and Surface user experiences to create a delightful app, and how Bullclip uses Project Orleans for real-time collaboration on PDF. 963 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6101-R1 Lindsay Kubasik, Alistair Michener
Cakewalk SONAR: Win32 lighting up on Windows 10 ]]> https://s.ch9.ms/Events/Build/2017/T6100-R2 https://s.ch9.ms/Events/Build/2017/T6100-R2 Cakewalk Sonar is a top music creation and production application for Windows. In this session, learn about the audio, bluetooth, MIDI, and other features Cakewalk has used to light up on Windows 10 from their traditional Win32 app. 1436 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6100-R2 Pete Brown, Noel Borthwick universal+windows+platform+uwp desktop+bridge media Cakewalk SONAR: Win32 lighting up on Windows 10 ]]> https://s.ch9.ms/Events/Build/2017/T6100-R1 https://s.ch9.ms/Events/Build/2017/T6100-R1 Cakewalk Sonar is a top music creation and production application for Windows. In this session, learn about the audio, bluetooth, MIDI, and other features Cakewalk has used to light up on Windows 10 from their traditional Win32 app. 1364 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6100-R1 Pete Brown, Noel Borthwick universal+windows+platform+uwp desktop+bridge media Jig.Space: Using 3D game technology in progressive web apps with BabylonJS ]]> https://s.ch9.ms/Events/Build/2017/T6098-R2 https://s.ch9.ms/Events/Build/2017/T6098-R2 Join Jig.Space to learn how to apply technology that's usually reserved for games in non-gaming applications. Devs with a gaming background will find a wealth of information about applything those skills to progress web apps. 918 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6098-R2 Numa Berton, Zac Duff web+platform media mixed+reality Jig.Space: Using 3D game technology in progressive web apps with BabylonJS ]]> https://s.ch9.ms/Events/Build/2017/T6098-R1 https://s.ch9.ms/Events/Build/2017/T6098-R1 Join Jig.Space to learn how to apply technology that's usually reserved for games in non-gaming applications. Devs with a gaming background will find a wealth of information about applything those skills to progress web apps. 867 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6098-R1 Numa Berton, Zac Duff web+platform media mixed+reality Lessons learned developing for mixed reality ]]> https://s.ch9.ms/Events/Build/2017/T6097-R2 https://s.ch9.ms/Events/Build/2017/T6097-R2 Learn how an internal Microsoft team developed an application that works on Microsoft HoloLens and Virtual Reality devices. The presenters talk about how to use Unity to leverage the Microsoft Mixed Reality APIs, differences you will encounter when working with different types of devices, and techniques they used to build their application. 1556 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6097-R2 Richard Wifall universal+windows+platform+uwp hololens mixed+reality Lessons learned developing for mixed reality ]]> https://s.ch9.ms/Events/Build/2017/T6097-R1 https://s.ch9.ms/Events/Build/2017/T6097-R1 Learn how an internal Microsoft team developed an application that works on Microsoft HoloLens and Virtual Reality devices. The presenters talk about how to use Unity to leverage the Microsoft Mixed Reality APIs, differences you will encounter when working with different types of devices, and techniques they used to build their application. 1578 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6097-R1 Dan Anderson (APS), Richard Wifall universal+windows+platform+uwp hololens mixed+reality Simplygon: All 3D assets, any platform ]]> https://s.ch9.ms/Events/Build/2017/T6096-R2 https://s.ch9.ms/Events/Build/2017/T6096-R2 Prettier, smoother applications on more devices, automatically. Building mixed reality experiences for Windows 10 usually requires 3D content. This session shows developers how to optimize their content for Microsoft HoloLens and other form factors. 824 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6096-R2 Koshi Hamedi, Roger Kurtz, Sebastian Wiberg graphics media mixed+reality Simplygon: All 3D assets, any platform ]]> https://s.ch9.ms/Events/Build/2017/T6096-R1 https://s.ch9.ms/Events/Build/2017/T6096-R1 Prettier, smoother applications on more devices, automatically. Building mixed reality experiences for Windows 10 usually requires 3D content. This session shows developers how to optimize their content for Microsoft HoloLens and other form factors. 1152 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6096-R1 Koshi Hamedi, Roger Kurtz, Sebastian Wiberg graphics media mixed+reality Sketchable and Surface Dial integration ]]> https://s.ch9.ms/Events/Build/2017/T6095-R2 https://s.ch9.ms/Events/Build/2017/T6095-R2 Sketchable is a hybrid journal and canvas application that allows users to scribble a note, snap, and edit a picture, or paint a masterpiece using ink. During this session, Sketchable details their integration with the Surface Dial and showcases how they have been able to utilize the new APIs in Windows Creator’s update to provide a more customized user experience using both ink and Dial. 952 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6095-R2 Miles Harris, Ryan Harris universal+windows+platform+uwp dial ink Sketchable and Surface Dial integration ]]> https://s.ch9.ms/Events/Build/2017/T6095-R1 https://s.ch9.ms/Events/Build/2017/T6095-R1 Sketchable is a hybrid journal and canvas application that allows users to scribble a note, snap, and edit a picture, or paint a masterpiece using ink. During this session, Sketchable details their integration with the Surface Dial and showcases how they have been able to utilize the new APIs in Windows Creator’s update to provide a more customized user experience using both ink and Dial. 930 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6095-R1 Miles Harris, Ryan Harris universal+windows+platform+uwp dial ink MusixMatch: Increase your reach with the Desktop Bridge: Bring an Electron app to the Windows Store ]]> https://s.ch9.ms/Events/Build/2017/T6094-R3 https://s.ch9.ms/Events/Build/2017/T6094-R3 Musixmatch is a startup founded in Italy in 2010, which brought for the first time a very popular request from users in a legal way, thanks to a partnership with the major worldwide music labels: having the chance to easily find song’s lyrics. With an innovative application available for the most important platforms on the market, the service integrates with the most popular music services and players (like Spotify and iTunes) and display lyrics synced in real time, allowing you to turn any device into a Karaoke machine. The application is available also on Windows and Mac as a traditional desktop application, built with the popular web framework Electron. However, Musixmatch wanted to expand the reach of its app and make it easier for Windows users to find it: the Desktop Bridge helped to achieve this goal, allowing them to take the Electron app and turn it into a Store that is available on the Windows Store and that makes easier for them to integrate it with all the new Windows 10 features. In this session, learn more about this exciting app, the conversion process and how, thanks to the Desktop Bridge, the company has been able to quickly reach the Store and make it better thanks to the Universal Windows Platform. 1035 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6094-R3 Francesco Delfino windows+store desktop+bridge MusixMatch: Increase your reach with the Desktop Bridge: Bring an Electron app to the Windows Store ]]> https://s.ch9.ms/Events/Build/2017/T6094-R2 https://s.ch9.ms/Events/Build/2017/T6094-R2 Musixmatch is a startup founded in Italy in 2010, which brought for the first time a very popular request from users in a legal way, thanks to a partnership with the major worldwide music labels: having the chance to easily find song’s lyrics. With an innovative application available for the most important platforms on the market, the service integrates with the most popular music services and players (like Spotify and iTunes) and display lyrics synced in real time, allowing you to turn any device into a Karaoke machine. The application is available also on Windows and Mac as a traditional desktop application, built with the popular web framework Electron. However, Musixmatch wanted to expand the reach of its app and make it easier for Windows users to find it: the Desktop Bridge helped to achieve this goal, allowing them to take the Electron app and turn it into a Store that is available on the Windows Store and that makes easier for them to integrate it with all the new Windows 10 features. In this session, learn more about this exciting app, the conversion process and how, thanks to the Desktop Bridge, the company has been able to quickly reach the Store and make it better thanks to the Universal Windows Platform. 1120 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6094-R2 Francesco Delfino windows+store desktop+bridge MusixMatch: Increase your reach with the Desktop Bridge: Bring an Electron app to the Windows Store ]]> https://s.ch9.ms/Events/Build/2017/T6094-R1 https://s.ch9.ms/Events/Build/2017/T6094-R1 Musixmatch is a startup founded in Italy in 2010, which brought for the first time a very popular request from users in a legal way, thanks to a partnership with the major worldwide music labels: having the chance to easily find song’s lyrics. With an innovative application available for the most important platforms on the market, the service integrates with the most popular music services and players (like Spotify and iTunes) and display lyrics synced in real time, allowing you to turn any device into a Karaoke machine. The application is available also on Windows and Mac as a traditional desktop application, built with the popular web framework Electron. However, Musixmatch wanted to expand the reach of its app and make it easier for Windows users to find it: the Desktop Bridge helped to achieve this goal, allowing them to take the Electron app and turn it into a Store that is available on the Windows Store and that makes easier for them to integrate it with all the new Windows 10 features. In this session, learn more about this exciting app, the conversion process and how, thanks to the Desktop Bridge, the company has been able to quickly reach the Store and make it better thanks to the Universal Windows Platform. 1100 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6094-R1 Francesco Delfino windows+store desktop+bridge Introduction to Microsoft AppSource: How to build and list your line-of-business SaaS app  ]]> https://s.ch9.ms/Events/Build/2017/T6093 https://s.ch9.ms/Events/Build/2017/T6093 Join us for this overview session on AppSource and learn how to build and list your line-of-business SaaS app. We provide you with an overview of AppSource and how to package and provision you app, and how to enable a customer-led trial experience for apps that are built on or work with Microsoft technologies, such as Azure, Cortana Intelligence, Dynamics 365, Office 365, and Power BI. 1273 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6093 Satish Thomas Creating delightful app experiences using Windows design principles ]]> https://s.ch9.ms/Events/Build/2017/T6092-R2 https://s.ch9.ms/Events/Build/2017/T6092-R2 Join Windows NEXT design director for an introduction of universal and Windows design principles and how they’re expressed in the latest versions of desktop apps that come with the Windows Creators Update. Learn how relatable Materials, Lighting, Motion, and Conscious User Interface elements can help you deliver your users not just a product, but an immersive and emotional experience. 1378 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6092-R2 Claudio Goralczuk, Dominic Hopton, Mike Harnisch ux universal+windows+platform+uwp Creating delightful app experiences using Windows design principles ]]> https://s.ch9.ms/Events/Build/2017/T6092-R1 https://s.ch9.ms/Events/Build/2017/T6092-R1 Join the Windows NEXT design director for an introduction of universal and Windows design principles and how they’re expressed in the latest versions of desktop apps that come with the Windows Creators Update. Learn how relatable Materials, Lighting, Motion, and Conscious User Interface elements can help you deliver your users not just a product, but an immersive and emotional experience. 1327 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6092-R1 Claudio Goralczuk, Dominic Hopton, Mike Harnisch ux universal+windows+platform+uwp How Wolters Kluwer created an isolated job system and containerization strategy on Azure Service Fabric ]]> https://s.ch9.ms/Events/Build/2017/T6089 https://s.ch9.ms/Events/Build/2017/T6089 How Wolters Kluwer built their massive scale, compute, data, and tenant isolated job system and mapped their containerization strategy to Azure Service Fabric. Wolters Kluwer moved from a monolith existing design to a microservices design, leveraging multiple Azure platforms including Service Fabric for building mission-critical applications. Hear about lessons learned and best practices including monitoring, isolation, and containerization, in transforming to a microservice architecture. 1105 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6089 Jason Hamilton service+fabric microservices Managing secure, scalable Azure Service Fabric clusters and applications ]]> https://s.ch9.ms/Events/Build/2017/T6084 https://s.ch9.ms/Events/Build/2017/T6084 Learn about the lifecycle management capabilities of Service Fabric for managing microservices at scale. Use Azure PS or CLI to create and manage secure Service Fabric clusters. Monitor, troubleshoot, and upgrade microservices on Service Fabric clusters with no downtime. Come and see this live in action! 1309 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6084 Chacko Daniel Unity game development with Visual Studio ]]> https://s.ch9.ms/Events/Build/2017/T6083 https://s.ch9.ms/Events/Build/2017/T6083 Unity is a game creation environment you can use to create high quality cross-platform games for all the major platforms: mobiles, desktops, consoles, AR and VR devices and even the web! Better yet, you get to use C# and .NET to script your games! This session is our opportunity to show what’s new for Unity developers with Visual Studio, C#, and .NET. 854 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6083 Jb Evain When bad things happen to good apps: Azure App Service Support Center ]]> https://s.ch9.ms/Events/Build/2017/T6082 https://s.ch9.ms/Events/Build/2017/T6082 This is a sequel to the Build 2015 session “When Bad Things Happen to Good Apps.&quot; Every app will sometimes fail. When your app has performance or availability issues, you need to become aware of the issue and then resolve it quickly. Even though Azure App Service is &quot;platform as a service&quot; and we want a layer of abstraction, at no point are things HIDDEN from us. If you want to see the hardware, you can. If you want to see the process tree, you can. Join us as we dive deep into Azure App Service Support Center, an evolution of tooling and diagnostics into self-serve troubleshooting exercise. The team also displays the available tools, best practices, and guidance for troubleshooting Azure websites, highlighting examples from real customers and incidents. 1260 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6082 Apurva Joshi What’s Nu in NuGet? ]]> https://s.ch9.ms/Events/Build/2017/T6081 https://s.ch9.ms/Events/Build/2017/T6081 Come learn what's &quot;Nu&quot; with NuGet and Visual Studio 2017. With PackageReference, and pack and restore as MSBuild targets. 1411 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6081 Anand Gaurav WCF microservices in containers ]]> https://s.ch9.ms/Events/Build/2017/T6080 https://s.ch9.ms/Events/Build/2017/T6080 Windows Communication Foundation (WCF) services are easily deployed to Windows VMs, but they’re even easier to use in Windows containers. In this session, we look at how to lift and shift your existing service architecture with WCF in containers and then we see how easy it is to deploy them for use on Azure. 1271 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6080 Jeff Fritz containers wcf Visual Studio Mobile Center and Visual Studio Team Services: Better together for your Mobile DevOps ]]> https://s.ch9.ms/Events/Build/2017/T6079 https://s.ch9.ms/Events/Build/2017/T6079 If you are a mobile developer Visual Studio Team Services, you are in for a treat! Learn how to use Visual Studio Team Services and Visual Studio Mobile Center to iterate fast on your mobile apps, learn from your users and keep them happy. If your app's source code is already in VSTS, or if you are already using VSTS for continuous integration, you can take advantage of Mobile Center to make your Mobile DevOps flow easier then ever. 1208 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6079 Simina Pasat Visual Studio Code: The most useful (and underused) tips and tricks ]]> https://s.ch9.ms/Events/Build/2017/T6078 https://s.ch9.ms/Events/Build/2017/T6078 Want to wow all your friends? In this talk we show you the most useful, and often underused, tips and tricks in Visual Studio Code. Learn to be an elite power user, including learning keybindings, using font ligatures, and becoming a zen mode master. Come learn in a few short minutes how to shave hours off your day-to-day coding tasks. #HappyCoding 1194 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6078 Wade Anderson Using Visual Studio for Machine Learning ]]> https://s.ch9.ms/Events/Build/2017/T6077 https://s.ch9.ms/Events/Build/2017/T6077 Whether it is building a model for online product recommendation, or developing a project using Microsoft SQL Server 2016 with R, where you need to develop both the models, and the stored procedure, Visual Studio enables both developers and data scientists to work together to build your next generation intelligent apps and services. All the tooling you need to analyze, build models, and create smart apps, including: Python Tools for Visual Studio and R Tools for Visual Studio. Join us in this this session, as we show you how Visual Studio can be used to do data science, and help you create the next intelligent application! 1257 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6077 Joanna Podgoetsky, Julie Koesmarno visual+studio machine+learning Linux C++ development with Visual Studio 2017 ]]> https://s.ch9.ms/Events/Build/2017/T6075 https://s.ch9.ms/Events/Build/2017/T6075 Learn about the new Linux development with C&#43;&#43; workload in Visual Studio 2017. This talk shows what you can do from the basic hello world, calling a Linux C&#43;&#43; service from ASP.NET Core and building a cross platform OpenGL desktop application targeting Windows and Linux. All using Visual Studio 2017 and the Windows Subsystem for Linux in Windows 10. 1142 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6075 Marc Goodner Distill information into conversational, easy to navigate answers with Microsoft Cognitive Services QnA Maker ]]> https://s.ch9.ms/Events/Build/2017/T6074 https://s.ch9.ms/Events/Build/2017/T6074 Microsoft Cognitive Services QnA Maker is an easy-to-use API that trains AI to respond to users’ questions in a more natural, conversational way. QnA Maker is a question and answer service with a graphical user interface—meaning you don’t need to be a developer to train, manage, and use it for a wide range of solutions. 933 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6074 Prashant Choudhari bots artificial+intelligence cognitive+services Contextual decisions for you ]]> https://s.ch9.ms/Events/Build/2017/T6073 https://s.ch9.ms/Events/Build/2017/T6073 Do you want to recommend a news story? Have your interface optimize for its user? Maybe you just wish that when you used machine learning it actually worked in deployment? In all of these cases, you want to make decisions amongst a set of actions based on a context to optimize an outcome. Doing this consistently and effectively requires a system that combines exploration and learning together to adaptively discover performant policies. We have created that system and deployed it several ways with great results. That system can now be used by you, most easily for simple content personalization, but more generally in any system where you have many repeated events where context matters in making a decision and the quality of that decision can be evaluated. 1399 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6073 John Langford artificial+intelligence cognitive+services machine+learning Support for ASP.NET Core: What is an LTS? ]]> https://s.ch9.ms/Events/Build/2017/T6072 https://s.ch9.ms/Events/Build/2017/T6072 .NET Core is new and open source, but it can be confusing how one gets support? We explain the Current branch vs. the LTS (Long Term Support) branch. What version of .NET Core will set you up for success? How do you balance stable enterprise software and daily builds of Open Source? 798 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6072 Maria Naggaga Nakanwagi .net open+source asp.net Supercharge your JavaScript debugging workflow with Visual Studio Code ]]> https://s.ch9.ms/Events/Build/2017/T6071 https://s.ch9.ms/Events/Build/2017/T6071 This session shows how to supercharge your JavaScript debugging workflow when working with React, AngularJS, and Node in Visual Studio Code. We talk about debugging principles, workflows, and how to be more productive by staying inside your editor. 1215 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6071 Kenneth Auchenberg visual+studio node.js react+native How to do predictive modeling using R and SQL Server Machine Learning Services ]]> https://s.ch9.ms/Events/Build/2017/T6070 https://s.ch9.ms/Events/Build/2017/T6070 Learn how to use R scripts from T-SQL to perform training and scoring and leverage parallelism and streaming capabilities to get better performance. 1323 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6070 Umachandar Jayachandran, Nellie Gustafsson machine+learning sql+server r Simplified app development with plug-ins for Xamarin and Windows ]]> https://s.ch9.ms/Events/Build/2017/T6069 https://s.ch9.ms/Events/Build/2017/T6069 Plug-ins for Xamarin are libraries that expose a single set of APIs for accessing common mobile device functionality across iOS, Android, and Windows. This increases the amount of code developers can share across mobile platforms, making mobile app development easier and faster. Come see how plug-ins for Xamarin abstract several APIs across iOS, Android, and Windows platforms including camera, geo-location, settings, permissions, connectivity, file system, notifications, and a lot more. 1211 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6069 James Montemagno Securely sign-in your customers with Azure Active Directory B2C ]]> https://s.ch9.ms/Events/Build/2017/T6068 https://s.ch9.ms/Events/Build/2017/T6068 Getting your customers to seamlessly sign-up or sign-in to an application is paramount to its success. Achieving this at scale while following constantly evolving security practices is hard. Fortunately, developers can leverage Azure AD B2C. Come and learn about this enterprise-grade consumer identity and access management service and how it allows you to easily secure your consumer-facing web and mobile applications. No matter where your users live, reach them with customizable user experiences that allow your users to sign-up/sign-in with social accounts such as Facebook or Google) or new accounts in the application. With Azure AD B2C you can take care of the identity functions for your app in minutes. With an ever-growing list of supported identity providers, Azure AD B2C helps you to reach your customers regardless of their provider of choice. 1116 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6068 Gerardo Saca Built-in machine learning in Microsoft SQL Server 2017 with Python ]]> https://s.ch9.ms/Events/Build/2017/T6067 https://s.ch9.ms/Events/Build/2017/T6067 Machine learning services in SQL Server 2017 provides Python support for in-database machine learning, now. In this session we show the basics of how to run Python code in SQL Server. We then discuss how any app that can talk to SQL Server can get intelligence from machine learning models running in SQL Server. We showcase an app that uses a Python-based deep learning model built and deployed in SQL Server. The model leverages an open source deep learning framework running with SQL Server and utilizes GPU for boosting model training performance. 1249 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6067 Sumit Kumar machine+learning sql+server python Building Cross platform applications with React Native ]]> https://s.ch9.ms/Events/Build/2017/T6065-R2 https://s.ch9.ms/Events/Build/2017/T6065-R2 ReactJS and React Native are two very popular frameworks to build websites and Mobile applications. In this talk, speakers from Microsoft and Facebook look at React and GraphQL as first principles of developer abstraction and how they are used to build some of the most popular large scale apps like Instagram, Facebook Ads Manager and the Facebook app. We look at the underlying frameworks like React/React Native, Relay and Litho. We also explore the various tools that Microsoft offers in this space, including debugging React Native apps with VSCode. We look at the end to end workflow - from a single commit on github triggering continuous builds and tests, to the final, signed app distributed to testers, clients or end users. From monitoring services like JavaScript enabled crashes to understanding user behavior with analytics, we look at ways to get better mobile apps to your users. 1492 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6065-R2 Adam Wolff, Parasuraman Narasimhan visual+studio+code react+native Building cross platform applications with React Native ]]> https://s.ch9.ms/Events/Build/2017/T6065-R1 https://s.ch9.ms/Events/Build/2017/T6065-R1 ReactJS and React Native are two very popular frameworks to build websites and mobile applications. In this talk, speakers from Microsoft and Facebook look at React and GraphQL as first principles of developer abstraction and how they are used to build some of the most popular large scale apps like Instagram, Facebook Ads Manager and the Facebook app. We look at the underlying frameworks like React/React Native, Relay and Litho. We also explore the various tools that Microsoft offers in this space, including debugging React Native apps with VSCode. We look at the end to end workflow - from a single commit on github triggering continuous builds and tests, to the final, signed app distributed to testers, clients or end users. From monitoring services like JavaScript enabled crashes to understanding user behavior with analytics, we look at ways to get better mobile apps to your users. 2074 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6065-R1 Adam Wolff, Parasuraman Narasimhan Why you should use F# ]]> https://s.ch9.ms/Events/Build/2017/T6064 https://s.ch9.ms/Events/Build/2017/T6064 Get a view into why F# is important for .NET moving forward and learn about the vastly improved tools in Visual Studio 2017. 1192 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6064 Mads Torgersen, Phillip Carter What's New in Office UI Fabric ]]> https://s.ch9.ms/Events/Build/2017/T6063 https://s.ch9.ms/Events/Build/2017/T6063 Office UI Fabric has come a long way in the last year, and we have plans to do even more. Come learn how you can start harnessing the power of Fabric in your projects today. 1011 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6063 Micah Godbolt office office+365 DocuSign and Microsoft Office.js APIs integration ]]> https://s.ch9.ms/Events/Build/2017/T6061 https://s.ch9.ms/Events/Build/2017/T6061 See how DocuSign used the new Microsoft Office.js APIs in their integrations and how it gets tied to completing a DocuSign transaction. 845 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6061 Kiah Jones office office+365 Integration with Microsoft Office 365 Data Loss Prevention with Remedy by BMC ]]> https://s.ch9.ms/Events/Build/2017/T6060 https://s.ch9.ms/Events/Build/2017/T6060 Go &quot;behind the code&quot; with Office platform partner BMC on how they've built ew integration with Microsoft Office 365 Data Loss Prevention (DLP) solution enables Security and Compliance Administrators to manage data policy breaches as a Remedy ticket. 823 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6060 Darius Wallace, Jeff Desroches, Rick Nelson office office+365 Adobe Creative Cloud and Adobe Document Cloud in Microsoft Teams ]]> https://s.ch9.ms/Events/Build/2017/T6059 https://s.ch9.ms/Events/Build/2017/T6059 Join speakers from Adobe as they delve into how seamlessly and quickly they integrated Adobe Creative Cloud and Adobe Document Cloud with Microsoft Teams. A live demo using tab and input extensions that enables teams to access, share and collaborate on assets from Adobe Creative Cloud, send and track Adobe Sign agreements using bot and tab, and get notified within the channel when there are any updates. Speakers dive into development details that includes how they leveraged Microsoft Teams extensibility framework, Adobe Creative Cloud API and Adobe Document Cloud API to build this integration. 982 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6059 Ashwani Chandil, Rajeev Sharma, Ram Prasad office office+365 Never break the build with live unit testing Unit tests make your continuous integration and deployment system dependable by ensuring all tests pass before deployment. With Visual Studio Live Unit Testing, learn how to keep your code working before you commit a byte of code to source control. In this session, learn how to configure and start using Live Unit Testing effectively

]]>
https://s.ch9.ms/Events/Build/2017/T6055 https://s.ch9.ms/Events/Build/2017/T6055 Unit tests make your continuous integration and deployment system dependable by ensuring all tests pass before deployment. With Visual Studio Live Unit Testing, learn how to keep your code working before you commit a byte of code to source control. In this session, learn how to configure and start using Live Unit Testing effectively 1138 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6055 manish jayaswal
NodeSource N|Solid runtime on Microsoft Azure ]]> https://s.ch9.ms/Events/Build/2017/T6053-R2 https://s.ch9.ms/Events/Build/2017/T6053-R2 NodeSource N|Solid is a fully compatible Node.js runtime that has been enhanced to address the needs of the enterprise. It is created and maintained by NodeSource, the Node.js company. In partnership with Microsoft, NodeSource brought the power of N|Solid to the Azure Marketplace. N|Solid is also available to scale Node.js using Kubernetes in Azure Container Service. In this session, NodeSource talks about their journey and how Azure provides a great end-to-end cloud hosting solution for Node.js development. 1035 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6053-R2 Dan Shaw, Joe Doyle node.js azure+container+service azure+marketplace authentication NodeSource N|Solid runtime on Microsoft Azure ]]> https://s.ch9.ms/Events/Build/2017/T6053-R1 https://s.ch9.ms/Events/Build/2017/T6053-R1 NodeSource N|Solid is a fully compatible Node.js runtime that has been enhanced to address the needs of the enterprise. It is created and maintained by NodeSource, the Node.js company. In partnership with Microsoft, NodeSource brought the power of N|Solid to the Azure Marketplace. N|Solid is also available to scale Node.js using Kubernetes in Azure Container Service. In this session, NodeSource talks about their journey and how Azure provides a great end-to-end cloud hosting solution for Node.js development. 1069 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6053-R1 Dan Shaw, Joe Doyle azure node.js azure+container+service azure+marketplace Virtual and mixed reality apps with C# ]]> https://s.ch9.ms/Events/Build/2017/T6052 https://s.ch9.ms/Events/Build/2017/T6052 Are you interested in developing holographic and mobile apps that include interactive 3D elements? UrhoSharp is a code-first, cross-platform 3D and 2D game framework that's easy to integrate into your C# and F# apps. Come learn how to add UrhoSharp to your app, work with its scene graph and component model, and develop real-world interactions using Microsoft HoloLens. 1183 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6052 Mikayla Hutchinson hololens Microservice architecture with ASP.NET Core ]]> https://s.ch9.ms/Events/Build/2017/T6051 https://s.ch9.ms/Events/Build/2017/T6051 Microservices are a hot topic and in this session, get an overview of microservices and how ASP.NET Core helps solve those challenges. 1676 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6051 Glenn Condron, Cesar De Ia Torre Llorente From Zero to Hero: Building an Office add-in in one day ]]> https://s.ch9.ms/Events/Build/2017/T6050 https://s.ch9.ms/Events/Build/2017/T6050 A step-by-step breakdown of how I built a completely functional Office add-in, with no previous experience. Find out how to build an add-in that allows PowerPoint users to import content from your app or site. And I'll also share the No. 1 time-saving tip I learned while developing the Pixton add-in. 821 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6050 Mike Ammerlaan, Clive Goodinson office office+365 Make better product and feature decisions with Application Insights  ]]> https://s.ch9.ms/Events/Build/2017/T6049 https://s.ch9.ms/Events/Build/2017/T6049 Development teams are always looking for the next improvements to make to their products: creating, updating, and removing features. Ideally these decisions would be data-driven, but often products don’t send usage telemetry data. Even for products with usage data, making sound product and feature decisions often involves writing lots of repetitive, manual queries. New features in Application Insights dramatically simplify this process with tools for exploring user interactions and engagement and creating funnels to understand conversion rates. With these product usage analytics capabilities, you can get a more complete picture of your app, from the server to the browser to the user, empowering your team to build better products. 988 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6049 David Stephens, Bo-ying Fu Machine learning based diagnostics and analytics with Application Insights  ]]> https://s.ch9.ms/Events/Build/2017/T6048 https://s.ch9.ms/Events/Build/2017/T6048 Multi-tiered applications are complex to manage due to the inherent dependencies across different layers. In addition, any unexpected change in the behavior of a component can affect others. Developers may not always know the right questions to ask in such situations or may not anticipate the impact to the overall application. Application Insights can provide you ‘automatic’ insights, by employing statistical and machine learning algorithms to analyze and correlate thousands of time-series data points to perform anomaly detection and cause and effect analysis, helping you diagnose potential problems quickly and easily. 1188 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6048 Harel Broitman, Yossi Attas Leveraging Cortana user knowledge to personalize your Cortana skill ]]> https://s.ch9.ms/Events/Build/2017/T6046 https://s.ch9.ms/Events/Build/2017/T6046 As a personal assistant, Cortana learns about each user and develops a deep understanding of their preferences, habits, and context. This session shows you step-by-step how to use the Cortana Skills Kit to leverage Cortana user knowledge to create highly personalized skills that drive deep user engagement. 968 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6046 Adi Miller, Haim Somech artificial+intelligence cortanta+skills cortana Supercharge your business with the power of AI ]]> https://s.ch9.ms/Events/Build/2017/T6045 https://s.ch9.ms/Events/Build/2017/T6045 Our industry is on the cusp of a new frontier that pairs the power of natural human language with advanced machine intelligence. At Microsoft, we want to democratize AI. This means making it readily available to everyone. This session walks through common but widespread business experiences that can immediately be enhanced with AI. You will walk away appreciating how you can use AI immediately to supercharge your business, enterprise apps, and experiences. 989 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6045 Mujtaba Khambatti artificial+intelligence cognitive+services machine+learning Building Smart Contracts with Azure blockchain middleware ]]> https://s.ch9.ms/Events/Build/2017/T6044 https://s.ch9.ms/Events/Build/2017/T6044 Cryptlets introduce a development environment for building next generation blockchain applications targeting enterprise blockchain environments. The Cryptlet Fabric provides an abstraction layer on top of the most popular blockchains like Ethereum, Quorum, Chain, and Corda along with a secure multiparty execution environment for building distributed trust applications with familiar platforms like .NET and Java. This session provides an overview of the platform, development stack, and use cases. 1294 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6044 Marley Gray Intelligent databases in action ]]> https://s.ch9.ms/Events/Build/2017/T6043 https://s.ch9.ms/Events/Build/2017/T6043 In this session, see demos of our intelligent PaaS database capabilities, including: intelligent performance - recommendations and tuning; insight at scale; security intelligence - security recommendations and threat detection; learning based query processing with Adaptive QP; and graph data processing with SQL Graph. 1504 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6043 Lindsey Allen azure+sql+database intelligence Integrating applications with Microsoft Intune ]]> https://s.ch9.ms/Events/Build/2017/T6041 https://s.ch9.ms/Events/Build/2017/T6041 Learn about how your solutions can integrate with, automate, and get native mobile application management support with Microsoft Intune. If you’re an ISV wanting to build integrated solutions for Intune, learn how to take advantage of newly-released Intune APIs. For mobile application developers, understand how to leverage the Intune MAM SDK to build device applications for the Intune application ecosystem. We demonstrate many techniques throughout the session, and set you up to develop amazing integrated solutions for Microsoft’s fastest growing business – Enterprise Mobility &amp; Security! 1205 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6041 Dave Randall, Peter Richards, Roxana Drake Image processing at scale using U-SQL in Azure Data Lake ]]> https://s.ch9.ms/Events/Build/2017/T6040 https://s.ch9.ms/Events/Build/2017/T6040 Making use of cognitive capabilities such as Image OCR or Sentiment Analysis of text is straightforward with small datasets of a few terabytes. But, at the scale of hundreds of terabytes or even a petabyte, you need a different approach to that can massively scale out *AND* be simple to build. Azure Data Lake offers a straightforward way of programming using .NET code against these massive Petabyte-scale datasets without the need to become a deep expert in distributed computing, big data technologies, or machine learning. 1342 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6040 Saveen Reddy intelligence data data+lake New Virtual Health Templates extend Skype for Business as platform for developers ]]> https://s.ch9.ms/Events/Build/2017/T6039 https://s.ch9.ms/Events/Build/2017/T6039 Skype for Business includes powerful support for audio/video conversations and meetings. Find out how we built a complete &quot;Virtual Consult&quot; facility for doctors, and how you can weave the power of audio/video conversations into your own apps. 1044 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6039 David Newman, Daniel Canning office office+365 Chat bots on Bing.com ]]> https://s.ch9.ms/Events/Build/2017/T6038 https://s.ch9.ms/Events/Build/2017/T6038 Learn how chat bots enhance the Bing experience and how you can add your custom bots to Bing. 940 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6038 Marcelo De Barros bots artificial+intelligence bing Writing an awesome Mobile Outlook add-in ]]> https://s.ch9.ms/Events/Build/2017/T6037 https://s.ch9.ms/Events/Build/2017/T6037 Nimble provides a CRM system designed around social sales and marketing. Come find out how they integrated and built with Office 365 to grow an engaged user base. 1417 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6037 Dwight Foster, Sergey Shvets office office+365 How do I secure my IoT solution?  ]]> https://s.ch9.ms/Events/Build/2017/T6036 https://s.ch9.ms/Events/Build/2017/T6036 Mirai, a recent IoT hack, was able to take down many well-known Internet sites such as GitHub, Twitter, Reddit, Netflix, and Airbnb, highlighting not only the vulnerabilities of IoT infrastructure today, but also that IoT infrastructure can be used to launch attacks at a scale not possible previously. In this session we present some of the key IoT vulnerabilities exploited today, and how to design, develop, deploy, and operate an IoT infrastructure you can trust using Azure IoT. 1215 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6036 Arjmand Samuel application+insights Hidden gems in Microsoft Azure Portal  ]]> https://s.ch9.ms/Events/Build/2017/T6035 https://s.ch9.ms/Events/Build/2017/T6035 Deep dive into Azure Portal. Come and experience all the tools and hidden gems that are available to you to easily manage your Azure resources. 1464 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6035 Leon Welicki, Rajmohan Rajagopalan Use the power of Video AI in your apps with Video Indexer ]]> https://s.ch9.ms/Events/Build/2017/T6034 https://s.ch9.ms/Events/Build/2017/T6034 Got video? We can help you turn your video into insights and transform your business. Join us as we show you are latest video intelligence capabilities. 1051 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6034 Nagu Rangan artificial+intelligence cognitive+services bing Keeping “wolves” out of your platform ]]> https://s.ch9.ms/Events/Build/2017/T6033 https://s.ch9.ms/Events/Build/2017/T6033 Learn how Microsoft’s Content Moderator machine-assisted moderation of text and images, augmented with human review tools can help you discover inappropriate content. 972 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6033 Greg Clark artificial+intelligence cognitive+services machine+learning Getting started with Aurelia and ASP.NET Core Interested in building a modern JavaScript SPA or progressive web app? Is Microsoft ASP.NET your primary web development platform? You’ll want to be here. In this talk, get a crash course on using Microsoft tools to build a new Aurelia ASP.NET Core app. We start by creating the project from scratch, learn how to use Aurelia core concepts and then run our new app in all its glory.

]]>
https://s.ch9.ms/Events/Build/2017/T6032 https://s.ch9.ms/Events/Build/2017/T6032 Interested in building a modern JavaScript SPA or progressive web app? Is Microsoft ASP.NET your primary web development platform? You’ll want to be here. In this talk, get a crash course on using Microsoft tools to build a new Aurelia ASP.NET Core app. We start by creating the project from scratch, learn how to use Aurelia core concepts and then run our new app in all its glory. 1136 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6032 Rob Eisenberg
Better, faster, automated! Windows app deployment in Visual Studio Mobile Center ]]> https://s.ch9.ms/Events/Build/2017/T6031 https://s.ch9.ms/Events/Build/2017/T6031 Windows developers! Come meet Microsoft’s first-of-its-kind lifecycle solution–now supporting UWP! Learn how Visual Studio Mobile Center streamlines mobile development by bringing together build, testing, distribution, app analytics, and crash notifications in one simple, automated solution. Visual Studio Mobile Center will make developing on the Windows platform easier and faster. 1090 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6031 Ela Malani Geospatial services and solutions for the logistics sector ]]> https://s.ch9.ms/Events/Build/2017/T6030 https://s.ch9.ms/Events/Build/2017/T6030 Bing Maps powers a broad set of solutions across all industries. With a focus on the logistics sector we explore some of the new services and quick start solution launched this week. 1307 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6030 Johannes Kebeck artificial+intelligence bing maps Script Lab, a Microsoft Garage project ]]> https://s.ch9.ms/Events/Build/2017/T6029 https://s.ch9.ms/Events/Build/2017/T6029 Create, run, and share your Office Add-in snippets instantly inside Microsoft Word, Excel, and PowerPoint. 1219 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6029 Michael Saunders office office+365 office+add-ins Azure Event Hubs: From agile startups to Fortune 500 ]]> https://s.ch9.ms/Events/Build/2017/T6028 https://s.ch9.ms/Events/Build/2017/T6028 Event Hubs handles close to a trillion events a day encompassing a wide variety of verticals. Find out how Event Hubs handles telemetry data from games, cars, planes, raceways, thermostats, mobile apps, trading platforms, and processes it for insights into the business and customer behaviors. 1038 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6028 Justin Conway, Shubha Vijayasarathy Embedded analytics with Microsoft Power BI ]]> https://s.ch9.ms/Events/Build/2017/T6027 https://s.ch9.ms/Events/Build/2017/T6027 Business users need data in their applications. Learn how Power BI makes it easy to integrate world-class analytics into your packaged applications, line-of-business applications, and internal or external portals. See how quickly and deeply you can integrate Power BI into your application workflows to unlock the power of the data within your applications. 1178 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6027 Lukasz Pawlowski, Eyal Carmel data power+bi data-driven+apps Time Series insights on your Internet of Things ]]> https://s.ch9.ms/Events/Build/2017/T6026 https://s.ch9.ms/Events/Build/2017/T6026 Transform your business using Time Series insights by quickly exploring and analyzing your connected devices. Learn how Azure Time Series insights enables you to store and analyze hundreds of millions of your sensor data near real time with an intuitive user experience that gets you started in minutes. This provides you a real business advantage in reducing the time to investigate and mitigate issues, validate, and optimize your sensors, and improve operational efficiencies. 1255 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6026 OP Ravi internet+of+things Design Patterns for SaaS applications on Azure SQL Database ]]> https://s.ch9.ms/Events/Build/2017/T6025 https://s.ch9.ms/Events/Build/2017/T6025 Experience the power of building multi-tenant SaaS applications on Azure SQL Database, Microsoft’s fully managed database as a service platform: Using a sample SaaS application, we walk through a series of SaaS-focused design and management patterns that have been distilled from work with a multitude of customers. Patterns spans from multi-tenant provisioning, schema management, performance monitoring and management to operational analytics. The code for the sample application, plus management scripts, ARM templates and tutorials, will be available for download in an easy-to-explore “SaaS-in-a-Box” package, enabling you to jump-start your own SaaS application. 1404 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6025 Julie Strauss, Bill Gibson azure+sql+database data Deploy, manage, and customize with SharePoint Patterns and Practices tools and guidance ]]> https://s.ch9.ms/Events/Build/2017/T6024 https://s.ch9.ms/Events/Build/2017/T6024 The SharePoint Patterns and Practices team has built a suite of open-source tools used by hundreds of companies. Come find out how to super-charge your SharePoint development with tools, frameworks, and more. 1370 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6024 Vesa Juvonen Don’t let data slow down your application: Learn about Azure Analysis Services ]]> https://s.ch9.ms/Events/Build/2017/T6023 https://s.ch9.ms/Events/Build/2017/T6023 Is your application running slow because the data queries take a long time to return the data? Make your application come back to life by showcasing your data in a powerful way with the help of Azure Analysis Services. Provide your customers with quick access to their data and blazing fast query speeds. This new service enables creation of large in-memory data models enabling your application's users fast interactive querying over easy to understand data. Join us for this tech talk to see how simple it is to use Azure Analysis Services with your own application! 1263 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6023 Josh Caplan Custom Vision from Cognitive Services: easily build a custom image classifier ]]> https://s.ch9.ms/Events/Build/2017/T6022 https://s.ch9.ms/Events/Build/2017/T6022 Custom Vision is a tool for easily building an image classifier to recognize content you care about. In a few minutes, you can train a classifier and deploy it to an API endpoint. Using suggestions from the software, it is easy to improve the quality of your classifier. 924 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6022 Anna Roth, Chris Sienkiewicz artificial+intelligence cognitive+services machine+learning Use Bing and Microsoft Cognitive Services to create unique domain and site search ]]> https://s.ch9.ms/Events/Build/2017/T6021 https://s.ch9.ms/Events/Build/2017/T6021 In this session we discuss how you can use Bing and Cognitive Services to enhance your domain and site-specific solutions to best benefit your enterprise. 932 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6021 David Simpson (POWERSET) artificial+intelligence cognitive+services bing Microsoft Teams Developer Tool Integrations ]]> https://s.ch9.ms/Events/Build/2017/T6020 https://s.ch9.ms/Events/Build/2017/T6020 Learn how the development tools you use every day can be integrated with Microsoft Teams to make it easier to collaborate with your co-workers. 730 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6020 Bill Bliss, Mansoor Malik office office+365 Building and distributing solutions built on Microsoft PowerApps, Flow, and CDS ]]> https://s.ch9.ms/Events/Build/2017/T6018 https://s.ch9.ms/Events/Build/2017/T6018 Join this session to learn how easy it is to build rich applications with PowerApps without writing code, quickly automate workflows with Microsoft Flow, and learn how to leverage the Common Data Service to unite your organization’s information from across Microsoft Dynamics, Office, and beyond in a common model and easy extensibility point. No slides for this session, instead we’ll walk through building an end-to-end solution with PowerApps, Microsoft Flow, and the Common Data Service. 1300 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6018 James Oleinik application+lifecycle+management Tap into the YARN ecosystem using Azure HDInsight ]]> https://s.ch9.ms/Events/Build/2017/T6017 https://s.ch9.ms/Events/Build/2017/T6017 The ecosystem of YARN applications has exploded with a diverse range of distributed big data tools and engines. The strength of this ecosystem is one of the primary drivers behind the health of Hadoop/YARN. HDInsight is a fully managed distribution of Apache Hadoop that features a number of YARN applications as first class workloads (Hive, HBase, Spark, Storm, Kafka and Interactive Hive), but many of the popular YARN applications are either difficult or impossible to install. Additionally, once an application is installed, system administrators expect it to be managed and monitored through a common interface rather than a special case. In this session, the Apache Ambari HDInsight framework will be presented with real-world examples of YARN applications that may be deployed directly onto the cluster and managed through the shared Ambari web interface. We’ll show how these applications can be configured, monitored and managed to be resilient to node failures and become truly elastic as the cluster is scaled. 1434 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6017 James Baker (DPE) hdinsight Building a mobile development pipeline ]]> https://s.ch9.ms/Events/Build/2017/T6016 https://s.ch9.ms/Events/Build/2017/T6016 Create a fully-tested, installable app package automatically with every commit or push. With no manual configuration on your part and without having to provision any agents (even for iOS apps), Visual Studio Mobile Center will compile mobile apps right from the source code and automatically run UI tests so you can have complete confidence in your app and get back to coding. 1151 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6016 Piyush Joshi Building a Better Bot: How Pullstring built the Doctor Who Bot ]]> https://s.ch9.ms/Events/Build/2017/T6015 https://s.ch9.ms/Events/Build/2017/T6015 Pullstring offers a deep conversational understanding platform that can be used to build Bots. Come find how Pullstring built bots that integrate with Skype and beyond. 866 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6015 Scott Ganz office office+365 Dun & Bradstreet powers data driven insight in Microsoft Teams and Excel ]]> https://s.ch9.ms/Events/Build/2017/T6014 https://s.ch9.ms/Events/Build/2017/T6014 Learn how D&amp;B is empowering business-critical decisions by making information on more than 270M businesses available in Microsoft Teams, and through the D&amp;B Business Solutions app in Excel. 780 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6014 Chris Pardo office office+365 Deep Dive: Office Add-in Single Sign On ]]> https://s.ch9.ms/Events/Build/2017/T6013 https://s.ch9.ms/Events/Build/2017/T6013 Ask Office anything about the new single-sign on flow for Add-ins. 1363 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6013 Tim McConnell office office+365 Azure Commandline Interface: Power of automation scripts in a truly cross-platform way ]]> https://s.ch9.ms/Events/Build/2017/T6011 https://s.ch9.ms/Events/Build/2017/T6011 Azure CLI 2.0 is Azure’s new idiomatic command line interface for managing Azure resources that integrates natively with Bash and POSIX tools. It is easy to install, use and learn. It can be used on macOS, Linux, and Windows. Come and learn how to use Azure CLI 2.0 in automation and interactive modes and discover the power of simple but powerful commands with smart defaults for most common operations. You will also learn useful productivity features like pipe-able outputs, use of JMESpath queries and options for multiple output formats etc. 1543 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6011 Kamaljit Bath azure Building scalable IoT solutions on Microsoft Azure ]]> https://s.ch9.ms/Events/Build/2017/T6010 https://s.ch9.ms/Events/Build/2017/T6010 In this session, learn how to sort through the variables and decisions involved with designing a scalable IoT solution. Learn the tips and tricks to keep in mind as you scale the system across more devices, more countries, and more business scenarios. 1235 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6010 Nicole Berdy internet+of+things ASP.NET Web Forms updates ]]> https://s.ch9.ms/Events/Build/2017/T6009 https://s.ch9.ms/Events/Build/2017/T6009 Web Forms is still being worked on with new features being added. Learn about the new JavaScript features, Dependency Injection capabilities, and new cache providers that you can use with your application. 1128 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6009 Jeff Fritz Application Insights for developers: Integrating with your DevOps workflows  ]]> https://s.ch9.ms/Events/Build/2017/T6008 https://s.ch9.ms/Events/Build/2017/T6008 See the latest innovations in the developer experience for Application Insights. These integrations range from great new capabilities in Visual Studio and Visual Studio Code, to integrations with Visual Studio Team Services, and GitHub to improve a complete application lifecycle management story; to a data access REST API which enables you to build your own solutions on top of your Application Insights data. 824 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6008 David Stephens, Bo-ying Fu devops application+insights Angular and TypeScript ]]> https://s.ch9.ms/Events/Build/2017/T6006-R2 https://s.ch9.ms/Events/Build/2017/T6006-R2 In this session, learn why the Angular team uses Typescript to develop at scale inside Google, and how Typescript and Angular work together to provide a powerful platform for developers and great experiences for their users. 1280 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6006-R2 Rob Wormald Angular and TypeScript ]]> https://s.ch9.ms/Events/Build/2017/T6006-R1 https://s.ch9.ms/Events/Build/2017/T6006-R1 In this session, learn why the Angular team uses Typescript to develop at scale inside Google, and how Typescript and Angular work together to provide a powerful platform for your developers and great experiences for your users. 1243 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6006-R1 Rob Wormald typescript Agile planning with Visual Studio Team Services (VSTS) ]]> https://s.ch9.ms/Events/Build/2017/T6005 https://s.ch9.ms/Events/Build/2017/T6005 Coming Soon. 1165 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6005 Jose Rady Allende Accelerate setting up your DevOps environment using Azure Marketplace  ]]> https://s.ch9.ms/Events/Build/2017/T6004 https://s.ch9.ms/Events/Build/2017/T6004 Lean how you can set up Chef, Jenkins, and other popular dev tools on Microsoft Azure using the Azure Marketplace. We also walk you through exciting new features such as Test Drive, an easy way to try out Marketplace products and introduce Quick Start templates as a way to stand up full dev stacks. 1181 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6004 Vybava Ramadoss devops azure+marketplace A day in the life of an Azure serverless developer Serverless is a great computing abstraction. When combined with great tools, developers can be more productive than ever. In this session, see the end-to-end experience of a developer a building serverless application on Microsoft Azure. Through the demos, learn how to build, deploy, manage, and monitor your applications. We focus on Azure Functions and Azure Logic Apps and show tools such as Application Insights, Visual Studio, Visual Studio Code, Visual Studio Team Services, and more. 

]]>
https://s.ch9.ms/Events/Build/2017/T6003 https://s.ch9.ms/Events/Build/2017/T6003 Serverless is a great computing abstraction. When combined with great tools, developers can be more productive than ever. In this session, see the end-to-end experience of a developer a building serverless application on Microsoft Azure. Through the demos, learn how to build, deploy, manage, and monitor your applications. We focus on Azure Functions and Azure Logic Apps and show tools such as Application Insights, Visual Studio, Visual Studio Code, Visual Studio Team Services, and more. 943 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6003 Donna Malayeri, Chris Anderson azure+functions logic+apps serverless
Containerizing your Microsoft ASP.NET 4.x apps ]]> https://s.ch9.ms/Events/Build/2017/T6001 https://s.ch9.ms/Events/Build/2017/T6001 What can Container do for me and my &quot;old&quot; ASP.NET application? How can that help me get on a path to modern DevOps, cloud, and easy maintenance? In this session we walk through containerizing a Microsoft ASP.NET Framework application and getting it deployed to Azure. 1403 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/T6001 Mikkel Mork Hegnhoj Open Q&A: Windows 10 - UWP, mixed reality, design, and Project Rome ]]> https://s.ch9.ms/Events/Build/2017/B8908 https://s.ch9.ms/Events/Build/2017/B8908 Join us for a panel discussion and open Q&amp;A session with Windows engineering and design leadership. The panel covers the Windows 10 Platform, ranging from new UWP capabilities to design considerations to mixed reality to the cross-device capabilities in Project Rome. Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8908 Albert Shum, Kevin Gallo, Andrew Clinick, Scott Evans Open Q&A: Mobile Development ]]> https://s.ch9.ms/Events/Build/2017/B8907 https://s.ch9.ms/Events/Build/2017/B8907 Any developer. Any app. Any platform. Come learn how we’re fulfilling that promise with tools and services for developers building apps for Windows, iOS, Android, and more. Join us for a live Q&amp;A with industry-leading engineers from Microsoft covering mobile development with Visual Studio 2017, Visual Studio for Mac, Visual Studio Mobile Center, and Xamarin. 3804 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8907 Miguel de Icaza, James Montemagno, Ryan Salva, Thomas Dohmke, Keith Ballinger Open Q&A: Moving 65,000 Microsofties to DevOps on the public cloud ]]> https://s.ch9.ms/Events/Build/2017/B8906 https://s.ch9.ms/Events/Build/2017/B8906 Join us for a panel discussion on the transformation of Microsoft to One Engineering System with a globally distributed 24x7x365 service on Microsoft Azure and Visual Studio Team Services. Come along to hear about the challenges faced and some of the lessons we learned that you can apply to your own teams and organizations. 3630 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8906 Sam Guckenheimer, Gabriel Aul, Jordan Edwards, Mike Kippen Open Q&A: Hear from experts from Office 365, SharePoint, Microsoft Teams, and Microsoft Graph ]]> https://s.ch9.ms/Events/Build/2017/B8905 https://s.ch9.ms/Events/Build/2017/B8905 In this session, we’ll discuss everything new and emerging across the Office 365 platform, including SharePoint, Microsoft Teams, Microsoft Graph, and beyond. We’ll discuss both the breadth of the Office 365 landscape and the depth of specific apps and APIs, and help you chart a path towards engaging more users by building successful Office integrations. Stop by to have your key product and technical questions answered by product leaders within Office 365. Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8905 Rob Howard, Pedro DeRose, Vesa Juvonen, Yina Arenas, Tristan Davis Open Q&A: Maximizing the value of your DATA and leveraging the power of AI to build Intelligent applications ]]> https://s.ch9.ms/Events/Build/2017/B8904 https://s.ch9.ms/Events/Build/2017/B8904 Do you have questions about using the different data services in Azure? Want to find out more about the technical roadmap of the different data services, or just want to understand how to make your apps &amp; bots more intelligent? Join this Q&amp;A session and get a chance to ask any question you'd like around Microsoft data products or services, from SQL Server to Azure Data Lake to Azure Search. Hear from the experienced panelists about the future of data technologies and learn about how we're interweaving data and AI to help you build Intelligent applications! Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8904 Pablo Castro, Rohan Kumar, Joseph Sirosh, Dharma Shukla intelligent+app artificial+intelligence data Open Q&A: Artificial intelligence tools for developers ]]> https://s.ch9.ms/Events/Build/2017/B8903 https://s.ch9.ms/Events/Build/2017/B8903 Join Microsoft Artificial Intelligence &#43; Research executives for an open Q&amp;A on our Microsoft AI tools for developers including Cognitive Services, Cognitive Toolkit, Bot Framework, Azure Bot Service, Cortana Skills and more. Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8903 Lili Cheng, Steven Guggenheimer, Eric Horvitz artificial+intelligence machine+learning intelligence Creating connected healthcare applications using Microsoft HealthVault Microsoft HealthVault is a platform that businesses and consumers can use to store personal health information – and then generate insights for it. This session provides an overview of how your apps and devices can work with the HealthVault Insights app to drive increased provider/patient engagement. We discuss the new open-source projects that we have launched, as well as how apps can leverage our cross-platform SDK to deliver HealthVault-enabled experiences on mobile and web platforms.

]]>
https://s.ch9.ms/Events/Build/2017/B8121 https://s.ch9.ms/Events/Build/2017/B8121 Microsoft HealthVault is a platform that businesses and consumers can use to store personal health information – and then generate insights for it. This session provides an overview of how your apps and devices can work with the HealthVault Insights app to drive increased provider/patient engagement. We discuss the new open-source projects that we have launched, as well as how apps can leverage our cross-platform SDK to deliver HealthVault-enabled experiences on mobile and web platforms. 3572 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8121 Justin Hutchings, Heather Cartwright artificial+intelligence cross-platform+development health
Innovate and get your apps in front of 100 Million business users with AppSource, PowerApps, Microsoft Flow, and the Common Data Service Learn how to build custom connectors and APIs that promote application extensibility and deeper data integration by leveraging PowerApps, Microsoft Flow, and the Common Data Service for a richer customer experience with your application. Walk away with the knowledge of how to package and list your app on AppSource, to expand your reach and help business users discover and try your app.

]]>
https://s.ch9.ms/Events/Build/2017/B8120 https://s.ch9.ms/Events/Build/2017/B8120 Learn how to build custom connectors and APIs that promote application extensibility and deeper data integration by leveraging PowerApps, Microsoft Flow, and the Common Data Service for a richer customer experience with your application. Walk away with the knowledge of how to package and list your app on AppSource, to expand your reach and help business users discover and try your app. 3876 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8120 Theresa Palmer-Boroski, Satish Thomas, Peter Villadsen office+365 power+apps flow power+bi app+source common+data+service
Past, present, and future of GPUs in Microsoft Azure ]]> https://s.ch9.ms/Events/Build/2017/B8119 https://s.ch9.ms/Events/Build/2017/B8119 Azure N-series VMs powered by NVIDIA GPUs enable a range of new accelerated scenarios. Learn how you can take advantage of GPUs using CUDA or OpenCL for scenarios like ray traced rendering, machine learning, and artificial intelligence. Stream or remotely access content and engineering designs, digital media or graphics rich applications utilizing DirectX or OpenGL along with workstation in the cloud capabilities. This session delves deep into the exciting current offerings, customers use cases and live examples, partner solutions, and offers a view of what’s to come in the future. 3850 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8119 Alex Sutton, Karan Batta How to run massively scaling mobile games on Microsoft Azure ]]> https://s.ch9.ms/Events/Build/2017/B8118 https://s.ch9.ms/Events/Build/2017/B8118 Come hear how Next Games, the disruptive mobile gaming company who owns exclusive license for games related to the hit TV series &quot;The Walking Dead,&quot; has built its infrastructure and a generative platform on Azure. You will learn how to run games (or any service) as a service, and hear about the experiences, mistakes and lessons learned along their journey. 3032 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8118 Kalle Hiitola, Remo Kallio azure documentdb Reimagine what is possible with your videos using state-of-the-art AI technologies ]]> https://s.ch9.ms/Events/Build/2017/B8117 https://s.ch9.ms/Events/Build/2017/B8117 Your media is a treasure trove of information. Learn how you can use AI technologies with your videos to improve consumer engagement and extract valuable business insights. Simple APIs streamlines extracting actionable information from videos and dramatically improves your productivity in building applications based on the insights. Explore, deconstruct, and understand the various elements of your video. Enable new forms of content discovery such as search that includes extracting spoken words, faces, characters, and emotions for richer and more relevant recommendations. We also show how you can take advantage of the power of the cloud and rapidly build workflows based on the information in your videos. 3836 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8117 Milan Gada, Ohad Jassin azure application+insights media Using the Windows Subsystem for Linux and the Windows Console for a next generation development experience ]]> https://s.ch9.ms/Events/Build/2017/B8113 https://s.ch9.ms/Events/Build/2017/B8113 Last year Microsoft released the Windows Subsystem for Linux (WSL) to allow developers to run a broad range of native Linux tools, utilities, and applications directly on Windows. Since then we have taken WSL to new heights, improving its compatibility with open source software and tightening its integration with Windows. Come learn about these improvements as well as our plan for the future of this incredible developer tool. 3331 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8113 Gilles Khouzam, Jack Hammons web+platform tools Modernize WinForms and WPF apps with maximum code reuse, cross-platform reach, and efficient DevOps ]]> https://s.ch9.ms/Events/Build/2017/B8110 https://s.ch9.ms/Events/Build/2017/B8110 Windows 10 provides developer features and services that can yield high-quality and engaging apps that delight users across platforms. At the same time, developers have existing investments in technology and skills that they shouldn't have to abandon in order to move forward. In this session, we explore these new features and capabilities from the perspective of WinForms and WPF .NET developers with an emphasis on being able to move forward incrementally from your existing investments as you see value. Discover the flexibility to enrich your existing apps with Windows 10 features, extend to new platforms with Xamarin, and modernize your DevOps software lifecycle with Mobile Center. 3472 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8110 Joshua Weber, Mike Battista universal+windows+platform+uwp .net devops Azure Service Fabric, microservices, containers, and the road ahead ]]> https://s.ch9.ms/Events/Build/2017/B8106 https://s.ch9.ms/Events/Build/2017/B8106 Service Fabric is the Microsoft Azure microservices platform. This session is a developer’s tour and roadmap and dives into the latest Service Fabric capabilities, including containerized services, container orchestration including using Docker Compose, ASP.NET Core service support, integration with other Azure services and the latest developments in Visual Studio 2017 tooling, all sprinkled with customers scenarios. 3350 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8106 Mark Fussell, Vaclav Turecek visual+studio service+fabric microservices 7++ reasons to move your C++ code to Visual Studio 2017 ]]> https://s.ch9.ms/Events/Build/2017/B8105 https://s.ch9.ms/Events/Build/2017/B8105 Come learn the top 7 reasons you should be excited about Visual Studio 2017 if you are a C&#43;&#43; developer. Whether you are using the product and are looking to upgrade, or you never used it before but you are considering it now, join us to discover how Visual Studio 2017 raises the bar in terms of C&#43;&#43; productivity. From C&#43;&#43; standards conformance to coding productivity, cross-platform development for Windows, Linux, Android, and iOS and CMake support, these are only a few of the topics we discuss in this demo-packed session. 2931 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8105 Marian Luparu The future of C# We’re back! With C# 7.0 and Visual Studio 2017 just recently shipped, we paint the big picture: let’s lay out where the C# language and tooling experience is headed, and show early glimpses of what we’re currently working on.

]]>
https://s.ch9.ms/Events/Build/2017/B8104 https://s.ch9.ms/Events/Build/2017/B8104 We’re back! With C# 7.0 and Visual Studio 2017 just recently shipped, we paint the big picture: let’s lay out where the C# language and tooling experience is headed, and show early glimpses of what we’re currently working on. 3719 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8104 Mads Torgersen, Dustin Campbell visual+studio .net csharp
Xamarin: The future of mobile app development ]]> https://s.ch9.ms/Events/Build/2017/B8103 https://s.ch9.ms/Events/Build/2017/B8103 Xamarin enables C# developers to become native iOS, Android, and Windows mobile app developers overnight. In this session, learn how to leverage your existing .NET and C# skills to create iOS and Android mobile apps in Visual Studio with Xamarin. In addition to allowing you to write your iOS and Android apps in C#, Xamarin lets you reuse existing .NET libraries and share your business logic across iOS, Android, and Windows apps. During this session we cover the Xamarin platform and how to create native iOS, Android, and Windows apps in C#. See what is new and next for Xamarin development inside of Visual Studio. Moreover, we focus on the code, with several live coding adventures throughout the entire session and showing you the latest and greatest in native cross-platform development. 3545 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8103 Miguel de Icaza, James Montemagno Proven tips for a successful Windows Store app ]]> https://s.ch9.ms/Events/Build/2017/B8102 https://s.ch9.ms/Events/Build/2017/B8102 Join this session to hear some of the proven best practices that the most successful Windows Store app publishers use to drive their goals in the Windows Store. This session offers tips for all steps of the app life cycle, including user acquisition and discovery, retention and engagement, and, of course, monetization. 3453 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8102 Jaime Rodriguez, Sonia Carlson universal+windows+platform+uwp windows+store monetization Windows 10 identity overview ]]> https://s.ch9.ms/Events/Build/2017/B8101 https://s.ch9.ms/Events/Build/2017/B8101 Windows 10 delivers several key advancements in identity and authentication with Windows Hello, Azure Active Directory Join, Web Account Manager, Windows Hello Companion Device Framework, and Dynamic Lock. With the adoption of FIDO (Fast Identity Online alliance) standards across the industry, now is the time to update your websites and applications to support secure user authentication. Come join us to learn how you can build websites and applications that provide a single sign-on experience with strong password-less authentication. We promise some exciting demos! 3654 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8101 Yogesh Mehta, Matthew Palko enterprise security What's new and coming for Windows UI: XAML and composition ]]> https://s.ch9.ms/Events/Build/2017/B8100 https://s.ch9.ms/Events/Build/2017/B8100 Great user experiences can delight and engage your users, and make them more productive. Innovations in the Windows UI platform in XAML and Visual Layer make creating these experiences easy on Windows. This session shows you how to easily enable these experiences in your apps – be they consumer, enterprise, or line-of-business. We also tease you with what’s in store for Windows UI in the future and how we progressively make the 'possible' even easier. 3953 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8100 Ashish Shetty, Tim Heuer ux universal+windows+platform+uwp xaml What's new in Xamarin.Forms ]]> https://s.ch9.ms/Events/Build/2017/B8099 https://s.ch9.ms/Events/Build/2017/B8099 Building cross-platform native UIs with one shared codebase was once just a dream. With Xamarin.Forms, this dream is now a reality. Xamarin.Forms allows you to build a native UI for three platforms with one shared C# codebase. Simply put, if you know C# then you're ready to build iOS, Android, and Windows apps with more platforms on the horizon. Xamarin.Forms is already packed with tons of awesome features, and recently has seen major improvements in stability and performance. The fun doesn't stop there as we continue to make significant advancements. Join us as we give you a full breakdown of all the spectacular features that have been released and a peek into the future of Xamarin.Forms. 3328 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8099 Jason Smith xamarin xamarin+test+cloud Windows Store: Manage and promote apps your way ]]> https://s.ch9.ms/Events/Build/2017/B8098 https://s.ch9.ms/Events/Build/2017/B8098 Join this session to learn how the Windows Store is adding new capabilities to make developers more productive and successful on all Windows device families: Desktop, Xbox, HoloLens, and Phone. We review how Dev Center provides more flexibility and agility through the lifecycle of your apps: submission, release, Store listing, post-release analytics, promotions, sales, and discounts. We also talk about new monetization features, more ways the Store can showcase and distribute your apps, and highlight new options to deliver and promote games that can run on Xbox One. 3511 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8098 Bernardo Zamora, Jonathan Garrigues universal+windows+platform+uwp windows+store dev+center What’s new with the Microsoft Bot Framework ]]> https://s.ch9.ms/Events/Build/2017/B8097 https://s.ch9.ms/Events/Build/2017/B8097 Come see how we have made it easier for developers to build more intelligent bots and to reach more channels, across all modalities. See the future of building bots with a preview of next Bot Framework release. 2923 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8097 Chris Mullins, Henrik Frystyk Nielsen, Vishwac Sena Kannan azure artificial+intelligence bot+framework Ten things you didn’t know about Visual Studio 2017 for building .NET UWP apps With the new Windows 10 Creators Update, .NET Standard, and changes to NuGet, there is a lot going on in the world of .NET Windows development. We made this session to keep you up to date with the new tools for UWP development. Improvements have been made all around - from installation and getting started, all the way to tools that help you test and publish your apps. Along the way we show you tips and tricks to accelerate your Windows app development.

To find out more about Windows Template Studio, head to https://aka.ms/wts. If you want to install, go to https://aka.ms/wtsinstall.

]]>
https://s.ch9.ms/Events/Build/2017/B8096 https://s.ch9.ms/Events/Build/2017/B8096 With the new Windows 10 Creators Update, .NET Standard, and changes to NuGet, there is a lot going on in the world of .NET Windows development. We made this session to keep you up to date with the new tools for UWP development. Improvements have been made all around - from installation and getting started, all the way to tools that help you test and publish your apps. Along the way we show you tips and tricks to accelerate your Windows app development. To find out more about Windows Template Studio, head to https://aka.ms/wts. If you want to install, go to https://aka.ms/wtsinstall. 3115 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8096 Clint Rutkas, Daniel Jacobson universal+windows+platform+uwp visual+studio windows+template+studio
Visual Studio for Mac Visual Studio for Mac has just been released! Come join us for a tour of this fully-featured IDE that will help every Mac developer create mobile and cloud applications. We started with a solid foundation for mobile development using Xamarin, and cloud development using .NET Core and recently added ASP.NET Core support. We’ve just announced support for game development with Unity, and new preview features for Azure developers using Docker or Azure Functions. In this hour and a half, learn about the basics of the IDE such as navigation, debugging, code editing, and refactoring tools to ease your C# and F# development. We also take a whirlwind tour through the mobile and cloud features included in the IDE. Finally, we look at what’s coming up next.

]]>
https://s.ch9.ms/Events/Build/2017/B8095 https://s.ch9.ms/Events/Build/2017/B8095 Visual Studio for Mac has just been released! Come join us for a tour of this fully-featured IDE that will help every Mac developer create mobile and cloud applications. We started with a solid foundation for mobile development using Xamarin, and cloud development using .NET Core and recently added ASP.NET Core support. We’ve just announced support for game development with Unity, and new preview features for Azure developers using Docker or Azure Functions. In this hour and a half, learn about the basics of the IDE such as navigation, debugging, code editing, and refactoring tools to ease your C# and F# development. We also take a whirlwind tour through the mobile and cloud features included in the IDE. Finally, we look at what’s coming up next. 3630 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8095 Miguel de Icaza, Joseph Hill, Kendra Havens
Visual Studio Code: Conquer the cloud with an editor and a CLI ]]> https://s.ch9.ms/Events/Build/2017/B8094 https://s.ch9.ms/Events/Build/2017/B8094 Bring your laptop and VS Code and in less than 60 minutes learn how to configure Code for great editing, navigation, linting, and debugging experiences building modern Node.js based (MEAN, MERN, etc.) applications. Learn how to use a rich set of (new!) extensions to build, deploy, and diagnose (containerized!) cloud apps that run on Azure PaaS services (App Service, DocDB, and more). Also, set up Team System for continuous deployment. Throughout it all, leverage the new Azure cross platform CLI, enhanced with VS Code’s signature rich editing experiences. Conquer the cloud with VS Code! 3516 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8094 Jonathan Carter, Chris Dias containers node.js visual+studio+code Nextgen UWP app distribution: Building extensible, stream-able, componentized apps ]]> https://s.ch9.ms/Events/Build/2017/B8093 https://s.ch9.ms/Events/Build/2017/B8093 With the Windows 10 Creators Update we have grown the Universal Windows Platform for building, selling, and distributing apps. Learn how to quickly engage your user with streaming app installation. The session also covers how you can use optional packages to extend your existing apps and what optional packages mean for distribution, monetization, and user experience. 3742 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8093 John Vintzel, Sandeep George app+model universal+windows+platform+uwp enterprise Using Microsoft Cognitive Services to bring the power of speech recognition to your apps Learn about Microsoft Cognitive Services Speech APIs - Bing Speech, Customer Speech Service and Speaker Recognition - and how they recognize audio, speech and individual speakers to bring the power of speech to your apps.

]]>
https://s.ch9.ms/Events/Build/2017/B8092 https://s.ch9.ms/Events/Build/2017/B8092 Learn about Microsoft Cognitive Services Speech APIs - Bing Speech, Customer Speech Service and Speaker Recognition - and how they recognize audio, speech and individual speakers to bring the power of speech to your apps. 3880 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8092 Khuram Shahid, Panos Periorellis, Ivo Santos artificial+intelligence cognitive+services machine+learning
Build intelligence into your business apps with ease using Bing APIs in Microsoft Cognitive Services ]]> https://s.ch9.ms/Events/Build/2017/B8091 https://s.ch9.ms/Events/Build/2017/B8091 The Bing API's in Cognitive Services let you bring the intelligence and knowledge of the planet to your app in just a few lines of code. Join us to learn about the Bing Search APIs, get a sneak peek at the next version of “Search” APIs, and learn how you can leverage these services in conjunction with the Microsoft Bot Framework to build an intelligent assistant. See useful demos, experience the simplicity of calling this code, and get ideas for adding this functionality to your own applications. 2755 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8091 Ansuman Kar, Brian King artificial+intelligence cognitive+services bing How Microsoft Cognitive Services can help your apps communicate with people ]]> https://s.ch9.ms/Events/Build/2017/B8090 https://s.ch9.ms/Events/Build/2017/B8090 Microsoft Cognitive Services Language APIs - Bing Spell Check, Language Understanding, Linguistic Analysis, Text Analytics, Translator and Web LM - can enable your apps to understand language and communicate with people. 3783 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8090 Darren Jefford artificial+intelligence cognitive+services machine+learning What's new in TypeScript? TypeScript continues its growth journey with more and more JavaScript developers and framework authors taking advantage of the excellent tooling and productivity boost that TypeScript provides in order to create apps that scale. In this session, we talk about the Typescript journey with a focus on some of the most exciting recent features and a preview of things to come. Apart from the language and tools enhancements, see efforts already underway to bring some of the power of TypeScript to existing JavaScript projects.

]]>
https://s.ch9.ms/Events/Build/2017/B8088 https://s.ch9.ms/Events/Build/2017/B8088 TypeScript continues its growth journey with more and more JavaScript developers and framework authors taking advantage of the excellent tooling and productivity boost that TypeScript provides in order to create apps that scale. In this session, we talk about the Typescript journey with a focus on some of the most exciting recent features and a preview of things to come. Apart from the language and tools enhancements, see efforts already underway to bring some of the power of TypeScript to existing JavaScript projects. 3636 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8088 Anders Hejlsberg typescript javascript
Azure Compute: New features and roadmap A can’t-miss session for everyone building in the cloud! We take a look at some of the newest features and upcoming capabilities in the Azure Compute platform. We show some new sizes, new experiences, and new integration technology available at //build or coming soon across VMs, Azure Service Fabric, Azure Container Service, Azure Functions, and more.

]]>
https://s.ch9.ms/Events/Build/2017/B8087 https://s.ch9.ms/Events/Build/2017/B8087 A can’t-miss session for everyone building in the cloud! We take a look at some of the newest features and upcoming capabilities in the Azure Compute platform. We show some new sizes, new experiences, and new integration technology available at //build or coming soon across VMs, Azure Service Fabric, Azure Container Service, Azure Functions, and more. 3506 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8087 Corey Sanders azure
Office 365 as a platform: Reach 100 million Microsoft Office users with your web applications ]]> https://s.ch9.ms/Events/Build/2017/B8086 https://s.ch9.ms/Events/Build/2017/B8086 Learn about the latest that Office has to offer developers, from Microsoft Teams extensibility and the Microsoft Graph to Office add-ins and Office UI Fabric. Get a demo-packed overview of the platform, and a guide to Office sessions you should see through the rest of the conference. 3638 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8086 Rob Howard, Tristan Davis office The road to commercialization for your Windows IoT solution  With Windows 10 IoT Core we have made it so anyone can build and commercialize things—intelligent, connected devices—with apps. In this session, entrepreneurs, product owners and developers learn how to create IoT solutions with Windows IoT Core. We detail the path to commercialization and how to prototype, configure, deploy, manage, and sunset your devices. Learn how to harness enterprise-grade scalable OS updates and application servicing. We go in-depth on how to defend against modern security threats and how to lock down your devices from physical and remote attacks. Developers learn how they can be productive utilizing familiar tools and languages to rapidly build solutions and how to leverage the new capabilities of RS2.

]]>
https://s.ch9.ms/Events/Build/2017/B8085 https://s.ch9.ms/Events/Build/2017/B8085 With Windows 10 IoT Core we have made it so anyone can build and commercialize things—intelligent, connected devices—with apps. In this session, entrepreneurs, product owners and developers learn how to create IoT solutions with Windows IoT Core. We detail the path to commercialization and how to prototype, configure, deploy, manage, and sunset your devices. Learn how to harness enterprise-grade scalable OS updates and application servicing. We go in-depth on how to defend against modern security threats and how to lock down your devices from physical and remote attacks. Developers learn how they can be productive utilizing familiar tools and languages to rapidly build solutions and how to leverage the new capabilities of RS2. 1607 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8085 Jason Farmer universal+windows+platform+uwp internet+of+things windows+iot
The keys to the cloud: Use Microsoft identities to sign in and access API from your mobile and web apps ]]> https://s.ch9.ms/Events/Build/2017/B8084 https://s.ch9.ms/Events/Build/2017/B8084 Microsoft identities are the entry point for every Microsoft cloud API and a large ecosystem of SaaS apps. Join the 150,000 apps active today in Azure Active Directory, making your apps available to more than 100M active business users! Based on the same enterprise-grade infrastructure, Azure AD B2C provides to your apps their own hosted identity system – offering social providers integration, local accounts, and advanced customization you can add to your app in minutes. Attend this session and learn how you can easily integrate with Microsoft identities in your mobile and web apps, thanks to the new MSAL libraries. Build a data-rich application thanks to the power of Microsoft Graph API and the rich data about users, groups, mail, calendar, docs, and more. 3651 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8084 Vittorio Bertocci azure+active+directory azure+active+directory+b2c microsoft+graph The future of Visual Studio Even though we only just released Visual Studio 2017 a couple of months ago, the team has been busy. In this session we take you on a rollercoaster ride through a number of features we’re working on. We show you investments we’re making to increase development productivity, how we’re bringing testing and code analysis even more deeply into the development “inner loop”, and highlight new areas that we’re working on to extend Visual Studio to new platforms and application categories. Expect a demo-heavy, so-new-the-paint-hasn’t-dried session!

]]>
https://s.ch9.ms/Events/Build/2017/B8083 https://s.ch9.ms/Events/Build/2017/B8083 Even though we only just released Visual Studio 2017 a couple of months ago, the team has been busy. In this session we take you on a rollercoaster ride through a number of features we’re working on. We show you investments we’re making to increase development productivity, how we’re bringing testing and code analysis even more deeply into the development “inner loop”, and highlight new areas that we’re working on to extend Visual Studio to new platforms and application categories. Expect a demo-heavy, so-new-the-paint-hasn’t-dried session! 3780 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8083 Tim Sneath, Amanda Silver visual+studio
Surviving success: Performance tuning under pressure ]]> https://s.ch9.ms/Events/Build/2017/B8082 https://s.ch9.ms/Events/Build/2017/B8082 Rapid and runaway success is the best way to expose all of the gaps, rough edges and pain points in your back end services. Under live-site pressure to fix issues, making the crucial set of engineering choices and investments can be challenging. This session will take a hands-on walk through scaling a representative back-end application (written in .NET Core and Docker on Linux) from hundreds to hundreds of thousands of requests per second, illustrating data, techniques, and common performance barriers from real customer deployments. 3563 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8082 Mark Simms docker linux .net+core How to serve AI with data: The future of the Microsoft Data Platform ]]> https://s.ch9.ms/Events/Build/2017/B8081 https://s.ch9.ms/Events/Build/2017/B8081 The cloud is truly becoming the “brain” for our connected planet. You’re not just running algorithms in the cloud, rather you’re connecting that with data from sensors from around the world. By bringing data into the cloud, you can integrate all of the information, apply machine learning and AI on top of that, and deliver apps that are continuously learning and evolving in the cloud. Consequently, the devices and applications connected to cloud are learning and becoming increasingly intelligent. Please join us on a journey through the core new patterns that are emerging as we bring advanced intelligence, the cloud, IoT, and big data together. 3776 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8081 Joseph Sirosh, Alex Miller intelligent+app artificial+intelligence data Microsoft SQL Server 2017 in the modern datacenter: how to run on Linux, Docker, OpenShift, and Kubernetes ]]> https://s.ch9.ms/Events/Build/2017/B8080 https://s.ch9.ms/Events/Build/2017/B8080 With the on-premises data center evolving into a private cloud, the fast pace of innovation in public clouds, and the strong interest in container technology it begs the question: How do you run a database in this new environment? In this session we examine what it means that SQL Server is evolving to support both Windows and Linux, including running inside a container on both platforms. Should you run SQL Server inside a Docker container? How does it play with orchestration technologies like OpenShift and Kubernetes? The brief answer is that we believe SQL Server should be ubiquitous and run in our customers environment of choice. Come to the session to hear the long answer with a bunch of demos! 3565 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8080 Travis Wright, Tobias Ternstrom docker sql+server linux+containers Slice, dice, and route your SharePoint documents with Microsoft Flow, Azure Logic Apps and Microsoft PowerApps  ]]> https://s.ch9.ms/Events/Build/2017/B8079 https://s.ch9.ms/Events/Build/2017/B8079 Developers can build modern business process applications with Microsoft Flow and PowerApps and extend them with Azure Functions to fully customize how content flows within their organization. 3864 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8079 Kerem Yuceturk, Merwan Hade office SignalR .NET Core: Realtime cross-platform open web communication SignalR is being reimagined for ASP.NET Core. In this session, we explore how we’re bringing the real-time web goodness you know and love to ASP.NET Core, while laying the foundations for bigger and bolder capabilities beyond HTTP.

]]>
https://s.ch9.ms/Events/Build/2017/B8078 https://s.ch9.ms/Events/Build/2017/B8078 SignalR is being reimagined for ASP.NET Core. In this session, we explore how we’re bringing the real-time web goodness you know and love to ASP.NET Core, while laying the foundations for bigger and bolder capabilities beyond HTTP. 3621 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8078 Damian Edwards, David Fowler
Serving AI with data: How to use R, Python, and machine learning with Microsoft SQL Server 2017 ]]> https://s.ch9.ms/Events/Build/2017/B8076 https://s.ch9.ms/Events/Build/2017/B8076 In this session, learn how to use R and Python to perform statistical and machine learning tasks in SQL Server 2017. Also, learn how to operationalize your R or Python scripts using the SQL Server integration. 4231 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8076 Umachandar Jayachandran, Nellie Gustafsson sql+server r python Progressive web apps and the Windows ecosystem ]]> https://s.ch9.ms/Events/Build/2017/B8075 https://s.ch9.ms/Events/Build/2017/B8075 Whether at home or at work, the web plays an increasingly critical role in our daily lives. As we have become more dependent on accessing the tools it powers, we’ve also struggled to overcome some of its limitations—network connectivity, for instance. At Microsoft, we’ve long been interested in the power of the web for software development and we are even more excited for the future possibilities offered by progressive web apps (PWAs). In this session, we discuss what PWAs are, how they can be integrated into the development process of modern websites, the advantages and disadvantages of PWAs vs. native development, and what opportunities they present when installed alongside native apps in Windows. 3909 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8075 Aaron Gustafson universal+windows+platform+uwp web+platform Modern front-end web development in Visual Studio 2017 A lot of work has gone into making Visual Studio 2017 the fastest and most productive version ever. Join us for a tour of the new features for web developers that makes writing modern web applications easier, more productive and fun. We look at new techniques like “dotnet new angular” and see how ASP.NET Core and Visual Studio 2017 are a great partner for your front-end web development needs.

]]>
https://s.ch9.ms/Events/Build/2017/B8073 https://s.ch9.ms/Events/Build/2017/B8073 A lot of work has gone into making Visual Studio 2017 the fastest and most productive version ever. Join us for a tour of the new features for web developers that makes writing modern web applications easier, more productive and fun. We look at new techniques like “dotnet new angular” and see how ASP.NET Core and Visual Studio 2017 are a great partner for your front-end web development needs. 3668 Mon, 08 May 2017 20:21:24 GMT https://s.ch9.ms/Events/Build/2017/B8073 Mads Kristensen
================================================ FILE: src/BuildCast/BuildCast.csproj ================================================  Debug x86 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380} AppContainerExe Properties BuildCast BuildCast en-US UAP 10.0.16299.0 10.0.16299.0 14 512 {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} true BuildCast_TemporaryKey.pfx True Always x86|x64 true bin\x86\Debug\ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP ;2008 full x86 false prompt true true Microsoft.BuildCast.ruleset false bin\x86\Release\ TRACE;NETFX_CORE;WINDOWS_UWP true ;2008 pdbonly x86 false prompt true true Microsoft.BuildCast.ruleset true bin\ARM\Debug\ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP ;2008 full ARM false prompt true true Microsoft.BuildCast.ruleset bin\ARM\Release\ TRACE;NETFX_CORE;WINDOWS_UWP true ;2008 pdbonly ARM false prompt true true Microsoft.BuildCast.ruleset true bin\x64\Debug\ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP ;2008 full x64 false prompt true true Microsoft.BuildCast.ruleset CS4014 false bin\x64\Release\ TRACE;NETFX_CORE;WINDOWS_UWP true ;2008 pdbonly x64 false prompt true true Microsoft.BuildCast.ruleset PackageReference App.xaml CustomMediaPlayer.xaml CustomMTC.xaml RemoteControl.xaml 20170927020747_initial.cs Downloads.xaml Notes.xaml NavigationRoot.xaml Home.xaml EpisodeDetails.xaml Favorites.xaml FeedDetails.xaml InkNote.xaml Player.xaml PopupPlayer.xaml SettingsPage.xaml Designer PreserveNewest MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer Designer MSBuild:Compile MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer Designer MSBuild:Compile PreserveNewest Designer MSBuild:Compile PreserveNewest MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer MSBuild:Compile Designer 4.6.1 2.0.0 2.0.0 6.0.1 2.1.0 2.1.0 2.1.0 2.1.0 1.1.0-beta004 0.1.96 1.21.0 14.0 ================================================ FILE: src/BuildCast/Controls/CustomMTC.xaml ================================================  ================================================ FILE: src/BuildCast/Controls/CustomMTC.xaml.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.Controls { using System; using System.Collections.ObjectModel; using System.Diagnostics; using System.Threading.Tasks; using BuildCast.Helpers; using BuildCast.Services; using BuildCast.ViewModels; using BuildCast.Views; using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; public sealed partial class CustomMTC : UserControl { public static readonly DependencyProperty RemoteSystemsProperty = DependencyProperty.Register(nameof(RemoteSystems), typeof(ObservableCollection), typeof(CustomMTC), new PropertyMetadata(null)); private static TimeSpan _currentTime; /// /// Initializes a new instance of the class. /// public CustomMTC() { this.InitializeComponent(); } public event EventHandler RemoteSystemSelected; public event EventHandler RefreshRequested; public ObservableCollection RemoteSystems { get { return (ObservableCollection)GetValue(RemoteSystemsProperty); } set { SetValue(RemoteSystemsProperty, value); } } #region View Modes public static async Task LeaveCompactOverlayMode() { await ViewModeService.Instance.SwitchToNormalMode(); } private void Fs_click(object sender, RoutedEventArgs e) { var navRoot = ((App)Application.Current).GetNavigationRoot(); navRoot.ToggleFullscreen(); } private async void Pip_click(object sender, RoutedEventArgs e) { var navRoot = ((App)Application.Current).GetNavigationRoot(); navRoot.ExitFullScreen(); var pipModes = await SettingsViewModel.GetCurrentMode(); if (pipModes == PipModes.SingleView) { await ViewModeService.Instance.SwitchToCompactOverlay(new PopupPlayer(pipModes), player => player.StartVideo()); } else { await ViewModeService.Instance.CreateNewView(() => { return new PopupPlayer(pipModes); }, player => player.StartVideo()); } } #endregion private void UserControl_Loaded(object sender, RoutedEventArgs e) { timelinectrl.SetElapsedTimeControl(elapsed); Window.Current.CoreWindow.PointerPressed += CoreWindow_PointerPressed; PlayerService.Current.PlayPauseChanged += Current_PlayPauseChanged; PlayerService.Current.SetTimeControls(timelinectrl); Current_PlayPauseChanged(this, PlayerService.Current.State); } // Playback #region Playback Logic private void Current_PlayPauseChanged(object sender, Windows.Media.Playback.MediaPlaybackState e) { if (e == Windows.Media.Playback.MediaPlaybackState.Playing) { // GlyphString = @""; playpause.Content = new FontIcon() { Glyph = @"" }; } else { // GlyphString = @""; playpause.Content = new FontIcon() { Glyph = @"" }; } } private void DoneSrubbing(object sender, EventArgs e) { Debug.WriteLine(timelinectrl.CurrentPercentage); _currentTime = timelinectrl.CurrentTime; PlayerService.Current.SetTime(timelinectrl.CurrentTime); } private void CoreWindow_PointerPressed(CoreWindow sender, PointerEventArgs args) { timelinectrl.NotifyPointerPressed(args); } private async void Playpause_click(object sender, RoutedEventArgs e) { await PlayerService.Current.TogglePlayPaused(); } private void UserControl_Unloaded(object sender, RoutedEventArgs e) { Window.Current.CoreWindow.PointerPressed -= CoreWindow_PointerPressed; PlayerService.Current.PlayPauseChanged -= Current_PlayPauseChanged; } private void Rwnd_click(object sender, RoutedEventArgs e) { PlayerService.Current.Rewind(); } private void Ffwd_click(object sender, RoutedEventArgs e) { PlayerService.Current.FastForward(); } #endregion #region Rome logic private void RomeItemClick(object sender, ItemClickEventArgs e) { romeProgress.IsIndeterminate = true; romeProgress.IsEnabled = true; romeProgress.Visibility = Visibility.Visible; this.sendtodevice.Flyout?.Hide(); this.sendtodevice.IsEnabled = false; RemoteSystemSelected?.Invoke(this, e.ClickedItem as IRemoteSystemDescription); romeProgress.IsEnabled = false; romeProgress.IsIndeterminate = false; romeProgress.Visibility = Visibility.Collapsed; this.sendtodevice.IsEnabled = true; } private void Flyout_Opened(object sender, object e) { RefreshRequested?.Invoke(this, EventArgs.Empty); } #endregion } } ================================================ FILE: src/BuildCast/Controls/CustomMediaPlayer.xaml ================================================  ================================================ FILE: src/BuildCast/Controls/CustomMediaPlayer.xaml.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.Controls { using System; using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using BuildCast.Helpers; using BuildCast.Services; using Windows.Graphics.Imaging; using Windows.Storage.Streams; using Windows.UI; using Windows.UI.Composition; using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Hosting; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Media.Imaging; public sealed partial class CustomMediaPlayer : UserControl { private Compositor _compositor; private ContainerVisual _container; private SpriteVisual _tintVisual; private SpriteVisual _posterVisual; private SpriteVisual _videoVisual; private LoadedImageSurface _surface; private Uri _currentPosterUri; private CoreDispatcher _dispatcher; private BufferingVisualManager _bvm; /// /// Initializes a new instance of the class. /// public CustomMediaPlayer() { this.InitializeComponent(); InitializeComposition(); ConfigureAnimations(); // Capture dispatcher from current window on the UI thread _dispatcher = Window.Current.Dispatcher; _bvm = new BufferingVisualManager(); _bvm.SetCompositor(Window.Current.Compositor); } /// /// Causes placdeholder image to be loaded and displayed /// /// Uri for placeholder image public void LoadPoster(string uri) { if (!string.IsNullOrEmpty(uri)) { LoadPlaceholderImage(new System.Uri(uri)); } } /// /// Get bitmap from current frame of video using RenderTarget method. /// Only used if video is not already downloaded. /// /// Byte array representing bitmap public async Task GetBitmapFromRenderTarget() { var tweet = new RenderTargetBitmap(); await tweet.RenderAsync(HostElement); var pixels = await tweet.GetPixelsAsync(); InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream(); var be = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, randomAccessStream); be.SetPixelData( BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)tweet.PixelWidth, (uint)tweet.PixelHeight, 92.0, 92.0, pixels.ToArray()); await be.FlushAsync(); var bytes = new byte[randomAccessStream.Size]; await randomAccessStream.ReadAsync(bytes.AsBuffer(), (uint)randomAccessStream.Size, InputStreamOptions.None); return bytes; } private void HostElement_SizeChanged(object sender, Windows.UI.Xaml.SizeChangedEventArgs e) { _container.SetSize(HostElement); } private void InitializeComposition() { _compositor = Window.Current.Compositor; _container = Window.Current.Compositor.CreateContainerVisual(); ElementCompositionPreview.SetElementChildVisual(HostElement, _container); _tintVisual = _compositor.CreateSpriteVisual(); _tintVisual.Brush = _compositor.CreateColorBrush(Colors.Black); _tintVisual.Opacity = 0.6f; _tintVisual.RelativeSizeAdjustment = new System.Numerics.Vector2(1.0f); _container.Children.InsertAtBottom(_tintVisual); _posterVisual = _compositor.CreateSpriteVisual(); _posterVisual.Brush = _compositor.CreateColorBrush(Colors.Black); _posterVisual.RelativeSizeAdjustment = new System.Numerics.Vector2(1.0f); _posterVisual.Opacity = 0; _posterVisual.FadeVisual(2); _videoVisual = _compositor.CreateSpriteVisual(); _videoVisual.RelativeSizeAdjustment = new System.Numerics.Vector2(1.0f); if (!PlayerService.Current.IsPlaying && !PlayerService.Current.IsPaused) { _videoVisual.Opacity = 0; } _videoVisual.FadeVisual(2); _videoVisual.Brush = PlayerService.Current.GetBrush(Window.Current.Compositor); _container.Children.InsertAtTop(_videoVisual); _container.Children.InsertAtTop(_posterVisual); } private void ConfigureAnimations() { // TODO: collapse all this into a single helper method ElementCompositionPreview.SetIsTranslationEnabled(HostElement, true); ElementCompositionPreview.SetImplicitShowAnimation(HostElement, VisualHelpers.CreateAnimationGroup( VisualHelpers.CreateVerticalOffsetAnimationFrom(0.45, -50f), VisualHelpers.CreateOpacityAnimation(0.5) )); ElementCompositionPreview.SetImplicitHideAnimation(HostElement, VisualHelpers.CreateOpacityAnimation(0.8, 0)); } private void LoadPlaceholderImage(Uri load) { _currentPosterUri = load; Action setSurface = () => { _posterVisual.Brush = Window.Current.Compositor.CreateSurfaceBrush(_surface); if (PlayerService.Current.IsOpening || PlayerService.Current.IsClosed) { _posterVisual.Opacity = 1.0f; } }; if (_surface == null) { _surface = LoadedImageSurface.StartLoadFromUri(load); _surface.LoadCompleted += (o, l) => { setSurface(); }; } else { setSurface(); } } private async Task SetLoadingProgress() { pgrloading.IsIndeterminate = true; pgrloading.Visibility = Visibility.Visible; await _bvm.StartBuffering(HostElement, HostElement, false); } private void UserControl_Loaded(object sender, RoutedEventArgs e) { PlayerService.Current.MediaLoaded += Current_MediaLoaded; PlayerService.Current.MediaLoading += Current_MediaLoading; } private void UserControl_Unloaded(object sender, RoutedEventArgs e) { PlayerService.Current.MediaLoaded -= Current_MediaLoaded; PlayerService.Current.MediaLoading -= Current_MediaLoading; } private async void Current_MediaLoading(object sender, EventArgs e) { await SetLoadingProgress(); } private async void Current_MediaLoaded(object sender, EventArgs e) { _posterVisual.Opacity = 0.0f; _videoVisual.Opacity = 1.0f; await _dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { _bvm.StopBuffering(false); pgrloading.IsIndeterminate = false; pgrloading.Visibility = Visibility.Collapsed; }); } } } ================================================ FILE: src/BuildCast/Controls/RemoteControl.xaml ================================================  ================================================ FILE: src/BuildCast/Controls/RemoteControl.xaml.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using BuildCast.Services; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; // The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236 namespace BuildCast.Controls { public sealed partial class RemoteControl : UserControl { // Using a DependencyProperty as the backing store for RemoteConnection. This enables animation, styling, binding, etc... public static readonly DependencyProperty RemoteConnectionProperty = DependencyProperty.Register(nameof(RemoteConnection), typeof(IRemoteConnection), typeof(RemoteControl), new PropertyMetadata(null)); public event EventHandler CloseClicked; public IRemoteConnection RemoteConnection { get { return (IRemoteConnection)GetValue(RemoteConnectionProperty); } set { SetValue(RemoteConnectionProperty, value); } } /// /// Initializes a new instance of the class. /// public RemoteControl() { this.InitializeComponent(); } private void Close_Click(object sender, RoutedEventArgs e) { RemoteConnection?.Disconnect(); CloseClicked?.Invoke(this, EventArgs.Empty); } private void Rewind_Click(object sender, RoutedEventArgs e) { RemoteConnection.Rewind(); } private void Play_Click(object sender, RoutedEventArgs e) { RemoteConnection.Play(); } private void Pause_Click(object sender, RoutedEventArgs e) { RemoteConnection.Pause(); } private void FastForward_Click(object sender, RoutedEventArgs e) { RemoteConnection.FastForward(); } private void RemoteSnap_Click(object sender, RoutedEventArgs e) { RemoteConnection.GetRemoteBitmap(); } } } ================================================ FILE: src/BuildCast/Controls/TimeControl.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.Controls { using System; using System.Numerics; using System.Threading; using BuildCast.Helpers; using Microsoft.Graphics.Canvas; using Microsoft.Graphics.Canvas.Text; using Microsoft.Graphics.Canvas.UI.Composition; using Windows.Foundation; using Windows.UI; using Windows.UI.Composition; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Hosting; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Shapes; public class TimeControl : Control, IDisposable { private object drawlock = new object(); private ContainerVisual rootVisual; private CanvasSwapChain swapChain; private SpriteVisual swapChainVisual; private CanvasDevice canvasDevice; private Rectangle hostElement; private CancellationTokenSource drawLoopCancellationTokenSource; private int drawCount; private TimeSpan currentTime; private Color foregroundColor; /// /// Initializes a new instance of the class. /// public TimeControl() { drawLoopCancellationTokenSource = new CancellationTokenSource(); this.DefaultStyleKey = typeof(TimeControl); } public bool Scrubbing { get; set; } public TimeSpan Duration { get; set; } public bool ShowAsPercentage { get; set; } public TimeSpan CurrentTime { get { return currentTime; } set { currentTime = value; if (swapChain != null && Duration > TimeSpan.Zero) { DrawSwapChain(swapChain); swapChain.Present(); } } } public double CurrentPercentage { get { return 0; } set { if (Duration > TimeSpan.MinValue) { CurrentTime = TimeSpan.FromMilliseconds(value * Duration.TotalMilliseconds); } } } public void Dispose() { drawLoopCancellationTokenSource?.Cancel(); swapChain?.Dispose(); } public void SetDevice(CanvasDevice device) { drawLoopCancellationTokenSource?.Cancel(); var displayInfo = Windows.Graphics.Display.DisplayInformation.GetForCurrentView(); this.swapChain = new CanvasSwapChain( device, (int)this.ActualWidth, (int)this.ActualHeight, displayInfo.LogicalDpi, Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8A8UIntNormalized, 2, CanvasAlphaMode.Premultiplied); swapChainVisual.Brush = Window.Current.Compositor.CreateSurfaceBrush(CanvasComposition.CreateCompositionSurfaceForSwapChain(Window.Current.Compositor, swapChain)); drawLoopCancellationTokenSource = new CancellationTokenSource(); } protected override void OnApplyTemplate() { base.OnApplyTemplate(); hostElement = GetTemplateChild("DrawHolder") as Rectangle; hostElement.SizeChanged += ElementCompositionVisual_SizeChanged; rootVisual = Window.Current.Compositor.CreateContainerVisual(); swapChainVisual = Window.Current.Compositor.CreateSpriteVisual(); swapChainVisual.Brush = Window.Current.Compositor.CreateColorBrush(Colors.Pink); rootVisual.Children.InsertAtTop(swapChainVisual); ElementCompositionPreview.SetElementChildVisual(hostElement, rootVisual); foregroundColor = ((SolidColorBrush)Foreground).Color; } private void ElementCompositionVisual_SizeChanged(object sender, SizeChangedEventArgs e) { rootVisual.SetSize(hostElement); swapChainVisual.SetSize(hostElement); if (canvasDevice != null) { Dispose(); canvasDevice = null; } if (canvasDevice == null) { canvasDevice = CanvasDevice.GetSharedDevice(); SetDevice(canvasDevice); } DrawSwapChain(swapChain); swapChain.Present(); } private void DrawSwapChain(CanvasSwapChain sc) { var result = Monitor.TryEnter(drawlock); if (result) { try { ++drawCount; using (var ds = sc.CreateDrawingSession(Colors.Transparent)) { var size = sc.Size.ToVector2(); if (ShowAsPercentage) { ds.DrawText($"{CalcPercentage()}%", new Rect(0, 0, this.swapChain.Size.Width, this.swapChain.Size.Height), foregroundColor, new CanvasTextFormat() { FontSize = 17, VerticalAlignment = CanvasVerticalAlignment.Bottom, HorizontalAlignment = CanvasHorizontalAlignment.Center, }); } else { ds.DrawText($"{this.CurrentTime.ToString(@"hh\:mm\:ss")}", new Rect(0, 0, this.swapChain.Size.Width, this.swapChain.Size.Height), foregroundColor, new CanvasTextFormat() { FontSize = 15, VerticalAlignment = CanvasVerticalAlignment.Center, HorizontalAlignment = CanvasHorizontalAlignment.Center, }); } } } finally { Monitor.Exit(drawlock); } } } private double CalcPercentage() { return Math.Round((CurrentTime.TotalMilliseconds / Duration.TotalMilliseconds) * 100); } } } ================================================ FILE: src/BuildCast/Controls/Timeline.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.Controls { using System; using System.ComponentModel; using System.Diagnostics; using System.Runtime.CompilerServices; using Microsoft.Toolkit.Uwp.UI.Animations.Expressions; using Windows.UI.Composition; using Windows.UI.Composition.Interactions; using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Hosting; using Windows.UI.Xaml.Input; public class Timeline : Control, IInteractionTrackerOwner, INotifyPropertyChanged { private Compositor compositor; private Visual thumbVisual; private Visual trackVisual; private InteractionTracker tracker; private VisualInteractionSource interactionSource; private ExpressionNode thumbExpressionAnimation; private CompositionPropertySet propSet; private TimeControl myPercentageTimeControl; private TimeControl elapsedTimeControl; private double currentPercentage; private FrameworkElement thumb; private FrameworkElement trackCanvas; private double trackCanvasWidth; private bool dragging; /// /// Initializes a new instance of the class. /// public Timeline() { this.DefaultStyleKey = typeof(Timeline); this.Loaded += Timeline_Loaded; this.Unloaded += this.Timeline_Unloaded; } public event EventHandler DragStart; public event EventHandler DragStop; public event PropertyChangedEventHandler PropertyChanged; #region Public Properties public double CurrentPercentage { get { return currentPercentage; } set { this.currentPercentage = value; myPercentageTimeControl.CurrentPercentage = value; if (elapsedTimeControl != null) { elapsedTimeControl.CurrentPercentage = value; } RaisePropertyChanged(); } } public TimeSpan CurrentTime { get { return TimeSpan.FromSeconds(TimeDuration.TotalSeconds * CurrentPercentage); } } public bool IsScrubbing { get { return dragging; } } #endregion private TimeSpan TimeDuration { get; set; } #region public methods public void SetTime(TimeSpan postition, TimeSpan duration) { if (!IsScrubbing && myPercentageTimeControl != null) { myPercentageTimeControl.CurrentTime = postition; myPercentageTimeControl.Duration = duration; if (elapsedTimeControl != null) { elapsedTimeControl.CurrentTime = postition; elapsedTimeControl.Duration = duration; } TimeDuration = duration; var temp = (postition.TotalMilliseconds / duration.TotalMilliseconds) * 100; var newPos = this.CalcPosition(temp); if (!double.IsNaN(newPos) || !double.IsNaN(newPos)) { var anim = compositor.CreateVector3KeyFrameAnimation(); var easing = compositor.CreateLinearEasingFunction(); anim.InsertExpressionKeyFrame(1f, ExpressionFunctions.Vector3((float)-newPos, 0, 0), easing); try { var result = this.tracker.TryUpdatePositionWithAnimation(anim); } catch (ArgumentException) { // since new if statement is somehow letting NaN through, need to catch exception when it does } } } } public void SetElapsedTimeControl(TimeControl elapsed) { this.elapsedTimeControl = elapsed; if (elapsed != null) { this.elapsedTimeControl.CurrentTime = TimeSpan.Zero; this.elapsedTimeControl.Duration = TimeSpan.FromSeconds(1); } } public void NotifyPointerPressed(PointerEventArgs args) { try { interactionSource.TryRedirectForManipulation(args.CurrentPoint); } catch (Exception) { } } #endregion #region INotifyPropertyChanged private void RaisePropertyChanged([CallerMemberName] string caller = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(caller)); } #endregion #region PositionHandling private void SetPosition(double percentage) { this.currentPercentage = percentage; this.UpdatePosition(); } private void UpdatePosition() { var newPos = this.CalcPosition(this.currentPercentage); this.SetPositionAbsoluteClamped(newPos); } private double Clamp(double position) { if (position < 0) { return 0.0; } else if (position > this.trackCanvasWidth - this.thumb.Width) { return this.trackCanvasWidth - this.thumb.Width; } else { return position; } } private void SetPositionAbsoluteClamped(double position) { if (this.thumb != null && this.trackCanvas != null) { this.thumb.SetValue(Canvas.LeftProperty, this.Clamp(position)); } } private double CalcPosition(double percent) { if (this.thumb == null) { return 0.0; } return ((percent / 100.0) * this.trackCanvasWidth) - (45 * (percent / 100.0)); } #endregion #region eventhandlers private void Timeline_Loaded(object sender, RoutedEventArgs e) { this.SizeChanged += this.Timeline_SizeChanged; this.trackCanvas.SizeChanged += this.TrackCanvas_SizeChanged; this.StartComposition(); } private void Timeline_Unloaded(object sender, RoutedEventArgs e) { this.SizeChanged -= this.Timeline_SizeChanged; if (this.trackCanvas != null) { this.trackCanvas.SizeChanged -= this.TrackCanvas_SizeChanged; } } private void Timeline_SizeChanged(object sender, SizeChangedEventArgs e) { this.UpdatePosition(); } // This captures when a mousewheel interaction occurs. We will then take the "delta" from the mousewheel and // funnel that into an animation and animate the position of InteractionTracker. Tracker's position ultimately defines position of the scrubber private void PointerWheel_Changed(object sender, PointerRoutedEventArgs e) { // Calling OnDragStart() so we can change the position of the scrubber OnDragStart(); // Grab the delta of the mousewheel from the event handler var wheelDelta = e.GetCurrentPoint(trackCanvas).Properties.MouseWheelDelta; propSet.InsertVector3("wheelDelta", new System.Numerics.Vector3(wheelDelta, 0f, 0f)); // Create the animation that we will use to animate the position of InteractionTracker var wheelKFA = this.compositor.CreateVector3KeyFrameAnimation(); wheelKFA.Duration = TimeSpan.FromSeconds(1); // We are using strings here instead of ExpressionBuilder. We need an extension method added to ExpressionBuilder for TryUpdatePositionWithAnimation to take in // an ExpressionNode. Then we can use ExpressionNodes in the ExpressionKeyFrame instead of strings wheelKFA.InsertExpressionKeyFrame(1f, "this.CurrentValue + props.wheelDelta"); wheelKFA.SetReferenceParameter("tracker", this.tracker); wheelKFA.SetReferenceParameter("props", propSet); // Update the position of InteractionTracker with the animation based on the scroll wheel delta this.tracker.TryUpdatePositionWithAnimation(wheelKFA); } // We are capturing the move events of the mouse. THis will be for when we want to click and drag the scrubber around. // Note this event gets fired for anytime the pointers moves in general. To make sure we only animate when scrubbing, // We are assuming the left mouse button will be pressed private void MousePointer_Moved(object sender, PointerRoutedEventArgs e) { // Detecting that the pointer type is of mouse if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse) { // Detecting that the left mouse button is clicked if (e.GetCurrentPoint(thumb).Properties.IsLeftButtonPressed) { // Calling OnDragStart() so we can change the position of the scrubber OnDragStart(); // Grab the X position of the pointer in the TrackCanvas float xPosition = (float)e.GetCurrentPoint(trackCanvas).Position.X; propSet.InsertVector3("xMoved", new System.Numerics.Vector3(xPosition, 0f, 0f)); // Create the animation that we will use to animate the position of InteractionTracker // Using an Expression since the deltas will be so small that a KFA would be a bit odd // We are using strings here instead of ExpressionBuilder. We need an extension method added to ExpressionBuilder for TryUpdatePositionWithAnimation to take in // an ExpressionNode. Then we can use ExpressionNodes in the ExpressionKeyFrame instead of strings var pointerExp = this.compositor.CreateExpressionAnimation("-props.xMoved"); pointerExp.SetReferenceParameter("props", propSet); this.tracker.TryUpdatePositionWithAnimation(pointerExp); } } } // This is for click-to-seek. Event current commented out on the trackCanvas, weird eventing issues between when this event gets called and when need to call OnDragStart() and OnDragStop() private void MousePointer_ThumbPressed(object sender, PointerRoutedEventArgs e) { if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse) { var xPosition = (float)e.GetCurrentPoint(trackCanvas).Position.X; propSet.InsertVector3("xPress", new System.Numerics.Vector3(-xPosition, 0f, 0f)); if (e.GetCurrentPoint(thumb).Properties.IsLeftButtonPressed) { OnDragStart(); // var pointerExp = propSet.GetReference().GetVector3Property("xPress"); var pointerExp = this.compositor.CreateExpressionAnimation("props.xPress"); pointerExp.SetReferenceParameter("props", propSet); this.tracker.TryUpdatePositionWithAnimation(pointerExp); } } } private void MousePointer_Released(object sender, PointerRoutedEventArgs e) { if (IsScrubbing) { this.OnDragStop(); } } // This is for click-to-seek. Event current commented out on the trackCanvas, weird eventing issues between when this event gets called and when need to call OnDragStart() and OnDragStop() private void MousePointer_Pressed(object sender, PointerRoutedEventArgs e) { if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse) { OnDragStart(); var xPosition = (float)e.GetCurrentPoint(trackCanvas).Position.X; propSet.InsertVector3("xClickLocation", new System.Numerics.Vector3(-xPosition, 0f, 0f)); var pointerKFA = this.compositor.CreateVector3KeyFrameAnimation(); pointerKFA.Duration = TimeSpan.FromSeconds(1); // pointerKFA.InsertExpressionKeyFrame(1f, "props.xClickLocation"); // pointerKFA.SetReferenceParameter("props", propSet); pointerKFA.InsertExpressionKeyFrame(1f, propSet.GetReference().GetVector3Property("xClickLocation")); this.tracker.TryUpdatePositionWithAnimation(pointerKFA); } } private void TrackCanvas_SizeChanged(object sender, SizeChangedEventArgs e) { this.trackVisual.Size = new System.Numerics.Vector2((float)trackCanvas.ActualWidth, (float)trackCanvas.ActualHeight); this.thumbVisual.Size = new System.Numerics.Vector2((float)thumb.ActualWidth, (float)thumb.ActualHeight); this.tracker.MinPosition = new System.Numerics.Vector3(-this.trackVisual.Size.X, 0, 0); this.trackCanvasWidth = e.NewSize.Width; } private void OnDragStart() { this.dragging = true; myPercentageTimeControl.Scrubbing = true; if (elapsedTimeControl != null) { elapsedTimeControl.Scrubbing = true; } this.DragStart?.Invoke(this, EventArgs.Empty); } private void OnDragStop() { this.dragging = false; myPercentageTimeControl.Scrubbing = false; if (elapsedTimeControl != null) { elapsedTimeControl.Scrubbing = false; } this.DragStop?.Invoke(this, EventArgs.Empty); } #endregion #region InternalInitialization #pragma warning disable SA1202 // Elements should be ordered by access protected override void OnApplyTemplate() #pragma warning restore SA1202 // Elements should be ordered by access { base.OnApplyTemplate(); this.thumb = this.GetTemplateChild("positionIndicator") as FrameworkElement; this.trackCanvas = this.GetTemplateChild("trackCanvas") as FrameworkElement; this.myPercentageTimeControl = this.GetTemplateChild("timeControl") as TimeControl; this.myPercentageTimeControl.CurrentTime = TimeSpan.Zero; this.myPercentageTimeControl.Duration = TimeSpan.FromSeconds(1); this.trackCanvas.SizeChanged += this.TrackCanvas_SizeChanged; InitializeComposition(); } private void InitializeComposition() { this.compositor = ElementCompositionPreview.GetElementVisual(this).Compositor; this.thumbVisual = ElementCompositionPreview.GetElementVisual(thumb); this.trackVisual = ElementCompositionPreview.GetElementVisual(trackCanvas); propSet = this.compositor.CreatePropertySet(); trackCanvas.PointerWheelChanged += new PointerEventHandler(PointerWheel_Changed); trackCanvas.PointerMoved += new PointerEventHandler(MousePointer_Moved); trackCanvas.PointerReleased += new PointerEventHandler(MousePointer_Released); // These pointer events are needed if want to click-to-seek. Weird eventing issues between when these get called and when need to call OnDragStart() and OnDragStop() methods // trackCanvas.PointerPressed += new PointerEventHandler(MousePointer_Pressed); // thumb.PointerPressed += new PointerEventHandler(MousePointer_ThumbPressed); this.interactionSource = VisualInteractionSource.Create(this.trackVisual); this.interactionSource.PositionXSourceMode = InteractionSourceMode.EnabledWithInertia; this.tracker = InteractionTracker.CreateWithOwner(this.compositor, this); this.tracker.InteractionSources.Add(this.interactionSource); // This is the Expression that we will use to drive the position of the Thumb Scrubber // Idea is that we will then update the position of InteractionTracker to move thes scrubber around - this is done via the Pointer Events tied to the TrackCanvas object // Note: this is using ExpressionBuilder this.thumbExpressionAnimation = -tracker.GetReference().Position.X; } private void StartComposition() { // Starting the Expression on the thumb scrubber that will leverage the position of InteractionTracker this.thumbVisual.StartAnimation(nameof(Visual.Offset) + ".X", thumbExpressionAnimation); } #endregion #region IInteractionTrackerOwner #pragma warning disable SA1202 // Elements should be ordered by access public void CustomAnimationStateEntered(InteractionTracker sender, InteractionTrackerCustomAnimationStateEnteredArgs args) { } public void IdleStateEntered(InteractionTracker sender, InteractionTrackerIdleStateEnteredArgs args) { if (IsScrubbing) { this.OnDragStop(); } Debug.WriteLine("Idle"); } public void InertiaStateEntered(InteractionTracker sender, InteractionTrackerInertiaStateEnteredArgs args) { OnDragStart(); } public void InteractingStateEntered(InteractionTracker sender, InteractionTrackerInteractingStateEnteredArgs args) { OnDragStart(); } public void RequestIgnored(InteractionTracker sender, InteractionTrackerRequestIgnoredArgs args) { } public void ValuesChanged(InteractionTracker sender, InteractionTrackerValuesChangedArgs args) { if (IsScrubbing) { var percent = -args.Position.X / this.ActualWidth; this.CurrentPercentage = percent; } } #pragma warning restore SA1202 // Elements should be ordered by access #endregion } } ================================================ FILE: src/BuildCast/DataModel/Episode.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Linq; using System.Threading.Tasks; using BuildCast.Helpers; using Windows.Foundation.Collections; using System.Diagnostics; namespace BuildCast.DataModel { public class Episode { private string _uri; private string _localFilename; private string _title; private string _description; private string _subtitle; private string _itemThumbnail; private Feed _feed; private DateTimeOffset _publishDate; private string _formattedPublishDate; private TimeSpan _duration; /// /// Initializes a new instance of the class. /// Public Constructor required by EF /// public Episode() { } public Episode( string key, string title, string description, string itemThumbnail, DateTimeOffset publishDate, TimeSpan duration, string subtitle, Feed feed = null, string feedId = "") { this.Id = Guid.NewGuid(); this.Key = key; this.LocalFileName = BackgroundDownloadHelper.SafeHashUri(new Uri(this.Key)); this._title = title; this._description = description; this._itemThumbnail = itemThumbnail; this._publishDate = publishDate; this._duration = duration; this.Subtitle = subtitle; if (feed != null) { this._feed = feed; this.FeedId = feed?.Uri?.ToString(); } else if (!string.IsNullOrEmpty(feedId)) { this.FeedId = feedId; } } public Episode(string key, string title, string description, string itemThumbnail) : this( key, title, description, itemThumbnail, DateTimeOffset.MinValue, TimeSpan.MinValue, string.Empty) { } public Guid Id { get; set; } public string Key { get { return _uri; } set { if (value == null) { throw new ArgumentException("Key cannot be null"); } _uri = value; LocalFileName = BackgroundDownloadHelper.SafeHashUri(new Uri(_uri)); } } public string LocalFileName { get => _localFilename; set => _localFilename = value; } public string Title { get => _title; set => _title = value; } public string Description { get => _description; set => _description = value; } public string ItemThumbnail { get => _itemThumbnail; set => _itemThumbnail = value; } public bool IsDownloaded { get; set; } public string FeedId { get; set; } [System.ComponentModel.DataAnnotations.Schema.NotMapped] public Feed Feed { get { if (_feed == null) { _feed = GetFeed(); } return _feed; } set => _feed = value; } public DateTimeOffset PublishDate { get => _publishDate; set => _publishDate = value; } public string FormatPublishDate (Episode e) { string formattedDate = e.PublishDate.Month.ToString() + "/" + e.PublishDate.Day.ToString() + "/" + e.PublishDate.Year.ToString(); return formattedDate; } public TimeSpan Duration { get => _duration; set => _duration = value; } public string Subtitle { get => _subtitle; set => _subtitle = value; } public override string ToString() { return _title ?? string.Empty; } public async Task SetDownloaded() { using (LocalStorageContext lsc = new LocalStorageContext()) { lsc.Update(this); this.IsDownloaded = true; await lsc.SaveChangesAsync(); } } public async Task DeleteDownloaded() { if (IsDownloaded) { using (LocalStorageContext lsc = new LocalStorageContext()) { lsc.Update(this); var localFileName = LocalFileName; LocalFileName = null; IsDownloaded = false; await BackgroundDownloadHelper.DeleteDownload(localFileName); await lsc.SaveChangesAsync(); } } } internal static Episode BuildFromValueSet(ValueSet values) { Episode fi = new Episode( key: values.GetString(nameof(Key)), title: values.GetString(nameof(Title)), description: values.GetString(nameof(Description)), itemThumbnail: values.GetString(nameof(ItemThumbnail)), publishDate: values.GetDateTimeOffset(nameof(PublishDate)), duration: values.GetTimeSpan(nameof(Duration)), subtitle: values.GetString(nameof(Subtitle)), feedId: values.GetString(nameof(FeedId))); return fi; } internal void AddToValueSet(ValueSet values) { ValueSet feedItem = new ValueSet(); values.Add("feeditem", feedItem); feedItem.Add(nameof(Id), Id.ToString()); feedItem.Add(nameof(Key), Key.ToString()); feedItem.Add(nameof(Title), Title); feedItem.Add(nameof(Description), Description); feedItem.Add(nameof(ItemThumbnail), ItemThumbnail); feedItem.Add(nameof(FeedId), FeedId); feedItem.Add(nameof(PublishDate), PublishDate.ToUnixTimeMilliseconds()); feedItem.Add(nameof(Duration), Duration.TotalMilliseconds); feedItem.Add(nameof(Subtitle), Subtitle); } private Feed GetFeed() { return FeedStore.AllFeeds.Where(l => l.Uri.OriginalString == this.FeedId).FirstOrDefault(); } } } ================================================ FILE: src/BuildCast/DataModel/EpisodePlaybackState.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; namespace BuildCast.DataModel { public class EpisodePlaybackState { /// /// Initializes a new instance of the class. /// Public Constructor required by EF /// public EpisodePlaybackState() { } public EpisodePlaybackState(Episode episode) { this.Id = Guid.NewGuid(); this.EpisodeKey = episode?.Key; } public Guid Id { get; set; } public string EpisodeKey { get; set; } public double ListenProgress { get; set; } public double GetPercentDouble (Episode e) { return (ListenProgress / e.Duration.TotalMilliseconds) * 100; } public string GetPercent(Episode e) { return $"{(int)((ListenProgress / e.Duration.TotalMilliseconds) * 100)}%"; } } } ================================================ FILE: src/BuildCast/DataModel/EpisodeWithState.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.DataModel { public class EpisodeWithState { public Episode Episode { get; set; } public EpisodePlaybackState PlaybackState { get; set; } } } ================================================ FILE: src/BuildCast/DataModel/Favorite.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Linq; namespace BuildCast.DataModel { public class Favorite { /// /// Initializes a new instance of the class. /// Public Constructor required by EF /// public Favorite() { } public Favorite(Episode item) { this.Id = Guid.NewGuid(); this.EpisodeId = item.Id; } public Guid Id { get; set; } public Guid EpisodeId { get; set; } internal Episode GetEpisode() { using (var db = new LocalStorageContext()) { return db.EpisodeCache.Where(ep => ep.Id == this.EpisodeId).FirstOrDefault(); } } } } ================================================ FILE: src/BuildCast/DataModel/Feed.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using BuildCast.Helpers; using Windows.ApplicationModel; using Windows.Foundation.Collections; using Windows.Storage.Streams; using Windows.Web.Http; namespace BuildCast.DataModel { public class Feed { public Feed(Uri feedUri, string title, string description, Uri imageUri, string author) { Uri = feedUri; Title = title; Description = description; ImageUri = imageUri; Author = author; } public Uri Uri { get; internal set; } public string Title { get; set; } public string Description { get; set; } public string Author { get; set; } public Uri ImageUri { get; set; } public async Task> GetEpisodes() { using (var db = new LocalStorageContext()) { var cached = db.EpisodeCache.Where(i => i.FeedId == this.Uri.ToString()) .OrderByDescending(ob => ob.PublishDate); if (cached.Count() > 0) { foreach (var item in cached) { item.Feed = this; } return cached.ToList(); } } return await GetNewEpisodesAsync(); } internal async Task> GetNewEpisodesAsync() { List newEpisodes = new List(); var results = await GetEpisodesInternalAsync(); using (var db = new LocalStorageContext()) { foreach (var item in results) { if (db.EpisodeCache.Where(i => (i.Key == item.Key && i.Feed == item.Feed)).Count() == 0) { db.EpisodeCache.Add(item); newEpisodes.Add(item); } } db.SaveChanges(); } return newEpisodes; } internal async Task RemoveTopThreeItems() { using (var db = new LocalStorageContext()) { var episodes = await GetEpisodes(); db.EpisodeCache.Remove(episodes[0]); db.EpisodeCache.Remove(episodes[1]); db.EpisodeCache.Remove(episodes[2]); await db.SaveChangesAsync(); } } internal async Task> GetEpisodesInternalAsync() { switch (this.Uri.Scheme) { case "http": case "https": return await GetEpisodesInternalFromWebAsync(); case "local": return await GetEpisodesInternalFromResAsync(this.Uri.DnsSafeHost); default: return null; } } internal async Task> GetEpisodesInternalFromWebAsync() { HttpClient client = new HttpClient(); using (var stream = await client.GetInputStreamAsync(this.Uri)) { return ParseRssFeed(stream, this); } } internal async Task> GetEpisodesInternalFromResAsync(string name) { var file = await Package.Current.InstalledLocation.GetFileAsync($"Assets\\{name}"); using (var stream = await file.OpenStreamForReadAsync()) { return ParseRssFeed(stream.AsInputStream(), this); } } internal static List ParseRssFeed(IInputStream stream, Feed parent) { List results = new List(); XNamespace ns = "http://purl.org/rss/1.0/"; XNamespace mrss = "http://search.yahoo.com/mrss/"; XNamespace itunes = "http://www.itunes.com/dtds/podcast-1.0.dtd"; var media = mrss.GetName("media"); XDocument xdoc = XDocument.Load(stream.AsStreamForRead()); var items = xdoc.Descendants("item"); foreach (var item in items) { string thumbUri = string.Empty; XAttribute mediadownload; var pubDateStr = item.Element("pubDate")?.Value; DateTimeOffset pubDate = DateTimeOffset.MinValue; if (!string.IsNullOrEmpty(pubDateStr)) { pubDate = DateTimeHelper.ParseDateTimeRFC822(pubDateStr); } var durationStr = item.Element(itunes + "duration")?.Value; TimeSpan duration = TimeSpan.MinValue; if (!string.IsNullOrEmpty(durationStr) && durationStr.Contains(":")) { duration = TimeSpan.Parse(durationStr); } #pragma warning disable SA1108 // Block statements must not contain embedded comments else if (!string.IsNullOrEmpty(durationStr) && !durationStr.Contains(":")) // channel9 #pragma warning restore SA1108 // Block statements must not contain embedded comments { duration = TimeSpan.FromSeconds(Convert.ToInt32(durationStr)); } var subtitleStr = item.Element(itunes + "subtitle")?.Value; if (string.IsNullOrEmpty(subtitleStr)) { var cats = item.Elements("category"); if (cats != null && cats.Count() > 0) { StringBuilder sb = new StringBuilder(); cats.ToList().ForEach(f => { sb.Append($"{f.Value} "); }); subtitleStr = sb.ToString(); } } var desc = item.Element("description"); var content = item.Elements(mrss + "content").FirstOrDefault(); if (content != null) { mediadownload = content.Attribute("url"); var thumbnailElement = content.Element(mrss + "thumbnail"); if (thumbnailElement != null) { var thumbnail = thumbnailElement.Attribute("url"); thumbUri = thumbnail.Value; } } else { var thumbnailElements = item.Elements(mrss + "thumbnail"); XElement thumbElement = null; if (thumbnailElements.Count() >= 4) { thumbElement = thumbnailElements.ElementAt(3); } else if (thumbnailElements.Count() >= 1) { thumbElement = thumbnailElements.ElementAt(0); } if (thumbElement != null) { thumbUri = thumbElement.Attribute("url").Value; } var mediaGroup = item.Elements(mrss + "group"); var mediaUriElements = mediaGroup.Elements(mrss + "content"); XElement mediaUriElement = null; if (mediaUriElements.Count() >= 4) { mediaUriElement = mediaUriElements.ElementAt(3); } if (mediaUriElements.Count() == 1) { mediaUriElement = mediaUriElements.ElementAt(0); } mediadownload = mediaUriElement?.Attribute("url"); } if (mediadownload == null) { var mediadownloadElements = item.Element("enclosure"); mediadownload = mediadownloadElements?.Attribute("url"); } if (mediadownload != null) { var feed = new Episode( title: item.Element("title").Value, description: desc.Value, key: mediadownload.Value, itemThumbnail: thumbUri, feed: parent, publishDate: pubDate, duration: duration, subtitle: subtitleStr); results.Add(feed); } else { Debug.WriteLine($"Skipping"); } } return results; } internal static Feed BuildFeedFromValueSet(ValueSet values) { Feed built = new Feed( feedUri: values.GetURI(nameof(Uri)), title: values.GetString(nameof(Title)), description: values.GetString(nameof(Description)), author: values.GetString(nameof(Author)), imageUri: values.GetURI(nameof(ImageUri))); return built; } internal void AddToValueSet(ValueSet values) { ValueSet feedvs = new ValueSet(); values.Add("feed", feedvs); feedvs.Add(nameof(Description), Description); feedvs.Add(nameof(ImageUri), ImageUri?.ToString()); feedvs.Add(nameof(Title), Title); feedvs.Add(nameof(Uri), Uri?.ToString()); feedvs.Add(nameof(Author), Author); } } } ================================================ FILE: src/BuildCast/DataModel/FeedStore.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.DataModel { using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using BuildCast.Helpers; public class FeedStore { private static List _allFeeds = new List(); static FeedStore() { AddFeeds(); } public static List AllFeeds { get => _allFeeds; } public static async Task CheckDownloadsPresent() { await Task.Run(async () => { try { using (var db = new LocalStorageContext()) { var results2 = from eps in db.EpisodeCache join state in db.PlaybackState on eps.Key equals state.EpisodeKey into myJoin from sub in myJoin.DefaultIfEmpty() where eps.IsDownloaded == true select new EpisodeWithState { Episode = eps, PlaybackState = sub ?? new EpisodePlaybackState() }; foreach (var item in results2) { if ((await BackgroundDownloadHelper.CheckLocalFileExistsFromUriHash(new Uri(item.Episode.Key))) == null && item.Episode.IsDownloaded) { // Item is flagged as downloaded but isn't in the local cache hence update db Debug.WriteLine($"Episode {item.Episode.Title} is flagged as downloaded but file not present"); item.Episode.IsDownloaded = false; } } await db.SaveChangesAsync(); await ScanDownloads(); } } catch (Exception ex) { Debug.WriteLine($"Download scan failed with error {ex.Message}"); throw ex; } }); } private static async Task ScanDownloads() { using (var db = new LocalStorageContext()) { var items = await BackgroundDownloadHelper.GetAllFiles(); foreach (var item in items) { var found = db.EpisodeCache.Where(e => e.LocalFileName == item.Name).FirstOrDefault(); if (found != null && found.IsDownloaded == false) { found.IsDownloaded = true; } } await db.SaveChangesAsync(); } } private static void AddFeeds() { // Developer AllFeeds.Add(new Feed(new Uri("https://s.ch9.ms/Events/Ch9Live/Windows-Community-Standup/RSS"), "Windows Community Standup Sessions", "Sessions for Windows Community Standup", new Uri("https://sec.ch9.ms/content/feedimage.png"), "Microsoft")); AllFeeds.Add(new Feed(new Uri("https://s.ch9.ms/Events/Build/2017/RSS"), "Build 2017 Sessions", "Sessions for Build 2017", new Uri("https://f.ch9.ms/thumbnail/c2635543-13a9-4082-892a-1da55baa9bce.png"), "Microsoft")); AllFeeds.Add(new Feed(new Uri("https://s.ch9.ms/Feeds/RSS"), "Channel9", "Channel 9 keeps you up to date with the latest news and behind the scenes info from Microsoft that developers love to keep up with. From LINQ to SilverLight – Watch videos and hear about all the cool technologies coming and the people behind them.", new Uri("https://sec.ch9.ms/content/feedimage.png"), "Microsoft")); AllFeeds.Add(new Feed(new Uri("https://channel9.msdn.com/Shows/msdevshow/feed/mp4high"), "MS Dev Show - Channel 9", "A NEW podcast for Microsoft developers covering topics such as Azure/cloud, Windows, Windows Phone, .NET, Visual Studio, and more! Hosted by Jason Young and Carl Schweitzer. Check out the full episode archive at http://msdevshow.com. ", new Uri("http://files.channel9.msdn.com/thumbnail/e35f4617-32e1-4f71-a4f3-7691de443952.png"), "Microsoft")); AllFeeds.Add(new Feed(new Uri("https://s.ch9.ms/Shows/XamarinShow/feed"), "The Xamarin Show - Channel 9", "The Xamarin Show is all about native cross-platform mobile development for iOS, Android, macOS, and Windows with Xamarin. Join your host James Montemagno and his guests as they discuss building mobiles apps, integrating SDKs, extending mobile apps, the latest Xamarin news, awesome apps developers are building, and so much more. Follow @JamesMontemagno and send him topics with #XamarinShow of what and who you would like to see on the show.", new Uri("https://f.ch9.ms/thumbnail/64fd4835-d6d3-4004-89ea-3f31b43b5dcf.png"), "Microsoft")); AllFeeds.Add(new Feed(new Uri("http://feeds.twit.tv/ww_video_hd.xml"), "Windows Weekly", "A weekly look at all things Microsoft, including Windows, Windows Phone, Office, Xbox, and more, from two of the foremost Windows watchers in the world, Paul Thurrott of Thurrott.com and Mary Jo Foley of All About Microsoft.\n\nRecords live every Wednesday at 2:00pm Eastern / 11:00am Pacific/ 18:00 UTC.", new Uri("https://elroycdn.twit.tv/sites/default/files/styles/twit_album_art_2048x2048/public/images/shows/windows_weekly/album_art/sd/ww1400videohi.jpg?itok=GHeTXWKP"), "TwIT")); AllFeeds.Add(new Feed(new Uri("https://channel9.msdn.com/Shows/cloud+cover/feed/mp4high"), "Microsoft Azure Cloud Cover Show (HD) - Channel 9", "Microsoft Azure Cloud Cover is your eye on the Microsoft Cloud. Join Chris Risner and Thiago Almeida as they cover Microsoft Azure, demonstrate features, discuss the latest news &#43; announcements, and share tips and tricks.", new Uri("https://f.ch9.ms/thumbnail/19ef0544-3f18-4e11-8379-0326d8e493b9.png"), "Microsoft")); AllFeeds.Add(new Feed(new Uri("https://channel9.msdn.com/Blogs/One-Dev-Minute/feed"), "One-Dev-minute", "These short videos - usually 1-3 minutes - give developers a quick look at different Windows technologies and how to use them to build great apps.", new Uri("https://f.ch9.ms/thumbnail/3e1f59af-78b2-41ea-adcd-30856ed4c756.png"), "Microsoft")); AllFeeds.Add(new Feed(new Uri("https://channel9.msdn.com/Shows/GALs/feed/mp4high"), "GALs", "GALs is a show about the women who work in Tech (at Microsoft or outside) from three ladies that currently work on the Channel 9 team. Golnaz Alibeigi, Soumow Atitallah, and Kaitlin McKinnon have started a new series featuring women in Tech who work in development, management, marketing and research who have interesting stories to share about their success in the industry and ideas on how to grow diversity in IT.", new Uri("https://f.ch9.ms/thumbnail/37d388be-13a3-48f0-9063-5deddcec05d4.jpg"), "Microsoft")); AllFeeds.Add(new Feed(new Uri("https://channel9.msdn.com/Shows/C9-goingnative/feed/mp4high"), "Going Native", "C9::GoingNative is a show dedicated to native development with an emphasis on C&#43;&#43; and C&#43;&#43; developers. Each episode will have a segment including an interview with a native dev in his/her native habitat (office) where we'll talk about what they do and how they use native code and associated toolchains, as well as get their insights and wisdom—geek out. There will be a small news component or segment, but the show will primarily focus on technical tips and conversations with active C/C&#43;&#43; coders, demonstrations of new core language features, libraries, compilers, toolchains, etc. We will bring in guests from around the industry for conversations, tutorials, and demos. As we progress, we will also have segments on other native languages (C, D, Go, etc...). It's all native all the time. You, our viewers, fly first class. We'll deliver what you want to see. That's how it works. Go native! ---&gt; Please follow us at @C9GoingNative on Twitter!", new Uri("http://files.channel9.msdn.com/itunesimage/0593d56e-a15c-4666-b229-f2250bfdd485.png"), "Microsoft")); AllFeeds.Add(new Feed(new Uri("https://s.ch9.ms/Events/Build/2016/RSS"), "Build 2016 Sessions", "Sessions for Build 2016", new Uri("http://files.channel9.msdn.com/thumbnail/dc1f8b69-a4a3-422c-b7a7-b29a9183bc79.jpg"), "Microsoft")); } } } ================================================ FILE: src/BuildCast/DataModel/InkNote.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Linq; namespace BuildCast.DataModel { public class InkNote { /// /// Initializes a new instance of the class. /// Public Constructor required by EF /// public InkNote() { } public InkNote(string episodeKey, double time) { Id = Guid.NewGuid(); this.EpisodeKey = episodeKey; this.Time = time; } public bool HasInk { get; set; } public string EpisodeKey { get; set; } public byte[] Thumbnail { get; set; } public double Time { get; internal set; } public string NoteText { get; internal set; } public Guid Id { get; set; } internal Episode GetEpisode() { using (var db = new LocalStorageContext()) { return db.EpisodeCache.Where(ep => ep.Key == this.EpisodeKey).FirstOrDefault(); } } } } ================================================ FILE: src/BuildCast/DataModel/InkNoteData.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.IO; using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Storage.Streams; using Windows.UI.Xaml.Media.Imaging; namespace BuildCast.DataModel { public class InkNoteData { /// /// Initializes a new instance of the class. /// Public constructor required by EF /// public InkNoteData() { } public Guid InkMeme { get; set; } public byte[] Ink { get; set; } public byte[] ImageBytes { get; set; } public Guid Id { get; set; } public async Task GetImage(Action onOpened) { return await GetImage(this.ImageBytes, onOpened); } public async Task GetImageStream() { return await GetImageStream(this.ImageBytes); } private static async Task GetImageStream(byte[] imageBytes) { InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream(); await RandomAccessStream.CopyAsync(imageBytes.AsBuffer().AsStream().AsRandomAccessStream(), randomAccessStream); randomAccessStream.Seek(0); return randomAccessStream; } private async Task GetImage(byte[] imageBytes, Action onOpened) { BitmapImage bitmapImage = new BitmapImage(); bitmapImage.ImageOpened += (s, e) => { onOpened(); }; InMemoryRandomAccessStream randomAccessStream = await GetImageStream(imageBytes); bitmapImage.SetSource(randomAccessStream); return bitmapImage; } } } ================================================ FILE: src/BuildCast/DataModel/LocalStorageContext.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Threading.Tasks; using BuildCast.Helpers; using Microsoft.EntityFrameworkCore; using Windows.Storage; namespace BuildCast.DataModel { // documnetation is here: https://docs.microsoft.com/en-us/ef/core/get-started/uwp/getting-started // under package manager console, use Add-Migration every time this class updated public class LocalStorageContext : DbContext { private static AsyncInitilizer _initializer = new AsyncInitilizer(); private DbSet _favorites; private DbSet _episodeCache; private DbSet _memes; private DbSet _inkNotes; private DbSet _playbackState; static LocalStorageContext() { _initializer.InitializeWith(CheckForDatabase); } public DbSet Favorites { get { _initializer.CheckInitialized(); return _favorites; } set { _favorites = value; } } public DbSet EpisodeCache { get { _initializer.CheckInitialized(); return _episodeCache; } set { _episodeCache = value; } } public DbSet Memes { get { _initializer.CheckInitialized(); return _memes; } set { _memes = value; } } public DbSet MemeData { get { _initializer.CheckInitialized(); return _inkNotes; } set { _inkNotes = value; } } public DbSet PlaybackState { get { _initializer.CheckInitialized(); return _playbackState; } set { _playbackState = value; } } public static void CheckMigrations() { _initializer.CheckInitialized(); using (var db = new LocalStorageContext()) { db.Database.Migrate(); } } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Data Source=buildcast.db"); } private static async Task CheckForDatabase() { var mainDbFileName = "buildcast.db"; var mainDbAssetPath = $"ms-appx:///Assets/{mainDbFileName}"; var data = Windows.Storage.ApplicationData.Current.LocalFolder; var exists = await data.TryGetItemAsync(mainDbFileName); if (exists == null) { var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(mainDbAssetPath)).AsTask().ConfigureAwait(false); var database = await file.CopyAsync(data).AsTask().ConfigureAwait(false); } } } } ================================================ FILE: src/BuildCast/DataModel/NowPlayingState.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Linq; using System.Threading.Tasks; namespace BuildCast.DataModel { public class NowPlayingState { private static Feed _currentFeed; private static Episode _currentEpisode; private static TimeSpan _currentTime; public Episode CurrentEpisode { get => _currentEpisode; set => _currentEpisode = value; } public Feed CurrentFeed { get => _currentFeed; set => _currentFeed = value; } public TimeSpan CurrentTime { get => _currentTime; set => _currentTime = value; } public bool HasItem { get { return _currentEpisode != null; } } public async Task LoadStateAsync() { await Task.Run(() => { DePersistLastPlayed(out Feed feed, out Episode episode, out TimeSpan position); this.CurrentFeed = feed; this.CurrentEpisode = episode; }); } public async Task> HandlePlayRequest(Episode paramItem) { var shouldSwitch = ShouldSwitch(paramItem); if (shouldSwitch) { _currentEpisode = paramItem; _currentFeed = _currentEpisode?.Feed; _currentTime = TimeSpan.Zero; } if (_currentFeed != null && _currentEpisode != null) { await LoadEpisodePlaybackState(); PersistLastPlayed(_currentFeed, _currentEpisode, _currentTime); } return new Tuple(shouldSwitch, paramItem != null); } public bool HandlePlayRequest(InkNote paramItem) { Episode newEpisode = null; using (LocalStorageContext lsc = new LocalStorageContext()) { newEpisode = lsc.EpisodeCache.Where(ep => ep.Key == paramItem.EpisodeKey).FirstOrDefault(); } var shouldSwitch = ShouldSwitch(newEpisode); if (shouldSwitch) { _currentEpisode = newEpisode; _currentFeed = _currentEpisode?.Feed; _currentTime = TimeSpan.Zero; } _currentTime = TimeSpan.FromMilliseconds(paramItem.Time); if (_currentFeed != null) { PersistLastPlayed(_currentFeed, _currentEpisode, _currentTime); } return paramItem != null; } public bool ShouldSwitch(Episode parameter) { if (parameter == null) { return false; } if (_currentFeed == null || (_currentFeed != null && string.Compare(parameter.Key, _currentEpisode?.Key, StringComparison.Ordinal) != 0)) { return true; } return false; } public void SetNowPlaying(Feed feed, Episode feedItem, TimeSpan currenttime) { _currentFeed = feed; _currentEpisode = feedItem; _currentTime = currenttime; } public async Task PeristEpisodePlaybackState() { using (LocalStorageContext lsc = new LocalStorageContext()) { EpisodePlaybackState state = lsc.PlaybackState.Where(i => i.EpisodeKey == _currentEpisode.Key).FirstOrDefault(); if (state == null) { state = new EpisodePlaybackState(this.CurrentEpisode); lsc.PlaybackState.Add(state); } else { state.ListenProgress = this.CurrentTime.TotalMilliseconds; lsc.PlaybackState.Update(state); } await lsc.SaveChangesAsync(); } } public async Task LoadEpisodePlaybackState() { await Task.Run(async () => { using (LocalStorageContext lsc = new LocalStorageContext()) { EpisodePlaybackState state = null; if (_currentEpisode != null) { state = lsc.PlaybackState.Where(i => i.EpisodeKey == CurrentEpisode.Key).FirstOrDefault(); if (state == null) { EpisodePlaybackState eps = new EpisodePlaybackState(CurrentEpisode); lsc.PlaybackState.Add(eps); await lsc.SaveChangesAsync(); } else { CurrentTime = TimeSpan.FromMilliseconds(state.ListenProgress); } } } }); } private void PersistLastPlayed(Feed feed, Episode episode, TimeSpan timespan) { var settings = Windows.Storage.ApplicationData.Current.LocalSettings; var composite = new Windows.Storage.ApplicationDataCompositeValue(); composite["feedUri"] = feed.Uri.ToString(); composite["feedTitle"] = feed.Title; composite["feedDescription"] = feed.Description; composite["feedImageUri"] = feed.ImageUri.ToString(); composite["feedAuthor"] = feed.Author; composite["episodeUri"] = episode.Key.ToString(); settings.Values["currentState"] = composite; } private void DePersistLastPlayed(out Feed feed, out Episode episode, out TimeSpan timespan) { var settings = Windows.Storage.ApplicationData.Current.LocalSettings; var composite = (Windows.Storage.ApplicationDataCompositeValue)settings.Values["currentState"]; if (composite != null) { feed = new Feed( feedUri: new Uri((string)composite["feedUri"]), title: (string)composite["feedTitle"], description: (string)composite["feedDescription"], imageUri: new Uri((string)composite["feedImageUri"]), author: (string)composite["feedAuthor"]); var uri = (string)composite["episodeUri"]; using (LocalStorageContext lcs = new LocalStorageContext()) { episode = lcs.EpisodeCache.Where(e => e.Key == uri).FirstOrDefault(); } } else { feed = null; episode = null; timespan = TimeSpan.MinValue; } } } } ================================================ FILE: src/BuildCast/GlobalSuppressions.cs ================================================ // This file is used by Code Analysis to maintain SuppressMessage // attributes that are applied to this project. // Project-level suppressions either have no target or are given // a specific target and scoped to a namespace, type, member, etc. [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.ReadabilityRules", "SA1124:Do not use regions", Justification = "")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1633:File must have header", Justification = "")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1008:Opening parenthesis must be spaced correctly", Justification = "", Scope = "type", Target = "~T:BuildCast.Services.RemotePlayService")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "type", Target = "~T:BuildCast.Services.RemotePlayService")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~P:BuildCast.Services.Navigation.NavigationService.NavigationCommand.ViewModelType")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.Navigation.NavigationService.NavigationCommand.LoadViewModel(Windows.UI.Xaml.Controls.Page)~System.Threading.Tasks.Task")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.Navigation.NavigationService.NavigationCommand.GoBackAsync~System.Threading.Tasks.Task")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.Navigation.IPageWithViewModel`1.UpdateBindings")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~P:BuildCast.Services.IRemoteSystemDescription.Name")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~P:BuildCast.Services.IRemoteSystemDescription.Glyph")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.IAvailableSystemsObserver.Removed(BuildCast.Services.IRemoteSystemDescription)")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.IRemotePlayerService.SubscribeSystemsChange(BuildCast.Services.IAvailableSystemsObserver)~System.IDisposable")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.IRemotePlayerService.FindDevices~System.Threading.Tasks.Task{System.Boolean}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.LayoutRules", "SA1516:Elements must be separated by blank line", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.IRemotePlayerService.RemoteActivation(Windows.ApplicationModel.Background.BackgroundTaskDeferral,Windows.ApplicationModel.AppService.AppServiceConnection)")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.SpacingRules", "SA1009:Closing parenthesis must be spaced correctly", Justification = "", Scope = "member", Target = "~M:BuildCast.Services.PlayerService.GetSourceForUri~System.Threading.Tasks.Task{System.}")] ================================================ FILE: src/BuildCast/Helpers/AsyncHelpers.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Threading; using System.Threading.Tasks; namespace BuildCast.Helpers { /// /// A helper class to assist with the Asynchronous class initialization pattern /// /// public class AsyncInitilizer { private ManualResetEvent _initializeLock = new ManualResetEvent(false); private bool _hasInitialized; private bool _hasErrored; private Exception _initializationException; /// /// Initializes a new instance of the class. /// public AsyncInitilizer() { } internal void InitializeWith(Func initializationTask) { try { initializationTask().ContinueWith((e) => { try { if (e.Exception != null) { _hasErrored = true; _initializationException = e.Exception; } } finally { _hasInitialized = true; _initializeLock.Set(); } }); } catch (Exception synchronous) { _hasErrored = true; _initializationException = synchronous; } } internal void CheckInitialized() { if (!_hasInitialized) { _initializeLock.WaitOne(); } if (_hasErrored) { throw new Exception($"Initialization of {typeof(T).FullName} failed with an exception"); } } } } ================================================ FILE: src/BuildCast/Helpers/BackgroundDownloadHelper.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using System.Text; using System.Threading.Tasks; using BuildCast.DataModel; using Microsoft.Toolkit.Uwp.Helpers; using Microsoft.Toolkit.Uwp.Notifications; using Windows.ApplicationModel.Background; using Windows.Networking.BackgroundTransfer; using Windows.Security.Cryptography; using Windows.Security.Cryptography.Core; using Windows.Storage; using Windows.Storage.Streams; using Windows.UI.Notifications; namespace BuildCast.Helpers { public enum DownloadStartResult { Started, Error, AllreadyDownloaded, } public static class BackgroundDownloadHelper { private static ToastNotifier _notifier = ToastNotificationManager.CreateToastNotifier(); public static async Task Download(Uri sourceUri) { var hash = SafeHashUri(sourceUri); var file = await CheckLocalFileExistsFromUriHash(sourceUri); var downloadingAlready = await IsDownloading(sourceUri); if (file == null && !downloadingAlready) { await Task.Run(() => { var task = StartDownload(sourceUri, BackgroundTransferPriority.High, hash); task.ContinueWith((state) => { if (state.Exception != null) { DispatcherHelper.ExecuteOnUIThreadAsync(async () => { await UIHelpers.ShowContentAsync($"An error occured with this download {state.Exception}"); }); } else { Debug.WriteLine("Download Completed"); } }); }); return DownloadStartResult.Started; } else if (file != null) { await SetItemDownloaded(hash); await UIHelpers.ShowContentAsync($"Already downloaded."); return DownloadStartResult.AllreadyDownloaded; } else { return DownloadStartResult.Error; } } public static async Task IsDownloading(Uri sourceUri) { var downloads = await BackgroundDownloader.GetCurrentDownloadsAsync(); if (downloads.Where(dl => dl.RequestedUri == sourceUri).FirstOrDefault() != null) { return true; } return false; } public static async Task CheckLocalFileExistsFromUriHash(Uri sourceUri) { string hash = SafeHashUri(sourceUri); return await CheckLocalFileExists(hash); } public static async Task> GetAllFiles() { var files = await ApplicationData.Current.LocalCacheFolder.GetItemsAsync(); return files; } public static string SafeHashUri(Uri sourceUri) { string safeUri = sourceUri.ToString().ToLower(); var hash = Hash(safeUri); return hash; } public static async Task UpdateDownloadedFromCache() { using (LocalStorageContext c = new LocalStorageContext()) { var foundInDb = c.EpisodeCache.FirstOrDefault(); foundInDb.IsDownloaded = true; await c.SaveChangesAsync(); } } public static void RegisterBackgroundTask(IBackgroundTrigger trigger) { var builder = new BackgroundTaskBuilder(); builder.Name = "DownloadCompleteTrigger"; builder.SetTrigger(trigger); BackgroundTaskRegistration task = builder.Register(); } public static async Task AttachToDownloads() { var downloads = await BackgroundDownloader.GetCurrentDownloadsAsync(); foreach (var download in downloads) { Progress progressCallback = new Progress(DownloadProgress); await download.AttachAsync().AsTask(progressCallback); } } /// /// Deletes the downloaded file. /// /// filename /// Task public static async Task DeleteDownload(string fileName) { var fileItem = await ApplicationData.Current.LocalCacheFolder.TryGetItemAsync(fileName); if (fileItem != null) { await fileItem.DeleteAsync(); } } /// /// This will be called when the app is background activated as a result of a download trigger /// Enables the database to be updated according to result of download /// /// A background task instance /// a task internal static async Task CheckCompletionResult(IBackgroundTaskInstance instance) { var deferral = instance.GetDeferral(); var trigger = instance.TriggerDetails as BackgroundTransferCompletionGroupTriggerDetails; if (trigger != null) { foreach (var item in trigger.Downloads) { // TODO: handle other bad statuses if (item.Progress.Status == BackgroundTransferStatus.Error) { await item.ResultFile.DeleteAsync(); } else if (item.Progress.Status == BackgroundTransferStatus.Completed) { await SetItemDownloaded(item); } } } deferral?.Complete(); } private static async Task SetItemDownloaded(DownloadOperation item) { await SetItemDownloaded(item.ResultFile.Name); DownloadProgress(item); } private static async Task SetItemDownloaded(string filename) { using (var db = new LocalStorageContext()) { var dbItems = db.EpisodeCache.Where(ep => ep.LocalFileName == filename); foreach (var dbMatch in dbItems) { dbMatch.IsDownloaded = true; } await db.SaveChangesAsync(); } } private static async Task CheckLocalFileExists(string fileName) { StorageFile file = null; try { file = await ApplicationData.Current.LocalCacheFolder.GetFileAsync(fileName); var props = await file.GetBasicPropertiesAsync(); if (props.Size == 0) { await file.DeleteAsync(); return null; } } catch (FileNotFoundException) { } return file; } private static string Hash(string input) { IBuffer buffer = CryptographicBuffer.ConvertStringToBinary(input, BinaryStringEncoding.Utf8); HashAlgorithmProvider hashAlgorithm = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha1); var hashByte = hashAlgorithm.HashData(buffer).ToArray(); var sb = new StringBuilder(hashByte.Length * 2); foreach (byte b in hashByte) { sb.Append(b.ToString("x2")); } return sb.ToString(); } private static async Task IsFileEmpty(StorageFile file) { if (file != null) { var props = await file.GetBasicPropertiesAsync(); return props.Size == 0; } return true; } private static async Task GetLocalFileFromUri(Uri sourceUri) { string filename = GetFileNameFromUri(sourceUri); StorageFile file = null; try { file = await ApplicationData.Current.LocalCacheFolder.CreateFileAsync(filename); } catch (FileNotFoundException) { } return file; } private static async Task GetLocalFileFromName(string filename) { StorageFile file = null; try { file = await ApplicationData.Current.LocalCacheFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); } catch (FileNotFoundException) { } return file; } private static string GetFileNameFromUri(Uri sourceUri) { return System.IO.Path.GetFileName(sourceUri.PathAndQuery); } private static async Task StartDownload(Uri target, BackgroundTransferPriority priority, string localFilename) { var result = await BackgroundExecutionManager.RequestAccessAsync(); StorageFile destinationFile; destinationFile = await GetLocalFileFromName(localFilename); var group = BackgroundTransferGroup.CreateGroup(Guid.NewGuid().ToString()); group.TransferBehavior = BackgroundTransferBehavior.Serialized; BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); // this will cause the app to be activated when the download completes and // CheckCompletionResult will be called for the final download state RegisterBackgroundTask(completionGroup.Trigger); BackgroundDownloader downloader = new BackgroundDownloader(completionGroup); downloader.TransferGroup = group; group.TransferBehavior = BackgroundTransferBehavior.Serialized; CreateNotifications(downloader); DownloadOperation download = downloader.CreateDownload(target, destinationFile); download.Priority = priority; completionGroup.Enable(); Progress progressCallback = new Progress(DownloadProgress); var downloadTask = download.StartAsync().AsTask(progressCallback); string tag = GetFileNameFromUri(target); CreateToast(tag, localFilename); try { await downloadTask; // Will occur after download completes ResponseInformation response = download.GetResponseInformation(); } catch (Exception) { Debug.WriteLine("Download exception"); } } private static void DownloadProgress(DownloadOperation obj) { Debug.WriteLine(obj.Progress.ToString()); var progress = (double)obj.Progress.BytesReceived / (double)obj.Progress.TotalBytesToReceive; string tag = GetFileNameFromUri(obj.RequestedUri); UpdateToast(obj.ResultFile.Name, progress); } private static void CreateNotifications(BackgroundDownloader downloader) { var successToastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01); successToastXml.GetElementsByTagName("text").Item(0).InnerText = "Downloads completed successfully."; ToastNotification successToast = new ToastNotification(successToastXml); downloader.SuccessToastNotification = successToast; var failureToastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01); failureToastXml.GetElementsByTagName("text").Item(0).InnerText = "At least one download completed with failure."; ToastNotification failureToast = new ToastNotification(failureToastXml); downloader.FailureToastNotification = failureToast; } private static void CreateToast(string title, string tag) { ToastContent toastContent = new ToastContent() { Visual = new ToastVisual() { BindingGeneric = new ToastBindingGeneric() { Children = { new AdaptiveText() { Text = "File downloading...", }, new AdaptiveProgressBar() { Title = title, Value = new BindableProgressBarValue("progressValue"), ValueStringOverride = new BindableString("p"), Status = "Downloading...", }, }, }, }, }; var data = new Dictionary { { "progressValue", "0" }, { "p", $"cool" }, // TODO: better than cool }; // And create the toast notification ToastNotification notification = new ToastNotification(toastContent.GetXml()) { Tag = tag, Data = new NotificationData(data), }; // And then send the toast ToastNotificationManager.CreateToastNotifier().Show(notification); } private static void UpdateToast(string toastTag, double progressValue) { var data = new Dictionary { { "progressValue", progressValue.ToString() }, { "p", $"cool" }, // TODO: better than cool }; try { _notifier.Update(new NotificationData(data), toastTag); } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } } } } ================================================ FILE: src/BuildCast/Helpers/BufferingVisualManager.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Numerics; using System.Threading.Tasks; using Windows.UI; using Windows.UI.Composition; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace BuildCast.Helpers { public class BufferingVisualManager { private Compositor _compositor; private PointLight _pointLight; private AmbientLight _ambientLight; private TextBlock _bufferingMessage; private Panel _textHolder; private FrameworkElement _lightingTarget; public bool IsBuffering { get; private set; } public async Task StartBuffering(Panel textHolder, FrameworkElement lightingTarget, bool lightingdisabled) { if (!this.IsBuffering) { this.IsBuffering = true; this._textHolder = textHolder; if (!lightingdisabled) { this._lightingTarget = lightingTarget; this.ConfigureLighting(this._lightingTarget); } this._bufferingMessage = await this.ConfigureText(this._textHolder); } } public void StopBuffering(bool lightingdisabled) { if (this.IsBuffering) { CompositionScopedBatch batch = null; if (!lightingdisabled) { batch = this.RemoveLighting(); } else { batch = this._compositor.CreateScopedBatch(CompositionBatchTypes.Animation); } this.RemoveText(batch, this._bufferingMessage); if (batch != null) { batch.Completed += (o, e) => { this.IsBuffering = false; }; batch.End(); } } } public void SetCompositor(Compositor compositor) { this._compositor = compositor; } private async Task ConfigureText(Panel target) { TextBlock tb = new TextBlock(); tb.FontSize = 30; tb.Text = "Loading.."; tb.HorizontalAlignment = HorizontalAlignment.Center; tb.VerticalAlignment = VerticalAlignment.Center; tb.SetValue(Grid.RowProperty, 2); target.Children.Add(tb); var visual = tb.GetVisual(); var batch = visual.ApplyImplicitAnimation(TimeSpan.FromSeconds(2)); Func delega = null; delega = async () => { if (batch.IsEnded) { visual.Opacity = 1.0f; } else { await Window.Current.Dispatcher.RunIdleAsync((s) => { delega(); }); } }; await Window.Current.Dispatcher.RunIdleAsync((s) => { delega(); }); return tb; } private void RemoveText(CompositionScopedBatch batch, TextBlock textElement) { if (textElement != null) { var visual = textElement.GetVisual(); visual.Opacity = 0; } if (batch != null) { batch.Completed += (o, e) => { this._textHolder.Children.Remove(this._bufferingMessage); this._bufferingMessage = null; }; } } private void ConfigureLighting(FrameworkElement element) { if (this._compositor != null) { // get interop visual for element var text = element.GetVisual(); this._ambientLight = this._compositor.CreateAmbientLight(); this._ambientLight.Color = Colors.White; this._ambientLight.Targets.Add(text); this._pointLight = this._compositor.CreatePointLight(); this._pointLight.Color = Colors.White; this._pointLight.CoordinateSpace = text; this._pointLight.Targets.Add(text); // starts out to the left; vertically centered; light's z-offset is related to fontsize this._pointLight.Offset = new Vector3(0, (float)element.ActualHeight / 2, 480); // simple offset.X animation that runs forever var animation = this._compositor.CreateScalarKeyFrameAnimation(); animation.InsertKeyFrame(1, (float)element.ActualWidth); animation.Duration = TimeSpan.FromMilliseconds(800); animation.IterationBehavior = AnimationIterationBehavior.Forever; animation.Direction = AnimationDirection.Alternate; var animation2 = this._compositor.CreateColorKeyFrameAnimation(); animation2.Duration = TimeSpan.FromSeconds(2); animation2.InsertKeyFrame(1, Color.FromArgb(0xFF, 0x50, 0x50, 0x50)); this._ambientLight.StartAnimation(nameof(AmbientLight.Color), animation2); this._pointLight.StartAnimation("Offset.X", animation); } } private CompositionScopedBatch RemoveLighting() { CompositionScopedBatch returnBatch = null; if (this._compositor != null) { returnBatch = this._compositor.CreateScopedBatch(CompositionBatchTypes.Animation); var animation2 = this._compositor.CreateColorKeyFrameAnimation(); animation2.Duration = TimeSpan.FromSeconds(2); animation2.InsertKeyFrame(1, Colors.White); this._ambientLight.StartAnimation("Color", animation2); var animation = this._compositor.CreateScalarKeyFrameAnimation(); animation.Duration = TimeSpan.FromSeconds(2); animation.InsertKeyFrame(1, 40.0f); this._pointLight.StartAnimation("LinearAttenuation", animation); returnBatch.Completed += (o, e) => { if (this._pointLight != null) { this._pointLight.Dispose(); this._pointLight = null; } if (this._ambientLight != null) { this._ambientLight.Dispose(); this._ambientLight = null; } }; } return returnBatch; } } } ================================================ FILE: src/BuildCast/Helpers/DateTimeHelper.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Diagnostics; using System.Globalization; using System.Text; namespace BuildCast.Helpers { public static class DateTimeHelper { public static DateTimeOffset ParseDateTimeRFC822(string dateTimeString) { StringBuilder dateTimeStringBuilder = new StringBuilder(dateTimeString.Trim()); if (dateTimeStringBuilder.Length < 18) { throw new FormatException("Invalid date format. Expected date in RFC 822 format"); } if (dateTimeStringBuilder[3] == ',') { // There is a leading (e.g.) "Tue, ", strip it off dateTimeStringBuilder.Remove(0, 4); // There's supposed to be a space here but some implementations dont have one RemoveExtraWhiteSpaceAtStart(dateTimeStringBuilder); } ReplaceMultipleWhiteSpaceWithSingleWhiteSpace(dateTimeStringBuilder); if (char.IsDigit(dateTimeStringBuilder[1])) { // two-digit day, we are good } else { dateTimeStringBuilder.Insert(0, '0'); } if (dateTimeStringBuilder.Length < 19) { throw new FormatException("Invalid date format. Expected date in RFC 822 format"); } bool thereAreSeconds = dateTimeStringBuilder[17] == ':'; int timeZoneStartIndex; if (thereAreSeconds) { timeZoneStartIndex = 21; } else { timeZoneStartIndex = 18; } string timeZoneSuffix = dateTimeStringBuilder.ToString().Substring(timeZoneStartIndex); dateTimeStringBuilder.Remove(timeZoneStartIndex, dateTimeStringBuilder.Length - timeZoneStartIndex); bool isUtc; dateTimeStringBuilder.Append(NormalizeTimeZone(timeZoneSuffix, out isUtc)); string wellFormattedString = dateTimeStringBuilder.ToString(); DateTimeOffset theTime; string parseFormat; if (thereAreSeconds) { parseFormat = "dd MMM yyyy HH:mm:ss zzz"; } else { parseFormat = "dd MMM yyyy HH:mm zzz"; } if (DateTimeOffset.TryParseExact(wellFormattedString, parseFormat, CultureInfo.InvariantCulture.DateTimeFormat, isUtc ? DateTimeStyles.AdjustToUniversal : DateTimeStyles.None, out theTime)) { return theTime; } throw new FormatException("Invalid date format. Expected date in RFC 822 format"); } private static string NormalizeTimeZone(string rfc822TimeZone, out bool isUtc) { isUtc = false; // return a string in "-08:00" format if (rfc822TimeZone[0] == '+' || rfc822TimeZone[0] == '-') { // the time zone is supposed to be 4 digits but some feeds omit the initial 0 StringBuilder result = new StringBuilder(rfc822TimeZone); if (result.Length == 4) { // the timezone is +/-HMM. Convert to +/-HHMM result.Insert(1, '0'); } result.Insert(3, ':'); return result.ToString(); } switch (rfc822TimeZone) { case "UT": case "Z": isUtc = true; return "-00:00"; case "GMT": return "-00:00"; case "A": return "-01:00"; case "B": return "-02:00"; case "C": return "-03:00"; case "D": case "EDT": return "-04:00"; case "E": case "EST": case "CDT": return "-05:00"; case "F": case "CST": case "MDT": return "-06:00"; case "G": case "MST": case "PDT": return "-07:00"; case "H": case "PST": return "-08:00"; case "I": return "-09:00"; case "K": return "-10:00"; case "L": return "-11:00"; case "M": return "-12:00"; case "N": return "+01:00"; case "O": return "+02:00"; case "P": return "+03:00"; case "Q": return "+04:00"; case "R": return "+05:00"; case "S": return "+06:00"; case "T": return "+07:00"; case "U": return "+08:00"; case "V": return "+09:00"; case "W": return "+10:00"; case "X": return "+11:00"; case "Y": return "+12:00"; default: return string.Empty; } } private static void RemoveExtraWhiteSpaceAtStart(StringBuilder stringBuilder) { int i = 0; while (i < stringBuilder.Length) { if (!char.IsWhiteSpace(stringBuilder[i])) { break; } ++i; } if (i > 0) { stringBuilder.Remove(0, i); } } private static void ReplaceMultipleWhiteSpaceWithSingleWhiteSpace(StringBuilder builder) { int index = 0; int whiteSpaceStart = -1; while (index < builder.Length) { if (char.IsWhiteSpace(builder[index])) { if (whiteSpaceStart < 0) { whiteSpaceStart = index; // normalize all white spaces to be ' ' so that the date time parsing works builder[index] = ' '; } } else if (whiteSpaceStart >= 0) { if (index > whiteSpaceStart + 1) { // there are at least 2 spaces... replace by 1 builder.Remove(whiteSpaceStart, index - whiteSpaceStart - 1); index = whiteSpaceStart + 1; } whiteSpaceStart = -1; } ++index; } // we have already trimmed the start and end so there cannot be a trail of white spaces in the end Debug.Assert(builder.Length == 0 || builder[builder.Length - 1] != ' ', "The string builder doesnt end in a white space"); } } } ================================================ FILE: src/BuildCast/Helpers/EnumToBooleanConverter.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using Windows.UI.Xaml.Data; namespace BuildCast.Helpers { public class EnumToBooleanConverter : IValueConverter { public Type EnumType { get; set; } public object Convert(object value, Type targetType, object parameter, string language) { if (parameter is string enumString) { if (!Enum.IsDefined(EnumType, value)) { throw new ArgumentException("value must be an Enum!"); } var enumValue = Enum.Parse(EnumType, enumString); return enumValue.Equals(value); } throw new ArgumentException("parameter must be an Enum name!"); } public object ConvertBack(object value, Type targetType, object parameter, string language) { if (parameter is string enumString) { return Enum.Parse(EnumType, enumString); } throw new ArgumentException("parameter must be an Enum name!"); } } } ================================================ FILE: src/BuildCast/Helpers/EpisodeCommands.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Windows.Input; using BuildCast.DataModel; namespace BuildCast.Helpers { public class FavoriteCommand : ICommand { #pragma warning disable CS0067 public event EventHandler CanExecuteChanged; #pragma warning restore CS0067 public bool CanExecute(object parameter) => true; public void Execute(object parameter) { if (parameter == null || (parameter as Episode) == null) { return; } using (var db = new LocalStorageContext()) { db.Favorites.Add(new Favorite(parameter as Episode)); db.SaveChanges(); } } } public class DeleteEpisodeNoteCommand : ICommand { /// /// Initializes a new instance of the class. /// public DeleteEpisodeNoteCommand() { } #pragma warning disable CS0067 public event EventHandler CanExecuteChanged; #pragma warning restore CS0067 public bool CanExecute(object parameter) => true; public void Execute(object parameter) { var noteParameter = parameter as dynamic; if (noteParameter == null) { return; } System.Guid noteId = noteParameter?.InkId; switch (noteParameter.Type) { case "Ink": using (var db = new LocalStorageContext()) { var ink = db.Memes.Remove(db.Memes.Find(noteId)); db.SaveChanges(); } break; case "Bookmark": using (var db = new LocalStorageContext()) { var ink = db.Memes.Remove(db.Memes.Find(noteId)); db.SaveChanges(); } break; } } } public class DeleteEpisodeCommand : ICommand { /// /// Initializes a new instance of the class. /// public DeleteEpisodeCommand() { } #pragma warning disable CS0067 public event EventHandler CanExecuteChanged; #pragma warning restore CS0067 public bool CanExecute(object parameter) => true; public async void Execute(object parameter) { var episodeWithState = parameter as EpisodeWithState; Episode episode = episodeWithState?.Episode; if (episode == null) { episode = parameter as Episode; } if (episode == null) { return; } if (episode != null) { await episode.DeleteDownloaded(); } } } public class UnfavoriteCommand : ICommand { #pragma warning disable CS0067 public event EventHandler CanExecuteChanged; #pragma warning restore CS0067 public UnfavoriteCommand() { } public bool CanExecute(object parameter) => true; public void Execute(object parameter) { var episodeWithState = parameter as EpisodeWithState; Episode episode = episodeWithState?.Episode; if (episode == null) { episode = parameter as Episode; } if (episode == null) { return; } using (var db = new LocalStorageContext()) { foreach (Favorite favEntity in db.Favorites) { if (favEntity.EpisodeId == episode.Id) { db.Favorites.Remove(favEntity); break; } } db.SaveChanges(); } } } public class DownloadCommand : ICommand { public DownloadCommand() { } #pragma warning disable CS0067 public event EventHandler CanExecuteChanged; #pragma warning restore CS0067 public bool CanExecute(object parameter) => true; public void Execute(object parameter) { var episodeWithState = parameter as EpisodeWithState; Episode episode = episodeWithState?.Episode; if (episode == null) { episode = parameter as Episode; } if (episode == null) { return; } var task = BackgroundDownloadHelper.Download(new Uri(episode.Key)); task.ContinueWith(async (state) => { if (state.Result == DownloadStartResult.AllreadyDownloaded) { await episode.SetDownloaded(); } }); System.Diagnostics.Debug.WriteLine("Downloading episode..."); } } public class BindingProxyCommand : ICommand { private ICommand _realCommand; public event EventHandler CanExecuteChanged; public ICommand RealCommand { get => _realCommand; set { _realCommand = value; _realCommand.CanExecuteChanged += OnRealCanExecute; } } public bool CanExecute(object parameter) => _realCommand?.CanExecute(parameter) ?? false; public void Execute(object parameter) => _realCommand.Execute(parameter); private void OnRealCanExecute(object sender, EventArgs e) => CanExecuteChanged?.Invoke(sender, e); } } ================================================ FILE: src/BuildCast/Helpers/Json.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System.Threading.Tasks; using Newtonsoft.Json; namespace BuildCast.Helpers { public static class Json { public static async Task ToObjectAsync(string value) { return await Task.Run(() => { return JsonConvert.DeserializeObject(value); }); } public static async Task StringifyAsync(object value) { return await Task.Run(() => { return JsonConvert.SerializeObject(value); }); } } } ================================================ FILE: src/BuildCast/Helpers/LinqExtensions.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Collections.Generic; using System.Linq; namespace BuildCast.Helpers { public static class LinqExtensions { public static IEnumerable LambdaDistinct(this IEnumerable list, Func lambda) { return list.Distinct(new LambdaCompare(lambda)); } public class LambdaCompare : IEqualityComparer { private readonly Func _expr; public LambdaCompare(Func lambda) { _expr = lambda; } public bool Equals(T x, T y) { return _expr(x, y); } public int GetHashCode(T obj) { return obj.GetHashCode(); } } } } ================================================ FILE: src/BuildCast/Helpers/NavigationAnimationHelpers.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Hosting; using Windows.UI.Xaml.Media.Animation; namespace BuildCast.Helpers { public static class NavigationAnimationHelpers { public static bool NavigateWithFadeOutgoing(this Frame frame, object parameter, Type destination) { ImplicitHideFrameContent(frame); return frame.Navigate(destination, parameter); } private static void ImplicitHideFrameContent(Frame frame) { if (frame.Content != null) { SetImplicitHide(frame.Content as UIElement); } } private static void SetImplicitHide(UIElement thisPtr) { ElementCompositionPreview.SetImplicitHideAnimation(thisPtr, VisualHelpers.CreateOpacityAnimation(0.4, 0)); Canvas.SetTop(thisPtr, 1); } } } ================================================ FILE: src/BuildCast/Helpers/RelayCommand.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Windows.Input; namespace BuildCast.Helpers { public class RelayCommand : ICommand { private readonly Action _execute; private readonly Func _canExecute; public RelayCommand(Action execute) : this(execute, null) { } public RelayCommand(Action execute, Func canExecute) { _execute = execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute = canExecute; } public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) => _canExecute == null || _canExecute(); public void Execute(object parameter) => _execute(); public void OnCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty); } #pragma warning disable SA1402 // File may only contain a single class public class RelayCommand : ICommand #pragma warning restore SA1402 // File may only contain a single class { private readonly Action _execute; private readonly Func _canExecute; public RelayCommand(Action execute) : this(execute, null) { } public RelayCommand(Action execute, Func canExecute) { _execute = execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute = canExecute; } public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) => _canExecute == null || _canExecute((T)parameter); public void Execute(object parameter) => _execute((T)parameter); public void OnCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty); } } ================================================ FILE: src/BuildCast/Helpers/SettingsStorageExtensions.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.IO; using System.Threading.Tasks; using Windows.Storage; namespace BuildCast.Helpers { public static class SettingsStorageExtensions { // Use this extension methods to store and retrieve in local and roaming app data // For more info regarding storing and retrieving app data, // Documentation: https://docs.microsoft.com/windows/uwp/app-settings/store-and-retrieve-app-data private const string FILE_EXTENSION = ".json"; public static bool IsRoamingStorageAvailable(this ApplicationData appData) { return appData.RoamingStorageQuota == 0; } public static async Task SaveAsync(this StorageFolder folder, string name, T content) { var file = await folder.CreateFileAsync(GetFileName(name), CreationCollisionOption.ReplaceExisting); var fileContent = await Json.StringifyAsync(content); await FileIO.WriteTextAsync(file, fileContent); } public static async Task ReadAsync(this StorageFolder folder, string name) { if (!File.Exists(Path.Combine(folder.Path, GetFileName(name)))) { return default(T); } var file = await folder.GetFileAsync($"{name}.json"); var fileContent = await FileIO.ReadTextAsync(file); return await Json.ToObjectAsync(fileContent); } public static async Task SaveAsync(this ApplicationDataContainer settings, string key, T value) { settings.Values[key] = await Json.StringifyAsync(value); } public static async Task ReadAsync(this ApplicationDataContainer settings, string key) { if (settings.Values.TryGetValue(key, out object obj)) { return await Json.ToObjectAsync((string)obj); } return default(T); } private static string GetFileName(string name) { return string.Concat(name, FILE_EXTENSION); } } } ================================================ FILE: src/BuildCast/Helpers/TitleBarHelper.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System.ComponentModel; using Windows.ApplicationModel.Core; using Windows.UI.Xaml; namespace BuildCast.Helpers { public class TitleBarHelper : INotifyPropertyChanged { private static TitleBarHelper _instance = new TitleBarHelper(); private static CoreApplicationViewTitleBar _coreTitleBar; private Thickness _titlePosition; private Visibility _titleVisibility; /// /// Initializes a new instance of the class. /// public TitleBarHelper() { _coreTitleBar = CoreApplication.GetCurrentView().TitleBar; _coreTitleBar.LayoutMetricsChanged += CoreTitleBar_LayoutMetricsChanged; _titlePosition = CalculateTilebarOffset(_coreTitleBar.SystemOverlayLeftInset, _coreTitleBar.Height); _titleVisibility = Visibility.Visible; } public event PropertyChangedEventHandler PropertyChanged; public static TitleBarHelper Instance { get { return _instance; } } public CoreApplicationViewTitleBar TitleBar { get { return _coreTitleBar; } } public Thickness TitlePosition { get { return _titlePosition; } set { if (value.Left != _titlePosition.Left || value.Top != _titlePosition.Top) { _titlePosition = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TitlePosition))); } } } public Visibility TitleVisibility { get { return _titleVisibility; } set { _titleVisibility = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TitleVisibility))); } } public void ExitFullscreen() { TitleVisibility = Visibility.Visible; } public void GoFullscreen() { TitleVisibility = Visibility.Collapsed; } private void CoreTitleBar_LayoutMetricsChanged(CoreApplicationViewTitleBar sender, object args) { TitlePosition = CalculateTilebarOffset(_coreTitleBar.SystemOverlayLeftInset, _coreTitleBar.Height); } private Thickness CalculateTilebarOffset(double leftPosition, double height) { // top position should be 6 pixels for a 32 pixel high titlebar hence scale by actual height var correctHeight = height / 32 * 6; return new Thickness(leftPosition + 12, correctHeight, 0, 0); } } } ================================================ FILE: src/BuildCast/Helpers/UIHelpers.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Threading.Tasks; using Microsoft.Toolkit.Uwp.Helpers; using Windows.UI.Xaml.Controls; namespace BuildCast.Helpers { public class UIHelpers { public static async Task ShowContentAsync(string content) { await DispatcherHelper.ExecuteOnUIThreadAsync(async () => { ContentDialog cd = new ContentDialog { CloseButtonText = "Ok", Content = content, }; await cd.ShowAsync(); }); } } } ================================================ FILE: src/BuildCast/Helpers/ValueSetHelper.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using Windows.Foundation.Collections; namespace BuildCast.Helpers { public static class ValueSetHelper { public static ValueSet GetValueSet(this ValueSet values, string key) { ValueSet result = null; if (values.TryGetValue(key, out object retrieveObject)) { result = (ValueSet)retrieveObject; } return result; } public static TimeSpan GetTimeSpan(this ValueSet values, string key) { TimeSpan value = TimeSpan.MinValue; if (values.TryGetValue(key, out object retrieveObject)) { if (retrieveObject != null) { value = TimeSpan.FromMilliseconds((double)retrieveObject); } } return value; } public static DateTimeOffset GetDateTimeOffset(this ValueSet values, string key) { DateTimeOffset value = DateTimeOffset.MinValue; if (values.TryGetValue(key, out object retrieveObject)) { if (retrieveObject != null) { value = DateTimeOffset.FromUnixTimeMilliseconds((long)retrieveObject); } } return value; } public static Uri GetURI(this ValueSet values, string key) { Uri value = null; if (values.TryGetValue(key, out object retrieveObject)) { if (retrieveObject != null) { value = new Uri((string)retrieveObject); } } return value; } public static string GetString(this ValueSet values, string key) { string result = string.Empty; if (values.TryGetValue(key, out object retrieveObject)) { result = (string)retrieveObject; } return result; } } } ================================================ FILE: src/BuildCast/Helpers/VisualHelpers.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using Windows.UI.Composition; using Windows.UI.Xaml; using Windows.UI.Xaml.Hosting; using Windows.UI.Xaml.Media; namespace BuildCast.Helpers { public static class VisualHelpers { public static Visual GetVisual(this UIElement element) { return ElementCompositionPreview.GetElementVisual(element); } public static CompositionCommitBatch ApplyImplicitAnimation(this Visual target, TimeSpan duration) { var myBatch = target.Compositor.GetCommitBatch(CompositionBatchTypes.Animation); target.Opacity = 0.0f; ImplicitAnimationCollection implicitAnimationCollection = target.Compositor.CreateImplicitAnimationCollection(); implicitAnimationCollection[nameof(Visual.Opacity)] = CreateOpacityAnimation(target.Compositor, duration); target.ImplicitAnimations = implicitAnimationCollection; return myBatch; } public static KeyFrameAnimation CreateOpacityAnimation(Compositor compositor, TimeSpan duration) { ScalarKeyFrameAnimation kf = compositor.CreateScalarKeyFrameAnimation(); kf.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); kf.Duration = duration; kf.Target = "Opacity"; return kf; } public static void SetSize(this Visual v, FrameworkElement element) { v.Size = new System.Numerics.Vector2((float)element.ActualWidth, (float)element.ActualHeight); } public static void FadeVisual(this Visual v, double seconds) { var fadeAnimation = CreateImplicitFadeAnimation(seconds); v.ImplicitAnimations = Window.Current.Compositor.CreateImplicitAnimationCollection(); v.ImplicitAnimations.Add(nameof(Visual.Opacity), fadeAnimation); } // TODO: kill this function public static ScalarKeyFrameAnimation CreateOpacityAnimation(double seconds) { var animation = Window.Current.Compositor.CreateScalarKeyFrameAnimation(); animation.Target = "Opacity"; animation.Duration = TimeSpan.FromSeconds(seconds); animation.InsertKeyFrame(0, 0); animation.InsertKeyFrame(0.25f, 0); animation.InsertKeyFrame(1, 1); return animation; } public static ICompositionAnimationBase CreateOpacityAnimation(double seconds, float finalvalue) { var animation = Window.Current.Compositor.CreateScalarKeyFrameAnimation(); animation.Target = nameof(Visual.Opacity); animation.Duration = TimeSpan.FromSeconds(seconds); animation.InsertKeyFrame(1, finalvalue); return animation; } public static ICompositionAnimationBase CreateAnimationGroup(CompositionAnimation listContentShowAnimations, ScalarKeyFrameAnimation listContentOpacityAnimations) { var group = Window.Current.Compositor.CreateAnimationGroup(); group.Add(listContentShowAnimations); group.Add(listContentOpacityAnimations); return group; } public static void EnableLayoutImplicitAnimations(this UIElement element, TimeSpan t) { Compositor compositor; var result = element.GetVisual(); compositor = result.Compositor; var elementImplicitAnimation = compositor.CreateImplicitAnimationCollection(); elementImplicitAnimation[nameof(Visual.Offset)] = CreateOffsetAnimation(compositor, t); result.ImplicitAnimations = elementImplicitAnimation; } private static CompositionAnimation CreateImplicitFadeAnimation(double seconds) { var animation = Window.Current.Compositor.CreateScalarKeyFrameAnimation(); animation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); animation.Target = nameof(Visual.Opacity); animation.Duration = TimeSpan.FromSeconds(seconds); return animation; } private static KeyFrameAnimation CreateOffsetAnimation(Compositor compositor, TimeSpan duration) { Vector3KeyFrameAnimation kf = compositor.CreateVector3KeyFrameAnimation(); kf.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); kf.Duration = duration; kf.Target = "Offset"; return kf; } public static CompositionAnimation CreateHorizontalOffsetAnimation(double seconds, float offset, double delaySeconds, bool from) { var animation = Window.Current.Compositor.CreateScalarKeyFrameAnimation(); if (delaySeconds != 0.0) { animation.DelayBehavior = AnimationDelayBehavior.SetInitialValueBeforeDelay; animation.DelayTime = TimeSpan.FromSeconds(delaySeconds); } animation.Duration = TimeSpan.FromSeconds(seconds); animation.Target = "Translation.X"; if (from) { animation.InsertKeyFrame(0, offset); animation.InsertKeyFrame(1, 0); } else { animation.InsertKeyFrame(1, offset); } return animation; } public static CompositionAnimation CreateHorizontalOffsetAnimation(double seconds, float offset, double delaySeconds) { return CreateHorizontalOffsetAnimation(seconds, offset, delaySeconds, true); } public static CompositionAnimation CreateVerticalOffsetAnimation(double seconds, float offset, double delaySeconds, bool from) { var animation = Window.Current.Compositor.CreateScalarKeyFrameAnimation(); if (delaySeconds != 0.0) { animation.DelayBehavior = AnimationDelayBehavior.SetInitialValueBeforeDelay; animation.DelayTime = TimeSpan.FromSeconds(delaySeconds); } animation.Duration = TimeSpan.FromSeconds(seconds); animation.Target = "Translation.Y"; if (from) { animation.InsertKeyFrame(0, offset); animation.InsertKeyFrame(1, 0); } else { animation.InsertKeyFrame(1, offset); } return animation; } public static CompositionAnimation CreateVerticalOffsetAnimation(double seconds, float offset, double delaySeconds) { return CreateVerticalOffsetAnimation(seconds, offset, delaySeconds, true); } public static CompositionAnimation CreateVerticalOffsetAnimationFrom(double seconds, float offset) { return CreateVerticalOffsetAnimation(seconds, offset, 0.0f); } public static CompositionAnimation CreateVerticalOffsetAnimationTo(double seconds, float offset) { return CreateVerticalOffsetAnimation(seconds, offset, 0.0f, false); } public static T GetVisualChildByName(this FrameworkElement root, string name) where T : FrameworkElement { var chil = VisualTreeHelper.GetChild(root, 0); FrameworkElement child = null; int count = VisualTreeHelper.GetChildrenCount(root); for (int i = 0; i < count && child == null; i++) { var current = (FrameworkElement)VisualTreeHelper.GetChild(root, i); if (current != null && current.Name != null && current.Name == name) { child = current; break; } else { child = current.GetVisualChildByName(name); } } return child as T; } } } ================================================ FILE: src/BuildCast/Microsoft.BuildCast.ruleset ================================================  ================================================ FILE: src/BuildCast/Migrations/20170927020747_initial.Designer.cs ================================================ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using BuildCast.DataModel; namespace BuildCast.Migrations { [DbContext(typeof(LocalStorageContext))] [Migration("20170927020747_initial")] partial class initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { modelBuilder .HasAnnotation("ProductVersion", "1.1.2"); modelBuilder.Entity("BuildCast.DataModel.Episode", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("Description"); b.Property("Duration"); b.Property("FeedId"); b.Property("IsDownloaded"); b.Property("ItemThumbnail"); b.Property("Key"); b.Property("LocalFileName"); b.Property("PublishDate"); b.Property("Subtitle"); b.Property("Title"); b.HasKey("Id"); b.ToTable("EpisodeCache"); }); modelBuilder.Entity("BuildCast.DataModel.EpisodePlaybackState", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("EpisodeKey"); b.Property("ListenProgress"); b.HasKey("Id"); b.ToTable("PlaybackState"); }); modelBuilder.Entity("BuildCast.DataModel.Favorite", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("EpisodeId"); b.HasKey("Id"); b.ToTable("Favorites"); }); modelBuilder.Entity("BuildCast.DataModel.InkNote", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("EpisodeKey"); b.Property("HasInk"); b.Property("NoteText"); b.Property("Thumbnail"); b.Property("Time"); b.HasKey("Id"); b.ToTable("Memes"); }); modelBuilder.Entity("BuildCast.DataModel.InkNoteData", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ImageBytes"); b.Property("Ink"); b.Property("InkMeme"); b.HasKey("Id"); b.ToTable("MemeData"); }); } } } ================================================ FILE: src/BuildCast/Migrations/20170927020747_initial.cs ================================================ using System; using System.Collections.Generic; using Microsoft.EntityFrameworkCore.Migrations; namespace BuildCast.Migrations { public partial class initial : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "EpisodeCache", columns: table => new { Id = table.Column(nullable: false), Description = table.Column(nullable: true), Duration = table.Column(nullable: false), FeedId = table.Column(nullable: true), IsDownloaded = table.Column(nullable: false), ItemThumbnail = table.Column(nullable: true), Key = table.Column(nullable: true), LocalFileName = table.Column(nullable: true), PublishDate = table.Column(nullable: false), Subtitle = table.Column(nullable: true), Title = table.Column(nullable: true) }, constraints: table => { table.PrimaryKey("PK_EpisodeCache", x => x.Id); }); migrationBuilder.CreateTable( name: "PlaybackState", columns: table => new { Id = table.Column(nullable: false), EpisodeKey = table.Column(nullable: true), ListenProgress = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_PlaybackState", x => x.Id); }); migrationBuilder.CreateTable( name: "Favorites", columns: table => new { Id = table.Column(nullable: false), EpisodeId = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_Favorites", x => x.Id); }); migrationBuilder.CreateTable( name: "Memes", columns: table => new { Id = table.Column(nullable: false), EpisodeKey = table.Column(nullable: true), HasInk = table.Column(nullable: false), NoteText = table.Column(nullable: true), Thumbnail = table.Column(nullable: true), Time = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_Memes", x => x.Id); }); migrationBuilder.CreateTable( name: "MemeData", columns: table => new { Id = table.Column(nullable: false), ImageBytes = table.Column(nullable: true), Ink = table.Column(nullable: true), InkMeme = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_MemeData", x => x.Id); }); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "EpisodeCache"); migrationBuilder.DropTable( name: "PlaybackState"); migrationBuilder.DropTable( name: "Favorites"); migrationBuilder.DropTable( name: "Memes"); migrationBuilder.DropTable( name: "MemeData"); } } } ================================================ FILE: src/BuildCast/Migrations/LocalStorageContextModelSnapshot.cs ================================================ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using BuildCast.DataModel; namespace BuildCast.Migrations { [DbContext(typeof(LocalStorageContext))] partial class LocalStorageContextModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { modelBuilder .HasAnnotation("ProductVersion", "1.1.2"); modelBuilder.Entity("BuildCast.DataModel.Episode", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("Description"); b.Property("Duration"); b.Property("FeedId"); b.Property("IsDownloaded"); b.Property("ItemThumbnail"); b.Property("Key"); b.Property("LocalFileName"); b.Property("PublishDate"); b.Property("Subtitle"); b.Property("Title"); b.HasKey("Id"); b.ToTable("EpisodeCache"); }); modelBuilder.Entity("BuildCast.DataModel.EpisodePlaybackState", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("EpisodeKey"); b.Property("ListenProgress"); b.HasKey("Id"); b.ToTable("PlaybackState"); }); modelBuilder.Entity("BuildCast.DataModel.Favorite", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("EpisodeId"); b.HasKey("Id"); b.ToTable("Favorites"); }); modelBuilder.Entity("BuildCast.DataModel.InkNote", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("EpisodeKey"); b.Property("HasInk"); b.Property("NoteText"); b.Property("Thumbnail"); b.Property("Time"); b.HasKey("Id"); b.ToTable("Memes"); }); modelBuilder.Entity("BuildCast.DataModel.InkNoteData", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ImageBytes"); b.Property("Ink"); b.Property("InkMeme"); b.HasKey("Id"); b.ToTable("MemeData"); }); } } } ================================================ FILE: src/BuildCast/Package.appxmanifest ================================================  BuildCast jeclarke Assets\StoreLogo.png AudioVisualizer.dll ================================================ FILE: src/BuildCast/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("BuildCast")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("BuildCast")] [assembly: AssemblyCopyright("Copyright © 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: ComVisible(false)] ================================================ FILE: src/BuildCast/Properties/Default.rd.xml ================================================ ================================================ FILE: src/BuildCast/Services/ElementThemeExtended.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using Windows.UI.Xaml; namespace BuildCast.Services { /// /// Defines the type of theme /// public enum ElementThemeExtended { Default = ElementTheme.Default, Light = ElementTheme.Light, Dark = ElementTheme.Dark, Custom = 1000 } /// /// Defines the different Picture-in-picture modes /// public enum PipModes { SingleView, MultiView } } ================================================ FILE: src/BuildCast/Services/IAvailableSystemsObserver.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.Services { public interface IAvailableSystemsObserver { void Add(IRemoteSystemDescription description); void Removed(IRemoteSystemDescription description); } } ================================================ FILE: src/BuildCast/Services/IFullscreenPage.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.Services { public interface IFullscreenPage { void ExitFullscreen(); void EnterFullscreen(); } } ================================================ FILE: src/BuildCast/Services/IPlayerService.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Threading.Tasks; using BuildCast.DataModel; namespace BuildCast.Services { public interface IPlayerService { NowPlayingState NowPlaying { get; } Task SetNewItem(Uri currentItem, TimeSpan currentTime, bool startPlayback, string localFilename); void SetTime(TimeSpan currentTime); Task Play(Episode episode, TimeSpan playTime); void Pause(); void FastForward(); void Rewind(); Task GetBitmapForCurrentFrameFromLocalFile(); } } ================================================ FILE: src/BuildCast/Services/IRemoteConnection.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Threading.Tasks; namespace BuildCast.Services { public interface IRemoteConnection : IDisposable { Task Play(); Task Pause(); Task Seek(TimeSpan timeStamp); Task Disconnect(); Task FastForward(); Task Rewind(); Task GetRemoteBitmap(); } } ================================================ FILE: src/BuildCast/Services/IRemotePlayerService.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Collections.Generic; using System.Threading.Tasks; using Windows.ApplicationModel.AppService; using Windows.ApplicationModel.Background; namespace BuildCast.Services { public interface IRemotePlayerService { IEnumerable AvailableSystems { get; } IDisposable SubscribeSystemsChange(IAvailableSystemsObserver observer); Task FindDevices(); void RemoteActivation(BackgroundTaskDeferral backgroundTaskDeferral, AppServiceConnection appServiceConnection); } } ================================================ FILE: src/BuildCast/Services/IRemoteSystemDescription.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System.Threading.Tasks; namespace BuildCast.Services { public interface IRemoteSystemDescription { string Id { get; } string Name { get; } string Glyph { get; } Task PlayTo(); } } ================================================ FILE: src/BuildCast/Services/Navigation/FrameAdapter.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using BuildCast.Helpers; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace BuildCast.Services.Navigation { public class FrameAdapter : IFrameAdapter { private Frame _internalFrame; public event NavigatedEventHandler Navigated { add => _internalFrame.Navigated += value; remove => _internalFrame.Navigated -= value; } public event NavigatingCancelEventHandler Navigating { add => _internalFrame.Navigating += value; remove => _internalFrame.Navigating -= value; } public event NavigationFailedEventHandler NavigationFailed { add => _internalFrame.NavigationFailed += value; remove => _internalFrame.NavigationFailed -= value; } public event NavigationStoppedEventHandler NavigationStopped { add => _internalFrame.NavigationStopped += value; remove => _internalFrame.NavigationStopped -= value; } public FrameAdapter(Frame internalFrame) { _internalFrame = internalFrame; } public bool IsNavigating { get; private set; } public bool CanGoBack => _internalFrame.CanGoBack; public bool CanGoForward => _internalFrame.CanGoForward; public object Content => _internalFrame.Content; public void GoForward() { _internalFrame.GoForward(); } public void GoBack() => _internalFrame.GoBack(); public string GetNavigationState() => _internalFrame.GetNavigationState(); public void SetNavigationState(string navigationState) => _internalFrame.SetNavigationState(navigationState); public bool Navigate(Type sourcePageType, object parameter) { return _internalFrame.NavigateWithFadeOutgoing(parameter, sourcePageType); } } } ================================================ FILE: src/BuildCast/Services/Navigation/IFrameAdapter.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using Windows.UI.Xaml.Navigation; namespace BuildCast.Services.Navigation { public interface IFrameAdapter { event NavigatedEventHandler Navigated; event NavigatingCancelEventHandler Navigating; event NavigationFailedEventHandler NavigationFailed; event NavigationStoppedEventHandler NavigationStopped; object Content { get; } bool CanGoBack { get; } bool CanGoForward { get; } string GetNavigationState(); void GoBack(); void GoForward(); bool Navigate(Type sourcePageType, object parameter); void SetNavigationState(string navigationState); } } ================================================ FILE: src/BuildCast/Services/Navigation/INavigableTo.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System.Threading.Tasks; using Windows.UI.Xaml.Navigation; namespace BuildCast.Services.Navigation { public interface INavigableTo { /// /// The event that gets called by the Navigation Service after navigation has completed. /// /// /// This gets called prior to /// /// The navigation stack characteristic of the navigation. /// The parameter passed to the navigation service /// An awaitable Task Task NavigatedTo(NavigationMode navigationMode, object parameter); } } ================================================ FILE: src/BuildCast/Services/Navigation/INavigationCommand.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System.Threading.Tasks; namespace BuildCast.Services.Navigation { public interface INavigationCommand { bool CanExecute(T parameter); Task ExecuteAsync(T parameter); Task GoBackAsync(); } public interface INavigationCommand : INavigationCommand { bool CanExecute(); Task ExecuteAsync(); } } ================================================ FILE: src/BuildCast/Services/Navigation/INavigationService.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Threading.Tasks; using BuildCast.DataModel; namespace BuildCast.Services.Navigation { public interface INavigationService { event EventHandler IsNavigatingChanged; event EventHandler Navigated; bool CanGoBack { get; } bool IsNavigating { get; } Task NavigateToPodcastsAsync(); Task NavigateToFavoritesAsync(); Task NavigateToDownloadsAsync(); Task NavigateToNotesAsync(); Task NavigateToNowPlayingAsync(); Task NavigateToSettingsAsync(); Task NavigateToFeedAsync(Feed feed); Task NavigateToEpisodeAsync(Episode episode); Task NavigateToPlayerAsync(Episode episode); Task NavigateToPlayerAsync(InkNote inkNote); Task NavigateToInkNoteAsync(InkNote inkNote); Task GoBackAsync(); } } ================================================ FILE: src/BuildCast/Services/Navigation/IPageWithViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.Services.Navigation { public interface IPageWithViewModel where T : class { T ViewModel { get; set; } void UpdateBindings(); } } ================================================ FILE: src/BuildCast/Services/Navigation/NavigationService.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Collections.Generic; using System.Threading.Tasks; using Autofac; using BuildCast.DataModel; using BuildCast.ViewModels; using BuildCast.Views; using Microsoft.Toolkit.Uwp.Helpers; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace BuildCast.Services.Navigation { public class NavigationService : INavigationService { private bool _isNavigating; /// /// Initializes a new instance of the class. /// /// /// public NavigationService(IFrameAdapter frameAdapter, IComponentContext iocResolver) { Frame = frameAdapter; AutofacDepedencyResolver = iocResolver; // Investigate a way to put these mappings into the IOC container so that we don't have a hard dependency on the page types for multiplatform PageViewModels = new Dictionary(); RegisterPageViewModel(); RegisterPageViewModel(); RegisterPageViewModel(); RegisterPageViewModel(); RegisterPageViewModel(); RegisterPageViewModel(); RegisterPageViewModel(); RegisterPageViewModel(); RegisterPageViewModel(); RegisterPageViewModel(); Frame.Navigated += Frame_Navigated; } public event EventHandler IsNavigatingChanged; public event EventHandler Navigated; public Task NavigateToPodcastsAsync() => NavigateToPage(); public Task NavigateToFavoritesAsync() => NavigateToPage(); public Task NavigateToDownloadsAsync() => NavigateToPage(); public Task NavigateToNotesAsync() => NavigateToPage(); public Task NavigateToNowPlayingAsync() => NavigateToPage(); public Task NavigateToSettingsAsync() => NavigateToPage(); public Task NavigateToFeedAsync(Feed feed) => NavigateToPage(feed); public Task NavigateToEpisodeAsync(Episode episode) => NavigateToPage(episode); public Task NavigateToPlayerAsync(Episode episode) => NavigateToPage(episode); public Task NavigateToPlayerAsync(DataModel.InkNote inkNote) => NavigateToPage(inkNote); public Task NavigateToInkNoteAsync(DataModel.InkNote inkNote) => NavigateToPage(inkNote); public bool CanGoBack => Frame.CanGoBack; private IComponentContext AutofacDepedencyResolver { get; } private IFrameAdapter Frame { get; } private delegate Task NavigatedToViewModelDelegate(object page, object parameter, NavigationEventArgs navigationArgs); private Dictionary PageViewModels { get; } public bool IsNavigating { get => _isNavigating; set { if (value != _isNavigating) { _isNavigating = value; IsNavigatingChanged?.Invoke(this, _isNavigating); // Check that navigation just finished if (!_isNavigating) { // Navigation finished Navigated?.Invoke(this, EventArgs.Empty); } } } } /// /// Navigate in the back direction /// /// A task that can be awaited public async Task GoBackAsync() { if (Frame.CanGoBack) { IsNavigating = true; Page navigatedPage = await DispatcherHelper.ExecuteOnUIThreadAsync(() => { Frame.GoBack(); return Frame.Content as Page; }); } } /// /// The Navigated event. This event is raised BEFORE /// /// The frame /// The args coming from the frame private void Frame_Navigated(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e) { IsNavigating = false; if (PageViewModels.ContainsKey(e.SourcePageType)) { var loadViewModelDelegate = PageViewModels[e.SourcePageType]; var ignoredTask = loadViewModelDelegate(e.Content, e.Parameter, e); } } private void RegisterPageViewModel() where TViewModel : class { NavigatedToViewModelDelegate navigatedTo = async (page, parameter, navArgs) => { if (page is IPageWithViewModel pageWithVM) { pageWithVM.ViewModel = AutofacDepedencyResolver.Resolve(); if (pageWithVM.ViewModel is INavigableTo navVM) { await navVM.NavigatedTo(navArgs.NavigationMode, parameter); } // Async loading pageWithVM.UpdateBindings(); } }; PageViewModels[typeof(TPage)] = navigatedTo; } private Task NavigateToPage() { return NavigateToPage(parameter: null); } private async Task NavigateToPage(object parameter) { // Early out if already in the middle of a Navigation if (_isNavigating) { return; } _isNavigating = true; await DispatcherHelper.ExecuteOnUIThreadAsync(() => { Frame.Navigate(typeof(TPage), parameter: parameter); }); } } } ================================================ FILE: src/BuildCast/Services/PlayerService.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Diagnostics; using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using AudioVisualizer; using BuildCast.Controls; using BuildCast.DataModel; using BuildCast.Helpers; using Microsoft.Toolkit.Uwp.Helpers; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.Media.Core; using Windows.Media.Editing; using Windows.Media.Playback; using Windows.Storage; using Windows.Storage.Streams; using Windows.System.Display; using Windows.UI.Composition; using Windows.UI.Core; using Windows.UI.Xaml; namespace BuildCast.Services { public class PlayerService : IPlayerService { private static PlayerService _current; private NowPlayingState _nowPlayingState; private MediaPlayer _mediaPlayer; private AudioVisualizer.PlaybackSource _source; private string _localFilename; private Uri _sourceUri; private TimeSpan _startTime; private DispatcherTimer _playerEventDebounceTimer; private CoreDispatcher _dispatcher; private object _syncLock = new object(); private Timeline _timelinectrl; private MediaPlaybackState _nextEventtoFire; private MediaPlaybackState _lastEventFired; private StorageFile _currentFile; public event EventHandler PlayPauseChanged; public event EventHandler MediaLoaded; public event EventHandler MediaLoading; public event EventHandler VisualizationSourceChanged; public static PlayerService Current { get { if (_current == null) { _current = new PlayerService(); } return _current; } } public CompositionBrush GetBrush(Compositor compositor) { var surface = _mediaPlayer.GetSurface(compositor); var surfaceBrush = compositor.CreateSurfaceBrush(surface.CompositionSurface); surfaceBrush.Stretch = CompositionStretch.Uniform; return surfaceBrush; } public async Task HandlePlayRequest(BuildCast.DataModel.InkNote i) { var shouldPlay = _nowPlayingState.HandlePlayRequest(i); await SetNewItem(new Uri(_nowPlayingState.CurrentEpisode.Key), _nowPlayingState.CurrentTime, shouldPlay, _nowPlayingState.CurrentEpisode.Id.ToString()); } public async Task HandlePlayRequest(Episode e) { var shouldPlay = await _nowPlayingState.HandlePlayRequest(e); if (_nowPlayingState.CurrentEpisode != null && shouldPlay.Item1) { // if we need to switch to a new item, set new item and open it for playback await SetNewItem(new Uri(_nowPlayingState.CurrentEpisode.Key), _nowPlayingState.CurrentTime, shouldPlay.Item2, _nowPlayingState.CurrentEpisode.Id.ToString()); } else if (_nowPlayingState.CurrentEpisode != null && !shouldPlay.Item1) { // if we don't need to switch (being asked to play what is already playing), just set the time - unless the time is already set. if (_startTime <= TimeSpan.Zero) { SetTime(_nowPlayingState.CurrentTime); } if (shouldPlay.Item2) { _mediaPlayer.Play(); } } } #region Playback Commands public async Task Play(Episode ep, TimeSpan playTime) { await Microsoft.Toolkit.Uwp.Helpers.DispatcherHelper.AwaitableRunAsync(_dispatcher, () => { if (_mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.None) { return SetNewItem(new Uri(ep.Key), playTime, true, string.Empty); } else { SetTime(playTime); return HandlePlayRequest(ep); } }); } public void Pause() { var ignored = DispatcherHelper.ExecuteOnUIThreadAsync(() => { _mediaPlayer.Pause(); }); } public async Task TogglePlayPaused() { if (NowPlaying.HasItem) { switch (_mediaPlayer.PlaybackSession.PlaybackState) { case MediaPlaybackState.None: await OpenAndPlayNewItem(); break; case MediaPlaybackState.Playing: _mediaPlayer.Pause(); break; case MediaPlaybackState.Paused: _mediaPlayer.Play(); break; } } } public void Rewind() { var ignored = DispatcherHelper.ExecuteOnUIThreadAsync(() => _mediaPlayer.PlaybackSession.Position = _mediaPlayer.PlaybackSession.Position - TimeSpan.FromSeconds(10)); } public void FastForward() { var ignored = DispatcherHelper.ExecuteOnUIThreadAsync(() => _mediaPlayer.PlaybackSession.Position = _mediaPlayer.PlaybackSession.Position + TimeSpan.FromSeconds(30)); } #endregion public async Task SetNewItem(Uri currentItem, TimeSpan currentTime, bool startPlayback, string localFilename) { var wasPlaying = _mediaPlayer?.PlaybackSession.PlaybackState == MediaPlaybackState.Playing; ClearPlayback(); _startTime = currentTime; _sourceUri = currentItem; _localFilename = localFilename; if (startPlayback) { await OpenAndPlayNewItem(); } } public void SetTime(TimeSpan currentTime) { if (_mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Playing || _mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Paused) { _mediaPlayer.PlaybackSession.Position = currentTime; _timelinectrl?.SetTime(currentTime, _mediaPlayer.PlaybackSession.NaturalDuration); } else { _startTime = currentTime; } } public void SetTimeControls(Timeline timeCtrl) { this._timelinectrl = timeCtrl; } public async Task GetBitmapForCurrentFrameFromLocalFile() { if (_currentFile != null) { return await GetBitmapBytesFromLocalFile(_mediaPlayer.PlaybackSession.Position); } return null; } #region Properties public bool IsPaused { get { return _mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Paused; } } public bool IsPlaying { get { return this.IsPlayingInternal(_mediaPlayer.PlaybackSession.PlaybackState); } } public MediaPlaybackState State { get { return _mediaPlayer.PlaybackSession.PlaybackState; } } public bool IsOpening { get { return this.IsOpeningInternal(_mediaPlayer.PlaybackSession.PlaybackState); } } public bool IsClosed { get { return _mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.None; } } public double CurrentTime { get { return _mediaPlayer.PlaybackSession.Position.TotalMilliseconds; } } public NowPlayingState NowPlaying { get => _nowPlayingState; } public PlaybackSource VisualizationSource { get => _source; set => _source = value; } #endregion private PlayerService() { _dispatcher = Window.Current.Dispatcher; InitializeMediaPlayer(); _playerEventDebounceTimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(250) }; _playerEventDebounceTimer.Tick += PlayerEventDebounceTimer_Tick; _nowPlayingState = new NowPlayingState(); _nowPlayingState.LoadStateAsync().ContinueWith((a) => { // TODO: handle error if (_nowPlayingState.CurrentEpisode != null) { var setItemTask = SetNewItem(new Uri(_nowPlayingState.CurrentEpisode.Key), _nowPlayingState.CurrentTime, false, _nowPlayingState.CurrentEpisode.Id.ToString()); } }); } private void InitializeMediaPlayer() { _mediaPlayer = new MediaPlayer(); VisualizationSource = new PlaybackSource(_mediaPlayer); VisualizationSource.SourceChanged += _source_SourceChanged; _mediaPlayer.PlaybackSession.PositionChanged += PlaybackSession_PositionChanged; _mediaPlayer.PlaybackSession.PlaybackStateChanged += PlaybackSession_PlaybackStateChanged; _mediaPlayer.MediaFailed += MediaPlayer_MediaFailed; _mediaPlayer.PlaybackSession.NaturalVideoSizeChanged += (sender, args) => { sender.MediaPlayer.SetSurfaceSize(new Size(sender.NaturalVideoWidth, sender.NaturalVideoHeight)); }; } private void _source_SourceChanged(object sender, AudioVisualizer.IVisualizationSource args) { VisualizationSourceChanged?.Invoke(sender, args); } private async Task OpenAndPlayNewItem() { TypedEventHandler openedHandler = null; OnMediaLoading(); openedHandler = (s, e) => { OnMediaLoaded(); _mediaPlayer.MediaOpened -= openedHandler; if (_startTime > TimeSpan.Zero) { _mediaPlayer.PlaybackSession.Position = _startTime; } }; _mediaPlayer.MediaOpened += openedHandler; var result = await GetSourceForUri(); _mediaPlayer.Source = result.source; _currentFile = result.storageFile; _mediaPlayer.Play(); var disp = new DisplayRequest(); disp.RequestActive(); } private async Task<(MediaSource source, StorageFile storageFile)> GetSourceForUri() { MediaSource source = null; var currentFile = await BackgroundDownloadHelper.CheckLocalFileExistsFromUriHash(_sourceUri); if (currentFile != null) { source = MediaSource.CreateFromStorageFile(currentFile); } else { source = MediaSource.CreateFromUri(_sourceUri); } return (source, currentFile); } private async Task GetBitmapBytesFromLocalFile(TimeSpan span) { var thumbnail = await GetThumbnailAsync(_currentFile, span); InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream(); await RandomAccessStream.CopyAsync(thumbnail, randomAccessStream); randomAccessStream.Seek(0); var bytes = new byte[randomAccessStream.Size]; await randomAccessStream.ReadAsync(bytes.AsBuffer(), (uint)randomAccessStream.Size, InputStreamOptions.None); return bytes; } private async Task GetThumbnailAsync(StorageFile file, TimeSpan span) { var mediaClip = await MediaClip.CreateFromFileAsync(file); var mediaComposition = new MediaComposition(); mediaComposition.Clips.Add(mediaClip); return await mediaComposition.GetThumbnailAsync( span, 0, 0, VideoFramePrecision.NearestFrame); } private void ClearPlayback() { if (_mediaPlayer.PlaybackSession.PlaybackState != MediaPlaybackState.None) { _mediaPlayer.Source = null; } } private void PlaybackSession_PositionChanged(MediaPlaybackSession sender, object args) { _timelinectrl?.SetTime(_mediaPlayer.PlaybackSession.Position, _mediaPlayer.PlaybackSession.NaturalDuration); _nowPlayingState.CurrentTime = _mediaPlayer.PlaybackSession.Position; } private async void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args) { await _dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { lock (_syncLock) { _nextEventtoFire = sender.PlaybackState; if (_playerEventDebounceTimer.IsEnabled) { Debug.WriteLine($"Debounce"); _playerEventDebounceTimer.Stop(); _playerEventDebounceTimer.Start(); } _playerEventDebounceTimer.Start(); } }); } private void MediaPlayer_MediaFailed(MediaPlayer sender, MediaPlayerFailedEventArgs args) { Debug.WriteLine($"failed:{args.ErrorMessage}"); } private async Task HandlePlayPauseChanged(MediaPlaybackState playOrPause) { if (playOrPause == MediaPlaybackState.Paused) { await _nowPlayingState.PeristEpisodePlaybackState(); } } private void PlayerEventDebounceTimer_Tick(object sender, object e) { lock (_syncLock) { _playerEventDebounceTimer.Stop(); CheckFireStateChanged(); } } private void CheckFireStateChanged() { // Only fire the event if state has actually changed based on what was last fired var wasPlaying = IsPlayingInternal(_lastEventFired); var isPlaying = IsPlayingInternal(_nextEventtoFire); if (wasPlaying != isPlaying) { if (PlayPauseChanged != null) { // Don't fire the event while the lock is held var dispatcherTask = _dispatcher.RunIdleAsync(async (s) => { var playOrPause = IsPlayingInternal(_nextEventtoFire) ? MediaPlaybackState.Playing : MediaPlaybackState.Paused; Debug.WriteLine($"Fire either play or pause : {playOrPause}"); await OnPlayPauseChanged(playOrPause); }); } } _lastEventFired = _nextEventtoFire; } private async Task OnPlayPauseChanged(MediaPlaybackState playOrPause) { await HandlePlayPauseChanged(playOrPause); PlayPauseChanged(this, playOrPause); } /// /// Use by callers who care about playing vs paused like play pause button /// /// /// private bool IsPlayingInternal(MediaPlaybackState eventToTest) { return eventToTest == MediaPlaybackState.Buffering || eventToTest == MediaPlaybackState.Opening || eventToTest == MediaPlaybackState.Playing; } /// /// Used by callers who are showing loading UX /// /// /// private bool IsOpeningInternal(MediaPlaybackState eventToTest) { return eventToTest == MediaPlaybackState.Buffering || eventToTest == MediaPlaybackState.Opening; } private void OnMediaLoaded() { this.MediaLoaded?.Invoke(this, EventArgs.Empty); } private void OnMediaLoading() { this.MediaLoading?.Invoke(this, EventArgs.Empty); } } } ================================================ FILE: src/BuildCast/Services/RemotePlayService.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using BuildCast.DataModel; using BuildCast.Helpers; using BuildCast.Services.Navigation; using Windows.ApplicationModel.AppService; using Windows.ApplicationModel.Background; using Windows.Foundation.Collections; using Windows.System; using Windows.System.RemoteSystems; namespace BuildCast.Services { public class RemotePlayService : IRemotePlayerService { private const string PLAYERCOMMAND = "player_command"; private const string PLAYCOMMAND = "play"; private const string PLAYTIME = "playtime"; private const string SEEKCOMMAND = "seek"; private const string PAUSECOMMAND = "pause"; private const string STOPCOMMAND = "stop"; private const string FFWDCOMMAND = "ffwd"; private const string RWDCOMMAND = "bekindrewind"; private const string SNAPBITMAPCOMMAND = "snapbitmap"; private const string SNAPBITMAPREPLY = "snapbitmapreply"; private const string BUILDCASTAPPID = "3493e9b8-b025-449b-99db-f6cd5b0a5439"; private BackgroundTaskDeferral serviceDeferral; private AppServiceConnection connection; private List _observers = new List(); private IPlayerService _playerService; private INavigationService _navigationService; private RemoteSystemWatcher _remoteSystemWatcher; private Dictionary _deviceMap = null; public RemotePlayService(IPlayerService playerService, INavigationService navigationService) { _playerService = playerService; _navigationService = navigationService; AvailableSystems = new List(); _deviceMap = new Dictionary(); } IEnumerable IRemotePlayerService.AvailableSystems => AvailableSystems; private List AvailableSystems { get; set; } public void SearchCleanup() { if (_remoteSystemWatcher != null) { _remoteSystemWatcher.Stop(); _remoteSystemWatcher = null; } if (AvailableSystems != null) { AvailableSystems.Clear(); _deviceMap.Clear(); } } public async Task FindDevices() { // ROME code to find proximity device RemoteSystemAccessStatus accessStatus = await RemoteSystem.RequestAccessAsync(); if (accessStatus == RemoteSystemAccessStatus.Allowed) { if (_remoteSystemWatcher != null) { _remoteSystemWatcher.Start(); return true; } else { List filters = new List(); RemoteSystemDiscoveryTypeFilter discoveryFilter = new RemoteSystemDiscoveryTypeFilter(RemoteSystemDiscoveryType.Any); List kinds = new List(); RemoteSystemStatusTypeFilter statusFilter = new RemoteSystemStatusTypeFilter(RemoteSystemStatusType.Any); kinds.Add(RemoteSystemKinds.Desktop); // kinds.Add(RemoteSystemKinds.Phone); kinds.Add(RemoteSystemKinds.Xbox); RemoteSystemKindFilter kindFilter = new RemoteSystemKindFilter(kinds); filters.Add(kindFilter); filters.Add(statusFilter); filters.Add(discoveryFilter); _remoteSystemWatcher = RemoteSystem.CreateWatcher(filters); // Subscribing to the event that will be raised when a new remote system is found by the watcher. _remoteSystemWatcher.RemoteSystemAdded += RemoteSystemWatcher_RemoteSystemAdded; // Subscribing to the event that will be raised when a previously found remote system is no longer available. _remoteSystemWatcher.RemoteSystemRemoved += RemoteSystemWatcher_RemoteSystemRemoved; // Subscribing to the event that will be raised when a previously found remote system is updated. _remoteSystemWatcher.RemoteSystemUpdated += RemoteSystemWatcher_RemoteSystemUpdated; // Start the watcher. _remoteSystemWatcher.Start(); return true; } } else { return false; } } public void RemoteActivation(BackgroundTaskDeferral backgroundTaskDeferral, AppServiceConnection appServiceConnection) { serviceDeferral = backgroundTaskDeferral; connection = appServiceConnection; connection.RequestReceived += Connection_RequestReceived; } public IDisposable SubscribeSystemsChange(IAvailableSystemsObserver observer) { IDisposable token = null; if (!_observers.Contains(observer)) { token = new SubscriptionToken(_observers, observer); } return token; } private void RemoteSystemWatcher_RemoteSystemUpdated(RemoteSystemWatcher sender, RemoteSystemUpdatedEventArgs args) { IRemoteSystemDescription description = null; if (_deviceMap.ContainsKey(args.RemoteSystem.Id)) { description = _deviceMap[args.RemoteSystem.Id].Description; _deviceMap.Remove(args.RemoteSystem.Id); } _deviceMap.Add(args.RemoteSystem.Id, (args.RemoteSystem, description)); } private void RemoteSystemWatcher_RemoteSystemRemoved(RemoteSystemWatcher sender, RemoteSystemRemovedEventArgs args) { IRemoteSystemDescription description = null; if (_deviceMap.ContainsKey(args.RemoteSystemId)) { description = _deviceMap[args.RemoteSystemId].Description; AvailableSystems.Remove(description); _deviceMap.Remove(args.RemoteSystemId); } if (description != null) { foreach (var observer in _observers) { observer.Removed(description); } } } private void RemoteSystemWatcher_RemoteSystemAdded(RemoteSystemWatcher sender, RemoteSystemAddedEventArgs args) { if (!_deviceMap.ContainsKey(args.RemoteSystem.Id)) { IRemoteSystemDescription description = new RemoteSystemDescription(this) { Id = args.RemoteSystem.Id, Name = args.RemoteSystem.DisplayName, Kind = args.RemoteSystem.Kind }; // deviceList and deviceMap updates instead of only latestRemoteSystem... AvailableSystems.Add(description); _deviceMap.Add(args.RemoteSystem.Id, (args.RemoteSystem, description)); foreach (var observer in _observers) { observer.Add(description); } } } private async Task CreateRemoteConnection(IRemoteSystemDescription remoteSystem) { RemoteConnection remoteConnection = null; var latestRemoteSystem = _deviceMap[remoteSystem.Id].System; if (latestRemoteSystem != null && latestRemoteSystem.Status == RemoteSystemStatus.Available) { Uri uri = new Uri(@"media-video-podcast-listenremote:"); RemoteLauncherOptions launcherOptions = new RemoteLauncherOptions(); launcherOptions.PreferredAppIds.Add(Windows.ApplicationModel.Package.Current.Id.FamilyName); RemoteLaunchUriStatus launchUriStatus = await RemoteLauncher.LaunchUriAsync(new RemoteSystemConnectionRequest(latestRemoteSystem), uri, launcherOptions); if (launchUriStatus == RemoteLaunchUriStatus.Success) { RemoteSystemConnectionRequest connectionRequest = new RemoteSystemConnectionRequest(latestRemoteSystem); var remoteAppServiceConnection = new AppServiceConnection { AppServiceName = "InProcessAppService", PackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName, }; { AppServiceConnectionStatus status = await remoteAppServiceConnection.OpenRemoteAsync(connectionRequest); if (status == AppServiceConnectionStatus.Success) { remoteConnection = new RemoteConnection(remoteAppServiceConnection, _playerService); } } } } return remoteConnection; } private async void Connection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args) { var messageDeferral = args.GetDeferral(); try { var requestMessageValues = args.Request.Message; var commandString = requestMessageValues[PLAYERCOMMAND]; switch (commandString) { case PLAYCOMMAND: LocalStorageContext context = new LocalStorageContext(); Episode episode = context.EpisodeCache.Where(ep => ep.Key == requestMessageValues[PLAYCOMMAND].ToString()).FirstOrDefault(); if (episode != null) { await _navigationService.NavigateToPlayerAsync(episode: null); TimeSpan playTime = TimeSpan.Zero; if (requestMessageValues.ContainsKey(PLAYTIME)) { TimeSpan.TryParse(requestMessageValues[PLAYTIME].ToString(), out playTime); } await _playerService.Play(episode, playTime); } break; case PAUSECOMMAND: _playerService.Pause(); break; case SEEKCOMMAND: var timestamp = (TimeSpan)requestMessageValues[SEEKCOMMAND]; _playerService.SetTime(timestamp); break; case FFWDCOMMAND: _playerService.FastForward(); break; case RWDCOMMAND: _playerService.Rewind(); break; case SNAPBITMAPCOMMAND: var bitmap = await _playerService.GetBitmapForCurrentFrameFromLocalFile(); ValueSet message = new ValueSet { [PLAYERCOMMAND] = SNAPBITMAPREPLY, [SNAPBITMAPREPLY] = bitmap, }; var response = await args.Request.SendResponseAsync(message); break; default: break; } } finally { messageDeferral.Complete(); } } // TODO: not used. Delete? private void TaskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) { if (serviceDeferral != null) { // Complete the service deferral serviceDeferral.Complete(); serviceDeferral = null; } } private class RemoteConnection : IRemoteConnection { private AppServiceConnection _connection; private string _episodeKey; private IPlayerService _playerService; public RemoteConnection(AppServiceConnection connection, IPlayerService playerService) { _connection = connection; _episodeKey = playerService.NowPlaying.CurrentEpisode.Key; _playerService = playerService; } public Task Disconnect() { _connection.Dispose(); return Task.CompletedTask; } public void Dispose() { _connection.Dispose(); } public async Task Pause() { ValueSet message = new ValueSet { [PLAYERCOMMAND] = PAUSECOMMAND, }; var response = await _connection.SendMessageAsync(message); await CheckGoodResponse(response); } public async Task Play() { _playerService.Pause(); TimeSpan currentTime = _playerService.NowPlaying?.CurrentTime ?? TimeSpan.Zero; ValueSet message = new ValueSet { [PLAYERCOMMAND] = PLAYCOMMAND, [PLAYCOMMAND] = _episodeKey, [PLAYTIME] = currentTime, }; var response = await _connection.SendMessageAsync(message); await CheckGoodResponse(response); } public async Task Seek(TimeSpan timeStamp) { ValueSet message = new ValueSet { [PLAYERCOMMAND] = SEEKCOMMAND, [SEEKCOMMAND] = timeStamp, }; var response = await _connection.SendMessageAsync(message); await CheckGoodResponse(response); } public async Task FastForward() { ValueSet message = new ValueSet { [PLAYERCOMMAND] = FFWDCOMMAND, }; var response = await _connection.SendMessageAsync(message); await CheckGoodResponse(response); } public async Task Rewind() { ValueSet message = new ValueSet { [PLAYERCOMMAND] = RWDCOMMAND, }; var response = await _connection.SendMessageAsync(message); await CheckGoodResponse(response); } public async Task GetRemoteBitmap() { ValueSet message = new ValueSet { [PLAYERCOMMAND] = SNAPBITMAPCOMMAND, }; var response = await _connection.SendMessageAsync(message); if (response.Message.ContainsKey(SNAPBITMAPREPLY)) { byte[] bytes = (byte[])response.Message[SNAPBITMAPREPLY]; StartInking(PlayerService.Current.NowPlaying, bytes); } else { throw new Exception("TODO HANDLE THIS"); } await CheckGoodResponse(response); } public void StartInking(NowPlayingState nowPlaying, byte[] imageBytes) { // Remote inking is not yet supported return; // TODO: remove this method and call into a single place to start an inknote if (imageBytes != null) { BuildCast.DataModel.InkNote meme = new BuildCast.DataModel.InkNote(nowPlaying.CurrentEpisode.Key, PlayerService.Current.CurrentTime); var inkNoteData = new InkNoteData() { ImageBytes = imageBytes }; // TODO refactor to use navigation service. ((App)Windows.UI.Xaml.Application.Current).GetFrame().Navigate(typeof(InkNote), inkNoteData); // ViewModel.GoToInkNote(meme); } } private async Task CheckGoodResponse(AppServiceResponse response) { if (response.Status != AppServiceResponseStatus.Success) { await UIHelpers.ShowContentAsync($"Failure sending remote command"); } } } private class RemoteSystemDescription : IRemoteSystemDescription { private RemotePlayService _service; public RemoteSystemDescription(RemotePlayService service) { _service = service; } public string Id { get; set; } public string Name { get; set; } public string Kind { get; set; } public string Glyph { get { switch (Kind) { case "Phone": return "\uE8EA"; case "Xbox": return "\uE7FC"; default: return "\uE770"; } } } public Task PlayTo() { return _service.CreateRemoteConnection(this); } } private class SubscriptionToken : IDisposable { private List _observerList; private IAvailableSystemsObserver _observer; public SubscriptionToken(List observerList, IAvailableSystemsObserver observer) { _observerList = observerList; _observer = observer; _observerList.Add(_observer); } public void Dispose() { _observerList.Remove(_observer); } } } } ================================================ FILE: src/BuildCast/Services/ThemeSelectorService.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Threading.Tasks; using BuildCast.Helpers; using Windows.ApplicationModel.Core; using Windows.Foundation.Metadata; using Windows.Storage; using Windows.UI; using Windows.UI.ViewManagement; using Windows.UI.Xaml; namespace BuildCast.Services { public static class ThemeSelectorService { private const string SettingsKey = "RequestedTheme"; private static ResourceDictionary _customTheme = new ResourceDictionary { Source = new Uri("ms-appx:///Themes/Branded.xaml", UriKind.Absolute) }; private static ResourceDictionary _stockTheme = new ResourceDictionary { Source = new Uri("ms-appx:///Themes/Stock.xaml", UriKind.Absolute) }; public static event EventHandler OnThemeChanged = (sender, args) => { }; public static ElementThemeExtended Theme { get; set; } = ElementThemeExtended.Default; public static string GetSystemControlForegroundColorForThemeHex() { if (TrueTheme() == ElementTheme.Dark) { return "#FFFFFF"; } else { return "#000000"; } } public static async Task InitializeAsync() { Theme = await LoadThemeFromSettingsAsync(); } public static async Task SetThemeAsync(ElementThemeExtended theme) { Theme = theme; SetRequestedTheme(); await SaveThemeInSettingsAsync(Theme); OnThemeChanged(null, Theme); } public static void SetRequestedTheme() { if (Window.Current.Content is FrameworkElement frameworkElement) { ElementTheme trueTheme; if (Theme == ElementThemeExtended.Custom) { if (Application.Current.Resources.MergedDictionaries.Contains(_stockTheme)) { Application.Current.Resources.MergedDictionaries.Remove(_stockTheme); } Application.Current.Resources.MergedDictionaries.Add(_customTheme); trueTheme = ElementTheme.Dark; if (frameworkElement.RequestedTheme == ElementTheme.Dark) { frameworkElement.RequestedTheme = ElementTheme.Light; } } else { if (Application.Current.Resources.MergedDictionaries.Contains(_customTheme)) { Application.Current.Resources.MergedDictionaries.Remove(_customTheme); } // for the case we switch between light and dark which share stock if (!Application.Current.Resources.MergedDictionaries.Contains(_stockTheme)) { Application.Current.Resources.MergedDictionaries.Add(_stockTheme); } trueTheme = (ElementTheme)Theme; if (frameworkElement.RequestedTheme == ElementTheme.Dark) { frameworkElement.RequestedTheme = ElementTheme.Light; } } frameworkElement.RequestedTheme = trueTheme; } SetupTitlebar(); } public static string GetLogoSource() { if (Theme == ElementThemeExtended.Dark) { return "ms-appx:///Assets/BuildCastDarkTheme.svg"; } return "ms-appx:///Assets/BuildCast.svg"; } public static string GetHomeImageSource() { if (Theme == ElementThemeExtended.Dark) { return "ms-appx:///Assets/BUILD2017_Seattle_Skyline_night.jpg"; } return "ms-appx:///Assets/BUILD2017_Seattle_Skyline.jpg"; } public static ElementTheme GetHomeTheme() { if (Theme == ElementThemeExtended.Custom) { return ElementTheme.Light; } return TrueTheme(); } public static Style GetHomeBackground() { if (Theme == ElementThemeExtended.Custom) { return Application.Current.Resources["HomePageBackground"] as Style; } return Application.Current.Resources["PageBackground"] as Style; } public static ElementTheme TrueTheme() { var frameworkElement = Window.Current.Content as FrameworkElement; return frameworkElement.ActualTheme; } private static void SetupTitlebar() { if (ApiInformation.IsTypePresent("Windows.UI.ViewManagement.ApplicationView")) { var titleBar = ApplicationView.GetForCurrentView().TitleBar; if (titleBar != null) { titleBar.ButtonBackgroundColor = Colors.Transparent; if (TrueTheme() == ElementTheme.Dark) { titleBar.ButtonForegroundColor = Colors.White; titleBar.ForegroundColor = Colors.White; } else { titleBar.ButtonForegroundColor = Colors.Black; titleBar.ForegroundColor = Colors.Black; } titleBar.BackgroundColor = Colors.Black; titleBar.ButtonInactiveBackgroundColor = Colors.Transparent; titleBar.ButtonInactiveForegroundColor = Colors.LightGray; CoreApplicationViewTitleBar coreTitleBar = TitleBarHelper.Instance.TitleBar; coreTitleBar.ExtendViewIntoTitleBar = true; } } } private static async Task LoadThemeFromSettingsAsync() { ElementThemeExtended cacheTheme = ElementThemeExtended.Default; string themeName = await ApplicationData.Current.LocalSettings.ReadAsync(SettingsKey); if (!string.IsNullOrEmpty(themeName)) { Enum.TryParse(themeName, out cacheTheme); } return cacheTheme; } private static async Task SaveThemeInSettingsAsync(ElementThemeExtended theme) { await ApplicationData.Current.LocalSettings.SaveAsync(SettingsKey, theme.ToString()); } } } ================================================ FILE: src/BuildCast/Services/ViewModeService.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.Helpers { using System; using System.Threading.Tasks; using BuildCast.Services; using Windows.ApplicationModel.Core; using Windows.UI.Core; using Windows.UI.ViewManagement; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; public class ViewModeService { // Compact mode private static readonly ViewModeService _instance = new ViewModeService(); private UIElement _previousViewContent; // Fullscreen private double oldCompactThreshold; private double oldExpandedThreshold; private Brush oldBackgroundBrush; private FrameworkElement _navHeader; private FrameworkElement _menuButton; private NavigationView _navigationView; private Frame _appNavFrame; private bool inFullScreen; public static ViewModeService Instance => _instance; public async Task CreateNewView(Func newViewObjectFactory, Action loadAction) where T : UIElement { CoreApplicationView newView = CoreApplication.CreateNewView(); var newViewId = 0; await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { var newViewContent = newViewObjectFactory(); Window.Current.Content = newViewContent; Window.Current.Activate(); newViewId = ApplicationView.GetForCurrentView().Id; loadAction(newViewContent); }); var viewShown = await ApplicationViewSwitcher.TryShowAsViewModeAsync(newViewId, ApplicationViewMode.CompactOverlay); } public async Task SwitchToCompactOverlay(T newView, Action loadAction) where T : UIElement { _previousViewContent = Window.Current.Content; bool modeSwitched = await ApplicationView.GetForCurrentView().TryEnterViewModeAsync(ApplicationViewMode.CompactOverlay); if (modeSwitched) { Window.Current.Content = newView; loadAction(newView); } return modeSwitched; } public async Task SwitchToNormalMode() { bool modeSwitched = await ApplicationView.GetForCurrentView().TryEnterViewModeAsync(ApplicationViewMode.Default); if (modeSwitched) { Window.Current.Content = _previousViewContent; _previousViewContent = null; } return modeSwitched; } public void Register(NavigationView navview, Frame appNavFrame) { _navigationView = navview; _appNavFrame = appNavFrame; } public void UnRegister() { _navigationView = null; _appNavFrame = null; } public void DoEnterFullscreen() { var view = ApplicationView.GetForCurrentView(); inFullScreen = view.TryEnterFullScreenMode(); if (inFullScreen) { // Adjust navigationview to accomodate fullscreen if (_navigationView != null) { oldBackgroundBrush = _navigationView.Background; CollapseNavigationViewToBurger(); EnsureElements(_navigationView); // Hide navigationview menu while in fullscreen _menuButton.Visibility = Visibility.Collapsed; } // Hide titlebar TitleBarHelper.Instance.GoFullscreen(); // If current page is intersted in fullscreen, tell it if (_appNavFrame != null && _appNavFrame.Content is IFullscreenPage) { ((IFullscreenPage)_appNavFrame.Content).EnterFullscreen(); } } } public void CollapseNavigationViewToBurger() { EnsureElements(_navigationView); oldCompactThreshold = _navigationView.CompactModeThresholdWidth; oldExpandedThreshold = _navigationView.ExpandedModeThresholdWidth; // Force navview to collapse to it's least wide mode _navigationView.CompactModeThresholdWidth = 10000; _navigationView.ExpandedModeThresholdWidth = 10000; // Collapse navigationview header while in fullscreen _navHeader.Visibility = Visibility.Collapsed; } public void RestoreNavigationViewDefault() { _navigationView.CompactModeThresholdWidth = oldCompactThreshold; _navigationView.ExpandedModeThresholdWidth = oldExpandedThreshold; _navHeader.Visibility = Visibility.Visible; } public void DoExitFullscreen() { if (inFullScreen) { var view = ApplicationView.GetForCurrentView(); view.ExitFullScreenMode(); TitleBarHelper.Instance.ExitFullscreen(); if (_navigationView != null) { EnsureElements(_navigationView); RestoreNavigationViewDefault(); _navigationView.Background = oldBackgroundBrush; _menuButton.Visibility = Visibility.Visible; } if (_appNavFrame != null && _appNavFrame.Content is IFullscreenPage) { ((IFullscreenPage)_appNavFrame.Content).ExitFullscreen(); } inFullScreen = false; } } public void ToggleFullscreen() { var view = ApplicationView.GetForCurrentView(); if (view.IsFullScreenMode) { ViewModeService.Instance.DoExitFullscreen(); } else { ViewModeService.Instance.DoEnterFullscreen(); } } private void EnsureElements(NavigationView navview) { if (_navHeader == null) { _navHeader = VisualHelpers.GetVisualChildByName(navview, "HeaderContent"); } if (_menuButton == null) { _menuButton = VisualHelpers.GetVisualChildByName(navview, "TogglePaneButton"); } } } } ================================================ FILE: src/BuildCast/Strings/en-us/Resources.resw ================================================ text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Settings Page title for Settings Choose Theme Choose theme text for Settings Dark Dark theme text for Settings Windows default Windows default theme text for Settings Light Light theme text for Settings About this application About this application title for Settings Video podcast player. About this application description for Settings Privacy Statement Privacy Statement link content for Settings https://YourPrivacyUrlGoesHere/ Here is your Privacy Statement url for Settings Personalization Personalization text for Settings Custom Custom theme for settings Window mode for Picture-in-picture Main window switches to Picture-in-picture Picture-in-picture opens a second window Notes and Bookmarks Page title for Bookmarks Downloads Page title for Downloads Favorites Page title for Favorites ================================================ FILE: src/BuildCast/Styles/Common.xaml ================================================  ================================================ FILE: src/BuildCast/Styles/Settings.xaml ================================================  32 16 0,45,0,0 24,35,0,0 24,35,24,0 12,0,12,25 12, 0, 0, 25 12,0,12,0 12,12,12,12 0, 8, 0, 0 Ink Note ================================================ FILE: src/BuildCast/Themes/Branded.xaml ================================================  #FF046DD7 ================================================ FILE: src/BuildCast/Themes/BrandedXbox.xaml ================================================  #FF046DD7 ================================================ FILE: src/BuildCast/Themes/Generic.xaml ================================================  ================================================ FILE: src/BuildCast/Themes/Stock.xaml ================================================  ================================================ FILE: src/BuildCast/ViewModels/DownloadsViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.ViewModels { using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using BuildCast.DataModel; using BuildCast.Services.Navigation; using Microsoft.Toolkit.Uwp.Helpers; public class DownloadsViewModel : INotifyPropertyChanged { private INavigationService _navigationService; private IQueryable _downloads; public event PropertyChangedEventHandler PropertyChanged; public DownloadsViewModel(INavigationService navigationService) { _navigationService = navigationService; } public async void RemoveDownloadedEpisode(Episode episode) { if (episode != null) { await episode.DeleteDownloaded(); await LoadDownloads(); } } public async void ReloadDownloadList() { await LoadDownloads(); } public IQueryable Downloads { get { return _downloads; } private set { if (value != _downloads) { _downloads = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Downloads))); } } } public async Task LoadDownloads() { await Task.Run(async () => { using (var db = new LocalStorageContext()) { await DispatcherHelper.ExecuteOnUIThreadAsync(() => { BuildDownloads(db); }); } }); } internal void NavigateToEpisode(Episode episode) { var ignored = _navigationService.NavigateToPlayerAsync(episode); } internal void NavigateToInkNote(InkNote ink) { var ignored = _navigationService.NavigateToInkNoteAsync(ink); } internal void NavigateToPlayerWithInk(InkNote ink) { var ignored = _navigationService.NavigateToPlayerAsync(ink); } private void BuildDownloads(LocalStorageContext db) { var results2 = from eps in db.EpisodeCache join state in db.PlaybackState on eps.Key equals state.EpisodeKey into myJoin from sub in myJoin.DefaultIfEmpty() where eps.IsDownloaded == true select new EpisodeWithState { Episode = eps, PlaybackState = sub ?? new EpisodePlaybackState() }; Downloads = results2; } } } ================================================ FILE: src/BuildCast/ViewModels/EpisodeDetailsViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Threading.Tasks; using BuildCast.DataModel; using BuildCast.Helpers; using BuildCast.Services.Navigation; using Windows.UI.Xaml.Navigation; namespace BuildCast.ViewModels { public class EpisodeDetailsViewModel : INavigableTo { private INavigationService _navigationService; public EpisodeDetailsViewModel(INavigationService navigationService) { _navigationService = navigationService; } public event EventHandler DownloadError; public Episode CurrentEpisode { get; set; } // These methods need to be moved into the Episode public void PlayCurrentEpisode() { _navigationService.NavigateToPlayerAsync(CurrentEpisode); } public void FavoriteCurrentEpisode() { using (var db = new LocalStorageContext()) { db.Favorites.Add(new Favorite(CurrentEpisode)); db.SaveChanges(); } } public void DownloadCurrentEpisode() { var task = BackgroundDownloadHelper.Download(new Uri(CurrentEpisode.Key)); task.ContinueWith(t => DownloadError?.Invoke(this, EventArgs.Empty), TaskContinuationOptions.OnlyOnFaulted); } public Task NavigatedTo(NavigationMode navigationMode, object parameter) { if (parameter is Episode episode) { CurrentEpisode = episode; } return Task.CompletedTask; } } } ================================================ FILE: src/BuildCast/ViewModels/FavoritesViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.ViewModels { using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using System.Windows.Input; using BuildCast.DataModel; using BuildCast.Helpers; using BuildCast.Services.Navigation; using Microsoft.Toolkit.Uwp.Helpers; public class FavoritesViewModel : INotifyPropertyChanged { private INavigationService _navigationService; private IQueryable _favorites; public event PropertyChangedEventHandler PropertyChanged; public FavoritesViewModel(INavigationService navigationService) { _navigationService = navigationService; } public void DownloadEpisode(Episode episode) { var task = BackgroundDownloadHelper.Download(new System.Uri(episode.Key)); } public async void RemoveDownloadedEpisode(Episode episode) { if (episode != null) { await episode.DeleteDownloaded(); await LoadFavorites(); } } public async void RemoveFavoritedEpisode(Episode episode) { using (var db = new LocalStorageContext()) { foreach (Favorite favEntity in db.Favorites) { if (episode == null) { break; } if (favEntity.EpisodeId == episode.Id) { db.Favorites.Remove(favEntity); break; } } db.SaveChanges(); } await LoadFavorites(); } public async void Refresh() { await LoadFavorites(); } public IQueryable Favorites { get { return _favorites; } private set { if (value != _favorites) { _favorites = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Favorites))); } } } public Task NavigateToEpisodeAsync(Episode episode) => _navigationService.NavigateToPlayerAsync(episode); internal async Task LoadFavorites() { await Task.Run(async () => { using (var db = new LocalStorageContext()) { await DispatcherHelper.ExecuteOnUIThreadAsync(() => { BuildFavorites(db); }); } }); } private void BuildFavorites(LocalStorageContext db) { var results2 = from fav in db.Favorites join eps in db.EpisodeCache on fav.EpisodeId equals eps.Id join state in db.PlaybackState on eps.Key equals state.EpisodeKey into myJoin from sub in myJoin.DefaultIfEmpty() select new EpisodeWithState { Episode = eps, PlaybackState = sub ?? new EpisodePlaybackState() }; Favorites = results2; } } } ================================================ FILE: src/BuildCast/ViewModels/FeedDetailsViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Threading.Tasks; using BuildCast.DataModel; using BuildCast.Helpers; using BuildCast.Services.Navigation; using Windows.UI.Xaml.Navigation; namespace BuildCast.ViewModels { public class FeedDetailsViewModel : INavigableTo, INotifyPropertyChanged { private INavigationService _navService; private bool _loading; public event PropertyChangedEventHandler PropertyChanged; public Feed CurrentFeed { get; private set; } public ObservableCollection EpisodeData { get; set; } public bool Loading { get => _loading; set { if (_loading != value) { _loading = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Loading))); } } } public Episode PersistedEpisode { get; set; } public FeedDetailsViewModel(INavigationService navigationService) { _navService = navigationService; Loading = true; } public async Task NavigatedTo(NavigationMode navigationMode, object parameter) { Loading = true; if (navigationMode != NavigationMode.Back && parameter is Feed feed) { CurrentFeed = feed; EpisodeData = new ObservableCollection(await feed.GetEpisodes()); } if (navigationMode != NavigationMode.Back) { PersistedEpisode = null; } Loading = false; } public async Task RefreshData() { var newEpisodes = await CurrentFeed.GetNewEpisodesAsync(); foreach (var episode in newEpisodes) { EpisodeData.Insert(0, episode); } return newEpisodes.Count; } public void GoToEpisodeDetails(Episode detailsItem) { PersistedEpisode = detailsItem; _navService.NavigateToEpisodeAsync(detailsItem); } // TODO: Move these episode specific functions to the Episode themselves, pending further review. public void PlayEpisode(Episode episode) { _navService.NavigateToPlayerAsync(episode); } public void FavoriteEpisode(Episode episode) { using (var db = new LocalStorageContext()) { db.Favorites.Add(new Favorite(episode)); db.SaveChanges(); } } public void DownloadEpisode(Episode episode) { var task = BackgroundDownloadHelper.Download(new Uri(episode.Key)); } public async Task RemoveTopThree() { await CurrentFeed.RemoveTopThreeItems(); EpisodeData.RemoveAt(0); EpisodeData.RemoveAt(0); EpisodeData.RemoveAt(0); } } } ================================================ FILE: src/BuildCast/ViewModels/HomeViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using BuildCast.DataModel; using BuildCast.Services.Navigation; namespace BuildCast.ViewModels { public class HomeViewModel { private INavigationService _navigationService; public HomeViewModel(INavigationService navigationService) { _navigationService = navigationService; } public void NavigateToFeed(Feed selectedFeed) { var ignored = _navigationService.NavigateToFeedAsync(selectedFeed); } public void NavigateToEpisode(Episode episode) { var ignored = _navigationService.NavigateToEpisodeAsync(episode); } } } ================================================ FILE: src/BuildCast/ViewModels/InkNoteViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using BuildCast.Services.Navigation; namespace BuildCast.ViewModels { public class InkNoteViewModel { private INavigationService _navigationService; public InkNoteViewModel(INavigationService navigationService) { _navigationService = navigationService; } public void GoBack() { var ignored = _navigationService.GoBackAsync(); } } } ================================================ FILE: src/BuildCast/ViewModels/NotesViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.ViewModels { using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using BuildCast.DataModel; using BuildCast.Helpers; using BuildCast.Services.Navigation; using Microsoft.Toolkit.Uwp.Helpers; public class NotesViewModel : INotifyPropertyChanged { private INavigationService _navigationService; private IEnumerable> _notes; public NotesViewModel(INavigationService navigationService) { _navigationService = navigationService; } public event PropertyChangedEventHandler PropertyChanged; public IEnumerable> Notes { get { return _notes; } private set { if (value != _notes) { _notes = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Notes))); } } } public async void ReloadNotes() { await LoadNotes(); } public async Task LoadNotes() { await Task.Run(async () => { using (var db = new LocalStorageContext()) { await DispatcherHelper.ExecuteOnUIThreadAsync(() => { BuildInkNotesForEpisode(db); }); } }); } public void NavigateToItem(object clickedItem) { if (clickedItem is EpisodeWithState) { NavigateToEpisode((clickedItem as EpisodeWithState).Episode); return; } dynamic output = clickedItem; Guid inkId = output.InkId; switch (output.Type) { case "Ink": using (var db = new LocalStorageContext()) { var ink = db.Memes.Where(m => m.Id == inkId).FirstOrDefault(); NavigateToInkNote(ink); } break; case "Bookmark": using (var db = new LocalStorageContext()) { var ink = db.Memes.Where(m => m.Id == inkId).FirstOrDefault(); NavigateToPlayerWithInk(ink); } break; } } private void NavigateToEpisode(Episode episode) { var ignored = _navigationService.NavigateToPlayerAsync(episode); } private void NavigateToInkNote(InkNote ink) { var ignored = _navigationService.NavigateToInkNoteAsync(ink); } private void NavigateToPlayerWithInk(InkNote ink) { var ignored = _navigationService.NavigateToPlayerAsync(ink); } private void BuildInkNotesForEpisode(LocalStorageContext db) { var results = (from inks in db.Memes join eps in db.EpisodeCache on inks.EpisodeKey equals eps.Key select new { InkId = inks.Id, Title = eps.Title, Time = TimeSpan.FromMilliseconds(inks.Time), Type = inks.HasInk ? "Ink" : "Bookmark", Episode = eps, NoteText=inks.NoteText }).AsEnumerable().LambdaDistinct((a, b) => a.InkId == b.InkId).OrderBy(ob => ob.Time); var projected = from c in results group c by c.Title; IEnumerable> ps = projected; Notes = ps; } } } ================================================ FILE: src/BuildCast/ViewModels/PlayerViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.ViewModels { using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Threading.Tasks; using BuildCast.DataModel; using BuildCast.Services; using BuildCast.Services.Navigation; using Microsoft.Toolkit.Uwp.Helpers; using Windows.UI.Xaml.Navigation; public class PlayerViewModel : INavigableTo, INotifyPropertyChanged { private INavigationService _navigationService; private IRemotePlayerService _remotePlayerService; private IDisposable _subscriptionToken; public PlayerViewModel(INavigationService navigationService, IRemotePlayerService remotePlayerService) { _navigationService = navigationService; _remotePlayerService = remotePlayerService; } public event PropertyChangedEventHandler PropertyChanged; public ObservableCollection RemoteSystems { get; private set; } ///TODO: ON NAVIGATE AWAY REMOVE THE SUBSCRIPTION TOKEN public void GoToInkNote(InkNote note) { var ignored = _navigationService.NavigateToInkNoteAsync(note); } public async Task NavigatedTo(NavigationMode navigationMode, object parameter) { await _remotePlayerService.FindDevices(); RemoteSystems = new ObservableCollection(_remotePlayerService.AvailableSystems); _subscriptionToken = _remotePlayerService.SubscribeSystemsChange(new RemoteSystemsObserver(this)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(RemoteSystems))); } public void RefreshRemoteSystems(object sender, EventArgs e) { var ignored = _remotePlayerService.FindDevices(); } public async Task CreateRemoteControl(IRemoteSystemDescription remoteSystem) { IRemoteConnection remoteControl = await remoteSystem.PlayTo(); return remoteControl; } public class RemoteSystemsObserver : IAvailableSystemsObserver { private PlayerViewModel _viewModel; public RemoteSystemsObserver(PlayerViewModel viewModel) { _viewModel = viewModel; } public void Add(IRemoteSystemDescription description) { var ignored = DispatcherHelper.ExecuteOnUIThreadAsync(() => _viewModel.RemoteSystems.Add(description)); } public void Removed(IRemoteSystemDescription description) { var ignored = DispatcherHelper.ExecuteOnUIThreadAsync(() => _viewModel.RemoteSystems.Remove(description)); } } } } ================================================ FILE: src/BuildCast/ViewModels/SettingsViewModel.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** namespace BuildCast.ViewModels { using System.ComponentModel; using System.Threading.Tasks; using System.Windows.Input; using BuildCast.Helpers; using BuildCast.Services; using Microsoft.Toolkit.Uwp.Helpers; using Windows.ApplicationModel; using Windows.Storage; public class SettingsViewModel : INotifyPropertyChanged { private const string PopupModeKey = "RequestedPopupMode"; private ElementThemeExtended _elementTheme = ThemeSelectorService.Theme; private PipModes _currentPipMode; private string _versionDescription; private ICommand _switchThemeCommand; private ICommand _switchPipModeCommand; /// /// Initializes a new instance of the class. /// public SettingsViewModel() { } public event PropertyChangedEventHandler PropertyChanged; public PipModes CurrentPipMode { get { return _currentPipMode; } set { if (_currentPipMode != value) { _currentPipMode = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CurrentPipMode))); } } } public static async Task GetCurrentMode() { return await GetCurrent(); } public ElementThemeExtended ElementThemeExtended { get { return _elementTheme; } set { if (_elementTheme != value) { _elementTheme = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(VersionDescription))); } } } public string VersionDescription { get { return _versionDescription; } set { if (_versionDescription != value) { _versionDescription = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(VersionDescription))); } } } public ICommand SwitchThemeCommand { get { if (_switchThemeCommand == null) { _switchThemeCommand = new RelayCommand( async (param) => { await ThemeSelectorService.SetThemeAsync(param); }); } return _switchThemeCommand; } } public ICommand SwitchPipModeCommand { get { if (_switchPipModeCommand == null) { _switchPipModeCommand = new RelayCommand( async (param) => { await SettingsViewModel.SetCurrent(param); }); } return _switchPipModeCommand; } } public void Initialize() { VersionDescription = GetVersionDescription(); var task = GetCurrent().ContinueWith(async (modes) => { await DispatcherHelper.ExecuteOnUIThreadAsync(() => { CurrentPipMode = modes.Result; }); }); } public async Task NavigatedTo() { CurrentPipMode = await GetCurrentMode(); } private static async Task SetCurrent(PipModes value) { await ApplicationData.Current.LocalSettings.SaveAsync(PopupModeKey, value); } private static async Task GetCurrent() { return await ApplicationData.Current.LocalSettings.ReadAsync(PopupModeKey); } private string GetVersionDescription() { var package = Package.Current; var packageId = package.Id; var version = packageId.Version; return $"{package.DisplayName} - {version.Major}.{version.Minor}.{version.Build}.{version.Revision}"; } } } ================================================ FILE: src/BuildCast/Views/Downloads.xaml ================================================  0,37,0,0 0,30,0,0 ================================================ FILE: src/BuildCast/Views/Downloads.xaml.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using BuildCast.DataModel; using BuildCast.Helpers; using BuildCast.Services.Navigation; using BuildCast.ViewModels; using System; using System.Diagnostics; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Hosting; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media.Animation; using Windows.UI.Xaml.Navigation; namespace BuildCast.Views { public sealed partial class Downloads : Page, IPageWithViewModel { private UIElement cachedSecondaryPlayIcon = null; private UIElement cachedDeleteButtonIcon = null; public DownloadsViewModel ViewModel { get; set; } public Downloads() { this.InitializeComponent(); } public void UpdateBindings() { // Bindings?.Update(); } protected override void OnNavigatedTo(NavigationEventArgs e) { SetupMenuFlyout(); Canvas.SetZIndex(this, 0); } protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { base.OnNavigatingFrom(e); Canvas.SetZIndex(this, 1); } private async void Downloads_Loaded(object sender, RoutedEventArgs e) { await ViewModel.LoadDownloads(); } private void MenuFlyout_Opening(object sender, object e) { MenuFlyout senderAsMenuFlyout = sender as MenuFlyout; foreach (object menuFlyoutItem in senderAsMenuFlyout.Items) { if (menuFlyoutItem.GetType() == typeof(MenuFlyoutItem)) { // Associate the particular FeedItem with the menu flyout (so the MenuFlyoutItem knows which FeedItem to act upon) ListViewItem itemContainer = senderAsMenuFlyout.Target as ListViewItem; var feedItem = downloadListView.ItemFromContainer(itemContainer) as EpisodeWithState; (menuFlyoutItem as MenuFlyoutItem).CommandParameter = feedItem.Episode; } } } private void DownloadListView_Tapped(object sender, ItemClickEventArgs e) { if (e.ClickedItem is EpisodeWithState) { ViewModel.NavigateToEpisode((e.ClickedItem as EpisodeWithState).Episode); return; } } private void SetupMenuFlyout() { // Associate the menu with the item requesting it. MenuFlyout menu = new MenuFlyout(); menu.Opening += MenuFlyout_Opening; // Add click handlers to the menu flyout items. MenuFlyoutItem item = new MenuFlyoutItem { Text = "Remove item", Icon = new SymbolIcon { Symbol = Symbol.Delete } }; menu.Items.Add(item); } private void Grid_PointerEntered(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e) { Grid originGrid = (Grid)sender; Grid hoverGrid = (Grid)originGrid.Children[originGrid.Children.Count - 1]; hoverGrid.Visibility = Visibility.Visible; } private void Grid_PointerExited(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e) { Grid originGrid = (Grid)sender; Grid hoverGrid = (Grid)originGrid.Children[originGrid.Children.Count - 1]; hoverGrid.Visibility = Visibility.Collapsed; } private void DeleteDownload(Episode episode) => ViewModel.RemoveDownloadedEpisode(episode); private void RefreshList() => ViewModel.ReloadDownloadList(); private void AppBarButton_Click(object sender, RoutedEventArgs e) { EpisodeWithState episodePointer = (EpisodeWithState)(sender as AppBarButton).DataContext; DeleteDownload(episodePointer.Episode); } private void swipeDelete_Invoked(SwipeItem sender, SwipeItemInvokedEventArgs args) { if (args.SwipeControl.DataContext is EpisodeWithState target) { if (target.Episode != null) { DeleteDownload(target.Episode); } } } private void MenuFlyoutItem_Click(object sender, RoutedEventArgs e) { DeleteDownload((sender as MenuFlyoutItem).CommandParameter as Episode); RefreshList(); } private void ContainerItem_PointerEntered(object sender, PointerRoutedEventArgs e) { // Only show the hover buttons when the mouse or pen enters the item. if (e.Pointer.PointerDeviceType != Windows.Devices.Input.PointerDeviceType.Touch) { try { var item = sender as ListViewItem; var secondaryPlayIcon = item.GetVisualChildByName("PlayIcon"); var secondaryCommandPanel = item.GetVisualChildByName("SecondaryCommandPanel"); var deleteIconButton = secondaryCommandPanel.GetVisualChildByName ================================================ FILE: src/BuildCast/Views/Favorites.xaml.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using BuildCast.DataModel; using BuildCast.Helpers; using BuildCast.Services.Navigation; using BuildCast.ViewModels; using System; using System.Diagnostics; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Hosting; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media.Animation; using Windows.UI.Xaml.Navigation; namespace BuildCast.Views { public sealed partial class Favorites : Page, IPageWithViewModel { private UIElement cachedSecondaryCommandChildPanel = null; private UIElement cachedSecondaryPlayIcon = null; public Favorites() { this.InitializeComponent(); //lstFilter.SelectedItem = 0; } public FavoritesViewModel ViewModel { get; set; } public void UpdateBindings() { //Bindings?.Update(); } protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { base.OnNavigatingFrom(e); Canvas.SetZIndex(this, 1); } protected override void OnNavigatedTo(NavigationEventArgs e) { SetupMenuFlyout(); Canvas.SetZIndex(this, 0); } private async void Favorites_Loaded(object sender, RoutedEventArgs e) { await ViewModel.LoadFavorites(); } private void MenuFlyout_Opening(object sender, object e) { MenuFlyout senderAsMenuFlyout = sender as MenuFlyout; foreach (object menuFlyoutItem in senderAsMenuFlyout.Items) { if (menuFlyoutItem.GetType() == typeof(MenuFlyoutItem)) { // Associate the particular FeedItem with the menu flyout (so the MenuFlyoutItem knows which FeedItem to act upon) ListViewItem itemContainer = senderAsMenuFlyout.Target as ListViewItem; var data = favoriteListView.ItemFromContainer(itemContainer); (menuFlyoutItem as MenuFlyoutItem).CommandParameter = data; } } } private void SetupMenuFlyout() { // Associate the menu with the item requesting it. MenuFlyout menu = new MenuFlyout(); menu.Opening += MenuFlyout_Opening; // Add click handlers to the menu flyout items. MenuFlyoutItem item = new MenuFlyoutItem { Text = "Remove item", Icon = new SymbolIcon { Symbol = Symbol.Delete } }; menu.Items.Add(item); } private void FavoriteListView_Tapped(object sender, ItemClickEventArgs e) { if (e.ClickedItem is EpisodeWithState episode) { ViewModel.NavigateToEpisodeAsync(episode.Episode); } } private void DownloadEpisode(Episode episode) => ViewModel.DownloadEpisode(episode); private void RemoveFavoritedEpisode(Episode episode) => ViewModel.RemoveFavoritedEpisode(episode); private void DeleteEpisode(Episode episode) => ViewModel.RemoveDownloadedEpisode(episode); private void RefreshList() => ViewModel.Refresh(); private void ContainerItem_PointerEntered(object sender, PointerRoutedEventArgs e) { // Only show the hover buttons when the mouse or pen enters the item. if (e.Pointer.PointerDeviceType != Windows.Devices.Input.PointerDeviceType.Touch) { try { var item = sender as ListViewItem; var secondaryCommandPanel = item.GetVisualChildByName("SecondaryCommandPanel"); var commandPanelChildHolder = secondaryCommandPanel.GetVisualChildByName("ButtonHolder"); var commandPanelChild = commandPanelChildHolder.GetVisualChildByName ================================================ FILE: src/BuildCast/Views/PopupPlayer.xaml.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using BuildCast.Controls; using BuildCast.Helpers; using BuildCast.Services; using Windows.UI.Composition; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Hosting; namespace BuildCast.Views { public sealed partial class PopupPlayer : Page { private SpriteVisual _playerVisual; private PipModes _mode; public PopupPlayer(PipModes mode) { this.InitializeComponent(); _playerVisual = Window.Current.Compositor.CreateSpriteVisual(); _mode = mode; if (_mode == PipModes.MultiView) { btnexit.Visibility = Visibility.Collapsed; } ElementCompositionPreview.SetElementChildVisual(playerHolder, _playerVisual); } public void StartVideo() { _playerVisual.Brush = PlayerService.Current.GetBrush(Window.Current.Compositor); } private void PlayerHolder_SizeChanged(object sender, SizeChangedEventArgs e) { _playerVisual.SetSize(playerHolder); } private async void Btnexit_LeaveCompactMode(object sender, RoutedEventArgs e) { await CustomMTC.LeaveCompactOverlayMode(); } } } ================================================ FILE: src/BuildCast/Views/SettingsPage.xaml ================================================  Light Dark Default Custom SingleView MultiView ================================================ FILE: src/BuildCast/Views/SettingsPage.xaml.cs ================================================ // ****************************************************************** // Copyright (c) Microsoft. All rights reserved. // This code is licensed under the MIT License (MIT). // THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH // THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE. // ****************************************************************** using BuildCast.Services.Navigation; using BuildCast.ViewModels; using Windows.UI.Xaml.Controls; namespace BuildCast.Views { public sealed partial class SettingsPage : Page, IPageWithViewModel { public SettingsViewModel ViewModel { get; set; } public SettingsPage() { InitializeComponent(); } public void UpdateBindings() { ViewModel.Initialize(); } } } ================================================ FILE: src/BuildCast.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26430.15 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildCast", "BuildCast\BuildCast.csproj", "{0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM = Debug|ARM Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|ARM = Release|ARM Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Debug|ARM.ActiveCfg = Debug|ARM {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Debug|ARM.Build.0 = Debug|ARM {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Debug|ARM.Deploy.0 = Debug|ARM {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Debug|x64.ActiveCfg = Debug|x64 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Debug|x64.Build.0 = Debug|x64 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Debug|x64.Deploy.0 = Debug|x64 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Debug|x86.ActiveCfg = Debug|x86 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Debug|x86.Build.0 = Debug|x86 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Debug|x86.Deploy.0 = Debug|x86 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Release|ARM.ActiveCfg = Release|ARM {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Release|ARM.Build.0 = Release|ARM {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Release|ARM.Deploy.0 = Release|ARM {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Release|x64.ActiveCfg = Release|x64 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Release|x64.Build.0 = Release|x64 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Release|x64.Deploy.0 = Release|x64 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Release|x86.ActiveCfg = Release|x86 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Release|x86.Build.0 = Release|x86 {0CE71FEF-9F1D-4CB7-BC36-0EEA48FDE380}.Release|x86.Deploy.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal