| Index: chrome/browser/android/vr_shell/vr_shell_delegate.cc
|
| diff --git a/chrome/browser/android/vr_shell/vr_shell_delegate.cc b/chrome/browser/android/vr_shell/vr_shell_delegate.cc
|
| index 2d1a50887411ef6f6dca576f78297d4b97e940a2..6a0cc046e089bbe811848c03bd85d20fb01732e8 100644
|
| --- a/chrome/browser/android/vr_shell/vr_shell_delegate.cc
|
| +++ b/chrome/browser/android/vr_shell/vr_shell_delegate.cc
|
| @@ -6,7 +6,9 @@
|
|
|
| #include "base/android/jni_android.h"
|
| #include "chrome/browser/android/vr_shell/non_presenting_gvr_delegate.h"
|
| +#include "device/vr/android/gvr/gvr_device.h"
|
| #include "device/vr/android/gvr/gvr_device_provider.h"
|
| +#include "device/vr/android/gvr/gvr_gamepad_data_fetcher.h"
|
| #include "jni/VrShellDelegate_jni.h"
|
|
|
| using base::android::JavaParamRef;
|
| @@ -23,35 +25,49 @@ VrShellDelegate::VrShellDelegate(JNIEnv* env, jobject obj)
|
| VrShellDelegate::~VrShellDelegate() {
|
| GvrDelegateProvider::SetInstance(nullptr);
|
| if (device_provider_) {
|
| - device_provider_->OnNonPresentingDelegateRemoved();
|
| + device_provider_->Device()->OnDelegateChanged();
|
| }
|
| }
|
|
|
| -VrShellDelegate* VrShellDelegate::GetNativeDelegate(
|
| +VrShellDelegate* VrShellDelegate::GetNativeVrShellDelegate(
|
| JNIEnv* env, jobject jdelegate) {
|
| long native_delegate = Java_VrShellDelegate_getNativePointer(env, jdelegate);
|
| return reinterpret_cast<VrShellDelegate*>(native_delegate);
|
| }
|
|
|
| -void VrShellDelegate::SetDelegate(device::GvrDelegate* delegate) {
|
| +void VrShellDelegate::SetDelegate(device::GvrDelegate* delegate,
|
| + gvr_context* context) {
|
| + context_ = context;
|
| delegate_ = delegate;
|
| + // Clean up the non-presenting delegate.
|
| if (non_presenting_delegate_) {
|
| device::mojom::VRVSyncProviderRequest request =
|
| non_presenting_delegate_->OnSwitchToPresentingDelegate();
|
| if (request.is_pending())
|
| delegate->OnVRVsyncProviderRequest(std::move(request));
|
| + non_presenting_delegate_ = nullptr;
|
| + JNIEnv* env = AttachCurrentThread();
|
| + Java_VrShellDelegate_shutdownNonPresentingNativeContext(
|
| + env, j_vr_shell_delegate_.obj());
|
| }
|
| if (device_provider_) {
|
| - device_provider_->OnGvrDelegateReady(delegate_);
|
| + device::GvrDevice* device = device_provider_->Device();
|
| + device::GamepadDataFetcherManager::GetInstance()->AddFactory(
|
| + new device::GvrGamepadDataFetcher::Factory(context, device->id()));
|
| + device->OnDelegateChanged();
|
| }
|
| +
|
| delegate_->UpdateVSyncInterval(timebase_nanos_, interval_seconds_);
|
| }
|
|
|
| void VrShellDelegate::RemoveDelegate() {
|
| + delegate_ = nullptr;
|
| + device::GamepadDataFetcherManager::GetInstance()->RemoveSourceFactory(
|
| + device::GAMEPAD_SOURCE_GVR);
|
| if (device_provider_) {
|
| - device_provider_->OnGvrDelegateRemoved();
|
| + CreateNonPresentingDelegate();
|
| + device_provider_->Device()->OnDelegateChanged();
|
| }
|
| - delegate_ = nullptr;
|
| }
|
|
|
| void VrShellDelegate::SetPresentResult(JNIEnv* env,
|
| @@ -65,7 +81,8 @@ void VrShellDelegate::SetPresentResult(JNIEnv* env,
|
| void VrShellDelegate::DisplayActivate(JNIEnv* env,
|
| const JavaParamRef<jobject>& obj) {
|
| if (device_provider_) {
|
| - device_provider_->OnDisplayActivate();
|
| + device_provider_->Device()->OnActivate(
|
| + device::mojom::VRDisplayEventReason::MOUNTED);
|
| }
|
| }
|
|
|
| @@ -101,10 +118,20 @@ void VrShellDelegate::OnResume(JNIEnv* env,
|
|
|
| void VrShellDelegate::SetDeviceProvider(
|
| device::GvrDeviceProvider* device_provider) {
|
| + CHECK(!device_provider_);
|
| device_provider_ = device_provider;
|
| - if (device_provider_ && delegate_) {
|
| - device_provider_->OnGvrDelegateReady(delegate_);
|
| - }
|
| + if (!delegate_)
|
| + CreateNonPresentingDelegate();
|
| + device_provider_->Device()->OnDelegateChanged();
|
| +}
|
| +
|
| +void VrShellDelegate::ClearDeviceProvider() {
|
| + non_presenting_delegate_ = nullptr;
|
| + JNIEnv* env = AttachCurrentThread();
|
| + Java_VrShellDelegate_shutdownNonPresentingNativeContext(
|
| + env, j_vr_shell_delegate_.obj());
|
| + device_provider_->Device()->OnDelegateChanged();
|
| + device_provider_ = nullptr;
|
| }
|
|
|
| void VrShellDelegate::RequestWebVRPresent(
|
| @@ -141,31 +168,27 @@ base::WeakPtr<VrShellDelegate> VrShellDelegate::GetWeakPtr() {
|
|
|
| void VrShellDelegate::OnVRVsyncProviderRequest(
|
| device::mojom::VRVSyncProviderRequest request) {
|
| - GetNonPresentingDelegate()->OnVRVsyncProviderRequest(std::move(request));
|
| + GetDelegate()->OnVRVsyncProviderRequest(std::move(request));
|
| }
|
|
|
| -device::GvrDelegate* VrShellDelegate::GetNonPresentingDelegate() {
|
| - if (!non_presenting_delegate_) {
|
| - JNIEnv* env = AttachCurrentThread();
|
| - jlong context = Java_VrShellDelegate_createNonPresentingNativeContext(
|
| - env, j_vr_shell_delegate_.obj());
|
| - if (!context)
|
| - return nullptr;
|
| -
|
| - non_presenting_delegate_.reset(new NonPresentingGvrDelegate(context));
|
| - non_presenting_delegate_->UpdateVSyncInterval(timebase_nanos_,
|
| - interval_seconds_);
|
| - }
|
| - return non_presenting_delegate_.get();
|
| +void VrShellDelegate::CreateNonPresentingDelegate() {
|
| + JNIEnv* env = AttachCurrentThread();
|
| + gvr_context* context = reinterpret_cast<gvr_context*>(
|
| + Java_VrShellDelegate_createNonPresentingNativeContext(
|
| + env, j_vr_shell_delegate_.obj()));
|
| + if (!context)
|
| + return;
|
| + context_ = context;
|
| + non_presenting_delegate_ =
|
| + base::MakeUnique<NonPresentingGvrDelegate>(context);
|
| + non_presenting_delegate_->UpdateVSyncInterval(timebase_nanos_,
|
| + interval_seconds_);
|
| }
|
|
|
| -void VrShellDelegate::DestroyNonPresentingDelegate() {
|
| - if (non_presenting_delegate_) {
|
| - non_presenting_delegate_.reset(nullptr);
|
| - JNIEnv* env = AttachCurrentThread();
|
| - Java_VrShellDelegate_shutdownNonPresentingNativeContext(
|
| - env, j_vr_shell_delegate_.obj());
|
| - }
|
| +device::GvrDelegate* VrShellDelegate::GetDelegate() {
|
| + if (delegate_)
|
| + return delegate_;
|
| + return non_presenting_delegate_.get();
|
| }
|
|
|
| void VrShellDelegate::SetListeningForActivate(bool listening) {
|
|
|