Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(429)

Side by Side Diff: device/vr/android/gvr/gvr_device_provider.cc

Issue 2658643003: Refactor GvrDelegate ownership into GvrDelegateProvider and fix more threading violations. (Closed)
Patch Set: Address comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "device/vr/android/gvr/gvr_device_provider.h" 5 #include "device/vr/android/gvr/gvr_device_provider.h"
6 6
7 #include <jni.h> 7 #include <jni.h>
8 8
9 #include "base/android/context_utils.h" 9 #include "base/android/context_utils.h"
10 #include "base/android/jni_android.h" 10 #include "base/android/jni_android.h"
11 #include "base/android/jni_utils.h" 11 #include "base/android/jni_utils.h"
12 #include "base/android/scoped_java_ref.h" 12 #include "base/android/scoped_java_ref.h"
13 #include "device/vr/android/gvr/gvr_delegate.h" 13 #include "device/vr/android/gvr/gvr_delegate.h"
14 #include "device/vr/android/gvr/gvr_device.h" 14 #include "device/vr/android/gvr/gvr_device.h"
15 #include "device/vr/android/gvr/gvr_gamepad_data_fetcher.h"
16 #include "device/vr/vr_device.h" 15 #include "device/vr/vr_device.h"
17 #include "device/vr/vr_device_manager.h" 16 #include "device/vr/vr_device_manager.h"
18 #include "device/vr/vr_service.mojom.h" 17 #include "device/vr/vr_service.mojom.h"
19 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/ gvr.h" 18 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/ gvr.h"
20 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/ gvr_controller.h" 19 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/ gvr_controller.h"
21 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/ gvr_types.h"
22
23 using base::android::AttachCurrentThread;
24 using base::android::GetApplicationContext;
25 20
26 namespace device { 21 namespace device {
27 22
28 GvrDeviceProvider::GvrDeviceProvider() {} 23 GvrDeviceProvider::GvrDeviceProvider()
24 : vr_device_(base::MakeUnique<GvrDevice>(this)) {}
29 25
30 GvrDeviceProvider::~GvrDeviceProvider() { 26 GvrDeviceProvider::~GvrDeviceProvider() {
31 GamepadDataFetcherManager::GetInstance()->RemoveSourceFactory(
32 GAMEPAD_SOURCE_GVR);
33
34 device::GvrDelegateProvider* delegate_provider = 27 device::GvrDelegateProvider* delegate_provider =
35 device::GvrDelegateProvider::GetInstance(); 28 device::GvrDelegateProvider::GetInstance();
36 if (delegate_provider) { 29 if (delegate_provider) {
37 delegate_provider->ExitWebVRPresent(); 30 delegate_provider->ExitWebVRPresent();
38 delegate_provider->DestroyNonPresentingDelegate(); 31 delegate_provider->ClearDeviceProvider();
39 delegate_provider->SetDeviceProvider(nullptr);
40 } 32 }
41 } 33 }
42 34
43 void GvrDeviceProvider::GetDevices(std::vector<VRDevice*>* devices) { 35 void GvrDeviceProvider::GetDevices(std::vector<VRDevice*>* devices) {
44 Initialize(); 36 Initialize();
45 37 devices->push_back(vr_device_.get());
46 if (vr_device_)
47 devices->push_back(vr_device_.get());
48 } 38 }
49 39
50 void GvrDeviceProvider::Initialize() { 40 void GvrDeviceProvider::Initialize() {
41 // TODO(mthiesse): Clean up how we connect the GvrDelegateProvider to the
42 // GvrDeviceProvider so we don't have to call this function multiple times.
43 // Ideally the DelegateProvider would always be available, and GetInstance()
44 // would create it.
45 if (initialized_)
46 return;
51 device::GvrDelegateProvider* delegate_provider = 47 device::GvrDelegateProvider* delegate_provider =
52 device::GvrDelegateProvider::GetInstance(); 48 device::GvrDelegateProvider::GetInstance();
53 if (!delegate_provider) 49 if (!delegate_provider)
54 return; 50 return;
55 delegate_provider->SetDeviceProvider(this); 51 delegate_provider->SetDeviceProvider(this);
56 if (!vr_device_) { 52 initialized_ = true;
57 vr_device_.reset(
58 new GvrDevice(this, delegate_provider->GetNonPresentingDelegate()));
59 }
60 } 53 }
61 54
62 void GvrDeviceProvider::RequestPresent( 55 void GvrDeviceProvider::RequestPresent(
63 const base::Callback<void(bool)>& callback) { 56 const base::Callback<void(bool)>& callback) {
57 Initialize();
64 device::GvrDelegateProvider* delegate_provider = 58 device::GvrDelegateProvider* delegate_provider =
65 device::GvrDelegateProvider::GetInstance(); 59 device::GvrDelegateProvider::GetInstance();
66 if (!delegate_provider) 60 if (!delegate_provider)
67 return callback.Run(false); 61 return callback.Run(false);
68 62
69 // RequestWebVRPresent is async as a render thread may be created. 63 // RequestWebVRPresent is async as we may trigger a DON flow that pauses
64 // Chrome.
70 delegate_provider->RequestWebVRPresent(callback); 65 delegate_provider->RequestWebVRPresent(callback);
71 } 66 }
72 67
73 // VR presentation exit requested by the API. 68 // VR presentation exit requested by the API.
74 void GvrDeviceProvider::ExitPresent() { 69 void GvrDeviceProvider::ExitPresent() {
75 SwitchToNonPresentingDelegate(); 70 Initialize();
76 // If we're presenting currently stop.
77 GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance(); 71 GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance();
78 if (delegate_provider) 72 if (delegate_provider)
79 delegate_provider->ExitWebVRPresent(); 73 delegate_provider->ExitWebVRPresent();
80 } 74 }
81 75
82 void GvrDeviceProvider::OnGvrDelegateReady(GvrDelegate* delegate) {
83 if (!vr_device_)
84 return;
85 VLOG(1) << "Switching to presenting delegate";
86 vr_device_->SetDelegate(delegate);
87 GamepadDataFetcherManager::GetInstance()->AddFactory(
88 new GvrGamepadDataFetcher::Factory(delegate, vr_device_->id()));
89 }
90
91 // VR presentation exit requested by the delegate (probably via UI).
92 void GvrDeviceProvider::OnGvrDelegateRemoved() {
93 if (!vr_device_)
94 return;
95
96 SwitchToNonPresentingDelegate();
97 vr_device_->OnExitPresent();
98 }
99
100 void GvrDeviceProvider::OnNonPresentingDelegateRemoved() {
101 if (!vr_device_)
102 return;
103 vr_device_->SetDelegate(nullptr);
104 }
105
106 void GvrDeviceProvider::OnDisplayBlur() {
107 if (!vr_device_)
108 return;
109 vr_device_->OnBlur();
110 }
111
112 void GvrDeviceProvider::OnDisplayFocus() {
113 if (!vr_device_)
114 return;
115 vr_device_->OnFocus();
116 }
117
118 void GvrDeviceProvider::OnDisplayActivate() {
119 if (!vr_device_)
120 return;
121 vr_device_->OnActivate(mojom::VRDisplayEventReason::MOUNTED);
122 }
123
124 void GvrDeviceProvider::SwitchToNonPresentingDelegate() {
125 GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance();
126 if (!vr_device_ || !delegate_provider)
127 return;
128
129 VLOG(1) << "Switching to non-presenting delegate";
130 vr_device_->SetDelegate(delegate_provider->GetNonPresentingDelegate());
131
132 // Remove GVR gamepad polling.
133 GamepadDataFetcherManager::GetInstance()->RemoveSourceFactory(
134 GAMEPAD_SOURCE_GVR);
135 }
136
137 void GvrDeviceProvider::SetListeningForActivate(bool listening) { 76 void GvrDeviceProvider::SetListeningForActivate(bool listening) {
77 Initialize();
138 device::GvrDelegateProvider* delegate_provider = 78 device::GvrDelegateProvider* delegate_provider =
139 device::GvrDelegateProvider::GetInstance(); 79 device::GvrDelegateProvider::GetInstance();
140 if (!delegate_provider) 80 if (!delegate_provider)
141 return; 81 return;
142 82
143 delegate_provider->SetListeningForActivate(listening); 83 delegate_provider->SetListeningForActivate(listening);
144 } 84 }
145 85
146 } // namespace device 86 } // namespace device
OLDNEW
« no previous file with comments | « device/vr/android/gvr/gvr_device_provider.h ('k') | device/vr/android/gvr/gvr_gamepad_data_fetcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698