Skip to content

Commit 04413c8

Browse files
committed
feat: custom injector selection
1 parent 9864dd9 commit 04413c8

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

app/src/main/kotlin/com/aliucord/manager/manager/PathManager.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,14 @@ class PathManager(context: Context) {
5959
/**
6060
* Resolve a specific path for a cached injector.
6161
*/
62-
fun cachedInjectorDex(aliucordHash: SemVer) = externalCacheDir
62+
fun cachedInjectorDex(version: SemVer, custom: Boolean = false) = externalCacheDir
6363
.resolve("injector").apply { mkdirs() }
64-
.resolve("$aliucordHash.dex")
64+
.resolve("$version${if (custom) ".custom" else ""}.dex")
65+
66+
/**
67+
* Get all the versions of custom injector builds.
68+
*/
69+
fun customInjectorDexs() = listCustomFiles(externalCacheDir.resolve("injector"))
6570

6671
/**
6772
* Resolve a specific path for a versioned cached Aliuhook build

app/src/main/kotlin/com/aliucord/manager/patcher/steps/download/DownloadInjectorStep.kt

+40-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package com.aliucord.manager.patcher.steps.download
22

3+
import android.util.Log
34
import androidx.compose.runtime.Stable
5+
import com.aliucord.manager.BuildConfig
46
import com.aliucord.manager.R
7+
import com.aliucord.manager.manager.OverlayManager
58
import com.aliucord.manager.manager.PathManager
69
import com.aliucord.manager.network.utils.SemVer
710
import com.aliucord.manager.patcher.StepRunner
8-
import com.aliucord.manager.patcher.steps.base.DownloadStep
9-
import com.aliucord.manager.patcher.steps.base.IDexProvider
11+
import com.aliucord.manager.patcher.steps.base.*
1012
import com.aliucord.manager.patcher.steps.patch.ReorganizeDexStep
1113
import com.aliucord.manager.patcher.steps.prepare.FetchInfoStep
14+
import com.aliucord.manager.ui.components.dialogs.CustomComponentVersionPicker
1215
import org.koin.core.component.KoinComponent
1316
import org.koin.core.component.inject
1417

@@ -19,10 +22,12 @@ import org.koin.core.component.inject
1922
@Stable
2023
class DownloadInjectorStep : DownloadStep(), IDexProvider, KoinComponent {
2124
private val paths: PathManager by inject()
25+
private val overlays: OverlayManager by inject()
2226

2327
/**
2428
* This is populated right before the download starts (ref: [execute])
2529
*/
30+
private var isCustomVersion: Boolean = false
2631
lateinit var targetVersion: SemVer
2732
private set
2833

@@ -32,6 +37,39 @@ class DownloadInjectorStep : DownloadStep(), IDexProvider, KoinComponent {
3237
get() = paths.cachedInjectorDex(targetVersion)
3338

3439
override suspend fun execute(container: StepRunner) {
40+
var customVersions = mutableListOf<SemVer>()
41+
.apply { addAll(paths.customInjectorDexs()) }
42+
43+
// Prompt to select or manage custom versions instead of downloading
44+
if (customVersions.isNotEmpty()) {
45+
val selectedVersion = overlays.startComposableForResult { callback ->
46+
CustomComponentVersionPicker(
47+
componentTitle = "Injector",
48+
versions = customVersions,
49+
onConfirm = { version -> callback(version) },
50+
onDelete = { version ->
51+
try {
52+
paths.cachedInjectorDex(version, custom = true).delete()
53+
customVersions.remove(version)
54+
55+
// Dismiss if no custom versions left
56+
if (customVersions.isEmpty())
57+
callback(null)
58+
} catch (t: Throwable) {
59+
Log.e(BuildConfig.TAG, "Failed to delete custom component", t)
60+
}
61+
},
62+
onCancel = { callback(null) },
63+
)
64+
}
65+
if (selectedVersion != null) {
66+
isCustomVersion = true
67+
targetVersion = selectedVersion
68+
state = StepState.Skipped
69+
return
70+
}
71+
}
72+
3573
targetVersion = container.getStep<FetchInfoStep>()
3674
.data.injectorVersion
3775

0 commit comments

Comments
 (0)