From 0c4cd96bfddd85c2587f56821043635a46b169b0 Mon Sep 17 00:00:00 2001
From: volansystech <samir.thaker@volansys.com>
Date: Wed, 24 May 2017 12:25:21 +0530
Subject: [PATCH 1/9] Initial Commit : Switch from HMD [Oculus Rift] mode to
 Desktop mode automatically when user removing Oculus Rift.

---
 interface/src/Application.cpp | 40 +++++++++++++++++++++++++++++++++++
 interface/src/Application.h   |  8 +++++--
 2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index ae490c05e7..ced5e51565 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -1338,6 +1338,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
         properties["active_display_plugin"] = getActiveDisplayPlugin()->getName();
         properties["using_hmd"] = isHMDMode();
 
+		if (isOculusRiftPluginAvailable()){
+			qCDebug(interfaceapp) << "Oculus Rift Plugin is available";
+			QTimer *switchModeTimer = new QTimer(this);
+			connect(switchModeTimer, SIGNAL(timeout()), this, SLOT(switchmode()));
+			switchModeTimer->start(500);
+		}
+
         auto glInfo = getGLContextData();
         properties["gl_info"] = glInfo;
         properties["gpu_used_memory"] = (int)BYTES_TO_MB(gpu::Context::getUsedGPUMemory());
@@ -6833,6 +6840,39 @@ void Application::updateDisplayMode() {
     Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin");
 }
 
+bool Application::isOculusRiftPluginAvailable(){
+	bool isOculusRiftPluginAvailable = false;
+	auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins();
+	// Default to the first item on the list, in case none of the menu items match
+	DisplayPluginPointer defaultplugin = displayPlugins.at(0);
+	if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift"){
+		oculusRiftPlugin = defaultplugin;
+		return true; // No need to iterate again,so return
+	}
+	// Iterate to check If Oculus Rift Plugin is available
+	foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) {
+		QString pluginname = displayPlugin->getName();
+		if (displayPlugin->isHmd() && pluginname == "Oculus Rift") {
+			oculusRiftPlugin = displayPlugin;
+			_isDisplayVisible = displayPlugin->isDisplayVisible();
+			isOculusRiftPluginAvailable = true;
+			break;
+		}
+	}
+	return isOculusRiftPluginAvailable;
+}
+
+void Application::switchmode(){
+	bool isDisplayVisible = oculusRiftPlugin->isDisplayVisible();
+	if (isDisplayVisible != _isDisplayVisible){
+		if (isDisplayVisible == false && _isDisplayVisible == true){
+			qCDebug(interfaceapp) << "switching from HMD to desktop mode";
+			setActiveDisplayPlugin("Desktop");
+		}
+	}
+	_isDisplayVisible = isDisplayVisible; // assign current status
+}
+
 mat4 Application::getEyeProjection(int eye) const {
     QMutexLocker viewLocker(&_viewMutex);
     if (isHMDMode()) {
diff --git a/interface/src/Application.h b/interface/src/Application.h
index d9dc3f389f..c181e74c74 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -152,7 +152,7 @@ public:
     void paintGL();
     void resizeGL();
 
-    bool event(QEvent* event) override;
+	bool event(QEvent* event) override;
     bool eventFilter(QObject* object, QEvent* event) override;
 
     glm::uvec2 getCanvasSize() const;
@@ -443,7 +443,7 @@ private slots:
     void addAssetToWorldErrorTimeout();
 
     void handleSandboxStatus(QNetworkReply* reply);
-
+	void switchmode();
 private:
     static void initDisplay();
     void init();
@@ -683,6 +683,10 @@ private:
     FileScriptingInterface* _fileDownload;
     AudioInjector* _snapshotSoundInjector { nullptr };
     SharedSoundPointer _snapshotSound;
+	
+	bool isOculusRiftPluginAvailable();
+	DisplayPluginPointer oculusRiftPlugin;
+	bool _isDisplayVisible;
 };
 
 

From 1f24e38585cca9d1d7919e803b4806569af34570 Mon Sep 17 00:00:00 2001
From: volansystech <samir.thaker@volansys.com>
Date: Wed, 24 May 2017 21:00:40 +0530
Subject: [PATCH 2/9] Initial Commit: Switching from Desktop mode to HMD
 [Oculus Rift] mode automatically when the user wear Oculus Rift.

---
 interface/src/Application.cpp                 | 54 ++++++++++++++-----
 interface/src/Application.h                   | 10 ++--
 .../display-plugins/OpenGLDisplayPlugin.cpp   | 15 +++++-
 .../src/display-plugins/OpenGLDisplayPlugin.h |  6 +++
 libraries/plugins/src/plugins/Plugin.h        | 13 +++++
 .../oculus/src/OculusBaseDisplayPlugin.cpp    | 11 ++++
 plugins/oculus/src/OculusBaseDisplayPlugin.h  |  2 +
 7 files changed, 92 insertions(+), 19 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index ced5e51565..99c2b2febf 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -1338,11 +1338,18 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
         properties["active_display_plugin"] = getActiveDisplayPlugin()->getName();
         properties["using_hmd"] = isHMDMode();
 
-		if (isOculusRiftPluginAvailable()){
-			qCDebug(interfaceapp) << "Oculus Rift Plugin is available";
-			QTimer *switchModeTimer = new QTimer(this);
-			connect(switchModeTimer, SIGNAL(timeout()), this, SLOT(switchmode()));
-			switchModeTimer->start(500);
+		if (isOculusRiftPluginAvailable()) {
+			// If Oculus Rift Plugin is Available,And Current Display Plugin is not Oculus Rift
+			// then startOculusRiftStandBySession to listen Oculus HMD Mounted status. 
+			if (getActiveDisplayPlugin()->getName() != "Oculus Rift" && 
+				!oculusRiftPlugin->isFakeSessionActive()) {
+					startOculusRiftStandBySession();
+			}
+			// Poll periodically to check whether the user has worn Oculus HMD or not. And switch mode
+			// accordingly. If the user wear HMD, switch to VR mode, if remove switch to Desktop mode.
+			QTimer *switchDisplayModeTimer = new QTimer(this);
+			connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayModeForOculus()));
+			switchDisplayModeTimer->start(500);
 		}
 
         auto glInfo = getGLContextData();
@@ -1574,7 +1581,9 @@ void Application::aboutToQuit() {
     }
 
     getActiveDisplayPlugin()->deactivate();
-
+	if (oculusRiftPlugin && oculusRiftPlugin->isFakeSessionActive()){
+		oculusRiftPlugin->endStandBySession();
+	}
     // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown.
     DependencyManager::get<OffscreenUi>()->hide("RunningScripts");
 
@@ -6845,7 +6854,7 @@ bool Application::isOculusRiftPluginAvailable(){
 	auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins();
 	// Default to the first item on the list, in case none of the menu items match
 	DisplayPluginPointer defaultplugin = displayPlugins.at(0);
-	if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift"){
+	if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift") {
 		oculusRiftPlugin = defaultplugin;
 		return true; // No need to iterate again,so return
 	}
