From 2f0c81db49698c71361b6a9085f8dbe1e1952ba0 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Wed, 8 Apr 2020 17:26:39 +0200 Subject: [PATCH] Implement WebXR Interstitial --- app/CMakeLists.txt | 1 - .../mozilla/vrbrowser/VRBrowserActivity.java | 50 ++- .../ui/widgets/NavigationBarWidget.java | 1 - .../vrbrowser/ui/widgets/TitleBarWidget.java | 1 - .../vrbrowser/ui/widgets/TopBarWidget.java | 1 - .../vrbrowser/ui/widgets/TrayWidget.java | 1 - .../widgets/WebXRInterstitialController.java | 69 ++++ .../ui/widgets/WebXRInterstitialWidget.java | 133 ++++++++ .../ui/widgets/WidgetManagerDelegate.java | 8 + .../vrbrowser/ui/widgets/WidgetPlacement.java | 11 +- .../ui/widgets/menus/LibraryMenuWidget.java | 1 - .../mozilla/vrbrowser/utils/DeviceType.java | 39 ++- app/src/main/cpp/BrowserWorld.cpp | 67 ++-- app/src/main/cpp/BrowserWorld.h | 5 +- app/src/main/cpp/ExternalVR.cpp | 4 +- app/src/main/cpp/LoadingAnimation.cpp | 87 ----- app/src/main/cpp/LoadingAnimation.h | 40 --- app/src/main/cpp/VRBrowser.cpp | 32 +- app/src/main/cpp/VRBrowser.h | 4 +- app/src/main/cpp/WidgetPlacement.cpp | 14 +- app/src/main/cpp/WidgetPlacement.h | 9 +- .../drawable/ic_webxr_controller_arrow.xml | 12 + app/src/main/res/drawable/webxr_spinner.xml | 319 ++++++++++++++++++ .../main/res/layout/webxr_interstitial.xml | 23 ++ app/src/main/res/values/dimen.xml | 8 + app/src/main/res/values/strings.xml | 4 + .../layout/webxr_interstitial_controller.xml | 22 ++ .../oculusvr/res/drawable/controller_go.png | Bin 0 -> 22364 bytes .../res/drawable/controller_quest_left.png | Bin 0 -> 29969 bytes .../layout/webxr_interstitial_controller.xml | 112 ++++++ .../mozilla/vrbrowser/PlatformActivity.java | 2 + app/src/picovr/res/drawable/controller_g2.png | Bin 0 -> 31030 bytes .../res/drawable/controller_neo2_left.png | Bin 0 -> 11701 bytes .../res/drawable/controller_neo2_right.png | Bin 0 -> 15108 bytes .../layout/webxr_interstitial_controller.xml | 145 ++++++++ .../mozilla/vrbrowser/PlatformActivity.java | 2 + .../res/drawable/controller_focus_left.png | Bin 0 -> 18013 bytes .../res/drawable/controller_focus_right.png | Bin 0 -> 17803 bytes .../layout/webxr_interstitial_controller.xml | 105 ++++++ 39 files changed, 1134 insertions(+), 198 deletions(-) create mode 100644 app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WebXRInterstitialController.java create mode 100644 app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WebXRInterstitialWidget.java delete mode 100644 app/src/main/cpp/LoadingAnimation.cpp delete mode 100644 app/src/main/cpp/LoadingAnimation.h create mode 100644 app/src/main/res/drawable/ic_webxr_controller_arrow.xml create mode 100644 app/src/main/res/drawable/webxr_spinner.xml create mode 100644 app/src/main/res/layout/webxr_interstitial.xml create mode 100644 app/src/noapi/res/layout/webxr_interstitial_controller.xml create mode 100644 app/src/oculusvr/res/drawable/controller_go.png create mode 100644 app/src/oculusvr/res/drawable/controller_quest_left.png create mode 100644 app/src/oculusvr/res/layout/webxr_interstitial_controller.xml create mode 100644 app/src/picovr/res/drawable/controller_g2.png create mode 100644 app/src/picovr/res/drawable/controller_neo2_left.png create mode 100644 app/src/picovr/res/drawable/controller_neo2_right.png create mode 100644 app/src/picovr/res/layout/webxr_interstitial_controller.xml create mode 100644 app/src/wavevr/res/drawable/controller_focus_left.png create mode 100644 app/src/wavevr/res/drawable/controller_focus_right.png create mode 100644 app/src/wavevr/res/layout/webxr_interstitial_controller.xml diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 8d664b2c2b..2c4035fcb7 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -31,7 +31,6 @@ add_library( # Sets the name of the library. src/main/cpp/ExternalVR.cpp src/main/cpp/GeckoSurfaceTexture.cpp src/main/cpp/GestureDelegate.cpp - src/main/cpp/LoadingAnimation.cpp src/main/cpp/JNIUtil.cpp src/main/cpp/Pointer.cpp src/main/cpp/Skybox.cpp diff --git a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java index a7fd6b3a0d..2333a3b946 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java @@ -66,6 +66,7 @@ import org.mozilla.vrbrowser.ui.widgets.TrayWidget; import org.mozilla.vrbrowser.ui.widgets.UISurfaceTextureRenderer; import org.mozilla.vrbrowser.ui.widgets.UIWidget; +import org.mozilla.vrbrowser.ui.widgets.WebXRInterstitialWidget; import org.mozilla.vrbrowser.ui.widgets.Widget; import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate; import org.mozilla.vrbrowser.ui.widgets.WidgetPlacement; @@ -166,11 +167,13 @@ public void run() { NavigationBarWidget mNavigationBar; CrashDialogWidget mCrashDialog; TrayWidget mTray; + WebXRInterstitialWidget mWebXRInterstitial; PermissionDelegate mPermissionDelegate; LinkedList mWidgetUpdateListeners; LinkedList mPermissionListeners; LinkedList mFocusChangeListeners; LinkedList mWorldClickListeners; + LinkedList mWebXRListeners; CopyOnWriteArrayList mConnectivityListeners; LinkedList mBackHandlers; private boolean mIsPresentingImmersive = false; @@ -260,6 +263,7 @@ protected void onCreate(Bundle savedInstanceState) { mPermissionListeners = new LinkedList<>(); mFocusChangeListeners = new LinkedList<>(); mWorldClickListeners = new LinkedList<>(); + mWebXRListeners = new LinkedList<>(); mBackHandlers = new LinkedList<>(); mBrightnessQueue = new LinkedList<>(); mConnectivityListeners = new CopyOnWriteArrayList<>(); @@ -323,6 +327,9 @@ protected void initializeWidgets() { // Create keyboard widget mKeyboard = new KeyboardWidget(this); + // Create the WebXR interstitial + mWebXRInterstitial = new WebXRInterstitialWidget(this); + // Windows mWindows = new Windows(this); mWindows.setDelegate(new Windows.Delegate() { @@ -366,7 +373,7 @@ public void onWindowVideoAvailabilityChanged(@NonNull WindowWidget aWindow) { attachToWindow(mWindows.getFocusedWindow(), null); - addWidgets(Arrays.asList(mRootWidget, mNavigationBar, mKeyboard, mTray)); + addWidgets(Arrays.asList(mRootWidget, mNavigationBar, mKeyboard, mTray, mWebXRInterstitial)); // Show the what's upp dialog if we haven't showed it yet and this is v6. if (!SettingsStore.getInstance(this).isWhatsNewDisplayed()) { @@ -956,15 +963,20 @@ public void run() { @Keep @SuppressWarnings("unused") - void pauseGeckoViewCompositor() { + void onEnterWebXR() { if (Thread.currentThread() == mUiThread) { return; } mIsPresentingImmersive = true; - runOnUiThread(() -> mWindows.enterImmersiveMode()); - + runOnUiThread(() -> { + mWindows.enterImmersiveMode(); + for (WebXRListener listener: mWebXRListeners) { + listener.onEnterWebXR(); + } + }); TelemetryWrapper.startImmersive(); GleanMetricsService.startImmersive(); + PauseCompositorRunnable runnable = new PauseCompositorRunnable(); synchronized (mCompositorLock) { @@ -981,12 +993,17 @@ void pauseGeckoViewCompositor() { @Keep @SuppressWarnings("unused") - void resumeGeckoViewCompositor() { + void onExitWebXR() { if (Thread.currentThread() == mUiThread) { return; } mIsPresentingImmersive = false; - runOnUiThread(() -> mWindows.exitImmersiveMode()); + runOnUiThread(() -> { + mWindows.exitImmersiveMode(); + for (WebXRListener listener: mWebXRListeners) { + listener.onExitWebXR(); + } + }); // Show the window in front of you when you exit immersive mode. resetUIYaw(); @@ -1071,8 +1088,9 @@ public int getPointerColor() { @Keep @SuppressWarnings("unused") private void setDeviceType(int aType) { - - runOnUiThread(() -> DeviceType.setType(aType)); + if (DeviceType.isOculusBuild()) { + runOnUiThread(() -> DeviceType.setType(aType)); + } } @Keep @@ -1366,6 +1384,21 @@ public void removeWorldClickListener(WorldClickListener aListener) { mWorldClickListeners.remove(aListener); } + @Override + public void addWebXRListener(WebXRListener aListener) { + mWebXRListeners.add(aListener); + } + + @Override + public void removeWebXRListener(WebXRListener aListener) { + mWebXRListeners.remove(aListener); + } + + @Override + public void setWebXRIntersitialForced(boolean aForced) { + queueRunnable(() -> setWebXRIntersitialForcedNative(aForced)); + } + @Override public void addConnectivityListener(Delegate aListener) { if (!mConnectivityListeners.contains(aListener)) { @@ -1598,5 +1631,6 @@ public void updateLocale(@NonNull Context context) { private native void runCallbackNative(long aCallback); private native void setCylinderDensityNative(float aDensity); private native void setCPULevelNative(@CPULevelFlags int aCPULevel); + private native void setWebXRIntersitialForcedNative(boolean aForced); private native void setIsServo(boolean aIsServo); } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java index 88d6d3da97..91fac07f77 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java @@ -447,7 +447,6 @@ protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { aPlacement.parentAnchorX = 0.5f; aPlacement.parentAnchorY = 0.0f; aPlacement.translationY = -35; - aPlacement.opaque = false; aPlacement.cylinder = true; } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java index a3ac10a6b9..ac2d3fac54 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java @@ -105,7 +105,6 @@ protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { aPlacement.parentAnchorX = 0.5f; aPlacement.parentAnchorY = 0.0f; aPlacement.translationY = -35; - aPlacement.opaque = false; aPlacement.cylinder = true; aPlacement.visible = true; } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TopBarWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TopBarWidget.java index 5695e8042c..729f273d24 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TopBarWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TopBarWidget.java @@ -70,7 +70,6 @@ protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { aPlacement.anchorY = 0.0f; aPlacement.parentAnchorX = 0.5f; aPlacement.parentAnchorY = 1.0f; - aPlacement.opaque = false; } private void updateUI() { diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TrayWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TrayWidget.java index d52893c205..9f8481812a 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TrayWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TrayWidget.java @@ -303,7 +303,6 @@ protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { aPlacement.parentAnchorY = 0.0f; aPlacement.rotationAxisX = 1.0f; aPlacement.rotation = (float)Math.toRadians(-45); - aPlacement.opaque = false; aPlacement.cylinder = false; aPlacement.textureScale = 1.0f; } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WebXRInterstitialController.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WebXRInterstitialController.java new file mode 100644 index 0000000000..ef0f47e7f1 --- /dev/null +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WebXRInterstitialController.java @@ -0,0 +1,69 @@ +package org.mozilla.vrbrowser.ui.widgets; + +import android.content.Context; +import android.view.LayoutInflater; + +import androidx.annotation.IntDef; +import androidx.databinding.DataBindingUtil; + +import org.mozilla.vrbrowser.R; +import org.mozilla.vrbrowser.VRBrowserActivity; +import org.mozilla.vrbrowser.databinding.WebxrInterstitialControllerBinding; +import org.mozilla.vrbrowser.utils.DeviceType; + +public class WebXRInterstitialController extends UIWidget { + private WebxrInterstitialControllerBinding mBinding; + + @IntDef(value = { HAND_NONE, HAND_LEFT, HAND_RIGHT }) + public @interface Hand {} + public static final int HAND_NONE = -1; + public static final int HAND_LEFT = 0; + public static final int HAND_RIGHT = 1; + + public WebXRInterstitialController(Context aContext, int aModel, @Hand int aHand ) { + super(aContext); + initialize(aModel, aHand); + } + + @Override + protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { + aPlacement.scene = WidgetPlacement.SCENE_WEBXR_INTERSTITIAL; + aPlacement.visible = false; + aPlacement.cylinder = false; + } + + private void updatePlacement() { + mWidgetPlacement.setSizeFromMeasure(getContext(), this); + if (mBinding.getHand() == HAND_LEFT) { + mWidgetPlacement.anchorX = 1.0f; + mWidgetPlacement.anchorY = 0.5f; + mWidgetPlacement.parentAnchorX = 0.0f; + mWidgetPlacement.parentAnchorY = 0.5f; + mWidgetPlacement.translationX = -WidgetPlacement.dpDimension(getContext(), R.dimen.webxr_interstitial_controller_margin_h); + } else if (mBinding.getHand() == HAND_RIGHT) { + mWidgetPlacement.anchorX = 0.0f; + mWidgetPlacement.anchorY = 0.5f; + mWidgetPlacement.parentAnchorX = 1.0f; + mWidgetPlacement.parentAnchorY = 0.5f; + mWidgetPlacement.translationX = WidgetPlacement.dpDimension(getContext(), R.dimen.webxr_interstitial_controller_margin_h); + } else { + mWidgetPlacement.anchorX = 0.5f; + mWidgetPlacement.anchorY = 1.0f; + mWidgetPlacement.parentAnchorX = 0.5f; + mWidgetPlacement.parentAnchorY = 0.0f; + mWidgetPlacement.translationY = 0;//-WidgetPlacement.dpDimension(getContext(), R.dimen.webxr_interstitial_controller_margin_v); + } + } + + private void initialize(int aModel, @Hand int aHand) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + mBinding = DataBindingUtil.inflate(inflater, R.layout.webxr_interstitial_controller, this, true); + mBinding.setLifecycleOwner((VRBrowserActivity)getContext()); + mBinding.setModel(aModel); + mBinding.setHand(aHand); + mBinding.executePendingBindings(); + updatePlacement(); + } + + +} diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WebXRInterstitialWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WebXRInterstitialWidget.java new file mode 100644 index 0000000000..3d4a2957cf --- /dev/null +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WebXRInterstitialWidget.java @@ -0,0 +1,133 @@ +package org.mozilla.vrbrowser.ui.widgets; + +import android.content.Context; +import android.graphics.drawable.AnimatedVectorDrawable; +import android.view.LayoutInflater; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; + +import androidx.databinding.DataBindingUtil; + +import org.mozilla.vrbrowser.R; +import org.mozilla.vrbrowser.VRBrowserActivity; +import org.mozilla.vrbrowser.databinding.WebxrInterstitialBinding; +import org.mozilla.vrbrowser.utils.DeviceType; + +import java.util.ArrayList; + +public class WebXRInterstitialWidget extends UIWidget implements WidgetManagerDelegate.WebXRListener { + private static final int INTERSTITIAL_FORCE_TIME = 3000; + private WebxrInterstitialBinding mBinding; + private ArrayList mControllers = new ArrayList<>(); + private boolean firstEnterXR = true; + private AnimatedVectorDrawable mSpinnerAnimation; + + public WebXRInterstitialWidget(Context aContext) { + super(aContext); + initialize(); + } + + @Override + protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { + Context context = getContext(); + aPlacement.scene = WidgetPlacement.SCENE_WEBXR_INTERSTITIAL; + aPlacement.width = WidgetPlacement.dpDimension(context, R.dimen.webxr_interstitial_width); + aPlacement.height = WidgetPlacement.dpDimension(context, R.dimen.webxr_interstitial_height); + aPlacement.worldWidth = WidgetPlacement.floatDimension(getContext(), R.dimen.window_world_width) * aPlacement.width / getWorldWidth(); + aPlacement.translationY = WidgetPlacement.unitFromMeters(context, R.dimen.webxr_interstitial_world_y); + aPlacement.translationZ = WidgetPlacement.unitFromMeters(getContext(), R.dimen.webxr_interstitial_world_z); + aPlacement.anchorX = 0.5f; + aPlacement.anchorY = 0.5f; + aPlacement.cylinder = false; + aPlacement.visible = false; + } + + private void initialize() { + // AnimatedVectorDrawable doesn't work with a Hardware Accelerated canvas, we disable it for this view. + setIsHardwareAccelerationEnabled(false); + LayoutInflater inflater = LayoutInflater.from(getContext()); + mBinding = DataBindingUtil.inflate(inflater, R.layout.webxr_interstitial, this, true); + mBinding.setLifecycleOwner((VRBrowserActivity)getContext()); + mSpinnerAnimation = (AnimatedVectorDrawable) mBinding.webxrSpinner.getDrawable(); + mWidgetManager.addWebXRListener(this); + } + + @Override + public void releaseWidget() { + mWidgetManager.removeWebXRListener(this); + super.releaseWidget(); + } + + private void addController(@DeviceType.Type int aDevice, @WebXRInterstitialController.Hand int aHand) { + mControllers.add(new WebXRInterstitialController(getContext(), aDevice, aHand)); + } + + private void initializeControllers() { + int deviceType = DeviceType.getType(); + if (deviceType == DeviceType.OculusGo) { + addController(DeviceType.OculusGo, WebXRInterstitialController.HAND_NONE); + } else if (deviceType == DeviceType.OculusQuest) { + addController(DeviceType.OculusQuest, WebXRInterstitialController.HAND_LEFT); + addController(DeviceType.OculusQuest, WebXRInterstitialController.HAND_RIGHT); + } else if (deviceType == DeviceType.PicoNeo2) { + addController(DeviceType.PicoNeo2, WebXRInterstitialController.HAND_LEFT); + addController(DeviceType.PicoNeo2, WebXRInterstitialController.HAND_RIGHT); + } else if (deviceType == DeviceType.PicoG2) { + addController(DeviceType.PicoG2, WebXRInterstitialController.HAND_NONE); + } else if (deviceType == DeviceType.ViveFocusPlus) { + addController(DeviceType.ViveFocusPlus, WebXRInterstitialController.HAND_LEFT); + addController(DeviceType.ViveFocusPlus, WebXRInterstitialController.HAND_RIGHT); + } + for (UIWidget controller: mControllers) { + controller.getPlacement().parentHandle = getHandle(); + mWidgetManager.addWidget(controller); + } + } + + private void showControllers() { + if (mControllers.size() == 0) { + initializeControllers(); + } + + for (UIWidget widget: mControllers) { + widget.show(KEEP_FOCUS); + } + } + + private void hideControllers() { + for (UIWidget widget: mControllers) { + widget.hide(KEEP_WIDGET); + } + } + + private void startAnimation() { + mSpinnerAnimation.start(); + } + + private void stopAnimation() { + mSpinnerAnimation.stop(); + } + + @Override + public void onEnterWebXR() { + startAnimation(); + show(KEEP_FOCUS); + if (firstEnterXR) { + firstEnterXR = false; + showControllers(); + postDelayed(() -> { + if (mWidgetManager != null) { + mWidgetManager.setWebXRIntersitialForced(false); + } + }, INTERSTITIAL_FORCE_TIME); + } + } + + + @Override + public void onExitWebXR() { + stopAnimation(); + hideControllers(); + hide(KEEP_WIDGET); + } +} diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetManagerDelegate.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetManagerDelegate.java index 9a9949ea28..0d6d12039f 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetManagerDelegate.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetManagerDelegate.java @@ -29,6 +29,11 @@ interface WorldClickListener { void onWorldClick(); } + interface WebXRListener { + void onEnterWebXR(); + void onExitWebXR(); + } + float DEFAULT_DIM_BRIGHTNESS = 0.25f; float DEFAULT_NO_DIM_BRIGHTNESS = 1.0f; @@ -76,6 +81,9 @@ interface WorldClickListener { void removePermissionListener(PermissionListener aListener); void addWorldClickListener(WorldClickListener aListener); void removeWorldClickListener(WorldClickListener aListener); + void addWebXRListener(WebXRListener aListener); + void removeWebXRListener(WebXRListener aListener); + void setWebXRIntersitialForced(boolean aForced); boolean isPermissionGranted(@NonNull String permission); void requestPermission(String uri, @NonNull String permission, GeckoSession.PermissionDelegate.Callback aCallback); boolean canOpenNewWindow(); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetPlacement.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetPlacement.java index 754bc299d4..270245881a 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetPlacement.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetPlacement.java @@ -11,6 +11,7 @@ import android.util.TypedValue; import android.view.View; +import androidx.annotation.IntDef; import androidx.annotation.NonNull; import org.mozilla.vrbrowser.R; @@ -19,6 +20,12 @@ public class WidgetPlacement { static final float WORLD_DPI_RATIO = 2.0f/720.0f; + @IntDef(value = { SCENE_ROOT_TRANSPARENT, SCENE_ROOT_OPAQUE, SCENE_WEBXR_INTERSTITIAL}) + public @interface Scene {} + public static final int SCENE_ROOT_TRANSPARENT = 0; + public static final int SCENE_ROOT_OPAQUE = 1; + public static final int SCENE_WEBXR_INTERSTITIAL = 2; + private WidgetPlacement() {} public WidgetPlacement(Context aContext) { density = aContext.getResources().getDisplayMetrics().density; @@ -43,7 +50,7 @@ public WidgetPlacement(Context aContext) { public float parentAnchorX = 0.5f; public float parentAnchorY = 0.5f; public boolean visible = true; - public boolean opaque = false; + public @Scene int scene = SCENE_ROOT_TRANSPARENT; public boolean showPointer = true; public boolean composited = false; public boolean layer = true; @@ -88,7 +95,7 @@ public void copyFrom(WidgetPlacement w) { this.parentAnchorX = w.parentAnchorX; this.parentAnchorY = w.parentAnchorY; this.visible = w.visible; - this.opaque = w.opaque; + this.scene = w.scene; this.showPointer = w.showPointer; this.composited = w.composited; this.layer = w.layer; diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/menus/LibraryMenuWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/menus/LibraryMenuWidget.java index 7f937b14aa..c49aedc538 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/menus/LibraryMenuWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/menus/LibraryMenuWidget.java @@ -102,7 +102,6 @@ protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { aPlacement.parentAnchorY = 1.0f; aPlacement.anchorX = 1.0f; aPlacement.anchorY = 1.0f; - aPlacement.opaque = false; aPlacement.cylinder = true; aPlacement.translationZ = WidgetPlacement.unitFromMeters(getContext(), R.dimen.context_menu_z_distance); } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/utils/DeviceType.java b/app/src/common/shared/org/mozilla/vrbrowser/utils/DeviceType.java index 6cb2ae309c..9a43e6c142 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/utils/DeviceType.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/utils/DeviceType.java @@ -2,25 +2,48 @@ import android.util.Log; +import androidx.annotation.IntDef; + import org.mozilla.vrbrowser.BuildConfig; public class DeviceType { // These values need to match those in Device.h + @IntDef(value = { Unknown, OculusGo, OculusQuest, ViveFocusPlus, PicoNeo2, PicoG2 }) + public @interface Type {} public static final int Unknown = 0; public static final int OculusGo = 1; public static final int OculusQuest = 2; - private static int mType = Unknown; - public static void setType(int aType) { - String name = "Unknown Type"; - if (aType == OculusGo) { - name = "Oculus Go"; - } else if (aType == OculusQuest) { - name = "Oculus Quest"; + public static final int ViveFocusPlus = 3; + public static final int PicoNeo2 = 4; + public static final int PicoG2 = 5; + + private static @Type int mType = Unknown; + + public static void setType(@Type int aType) { + String name; + switch (aType) { + case OculusGo: + name = "Oculus Go"; + break; + case OculusQuest: + name = "Oculus Quest"; + break; + case ViveFocusPlus: + name = "Vive Focus Plus"; + break; + case PicoNeo2: + name = "Pico Neo 2"; + break; + case PicoG2: + name = "Pico G2"; + break; + default: + name = "Unknown Type"; } Log.d("VRB", "Setting device type to: " + name); mType = aType; } - public static int getType() { + public static @Type int getType() { return mType; } diff --git a/app/src/main/cpp/BrowserWorld.cpp b/app/src/main/cpp/BrowserWorld.cpp index f9bfdde74e..436987a39b 100644 --- a/app/src/main/cpp/BrowserWorld.cpp +++ b/app/src/main/cpp/BrowserWorld.cpp @@ -12,7 +12,6 @@ #include "ExternalBlitter.h" #include "ExternalVR.h" #include "GeckoSurfaceTexture.h" -#include "LoadingAnimation.h" #include "Skybox.h" #include "SplashAnimation.h" #include "Pointer.h" @@ -158,6 +157,7 @@ struct BrowserWorld::State { GroupPtr rootOpaqueParent; TransformPtr rootOpaque; TransformPtr rootTransparent; + TransformPtr rootWebXRInterstitial; GroupPtr rootController; LightPtr light; ControllerContainerPtr controllers; @@ -179,7 +179,6 @@ struct BrowserWorld::State { uint32_t loaderDelay; bool exitImmersiveRequested; WidgetPtr resizingWidget; - LoadingAnimationPtr loadingAnimation; SplashAnimationPtr splashAnimation; VRVideoPtr vrVideo; PerformanceMonitorPtr monitor; @@ -189,6 +188,7 @@ struct BrowserWorld::State { std::function drawHandler; std::function frameEndHandler; bool wasInGazeMode = false; + bool webXRIntestitialForced = true; State() : paused(true), glInitialized(false), modelsLoaded(false), env(nullptr), cylinderDensity(0.0f), nearClip(0.1f), farClip(300.0f), activity(nullptr), windowsInitialized(false), exitImmersiveRequested(false), loaderDelay(0) { @@ -202,6 +202,7 @@ struct BrowserWorld::State { light = Light::Create(create); rootOpaqueParent = Group::Create(create); rootOpaqueParent->AddNode(rootOpaque); + rootWebXRInterstitial = Transform::Create(create); //rootOpaque->AddLight(light); //rootTransparent->AddLight(light); rootController->AddLight(light); @@ -211,7 +212,6 @@ struct BrowserWorld::State { externalVR = ExternalVR::Create(); blitter = ExternalBlitter::Create(create); fadeAnimation = FadeAnimation::Create(create); - loadingAnimation = LoadingAnimation::Create(create); splashAnimation = SplashAnimation::Create(create); monitor = PerformanceMonitor::Create(create); monitor->AddPerformanceMonitorObserver(std::make_shared()); @@ -802,7 +802,6 @@ BrowserWorld::InitializeJava(JNIEnv* aEnv, jobject& aActivity, jobject& aAssetMa } m.controllers->InitializeBeam(); m.controllers->SetPointerColor(vrb::Color(VRBrowser::GetPointerColor())); - m.loadingAnimation->LoadModels(m.loader); m.rootController->AddNode(m.controllers->GetRoot()); #if !defined(SNAPDRAGONVR) UpdateEnvironment(); @@ -1047,10 +1046,16 @@ BrowserWorld::AddWidget(int32_t aHandle, const WidgetPlacementPtr& aPlacement) { widget = Widget::Create(m.context, aHandle, aPlacement, textureWidth, textureHeight, quad); } - if (aPlacement->opaque) { - m.rootOpaque->AddNode(widget->GetRoot()); - } else { - m.rootTransparent->AddNode(widget->GetRoot()); + switch (aPlacement->GetScene()) { + case WidgetPlacement::Scene::ROOT_TRANSPARENT: + m.rootTransparent->AddNode(widget->GetRoot()); + break; + case WidgetPlacement::Scene::ROOT_OPAQUE: + m.rootOpaque->AddNode(widget->GetRoot()); + break; + case WidgetPlacement::Scene::WEBXR_INTERSTITIAL: + m.rootWebXRInterstitial->AddNode(widget->GetRoot()); + break; } m.widgets.push_back(widget); @@ -1350,6 +1355,11 @@ BrowserWorld::SetCPULevel(const device::CPULevel aLevel) { m.device->SetCPULevel(aLevel); } +void +BrowserWorld::SetWebXRIntersitialForced(const bool aForced) { + m.webXRIntestitialForced = aForced; +} + void BrowserWorld::SetIsServo(const bool aIsServo) { m.externalVR->SetSourceBrowser(aIsServo ? ExternalVR::VRBrowserType::Servo : ExternalVR::VRBrowserType::Gecko); @@ -1425,8 +1435,7 @@ BrowserWorld::TickImmersive() { const bool supportsFrameAhead = m.device->SupportsFramePrediction(DeviceDelegate::FramePrediction::ONE_FRAME_AHEAD); auto framePrediction = DeviceDelegate::FramePrediction::ONE_FRAME_AHEAD; - VRB_GL_CHECK(glDepthMask(GL_FALSE)); - if (!supportsFrameAhead || (m.externalVR->GetVRState() != ExternalVR::VRState::Rendering)) { + if (!supportsFrameAhead || (m.externalVR->GetVRState() != ExternalVR::VRState::Rendering) || m.webXRIntestitialForced) { // Do not use one frame ahead prediction if not supported or we are rendering the spinner. framePrediction = DeviceDelegate::FramePrediction::NO_FRAME_AHEAD; m.device->StartFrame(framePrediction); @@ -1458,9 +1467,13 @@ BrowserWorld::TickImmersive() { m.device->SetImmersiveSize((uint32_t) textureWidth/2, (uint32_t) textureHeight); } m.blitter->StartFrame(surfaceHandle, leftEye, rightEye); - m.drawHandler = [=](device::Eye aEye) { - DrawImmersive(aEye); - }; + if (m.webXRIntestitialForced) { + TickWebXRInterstitial(); + } else { + m.drawHandler = [=](device::Eye aEye) { + DrawImmersive(aEye); + }; + } } m.frameEndHandler = [=]() { m.device->EndFrame(aDiscardFrame ? DeviceDelegate::FrameEndMode::DISCARD : DeviceDelegate::FrameEndMode::APPLY); @@ -1470,7 +1483,7 @@ BrowserWorld::TickImmersive() { if (surfaceHandle != 0) { m.blitter->CancelFrame(surfaceHandle); } - TickLoadingAnimation(); + TickWebXRInterstitial(); } } @@ -1481,20 +1494,22 @@ BrowserWorld::DrawImmersive(device::Eye aEye) { } void -BrowserWorld::TickLoadingAnimation() { - m.loadingAnimation->Update(); +BrowserWorld::TickWebXRInterstitial() { + m.rootWebXRInterstitial->SetTransform(m.device->GetReorientTransform()); m.drawHandler = [=](device::Eye eye) { - DrawLoadingAnimation(eye); + DrawWebXRInterstitial(eye); }; } void -BrowserWorld::DrawLoadingAnimation(device::Eye aEye) { - VRB_GL_CHECK(glDepthMask(GL_TRUE)); - m.drawList->Reset(); - m.loadingAnimation->GetRoot()->Cull(*m.cullVisitor, *m.drawList); +BrowserWorld::DrawWebXRInterstitial(crow::device::Eye aEye) { + const CameraPtr camera = aEye == device::Eye::Left ? m.leftCamera : m.rightCamera; m.device->BindEye(aEye); - m.drawList->Draw(aEye == device::Eye::Left ? *m.leftCamera : *m.rightCamera); + VRB_GL_CHECK(glDepthMask(GL_FALSE)); + m.drawList->Reset(); + m.rootWebXRInterstitial->Cull(*m.cullVisitor, *m.drawList); + m.drawList->Draw(*camera); + VRB_GL_CHECK(glDepthMask(GL_TRUE)); } void @@ -1690,7 +1705,6 @@ JNI_METHOD(void, setCylinderDensityNative) crow::BrowserWorld::Instance().SetCylinderDensity(aDensity); } - JNI_METHOD(void, runCallbackNative) (JNIEnv*, jobject, jlong aCallback) { if (aCallback) { @@ -1705,9 +1719,16 @@ JNI_METHOD(void, setCPULevelNative) crow::BrowserWorld::Instance().SetCPULevel(static_cast(aCPULevel)); } +JNI_METHOD(void, setWebXRIntersitialForcedNative) +(JNIEnv*, jobject, jboolean aForced) { + crow::BrowserWorld::Instance().SetWebXRIntersitialForced(aForced); +} + JNI_METHOD(void, setIsServo) (JNIEnv*, jobject, jboolean aIsServo) { crow::BrowserWorld::Instance().SetIsServo(aIsServo); } + + } // extern "C" diff --git a/app/src/main/cpp/BrowserWorld.h b/app/src/main/cpp/BrowserWorld.h index 39eba4cb6c..e52aae92f1 100644 --- a/app/src/main/cpp/BrowserWorld.h +++ b/app/src/main/cpp/BrowserWorld.h @@ -67,6 +67,7 @@ class BrowserWorld { void SetControllersVisible(const bool aVisible); void ResetUIYaw(); void SetCylinderDensity(const float aDensity); + void SetWebXRIntersitialForced(const bool aForced); void SetIsServo(const bool aIsServo); void SetCPULevel(const device::CPULevel aLevel); JNIEnv* GetJNIEnv() const; @@ -78,10 +79,10 @@ class BrowserWorld { void TickWorld(); void TickImmersive(); void TickSplashAnimation(); - void TickLoadingAnimation(); + void TickWebXRInterstitial(); void DrawWorld(device::Eye aEye); void DrawImmersive(device::Eye aEye); - void DrawLoadingAnimation(device::Eye aEye); + void DrawWebXRInterstitial(device::Eye aEye); void DrawSplashAnimation(device::Eye aEye); void CreateSkyBox(const std::string& aBasePath, const std::string& aExtension); private: diff --git a/app/src/main/cpp/ExternalVR.cpp b/app/src/main/cpp/ExternalVR.cpp index 4e937c19b9..8dbedd8a46 100644 --- a/app/src/main/cpp/ExternalVR.cpp +++ b/app/src/main/cpp/ExternalVR.cpp @@ -339,14 +339,14 @@ ExternalVR::SetCompositorEnabled(bool aEnabled) { } m.compositorEnabled = aEnabled; if (aEnabled) { - VRBrowser::ResumeCompositor(); + VRBrowser::OnExitWebXR(); } else { // Set suppressFrames to avoid a deadlock between the compositor sync pause call and the gfxVRExternal SubmitFrame result wait. m.system.displayState.suppressFrames = true; m.system.displayState.lastSubmittedFrameId = 0; m.lastFrameId = 0; PushSystemState(); - VRBrowser::PauseCompositor(); + VRBrowser::OnEnterWebXR(); m.system.displayState.suppressFrames = false; PushSystemState(); } diff --git a/app/src/main/cpp/LoadingAnimation.cpp b/app/src/main/cpp/LoadingAnimation.cpp deleted file mode 100644 index 7c95e4421a..0000000000 --- a/app/src/main/cpp/LoadingAnimation.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "LoadingAnimation.h" -#include "vrb/ConcreteClass.h" -#include "vrb/CreationContext.h" -#include "vrb/Matrix.h" -#include "vrb/ModelLoaderAndroid.h" -#include "vrb/Light.h" -#include "vrb/TextureGL.h" -#include "vrb/Toggle.h" -#include "vrb/Transform.h" - -#include "Quad.h" - -namespace crow { - -struct LoadingAnimation::State { - vrb::CreationContextWeak context; - vrb::TextureGLPtr texture; - vrb::TogglePtr root; - vrb::TransformPtr spinner; - float rotation; - - State() - : rotation(0.0f) - {} - - void Initialize() { - vrb::CreationContextPtr create = context.lock(); - root = vrb::Toggle::Create(create); - vrb::LightPtr light = vrb::Light::Create(create); - root->AddLight(light); - } -}; - - -void -LoadingAnimation::LoadModels(const vrb::ModelLoaderAndroidPtr& aLoader) { - if (m.spinner) { - return; - } - vrb::CreationContextPtr ctx = m.context.lock(); - m.spinner = vrb::Transform::Create(ctx); - m.root->AddNode(m.spinner); - aLoader->LoadModel("spinners_v3.obj", m.spinner); -} - - -void -LoadingAnimation::Update() { - if (!m.spinner) { - return; - } - m.rotation += 0.07f; - const float max = 2.0f * (float)M_PI; - if (m.rotation > max) { - m.rotation -= max; - } - - vrb::Matrix transform = vrb::Matrix::Identity(); - const float scale = 0.05f; - transform.ScaleInPlace(vrb::Vector(scale, scale, scale)); - transform.PreMultiplyInPlace(vrb::Matrix::Rotation(vrb::Vector(0.0f, 1.0f, 0.0f), m.rotation)); - transform.PreMultiplyInPlace(vrb::Matrix::Position(vrb::Vector(0.0f, 0.0f, -1.5f))); - m.spinner->SetTransform(transform); -} - -vrb::NodePtr -LoadingAnimation::GetRoot() const { - return m.root; -} - -LoadingAnimationPtr -LoadingAnimation::Create(vrb::CreationContextPtr aContext) { - return std::make_shared >(aContext); -} - - -LoadingAnimation::LoadingAnimation(State& aState, vrb::CreationContextPtr& aContext) : m(aState) { - m.context = aContext; - m.Initialize(); -} - -} // namespace crow diff --git a/app/src/main/cpp/LoadingAnimation.h b/app/src/main/cpp/LoadingAnimation.h deleted file mode 100644 index 1d911509d2..0000000000 --- a/app/src/main/cpp/LoadingAnimation.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef VRBROWSER_LOADING_ANIMATION_H -#define VRBROWSER_LOADING_ANIMATION_H - -#include "vrb/Forward.h" -#include "vrb/MacroUtils.h" - -#include -#include -#include -#include - -namespace crow { - -class LoadingAnimation; -typedef std::shared_ptr LoadingAnimationPtr; - -class LoadingAnimation { -public: - static LoadingAnimationPtr Create(vrb::CreationContextPtr aContext); - void LoadModels(const vrb::ModelLoaderAndroidPtr& aLoader); - void Update(); - vrb::NodePtr GetRoot() const; -protected: - struct State; - LoadingAnimation(State& aState, vrb::CreationContextPtr& aContext); - ~LoadingAnimation() = default; -private: - State& m; - LoadingAnimation() = delete; - VRB_NO_DEFAULTS(LoadingAnimation) -}; - -} // namespace crow - -#endif // VRBROWSER_LOADING_ANIMATION_H diff --git a/app/src/main/cpp/VRBrowser.cpp b/app/src/main/cpp/VRBrowser.cpp index 415e06b7a1..8a14925ff2 100644 --- a/app/src/main/cpp/VRBrowser.cpp +++ b/app/src/main/cpp/VRBrowser.cpp @@ -30,10 +30,10 @@ const char* kHandleBackEventName = "handleBack"; const char* kHandleBackEventSignature = "()V"; const char* kRegisterExternalContextName = "registerExternalContext"; const char* kRegisterExternalContextSignature = "(J)V"; -const char* kPauseCompositorName = "pauseGeckoViewCompositor"; -const char* kPauseCompositorSignature = "()V"; -const char* kResumeCompositorName = "resumeGeckoViewCompositor"; -const char* kResumeCompositorSignature = "()V"; +const char* kOnEnterWebXRName = "onEnterWebXR"; +const char* kOnEnterWebXRSignature = "()V"; +const char* kOnExitWebXRName = "onExitWebXR"; +const char* kOnExitWebXRSignature = "()V"; const char* kRenderPointerLayerName = "renderPointerLayer"; const char* kRenderPointerLayerSignature = "(Landroid/view/Surface;J)V"; const char* kGetStorageAbsolutePathName = "getStorageAbsolutePath"; @@ -70,8 +70,8 @@ jmethodID sHandleResize = nullptr; jmethodID sHandleMoveEnd = nullptr; jmethodID sHandleBack = nullptr; jmethodID sRegisterExternalContext = nullptr; -jmethodID sPauseCompositor = nullptr; -jmethodID sResumeCompositor = nullptr; +jmethodID sOnEnterWebXR = nullptr; +jmethodID sOnExitWebXR = nullptr; jmethodID sRenderPointerLayer = nullptr; jmethodID sGetStorageAbsolutePath = nullptr; jmethodID sIsOverrideEnvPathEnabled = nullptr; @@ -112,8 +112,8 @@ VRBrowser::InitializeJava(JNIEnv* aEnv, jobject aActivity) { sHandleMoveEnd = FindJNIMethodID(sEnv, sBrowserClass, kHandleMoveEndName, kHandleMoveEndSignature); sHandleBack = FindJNIMethodID(sEnv, sBrowserClass, kHandleBackEventName, kHandleBackEventSignature); sRegisterExternalContext = FindJNIMethodID(sEnv, sBrowserClass, kRegisterExternalContextName, kRegisterExternalContextSignature); - sPauseCompositor = FindJNIMethodID(sEnv, sBrowserClass, kPauseCompositorName, kPauseCompositorSignature); - sResumeCompositor = FindJNIMethodID(sEnv, sBrowserClass, kResumeCompositorName, kResumeCompositorSignature); + sOnEnterWebXR = FindJNIMethodID(sEnv, sBrowserClass, kOnEnterWebXRName, kOnEnterWebXRSignature); + sOnExitWebXR = FindJNIMethodID(sEnv, sBrowserClass, kOnExitWebXRName, kOnExitWebXRSignature); sRenderPointerLayer = FindJNIMethodID(sEnv, sBrowserClass, kRenderPointerLayerName, kRenderPointerLayerSignature); sGetStorageAbsolutePath = FindJNIMethodID(sEnv, sBrowserClass, kGetStorageAbsolutePathName, kGetStorageAbsolutePathSignature); sIsOverrideEnvPathEnabled = FindJNIMethodID(sEnv, sBrowserClass, kIsOverrideEnvPathEnabledName, kIsOverrideEnvPathEnabledSignature); @@ -149,8 +149,8 @@ VRBrowser::ShutdownJava() { sHandleMoveEnd = nullptr; sHandleBack = nullptr; sRegisterExternalContext = nullptr; - sPauseCompositor = nullptr; - sResumeCompositor = nullptr; + sOnEnterWebXR = nullptr; + sOnExitWebXR = nullptr; sRenderPointerLayer = nullptr; sGetStorageAbsolutePath = nullptr; sIsOverrideEnvPathEnabled = nullptr; @@ -241,16 +241,16 @@ VRBrowser::RegisterExternalContext(jlong aContext) { } void -VRBrowser::PauseCompositor() { - if (!ValidateMethodID(sEnv, sActivity, sPauseCompositor, __FUNCTION__)) { return; } - sEnv->CallVoidMethod(sActivity, sPauseCompositor); +VRBrowser::OnEnterWebXR() { + if (!ValidateMethodID(sEnv, sActivity, sOnEnterWebXR, __FUNCTION__)) { return; } + sEnv->CallVoidMethod(sActivity, sOnEnterWebXR); CheckJNIException(sEnv, __FUNCTION__); } void -VRBrowser::ResumeCompositor() { - if (!ValidateMethodID(sEnv, sActivity, sResumeCompositor, __FUNCTION__)) { return; } - sEnv->CallVoidMethod(sActivity, sResumeCompositor); +VRBrowser::OnExitWebXR() { + if (!ValidateMethodID(sEnv, sActivity, sOnExitWebXR, __FUNCTION__)) { return; } + sEnv->CallVoidMethod(sActivity, sOnExitWebXR); CheckJNIException(sEnv, __FUNCTION__); } diff --git a/app/src/main/cpp/VRBrowser.h b/app/src/main/cpp/VRBrowser.h index 55200c95bb..2ee3452c8c 100644 --- a/app/src/main/cpp/VRBrowser.h +++ b/app/src/main/cpp/VRBrowser.h @@ -28,8 +28,8 @@ void HandleResize(jint aWidgetHandle, jfloat aWorldWidth, jfloat aWorldHeight); void HandleMoveEnd(jint aWidgetHandle, jfloat aX, jfloat aY, jfloat aZ, jfloat aRotation); void HandleBack(); void RegisterExternalContext(jlong aContext); -void PauseCompositor(); -void ResumeCompositor(); +void OnEnterWebXR(); +void OnExitWebXR(); void RenderPointerLayer(jobject aSurface, const std::function& aFirstCompositeCallback); std::string GetStorageAbsolutePath(const std::string& aRelativePath); bool isOverrideEnvPathEnabled(); diff --git a/app/src/main/cpp/WidgetPlacement.cpp b/app/src/main/cpp/WidgetPlacement.cpp index 542f387efa..5432c9c8da 100644 --- a/app/src/main/cpp/WidgetPlacement.cpp +++ b/app/src/main/cpp/WidgetPlacement.cpp @@ -62,7 +62,7 @@ WidgetPlacement::FromJava(JNIEnv* aEnv, jobject& aObject) { GET_FLOAT_FIELD(density, "density"); GET_FLOAT_FIELD(worldWidth, "worldWidth"); GET_BOOLEAN_FIELD(visible); - GET_BOOLEAN_FIELD(opaque); + GET_INT_FIELD(scene); GET_BOOLEAN_FIELD(showPointer); GET_BOOLEAN_FIELD(composited); GET_BOOLEAN_FIELD(layer); @@ -98,6 +98,18 @@ WidgetPlacement::GetClearColor() const { return vrb::Color(clearColor); } +WidgetPlacement::Scene +WidgetPlacement::GetScene() const { + switch (scene) { + case 1: + return Scene::ROOT_OPAQUE; + case 2: + return Scene::WEBXR_INTERSTITIAL; + default: + return Scene::ROOT_TRANSPARENT; + } +} + vrb::Color WidgetPlacement::GetTintColor() const { return vrb::Color(tintColor); diff --git a/app/src/main/cpp/WidgetPlacement.h b/app/src/main/cpp/WidgetPlacement.h index 966398a276..39116bbd8c 100644 --- a/app/src/main/cpp/WidgetPlacement.h +++ b/app/src/main/cpp/WidgetPlacement.h @@ -17,6 +17,12 @@ class WidgetPlacement; typedef std::shared_ptr WidgetPlacementPtr; struct WidgetPlacement { + enum class Scene { + ROOT_TRANSPARENT, + ROOT_OPAQUE, + WEBXR_INTERSTITIAL + }; + int32_t width; int32_t height; vrb::Vector anchor; @@ -28,7 +34,7 @@ struct WidgetPlacement { float density; float worldWidth; bool visible; - bool opaque; + int scene; bool showPointer; bool composited; bool layer; @@ -45,6 +51,7 @@ struct WidgetPlacement { int32_t GetTextureHeight() const; vrb::Color GetTintColor() const; vrb::Color GetClearColor() const; + WidgetPlacement::Scene GetScene() const; static const float kWorldDPIRatio; static WidgetPlacementPtr FromJava(JNIEnv* aEnv, jobject& aObject); diff --git a/app/src/main/res/drawable/ic_webxr_controller_arrow.xml b/app/src/main/res/drawable/ic_webxr_controller_arrow.xml new file mode 100644 index 0000000000..5af286e2c4 --- /dev/null +++ b/app/src/main/res/drawable/ic_webxr_controller_arrow.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/webxr_spinner.xml b/app/src/main/res/drawable/webxr_spinner.xml new file mode 100644 index 0000000000..9bf82bd288 --- /dev/null +++ b/app/src/main/res/drawable/webxr_spinner.xml @@ -0,0 +1,319 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/webxr_interstitial.xml b/app/src/main/res/layout/webxr_interstitial.xml new file mode 100644 index 0000000000..31648b15ec --- /dev/null +++ b/app/src/main/res/layout/webxr_interstitial.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index 8024c539d2..12573a08d5 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -254,4 +254,12 @@ 2dp 6dp + + + 80dp + 80dp + 45dp + 5dp + 0.0 + -2.5 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8cf5e7b481..e2b73bedea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1128,6 +1128,10 @@ browser's navigation bar. The button it labels, when pressed, Shows the WebXR permission dialog. --> WebXR Blocked + + Exit\nWebXR" + Tracking Protection Enabled diff --git a/app/src/noapi/res/layout/webxr_interstitial_controller.xml b/app/src/noapi/res/layout/webxr_interstitial_controller.xml new file mode 100644 index 0000000000..7c1404c06c --- /dev/null +++ b/app/src/noapi/res/layout/webxr_interstitial_controller.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/oculusvr/res/drawable/controller_go.png b/app/src/oculusvr/res/drawable/controller_go.png new file mode 100644 index 0000000000000000000000000000000000000000..00b5268578215c59ace8f75ef223e8913a05f674 GIT binary patch literal 22364 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 literal 0 HcmV?d00001 diff --git a/app/src/oculusvr/res/drawable/controller_quest_left.png b/app/src/oculusvr/res/drawable/controller_quest_left.png new file mode 100644 index 0000000000000000000000000000000000000000..16ed02535e0b1f788f777b58aa5a160e26f7b829 GIT binary patch literal 29969 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

S#X09dQU@ACS3GDDo@8| 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 literal 0 HcmV?d00001 diff --git a/app/src/oculusvr/res/layout/webxr_interstitial_controller.xml b/app/src/oculusvr/res/layout/webxr_interstitial_controller.xml new file mode 100644 index 0000000000..094c2cc8ed --- /dev/null +++ b/app/src/oculusvr/res/layout/webxr_interstitial_controller.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/picovr/java/org/mozilla/vrbrowser/PlatformActivity.java b/app/src/picovr/java/org/mozilla/vrbrowser/PlatformActivity.java index 696559532d..600ba77a72 100644 --- a/app/src/picovr/java/org/mozilla/vrbrowser/PlatformActivity.java +++ b/app/src/picovr/java/org/mozilla/vrbrowser/PlatformActivity.java @@ -88,7 +88,9 @@ protected void onCreate(Bundle bundle) { mType = 1; // 6Dof Headset // Enable high res PicovrSDK.SetEyeBufferSize(1920, 1920); + DeviceType.setType(DeviceType.PicoNeo2); } else { + DeviceType.setType(DeviceType.PicoG2); mHbManager = new HbManager(this); mHbManager.InitServices(); mHbManager.setHbListener(new HbListener() { diff --git a/app/src/picovr/res/drawable/controller_g2.png b/app/src/picovr/res/drawable/controller_g2.png new file mode 100644 index 0000000000000000000000000000000000000000..4f6c0d67c4ebb2e03f5c9fffec1c82a618ae4499 GIT binary patch literal 31030 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 LNkvXXu0mjfvdd{2 literal 0 HcmV?d00001 diff --git a/app/src/picovr/res/drawable/controller_neo2_right.png b/app/src/picovr/res/drawable/controller_neo2_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a332a516364342019c3d1e149308ec2c614ee9e7 GIT binary patch literal 15108 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 mbTn!qFZpwtNYbeW0Q^6l4L`Im+b$#k0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/wavevr/java/org/mozilla/vrbrowser/PlatformActivity.java b/app/src/wavevr/java/org/mozilla/vrbrowser/PlatformActivity.java index 19563df950..56b49468dd 100644 --- a/app/src/wavevr/java/org/mozilla/vrbrowser/PlatformActivity.java +++ b/app/src/wavevr/java/org/mozilla/vrbrowser/PlatformActivity.java @@ -11,6 +11,7 @@ import android.content.res.AssetManager; import android.os.Bundle; +import org.mozilla.vrbrowser.utils.DeviceType; import org.mozilla.vrbrowser.utils.SystemUtils; public class PlatformActivity extends VRActivity { @@ -30,6 +31,7 @@ public PlatformActivity() { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + DeviceType.setType(DeviceType.ViveFocusPlus); queueRunnable(new Runnable() { @Override diff --git a/app/src/wavevr/res/drawable/controller_focus_left.png b/app/src/wavevr/res/drawable/controller_focus_left.png new file mode 100644 index 0000000000000000000000000000000000000000..68771b548da0591b8158990ea8f80c9c95c277cd GIT binary patch literal 18013 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 literal 0 HcmV?d00001 diff --git a/app/src/wavevr/res/drawable/controller_focus_right.png b/app/src/wavevr/res/drawable/controller_focus_right.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b087634d0e8ff42f187186c0e52979bd6f0c9a GIT binary patch literal 17803 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 P00000NkvXXu0mjfHvg4z literal 0 HcmV?d00001 diff --git a/app/src/wavevr/res/layout/webxr_interstitial_controller.xml b/app/src/wavevr/res/layout/webxr_interstitial_controller.xml new file mode 100644 index 0000000000..f60e744200 --- /dev/null +++ b/app/src/wavevr/res/layout/webxr_interstitial_controller.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file