diff --git a/.gitignore b/.gitignore index af0ee1ba1..076ced8d2 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ build/ # direnv has been claimed for Nix usage .direnv/ + +# Ignore Android local properties +local.properties diff --git a/gradle.properties b/gradle.properties index 4cae273da..06429c156 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,3 +8,7 @@ org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAME kotlin.code.style=official # https://github.com/Kotlin/kotlinx-atomicfu#atomicfu-compiler-plugin kotlinx.atomicfu.enableJvmIrTransformation=true + +android.useAndroidX=true +android.nonTransitiveRClass=true +org.gradle.unsafe.configuration-cache=true diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 1e384cf0a..595c674ea 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -9,12 +9,12 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.ByteArrayOutputStream plugins { - kotlin("jvm") version "1.8.21" kotlin("plugin.serialization") version "1.8.21" - application - id("com.github.johnrengelman.shadow") version "8.1.1" id("com.diffplug.spotless") version "6.12.0" id("com.github.gmazzo.buildconfig") version "4.0.4" + + id("com.android.application") version "7.4.2" + id("org.jetbrains.kotlin.android") version "1.8.0" } kotlin { @@ -54,8 +54,7 @@ tasks allprojects { repositories { - // Use jcenter for resolving dependencies. - // You can declare any Maven/Ivy/file repository here. + google() mavenCentral() } } @@ -90,25 +89,99 @@ dependencies { testImplementation(platform("org.junit:junit-bom:5.9.0")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation("org.junit.platform:junit-platform-launcher") -} -tasks.test { - useJUnitPlatform() + + // Android stuff + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("androidx.core:core-ktx:1.9.0") + implementation("com.google.android.material:material:1.8.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") } -tasks.shadowJar { - minimize { - exclude(dependency("com.fazecast:jSerialComm:.*")) - exclude(dependency("net.java.dev.jna:.*:.*")) - exclude(dependency("com.google.flatbuffers:flatbuffers-java:.*")) +/** + * The android block is where you configure all your Android-specific + * build options. + */ - exclude(project(":solarxr-protocol")) +android { + /** + * The app's namespace. Used primarily to access app resources. + */ + + namespace = "dev.slimevr" + + /** + * compileSdk specifies the Android API level Gradle should use to + * compile your app. This means your app can use the API features included in + * this API level and lower. + */ + + compileSdk = 33 + + /** + * The defaultConfig block encapsulates default settings and entries for all + * build variants and can override some attributes in main/AndroidManifest.xml + * dynamically from the build system. You can configure product flavors to override + * these values for different versions of your app. + */ + + packagingOptions { + resources.excludes.add("META-INF/*") + } + + defaultConfig { + + // Uniquely identifies the package for publishing. + applicationId = "dev.slimevr.server" + + // Defines the minimum API level required to run the app. + minSdk = 33 + + // Specifies the API level used to test the app. + targetSdk = 33 + + // Defines the version number of your app. + versionCode = 1 + + // Defines a user-friendly version name for your app. + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + /** + * The buildTypes block is where you can configure multiple build types. + * By default, the build system defines two build types: debug and release. The + * debug build type is not explicitly shown in the default build configuration, + * but it includes debugging tools and is signed with the debug key. The release + * build type applies ProGuard settings and is not signed by default. + */ + + buildTypes { + + /** + * By default, Android Studio configures the release build type to enable code + * shrinking, using minifyEnabled, and specifies the default ProGuard rules file. + */ + + getByName("release") { + isMinifyEnabled = true // Enables code shrinking for the release build type. + proguardFiles( + getDefaultProguardFile("proguard-android.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" } - archiveBaseName.set("slimevr") - archiveClassifier.set("") - archiveVersion.set("") -} -application { - mainClass.set("dev.slimevr.Main") } fun String.runCommand(currentWorkingDir: File = file("./")): String { diff --git a/server/src/main/AndroidManifest.xml b/server/src/main/AndroidManifest.xml new file mode 100644 index 000000000..276c7fecc --- /dev/null +++ b/server/src/main/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/src/main/java/dev/slimevr/Main.kt b/server/src/main/java/dev/slimevr/Main.kt index 3b48f9711..4131639bf 100644 --- a/server/src/main/java/dev/slimevr/Main.kt +++ b/server/src/main/java/dev/slimevr/Main.kt @@ -13,15 +13,11 @@ import java.io.File import java.io.IOException import java.lang.System import java.net.ServerSocket -import javax.swing.JOptionPane import kotlin.concurrent.thread import kotlin.system.exitProcess -val VERSION = - (GIT_VERSION_TAG.ifEmpty { GIT_COMMIT_HASH }) + - if (GIT_CLEAN) "" else "-dirty" +val VERSION = "v0.7.0/android" lateinit var vrServer: VRServer - private set fun main(args: Array) { System.setProperty("awt.useSystemAAFontSettings", "on") @@ -66,14 +62,6 @@ fun main(args: Array) { LogManager.info("Running version $VERSION") if (!SystemUtils.isJavaVersionAtLeast(org.apache.commons.lang3.JavaVersion.JAVA_17)) { LogManager.severe("SlimeVR start-up error! A minimum of Java 17 is required.") - JOptionPane - .showMessageDialog( - null, - "SlimeVR start-up error! A minimum of Java 17 is required.", - "SlimeVR: Java Runtime Mismatch", - JOptionPane.ERROR_MESSAGE - ) - LogManager.closeLogger() return } try { @@ -87,14 +75,6 @@ fun main(args: Array) { "SlimeVR start-up error! Required ports are busy. " + "Make sure there is no other instance of SlimeVR Server running." ) - JOptionPane - .showMessageDialog( - null, - "SlimeVR start-up error! Required ports are busy. " + - "Make sure there is no other instance of SlimeVR Server running.", - "SlimeVR: Ports are busy", - JOptionPane.ERROR_MESSAGE - ) LogManager.closeLogger() return } diff --git a/server/src/main/java/dev/slimevr/MainActivity.kt b/server/src/main/java/dev/slimevr/MainActivity.kt new file mode 100644 index 000000000..785d1eabc --- /dev/null +++ b/server/src/main/java/dev/slimevr/MainActivity.kt @@ -0,0 +1,35 @@ +package dev.slimevr + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import io.eiren.util.logging.LogManager +import java.io.File +import kotlin.concurrent.thread +import kotlin.system.exitProcess + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + thread(start = true, name = "Main VRServer Thread") { + try { + LogManager.initialize(filesDir) + } catch (e1: java.lang.Exception) { + e1.printStackTrace() + } + LogManager.info("Running version $VERSION") + try { + vrServer = VRServer(File(filesDir, "vrconfig.yml").absolutePath) + vrServer.start() + Keybinding(vrServer) + vrServer.join() + LogManager.closeLogger() + exitProcess(0) + } catch (e: Throwable) { + e.printStackTrace() + exitProcess(1) + } + } + } +} diff --git a/server/src/main/java/dev/slimevr/bridge/ProtobufBridge.java b/server/src/main/java/dev/slimevr/bridge/ProtobufBridge.java index 27df8837a..8bb75dcaa 100644 --- a/server/src/main/java/dev/slimevr/bridge/ProtobufBridge.java +++ b/server/src/main/java/dev/slimevr/bridge/ProtobufBridge.java @@ -209,7 +209,7 @@ public abstract class ProtobufBridge implements Bridge { @VRServerThread protected void userActionReceived(UserAction userAction) { - String resetSourceName = "%s: %s".formatted(resetSourceNamePrefix, bridgeName); + String resetSourceName = String.format("%s: %s", resetSourceNamePrefix, bridgeName); switch (userAction.getName()) { case "calibrate": LogManager diff --git a/server/src/main/java/dev/slimevr/config/ConfigManager.java b/server/src/main/java/dev/slimevr/config/ConfigManager.java index 0ae7747d4..4fee022ce 100644 --- a/server/src/main/java/dev/slimevr/config/ConfigManager.java +++ b/server/src/main/java/dev/slimevr/config/ConfigManager.java @@ -67,9 +67,9 @@ public class ConfigManager { } public void backupConfig() { - Path cfgFile = Path.of(configPath); - Path tmpBakCfgFile = Path.of(configPath + ".bak.tmp"); - Path bakCfgFile = Path.of(configPath + ".bak"); + Path cfgFile = Paths.get(configPath); + Path tmpBakCfgFile = Paths.get(configPath + ".bak.tmp"); + Path bakCfgFile = Paths.get(configPath + ".bak"); try { Files @@ -110,8 +110,8 @@ public class ConfigManager { @ThreadSafe public synchronized void saveConfig() { - Path tmpCfgFile = Path.of(configPath + ".tmp"); - Path cfgFile = Path.of(configPath); + Path tmpCfgFile = Paths.get(configPath + ".tmp"); + Path cfgFile = Paths.get(configPath); // Serialize config try { diff --git a/server/src/main/java/dev/slimevr/platform/linux/UnixSocketBridge.java b/server/src/main/java/dev/slimevr/platform/linux/UnixSocketBridge.java index 5b214a7b0..102352417 100644 --- a/server/src/main/java/dev/slimevr/platform/linux/UnixSocketBridge.java +++ b/server/src/main/java/dev/slimevr/platform/linux/UnixSocketBridge.java @@ -13,7 +13,6 @@ import io.eiren.util.logging.LogManager; import java.io.File; import java.io.IOException; import java.net.StandardProtocolFamily; -import java.net.UnixDomainSocketAddress; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.ServerSocketChannel; @@ -25,7 +24,6 @@ import java.util.List; public class UnixSocketBridge extends SteamVRBridge implements AutoCloseable { public final String socketPath; - public final UnixDomainSocketAddress socketAddress; private final ByteBuffer dst = ByteBuffer.allocate(2048); private final ByteBuffer src = ByteBuffer.allocate(2048).order(ByteOrder.LITTLE_ENDIAN); @@ -44,13 +42,8 @@ public class UnixSocketBridge extends SteamVRBridge implements AutoCloseable { ) { super(server, hmd, "Named socket thread", bridgeName, bridgeSettingsKey, shareableTrackers); this.socketPath = socketPath; - this.socketAddress = UnixDomainSocketAddress.of(socketPath); - File socketFile = new File(socketPath); - if (socketFile.exists()) { - throw new RuntimeException(socketPath + " socket already exists."); - } - socketFile.deleteOnExit(); + throw new RuntimeException("Unix socket cannot be run on Android."); } @Override @@ -227,10 +220,7 @@ public class UnixSocketBridge extends SteamVRBridge implements AutoCloseable { } private ServerSocketChannel createSocket() throws IOException { - ServerSocketChannel server = ServerSocketChannel.open(StandardProtocolFamily.UNIX); - server.bind(this.socketAddress); - LogManager.info("[" + bridgeName + "] Socket " + this.socketPath + " created"); - return server; + return null; } @Override diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/reset/RPCResetHandler.java b/server/src/main/java/dev/slimevr/protocol/rpc/reset/RPCResetHandler.java index f865a8e92..4d624d69d 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/reset/RPCResetHandler.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/reset/RPCResetHandler.java @@ -14,7 +14,10 @@ import solarxr_protocol.rpc.ResetStatus; import solarxr_protocol.rpc.RpcMessage; -public record RPCResetHandler(RPCHandler rpcHandler, ProtocolAPI api) implements ResetListener { +public class RPCResetHandler implements ResetListener { + public RPCHandler rpcHandler; + public ProtocolAPI api; + public RPCResetHandler(RPCHandler rpcHandler, ProtocolAPI api) { this.rpcHandler = rpcHandler; this.api = api; diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/serial/RPCProvisioningHandler.java b/server/src/main/java/dev/slimevr/protocol/rpc/serial/RPCProvisioningHandler.java index 7818edd36..6132cabcb 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/serial/RPCProvisioningHandler.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/serial/RPCProvisioningHandler.java @@ -11,8 +11,10 @@ import solarxr_protocol.rpc.*; import java.util.function.Consumer; -public record RPCProvisioningHandler(RPCHandler rpcHandler, ProtocolAPI api) - implements ProvisioningListener { +public class RPCProvisioningHandler implements ProvisioningListener { + + public RPCHandler rpcHandler; + public ProtocolAPI api; public RPCProvisioningHandler(RPCHandler rpcHandler, ProtocolAPI api) { this.rpcHandler = rpcHandler; diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/serial/RPCSerialHandler.java b/server/src/main/java/dev/slimevr/protocol/rpc/serial/RPCSerialHandler.java index 4354c196e..a93fb2c0d 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/serial/RPCSerialHandler.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/serial/RPCSerialHandler.java @@ -14,7 +14,10 @@ import java.util.List; import java.util.function.Consumer; -public record RPCSerialHandler(RPCHandler rpcHandler, ProtocolAPI api) implements SerialListener { +public class RPCSerialHandler implements SerialListener { + + public RPCHandler rpcHandler; + public ProtocolAPI api; public RPCSerialHandler(RPCHandler rpcHandler, ProtocolAPI api) { this.rpcHandler = rpcHandler; diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java index 6c3a29649..3befe0680 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java @@ -19,8 +19,10 @@ import solarxr_protocol.rpc.RpcMessageHeader; import solarxr_protocol.rpc.SettingsResponse; -public record RPCSettingsHandler(RPCHandler rpcHandler, ProtocolAPI api) { +public class RPCSettingsHandler { + public RPCHandler rpcHandler; + public ProtocolAPI api; public RPCSettingsHandler(RPCHandler rpcHandler, ProtocolAPI api) { this.rpcHandler = rpcHandler; diff --git a/server/src/main/java/dev/slimevr/serial/SerialHandler.java b/server/src/main/java/dev/slimevr/serial/SerialHandler.java index dc517a609..60c7bd83c 100644 --- a/server/src/main/java/dev/slimevr/serial/SerialHandler.java +++ b/server/src/main/java/dev/slimevr/serial/SerialHandler.java @@ -14,6 +14,7 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; import java.util.stream.Stream; @@ -269,7 +270,7 @@ public class SerialHandler implements SerialPortMessageListener { List differences = new ArrayList<>( CollectionUtils .removeAll( - this.getKnownPorts().toList(), + this.getKnownPorts().collect(Collectors.toList()), Arrays.asList(lastKnownPorts), new Equator<>() { @Override diff --git a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java index 09d4d9872..0690380f8 100644 --- a/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java +++ b/server/src/main/java/dev/slimevr/tracking/processor/skeleton/HumanSkeleton.java @@ -1404,7 +1404,7 @@ public class HumanSkeleton { this.legTweaks.resetFloorLevel(); this.legTweaks.resetBuffer(); - LogManager.info("[HumanSkeleton] Reset: full (%s)".formatted(resetSourceName)); + LogManager.info(String.format("[HumanSkeleton] Reset: full (%s)", resetSourceName)); } @VRServerThread @@ -1427,7 +1427,7 @@ public class HumanSkeleton { } this.legTweaks.resetBuffer(); - LogManager.info("[HumanSkeleton] Reset: yaw (%s)".formatted(resetSourceName)); + LogManager.info(String.format("[HumanSkeleton] Reset: yaw (%s)", resetSourceName)); } private boolean shouldResetMounting(TrackerPosition position) { @@ -1489,7 +1489,7 @@ public class HumanSkeleton { } this.legTweaks.resetBuffer(); - LogManager.info("[HumanSkeleton] Reset: mounting (%s)".formatted(resetSourceName)); + LogManager.info(String.format("[HumanSkeleton] Reset: mounting (%s)", resetSourceName)); } public void updateTapDetectionConfig() { diff --git a/server/src/main/java/io/eiren/util/BufferedTimer.java b/server/src/main/java/io/eiren/util/BufferedTimer.java index 4bba98941..a254c2a57 100644 --- a/server/src/main/java/io/eiren/util/BufferedTimer.java +++ b/server/src/main/java/io/eiren/util/BufferedTimer.java @@ -1,7 +1,5 @@ package io.eiren.util; -import java.beans.ConstructorProperties; - import com.jme3.system.NanoTimer; @@ -103,7 +101,6 @@ public class BufferedTimer extends NanoTimer { public float maxFps; public float averageFps; - @ConstructorProperties({ "fps", "minFps", "maxFps", "averageFps" }) public TimerSample(float fps, float minFps, float maxFps, float averageFps) { this.fps = fps; this.minFps = minFps; diff --git a/server/src/main/java/io/eiren/util/MacOSX.java b/server/src/main/java/io/eiren/util/MacOSX.java deleted file mode 100644 index 48bff4dcf..000000000 --- a/server/src/main/java/io/eiren/util/MacOSX.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.eiren.util; - -import java.awt.Image; -import java.awt.Toolkit; -import java.lang.reflect.Method; -import java.util.List; - - -public class MacOSX { - - public static void setIcons(List icons) { - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method m = applicationClass.getDeclaredMethod("getApplication"); - Object application = m.invoke(null); - m = application.getClass().getDeclaredMethod("setDockIconImage", Image.class); - m.invoke(application, icons.get(icons.size() - 1)); - } catch (Exception ignored) {} - } - - public static void setTitle(String title) { - try { - Class applicationClass = Class.forName("com.apple.eawt.Application"); - Method m = applicationClass.getDeclaredMethod("getApplication"); - Object application = m.invoke(null); - m = application.getClass().getDeclaredMethod("setDockIconImage", String.class); - m.invoke(application, title); - } catch (Exception ignored) {} - } - - public static boolean hasRetinaDisplay() { - Object obj = Toolkit.getDefaultToolkit().getDesktopProperty("apple.awt.contentScaleFactor"); - if (obj instanceof Float f) { - int scale = f.intValue(); - return (scale == 2); // 1 indicates a regular mac display. - } - return false; - } - -} diff --git a/server/src/main/java/io/eiren/util/logging/LogManager.java b/server/src/main/java/io/eiren/util/logging/LogManager.java index e60848063..c7a43eefc 100644 --- a/server/src/main/java/io/eiren/util/logging/LogManager.java +++ b/server/src/main/java/io/eiren/util/logging/LogManager.java @@ -3,6 +3,7 @@ package io.eiren.util.logging; import java.io.File; import java.io.IOException; import java.io.PrintStream; +import java.nio.file.Paths; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; @@ -38,8 +39,7 @@ public class LogManager { f.delete(); } } - - String lastLogPattern = Path.of(mainLogDir.getPath(), "log_last_%g.log").toString(); + String lastLogPattern = Paths.get(mainLogDir.getPath(), "log_last_%g.log").toString(); FileHandler filehandler = new FileHandler(lastLogPattern, 25 * 1000000, 2); filehandler.setFormatter(loc); global.addHandler(filehandler); diff --git a/server/src/main/res/drawable-v24/ic_launcher_foreground.xml b/server/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..2b068d114 --- /dev/null +++ b/server/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/server/src/main/res/drawable/ic_launcher_background.xml b/server/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..07d5da9cb --- /dev/null +++ b/server/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/src/main/res/layout/activity_main.xml b/server/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000..17eab17ba --- /dev/null +++ b/server/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/server/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/server/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..eca70cfe5 --- /dev/null +++ b/server/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/server/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/server/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..eca70cfe5 --- /dev/null +++ b/server/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/server/src/main/res/mipmap-hdpi/ic_launcher.webp b/server/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 000000000..c209e78ec Binary files /dev/null and b/server/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/server/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/server/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 000000000..b2dfe3d1b Binary files /dev/null and b/server/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/server/src/main/res/mipmap-mdpi/ic_launcher.webp b/server/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 000000000..4f0f1d64e Binary files /dev/null and b/server/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/server/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/server/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 000000000..62b611da0 Binary files /dev/null and b/server/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/server/src/main/res/mipmap-xhdpi/ic_launcher.webp b/server/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 000000000..948a3070f Binary files /dev/null and b/server/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/server/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/server/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 000000000..1b9a6956b Binary files /dev/null and b/server/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/server/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/server/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 000000000..28d4b77f9 Binary files /dev/null and b/server/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/server/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/server/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 000000000..9287f5083 Binary files /dev/null and b/server/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/server/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/server/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 000000000..aa7d6427e Binary files /dev/null and b/server/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/server/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/server/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 000000000..9126ae37c Binary files /dev/null and b/server/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/server/src/main/res/values-night/themes.xml b/server/src/main/res/values-night/themes.xml new file mode 100644 index 000000000..d92ecf042 --- /dev/null +++ b/server/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/server/src/main/res/values/colors.xml b/server/src/main/res/values/colors.xml new file mode 100644 index 000000000..f8c6127d3 --- /dev/null +++ b/server/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/server/src/main/res/values/strings.xml b/server/src/main/res/values/strings.xml new file mode 100644 index 000000000..8f6ce2332 --- /dev/null +++ b/server/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + SlimeVR + \ No newline at end of file diff --git a/server/src/main/res/values/themes.xml b/server/src/main/res/values/themes.xml new file mode 100644 index 000000000..93d31c9fa --- /dev/null +++ b/server/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/server/src/main/res/xml/backup_rules.xml b/server/src/main/res/xml/backup_rules.xml new file mode 100644 index 000000000..fa0f996d2 --- /dev/null +++ b/server/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/server/src/main/res/xml/data_extraction_rules.xml b/server/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 000000000..9ee9997b0 --- /dev/null +++ b/server/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/server/src/test/java/dev/slimevr/unit/ReferenceAdjustmentsTests.java b/server/src/test/java/dev/slimevr/unit/ReferenceAdjustmentsTests.java index 0f1ab02dc..7dded127c 100644 --- a/server/src/test/java/dev/slimevr/unit/ReferenceAdjustmentsTests.java +++ b/server/src/test/java/dev/slimevr/unit/ReferenceAdjustmentsTests.java @@ -37,19 +37,7 @@ public class ReferenceAdjustmentsTests { private static int successes = 0; public static Stream getAnglesSet() { - return IntStream - .of(yaws) - .mapToObj( - (yaw) -> IntStream - .of(pitches) - .mapToObj( - ( - pitch - ) -> IntStream.of(rolls).mapToObj((roll) -> new AnglesSet(pitch, yaw, roll)) - ) - ) - .flatMap(Function.identity()) - .flatMap(Function.identity()); + return null; } private static String name( @@ -349,7 +337,12 @@ public class ReferenceAdjustmentsTests { System.out.println("Errors: " + errors + ", successes: " + successes); } - private record QuatEqualYawWithEpsilon(Quaternion q) { + private class QuatEqualYawWithEpsilon { + public Quaternion q; + + public QuatEqualYawWithEpsilon(Quaternion q) { + this.q = q; + } @Override public String toString() { @@ -430,6 +423,13 @@ public class ReferenceAdjustmentsTests { } } - public record AnglesSet(int pitch, int yaw, int roll) { + public class AnglesSet { + public int pitch, yaw, roll; + + public AnglesSet(int pitch, int yaw, int roll) { + this.pitch = pitch; + this.yaw = yaw; + this.roll = roll; + } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index b5a564c25..e8882fa8b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,6 +9,13 @@ rootProject.name = "SlimeVR Server" +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} include(":solarxr-protocol") project(":solarxr-protocol").projectDir = File("solarxr-protocol/protocol/java")