@@ -6854,7 +6863,7 @@ bool Application::isOculusRiftPluginAvailable(){
 		QString pluginname = displayPlugin->getName();
 		if (displayPlugin->isHmd() && pluginname == "Oculus Rift") {
 			oculusRiftPlugin = displayPlugin;
-			_isDisplayVisible = displayPlugin->isDisplayVisible();
+			_oculusHMDMountedStatus = displayPlugin->isDisplayVisible();
 			isOculusRiftPluginAvailable = true;
 			break;
 		}
@@ -6862,15 +6871,32 @@ bool Application::isOculusRiftPluginAvailable(){
 	return isOculusRiftPluginAvailable;
 }
 
-void Application::switchmode(){
-	bool isDisplayVisible = oculusRiftPlugin->isDisplayVisible();
-	if (isDisplayVisible != _isDisplayVisible){
-		if (isDisplayVisible == false && _isDisplayVisible == true){
-			qCDebug(interfaceapp) << "switching from HMD to desktop mode";
+void Application::switchDisplayModeForOculus(){
+	bool currenthmdMountedStatus = oculusRiftPlugin->isDisplayVisible();
+	if (currenthmdMountedStatus != _oculusHMDMountedStatus){
+		// Switch to respective mode as soon as currenthmdMountedStatus changes 
+		if (currenthmdMountedStatus == false && _oculusHMDMountedStatus == true) {
+			qCDebug(interfaceapp) << "Switching from HMD to desktop mode";
 			setActiveDisplayPlugin("Desktop");
+			startOculusRiftStandBySession();
+		}
+		if (currenthmdMountedStatus == true && _oculusHMDMountedStatus == false) {
+			qCDebug(interfaceapp) << "Switching from Desktop to HMD mode";
+			endOculusRiftStandBySession();
+			setActiveDisplayPlugin("Oculus Rift");
 		}
 	}
-	_isDisplayVisible = isDisplayVisible; // assign current status
+	_oculusHMDMountedStatus = currenthmdMountedStatus;
+}
+
+bool Application::startOculusRiftStandBySession(){
+	bool isStandBySessionStarted = oculusRiftPlugin->startStandBySession();
+	qCDebug(interfaceapp) << "startOculusRiftStandBySession: " << isStandBySessionStarted;
+	return isStandBySessionStarted;
+}
+
+void Application::endOculusRiftStandBySession(){
+	oculusRiftPlugin->endStandBySession();
 }
 
 mat4 Application::getEyeProjection(int eye) const {
diff --git a/interface/src/Application.h b/interface/src/Application.h
index c181e74c74..a6ac244dc8 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -443,7 +443,7 @@ private slots:
     void addAssetToWorldErrorTimeout();
 
     void handleSandboxStatus(QNetworkReply* reply);
-	void switchmode();
+	void switchDisplayModeForOculus();
 private:
     static void initDisplay();
     void init();
@@ -684,9 +684,13 @@ private:
     AudioInjector* _snapshotSoundInjector { nullptr };
     SharedSoundPointer _snapshotSound;
 	
-	bool isOculusRiftPluginAvailable();
+	
 	DisplayPluginPointer oculusRiftPlugin;
-	bool _isDisplayVisible;
+	
+	bool isOculusRiftPluginAvailable();
+	bool _oculusHMDMountedStatus; // Keep track of HMD Mounted Flag
+	bool startOculusRiftStandBySession();
+	void endOculusRiftStandBySession();
 };
 
 
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
index 306db98b35..639acc7739 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
@@ -315,8 +315,7 @@ bool OpenGLDisplayPlugin::activate() {
     if (isHmd() && (getHmdScreen() >= 0)) {
         _container->showDisplayPluginsTools();
     }
-
-    return Parent::activate();
+	return Parent::activate();
 }
 
 void OpenGLDisplayPlugin::deactivate() {
@@ -339,6 +338,18 @@ void OpenGLDisplayPlugin::deactivate() {
     Parent::deactivate();
 }
 
+bool OpenGLDisplayPlugin::startStandBySession() {
+	if (!activateStandBySession()) {
+		return false;
+	}
+	return Parent::startStandBySession();
+}
+
+void OpenGLDisplayPlugin::endStandBySession() {
+	deactivateStandBySession();
+	return Parent::endStandBySession();
+}
+
 void OpenGLDisplayPlugin::customizeContext() {
     auto presentThread = DependencyManager::get<PresentThread>();
     Q_ASSERT(thread() == presentThread->thread());
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
index e1eea5de6c..ecde3b3c93 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
@@ -42,6 +42,8 @@ public:
     // between the main thread and the presentation thread
     bool activate() override final;
     void deactivate() override final;
+	bool startStandBySession() override final;
+	void endStandBySession() override final;
     bool eventFilter(QObject* receiver, QEvent* event) override;
     bool isDisplayVisible() const override { return true; }
 
@@ -99,6 +101,10 @@ protected:
     // Returns true on successful activation
     virtual bool internalActivate() { return true; }
     virtual void internalDeactivate() {}
+	
+	// Returns true on successful activation of standby session
+	virtual bool activateStandBySession() { return true; }
+	virtual void deactivateStandBySession() {}
 
     // Plugin specific functionality to send the composed scene to the output window or device
     virtual void internalPresent();
diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h
index 15588fafa4..74f04fff18 100644
--- a/libraries/plugins/src/plugins/Plugin.h
+++ b/libraries/plugins/src/plugins/Plugin.h
@@ -53,6 +53,18 @@ public:
     virtual bool isActive() {
         return _active;
     }
+	virtual bool startStandBySession(){
+		_standbysessionactive = true;
+		return _standbysessionactive;
+	}
+
+	virtual void endStandBySession(){
+		_standbysessionactive = false;
+	}
+
+	virtual bool isFakeSessionActive() {
+		return _standbysessionactive;
+	}
 
     /**
      * Called by the application during it's idle phase.  If the plugin needs to do
@@ -73,6 +85,7 @@ signals:
 
 protected:
     bool _active { false };
+	bool _standbysessionactive { false };
     PluginContainer* _container { nullptr };
     static const char* UNKNOWN_PLUGIN_ID;
 
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
index 26906ef2fb..28e30e0d21 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
@@ -127,6 +127,17 @@ void OculusBaseDisplayPlugin::internalDeactivate() {
     _session = nullptr;
 }
 
+bool OculusBaseDisplayPlugin::activateStandBySession() {
+	_session = acquireOculusSession();
+	if (!_session) {
+		return false;
+	}
+	return true;
+}
+void OculusBaseDisplayPlugin::deactivateStandBySession() {
+	releaseOculusSession();
+	_session = nullptr;
+}
 void OculusBaseDisplayPlugin::updatePresentPose() {
     //mat4 sensorResetMat;
     //_currentPresentFrameInfo.sensorSampleTime = ovr_GetTimeInSeconds();
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h
index e5dc75095d..79085f817b 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.h
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h
@@ -33,6 +33,8 @@ protected:
     void uncustomizeContext() override;
     bool internalActivate() override;
     void internalDeactivate() override;
+	bool activateStandBySession() override;
+	void deactivateStandBySession() override;
     void updatePresentPose() override;
 
 protected:

From a2851b5bcbe9db8147348e5d54543a666e2b690b Mon Sep 17 00:00:00 2001
From: volansystech <samir.thaker@volansys.com>
Date: Thu, 25 May 2017 18:32:46 +0530
Subject: [PATCH 3/9] Put proper comments and indentation.

---
 interface/src/Application.cpp                 | 22 +++++++++----------
 interface/src/Application.h                   |  5 ++---
 .../display-plugins/OpenGLDisplayPlugin.cpp   |  2 +-
 libraries/plugins/src/plugins/Plugin.h        | 16 +++++++-------
 4 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index fda9b7b8f9..a40f31a8bb 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -1339,14 +1339,14 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
         properties["using_hmd"] = isHMDMode();
 
 		if (isOculusRiftPluginAvailable()) {
-			// If Oculus Rift Plugin is Available,And Current Display Plugin is not Oculus Rift
+			// If Oculus Rift Plugin is available and current display plugin is not Oculus Rift 
 			// then startOculusRiftStandBySession to listen Oculus HMD Mounted status. 
 			if (getActiveDisplayPlugin()->getName() != "Oculus Rift" && 
-				!oculusRiftPlugin->isFakeSessionActive()) {
+				!oculusRiftPlugin->isStandBySessionActive()) {
 					startOculusRiftStandBySession();
 			}
-			// Poll periodically to check whether the user has worn Oculus HMD or not. And switch mode
-			// accordingly. If the user wear HMD, switch to VR mode, if remove switch to Desktop mode.
+			// Poll periodically to check whether the user has worn Oculus HMD or not. And switch Display mode accordingly.
+			// If the user wear Oculus HMD then switch to VR mode. If the user removes Oculus HMD then switch to Desktop mode.
 			QTimer *switchDisplayModeTimer = new QTimer(this);
 			connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayModeForOculus()));
 			switchDisplayModeTimer->start(500);
@@ -1581,7 +1581,7 @@ void Application::aboutToQuit() {
     }
 
     getActiveDisplayPlugin()->deactivate();
-	if (oculusRiftPlugin && oculusRiftPlugin->isFakeSessionActive()){
+	if (oculusRiftPlugin && oculusRiftPlugin->isStandBySessionActive()) {
 		oculusRiftPlugin->endStandBySession();
 	}
     // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown.
@@ -6846,14 +6846,14 @@ void Application::updateDisplayMode() {
     Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin");
 }
 
-bool Application::isOculusRiftPluginAvailable(){
+bool Application::isOculusRiftPluginAvailable() {
 	bool isOculusRiftPluginAvailable = false;
 	auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins();
 	// Default to the first item on the list, in case none of the menu items match
 	DisplayPluginPointer defaultplugin = displayPlugins.at(0);
 	if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift") {
 		oculusRiftPlugin = defaultplugin;
-		return true; // No need to iterate again,so return
+		return true;
 	}
 	// Iterate to check If Oculus Rift Plugin is available
 	foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) {
@@ -6868,9 +6868,9 @@ bool Application::isOculusRiftPluginAvailable(){
 	return isOculusRiftPluginAvailable;
 }
 
-void Application::switchDisplayModeForOculus(){
+void Application::switchDisplayModeForOculus() {
 	bool currenthmdMountedStatus = oculusRiftPlugin->isDisplayVisible();
-	if (currenthmdMountedStatus != _oculusHMDMountedStatus){
+	if (currenthmdMountedStatus != _oculusHMDMountedStatus) {
 		// Switch to respective mode as soon as currenthmdMountedStatus changes 
 		if (currenthmdMountedStatus == false && _oculusHMDMountedStatus == true) {
 			qCDebug(interfaceapp) << "Switching from HMD to desktop mode";
@@ -6886,13 +6886,13 @@ void Application::switchDisplayModeForOculus(){
 	_oculusHMDMountedStatus = currenthmdMountedStatus;
 }
 
-bool Application::startOculusRiftStandBySession(){
+bool Application::startOculusRiftStandBySession() {
 	bool isStandBySessionStarted = oculusRiftPlugin->startStandBySession();
 	qCDebug(interfaceapp) << "startOculusRiftStandBySession: " << isStandBySessionStarted;
 	return isStandBySessionStarted;
 }
 
-void Application::endOculusRiftStandBySession(){
+void Application::endOculusRiftStandBySession() {
 	oculusRiftPlugin->endStandBySession();
 }
 
diff --git a/interface/src/Application.h b/interface/src/Application.h
index 6b172cdb9e..112b650160 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -152,7 +152,7 @@ public:
     void paintGL();
     void resizeGL();
 
-	bool event(QEvent* event) override;
+    bool event(QEvent* event) override;
     bool eventFilter(QObject* object, QEvent* event) override;
 
     glm::uvec2 getCanvasSize() const;
@@ -685,9 +685,8 @@ private:
 	
 	
 	DisplayPluginPointer oculusRiftPlugin;
-	
 	bool isOculusRiftPluginAvailable();
-	bool _oculusHMDMountedStatus; // Keep track of HMD Mounted Flag
+	bool _oculusHMDMountedStatus; // Keep track of Oculus Rift HMDMounted Flag
 	bool startOculusRiftStandBySession();
 	void endOculusRiftStandBySession();
 };
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
index 96d3d8114c..cebe844b84 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
@@ -315,7 +315,7 @@ bool OpenGLDisplayPlugin::activate() {
     if (isHmd() && (getHmdScreen() >= 0)) {
         _container->showDisplayPluginsTools();
     }
-	return Parent::activate();
+    return Parent::activate();
 }
 
 void OpenGLDisplayPlugin::deactivate() {
diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h
index 74f04fff18..045a9eee15 100644
--- a/libraries/plugins/src/plugins/Plugin.h
+++ b/libraries/plugins/src/plugins/Plugin.h
@@ -53,17 +53,17 @@ public:
     virtual bool isActive() {
         return _active;
     }
-	virtual bool startStandBySession(){
-		_standbysessionactive = true;
-		return _standbysessionactive;
+	virtual bool startStandBySession() {
+		_standbysessionstatus = true;
+		return _standbysessionstatus;
 	}
 
-	virtual void endStandBySession(){
-		_standbysessionactive = false;
+	virtual void endStandBySession() {
+		_standbysessionstatus = false;
 	}
 
-	virtual bool isFakeSessionActive() {
-		return _standbysessionactive;
+	virtual bool isStandBySessionActive() {
+		return _standbysessionstatus;
 	}
 
     /**
@@ -85,7 +85,7 @@ signals:
 
 protected:
     bool _active { false };
-	bool _standbysessionactive { false };
+	bool _standbysessionstatus { false };
     PluginContainer* _container { nullptr };
     static const char* UNKNOWN_PLUGIN_ID;
 

From 0920dbc1a8910c986b2c83b2422aa7fa63e192d9 Mon Sep 17 00:00:00 2001
From: volansystech <samir.thaker@volansys.com>
Date: Mon, 29 May 2017 15:53:33 +0530
Subject: [PATCH 4/9] Resolve the comments of @ZappoMan.

---
 interface/src/Application.cpp                 | 111 +++++++++---------
 interface/src/Application.h                   |  13 +-
 .../display-plugins/OpenGLDisplayPlugin.cpp   |  12 +-
 .../src/display-plugins/OpenGLDisplayPlugin.h |  10 +-
 libraries/plugins/src/plugins/Plugin.h        |  22 ++--
 .../oculus/src/OculusBaseDisplayPlugin.cpp    |  14 +--
 plugins/oculus/src/OculusBaseDisplayPlugin.h  |   4 +-
 7 files changed, 92 insertions(+), 94 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index a40f31a8bb..57a627fe53 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -244,6 +244,8 @@ static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStanda
 Setting::Handle<int> maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTREE_PPS);
 
 static const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com";
+static const int INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS = 500; // milliseconds
+static const QString OCULUS_RIFT_DISPLAY_PLUGIN_NAME = "Oculus Rift";
 
 const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensions {
     { SVO_EXTENSION, &Application::importSVOFromURL },
@@ -1338,19 +1340,20 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
         properties["active_display_plugin"] = getActiveDisplayPlugin()->getName();
         properties["using_hmd"] = isHMDMode();
 
-		if (isOculusRiftPluginAvailable()) {
-			// If Oculus Rift Plugin is available and current display plugin is not Oculus Rift 
-			// then startOculusRiftStandBySession to listen Oculus HMD Mounted status. 
-			if (getActiveDisplayPlugin()->getName() != "Oculus Rift" && 
-				!oculusRiftPlugin->isStandBySessionActive()) {
-					startOculusRiftStandBySession();
-			}
-			// Poll periodically to check whether the user has worn Oculus HMD or not. And switch Display mode accordingly.
-			// If the user wear Oculus HMD then switch to VR mode. If the user removes Oculus HMD then switch to Desktop mode.
-			QTimer *switchDisplayModeTimer = new QTimer(this);
-			connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayModeForOculus()));
-			switchDisplayModeTimer->start(500);
-		}
+        if (isHMDPluginAvailable()) {
+            // Currently, autoswitch display mode support is only for Oculus Rift.
+            // If HMD Plugin is available and current display plugin is not HMD plugin
+            // then startHMDStandBySession to listen HMD Mounted status.
+            if (getActiveDisplayPlugin()->getName() != _hmdPluginName &&
+                !_hmdPlugin->isStandBySessionActive()) {
+                    startHMDStandBySession();
+            }
+            // Poll periodically to check whether the user has worn HMD or not. And switch Display mode accordingly.
+            // If the user wear HMD then switch to VR mode. If the user removes HMD then switch to Desktop mode.
+            QTimer *switchDisplayModeTimer = new QTimer(this);
+            connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayMode()));
+            switchDisplayModeTimer->start(INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS);
+        }
 
         auto glInfo = getGLContextData();
         properties["gl_info"] = glInfo;
@@ -1581,8 +1584,8 @@ void Application::aboutToQuit() {
     }
 
     getActiveDisplayPlugin()->deactivate();
-	if (oculusRiftPlugin && oculusRiftPlugin->isStandBySessionActive()) {
-		oculusRiftPlugin->endStandBySession();
+    if (_hmdPlugin && _hmdPlugin->isStandBySessionActive()) {
+        _hmdPlugin->endStandBySession();
 	}
     // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown.
     DependencyManager::get<OffscreenUi>()->hide("RunningScripts");
@@ -6846,54 +6849,48 @@ void Application::updateDisplayMode() {
     Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin");
 }
 
-bool Application::isOculusRiftPluginAvailable() {
-	bool isOculusRiftPluginAvailable = false;
-	auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins();
-	// Default to the first item on the list, in case none of the menu items match
-	DisplayPluginPointer defaultplugin = displayPlugins.at(0);
-	if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift") {
-		oculusRiftPlugin = defaultplugin;
-		return true;
-	}
-	// Iterate to check If Oculus Rift Plugin is available
-	foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) {
-		QString pluginname = displayPlugin->getName();
-		if (displayPlugin->isHmd() && pluginname == "Oculus Rift") {
-			oculusRiftPlugin = displayPlugin;
-			_oculusHMDMountedStatus = displayPlugin->isDisplayVisible();
-			isOculusRiftPluginAvailable = true;
-			break;
-		}
-	}
-	return isOculusRiftPluginAvailable;
+bool Application::isHMDPluginAvailable() {
+    bool isHMDEnabledPluginAvailable = false;
+    auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins();
+    // Currently, autoswitch display mode support is only for Oculus Rift.
+    foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) {
+        if (displayPlugin->isHmd() && displayPlugin->getName() == OCULUS_RIFT_DISPLAY_PLUGIN_NAME) {
+            _hmdPlugin = displayPlugin;
+            _hmdPluginName = displayPlugin->getName();
+            _hmdMountedStatus = displayPlugin->isDisplayVisible();
+            isHMDEnabledPluginAvailable = true;
+            break;
+        }
+    }
+    return isHMDEnabledPluginAvailable;
 }
 
-void Application::switchDisplayModeForOculus() {
-	bool currenthmdMountedStatus = oculusRiftPlugin->isDisplayVisible();
-	if (currenthmdMountedStatus != _oculusHMDMountedStatus) {
-		// Switch to respective mode as soon as currenthmdMountedStatus changes 
-		if (currenthmdMountedStatus == false && _oculusHMDMountedStatus == true) {
-			qCDebug(interfaceapp) << "Switching from HMD to desktop mode";
-			setActiveDisplayPlugin("Desktop");
-			startOculusRiftStandBySession();
-		}
-		if (currenthmdMountedStatus == true && _oculusHMDMountedStatus == false) {
-			qCDebug(interfaceapp) << "Switching from Desktop to HMD mode";
-			endOculusRiftStandBySession();
-			setActiveDisplayPlugin("Oculus Rift");
-		}
-	}
-	_oculusHMDMountedStatus = currenthmdMountedStatus;
+void Application::switchDisplayMode() {
+    bool currentHMDMountedStatus = _hmdPlugin->isDisplayVisible();
+    if (currentHMDMountedStatus != _hmdMountedStatus) {
+        // Switch to respective mode as soon as currenthmdMountedStatus changes 
+        if (currentHMDMountedStatus == false && _hmdMountedStatus == true) {
+            qCDebug(interfaceapp) << "Switching from HMD to desktop mode";
+            setActiveDisplayPlugin("Desktop");
+            startHMDStandBySession();
+        }
+        if (currentHMDMountedStatus == true && _hmdMountedStatus == false) {
+            qCDebug(interfaceapp) << "Switching from Desktop to HMD mode";
+            endHMDStandBySession();
+            setActiveDisplayPlugin(_hmdPluginName);
+        }
+    }
+    _hmdMountedStatus = currentHMDMountedStatus;
 }
 
-bool Application::startOculusRiftStandBySession() {
-	bool isStandBySessionStarted = oculusRiftPlugin->startStandBySession();
-	qCDebug(interfaceapp) << "startOculusRiftStandBySession: " << isStandBySessionStarted;
-	return isStandBySessionStarted;
+bool Application::startHMDStandBySession() {
+    bool isStandBySessionStarted = _hmdPlugin->startStandBySession();
+    qCDebug(interfaceapp) << "startHMDStandBySession: " << isStandBySessionStarted;
+    return isStandBySessionStarted;
 }
 
-void Application::endOculusRiftStandBySession() {
-	oculusRiftPlugin->endStandBySession();
+void Application::endHMDStandBySession() {
+    _hmdPlugin->endStandBySession();
 }
 
 mat4 Application::getEyeProjection(int eye) const {
diff --git a/interface/src/Application.h b/interface/src/Application.h
index 112b650160..699cb9f879 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -442,7 +442,7 @@ private slots:
     void addAssetToWorldErrorTimeout();
 
     void handleSandboxStatus(QNetworkReply* reply);
-	void switchDisplayModeForOculus();
+    void switchDisplayMode();
 private:
     static void initDisplay();
     void init();
@@ -684,11 +684,12 @@ private:
     SharedSoundPointer _snapshotSound;
 	
 	
-	DisplayPluginPointer oculusRiftPlugin;
-	bool isOculusRiftPluginAvailable();
-	bool _oculusHMDMountedStatus; // Keep track of Oculus Rift HMDMounted Flag
-	bool startOculusRiftStandBySession();
-	void endOculusRiftStandBySession();
+	DisplayPluginPointer _hmdPlugin; // HMD Enabled Plugin
+    QString _hmdPluginName;
+    bool isHMDPluginAvailable();
+	bool _hmdMountedStatus; // Check HMD Mounted status
+	bool startHMDStandBySession();
+	void endHMDStandBySession();
 };
 
 
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
index cebe844b84..3bdf9a672c 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
@@ -339,15 +339,15 @@ void OpenGLDisplayPlugin::deactivate() {
 }
 
 bool OpenGLDisplayPlugin::startStandBySession() {
-	if (!activateStandBySession()) {
-		return false;
-	}
-	return Parent::startStandBySession();
+    if (!activateStandBySession()) {
+        return false;
+    }
+    return Parent::startStandBySession();
 }
 
 void OpenGLDisplayPlugin::endStandBySession() {
-	deactivateStandBySession();
-	return Parent::endStandBySession();
+    deactivateStandBySession();
+    return Parent::endStandBySession();
 }
 
 void OpenGLDisplayPlugin::customizeContext() {
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
index ecde3b3c93..9681158c55 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
@@ -42,8 +42,8 @@ public:
     // between the main thread and the presentation thread
     bool activate() override final;
     void deactivate() override final;
-	bool startStandBySession() override final;
-	void endStandBySession() override final;
+    bool startStandBySession() override final;
+    void endStandBySession() override final;
     bool eventFilter(QObject* receiver, QEvent* event) override;
     bool isDisplayVisible() const override { return true; }
 
@@ -102,9 +102,9 @@ protected:
     virtual bool internalActivate() { return true; }
     virtual void internalDeactivate() {}
 	
-	// Returns true on successful activation of standby session
-	virtual bool activateStandBySession() { return true; }
-	virtual void deactivateStandBySession() {}
+    // Returns true on successful activation of standby session
+    virtual bool activateStandBySession() { return true; }
+    virtual void deactivateStandBySession() {}
 
     // Plugin specific functionality to send the composed scene to the output window or device
     virtual void internalPresent();
diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h
index 045a9eee15..11ea79186a 100644
--- a/libraries/plugins/src/plugins/Plugin.h
+++ b/libraries/plugins/src/plugins/Plugin.h
@@ -53,18 +53,18 @@ public:
     virtual bool isActive() {
         return _active;
     }
-	virtual bool startStandBySession() {
-		_standbysessionstatus = true;
-		return _standbysessionstatus;
-	}
+    virtual bool startStandBySession() {
+        _standbysessionstatus = true;
+        return _standbysessionstatus;
+    }
 
-	virtual void endStandBySession() {
-		_standbysessionstatus = false;
-	}
+    virtual void endStandBySession() {
+        _standbysessionstatus = false;
+    }
 
-	virtual bool isStandBySessionActive() {
-		return _standbysessionstatus;
-	}
+    virtual bool isStandBySessionActive() {
+        return _standbysessionstatus;
+    }
 
     /**
      * Called by the application during it's idle phase.  If the plugin needs to do
@@ -85,7 +85,7 @@ signals:
 
 protected:
     bool _active { false };
-	bool _standbysessionstatus { false };
+    bool _standbysessionstatus { false };
     PluginContainer* _container { nullptr };
     static const char* UNKNOWN_PLUGIN_ID;
 
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
index 28e30e0d21..df98abf408 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
@@ -128,15 +128,15 @@ void OculusBaseDisplayPlugin::internalDeactivate() {
 }
 
 bool OculusBaseDisplayPlugin::activateStandBySession() {
-	_session = acquireOculusSession();
-	if (!_session) {
-		return false;
-	}
-	return true;
+    _session = acquireOculusSession();
+    if (!_session) {
+        return false;
+    }
+    return true;
 }
 void OculusBaseDisplayPlugin::deactivateStandBySession() {
-	releaseOculusSession();
-	_session = nullptr;
+    releaseOculusSession();
+    _session = nullptr;
 }
 void OculusBaseDisplayPlugin::updatePresentPose() {
     //mat4 sensorResetMat;
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h
index 79085f817b..1f54742c2d 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.h
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h
@@ -33,8 +33,8 @@ protected:
     void uncustomizeContext() override;
     bool internalActivate() override;
     void internalDeactivate() override;
-	bool activateStandBySession() override;
-	void deactivateStandBySession() override;
+    bool activateStandBySession() override;
+    void deactivateStandBySession() override;
     void updatePresentPose() override;
 
 protected:

From e90b1b5a67c8fd33d539c7d86b677ba24d17f61c Mon Sep 17 00:00:00 2001
From: volansystech <samir.thaker@volansys.com>
Date: Mon, 29 May 2017 18:21:59 +0530
Subject: [PATCH 5/9] Resolve the comments of @ZappoMan.

---
 interface/src/Application.cpp | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index d219d7bcb6..b5733fa6f5 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -246,6 +246,7 @@ Setting::Handle<int> maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTRE
 static const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com";
 static const int INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS = 500; // milliseconds
 static const QString OCULUS_RIFT_DISPLAY_PLUGIN_NAME = "Oculus Rift";
+static const QString DESKTOP_DISPLAY_PLUGIN_NAME = "Desktop";
 
 const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensions {
     { SVO_EXTENSION, &Application::importSVOFromURL },
@@ -1348,8 +1349,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
                 !_hmdPlugin->isStandBySessionActive()) {
                     startHMDStandBySession();
             }
-            // Poll periodically to check whether the user has worn HMD or not. And switch Display mode accordingly.
-            // If the user wear HMD then switch to VR mode. If the user removes HMD then switch to Desktop mode.
+            // Poll periodically to check whether the user has worn HMD or not. Switch Display mode accordingly.
+            // If the user wears HMD then switch to VR mode. If the user removes HMD then switch to Desktop mode.
             QTimer *switchDisplayModeTimer = new QTimer(this);
             connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayMode()));
             switchDisplayModeTimer->start(INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS);
@@ -6773,7 +6774,7 @@ void Application::switchDisplayMode() {
         // Switch to respective mode as soon as currenthmdMountedStatus changes 
         if (currentHMDMountedStatus == false && _hmdMountedStatus == true) {
             qCDebug(interfaceapp) << "Switching from HMD to desktop mode";
-            setActiveDisplayPlugin("Desktop");
+            setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME);
             startHMDStandBySession();
         }
         if (currentHMDMountedStatus == true && _hmdMountedStatus == false) {

From 58142817a12d132077515669953fd3c4087487df Mon Sep 17 00:00:00 2001
From: NeetBhagat <neet.bhagat@volansystech.com>
Date: Wed, 31 May 2017 19:13:55 +0530
Subject: [PATCH 6/9] Resolve the review comments of @ZappoMan.

---
 interface/src/Application.cpp | 86 ++++++++++++++++++-----------------
 interface/src/Application.h   | 14 ++----
 2 files changed, 49 insertions(+), 51 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index b5733fa6f5..ac39f51d7e 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -244,8 +244,8 @@ static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStanda
 Setting::Handle<int> maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTREE_PPS);
 
 static const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com";
-static const int INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS = 500; // milliseconds
-static const QString OCULUS_RIFT_DISPLAY_PLUGIN_NAME = "Oculus Rift";
+static const int INTERVAL_TO_CHECK_HMD_WORN_STATUS = 500; // milliseconds
+static const QString DISPLAY_PLUGIN_NAME_OCULUS_RIFT = "Oculus Rift";
 static const QString DESKTOP_DISPLAY_PLUGIN_NAME = "Desktop";
 
 const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensions {
@@ -1341,19 +1341,38 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
         properties["active_display_plugin"] = getActiveDisplayPlugin()->getName();
         properties["using_hmd"] = isHMDMode();
 
-        if (isHMDPluginAvailable()) {
-            // Currently, autoswitch display mode support is only for Oculus Rift.
-            // If HMD Plugin is available and current display plugin is not HMD plugin
-            // then startHMDStandBySession to listen HMD Mounted status.
-            if (getActiveDisplayPlugin()->getName() != _hmdPluginName &&
-                !_hmdPlugin->isStandBySessionActive()) {
+        _autoSwitchDisplayModeSupportedHMDPlugin = nullptr;
+        foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) {
+            if (displayPlugin->isHmd() && 
+                displayPlugin->getName() == DISPLAY_PLUGIN_NAME_OCULUS_RIFT) {
+                
+                // Currently auto switch display mode support is only for Oculus Rift                
+                // To support other plugins, add a condition
+                // (|| displayPlugin->getName() == "Other HMD Display Plugin Name")
+
+                _autoSwitchDisplayModeSupportedHMDPlugin = displayPlugin;
+                _autoSwitchDisplayModeSupportedHMDPluginName = 
+                    _autoSwitchDisplayModeSupportedHMDPlugin->getName();
+                _previousHMDWornStatus =
+                    _autoSwitchDisplayModeSupportedHMDPlugin->isDisplayVisible();
+                qCDebug(interfaceapp) << "_autoSwitchModeSupportedPluginName::" 
+                    << _autoSwitchDisplayModeSupportedHMDPluginName;
+                break;
+            }
+        }
+
+        if (_autoSwitchDisplayModeSupportedHMDPlugin != nullptr) {
+            // If HMD Plugin is available and current display plugin is not HMD plugin 
+            // then startHMDStandBySession to poll HMD Worn status.
+            if (getActiveDisplayPlugin()->getName() != _autoSwitchDisplayModeSupportedHMDPluginName &&
+                !_autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) {
                     startHMDStandBySession();
             }
             // Poll periodically to check whether the user has worn HMD or not. Switch Display mode accordingly.
             // If the user wears HMD then switch to VR mode. If the user removes HMD then switch to Desktop mode.
-            QTimer *switchDisplayModeTimer = new QTimer(this);
-            connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayMode()));
-            switchDisplayModeTimer->start(INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS);
+            QTimer* autoSwitchDisplayModeTimer = new QTimer(this);
+            connect(autoSwitchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayMode()));
+            autoSwitchDisplayModeTimer->start(INTERVAL_TO_CHECK_HMD_WORN_STATUS);
         }
 
         auto glInfo = getGLContextData();
@@ -1585,9 +1604,10 @@ void Application::aboutToQuit() {
     }
 
     getActiveDisplayPlugin()->deactivate();
-    if (_hmdPlugin && _hmdPlugin->isStandBySessionActive()) {
-        _hmdPlugin->endStandBySession();
-	}
+    if (_autoSwitchDisplayModeSupportedHMDPlugin != nullptr
+        && _autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) {
+        _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession();
+    }
     // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown.
     DependencyManager::get<OffscreenUi>()->hide("RunningScripts");
 
@@ -6752,48 +6772,30 @@ void Application::updateDisplayMode() {
     Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin");
 }
 
-bool Application::isHMDPluginAvailable() {
-    bool isHMDEnabledPluginAvailable = false;
-    auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins();
-    // Currently, autoswitch display mode support is only for Oculus Rift.
-    foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) {
-        if (displayPlugin->isHmd() && displayPlugin->getName() == OCULUS_RIFT_DISPLAY_PLUGIN_NAME) {
-            _hmdPlugin = displayPlugin;
-            _hmdPluginName = displayPlugin->getName();
-            _hmdMountedStatus = displayPlugin->isDisplayVisible();
-            isHMDEnabledPluginAvailable = true;
-            break;
-        }
-    }
-    return isHMDEnabledPluginAvailable;
-}
-
 void Application::switchDisplayMode() {
-    bool currentHMDMountedStatus = _hmdPlugin->isDisplayVisible();
-    if (currentHMDMountedStatus != _hmdMountedStatus) {
-        // Switch to respective mode as soon as currenthmdMountedStatus changes 
-        if (currentHMDMountedStatus == false && _hmdMountedStatus == true) {
+    bool currentHMDWornStatus = _autoSwitchDisplayModeSupportedHMDPlugin->isDisplayVisible();
+    if (currentHMDWornStatus != _previousHMDWornStatus) {
+        // Switch to respective mode as soon as currentHMDWornStatus changes 
+        if (currentHMDWornStatus == false && _previousHMDWornStatus == true) {
             qCDebug(interfaceapp) << "Switching from HMD to desktop mode";
             setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME);
             startHMDStandBySession();
         }
-        if (currentHMDMountedStatus == true && _hmdMountedStatus == false) {
+        if (currentHMDWornStatus == true && _previousHMDWornStatus == false) {
             qCDebug(interfaceapp) << "Switching from Desktop to HMD mode";
             endHMDStandBySession();
-            setActiveDisplayPlugin(_hmdPluginName);
+            setActiveDisplayPlugin(_autoSwitchDisplayModeSupportedHMDPluginName);
         }
     }
-    _hmdMountedStatus = currentHMDMountedStatus;
+    _previousHMDWornStatus = currentHMDWornStatus;
 }
 
-bool Application::startHMDStandBySession() {
-    bool isStandBySessionStarted = _hmdPlugin->startStandBySession();
-    qCDebug(interfaceapp) << "startHMDStandBySession: " << isStandBySessionStarted;
-    return isStandBySessionStarted;
+void Application::startHMDStandBySession() {
+    _autoSwitchDisplayModeSupportedHMDPlugin->startStandBySession();
 }
 
 void Application::endHMDStandBySession() {
-    _hmdPlugin->endStandBySession();
+    _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession();
 }
 
 mat4 Application::getEyeProjection(int eye) const {
diff --git a/interface/src/Application.h b/interface/src/Application.h
index f19c2c9adf..e1fb37ef3a 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -681,14 +681,10 @@ private:
     AudioInjector* _snapshotSoundInjector { nullptr };
     SharedSoundPointer _snapshotSound;
 	
-	
-	DisplayPluginPointer _hmdPlugin; // HMD Enabled Plugin
-    QString _hmdPluginName;
-    bool isHMDPluginAvailable();
-	bool _hmdMountedStatus; // Check HMD Mounted status
-	bool startHMDStandBySession();
-	void endHMDStandBySession();
+    DisplayPluginPointer _autoSwitchDisplayModeSupportedHMDPlugin = nullptr;
+    QString _autoSwitchDisplayModeSupportedHMDPluginName;
+    bool _previousHMDWornStatus;
+    void startHMDStandBySession();
+    void endHMDStandBySession();
 };
-
-
 #endif // hifi_Application_h

From c7c07b28e94bc9d0b6aa0ac767e39aacb84c0b8c Mon Sep 17 00:00:00 2001
From: NeetBhagat <neet.bhagat@volansystech.com>
Date: Thu, 1 Jun 2017 12:14:54 +0530
Subject: [PATCH 7/9] Resolve the reviewed comments of @ZappoMan

---
 interface/src/Application.cpp                 | 8 +-------
 libraries/plugins/src/plugins/DisplayPlugin.h | 1 +
 plugins/oculus/src/OculusBaseDisplayPlugin.h  | 1 +
 3 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index ac39f51d7e..b8bfff8c5f 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -245,7 +245,6 @@ Setting::Handle<int> maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTRE
 
 static const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com";
 static const int INTERVAL_TO_CHECK_HMD_WORN_STATUS = 500; // milliseconds
-static const QString DISPLAY_PLUGIN_NAME_OCULUS_RIFT = "Oculus Rift";
 static const QString DESKTOP_DISPLAY_PLUGIN_NAME = "Desktop";
 
 const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensions {
@@ -1344,12 +1343,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
         _autoSwitchDisplayModeSupportedHMDPlugin = nullptr;
         foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) {
             if (displayPlugin->isHmd() && 
-                displayPlugin->getName() == DISPLAY_PLUGIN_NAME_OCULUS_RIFT) {
-                
-                // Currently auto switch display mode support is only for Oculus Rift                
-                // To support other plugins, add a condition
-                // (|| displayPlugin->getName() == "Other HMD Display Plugin Name")
-
+                displayPlugin->getSupportsAutoSwitch()) {
                 _autoSwitchDisplayModeSupportedHMDPlugin = displayPlugin;
                 _autoSwitchDisplayModeSupportedHMDPluginName = 
                     _autoSwitchDisplayModeSupportedHMDPlugin->getName();
diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h
index 754c919fd4..297bdb2cca 100644
--- a/libraries/plugins/src/plugins/DisplayPlugin.h
+++ b/libraries/plugins/src/plugins/DisplayPlugin.h
@@ -200,6 +200,7 @@ public:
     virtual float newFramePresentRate() const { return -1.0f; }
     // Rate at which rendered frames are being skipped
     virtual float droppedFrameRate() const { return -1.0f; }
+    virtual bool getSupportsAutoSwitch() { return false; }
     
     // Hardware specific stats
     virtual QJsonObject getHardwareStats() const { return QJsonObject(); }
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h
index 1f54742c2d..bfdcc5db1e 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.h
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h
@@ -26,6 +26,7 @@ public:
     void resetSensors() override final;
     bool beginFrameRender(uint32_t frameIndex) override;
     float getTargetFrameRate() const override { return _hmdDesc.DisplayRefreshRate; }
+    bool getSupportsAutoSwitch() override final { return true; }
     
 
 protected:

From 6228ff19bf2c9315b6edc01747a985301421e436 Mon Sep 17 00:00:00 2001
From: NeetBhagat <neet.bhagat@volansystech.com>
Date: Fri, 2 Jun 2017 14:37:17 +0530
Subject: [PATCH 8/9] Resolve the reviewed comments of @ZappoMan

---
 interface/src/Application.cpp                 | 26 +++++++++----------
 interface/src/Application.h                   |  2 +-
 .../display-plugins/OpenGLDisplayPlugin.cpp   |  3 ++-
 3 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index 8384204fb9..a3787847db 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -1349,16 +1349,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
                     _autoSwitchDisplayModeSupportedHMDPlugin->getName();
                 _previousHMDWornStatus =
                     _autoSwitchDisplayModeSupportedHMDPlugin->isDisplayVisible();
-                qCDebug(interfaceapp) << "_autoSwitchModeSupportedPluginName::" 
-                    << _autoSwitchDisplayModeSupportedHMDPluginName;
                 break;
             }
         }
 
-        if (_autoSwitchDisplayModeSupportedHMDPlugin != nullptr) {
-            // If HMD Plugin is available and current display plugin is not HMD plugin 
-            // then startHMDStandBySession to poll HMD Worn status.
-            if (getActiveDisplayPlugin()->getName() != _autoSwitchDisplayModeSupportedHMDPluginName &&
+        if (_autoSwitchDisplayModeSupportedHMDPlugin) {
+            if (getActiveDisplayPlugin() != _autoSwitchDisplayModeSupportedHMDPlugin &&
                 !_autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) {
                     startHMDStandBySession();
             }
@@ -1600,7 +1596,7 @@ void Application::aboutToQuit() {
     }
 
     getActiveDisplayPlugin()->deactivate();
-    if (_autoSwitchDisplayModeSupportedHMDPlugin != nullptr
+    if (_autoSwitchDisplayModeSupportedHMDPlugin 
         && _autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) {
         _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession();
     }
@@ -6769,18 +6765,20 @@ void Application::updateDisplayMode() {
 }
 
 void Application::switchDisplayMode() {
+    if (!_autoSwitchDisplayModeSupportedHMDPlugin) {
+        return;
+    }
     bool currentHMDWornStatus = _autoSwitchDisplayModeSupportedHMDPlugin->isDisplayVisible();
     if (currentHMDWornStatus != _previousHMDWornStatus) {
-        // Switch to respective mode as soon as currentHMDWornStatus changes 
-        if (currentHMDWornStatus == false && _previousHMDWornStatus == true) {
-            qCDebug(interfaceapp) << "Switching from HMD to desktop mode";
-            setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME);
-            startHMDStandBySession();
-        }
-        if (currentHMDWornStatus == true && _previousHMDWornStatus == false) {
+        // Switch to respective mode as soon as currentHMDWornStatus changes
+        if (currentHMDWornStatus) {
             qCDebug(interfaceapp) << "Switching from Desktop to HMD mode";
             endHMDStandBySession();
             setActiveDisplayPlugin(_autoSwitchDisplayModeSupportedHMDPluginName);
+        } else {
+            qCDebug(interfaceapp) << "Switching from HMD to desktop mode";
+            setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME);
+            startHMDStandBySession();
         }
     }
     _previousHMDWornStatus = currentHMDWornStatus;
diff --git a/interface/src/Application.h b/interface/src/Application.h
index e1fb37ef3a..4cd47ada58 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -681,7 +681,7 @@ private:
     AudioInjector* _snapshotSoundInjector { nullptr };
     SharedSoundPointer _snapshotSound;
 	
-    DisplayPluginPointer _autoSwitchDisplayModeSupportedHMDPlugin = nullptr;
+    DisplayPluginPointer _autoSwitchDisplayModeSupportedHMDPlugin;
     QString _autoSwitchDisplayModeSupportedHMDPluginName;
     bool _previousHMDWornStatus;
     void startHMDStandBySession();
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
index 3bdf9a672c..fbdc1ad71e 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
@@ -315,6 +315,7 @@ bool OpenGLDisplayPlugin::activate() {
     if (isHmd() && (getHmdScreen() >= 0)) {
         _container->showDisplayPluginsTools();
     }
+
     return Parent::activate();
 }
 
@@ -347,7 +348,7 @@ bool OpenGLDisplayPlugin::startStandBySession() {
 
 void OpenGLDisplayPlugin::endStandBySession() {
     deactivateStandBySession();
-    return Parent::endStandBySession();
+    Parent::endStandBySession();
 }
 
 void OpenGLDisplayPlugin::customizeContext() {

From c3621d7c325c634d2b53e09eec78641b4ed0454f Mon Sep 17 00:00:00 2001
From: NeetBhagat <neet.bhagat@volansystech.com>
Date: Tue, 6 Jun 2017 22:31:14 +0530
Subject: [PATCH 9/9] Resolved two issues: 1) While in HMD mode -> open Tablet
 -> Click Desktop.  Desktop mode will be on. 2) Menu sync problem while
 switching modes.

---
 interface/src/Application.cpp                      | 13 +++++++------
 interface/src/Application.h                        |  2 +-
 .../src/display-plugins/OpenGLDisplayPlugin.cpp    |  6 +++---
 .../src/display-plugins/OpenGLDisplayPlugin.h      |  4 ++--
 libraries/plugins/src/plugins/Plugin.h             | 14 +++++++-------
 plugins/oculus/src/OculusBaseDisplayPlugin.cpp     |  4 +---
 plugins/oculus/src/OculusBaseDisplayPlugin.h       |  2 +-
 7 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index c681f99ee2..314c51a4f2 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -1360,7 +1360,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
 
         if (_autoSwitchDisplayModeSupportedHMDPlugin) {
             if (getActiveDisplayPlugin() != _autoSwitchDisplayModeSupportedHMDPlugin &&
-                !_autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) {
+                !_autoSwitchDisplayModeSupportedHMDPlugin->isSessionActive()) {
                     startHMDStandBySession();
             }
             // Poll periodically to check whether the user has worn HMD or not. Switch Display mode accordingly.
@@ -1602,8 +1602,8 @@ void Application::aboutToQuit() {
 
     getActiveDisplayPlugin()->deactivate();
     if (_autoSwitchDisplayModeSupportedHMDPlugin 
-        && _autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) {
-        _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession();
+        && _autoSwitchDisplayModeSupportedHMDPlugin->isSessionActive()) {
+        _autoSwitchDisplayModeSupportedHMDPlugin->endSession();
     }
     // use the CloseEventSender via a QThread to send an event that says the user asked for the app to close
     auto closeEventSender = DependencyManager::get<CloseEventSender>();
@@ -6827,13 +6827,14 @@ void Application::switchDisplayMode() {
         // Switch to respective mode as soon as currentHMDWornStatus changes
         if (currentHMDWornStatus) {
             qCDebug(interfaceapp) << "Switching from Desktop to HMD mode";
-            endHMDStandBySession();
+            endHMDSession();
             setActiveDisplayPlugin(_autoSwitchDisplayModeSupportedHMDPluginName);
         } else {
             qCDebug(interfaceapp) << "Switching from HMD to desktop mode";
             setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME);
             startHMDStandBySession();
         }
+        emit activeDisplayPluginChanged();
     }
     _previousHMDWornStatus = currentHMDWornStatus;
 }
@@ -6842,8 +6843,8 @@ void Application::startHMDStandBySession() {
     _autoSwitchDisplayModeSupportedHMDPlugin->startStandBySession();
 }
 
-void Application::endHMDStandBySession() {
-    _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession();
+void Application::endHMDSession() {
+    _autoSwitchDisplayModeSupportedHMDPlugin->endSession();
 }
 
 mat4 Application::getEyeProjection(int eye) const {
diff --git a/interface/src/Application.h b/interface/src/Application.h
index 4cd47ada58..46e5e882a4 100644
--- a/interface/src/Application.h
+++ b/interface/src/Application.h
@@ -685,6 +685,6 @@ private:
     QString _autoSwitchDisplayModeSupportedHMDPluginName;
     bool _previousHMDWornStatus;
     void startHMDStandBySession();
-    void endHMDStandBySession();
+    void endHMDSession();
 };
 #endif // hifi_Application_h
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
index fbdc1ad71e..bfd158ffb5 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
@@ -346,9 +346,9 @@ bool OpenGLDisplayPlugin::startStandBySession() {
     return Parent::startStandBySession();
 }
 
-void OpenGLDisplayPlugin::endStandBySession() {
-    deactivateStandBySession();
-    Parent::endStandBySession();
+void OpenGLDisplayPlugin::endSession() {
+    deactivateSession();
+    Parent::endSession();
 }
 
 void OpenGLDisplayPlugin::customizeContext() {
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
index 9681158c55..10a7558398 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
@@ -43,7 +43,7 @@ public:
     bool activate() override final;
     void deactivate() override final;
     bool startStandBySession() override final;
-    void endStandBySession() override final;
+    void endSession() override final;
     bool eventFilter(QObject* receiver, QEvent* event) override;
     bool isDisplayVisible() const override { return true; }
 
@@ -104,7 +104,7 @@ protected:
 	
     // Returns true on successful activation of standby session
     virtual bool activateStandBySession() { return true; }
-    virtual void deactivateStandBySession() {}
+    virtual void deactivateSession() {}
 
     // Plugin specific functionality to send the composed scene to the output window or device
     virtual void internalPresent();
diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h
index 11ea79186a..2d4a24a1fe 100644
--- a/libraries/plugins/src/plugins/Plugin.h
+++ b/libraries/plugins/src/plugins/Plugin.h
@@ -54,16 +54,16 @@ public:
         return _active;
     }
     virtual bool startStandBySession() {
-        _standbysessionstatus = true;
-        return _standbysessionstatus;
+        _sessionStatus = true;
+        return _sessionStatus;
     }
 
-    virtual void endStandBySession() {
-        _standbysessionstatus = false;
+    virtual void endSession() {
+        _sessionStatus = false;
     }
 
-    virtual bool isStandBySessionActive() {
-        return _standbysessionstatus;
+    virtual bool isSessionActive() {
+        return _sessionStatus;
     }
 
     /**
@@ -85,7 +85,7 @@ signals:
 
 protected:
     bool _active { false };
-    bool _standbysessionstatus { false };
+    bool _sessionStatus { false };
     PluginContainer* _container { nullptr };
     static const char* UNKNOWN_PLUGIN_ID;
 
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
index df98abf408..93f4787f0f 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
@@ -123,8 +123,6 @@ bool OculusBaseDisplayPlugin::internalActivate() {
 
 void OculusBaseDisplayPlugin::internalDeactivate() {
     Parent::internalDeactivate();
-    releaseOculusSession();
-    _session = nullptr;
 }
 
 bool OculusBaseDisplayPlugin::activateStandBySession() {
@@ -134,7 +132,7 @@ bool OculusBaseDisplayPlugin::activateStandBySession() {
     }
     return true;
 }
-void OculusBaseDisplayPlugin::deactivateStandBySession() {
+void OculusBaseDisplayPlugin::deactivateSession() {
     releaseOculusSession();
     _session = nullptr;
 }
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h
index bfdcc5db1e..5230b11681 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.h
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h
@@ -35,7 +35,7 @@ protected:
     bool internalActivate() override;
     void internalDeactivate() override;
     bool activateStandBySession() override;
-    void deactivateStandBySession() override;
+    void deactivateSession() override;
     void updatePresentPose() override;
 
 protected: