Commit 9d5595f8 authored by Piotr Bialecki's avatar Piotr Bialecki Committed by Commit Bot

Move ArCoreJavaUtils, ArImmersiveOverlay & ArDelegate

Yet another CL to unblock WebXR in WebView / WebLayer work.

Changes:
- ArCoreJavaUtils, ArImmersiveOverlay & ArDelegatenow no longer need
  to live in //chrome - moved them to //components/webxr
- native ArCoreJavaUtils are also moved to //components/webxr
- ArDelegate needs to be consumable by ChromeActivity - added required
  DEPS entries and created a target that is present independently of
  enable_arcore build flag
- adjusted the location of linter suppression entries - converted them
  from entries in lint-baseline.xml into @SuppressLint attributes

Bug: 843374
Change-Id: I8fa8a7594f69fd4bb6cb65326ef626300b5ab55d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2490235Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarAlexander Cooper <alcooper@chromium.org>
Commit-Queue: Piotr Bialecki <bialpio@chromium.org>
Cr-Commit-Position: refs/heads/master@{#820501}
parent b8c55dc8
......@@ -463,6 +463,7 @@ android_library("chrome_java") {
"//components/webapk/android/libs/client:java",
"//components/webapk/android/libs/common:java",
"//components/webrtc/android:java",
"//components/webxr/android:ar_java_interfaces",
"//content/public/android:content_java",
"//device/gamepad:java",
"//media/base/android:media_java",
......
......@@ -1649,7 +1649,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/usage_stats/UsageStatsMetricsReporter.java",
"java/src/org/chromium/chrome/browser/usage_stats/UsageStatsService.java",
"java/src/org/chromium/chrome/browser/usage_stats/WebsiteEvent.java",
"java/src/org/chromium/chrome/browser/vr/ArDelegate.java",
"java/src/org/chromium/chrome/browser/vr/ArDelegateProvider.java",
"java/src/org/chromium/chrome/browser/webapps/ActivateWebApkActivity.java",
"java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHost.java",
......
......@@ -1255,28 +1255,6 @@
column="20"/>
</issue>
<issue
id="ClickableViewAccessibility"
message="Custom view ``SurfaceView`` has `setOnTouchListener` called on it but does not override `performClick`"
errorLine1=" mSurfaceView.setOnTouchListener(ArImmersiveOverlay.this);"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="../../chrome/android/java/src/org/chromium/chrome/browser/vr/ArImmersiveOverlay.java"
line="176"
column="13"/>
</issue>
<issue
id="ClickableViewAccessibility"
message="`ArImmersiveOverlay#onTouch` should call `View#performClick` when a click is detected"
errorLine1=" public boolean onTouch(View v, MotionEvent ev) {"
errorLine2=" ~~~~~~~">
<location
file="../../chrome/android/java/src/org/chromium/chrome/browser/vr/ArImmersiveOverlay.java"
line="222"
column="20"/>
</issue>
<issue
id="ClickableViewAccessibility"
message="`onTouch` lambda should call `View#performClick` when a click is detected"
......
......@@ -52,6 +52,7 @@ include_rules = [
"+components/sync/android/java/src/org/chromium/components/sync",
"+components/query_tiles/android/java",
"+components/thin_webview/java",
"+components/webxr/android/java",
"-content/public/android",
"+content/public/android/java/src/org/chromium/content_public",
......
......@@ -164,7 +164,6 @@ import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarManageable;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManagerProvider;
import org.chromium.chrome.browser.ui.system.StatusBarColorController;
import org.chromium.chrome.browser.vr.ArDelegate;
import org.chromium.chrome.browser.vr.ArDelegateProvider;
import org.chromium.chrome.browser.vr.VrModuleProvider;
import org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenCoordinator;
......@@ -186,6 +185,7 @@ import org.chromium.components.policy.CombinedPolicyProvider;
import org.chromium.components.policy.CombinedPolicyProvider.PolicyChangeListener;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.components.webapk.lib.client.WebApkValidator;
import org.chromium.components.webxr.ArDelegate;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.ScreenOrientationProvider;
import org.chromium.content_public.browser.SelectionPopupController;
......
......@@ -5,6 +5,8 @@
package org.chromium.chrome.browser.vr;
import org.chromium.base.annotations.UsedByReflection;
import org.chromium.components.webxr.ArCoreJavaUtils;
import org.chromium.components.webxr.ArDelegate;
/**
* This class provides methods to call into AR. It will be compiled into Chrome
......
......@@ -4,10 +4,16 @@
package org.chromium.chrome.browser.vr;
import org.chromium.base.Log;
import org.chromium.components.webxr.ArDelegate;
/**
* Class used to create ArDelegate instances.
*/
public class ArDelegateProvider {
private static final String TAG = "ArDelegateProvider";
private static final boolean DEBUG_LOGS = false;
/**
* Cached instance of ArDelegate implementation. It is ok to cache since the
* inclusion of ArDelegateImpl is controlled at build time.
......@@ -23,6 +29,12 @@ public class ArDelegateProvider {
* Provides an instance of ArDelegate.
*/
public static ArDelegate getDelegate() {
if (DEBUG_LOGS) {
Log.i(TAG,
"ArDelegate.getDelegate(): sDelegateInitialized=" + sDelegateInitialized
+ ", is sDelegate null? " + (sDelegate == null));
}
if (sDelegateInitialized) return sDelegate;
try {
......@@ -35,6 +47,10 @@ public class ArDelegateProvider {
sDelegateInitialized = true;
}
if (DEBUG_LOGS) {
Log.i(TAG, "Is sDelegate null? " + (sDelegate == null));
}
return sDelegate;
}
}
......@@ -45,8 +45,6 @@ if (enable_arcore) {
"java/src/org/chromium/chrome/browser/vr/ArCompositorDelegateImpl.java",
"java/src/org/chromium/chrome/browser/vr/ArCompositorDelegateProviderImpl.java",
"java/src/org/chromium/chrome/browser/vr/ArCoreDeviceUtils.java",
"java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java",
"java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java",
"java/src/org/chromium/chrome/browser/vr/ArImmersiveOverlay.java",
]
}
......@@ -66,8 +66,6 @@ static_library("vr_android") {
"arcore_device/arcore_device_provider.cc",
"arcore_device/arcore_device_provider.h",
"arcore_device/arcore_device_utils.cc",
"arcore_device/arcore_java_utils.cc",
"arcore_device/arcore_java_utils.h",
]
}
......@@ -177,7 +175,6 @@ if (enable_arcore) {
sources = [
"//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCompositorDelegateProviderImpl.java",
"//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreDeviceUtils.java",
"//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java",
]
}
}
......
......@@ -4,7 +4,7 @@
#include "chrome/browser/android/vr/arcore_device/arcore_device_provider.h"
#include "chrome/browser/android/vr/arcore_device/arcore_java_utils.h"
#include "components/webxr/android/arcore_java_utils.h"
#include "components/webxr/mailbox_to_surface_bridge_impl.h"
#include "device/vr/android/arcore/ar_image_transport.h"
#include "device/vr/android/arcore/arcore_device.h"
......@@ -34,7 +34,8 @@ void ArCoreDeviceProvider::Initialize(
std::make_unique<ArCoreImplFactory>(),
std::make_unique<ArImageTransportFactory>(),
std::make_unique<webxr::MailboxToSurfaceBridgeFactoryImpl>(),
std::make_unique<vr::ArCoreJavaUtils>(compositor_delegate_provider_));
std::make_unique<webxr::ArCoreJavaUtils>(
compositor_delegate_provider_));
add_device_callback.Run(
arcore_device_->GetId(), arcore_device_->GetVRDisplayInfo(),
......
......@@ -5,8 +5,6 @@
import("//build/config/android/rules.gni")
import("//device/vr/buildflags/buildflags.gni")
assert(enable_vr)
source_set("android_utils") {
sources = [
"webxr_utils.cc",
......@@ -32,6 +30,8 @@ source_set("android") {
sources += [
"arcore_install_helper.cc",
"arcore_install_helper.h",
"arcore_java_utils.cc",
"arcore_java_utils.h",
]
}
......@@ -46,14 +46,32 @@ source_set("android") {
]
if (enable_arcore) {
deps += [ ":ar_jni_headers" ]
deps += [
":ar_jni_headers",
"//device/vr/android/arcore:arcore",
]
}
libs = [ "android" ]
}
android_library("ar_java_interfaces") {
sources = [
"//components/webxr/android/java/src/org/chromium/components/webxr/ArCompositorDelegate.java",
"//components/webxr/android/java/src/org/chromium/components/webxr/ArCompositorDelegateProvider.java",
"//components/webxr/android/java/src/org/chromium/components/webxr/ArDelegate.java",
]
deps = [
"//content/public/android:content_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
]
}
android_library("ar_java_base") {
deps = [
":ar_java_base_resources",
":ar_java_interfaces",
":webxr_android_enums_java",
"//base:base_java",
"//base:jni_java",
......@@ -65,15 +83,19 @@ android_library("ar_java_base") {
]
sources = [
"//components/webxr/android/java/src/org/chromium/components/webxr/ArCompositorDelegate.java",
"//components/webxr/android/java/src/org/chromium/components/webxr/ArCompositorDelegateProvider.java",
"//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java",
"//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreJavaUtils.java",
"//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShim.java",
"//components/webxr/android/java/src/org/chromium/components/webxr/ArImmersiveOverlay.java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
resources_package = "org.chromium.components.webxr"
}
android_resources("ar_java_base_resources") {
deps = [ "//components/browser_ui/strings/android:browser_ui_strings_grd" ]
}
android_library("ar_java") {
deps = [
":ar_java_base",
......@@ -87,7 +109,10 @@ android_library("ar_java") {
if (enable_arcore) {
generate_jni("ar_jni_headers") {
sources = [ "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java" ]
sources = [
"//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java",
"//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreJavaUtils.java",
]
}
}
......
......@@ -3,6 +3,7 @@ include_rules = [
"+components/resources/android/theme_resources.h",
"+components/strings/grit/components_strings.h",
"+content/public/android/java/src/org/chromium/content_public",
"+device/vr/android/arcore",
"+ui/android",
"+ui/base",
]
......@@ -2,20 +2,20 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/android/vr/arcore_device/arcore_java_utils.h"
#include "components/webxr/android/arcore_java_utils.h"
#include <memory>
#include <utility>
#include "base/android/jni_string.h"
#include "chrome/browser/android/vr/ar_jni_headers/ArCoreJavaUtils_jni.h"
#include "components/webxr/android/ar_jni_headers/ArCoreJavaUtils_jni.h"
#include "components/webxr/android/webxr_utils.h"
#include "device/vr/android/arcore/arcore_shim.h"
using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef;
namespace vr {
namespace webxr {
ArCoreJavaUtils::ArCoreJavaUtils(
webxr::ArCompositorDelegateProvider compositor_delegate_provider)
......@@ -39,9 +39,9 @@ void ArCoreJavaUtils::RequestArSession(
int render_process_id,
int render_frame_id,
bool use_overlay,
SurfaceReadyCallback ready_callback,
SurfaceTouchCallback touch_callback,
SurfaceDestroyedCallback destroyed_callback) {
vr::SurfaceReadyCallback ready_callback,
vr::SurfaceTouchCallback touch_callback,
vr::SurfaceDestroyedCallback destroyed_callback) {
DVLOG(1) << __func__;
JNIEnv* env = AttachCurrentThread();
......@@ -124,7 +124,8 @@ bool ArCoreJavaUtils::EnsureLoaded() {
return false;
}
return LoadArCoreSdk(base::android::ConvertJavaStringToUTF8(env, java_path));
return vr::LoadArCoreSdk(
base::android::ConvertJavaStringToUTF8(env, java_path));
}
ScopedJavaLocalRef<jobject> ArCoreJavaUtils::GetApplicationContext() {
......@@ -132,4 +133,4 @@ ScopedJavaLocalRef<jobject> ArCoreJavaUtils::GetApplicationContext() {
return Java_ArCoreJavaUtils_getApplicationContext(env);
}
} // namespace vr
} // namespace webxr
......@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_JAVA_UTILS_H_
#define CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_JAVA_UTILS_H_
#ifndef COMPONENTS_WEBXR_ANDROID_ARCORE_JAVA_UTILS_H_
#define COMPONENTS_WEBXR_ANDROID_ARCORE_JAVA_UTILS_H_
#include <android/native_window_jni.h>
#include <jni.h>
......@@ -14,21 +14,22 @@
#include "components/webxr/android/ar_compositor_delegate_provider.h"
#include "device/vr/android/arcore/arcore_session_utils.h"
namespace vr {
namespace webxr {
class ArCoreJavaUtils : public ArCoreSessionUtils {
class ArCoreJavaUtils : public vr::ArCoreSessionUtils {
public:
explicit ArCoreJavaUtils(
webxr::ArCompositorDelegateProvider compositor_delegate_provider);
~ArCoreJavaUtils() override;
// ArCoreSessionUtils:
void RequestArSession(int render_process_id,
void RequestArSession(
int render_process_id,
int render_frame_id,
bool use_overlay,
SurfaceReadyCallback ready_callback,
SurfaceTouchCallback touch_callback,
SurfaceDestroyedCallback destroyed_callback) override;
vr::SurfaceReadyCallback ready_callback,
vr::SurfaceTouchCallback touch_callback,
vr::SurfaceDestroyedCallback destroyed_callback) override;
void EndSession() override;
bool EnsureLoaded() override;
base::android::ScopedJavaLocalRef<jobject> GetApplicationContext() override;
......@@ -57,11 +58,11 @@ class ArCoreJavaUtils : public ArCoreSessionUtils {
webxr::ArCompositorDelegateProvider compositor_delegate_provider_;
SurfaceReadyCallback surface_ready_callback_;
SurfaceTouchCallback surface_touch_callback_;
SurfaceDestroyedCallback surface_destroyed_callback_;
vr::SurfaceReadyCallback surface_ready_callback_;
vr::SurfaceTouchCallback surface_touch_callback_;
vr::SurfaceDestroyedCallback surface_destroyed_callback_;
};
} // namespace vr
} // namespace webxr
#endif // CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_JAVA_UTILS_H_
#endif // COMPONENTS_WEBXR_ANDROID_ARCORE_JAVA_UTILS_H_
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.vr;
package org.chromium.components.webxr;
import android.app.Activity;
import android.content.Context;
......@@ -15,7 +15,6 @@ import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.components.webxr.ArCompositorDelegateProvider;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.WindowAndroid;
......@@ -25,7 +24,7 @@ import org.chromium.ui.base.WindowAndroid;
* <p>This class provides static methods called by ArDelegateImpl via ArDelegateProvider,
* and provides JNI interfaces to/from the C++ AR code.</p>
*/
@JNINamespace("vr")
@JNINamespace("webxr")
public class ArCoreJavaUtils {
private static final String TAG = "ArCoreJavaUtils";
private static final boolean DEBUG_LOGS = false;
......
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.vr;
package org.chromium.components.webxr;
/**
* Interface used by ChromeActivity to communicate with AR code that is only
......
......@@ -2,8 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.vr;
package org.chromium.components.webxr;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
......@@ -23,8 +24,6 @@ import android.view.WindowManager;
import androidx.annotation.NonNull;
import org.chromium.base.Log;
import org.chromium.chrome.R;
import org.chromium.components.webxr.ArCompositorDelegate;
import org.chromium.content_public.browser.ScreenOrientationDelegate;
import org.chromium.content_public.browser.ScreenOrientationProvider;
import org.chromium.content_public.browser.WebContents;
......@@ -167,6 +166,7 @@ public class ArImmersiveOverlay
private SurfaceView mSurfaceView;
private WebContentsObserver mWebContentsObserver;
@SuppressLint("ClickableViewAccessibility")
public SurfaceUiCompositor() {
mSurfaceView = new SurfaceView(mActivity);
// Keep the camera layer at "default" Z order. Chrome's compositor SurfaceView is in
......@@ -229,6 +229,7 @@ public class ArImmersiveOverlay
}
@Override // View.OnTouchListener
@SuppressLint("ClickableViewAccessibility")
public boolean onTouch(View v, MotionEvent ev) {
// Only forward primary actions, ignore more complex events such as secondary pointer
// touches. Ignore batching since we're only sending one ray pose per frame.
......
......@@ -17,6 +17,8 @@ bool create_called = false;
// static
std::unique_ptr<device::VRDeviceProvider>
ArCoreDeviceProviderFactory::Create() {
DVLOG(2) << __func__;
create_called = true;
if (!g_arcore_device_provider_factory)
return nullptr;
......@@ -26,6 +28,8 @@ ArCoreDeviceProviderFactory::Create() {
// static
void ArCoreDeviceProviderFactory::Install(
std::unique_ptr<ArCoreDeviceProviderFactory> factory) {
DVLOG(2) << __func__;
DCHECK_NE(g_arcore_device_provider_factory, factory.get());
if (g_arcore_device_provider_factory) {
delete g_arcore_device_provider_factory;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment