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 6440fd0179783da1ff76b152e8fa2d3cbc34081c..d85aae044939621e09753d2acc51e60e27948add 100644 |
--- a/chrome/browser/android/vr_shell/vr_shell_delegate.cc |
+++ b/chrome/browser/android/vr_shell/vr_shell_delegate.cc |
@@ -9,6 +9,7 @@ |
#include "base/android/jni_android.h" |
#include "base/callback_helpers.h" |
#include "chrome/browser/android/vr_shell/non_presenting_gvr_delegate.h" |
+#include "chrome/browser/android/vr_shell/vr_usage_monitor.h" |
#include "device/vr/android/gvr/gvr_delegate.h" |
#include "device/vr/android/gvr/gvr_device.h" |
#include "device/vr/android/gvr/gvr_device_provider.h" |
@@ -16,6 +17,9 @@ |
using base::android::JavaParamRef; |
using base::android::AttachCurrentThread; |
+using base::android::ScopedJavaLocalRef; |
+ |
+static constexpr int kVrOutOfDate = 2; |
ddorwin
2017/05/16 00:15:51
Is this a constant defined in Java? If so, we shou
tiborg
2017/05/23 15:47:24
It's gone in favor of the native VrCoreCompatibili
|
namespace vr_shell { |
@@ -38,8 +42,7 @@ VrShellDelegate::~VrShellDelegate() { |
device::GvrDelegateProvider* VrShellDelegate::CreateVrShellDelegate() { |
JNIEnv* env = AttachCurrentThread(); |
- base::android::ScopedJavaLocalRef<jobject> jdelegate = |
- Java_VrShellDelegate_getInstance(env); |
+ ScopedJavaLocalRef<jobject> jdelegate = Java_VrShellDelegate_getInstance(env); |
if (!jdelegate.is_null()) |
return GetNativeVrShellDelegate(env, jdelegate.obj()); |
return nullptr; |
@@ -56,9 +59,9 @@ void VrShellDelegate::SetPresentingDelegate( |
gvr_context* context) { |
presenting_delegate_ = delegate; |
// Clean up the non-presenting delegate. |
+ JNIEnv* env = AttachCurrentThread(); |
if (presenting_delegate_ && non_presenting_delegate_) { |
non_presenting_delegate_ = nullptr; |
- JNIEnv* env = AttachCurrentThread(); |
Java_VrShellDelegate_shutdownNonPresentingNativeContext( |
env, j_vr_shell_delegate_.obj()); |
} |
@@ -74,6 +77,10 @@ void VrShellDelegate::SetPresentingDelegate( |
base::ResetAndReturn(&present_callback_).Run(true); |
pending_successful_present_request_ = false; |
} |
+ |
+ auto gvr_version = GetGvrVersion(env); |
+ VrMetricsUtil::LogGvrVersionForVrViewerType(context, gvr_version.first, |
+ gvr_version.second); |
} |
void VrShellDelegate::RemoveDelegate() { |
@@ -197,6 +204,37 @@ void VrShellDelegate::ExitWebVRPresent() { |
} |
} |
+std::pair<GvrVersionStatus, gvr_version> VrShellDelegate::GetGvrVersion( |
+ JNIEnv* env) { |
+ ScopedJavaLocalRef<jobject> j_vr_core_info = |
+ Java_VrShellDelegate_getVrCoreInfo(env, j_vr_shell_delegate_.obj()); |
+ jclass j_vr_core_info_class = env->GetObjectClass(j_vr_core_info.obj()); |
+ jfieldID j_field_id = env->GetFieldID(j_vr_core_info_class, "version", |
+ "Lcom/google/vr/ndk/base/Version;"); |
+ jobject j_version_object = |
+ env->GetObjectField(j_vr_core_info.obj(), j_field_id); |
+ gvr_version version; |
+ if (j_version_object) { |
+ j_vr_core_info_class = env->GetObjectClass(j_version_object); |
+ j_field_id = env->GetFieldID(j_vr_core_info_class, "majorVersion", "I"); |
mthiesse
2017/05/16 01:15:12
The canonical way of doing what you're doing here
tiborg
2017/05/23 15:47:24
That tip is golden. Made it much better!
|
+ version.major = env->GetIntField(j_version_object, j_field_id); |
+ j_field_id = env->GetFieldID(j_vr_core_info_class, "minorVersion", "I"); |
+ version.minor = env->GetIntField(j_version_object, j_field_id); |
+ j_field_id = env->GetFieldID(j_vr_core_info_class, "patchVersion", "I"); |
+ version.patch = env->GetIntField(j_version_object, j_field_id); |
+ return std::make_pair(GvrVersionStatus::PRECISE, version); |
+ } else { |
+ j_field_id = env->GetFieldID(j_vr_core_info_class, "compatibility", "I"); |
+ jint compatibility = env->GetIntField(j_vr_core_info.obj(), j_field_id); |
+ |
+ if (compatibility == kVrOutOfDate) { |
+ return std::make_pair(GvrVersionStatus::OLDER, version); |
+ } else { |
+ return std::make_pair(GvrVersionStatus::UNKNOWN, version); |
ddorwin
2017/05/16 00:15:51
It seems that VR_NOT_AVAILABLE would be important
tiborg
2017/05/23 15:47:25
Done. All of them are handled.
|
+ } |
+ } |
+} |
+ |
void VrShellDelegate::CreateNonPresentingDelegate() { |
JNIEnv* env = AttachCurrentThread(); |
gvr_context* context = reinterpret_cast<gvr_context*>( |
@@ -206,6 +244,9 @@ void VrShellDelegate::CreateNonPresentingDelegate() { |
base::MakeUnique<NonPresentingGvrDelegate>(context); |
non_presenting_delegate_->UpdateVSyncInterval(timebase_nanos_, |
interval_seconds_); |
+ auto gvr_version = GetGvrVersion(env); |
+ VrMetricsUtil::LogGvrVersionForVrViewerType(context, gvr_version.first, |
+ gvr_version.second); |
} |
void VrShellDelegate::OnActivateDisplayHandled(bool present_requested) { |