Skip to content

Commit a386e19

Browse files
authored
perf(loader): don't block startup on bundle update if cached (#19)
2 parents 5c29b10 + d9603ff commit a386e19

3 files changed

Lines changed: 41 additions & 9 deletions

File tree

app/src/main/kotlin/io/github/revenge/xposed/modules/HookScriptLoaderModule.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,19 @@ object HookScriptLoaderModule : Module() {
8383

8484
runBlocking {
8585
val ready = async { HookStateHolder.readyDeferred.join() }
86-
val download = async { UpdaterModule.downloadScript().join() }
87-
88-
awaitAll(ready, download)
86+
val isCustomUrl = UpdaterModule.isCustomUrlEnabled
87+
88+
if (!mainScript.exists() || isCustomUrl) {
89+
val reason = if (isCustomUrl) "Custom URL enabled" else "Main script does not exist"
90+
Log.i("$reason, downloading before load...")
91+
val download =
92+
async { UpdaterModule.downloadScript(showUpdateDialog = false).join() }
93+
awaitAll(ready, download)
94+
} else {
95+
Log.i("Main script exists, updating in background...")
96+
UpdaterModule.downloadScript(showUpdateDialog = true)
97+
ready.await()
98+
}
8999
}
90100

91101
val loadSynchronously = args[2]

app/src/main/kotlin/io/github/revenge/xposed/modules/UpdaterModule.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import io.github.revenge.xposed.Utils
1313
import io.github.revenge.xposed.Utils.Companion.JSON
1414
import io.github.revenge.xposed.Utils.Companion.reloadApp
1515
import io.github.revenge.xposed.Utils.Log
16+
import io.github.revenge.xposed.modules.bridge.BridgeModule
1617
import io.ktor.client.*
1718
import io.ktor.client.call.*
1819
import io.ktor.client.engine.cio.*
@@ -42,6 +43,8 @@ data class LoaderConfig(
4243
*/
4344
object UpdaterModule : Module() {
4445
private lateinit var config: LoaderConfig
46+
val isCustomUrlEnabled: Boolean
47+
get() = config.customLoadUrl.enabled
4548
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
4649
private var lastActivity: WeakReference<Activity>? = null
4750

@@ -71,9 +74,15 @@ object UpdaterModule : Module() {
7174
JSON.decodeFromString<LoaderConfig>(configFile.readText())
7275
} else LoaderConfig()
7376
}.getOrDefault(LoaderConfig())
77+
78+
BridgeModule.registerMethod("revenge.updater.clear") {
79+
if (bundle.exists()) bundle.delete()
80+
if (etag.exists()) etag.delete()
81+
null
82+
}
7483
}
7584

76-
fun downloadScript(activity: Activity? = null): Job = scope.launch {
85+
fun downloadScript(activity: Activity? = null, showUpdateDialog: Boolean = true): Job = scope.launch {
7786
try {
7887
HttpClient(CIO) {
7988
expectSuccess = false
@@ -108,15 +117,22 @@ object UpdaterModule : Module() {
108117

109118
Log.i("Bundle updated (${bytes.size} bytes)")
110119

111-
// This is a retry, so we show a dialog
112-
if (activity != null) {
113-
withContext(Dispatchers.Main) {
114-
AlertDialog.Builder(activity).setTitle("Revenge Update Successful")
120+
if (showUpdateDialog) {
121+
val activity = activity ?: lastActivity?.get()
122+
123+
activity?.runOnUiThread {
124+
AlertDialog.Builder(activity)
125+
.setTitle("Revenge Update Downloaded")
115126
.setMessage("A reload is required for changes to take effect.")
116127
.setPositiveButton("Reload") { dialog, _ ->
117128
reloadApp()
118129
dialog.dismiss()
119-
}.setCancelable(false).show()
130+
}
131+
.setNegativeButton("Later") { dialog, _ ->
132+
dialog.dismiss()
133+
}
134+
.setCancelable(false)
135+
.show()
120136
}
121137
}
122138
}

app/src/main/kotlin/io/github/revenge/xposed/modules/bridge/AdditionalBridgeMethodsModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.os.Build
99
import android.widget.Toast
1010
import io.github.revenge.xposed.Module
1111
import io.github.revenge.xposed.Utils
12+
import io.github.revenge.xposed.Utils.Companion.reloadApp
1213
import java.io.File
1314

1415
object AdditionalBridgeMethodsModule : Module() {
@@ -47,6 +48,11 @@ object AdditionalBridgeMethodsModule : Module() {
4748

4849
file.writeText(contents as String)
4950
}
51+
52+
BridgeModule.registerMethod("revenge.app.reload") {
53+
reloadApp()
54+
null
55+
}
5056
}
5157

5258
override fun onActivity(activity: Activity) = with(activity) {

0 commit comments

Comments
 (0)