Index: device/vr/android/gvr/gvr_device_provider.cc |
diff --git a/device/vr/android/gvr/gvr_device_provider.cc b/device/vr/android/gvr/gvr_device_provider.cc |
index 5d80f2652670d2ee96f7ee4a44bd5ef411c1364e..21061f96ecc56b98a8f091cc1765bd7b1afa06b6 100644 |
--- a/device/vr/android/gvr/gvr_device_provider.cc |
+++ b/device/vr/android/gvr/gvr_device_provider.cc |
@@ -10,20 +10,25 @@ |
#include "base/android/jni_android.h" |
#include "base/android/jni_utils.h" |
#include "base/android/scoped_java_ref.h" |
+#include "device/vr/android/gvr/gvr_delegate.h" |
#include "device/vr/android/gvr/gvr_device.h" |
+#include "device/vr/vr_device_manager.h" |
#include "jni/GvrDeviceProvider_jni.h" |
+#include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/gvr.h" |
using base::android::AttachCurrentThread; |
using base::android::GetApplicationContext; |
namespace device { |
-// A temporary delegate till the VrShell is available. |
-class GvrDeviceProviderDelegate : public GvrDelegate { |
+// A temporary delegate till a VrShell instance becomes available. |
+class GvrNonPresentingDelegate : public GvrDelegate { |
public: |
- GvrDeviceProviderDelegate() { |
- // TODO: This should eventually be handled by an actual GvrLayout instance |
- // in the view tree. |
+ GvrNonPresentingDelegate() { Initialize(); } |
+ |
+ virtual ~GvrNonPresentingDelegate() { Shutdown(); } |
+ |
+ void Initialize() { |
if (j_device_.is_null()) { |
JNIEnv* env = AttachCurrentThread(); |
@@ -37,25 +42,19 @@ class GvrDeviceProviderDelegate : public GvrDelegate { |
gvr_api_ = |
gvr::GvrApi::WrapNonOwned(reinterpret_cast<gvr_context*>(context)); |
- |
- GvrDelegateManager::GetInstance()->Initialize(this); |
} |
} |
- virtual ~GvrDeviceProviderDelegate() { |
- // TODO: This should eventually be handled by an actual GvrLayout instance |
- // in the view tree. |
- GvrDelegateManager::GetInstance()->Shutdown(); |
+ void Shutdown() { |
if (!j_device_.is_null()) { |
+ gvr_api_ = nullptr; |
JNIEnv* env = AttachCurrentThread(); |
Java_GvrDeviceProvider_shutdown(env, j_device_.obj()); |
+ j_device_ = nullptr; |
} |
} |
// GvrDelegate implementation |
- void RequestWebVRPresent() override {} |
- void ExitWebVRPresent() override {} |
- |
void SubmitWebVRFrame() override {} |
void UpdateWebVRTextureBounds(int eye, |
float left, |
@@ -70,12 +69,12 @@ class GvrDeviceProviderDelegate : public GvrDelegate { |
std::unique_ptr<gvr::GvrApi> gvr_api_; |
}; |
-GvrDeviceProvider::GvrDeviceProvider() : VRDeviceProvider() { |
- GvrDelegateManager::GetInstance()->AddClient(this); |
-} |
+GvrDeviceProvider::GvrDeviceProvider() |
+ : VRDeviceProvider(), |
+ main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()) {} |
GvrDeviceProvider::~GvrDeviceProvider() { |
- GvrDelegateManager::GetInstance()->RemoveClient(this); |
+ ExitPresent(); |
} |
void GvrDeviceProvider::GetDevices(std::vector<VRDevice*>* devices) { |
@@ -91,20 +90,59 @@ void GvrDeviceProvider::SetClient(VRClientDispatcher* client) { |
} |
void GvrDeviceProvider::Initialize() { |
- if (!delegate_) |
- delegate_.reset(new GvrDeviceProviderDelegate()); |
+ if (!non_presenting_delegate_) { |
+ non_presenting_delegate_.reset(new GvrNonPresentingDelegate()); |
+ if (non_presenting_delegate_->gvr_api()) { |
+ vr_device_.reset(new GvrDevice(this, non_presenting_delegate_.get())); |
+ client_->OnDeviceConnectionStatusChanged(vr_device_.get(), true); |
+ } |
+ } |
+} |
+ |
+bool GvrDeviceProvider::RequestPresent() { |
+ GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance(); |
+ if (!delegate_provider) |
+ return false; |
+ |
+ return delegate_provider->RequestWebVRPresent(this); |
} |
-void GvrDeviceProvider::OnDelegateInitialized(GvrDelegate* delegate) { |
+void GvrDeviceProvider::ExitPresent() { |
+ DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); |
+ |
+ if (!vr_device_) |
+ return; |
+ |
+ vr_device_->SetDelegate(non_presenting_delegate_.get()); |
+ |
+ GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance(); |
+ if (delegate_provider) |
+ delegate_provider->ExitWebVRPresent(); |
+ |
+ if (client_) |
+ client_->OnPresentEnded(vr_device_.get()); |
+} |
+ |
+void GvrDeviceProvider::OnGvrDelegateReady(GvrDelegate* delegate) { |
+ main_thread_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&GvrDeviceProvider::GvrDelegateReady, base::Unretained(this), |
+ base::Unretained(delegate))); |
+} |
+ |
+void GvrDeviceProvider::OnGvrDelegateRemoved() { |
if (!vr_device_) |
- vr_device_.reset(new GvrDevice(this, delegate)); |
+ return; |
- client_->OnDeviceConnectionStatusChanged(vr_device_.get(), true); |
+ main_thread_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&GvrDeviceProvider::ExitPresent, base::Unretained(this))); |
} |
-void GvrDeviceProvider::OnDelegateShutdown() { |
- if (client_ && vr_device_) |
- client_->OnDeviceConnectionStatusChanged(vr_device_.get(), false); |
+void GvrDeviceProvider::GvrDelegateReady(GvrDelegate* delegate) { |
+ DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); |
+ |
+ vr_device_->SetDelegate(delegate); |
} |
} // namespace device |