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

Unified Diff: device/vr/android/gvr/gvr_device_provider.cc

Issue 2343023002: Switch WebVR to handle GvrApi management through VrShellDelegate (Closed)
Patch Set: Renamed onNativeLibraryReady to initializeNative Created 4 years, 3 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 side-by-side diff with in-line comments
Download patch
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 5d80f2652670d2ee96f7ee4a44bd5ef411c1364e..21061f96ecc56b98a8f091cc1765bd7b1afa06b6 100644
--- a/device/vr/android/gvr/gvr_device_provider.cc
+++ b/device/vr/android/gvr/gvr_device_provider.cc
@@ -10,20 +10,25 @@
#include "base/android/jni_android.h"
#include "base/android/jni_utils.h"
#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/vr_device_manager.h"
#include "jni/GvrDeviceProvider_jni.h"
+#include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/gvr.h"
using base::android::AttachCurrentThread;
using base::android::GetApplicationContext;
namespace device {
-// A temporary delegate till the VrShell is available.
-class GvrDeviceProviderDelegate : public GvrDelegate {
+// A temporary delegate till a VrShell instance becomes available.
+class GvrNonPresentingDelegate : public GvrDelegate {
public:
- GvrDeviceProviderDelegate() {
- // TODO: This should eventually be handled by an actual GvrLayout instance
- // in the view tree.
+ GvrNonPresentingDelegate() { Initialize(); }
+
+ virtual ~GvrNonPresentingDelegate() { Shutdown(); }
+
+ void Initialize() {
if (j_device_.is_null()) {
JNIEnv* env = AttachCurrentThread();
@@ -37,25 +42,19 @@ class GvrDeviceProviderDelegate : public GvrDelegate {
gvr_api_ =
gvr::GvrApi::WrapNonOwned(reinterpret_cast<gvr_context*>(context));
-
- GvrDelegateManager::GetInstance()->Initialize(this);
}
}
- virtual ~GvrDeviceProviderDelegate() {
- // TODO: This should eventually be handled by an actual GvrLayout instance
- // in the view tree.
- GvrDelegateManager::GetInstance()->Shutdown();
+ 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 RequestWebVRPresent() override {}
- void ExitWebVRPresent() override {}
-
void SubmitWebVRFrame() override {}
void UpdateWebVRTextureBounds(int eye,
float left,
@@ -70,12 +69,12 @@ class GvrDeviceProviderDelegate : public GvrDelegate {
std::unique_ptr<gvr::GvrApi> gvr_api_;
};
-GvrDeviceProvider::GvrDeviceProvider() : VRDeviceProvider() {
- GvrDelegateManager::GetInstance()->AddClient(this);
-}
+GvrDeviceProvider::GvrDeviceProvider()
+ : VRDeviceProvider(),
+ main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
GvrDeviceProvider::~GvrDeviceProvider() {
- GvrDelegateManager::GetInstance()->RemoveClient(this);
+ ExitPresent();
}
void GvrDeviceProvider::GetDevices(std::vector<VRDevice*>* devices) {
@@ -91,20 +90,59 @@ void GvrDeviceProvider::SetClient(VRClientDispatcher* client) {
}
void GvrDeviceProvider::Initialize() {
- if (!delegate_)
- delegate_.reset(new GvrDeviceProviderDelegate());
+ if (!non_presenting_delegate_) {
+ non_presenting_delegate_.reset(new GvrNonPresentingDelegate());
+ if (non_presenting_delegate_->gvr_api()) {
+ vr_device_.reset(new GvrDevice(this, non_presenting_delegate_.get()));
+ client_->OnDeviceConnectionStatusChanged(vr_device_.get(), true);
+ }
+ }
+}
+
+bool GvrDeviceProvider::RequestPresent() {
+ GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance();
+ if (!delegate_provider)
+ return false;
+
+ return delegate_provider->RequestWebVRPresent(this);
}
-void GvrDeviceProvider::OnDelegateInitialized(GvrDelegate* delegate) {
+void GvrDeviceProvider::ExitPresent() {
+ DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
+
+ if (!vr_device_)
+ return;
+
+ vr_device_->SetDelegate(non_presenting_delegate_.get());
+
+ GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance();
+ if (delegate_provider)
+ delegate_provider->ExitWebVRPresent();
+
+ if (client_)
+ client_->OnPresentEnded(vr_device_.get());
+}
+
+void GvrDeviceProvider::OnGvrDelegateReady(GvrDelegate* delegate) {
+ main_thread_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&GvrDeviceProvider::GvrDelegateReady, base::Unretained(this),
+ base::Unretained(delegate)));
+}
+
+void GvrDeviceProvider::OnGvrDelegateRemoved() {
if (!vr_device_)
- vr_device_.reset(new GvrDevice(this, delegate));
+ return;
- client_->OnDeviceConnectionStatusChanged(vr_device_.get(), true);
+ main_thread_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&GvrDeviceProvider::ExitPresent, base::Unretained(this)));
}
-void GvrDeviceProvider::OnDelegateShutdown() {
- if (client_ && vr_device_)
- client_->OnDeviceConnectionStatusChanged(vr_device_.get(), false);
+void GvrDeviceProvider::GvrDelegateReady(GvrDelegate* delegate) {
+ DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
+
+ vr_device_->SetDelegate(delegate);
}
} // namespace device
« no previous file with comments | « device/vr/android/gvr/gvr_device_provider.h ('k') | device/vr/android/java/src/org/chromium/device/vr/GvrDeviceProvider.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698