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 26d1c5969f7d595d4d438428d32f474a6bbc3923..971fd7fcb9156864949e52b9379a2a5a7dee3e2d 100644 |
--- a/device/vr/android/gvr/gvr_device_provider.cc |
+++ b/device/vr/android/gvr/gvr_device_provider.cc |
@@ -12,129 +12,69 @@ |
#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/android/gvr/gvr_gamepad_data_fetcher.h" |
#include "device/vr/vr_device.h" |
#include "device/vr/vr_device_manager.h" |
#include "device/vr/vr_service.mojom.h" |
#include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr.h" |
#include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr_controller.h" |
-#include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr_types.h" |
- |
-using base::android::AttachCurrentThread; |
-using base::android::GetApplicationContext; |
namespace device { |
-GvrDeviceProvider::GvrDeviceProvider() {} |
+GvrDeviceProvider::GvrDeviceProvider() |
+ : vr_device_(base::MakeUnique<GvrDevice>(this)) {} |
GvrDeviceProvider::~GvrDeviceProvider() { |
- GamepadDataFetcherManager::GetInstance()->RemoveSourceFactory( |
- GAMEPAD_SOURCE_GVR); |
- |
device::GvrDelegateProvider* delegate_provider = |
device::GvrDelegateProvider::GetInstance(); |
if (delegate_provider) { |
delegate_provider->ExitWebVRPresent(); |
- delegate_provider->DestroyNonPresentingDelegate(); |
- delegate_provider->SetDeviceProvider(nullptr); |
+ delegate_provider->ClearDeviceProvider(); |
} |
} |
void GvrDeviceProvider::GetDevices(std::vector<VRDevice*>* devices) { |
Initialize(); |
- |
- if (vr_device_) |
- devices->push_back(vr_device_.get()); |
+ devices->push_back(vr_device_.get()); |
} |
void GvrDeviceProvider::Initialize() { |
+ // TODO(mthiesse): Clean up how we connect the GvrDelegateProvider to the |
+ // GvrDeviceProvider so we don't have to call this function multiple times. |
+ // Ideally the DelegateProvider would always be available, and GetInstance() |
+ // would create it. |
+ if (initialized_) |
+ return; |
device::GvrDelegateProvider* delegate_provider = |
device::GvrDelegateProvider::GetInstance(); |
if (!delegate_provider) |
return; |
delegate_provider->SetDeviceProvider(this); |
- if (!vr_device_) { |
- vr_device_.reset( |
- new GvrDevice(this, delegate_provider->GetNonPresentingDelegate())); |
- } |
+ initialized_ = true; |
} |
void GvrDeviceProvider::RequestPresent( |
const base::Callback<void(bool)>& callback) { |
+ Initialize(); |
device::GvrDelegateProvider* delegate_provider = |
device::GvrDelegateProvider::GetInstance(); |
if (!delegate_provider) |
return callback.Run(false); |
- // RequestWebVRPresent is async as a render thread may be created. |
+ // RequestWebVRPresent is async as we may trigger a DON flow that pauses |
+ // Chrome. |
delegate_provider->RequestWebVRPresent(callback); |
} |
// VR presentation exit requested by the API. |
void GvrDeviceProvider::ExitPresent() { |
- SwitchToNonPresentingDelegate(); |
- // If we're presenting currently stop. |
+ Initialize(); |
GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance(); |
if (delegate_provider) |
delegate_provider->ExitWebVRPresent(); |
} |
-void GvrDeviceProvider::OnGvrDelegateReady(GvrDelegate* delegate) { |
- if (!vr_device_) |
- return; |
- VLOG(1) << "Switching to presenting delegate"; |
- vr_device_->SetDelegate(delegate); |
- GamepadDataFetcherManager::GetInstance()->AddFactory( |
- new GvrGamepadDataFetcher::Factory(delegate, vr_device_->id())); |
-} |
- |
-// VR presentation exit requested by the delegate (probably via UI). |
-void GvrDeviceProvider::OnGvrDelegateRemoved() { |
- if (!vr_device_) |
- return; |
- |
- SwitchToNonPresentingDelegate(); |
- vr_device_->OnExitPresent(); |
-} |
- |
-void GvrDeviceProvider::OnNonPresentingDelegateRemoved() { |
- if (!vr_device_) |
- return; |
- vr_device_->SetDelegate(nullptr); |
-} |
- |
-void GvrDeviceProvider::OnDisplayBlur() { |
- if (!vr_device_) |
- return; |
- vr_device_->OnBlur(); |
-} |
- |
-void GvrDeviceProvider::OnDisplayFocus() { |
- if (!vr_device_) |
- return; |
- vr_device_->OnFocus(); |
-} |
- |
-void GvrDeviceProvider::OnDisplayActivate() { |
- if (!vr_device_) |
- return; |
- vr_device_->OnActivate(mojom::VRDisplayEventReason::MOUNTED); |
-} |
- |
-void GvrDeviceProvider::SwitchToNonPresentingDelegate() { |
- GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance(); |
- if (!vr_device_ || !delegate_provider) |
- return; |
- |
- VLOG(1) << "Switching to non-presenting delegate"; |
- vr_device_->SetDelegate(delegate_provider->GetNonPresentingDelegate()); |
- |
- // Remove GVR gamepad polling. |
- GamepadDataFetcherManager::GetInstance()->RemoveSourceFactory( |
- GAMEPAD_SOURCE_GVR); |
-} |
- |
void GvrDeviceProvider::SetListeningForActivate(bool listening) { |
+ Initialize(); |
device::GvrDelegateProvider* delegate_provider = |
device::GvrDelegateProvider::GetInstance(); |
if (!delegate_provider) |