diff --git a/interface/resources/qml/LoginDialog/LinkAccountBody.qml b/interface/resources/qml/LoginDialog/LinkAccountBody.qml index 578a8f6976..97cc370639 100644 --- a/interface/resources/qml/LoginDialog/LinkAccountBody.qml +++ b/interface/resources/qml/LoginDialog/LinkAccountBody.qml @@ -394,7 +394,7 @@ Item { buttonGlyphSize: 24 buttonGlyphRightMargin: 10 onClicked: { - // if (loginDialog.isOculusStoreRunning()) { + // if (loginDialog.isOculusRunning()) { // linkAccountBody.withOculus = true; // loginDialog.loginThroughSteam(); // } else @@ -411,7 +411,7 @@ Item { continueButton.visible = false; return; } - if (loginDialog.isOculusStoreRunning()) { + if (loginDialog.isOculusRunning()) { continueButton.text = qsTr("CONTINUE WITH OCULUS"); continueButton.buttonGlyph = hifi.glyphs.oculus; } else if (loginDialog.isSteamRunning()) { @@ -539,6 +539,9 @@ Item { Qt.callLater(function() { emailField.forceActiveFocus(); }); + if (loginDialog.isOculusRunning()) { + print(loginDialog.getLoggedInUserID()); + } } Keys.onPressed: { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 36fb666f69..902e698a3a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -120,6 +120,7 @@ #include #include #include +#include #include #include #include @@ -793,7 +794,6 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { if (auto steamClient = pluginManager->getSteamClientPlugin()) { steamClient->init(); } - PROFILE_SET_THREAD_NAME("Main Thread"); #if defined(Q_OS_WIN) @@ -999,6 +999,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo { auto steamClient = PluginManager::getInstance()->getSteamClientPlugin(); + auto oculusPlatform = PluginManager::getInstance()->getOculusPlatformPlugin(); setProperty(hifi::properties::STEAM, (steamClient && steamClient->isRunning())); setProperty(hifi::properties::CRASHED, _previousSessionCrashed); @@ -1130,6 +1131,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo bool isStore = arguments().indexOf(OCULUS_STORE_ARG) != -1; setProperty(hifi::properties::OCULUS_STORE, isStore); DependencyManager::get()->setLimitedCommerce(isStore); // Or we could make it a separate arg, or if either arg is set, etc. And should this instead by a hifi::properties? + if (auto oculusPlatform = PluginManager::getInstance()->getOculusPlatformPlugin()) { + oculusPlatform->init(); + } updateHeartbeat(); @@ -2652,6 +2656,10 @@ Application::~Application() { if (auto steamClient = PluginManager::getInstance()->getSteamClientPlugin()) { steamClient->shutdown(); } + if (auto oculusPlatform = PluginManager::getInstance()->getOculusPlatformPlugin()) { + oculusPlatform->shutdown(); + } + DependencyManager::destroy(); DependencyManager::destroy(); // must be destroyed before the FramebufferCache diff --git a/interface/src/ui/LoginDialog.cpp b/interface/src/ui/LoginDialog.cpp index 8e510a286a..834c381593 100644 --- a/interface/src/ui/LoginDialog.cpp +++ b/interface/src/ui/LoginDialog.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -104,8 +105,16 @@ bool LoginDialog::isSteamRunning() const { return steamClient && steamClient->isRunning(); } -bool LoginDialog::isOculusStoreRunning() const { - return qApp->property(hifi::properties::OCULUS_STORE).toBool(); +bool LoginDialog::isOculusRunning() const { + auto oculusPlatform = PluginManager::getInstance()->getOculusPlatformPlugin(); + return oculusPlatform && oculusPlatform->isRunning(); +} + +QString LoginDialog::getLoggedInUserID() const { + auto oculusPlatform = PluginManager::getInstance()->getOculusPlatformPlugin(); + auto userID = oculusPlatform->getLoggedInUserID(); + qDebug() << "userID: " << userID; + return userID; } void LoginDialog::dismissLoginDialog() { diff --git a/interface/src/ui/LoginDialog.h b/interface/src/ui/LoginDialog.h index 40e8d798ef..ca17d40b13 100644 --- a/interface/src/ui/LoginDialog.h +++ b/interface/src/ui/LoginDialog.h @@ -67,7 +67,8 @@ protected slots: Q_INVOKABLE void dismissLoginDialog(); Q_INVOKABLE bool isSteamRunning() const; - Q_INVOKABLE bool isOculusStoreRunning() const; + Q_INVOKABLE bool isOculusRunning() const; + Q_INVOKABLE QString getLoggedInUserID() const; Q_INVOKABLE void login(const QString& username, const QString& password) const; Q_INVOKABLE void loginThroughSteam(); diff --git a/libraries/plugins/src/plugins/Forward.h b/libraries/plugins/src/plugins/Forward.h index 90746d648e..fc1e12b639 100644 --- a/libraries/plugins/src/plugins/Forward.h +++ b/libraries/plugins/src/plugins/Forward.h @@ -21,6 +21,7 @@ class DisplayPlugin; class InputPlugin; class CodecPlugin; class SteamClientPlugin; +class OculusPlatformPlugin; class Plugin; class PluginContainer; class PluginManager; @@ -35,4 +36,5 @@ using CodecPluginPointer = std::shared_ptr; using CodecPluginList = std::vector; using CodecPluginProvider = std::function; using SteamClientPluginPointer = std::shared_ptr; +using OculusPlatformPluginPointer = std::shared_ptr; using InputPluginSettingsPersister = std::function; diff --git a/libraries/plugins/src/plugins/PluginManager.cpp b/libraries/plugins/src/plugins/PluginManager.cpp index 32d8486e7a..dcd5144938 100644 --- a/libraries/plugins/src/plugins/PluginManager.cpp +++ b/libraries/plugins/src/plugins/PluginManager.cpp @@ -179,6 +179,23 @@ const SteamClientPluginPointer PluginManager::getSteamClientPlugin() { return steamClientPlugin; } +const OculusPlatformPluginPointer PluginManager::getOculusPlatformPlugin() { + static OculusPlatformPluginPointer oculusPlatformPlugin; + static std::once_flag once; + std::call_once(once, [&] { + // Now grab the dynamic plugins + for (auto loader : getLoadedPlugins()) { + OculusPlatformProvider* oculusPlatformProvider = qobject_cast(loader->instance()); + if (oculusPlatformProvider) { + oculusPlatformPlugin = oculusPlatformProvider->getOculusPlatformPlugin(); + break; + } + + } + }); + return oculusPlatformPlugin; +} + const DisplayPluginList& PluginManager::getDisplayPlugins() { static std::once_flag once; static auto deviceAddedCallback = [](QString deviceName) { diff --git a/libraries/plugins/src/plugins/PluginManager.h b/libraries/plugins/src/plugins/PluginManager.h index c7489fd7e4..dc3e3fd856 100644 --- a/libraries/plugins/src/plugins/PluginManager.h +++ b/libraries/plugins/src/plugins/PluginManager.h @@ -28,6 +28,7 @@ public: const InputPluginList& getInputPlugins(); const CodecPluginList& getCodecPlugins(); const SteamClientPluginPointer getSteamClientPlugin(); + const OculusPlatformPluginPointer getOculusPlatformPlugin(); DisplayPluginList getPreferredDisplayPlugins(); void setPreferredDisplayPlugins(const QStringList& displays); diff --git a/libraries/plugins/src/plugins/RuntimePlugin.h b/libraries/plugins/src/plugins/RuntimePlugin.h index 9a7d6e0638..bcdd66f4f7 100644 --- a/libraries/plugins/src/plugins/RuntimePlugin.h +++ b/libraries/plugins/src/plugins/RuntimePlugin.h @@ -51,5 +51,15 @@ public: virtual SteamClientPluginPointer getSteamClientPlugin() = 0; }; +class OculusPlatformProvider { +public: + virtual ~OculusPlatformProvider() {} + virtual OculusPlatformPluginPointer getOculusPlatformPlugin() = 0; +}; + #define SteamClientProvider_iid "com.highfidelity.plugins.steamclient" Q_DECLARE_INTERFACE(SteamClientProvider, SteamClientProvider_iid) + + +#define OculusPlatformProvider_iid "com.highfidelity.plugins.oculusplatform" +Q_DECLARE_INTERFACE(OculusPlatformProvider, OculusPlatformProvider_iid) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 4a0f52e272..d52df1274e 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -34,6 +34,8 @@ if (NOT SERVER_ONLY AND NOT ANDROID) add_subdirectory(${DIR}) set(DIR "steamClient") add_subdirectory(${DIR}) + set(DIR "oculusPlatform") + add_subdirectory(${DIR}) set(DIR "hifiLeapMotion") add_subdirectory(${DIR}) endif() diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp index 106194d4c3..29691e73a5 100644 --- a/plugins/oculus/src/OculusHelpers.cpp +++ b/plugins/oculus/src/OculusHelpers.cpp @@ -174,18 +174,6 @@ ovrTrackingState ovr::getTrackingState(double absTime, ovrBool latencyMarker) { return result; } -QString ovr::getLoggedInUserID() { - ovr_GetLoggedInUserID(); - ovrMessageHandle message = ovr_PopMessage(); - if (!ovr_Message_IsError(message)) { - ovrUserHandle user = ovr_Message_GetUser(message); - qCDebug(oculusLog) << "User is: " << ovr_User_GetID(user) << ", " << ovr_User_GetOculusID(user); - } else { - auto error = ovr_Message_GetError(message); - qCDebug(oculusLog) << "User failure error: " << ovr_Error_GetMessage(error); - } -} - QString ovr::getError() { static ovrErrorInfo error; ovr_GetLastErrorInfo(&error); diff --git a/plugins/oculus/src/OculusHelpers.h b/plugins/oculus/src/OculusHelpers.h index 56f4af8043..bdfc4434bb 100644 --- a/plugins/oculus/src/OculusHelpers.h +++ b/plugins/oculus/src/OculusHelpers.h @@ -29,7 +29,6 @@ struct ovr { static ovrSessionStatus getStatus(); static ovrSessionStatus getStatus(ovrResult& result); static ovrTrackingState getTrackingState(double absTime = 0.0, ovrBool latencyMarker = ovrFalse); - static QString getLoggedInUserID(); static QString getError(); static bool handleOVREvents();