diff --git a/Cargo.lock b/Cargo.lock index 5b9c3ec5bed..8ab374e3963 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = "0.0.1" dependencies = [ "ipc-channel 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", - "rust-webvr-api 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-webvr-api 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1216,6 +1216,11 @@ dependencies = [ "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "gvr-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "half" version = "1.0.0" @@ -2210,6 +2215,11 @@ dependencies = [ "shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ovr-mobile-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "owning_ref" version = "0.3.3" @@ -2502,19 +2512,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rust-webvr" -version = "0.8.1" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gl_generator 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "gvr-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-webvr-api 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "ovr-mobile-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-webvr-api 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rust-webvr-api" -version = "0.8.2" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "android_injected_glue 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3655,7 +3666,7 @@ dependencies = [ "ipc-channel 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", - "rust-webvr 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-webvr 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)", "script_traits 0.0.1", "servo_config 0.0.1", "webvr_traits 0.0.1", @@ -3868,6 +3879,7 @@ dependencies = [ "checksum gleam 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "bf887141f0c2a83eae026cbf3fba74f0a5cb0f01d20e5cdfcd8c4ad39295be1e" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum glx 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b280007fa9c7442cfd1e0b1addb8d1a59240267110e8705f8f7e2c7bfb7e2f72" +"checksum gvr-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e84ba5e13cd925de87b669475525f956f8e936e67ddb24fbb1a077d96bbe174c" "checksum half 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "63d68db75012a85555434ee079e7e6337931f87a087ab2988becbadf64673a7f" "checksum harfbuzz-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "a2caaa66078fdfacea32db1351223697a1167ad2d4bbee6b8d4ca220ce5b10b3" "checksum heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c7593b1522161003928c959c20a2ca421c68e940d63d75573316a009e48a6d4" @@ -3942,6 +3954,7 @@ dependencies = [ "checksum ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da12c96037889ae0be29dd2bdd260e5a62a7df24e6466d5a15bb8131c1c200a8" "checksum osmesa-src 17.2.0-devel (git+https://github.com/servo/osmesa-src)" = "" "checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" +"checksum ovr-mobile-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7b5f9389b2015f8340f0566c488f3e96735e2e8fd7b85d571832cd274ac2998" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot_core 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4f610cb9664da38e417ea3225f23051f589851999535290e077939838ab7a595" @@ -3971,8 +3984,8 @@ dependencies = [ "checksum ref_slice 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "825740057197b7d43025e7faf6477eaabc03434e153233da02d1f44602f71527" "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b" "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db" -"checksum rust-webvr 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4514c041e0b1f7e00038acf19f0421c9cd77a629e0e111f319abbde714742003" -"checksum rust-webvr-api 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ece2e3ecae072ebf033811082cd58ddb46910af1a7e26b0917fdf455a20aab3" +"checksum rust-webvr 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c1ab572fff7a623e973511c7fc615e9f74a2429946b826c5c16a2f017489b79a" +"checksum rust-webvr-api 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "712e22ba3c03a7075b40842ae91029a0ab96a81f95e97c0cf623800ec0cbac07" "checksum rustc-demangle 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3058a43ada2c2d0b92b3ae38007a2d0fa5e9db971be260e0171408a4ff471c95" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index 67c02538543..24e60111214 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -17,6 +17,8 @@ max_log_level = ["log/release_max_level_info"] webdriver = ["webdriver_server"] energy-profiling = ["profile_traits/energy-profiling"] debugmozjs = ["script/debugmozjs"] +googlevr = ["webvr/googlevr"] +oculusvr = ["webvr/oculusvr"] [dependencies] bluetooth_traits = {path = "../bluetooth_traits"} diff --git a/components/webvr/Cargo.toml b/components/webvr/Cargo.toml index f1a87e915ea..15622da20ad 100644 --- a/components/webvr/Cargo.toml +++ b/components/webvr/Cargo.toml @@ -9,13 +9,17 @@ publish = false name = "webvr" path = "lib.rs" +[features] +googlevr = ['rust-webvr/googlevr'] +oculusvr = ['rust-webvr/oculusvr'] + [dependencies] canvas_traits = {path = "../canvas_traits"} euclid = "0.15" ipc-channel = "0.8" log = "0.3" msg = {path = "../msg"} -rust-webvr = {version = "0.8", features = ["openvr"]} +rust-webvr = {version = "0.9", features = ["openvr"]} script_traits = {path = "../script_traits"} servo_config = {path = "../config"} webvr_traits = {path = "../webvr_traits" } diff --git a/components/webvr_traits/Cargo.toml b/components/webvr_traits/Cargo.toml index e8c0783c467..8e1b98f058e 100644 --- a/components/webvr_traits/Cargo.toml +++ b/components/webvr_traits/Cargo.toml @@ -12,5 +12,5 @@ path = "lib.rs" [dependencies] ipc-channel = "0.8" msg = {path = "../msg"} -rust-webvr-api = {version = "0.8", features = ["serde-serialization"]} +rust-webvr-api = {version = "0.9", features = ["serde-serialization"]} serde = "1.0" diff --git a/ports/servo/Cargo.toml b/ports/servo/Cargo.toml index 4f39b70216d..80b9c19b831 100644 --- a/ports/servo/Cargo.toml +++ b/ports/servo/Cargo.toml @@ -34,6 +34,8 @@ max_log_level = ["log/release_max_level_info"] webdriver = ["libservo/webdriver_server"] energy-profiling = ["libservo/energy-profiling"] debugmozjs = ["libservo/debugmozjs"] +googlevr = ["libservo/googlevr"] +oculusvr = ["libservo/oculusvr"] [dependencies] backtrace = "0.3" diff --git a/python/servo/build_commands.py b/python/servo/build_commands.py index 63b7ebd19fd..00cfa96ccd3 100644 --- a/python/servo/build_commands.py +++ b/python/servo/build_commands.py @@ -309,6 +309,11 @@ class MachCommands(CommandBase): env['CPPFLAGS'] = ' '.join(["--sysroot", env['ANDROID_SYSROOT']]) env["CMAKE_ANDROID_ARCH_ABI"] = self.config["android"]["lib"] env["CMAKE_TOOLCHAIN_FILE"] = path.join(self.android_support_dir(), "toolchain.cmake") + # Set output dir for gradle aar files + aar_out_dir = self.android_aar_dir() + if not os.path.exists(aar_out_dir): + os.makedirs(aar_out_dir) + env["AAR_OUT_DIR"] = aar_out_dir cargo_binary = "cargo" + BIN_SUFFIX diff --git a/python/servo/command_base.py b/python/servo/command_base.py index dab4df1a772..2e6db17aa59 100644 --- a/python/servo/command_base.py +++ b/python/servo/command_base.py @@ -551,6 +551,9 @@ class CommandBase(object): def android_build_dir(self, dev): return path.join(self.get_target_dir(), self.config["android"]["target"], "debug" if dev else "release") + def android_aar_dir(self): + return path.join(self.context.topdir, "target", "android_aar") + def handle_android_target(self, target): if target == "arm-linux-androideabi": self.config["android"]["platform"] = "android-18" diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py index 41aee9d5303..6912962c095 100644 --- a/python/servo/package_commands.py +++ b/python/servo/package_commands.py @@ -180,7 +180,10 @@ class PackageCommands(CommandBase): @CommandArgument('--target', '-t', default=None, help='Package for given target platform') - def package(self, release=False, dev=False, android=None, debug=False, debugger=None, target=None): + @CommandArgument('--flavor', '-f', + default=None, + help='Package using the given Gradle flavor') + def package(self, release=False, dev=False, android=None, debug=False, debugger=None, target=None, flavor=None): env = self.build_env() if android is None: android = self.config["build"]["android"] @@ -206,7 +209,11 @@ class PackageCommands(CommandBase): else: build_mode = "Release" - task_name = "assemble" + build_type + build_mode + flavor_name = "Main" + if flavor is not None: + flavor_name = flavor.title() + + task_name = "assemble" + flavor_name + build_type + build_mode try: with cd(path.join("support", "android", "apk")): subprocess.check_call(["./gradlew", "--no-daemon", task_name], env=env) diff --git a/support/android/apk/app/build.gradle b/support/android/apk/app/build.gradle index dd16b1ffc26..66718a7cd20 100644 --- a/support/android/apk/app/build.gradle +++ b/support/android/apk/app/build.gradle @@ -33,6 +33,17 @@ android { } } + productFlavors { + main { + } + googlevr { + minSdkVersion 21 + } + oculusvr { + minSdkVersion 21 + } + } + sourceSets { main { java.srcDirs = ['src/main/java'] @@ -145,7 +156,9 @@ android { // Call our custom NDK Build task using flavor parameters tasks.all { compileTask -> - Pattern pattern = Pattern.compile(/^transformJackWithJackFor([\w\d]+)(Debug|Release)/); + // Parse architecture name from gradle task name: + // Examples: transformJackWithJackForMainArmv7Release, transformJackWithJackForOculusvrArmv7Release + Pattern pattern = Pattern.compile(/^transformJackWithJackFor[A-Z][\w\d]+([A-Z][\w\d]+)(Debug|Release)/); Matcher matcher = pattern.matcher(compileTask.name); // You can use this alternative pattern when jackCompiler is disabled // Pattern pattern = Pattern.compile(/^compile([\w\d]+)(Debug|Release)/); @@ -194,6 +207,10 @@ dependencies { } } } + + googlevrCompile 'com.google.vr:sdk-base:1.70.0' + googlevrCompile(name:'GVRService', ext:'aar') + oculusvrCompile(name:'OVRService', ext:'aar') } // Utility methods diff --git a/support/android/apk/app/src/googlevr/AndroidManifest.xml b/support/android/apk/app/src/googlevr/AndroidManifest.xml new file mode 100644 index 00000000000..f0bcffd707f --- /dev/null +++ b/support/android/apk/app/src/googlevr/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/support/android/apk/app/src/main/java/com/mozilla/servo/MainActivity.java b/support/android/apk/app/src/main/java/com/mozilla/servo/MainActivity.java index f27964575e9..04c57511b3e 100644 --- a/support/android/apk/app/src/main/java/com/mozilla/servo/MainActivity.java +++ b/support/android/apk/app/src/main/java/com/mozilla/servo/MainActivity.java @@ -11,9 +11,11 @@ import android.os.Handler; import android.os.PowerManager; import android.preference.PreferenceManager; import android.util.Log; +import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import android.webkit.URLUtil; +import android.widget.FrameLayout; import com.mozilla.servo.BuildConfig; @@ -66,20 +68,44 @@ public class MainActivity extends android.app.NativeActivity { } JSONObject preferences = loadPreferences(); - boolean keepScreenOn = preferences.optBoolean("shell.keep_screen_on.enabled", false); - mFullScreen = !preferences.optBoolean("shell.native-titlebar.enabled", false); - String orientation = preferences.optString("shell.native-orientation", "both"); - // Handle orientation preference - if (orientation.equalsIgnoreCase("portrait")) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + boolean keepScreenOn = false; + + if (BuildConfig.FLAVOR.contains("vr")) { + // Force fullscreen mode and keep screen on for VR experiences. + keepScreenOn = true; + mFullScreen = true; } - else if (orientation.equalsIgnoreCase("landscape")) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + else { + keepScreenOn = preferences.optBoolean("shell.keep_screen_on.enabled", false); + mFullScreen = !preferences.optBoolean("shell.native-titlebar.enabled", false); + + String orientation = preferences.optString("shell.native-orientation", "both"); + + // Handle orientation preference + if (orientation.equalsIgnoreCase("portrait")) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } + else if (orientation.equalsIgnoreCase("landscape")) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } } super.onCreate(savedInstanceState); + // NativeActivity ignores the Android view hierarchy because it’s designed + // to take over the surface from the window to directly draw to it. + // Inject a custom SurfaceView in order to support adding views on top of the browser. + // (e.g. Native Banners, Daydream GVRLayout or other native views) + getWindow().takeSurface(null); + FrameLayout layout = new FrameLayout(this); + layout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.MATCH_PARENT)); + SurfaceView nativeSurface = new SurfaceView(this); + nativeSurface.getHolder().addCallback(this); + layout.addView(nativeSurface, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); + setContentView(layout); + // Handle keep screen on preference if (keepScreenOn) { keepScreenOn(); diff --git a/support/android/apk/app/src/oculusvr/AndroidManifest.xml b/support/android/apk/app/src/oculusvr/AndroidManifest.xml new file mode 100644 index 00000000000..9b8e8817b3d --- /dev/null +++ b/support/android/apk/app/src/oculusvr/AndroidManifest.xml @@ -0,0 +1,10 @@ + + +> + + + + + + + diff --git a/support/android/apk/build.gradle b/support/android/apk/build.gradle index 1f497e94744..1db454a0be9 100644 --- a/support/android/apk/build.gradle +++ b/support/android/apk/build.gradle @@ -11,6 +11,9 @@ buildscript { allprojects { repositories { jcenter() + flatDir { + dirs rootDir.absolutePath + "/../../../target/android_aar" + } } buildDir = rootDir.absolutePath + "/../../../target/gradle"