| 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 1025ca40726bfe2136cc3ee93f18d62cc8b0d8fc..252aa117667e09cce9ca7041c791706dc8c2a220 100644
|
| --- a/device/vr/android/gvr/gvr_device_provider.cc
|
| +++ b/device/vr/android/gvr/gvr_device_provider.cc
|
| @@ -14,7 +14,6 @@
|
| #include "device/vr/android/gvr/gvr_device.h"
|
| #include "device/vr/android/gvr/gvr_gamepad_data_fetcher.h"
|
| #include "device/vr/vr_device_manager.h"
|
| -#include "jni/GvrDeviceProvider_jni.h"
|
| #include "third_party/gvr-android-sdk/src/ndk/include/vr/gvr/capi/include/gvr.h"
|
| #include "third_party/gvr-android-sdk/src/ndk/include/vr/gvr/capi/include/gvr_controller.h"
|
| #include "third_party/gvr-android-sdk/src/ndk/include/vr/gvr/capi/include/gvr_types.h"
|
| @@ -24,62 +23,16 @@ using base::android::GetApplicationContext;
|
|
|
| namespace device {
|
|
|
| -// A temporary delegate till a VrShell instance becomes available.
|
| -class GvrNonPresentingDelegate : public GvrDelegate {
|
| - public:
|
| - GvrNonPresentingDelegate() { Initialize(); }
|
| -
|
| - virtual ~GvrNonPresentingDelegate() { Shutdown(); }
|
| -
|
| - void Initialize() {
|
| - if (j_device_.is_null()) {
|
| - JNIEnv* env = AttachCurrentThread();
|
| -
|
| - j_device_.Reset(
|
| - Java_GvrDeviceProvider_create(env, GetApplicationContext()));
|
| - jlong context =
|
| - Java_GvrDeviceProvider_getNativeContext(env, j_device_.obj());
|
| -
|
| - if (!context)
|
| - return;
|
| -
|
| - gvr_api_ =
|
| - gvr::GvrApi::WrapNonOwned(reinterpret_cast<gvr_context*>(context));
|
| - }
|
| - }
|
| -
|
| - 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 SetWebVRSecureOrigin(bool secure_origin) override {}
|
| - void SubmitWebVRFrame() override {}
|
| - void UpdateWebVRTextureBounds(int eye,
|
| - float left,
|
| - float top,
|
| - float width,
|
| - float height) override {}
|
| - void SetGvrPoseForWebVr(const gvr::Mat4f& pose,
|
| - uint32_t pose_index) override {}
|
| -
|
| - gvr::GvrApi* gvr_api() override { return gvr_api_.get(); }
|
| -
|
| - private:
|
| - base::android::ScopedJavaGlobalRef<jobject> j_device_;
|
| - std::unique_ptr<gvr::GvrApi> gvr_api_;
|
| -};
|
| -
|
| GvrDeviceProvider::GvrDeviceProvider()
|
| : VRDeviceProvider(),
|
| main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
|
|
|
| GvrDeviceProvider::~GvrDeviceProvider() {
|
| + device::GvrDelegateProvider* delegate_provider =
|
| + device::GvrDelegateProvider::GetInstance();
|
| + if (delegate_provider)
|
| + delegate_provider->DestroyNonPresentingDelegate();
|
| +
|
| ExitPresent();
|
| }
|
|
|
| @@ -96,17 +49,25 @@ void GvrDeviceProvider::SetClient(VRClientDispatcher* client) {
|
| }
|
|
|
| void GvrDeviceProvider::Initialize() {
|
| + device::GvrDelegateProvider* delegate_provider =
|
| + device::GvrDelegateProvider::GetInstance();
|
| + if (!delegate_provider)
|
| + return;
|
| +
|
| if (!vr_device_) {
|
| - vr_device_.reset(new GvrDevice(this, nullptr));
|
| + vr_device_.reset(
|
| + new GvrDevice(this, delegate_provider->GetNonPresentingDelegate()));
|
| client_->OnDeviceConnectionStatusChanged(vr_device_.get(), true);
|
| }
|
| }
|
|
|
| bool GvrDeviceProvider::RequestPresent() {
|
| - GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance();
|
| + device::GvrDelegateProvider* delegate_provider =
|
| + device::GvrDelegateProvider::GetInstance();
|
| if (!delegate_provider)
|
| return false;
|
|
|
| + // RequestWebVRPresent is async as a render thread may be created.
|
| return delegate_provider->RequestWebVRPresent(this);
|
| }
|
|
|
| @@ -116,14 +77,17 @@ void GvrDeviceProvider::ExitPresent() {
|
| if (!vr_device_)
|
| return;
|
|
|
| - vr_device_->SetDelegate(nullptr);
|
| + device::GvrDelegateProvider* delegate_provider =
|
| + device::GvrDelegateProvider::GetInstance();
|
| + if (!delegate_provider)
|
| + return;
|
| +
|
| + vr_device_->SetDelegate(delegate_provider->GetNonPresentingDelegate());
|
|
|
| GamepadDataFetcherManager::GetInstance()->RemoveSourceFactory(
|
| GAMEPAD_SOURCE_GVR);
|
|
|
| - GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance();
|
| - if (delegate_provider)
|
| - delegate_provider->ExitWebVRPresent();
|
| + delegate_provider->ExitWebVRPresent();
|
|
|
| if (client_)
|
| client_->OnPresentEnded(vr_device_.get());
|
| @@ -137,12 +101,10 @@ void GvrDeviceProvider::OnGvrDelegateReady(GvrDelegate* delegate) {
|
| }
|
|
|
| void GvrDeviceProvider::OnGvrDelegateRemoved() {
|
| + DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
|
| if (!vr_device_)
|
| return;
|
| -
|
| - main_thread_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&GvrDeviceProvider::ExitPresent, base::Unretained(this)));
|
| + ExitPresent();
|
| }
|
|
|
| void GvrDeviceProvider::GvrDelegateReady(GvrDelegate* delegate) {
|
|
|