Index: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java |
index eac70822d6790b1b1c9f81bda5a1c20f47759377..a1fa7920a9c971dc9e1c28c196593320e87f790b 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java |
@@ -11,6 +11,7 @@ import android.content.Context; |
import android.content.Intent; |
import android.content.pm.ActivityInfo; |
import android.content.res.Configuration; |
+import android.net.Uri; |
import android.os.Build; |
import android.os.Handler; |
import android.os.StrictMode; |
@@ -26,13 +27,18 @@ import android.view.WindowManager; |
import android.widget.FrameLayout; |
import org.chromium.base.Log; |
+import org.chromium.base.PackageUtils; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
import org.chromium.base.library_loader.LibraryLoader; |
+ |
+import org.chromium.chrome.R; |
import org.chromium.chrome.browser.ChromeActivity; |
import org.chromium.chrome.browser.ChromeFeatureList; |
import org.chromium.chrome.browser.ChromeTabbedActivity; |
+import org.chromium.chrome.browser.infobar.InfoBarIdentifier; |
+import org.chromium.chrome.browser.infobar.SimpleConfirmInfoBarBuilder; |
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; |
import org.chromium.chrome.browser.tab.Tab; |
import org.chromium.chrome.browser.tabmodel.TabModel; |
@@ -79,6 +85,9 @@ public class VrShellDelegate { |
private static final String VR_ACTIVITY_ALIAS = |
"org.chromium.chrome.browser.VRChromeTabbedActivity"; |
+ private static final String VR_CORE_PACKAGE_ID = "com.google.vr.vrcore"; |
+ private static final int VR_CORE_MIN_VERSION = 160723800; |
+ |
private static final long REENTER_VR_TIMEOUT_MS = 1000; |
private final ChromeTabbedActivity mActivity; |
@@ -107,7 +116,6 @@ public class VrShellDelegate { |
public VrShellDelegate(ChromeTabbedActivity activity) { |
mActivity = activity; |
mVrClassesWrapper = createVrClassesWrapper(); |
- updateVrSupportLevel(); |
} |
/** |
@@ -129,19 +137,15 @@ public class VrShellDelegate { |
// Check cardboard support for non-daydream devices. |
if (!mVrDaydreamApi.isDaydreamReadyDevice()) { |
- // Native libraries may not be ready in which case skip for now and check later. |
- if (LibraryLoader.isInitialized()) { |
- // Supported Build version is determined by the webvr cardboard support feature. |
- // Default is KITKAT unless specified via server side finch config. |
- if (Build.VERSION.SDK_INT |
- < ChromeFeatureList.getFieldTrialParamByFeatureAsInt( |
- ChromeFeatureList.WEBVR_CARDBOARD_SUPPORT, |
- MIN_SDK_VERSION_PARAM_NAME, |
- Build.VERSION_CODES.KITKAT)) { |
- mVrSupportLevel = VR_NOT_AVAILABLE; |
- mEnterVRIntent = null; |
- return; |
- } |
+ // Supported Build version is determined by the webvr cardboard support feature. |
+ // Default is KITKAT unless specified via server side finch config. |
+ if (Build.VERSION.SDK_INT < ChromeFeatureList.getFieldTrialParamByFeatureAsInt( |
+ ChromeFeatureList.WEBVR_CARDBOARD_SUPPORT, |
+ MIN_SDK_VERSION_PARAM_NAME, |
+ Build.VERSION_CODES.KITKAT)) { |
+ mVrSupportLevel = VR_NOT_AVAILABLE; |
+ mEnterVRIntent = null; |
+ return; |
} |
} |
@@ -152,12 +156,53 @@ public class VrShellDelegate { |
mVrSupportLevel = mVrDaydreamApi.isDaydreamReadyDevice() ? VR_DAYDREAM : VR_CARDBOARD; |
} |
+ private boolean verifyOrUpdateVrServices(Tab tab) { |
+ if (!LibraryLoader.isInitialized()) { |
+ return false; |
+ } |
+ int vrCoreVersion = PackageUtils.getPackageVersion(mActivity, VR_CORE_PACKAGE_ID); |
+ if (vrCoreVersion < VR_CORE_MIN_VERSION) { |
+ // Assume upgrade as most common case. |
+ String infobarText = |
+ mActivity.getString(R.string.vr_services_check_infobar_update_text); |
+ String buttonText = |
+ mActivity.getString(R.string.vr_services_check_infobar_update_button); |
+ if (vrCoreVersion == -1) { |
+ // VrCore not installed, make sure it's supported before showing the user a prompt. |
+ if (Build.VERSION.SDK_INT < ChromeFeatureList.getFieldTrialParamByFeatureAsInt( |
+ ChromeFeatureList.WEBVR_CARDBOARD_SUPPORT, |
+ MIN_SDK_VERSION_PARAM_NAME, |
+ Build.VERSION_CODES.KITKAT)) { |
+ return false; |
+ } |
+ // Supported, but not installed. Ask user to install instead of upgrade. |
+ infobarText = mActivity.getString(R.string.vr_services_check_infobar_install_text); |
+ buttonText = mActivity.getString(R.string.vr_services_check_infobar_install_button); |
+ } |
+ SimpleConfirmInfoBarBuilder.create(tab, |
+ new SimpleConfirmInfoBarBuilder.Listener() { |
+ @Override |
+ public void onInfoBarDismissed() {} |
+ |
+ @Override |
+ public boolean onInfoBarButtonClicked(boolean isPrimary) { |
+ mActivity.startActivity(new Intent(Intent.ACTION_VIEW, |
+ Uri.parse("market://details?id=" + VR_CORE_PACKAGE_ID))); |
+ return false; |
+ } |
+ }, |
+ InfoBarIdentifier.VR_SERVICES_UPGRADE_ANDROID, R.drawable.vr_services, |
+ infobarText, buttonText, null, true); |
+ return false; |
+ } |
+ return true; |
+ } |
+ |
/** |
* Should be called once the native library is loaded so that the native portion of this class |
* can be initialized. |
*/ |
public void onNativeLibraryReady() { |
- // Libraries may not have been loaded when we first set the support level, so check again. |
updateVrSupportLevel(); |
if (mVrSupportLevel == VR_NOT_AVAILABLE) return; |
mNativeVrShellDelegate = nativeInit(); |
@@ -336,6 +381,8 @@ public class VrShellDelegate { |
*/ |
@EnterVRResult |
public int enterVRIfNecessary() { |
+ // TODO(amp): Move the UpdateVrService check to where it can check after a WebVR API call. |
+ if (!verifyOrUpdateVrServices(mActivity.getActivityTab())) return ENTER_VR_CANCELLED; |
if (mVrSupportLevel == VR_NOT_AVAILABLE) return ENTER_VR_CANCELLED; |
if (mInVr) return ENTER_VR_NOT_NECESSARY; |
if (!canEnterVR(mActivity.getActivityTab())) return ENTER_VR_CANCELLED; |