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) { |