diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index aa98724a7d..08bb81f5df 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -673,9 +673,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : // The value will be 0 if the user blew away settings this session, which is both a feature and a bug. UserActivityLogger::getInstance().launch(applicationVersion(), _previousSessionCrashed, sessionRunTime.get()); - // once the event loop has started, check and signal for an access token - QMetaObject::invokeMethod(&accountManager, "checkAndSignalForAccessToken", Qt::QueuedConnection); - auto addressManager = DependencyManager::get(); // use our MyAvatar position and quat for address manager path @@ -1089,6 +1086,11 @@ void Application::checkChangeCursor() { _cursorNeedsChanging = false; } + + + // After all of the constructor is completed, then set firstRun to false. + Setting::Handle firstRun{ Settings::firstRun, true }; + firstRun.set(false); } void Application::showCursor(const QCursor& cursor) { @@ -1298,8 +1300,6 @@ void Application::initializeGL() { // update before the first render update(0); - - InfoView::show(INFO_HELP_PATH, true); } FrameTimingsScriptingInterface _frameTimingsScriptingInterface; @@ -2959,7 +2959,21 @@ void Application::init() { addressLookupString = arguments().value(urlIndex + 1); } - DependencyManager::get()->loadSettings(addressLookupString); + Setting::Handle firstRun { Settings::firstRun, true }; + if (addressLookupString.isEmpty() && firstRun.get()) { + qDebug() << "First run and no URL passed... attempting to go to Home or Entry..."; + DependencyManager::get()->ifLocalSandboxRunningElse([](){ + qDebug() << "Home sandbox appears to be running, going to Home."; + DependencyManager::get()->goToLocalSandbox(); + }, + [](){ + qDebug() << "Home sandbox does not appear to be running, going to Entry."; + DependencyManager::get()->goToEntry(); + }); + } else { + qDebug() << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString); + DependencyManager::get()->loadSettings(addressLookupString); + } qCDebug(interfaceapp) << "Loaded settings"; diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 03b33eae38..757e145c9a 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -629,3 +629,32 @@ void AddressManager::addCurrentAddressToHistory(LookupTrigger trigger) { } } } + +void AddressManager::ifLocalSandboxRunningElse(std::function localSandboxRunningDoThis, + std::function localSandboxNotRunningDoThat) { + + QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkRequest sandboxStatus(SANDBOX_STATUS_URL); + sandboxStatus.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(sandboxStatus); + + connect(reply, &QNetworkReply::finished, this, [reply, localSandboxRunningDoThis, localSandboxNotRunningDoThat]() { + auto statusData = reply->readAll(); + auto statusJson = QJsonDocument::fromJson(statusData); + if (!statusJson.isEmpty()) { + auto statusObject = statusJson.object(); + auto serversValue = statusObject.value("servers"); + if (!serversValue.isUndefined() && serversValue.isObject()) { + auto serversObject = serversValue.toObject(); + auto serversCount = serversObject.size(); + const int MINIMUM_EXPECTED_SERVER_COUNT = 5; + if (serversCount >= MINIMUM_EXPECTED_SERVER_COUNT) { + localSandboxRunningDoThis(); + return; + } + } + } + localSandboxNotRunningDoThat(); + }); +} + diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index e0b54e4072..c0ba69018c 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -24,6 +24,8 @@ const QString HIFI_URL_SCHEME = "hifi"; const QString DEFAULT_HIFI_ADDRESS = "hifi://entry"; +const QString SANDBOX_HIFI_ADDRESS = "hifi://localhost"; +const QString SANDBOX_STATUS_URL = "http://localhost:60332/status"; const QString INDEX_PATH = "/"; const QString GET_PLACE = "/api/v1/places/%1"; @@ -65,6 +67,11 @@ public: const QStack& getBackStack() const { return _backStack; } const QStack& getForwardStack() const { return _forwardStack; } + /// determines if the local sandbox is likely running. It does not account for custom setups, and is only + /// intended to detect the standard local sandbox install. + void ifLocalSandboxRunningElse(std::function localSandboxRunningDoThis, + std::function localSandboxNotRunningDoThat); + public slots: void handleLookupString(const QString& lookupString); @@ -74,6 +81,8 @@ public slots: void goBack(); void goForward(); + void goToLocalSandbox(LookupTrigger trigger = LookupTrigger::StartupFromSettings) { handleUrl(SANDBOX_HIFI_ADDRESS, trigger); } + void goToEntry(LookupTrigger trigger = LookupTrigger::StartupFromSettings) { handleUrl(DEFAULT_HIFI_ADDRESS, trigger); } void goToUser(const QString& username); diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index cf82d9db4f..330a94cf0b 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -271,12 +271,12 @@ void ScriptEngines::loadOneScript(const QString& scriptFilename) { void ScriptEngines::loadScripts() { // check first run... - if (_firstRun.get()) { + Setting::Handle firstRun { Settings::firstRun, true }; + if (firstRun.get()) { qCDebug(scriptengine) << "This is a first run..."; // clear the scripts, and set out script to our default scripts clearScripts(); loadDefaultScripts(); - _firstRun.set(false); return; } diff --git a/libraries/script-engine/src/ScriptEngines.h b/libraries/script-engine/src/ScriptEngines.h index 0963b21600..6522aa9bb3 100644 --- a/libraries/script-engine/src/ScriptEngines.h +++ b/libraries/script-engine/src/ScriptEngines.h @@ -87,8 +87,6 @@ protected: void onScriptEngineError(const QString& scriptFilename); void launchScriptEngine(ScriptEngine* engine); - - Setting::Handle _firstRun { "firstRun", true }; QReadWriteLock _scriptEnginesHashLock; QHash _scriptEnginesHash; QSet _allKnownScriptEngines; diff --git a/libraries/shared/src/SettingHandle.cpp b/libraries/shared/src/SettingHandle.cpp index 951d004318..d2e84d8b75 100644 --- a/libraries/shared/src/SettingHandle.cpp +++ b/libraries/shared/src/SettingHandle.cpp @@ -13,6 +13,7 @@ #include +const QString Settings::firstRun { "firstRun" }; void Settings::getFloatValueIfValid(const QString& name, float& floatValue) { const QVariant badDefaultValue = NAN; diff --git a/libraries/shared/src/SettingHandle.h b/libraries/shared/src/SettingHandle.h index c803efaa71..bef2daf84c 100644 --- a/libraries/shared/src/SettingHandle.h +++ b/libraries/shared/src/SettingHandle.h @@ -26,6 +26,8 @@ // TODO: remove class Settings : public QSettings { public: + static const QString firstRun; + void getFloatValueIfValid(const QString& name, float& floatValue); void getBoolValue(const QString& name, bool& boolValue);