perf(scripting): parcel file descriptor
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package me.rhunk.snapenhance.scripting
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.net.Uri
|
||||
import android.os.ParcelFileDescriptor
|
||||
import androidx.documentfile.provider.DocumentFile
|
||||
import me.rhunk.snapenhance.RemoteSideContext
|
||||
import me.rhunk.snapenhance.bridge.scripting.AutoReloadListener
|
||||
@@ -11,6 +13,7 @@ import me.rhunk.snapenhance.common.scripting.bindings.BindingSide
|
||||
import me.rhunk.snapenhance.common.scripting.impl.ConfigInterface
|
||||
import me.rhunk.snapenhance.common.scripting.impl.ConfigTransactionType
|
||||
import me.rhunk.snapenhance.common.scripting.type.ModuleInfo
|
||||
import me.rhunk.snapenhance.core.util.ktx.toParcelFileDescriptor
|
||||
import me.rhunk.snapenhance.scripting.impl.IPCListeners
|
||||
import me.rhunk.snapenhance.scripting.impl.ManagerIPC
|
||||
import me.rhunk.snapenhance.scripting.impl.ManagerScriptConfig
|
||||
@@ -49,8 +52,10 @@ class RemoteScriptManager(
|
||||
getScriptFileNames().forEach { name ->
|
||||
runCatching {
|
||||
getScriptInputStream(name) { stream ->
|
||||
runtime.getModuleInfo(stream!!).also { info ->
|
||||
cachedModuleInfo[name] = info
|
||||
stream?.use {
|
||||
runtime.getModuleInfo(it).also { info ->
|
||||
cachedModuleInfo[name] = info
|
||||
}
|
||||
}
|
||||
}
|
||||
}.onFailure {
|
||||
@@ -92,9 +97,10 @@ class RemoteScriptManager(
|
||||
runtime.unload(scriptPath)
|
||||
}
|
||||
|
||||
@SuppressLint("Recycle")
|
||||
private fun <R> getScriptInputStream(name: String, callback: (InputStream?) -> R): R {
|
||||
val file = getScriptsFolder()?.findFile(name) ?: return callback(null)
|
||||
return context.androidContext.contentResolver.openInputStream(file.uri)?.use(callback) ?: callback(null)
|
||||
return context.androidContext.contentResolver.openInputStream(file.uri)?.let(callback) ?: callback(null)
|
||||
}
|
||||
|
||||
fun getModuleDataFolder(moduleFileName: String): File {
|
||||
@@ -123,15 +129,14 @@ class RemoteScriptManager(
|
||||
}.getOrDefault(emptyList())
|
||||
}
|
||||
|
||||
override fun getScriptContent(moduleName: String): String? {
|
||||
override fun getScriptContent(moduleName: String): ParcelFileDescriptor? {
|
||||
if (moduleName.startsWith("composer/")) {
|
||||
return runCatching {
|
||||
context.androidContext.assets.open("composer/${moduleName.removePrefix("composer/")}").use {
|
||||
it.bufferedReader().readText()
|
||||
}
|
||||
context.androidContext.assets.open("composer/${moduleName.removePrefix("composer/")}")
|
||||
.toParcelFileDescriptor(context.coroutineScope)
|
||||
}.getOrNull()
|
||||
}
|
||||
return getScriptInputStream(moduleName) { it?.bufferedReader()?.readText() }
|
||||
return getScriptInputStream(moduleName) { it?.toParcelFileDescriptor(context.coroutineScope) }
|
||||
}
|
||||
|
||||
override fun registerIPCListener(channel: String, eventName: String, listener: IPCListener) {
|
||||
|
||||
@@ -6,7 +6,7 @@ import me.rhunk.snapenhance.bridge.scripting.AutoReloadListener;
|
||||
interface IScripting {
|
||||
List<String> getEnabledScripts();
|
||||
|
||||
@nullable String getScriptContent(String path);
|
||||
@nullable ParcelFileDescriptor getScriptContent(String path);
|
||||
|
||||
oneway void registerIPCListener(String channel, String eventName, IPCListener listener);
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package me.rhunk.snapenhance.common.scripting
|
||||
|
||||
import android.content.Context
|
||||
import android.os.ParcelFileDescriptor
|
||||
import me.rhunk.snapenhance.bridge.scripting.IScripting
|
||||
import me.rhunk.snapenhance.common.logger.AbstractLogger
|
||||
import me.rhunk.snapenhance.common.scripting.type.ModuleInfo
|
||||
@@ -80,6 +81,12 @@ open class ScriptRuntime(
|
||||
modules.remove(scriptPath)
|
||||
}
|
||||
|
||||
fun load(scriptPath: String, pfd: ParcelFileDescriptor) {
|
||||
load(scriptPath, ParcelFileDescriptor.AutoCloseInputStream(pfd).use {
|
||||
it.readBytes().toString(Charsets.UTF_8)
|
||||
})
|
||||
}
|
||||
|
||||
fun load(scriptPath: String, content: String): JSModule? {
|
||||
logger.info("Loading module $scriptPath")
|
||||
return runCatching {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import android.os.ParcelFileDescriptor
|
||||
import android.widget.FrameLayout
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
@@ -186,7 +187,11 @@ class ComposerHooks: Feature("ComposerHooks", loadParams = FeatureLoadParams.ACT
|
||||
}
|
||||
|
||||
private fun loadHooks() {
|
||||
val loaderScript = context.scriptRuntime.scripting.getScriptContent("composer/loader.js") ?: run {
|
||||
val loaderScript = context.scriptRuntime.scripting.getScriptContent("composer/loader.js")?.let { pfd ->
|
||||
ParcelFileDescriptor.AutoCloseInputStream(pfd).use {
|
||||
it.readBytes().toString(Charsets.UTF_8)
|
||||
}
|
||||
} ?: run {
|
||||
context.log.error("Failed to load composer loader script")
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user