Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prompt user to install OpenXR package if not installed #24854

Merged
merged 1 commit into from Nov 26, 2019
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Prompt user to install OpenXR package if not installed

  • Loading branch information
paulrouget committed Nov 26, 2019
commit 75b522d2102cf420e8eda5a5a02649ba8e9c7321
@@ -18,6 +18,23 @@ namespace winrt::ServoApp::implementation {
BrowserPage::BrowserPage() {
InitializeComponent();
BindServoEvents();
if (!xrPkgChecker.IsInstalled()) {
XRPkgWarning().Visibility(Visibility::Visible);
xrPkgChecker.OnInstalled(
[=] { XRPkgWarning().Visibility(Visibility::Collapsed); },
std::chrono::seconds{5});
}
}

void BrowserPage::OnXRPkgWarningDismissClick(IInspectable const &,
RoutedEventArgs const &) {
xrPkgChecker.StopTracking();
XRPkgWarning().Visibility(Visibility::Collapsed);
}

void BrowserPage::OnXRPkgWarningInstallClick(IInspectable const &,
RoutedEventArgs const &) {
xrPkgChecker.OpenStore();
}

void BrowserPage::BindServoEvents() {
@@ -5,6 +5,7 @@
#pragma once

#include "BrowserPage.g.h"
#include "XRPkgChecker.h"
#include "ServoControl\ServoControl.h"

namespace winrt::ServoApp::implementation {
@@ -34,9 +35,14 @@ struct BrowserPage : BrowserPageT<BrowserPage> {
void LoadServoURI(Windows::Foundation::Uri uri);
void SetTransientMode(bool);
void SetArgs(hstring);
void OnXRPkgWarningInstallClick(Windows::Foundation::IInspectable const &,
Windows::UI::Xaml::RoutedEventArgs const &);
void OnXRPkgWarningDismissClick(Windows::Foundation::IInspectable const &,
Windows::UI::Xaml::RoutedEventArgs const &);

private:
void BindServoEvents();
XRPkgChecker xrPkgChecker;
};
} // namespace winrt::ServoApp::implementation

@@ -84,6 +84,7 @@
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" x:Name="navigationBar" Background="{ThemeResource InkToolbarButtonBackgroundThemeBrush}">
<Grid.ColumnDefinitions>
@@ -126,5 +127,12 @@
</Grid>
<local:ServoControl TabIndex="0" x:Name="servoControl" Grid.Row="1"/>
<ProgressBar x:Name="transientLoadingIndicator" Visibility="Collapsed" Grid.Row="2"/>
<StackPanel Grid.Row="2" Background="LightYellow" Padding="10" BorderThickness="0,2,0,0" BorderBrush="Black" x:Name="XRPkgWarning" Visibility="Collapsed">
<TextBlock Margin="0,0" VerticalAlignment="Center">The package "Windows OpenXR Developer Preview" is not installed. WebXR pages won't work.</TextBlock>
<StackPanel Orientation="Horizontal">
<Button Margin="0,10,10,0" Click="OnXRPkgWarningInstallClick">Install Package</Button>
<Button Margin="0,10,10,0" Click="OnXRPkgWarningDismissClick">Dismiss</Button>
</StackPanel>
</StackPanel>
</Grid>
</Page>
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5" IgnorableNamespaces="uap mp uap5">
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap mp uap5 rescap">
<Identity Name="1d265729-8836-4bd3-9992-4cb111d1068b" Publisher="CN=Allizom" Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="1d265729-8836-4bd3-9992-4cb111d1068b" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
<Properties>
@@ -44,6 +50,7 @@
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="packageQuery" />
<Capability Name="internetClient" />
<Capability Name="codeGeneration" />
<Capability Name="privateNetworkClientServer" />
@@ -133,6 +133,7 @@
<ClInclude Include="ServoControl\Servo.h" />
<ClInclude Include="ServoControl\ServoControl.h" />
<ClInclude Include="DefaultUrl.h" />
<ClInclude Include="XRPkgChecker.h" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
@@ -928,6 +929,7 @@
<ClCompile Include="ServoControl\OpenGLES.cpp" />
<ClCompile Include="ServoControl\Servo.cpp" />
<ClCompile Include="ServoControl\ServoControl.cpp" />
<ClCompile Include="XRPkgChecker.cpp" />
</ItemGroup>
<ItemGroup>
<Midl Include="App.idl">
@@ -22,6 +22,7 @@
<ClCompile Include="ServoControl\ServoControl.cpp">
<Filter>ServoControl</Filter>
</ClCompile>
<ClCompile Include="XRPkgChecker.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch.h" />
@@ -38,6 +39,7 @@
<Filter>ServoControl</Filter>
</ClInclude>
<ClInclude Include="DefaultUrl.h" />
<ClInclude Include="XRPkgChecker.h" />
</ItemGroup>
<ItemGroup>
<Image Include="Assets\Wide310x150Logo.scale-200.png">
@@ -0,0 +1,52 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */

#include "pch.h"
#include "XRPkgChecker.h"
#include "logs.h"
#include "winrt/Windows.Management.Deployment.h"

using namespace winrt::Windows::Management::Deployment;

namespace winrt {

void XRPkgChecker::OnInstalled(std::function<void()> callback,
winrt::Windows::Foundation::TimeSpan interval) {
timer.Stop();
timer.Interval(interval);
installed_callback = std::make_unique<std::function<void()>>(callback);
timer.Tick({this, &XRPkgChecker::CheckXRPkgTick});
timer.Start();
}

void XRPkgChecker::StopTracking() {
installed_callback.reset();
timer.Stop();
}

void XRPkgChecker::CheckXRPkgTick(Windows::Foundation::IInspectable const &,
Windows::Foundation::IInspectable const &) {
if (IsInstalled()) {
(*installed_callback)();
StopTracking();
}
}

void XRPkgChecker::OpenStore() {
std::wstring url = L"ms-windows-store://pdp/?PFN=";
Windows::Foundation::Uri uri{url + OPENXR_PACKAGE_NAME};
Windows::System::Launcher::LaunchUriAsync(uri);
}

bool XRPkgChecker::IsInstalled() {
auto current_user = L"";
for (auto package : PackageManager().FindPackagesForUser(current_user)) {
if (package.Id().Name() == OPENXR_PACKAGE_SHORT_NAME) {
return true;
}
}
return false;
}

} // namespace winrt
@@ -0,0 +1,30 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */

#pragma once

#include "pch.h"

namespace winrt {
class XRPkgChecker {

public:
void OnInstalled(std::function<void()> callback,
winrt::Windows::Foundation::TimeSpan interval);
bool IsInstalled();
void StopTracking();
void OpenStore();

private:
std::unique_ptr<std::function<void()>> installed_callback;
void CheckXRPkgTick(Windows::Foundation::IInspectable const &,
Windows::Foundation::IInspectable const &);
Windows::UI::Xaml::DispatcherTimer timer;
inline static const hstring OPENXR_PACKAGE_NAME =
L"Microsoft.MixedRealityRuntimeDeveloperPreview_8wekyb3d8bbwe";
inline static const hstring OPENXR_PACKAGE_SHORT_NAME =
L"Microsoft.MixedRealityRuntimeDeveloperPreview";
};

} // namespace winrt
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.