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 extends Image> 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")