From 550738776c0b39a3fed5caad4a6b1ea9efc1d43d Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 23 Mar 2016 15:56:29 -0700 Subject: [PATCH 1/5] Pass whether or not previous session crashed to the UserActivityLogger. --- interface/src/Application.cpp | 8 ++++---- interface/src/Application.h | 2 +- interface/src/CrashHandler.cpp | 4 +++- interface/src/CrashHandler.h | 2 +- libraries/networking/src/UserActivityLogger.cpp | 4 +++- libraries/networking/src/UserActivityLogger.h | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7e88ea28dc..f96dcb0335 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -369,7 +369,7 @@ bool setupEssentials(int& argc, char** argv) { Setting::preInit(); - CrashHandler::checkForAndHandleCrash(); + bool previousSessionCrashed = CrashHandler::checkForAndHandleCrash(); CrashHandler::writeRunningMarkerFiler(); qAddPostRoutine(CrashHandler::deleteRunningMarkerFile); @@ -431,7 +431,7 @@ bool setupEssentials(int& argc, char** argv) { DependencyManager::set(); DependencyManager::set(true, qApp, qApp); DependencyManager::set(); - return true; + return previousSessionCrashed; } // FIXME move to header, or better yet, design some kind of UI manager @@ -455,7 +455,7 @@ Q_GUI_EXPORT void qt_gl_set_global_share_context(QOpenGLContext *context); Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : QApplication(argc, argv), _window(new MainWindow(desktop())), - _dependencyManagerIsSetup(setupEssentials(argc, argv)), + _previousSessionCrashed(setupEssentials(argc, argv)), _undoStackScriptingInterface(&_undoStack), _frameCount(0), _fps(60.0f), @@ -642,7 +642,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : accountManager.setIsAgent(true); accountManager.setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL); - UserActivityLogger::getInstance().launch(applicationVersion()); + UserActivityLogger::getInstance().launch(applicationVersion(), _previousSessionCrashed); // once the event loop has started, check and signal for an access token QMetaObject::invokeMethod(&accountManager, "checkAndSignalForAccessToken", Qt::QueuedConnection); diff --git a/interface/src/Application.h b/interface/src/Application.h index 4c12164a5f..206a37ce58 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -376,7 +376,7 @@ private: MainWindow* _window; - bool _dependencyManagerIsSetup; + bool _previousSessionCrashed; OffscreenGLCanvas* _offscreenContext { nullptr }; DisplayPluginPointer _displayPlugin; diff --git a/interface/src/CrashHandler.cpp b/interface/src/CrashHandler.cpp index 5a194973b4..50cca15c88 100644 --- a/interface/src/CrashHandler.cpp +++ b/interface/src/CrashHandler.cpp @@ -27,7 +27,7 @@ static const QString RUNNING_MARKER_FILENAME = "Interface.running"; -void CrashHandler::checkForAndHandleCrash() { +bool CrashHandler::checkForAndHandleCrash() { QFile runningMarkerFile(runningMarkerFilePath()); if (runningMarkerFile.exists()) { QSettings::setDefaultFormat(QSettings::IniFormat); @@ -42,7 +42,9 @@ void CrashHandler::checkForAndHandleCrash() { handleCrash(action); } } + return true; } + return false; } CrashHandler::Action CrashHandler::promptUserForAction() { diff --git a/interface/src/CrashHandler.h b/interface/src/CrashHandler.h index 61361b6107..18c935b595 100644 --- a/interface/src/CrashHandler.h +++ b/interface/src/CrashHandler.h @@ -17,7 +17,7 @@ class CrashHandler { public: - static void checkForAndHandleCrash(); + static bool checkForAndHandleCrash(); static void writeRunningMarkerFiler(); static void deleteRunningMarkerFile(); diff --git a/libraries/networking/src/UserActivityLogger.cpp b/libraries/networking/src/UserActivityLogger.cpp index f2019ba9a9..05144d8cb0 100644 --- a/libraries/networking/src/UserActivityLogger.cpp +++ b/libraries/networking/src/UserActivityLogger.cpp @@ -78,11 +78,13 @@ void UserActivityLogger::requestError(QNetworkReply& errorReply) { qCDebug(networking) << errorReply.error() << "-" << errorReply.errorString(); } -void UserActivityLogger::launch(QString applicationVersion) { +void UserActivityLogger::launch(QString applicationVersion, bool previousSessionCrashed) { const QString ACTION_NAME = "launch"; QJsonObject actionDetails; QString VERSION_KEY = "version"; + QString CRASH_KEY = "previousSessionCrashed"; actionDetails.insert(VERSION_KEY, applicationVersion); + actionDetails.insert(CRASH_KEY, previousSessionCrashed); logAction(ACTION_NAME, actionDetails); } diff --git a/libraries/networking/src/UserActivityLogger.h b/libraries/networking/src/UserActivityLogger.h index 2811be86a8..bfb7a42a50 100644 --- a/libraries/networking/src/UserActivityLogger.h +++ b/libraries/networking/src/UserActivityLogger.h @@ -29,7 +29,7 @@ public slots: void disable(bool disable); void logAction(QString action, QJsonObject details = QJsonObject(), JSONCallbackParameters params = JSONCallbackParameters()); - void launch(QString applicationVersion); + void launch(QString applicationVersion, bool previousSessionCrashed); void changedDisplayName(QString displayName); void changedModel(QString typeOfModel, QString modelURL); From c435ca212a603e0bb37a67b83464d125ee4cbac6 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 23 Mar 2016 16:59:17 -0700 Subject: [PATCH 2/5] Report previous session time. --- interface/src/Application.cpp | 14 +++++++++----- interface/src/Application.h | 1 + libraries/networking/src/UserActivityLogger.cpp | 4 +++- libraries/networking/src/UserActivityLogger.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f96dcb0335..4f13665fef 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -169,8 +169,6 @@ #include "Util.h" #include "InterfaceParentFinder.h" - - // ON WIndows PC, NVidia Optimus laptop, we want to enable NVIDIA GPU // FIXME seems to be broken. #if defined(Q_OS_WIN) @@ -195,6 +193,7 @@ static const QString FBX_EXTENSION = ".fbx"; static const QString OBJ_EXTENSION = ".obj"; static const QString AVA_JSON_EXTENSION = ".ava.json"; +static const int MSECS_PER_SEC = 1000; static const int MIRROR_VIEW_TOP_PADDING = 5; static const int MIRROR_VIEW_LEFT_PADDING = 10; static const int MIRROR_VIEW_WIDTH = 265; @@ -452,8 +451,11 @@ PluginContainer* _pluginContainer; OffscreenGLCanvas* _chromiumShareContext { nullptr }; Q_GUI_EXPORT void qt_gl_set_global_share_context(QOpenGLContext *context); +Setting::Handle sessionRunTime{ "sessionRunTime", 0 }; + Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : QApplication(argc, argv), + _sessionRunTimer(startupTimer), _window(new MainWindow(desktop())), _previousSessionCrashed(setupEssentials(argc, argv)), _undoStackScriptingInterface(&_undoStack), @@ -605,7 +607,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : connect(&domainHandler, SIGNAL(disconnectedFromDomain()), SLOT(clearDomainOctreeDetails())); // update our location every 5 seconds in the metaverse server, assuming that we are authenticated with one - const qint64 DATA_SERVER_LOCATION_CHANGE_UPDATE_MSECS = 5 * 1000; + const qint64 DATA_SERVER_LOCATION_CHANGE_UPDATE_MSECS = 5 * MSECS_PER_SEC; auto discoverabilityManager = DependencyManager::get(); connect(&locationUpdateTimer, &QTimer::timeout, discoverabilityManager.data(), &DiscoverabilityManager::updateLocation); @@ -627,7 +629,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : // connect to appropriate slots on AccountManager AccountManager& accountManager = AccountManager::getInstance(); - const qint64 BALANCE_UPDATE_INTERVAL_MSECS = 5 * 1000; + const qint64 BALANCE_UPDATE_INTERVAL_MSECS = 5 * MSECS_PER_SEC; connect(&balanceUpdateTimer, &QTimer::timeout, &accountManager, &AccountManager::updateBalance); balanceUpdateTimer.start(BALANCE_UPDATE_INTERVAL_MSECS); @@ -642,7 +644,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : accountManager.setIsAgent(true); accountManager.setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL); - UserActivityLogger::getInstance().launch(applicationVersion(), _previousSessionCrashed); + UserActivityLogger::getInstance().launch(applicationVersion(), _previousSessionCrashed, sessionRunTime.get()); // before loadSettings resets sessionRuntTime. // once the event loop has started, check and signal for an access token QMetaObject::invokeMethod(&accountManager, "checkAndSignalForAccessToken", Qt::QueuedConnection); @@ -2804,6 +2806,7 @@ bool Application::exportEntities(const QString& filename, float x, float y, floa void Application::loadSettings() { + sessionRunTime.set(0); // Just clean living. We're about to saveSettings, which will update value. DependencyManager::get()->loadSettings(); DependencyManager::get()->loadSettings(); @@ -2817,6 +2820,7 @@ void Application::loadSettings() { } void Application::saveSettings() { + sessionRunTime.set(_sessionRunTimer.elapsed() / MSECS_PER_SEC); DependencyManager::get()->saveSettings(); DependencyManager::get()->saveSettings(); diff --git a/interface/src/Application.h b/interface/src/Application.h index 206a37ce58..88c7602b6d 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -375,6 +375,7 @@ private: void maybeToggleMenuVisible(QMouseEvent* event); MainWindow* _window; + QElapsedTimer& _sessionRunTimer; bool _previousSessionCrashed; diff --git a/libraries/networking/src/UserActivityLogger.cpp b/libraries/networking/src/UserActivityLogger.cpp index 05144d8cb0..2e74a5166c 100644 --- a/libraries/networking/src/UserActivityLogger.cpp +++ b/libraries/networking/src/UserActivityLogger.cpp @@ -78,13 +78,15 @@ void UserActivityLogger::requestError(QNetworkReply& errorReply) { qCDebug(networking) << errorReply.error() << "-" << errorReply.errorString(); } -void UserActivityLogger::launch(QString applicationVersion, bool previousSessionCrashed) { +void UserActivityLogger::launch(QString applicationVersion, bool previousSessionCrashed, int previousSessionRuntime) { const QString ACTION_NAME = "launch"; QJsonObject actionDetails; QString VERSION_KEY = "version"; QString CRASH_KEY = "previousSessionCrashed"; + QString RUNTIME_KEY = "previousSessionRuntime"; actionDetails.insert(VERSION_KEY, applicationVersion); actionDetails.insert(CRASH_KEY, previousSessionCrashed); + actionDetails.insert(RUNTIME_KEY, previousSessionRuntime); logAction(ACTION_NAME, actionDetails); } diff --git a/libraries/networking/src/UserActivityLogger.h b/libraries/networking/src/UserActivityLogger.h index bfb7a42a50..8eda086521 100644 --- a/libraries/networking/src/UserActivityLogger.h +++ b/libraries/networking/src/UserActivityLogger.h @@ -29,7 +29,7 @@ public slots: void disable(bool disable); void logAction(QString action, QJsonObject details = QJsonObject(), JSONCallbackParameters params = JSONCallbackParameters()); - void launch(QString applicationVersion, bool previousSessionCrashed); + void launch(QString applicationVersion, bool previousSessionCrashed, int previousSessionRuntime); void changedDisplayName(QString displayName); void changedModel(QString typeOfModel, QString modelURL); From dbdf79f96ffa6598ba3bd7c730f5ee2051b83883 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 23 Mar 2016 17:01:50 -0700 Subject: [PATCH 3/5] Restore whitespace so there aren't superfluous diffs. --- interface/src/Application.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4f13665fef..c27dfb63df 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -169,6 +169,8 @@ #include "Util.h" #include "InterfaceParentFinder.h" + + // ON WIndows PC, NVidia Optimus laptop, we want to enable NVIDIA GPU // FIXME seems to be broken. #if defined(Q_OS_WIN) From c09c1438f897b4e9b1aab6483207a8ddb49b9250 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Wed, 23 Mar 2016 17:28:54 -0700 Subject: [PATCH 4/5] ivar init order. --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c27dfb63df..5febdb7d76 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -457,8 +457,8 @@ Setting::Handle sessionRunTime{ "sessionRunTime", 0 }; Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : QApplication(argc, argv), - _sessionRunTimer(startupTimer), _window(new MainWindow(desktop())), + _sessionRunTimer(startupTimer), _previousSessionCrashed(setupEssentials(argc, argv)), _undoStackScriptingInterface(&_undoStack), _frameCount(0), From a393f36978dfc04083acb8507e424d390b38dc06 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Wed, 23 Mar 2016 17:31:21 -0700 Subject: [PATCH 5/5] Forgot important comment. --- interface/src/Application.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5febdb7d76..0b02d0803e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -646,7 +646,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : accountManager.setIsAgent(true); accountManager.setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL); - UserActivityLogger::getInstance().launch(applicationVersion(), _previousSessionCrashed, sessionRunTime.get()); // before loadSettings resets sessionRuntTime. + // sessionRunTime will be reset soon by loadSettings. Grab it now to get previous session value. + // 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);