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

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java

Issue 2701523008: Intercept WebVR api calls and check for VrCore compatibility. (Closed)
Patch Set: rebase on latest patch Created 3 years, 9 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
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrCoreVersionCheckerImpl.java ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 package org.chromium.chrome.browser.vr_shell; 5 package org.chromium.chrome.browser.vr_shell;
6 6
7 import android.app.Activity; 7 import android.app.Activity;
8 import android.app.PendingIntent; 8 import android.app.PendingIntent;
9 import android.content.ComponentName; 9 import android.content.ComponentName;
10 import android.content.Context; 10 import android.content.Context;
11 import android.content.Intent; 11 import android.content.Intent;
12 import android.content.pm.ActivityInfo; 12 import android.content.pm.ActivityInfo;
13 import android.content.res.Configuration; 13 import android.content.res.Configuration;
14 import android.net.Uri; 14 import android.net.Uri;
15 import android.os.Build;
16 import android.os.Handler; 15 import android.os.Handler;
17 import android.os.StrictMode; 16 import android.os.StrictMode;
18 import android.os.SystemClock; 17 import android.os.SystemClock;
19 import android.support.annotation.IntDef; 18 import android.support.annotation.IntDef;
20 import android.view.Choreographer; 19 import android.view.Choreographer;
21 import android.view.Choreographer.FrameCallback; 20 import android.view.Choreographer.FrameCallback;
22 import android.view.Display; 21 import android.view.Display;
23 import android.view.View; 22 import android.view.View;
24 import android.view.ViewGroup; 23 import android.view.ViewGroup;
25 import android.view.ViewGroup.LayoutParams; 24 import android.view.ViewGroup.LayoutParams;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 74
76 @Retention(RetentionPolicy.SOURCE) 75 @Retention(RetentionPolicy.SOURCE)
77 @IntDef({VR_NOT_AVAILABLE, VR_CARDBOARD, VR_DAYDREAM}) 76 @IntDef({VR_NOT_AVAILABLE, VR_CARDBOARD, VR_DAYDREAM})
78 public @interface VrSupportLevel {} 77 public @interface VrSupportLevel {}
79 78
80 // TODO(bshe): These should be replaced by string provided by NDK. Currently , it only available 79 // TODO(bshe): These should be replaced by string provided by NDK. Currently , it only available
81 // in SDK and we don't want add dependency to SDK just to get these strings. 80 // in SDK and we don't want add dependency to SDK just to get these strings.
82 private static final String DAYDREAM_CATEGORY = "com.google.intent.category. DAYDREAM"; 81 private static final String DAYDREAM_CATEGORY = "com.google.intent.category. DAYDREAM";
83 private static final String CARDBOARD_CATEGORY = "com.google.intent.category .CARDBOARD"; 82 private static final String CARDBOARD_CATEGORY = "com.google.intent.category .CARDBOARD";
84 83
85 private static final String MIN_SDK_VERSION_PARAM_NAME = "min_sdk_version";
86
87 private static final String VR_ACTIVITY_ALIAS = 84 private static final String VR_ACTIVITY_ALIAS =
88 "org.chromium.chrome.browser.VRChromeTabbedActivity"; 85 "org.chromium.chrome.browser.VRChromeTabbedActivity";
89 86
90 private static final String VR_CORE_PACKAGE_ID = "com.google.vr.vrcore"; 87 private static final String VR_CORE_PACKAGE_ID = "com.google.vr.vrcore";
91 88
92 private static final long REENTER_VR_TIMEOUT_MS = 1000; 89 private static final long REENTER_VR_TIMEOUT_MS = 1000;
93 90
94 private static VrShellDelegate sInstance; 91 private static VrShellDelegate sInstance;
95 92
96 private final ChromeActivity mActivity; 93 private final ChromeActivity mActivity;
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 219
223 public static int getVrSupportLevel(VrDaydreamApi daydreamApi, 220 public static int getVrSupportLevel(VrDaydreamApi daydreamApi,
224 VrCoreVersionChecker versionChecker, Tab tabToShowInfobarIn) { 221 VrCoreVersionChecker versionChecker, Tab tabToShowInfobarIn) {
225 if (versionChecker == null || daydreamApi == null 222 if (versionChecker == null || daydreamApi == null
226 || !isVrCoreCompatible(versionChecker, tabToShowInfobarIn)) { 223 || !isVrCoreCompatible(versionChecker, tabToShowInfobarIn)) {
227 return VR_NOT_AVAILABLE; 224 return VR_NOT_AVAILABLE;
228 } 225 }
229 226
230 if (daydreamApi.isDaydreamReadyDevice()) return VR_DAYDREAM; 227 if (daydreamApi.isDaydreamReadyDevice()) return VR_DAYDREAM;
231 228
232 // Check cardboard support for non-daydream devices. Supported Build ver sion is determined
233 // by the webvr cardboard support feature. Default is KITKAT unless spec ified via server
234 // side finch config.
235 if (Build.VERSION.SDK_INT < ChromeFeatureList.getFieldTrialParamByFeatur eAsInt(
236 ChromeFeatureList.WEBVR_CARDBOARD_SU PPORT,
237 MIN_SDK_VERSION_PARAM_NAME,
238 Build.VERSION_CODES.KITKAT)) {
239 return VR_NOT_AVAILABLE;
240 }
241
242 return VR_CARDBOARD; 229 return VR_CARDBOARD;
243 } 230 }
244 231
245 @CalledByNative 232 @CalledByNative
246 private static VrShellDelegate getInstance() { 233 private static VrShellDelegate getInstance() {
247 Activity activity = ApplicationStatus.getLastTrackedFocusedActivity(); 234 Activity activity = ApplicationStatus.getLastTrackedFocusedActivity();
248 if (sInstance != null && activity instanceof ChromeTabbedActivity) retur n sInstance; 235 if (sInstance != null && activity instanceof ChromeTabbedActivity) retur n sInstance;
249 if (!LibraryLoader.isInitialized()) return null; 236 if (!LibraryLoader.isInitialized()) return null;
250 // Note that we only support ChromeTabbedActivity for now. 237 // Note that we only support ChromeTabbedActivity for now.
251 if (activity == null || !(activity instanceof ChromeTabbedActivity)) ret urn null; 238 if (activity == null || !(activity instanceof ChromeTabbedActivity)) ret urn null;
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 private void onExitVRResult(boolean success) { 604 private void onExitVRResult(boolean success) {
618 assert mVrSupportLevel != VR_NOT_AVAILABLE; 605 assert mVrSupportLevel != VR_NOT_AVAILABLE;
619 // For now, we don't handle re-entering VR when exit fails, so keep tryi ng to exit. 606 // For now, we don't handle re-entering VR when exit fails, so keep tryi ng to exit.
620 if (!success && sInstance.mVrDaydreamApi.exitFromVr(EXIT_VR_RESULT, new Intent())) return; 607 if (!success && sInstance.mVrDaydreamApi.exitFromVr(EXIT_VR_RESULT, new Intent())) return;
621 sInstance.mVrClassesWrapper.setVrModeEnabled(sInstance.mActivity, false) ; 608 sInstance.mVrClassesWrapper.setVrModeEnabled(sInstance.mActivity, false) ;
622 } 609 }
623 610
624 @CalledByNative 611 @CalledByNative
625 private long createNonPresentingNativeContext() { 612 private long createNonPresentingNativeContext() {
626 if (mVrClassesWrapper == null) return 0; 613 if (mVrClassesWrapper == null) return 0;
614 // Update VR support level as it can change at runtime
615 updateVrSupportLevel();
616 if (mVrSupportLevel == VR_NOT_AVAILABLE) return 0;
627 mNonPresentingGvrContext = mVrClassesWrapper.createNonPresentingGvrConte xt(mActivity); 617 mNonPresentingGvrContext = mVrClassesWrapper.createNonPresentingGvrConte xt(mActivity);
628 if (mNonPresentingGvrContext == null) return 0; 618 if (mNonPresentingGvrContext == null) return 0;
629 return mNonPresentingGvrContext.getNativeGvrContext(); 619 return mNonPresentingGvrContext.getNativeGvrContext();
630 } 620 }
631 621
632 @CalledByNative 622 @CalledByNative
633 private void shutdownNonPresentingNativeContext() { 623 private void shutdownNonPresentingNativeContext() {
634 if (mNonPresentingGvrContext == null) return; 624 if (mNonPresentingGvrContext == null) return;
635 mNonPresentingGvrContext.shutdown(); 625 mNonPresentingGvrContext.shutdown();
636 mNonPresentingGvrContext = null; 626 mNonPresentingGvrContext = null;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 mRestoreOrientation = null; 659 mRestoreOrientation = null;
670 mVrShell.pause(); 660 mVrShell.pause();
671 removeVrViews(); 661 removeVrViews();
672 clearVrModeWindowFlags(); 662 clearVrModeWindowFlags();
673 destroyVrShell(); 663 destroyVrShell();
674 mActivity.getFullscreenManager().setPositionsForTabToNonFullscreen(); 664 mActivity.getFullscreenManager().setPositionsForTabToNonFullscreen();
675 } 665 }
676 666
677 private static boolean isVrCoreCompatible( 667 private static boolean isVrCoreCompatible(
678 VrCoreVersionChecker versionChecker, Tab tabToShowInfobarIn) { 668 VrCoreVersionChecker versionChecker, Tab tabToShowInfobarIn) {
679 return verifyOrUpdateVrServices( 669 int vrCoreCompatibility = versionChecker.getVrCoreCompatibility();
680 versionChecker.getVrCoreCompatibility(), tabToShowInfobarIn); 670
671 if (vrCoreCompatibility == VrCoreVersionChecker.VR_NOT_AVAILABLE
672 || vrCoreCompatibility == VrCoreVersionChecker.VR_OUT_OF_DATE) {
673 promptToUpdateVrServices(vrCoreCompatibility, tabToShowInfobarIn);
674 }
675
676 return vrCoreCompatibility == VrCoreVersionChecker.VR_READY;
681 } 677 }
682 678
683 private static boolean verifyOrUpdateVrServices(int vrCoreCompatibility, Tab tab) { 679 private static void promptToUpdateVrServices(int vrCoreCompatibility, Tab ta b) {
684 if (vrCoreCompatibility == VrCoreVersionChecker.VR_READY) {
685 return true;
686 }
687 if (tab == null) { 680 if (tab == null) {
688 return false; 681 return;
689 }
690 // Make sure OS is supported before showing the user a prompt.
691 if (Build.VERSION.SDK_INT < ChromeFeatureList.getFieldTrialParamByFeatur eAsInt(
692 ChromeFeatureList.WEBVR_CARDBOARD_SU PPORT,
693 MIN_SDK_VERSION_PARAM_NAME,
694 Build.VERSION_CODES.KITKAT)) {
695 return false;
696 } 682 }
697 final Activity activity = tab.getActivity(); 683 final Activity activity = tab.getActivity();
698 String infobarText; 684 String infobarText;
699 String buttonText; 685 String buttonText;
700 if (vrCoreCompatibility == VrCoreVersionChecker.VR_NOT_AVAILABLE) { 686 if (vrCoreCompatibility == VrCoreVersionChecker.VR_NOT_AVAILABLE) {
701 // Supported, but not installed. Ask user to install instead of upgr ade. 687 // Supported, but not installed. Ask user to install instead of upgr ade.
702 infobarText = activity.getString(R.string.vr_services_check_infobar_ install_text); 688 infobarText = activity.getString(R.string.vr_services_check_infobar_ install_text);
703 buttonText = activity.getString(R.string.vr_services_check_infobar_i nstall_button); 689 buttonText = activity.getString(R.string.vr_services_check_infobar_i nstall_button);
704 } else if (vrCoreCompatibility == VrCoreVersionChecker.VR_OUT_OF_DATE) { 690 } else if (vrCoreCompatibility == VrCoreVersionChecker.VR_OUT_OF_DATE) {
705 infobarText = activity.getString(R.string.vr_services_check_infobar_ update_text); 691 infobarText = activity.getString(R.string.vr_services_check_infobar_ update_text);
706 buttonText = activity.getString(R.string.vr_services_check_infobar_u pdate_button); 692 buttonText = activity.getString(R.string.vr_services_check_infobar_u pdate_button);
707 } else { 693 } else {
708 Log.e(TAG, "Unknown VrCore compatibility: " + vrCoreCompatibility); 694 Log.e(TAG, "Unknown VrCore compatibility: " + vrCoreCompatibility);
709 return false; 695 return;
710 } 696 }
711 697
712 SimpleConfirmInfoBarBuilder.create(tab, 698 SimpleConfirmInfoBarBuilder.create(tab,
713 new SimpleConfirmInfoBarBuilder.Listener() { 699 new SimpleConfirmInfoBarBuilder.Listener() {
714 @Override 700 @Override
715 public void onInfoBarDismissed() {} 701 public void onInfoBarDismissed() {}
716 702
717 @Override 703 @Override
718 public boolean onInfoBarButtonClicked(boolean isPrimary) { 704 public boolean onInfoBarButtonClicked(boolean isPrimary) {
719 activity.startActivity(new Intent(Intent.ACTION_VIEW, 705 activity.startActivity(new Intent(Intent.ACTION_VIEW,
720 Uri.parse("market://details?id=" + VR_CORE_PACKA GE_ID))); 706 Uri.parse("market://details?id=" + VR_CORE_PACKA GE_ID)));
721 return false; 707 return false;
722 } 708 }
723 }, 709 },
724 InfoBarIdentifier.VR_SERVICES_UPGRADE_ANDROID, R.drawable.vr_ser vices, infobarText, 710 InfoBarIdentifier.VR_SERVICES_UPGRADE_ANDROID, R.drawable.vr_ser vices, infobarText,
725 buttonText, null, true); 711 buttonText, null, true);
726 return false;
727 } 712 }
728 713
729 private boolean createVrShell() { 714 private boolean createVrShell() {
730 if (mVrClassesWrapper == null) return false; 715 if (mVrClassesWrapper == null) return false;
731 mTabModelSelector = mActivity.getCompositorViewHolder().detachForVR(); 716 mTabModelSelector = mActivity.getCompositorViewHolder().detachForVR();
732 if (mTabModelSelector == null) return false; 717 if (mTabModelSelector == null) return false;
733 mVrShell = mVrClassesWrapper.createVrShell(mActivity, this, mTabModelSel ector); 718 mVrShell = mVrClassesWrapper.createVrShell(mActivity, this, mTabModelSel ector);
734 return mVrShell != null; 719 return mVrShell != null;
735 } 720 }
736 721
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 private native long nativeInit(); 810 private native long nativeInit();
826 private static native void nativeOnLibraryAvailable(); 811 private static native void nativeOnLibraryAvailable();
827 private native void nativeSetPresentResult(long nativeVrShellDelegate, boole an result); 812 private native void nativeSetPresentResult(long nativeVrShellDelegate, boole an result);
828 private native void nativeDisplayActivate(long nativeVrShellDelegate); 813 private native void nativeDisplayActivate(long nativeVrShellDelegate);
829 private native void nativeUpdateVSyncInterval(long nativeVrShellDelegate, lo ng timebaseNanos, 814 private native void nativeUpdateVSyncInterval(long nativeVrShellDelegate, lo ng timebaseNanos,
830 double intervalSeconds); 815 double intervalSeconds);
831 private native void nativeOnPause(long nativeVrShellDelegate); 816 private native void nativeOnPause(long nativeVrShellDelegate);
832 private native void nativeOnResume(long nativeVrShellDelegate); 817 private native void nativeOnResume(long nativeVrShellDelegate);
833 private native void nativeDestroy(long nativeVrShellDelegate); 818 private native void nativeDestroy(long nativeVrShellDelegate);
834 } 819 }
OLDNEW
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrCoreVersionCheckerImpl.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698