Remove Ktor dependency

This commit is contained in:
Butterscotch!
2025-12-08 23:24:20 -05:00
parent 199bec40e1
commit 276e73e724
10 changed files with 37 additions and 55 deletions

View File

@@ -1,3 +1,3 @@
/build
/src/main/resources/web-gui
/src/main/assets/web-gui
/secrets

View File

@@ -29,7 +29,7 @@ java {
}
tasks.register<Copy>("copyGuiAssets") {
val target = layout.projectDirectory.dir("src/main/resources/web-gui")
val target = layout.projectDirectory.dir("src/main/assets/web-gui")
delete(target)
from(rootProject.layout.projectDirectory.dir("gui/dist"))
into(target)
@@ -86,10 +86,6 @@ dependencies {
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
androidTestImplementation("androidx.test.ext:junit:1.3.0")
androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0")
// For hosting web GUI
implementation("io.ktor:ktor-server-core:2.3.13")
implementation("io.ktor:ktor-server-netty:2.3.13")
implementation("io.ktor:ktor-server-caching-headers:2.3.13")
// Serial
implementation("com.github.mik3y:usb-serial-for-android:3.7.0")

View File

@@ -12,50 +12,15 @@ import dev.slimevr.android.tracking.trackers.hid.AndroidHIDManager
import dev.slimevr.config.ConfigManager
import dev.slimevr.tracking.trackers.Tracker
import io.eiren.util.logging.LogManager
import io.ktor.http.CacheControl
import io.ktor.http.CacheControl.Visibility
import io.ktor.server.application.install
import io.ktor.server.engine.embeddedServer
import io.ktor.server.http.content.CachingOptions
import io.ktor.server.http.content.staticResources
import io.ktor.server.netty.Netty
import io.ktor.server.netty.NettyApplicationEngine
import io.ktor.server.plugins.cachingheaders.CachingHeaders
import io.ktor.server.routing.routing
import kotlinx.coroutines.runBlocking
import java.io.File
import java.time.ZonedDateTime
import kotlin.concurrent.thread
import kotlin.system.exitProcess
lateinit var webServer: NettyApplicationEngine
private set
val webServerInitialized: Boolean
get() = ::webServer.isInitialized
var webServerPort = 0
lateinit var vrServer: VRServer
private set
val vrServerInitialized: Boolean
get() = ::vrServer.isInitialized
fun startWebServer() {
// Host the web GUI server
webServer = embeddedServer(Netty, port = 0) {
routing {
install(CachingHeaders) {
options { _, _ ->
CachingOptions(CacheControl.NoStore(Visibility.Public), ZonedDateTime.now())
}
}
staticResources("/", "web-gui", "index.html")
}
}.start(wait = false)
webServerPort = runBlocking { webServer.resolvedConnectors().first().port }
}
fun startVRServer(activity: AppCompatActivity) {
thread(start = true, name = "Main VRServer Thread") {
try {

View File

@@ -3,12 +3,16 @@ package dev.slimevr.android
import android.content.Intent
import android.os.Bundle
import android.webkit.JavascriptInterface
import android.webkit.WebSettings
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
import io.eiren.util.logging.LogManager
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock
import java.io.IOException
import java.net.URLConnection
class AndroidJsObject {
@JavascriptInterface
@@ -28,14 +32,6 @@ class MainActivity : AppCompatActivity() {
}
initLock.withLock {
// Start the GUI if it isn't already running
if (!webServerInitialized) {
LogManager.info("[MainActivity] WebServer isn't running yet, starting it...")
startWebServer()
} else {
LogManager.info("[MainActivity] WebServer is already running, skipping initialization.")
}
// Start the server if it isn't already running
if (!vrServerInitialized) {
LogManager.info("[MainActivity] VRServer isn't running yet, starting it...")
@@ -53,6 +49,35 @@ class MainActivity : AppCompatActivity() {
// Enable debug mode
WebView.setWebContentsDebuggingEnabled(true)
// Handle path resolution
guiWebView.webViewClient = object : WebViewClient() {
override fun shouldInterceptRequest(
view: WebView,
request: WebResourceRequest,
): WebResourceResponse? {
if ((request.url.scheme != "http" && request.url.scheme != "https") ||
request.url.host != "slimevr.gui"
) {
return null
}
val path = when (request.url.path) {
null, "", "/" -> "/index.html"
else -> request.url.path
}
return try {
WebResourceResponse(
URLConnection.guessContentTypeFromName(path) ?: "text/plain",
null,
assets.open("web-gui$path"),
)
} catch (_: IOException) {
WebResourceResponse(null, null, null)
}
}
}
// Set required features
guiWebView.settings.javaScriptEnabled = true
guiWebView.settings.domStorageEnabled = true
@@ -66,12 +91,8 @@ class MainActivity : AppCompatActivity() {
guiWebView.settings.loadWithOverviewMode = true
guiWebView.invokeZoomPicker()
// Disable cache! This is all local anyway
guiWebView.settings.cacheMode = WebSettings.LOAD_NO_CACHE
guiWebView.clearCache(true)
// Load GUI page
guiWebView.loadUrl("http://127.0.0.1:$webServerPort/")
guiWebView.loadUrl("https://slimevr.gui/")
LogManager.info("[MainActivity] GUI WebView has been initialized and loaded.")
// Start a foreground service to notify the user the SlimeVR Server is running

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 940 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB