diff --git a/app/src/main/kotlin/com/aliucord/manager/domain/manager/DownloadManager.kt b/app/src/main/kotlin/com/aliucord/manager/domain/manager/DownloadManager.kt index 4d33df2..705f1d3 100644 --- a/app/src/main/kotlin/com/aliucord/manager/domain/manager/DownloadManager.kt +++ b/app/src/main/kotlin/com/aliucord/manager/domain/manager/DownloadManager.kt @@ -38,6 +38,9 @@ class DownloadManager( suspend fun downloadKotlinDex(out: File): File = download(AliucordGithubService.KOTLIN_DEX_URL, out) + suspend fun downloadBootstrap(out: File): File = + download(AliucordGithubService.BOOTSTRAP_URL, out) + suspend fun download(url: String, out: File): File { out.parentFile?.mkdirs() diff --git a/app/src/main/kotlin/com/aliucord/manager/domain/repository/GithubRepository.kt b/app/src/main/kotlin/com/aliucord/manager/domain/repository/GithubRepository.kt index 0986270..7a1ad28 100644 --- a/app/src/main/kotlin/com/aliucord/manager/domain/repository/GithubRepository.kt +++ b/app/src/main/kotlin/com/aliucord/manager/domain/repository/GithubRepository.kt @@ -16,4 +16,5 @@ class GithubRepository( suspend fun getHermesRelease() = service.getLatestHermesRelease() suspend fun getAliucordNativeRelease() = service.getLatestAliucordNativeRelease() suspend fun getManagerReleases() = service.getManagerReleases() + suspend fun getLatestBootstrapCommit() = service.getLatestBootstrapCommit() } diff --git a/app/src/main/kotlin/com/aliucord/manager/network/service/AliucordGithubService.kt b/app/src/main/kotlin/com/aliucord/manager/network/service/AliucordGithubService.kt index 460aab6..6932c72 100644 --- a/app/src/main/kotlin/com/aliucord/manager/network/service/AliucordGithubService.kt +++ b/app/src/main/kotlin/com/aliucord/manager/network/service/AliucordGithubService.kt @@ -1,7 +1,9 @@ package com.aliucord.manager.network.service +import com.aliucord.manager.network.dto.Commit import com.aliucord.manager.network.dto.Version import com.aliucord.manager.network.utils.ApiResponse +import com.aliucord.manager.network.utils.transform import io.ktor.client.request.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -18,6 +20,16 @@ class AliucordGithubService( } } + suspend fun getLatestBootstrapCommit(): ApiResponse { + return withContext(Dispatchers.IO) { + http.request> { + url("https://api.github.com/repos/$ORG/$RN_REPO/commits?sha=builds&path=bootstrap.js&per_page=1") + }.transform { + it.single().sha + } + } + } + suspend fun getCommits(page: Int = 0) = github.getCommits(ORG, MAIN_REPO, page) suspend fun getLatestHermesRelease() = github.getLatestRelease(ORG, HERMES_REPO) suspend fun getLatestAliucordNativeRelease() = github.getLatestRelease(ORG, ALIUNATIVE_REPO) @@ -27,10 +39,12 @@ class AliucordGithubService( companion object { private const val ORG = "Aliucord" private const val MAIN_REPO = "Aliucord" + private const val RN_REPO = "AliucordRN" private const val HERMES_REPO = "Hermes" private const val ALIUNATIVE_REPO = "AliucordNative" private const val MANAGER_REPO = "AliucordManager" + const val BOOTSTRAP_URL = "https://raw.githubusercontent.com/$ORG/$RN_REPO/builds/bootstrap.js" const val KT_INJECTOR_URL = "https://raw.githubusercontent.com/$ORG/$MAIN_REPO/builds/Injector.dex" const val KOTLIN_DEX_URL = "https://raw.githubusercontent.com/$ORG/$MAIN_REPO/main/installer/android/app/src/main/assets/kotlin/classes.dex" } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/InstallViewModel.kt b/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/InstallViewModel.kt index e1cd089..de61551 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/InstallViewModel.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/InstallViewModel.kt @@ -153,6 +153,7 @@ class InstallViewModel( InstallStep.DL_RESC_APK, InstallStep.DL_HERMES, InstallStep.DL_ALIUNATIVE, + InstallStep.DL_BOOTSTRAP, if (preferences.replaceIcon) InstallStep.PATCH_APP_ICON else null, InstallStep.PATCH_MANIFEST, InstallStep.PATCH_DEX, @@ -292,6 +293,20 @@ class InstallViewModel( } } + // Download AliucordRN bootstrap + val aliucordBootstrap = step(InstallStep.DL_BOOTSTRAP) { + // Fetch latest commit for bootstrap.js + val commit = githubRepository.getLatestBootstrapCommit().getOrThrow() + cacheDir.resolve("bootstrap-$commit.js").also { + if (it.exists()) { + cached = true + return@also + } + + downloadManager.downloadBootstrap(it) + } + } + val apks = arrayOf(baseApkFile, libsApkFile, localeApkFile, resApkFile) // Replace app icons @@ -360,6 +375,9 @@ class InstallViewModel( // Add Aliucord's .dex and make it load first by being the first .dex zip.writeEntry("classes.dex", aliucordDexFile.readBytes()) + + // Add bootstrap + zip.writeEntry("bootstrap.js", aliucordBootstrap.readBytes(), ZipCompression.NONE) } } @@ -642,6 +660,7 @@ class InstallViewModel( DL_HERMES(InstallStepGroup.LIB_DL, R.string.install_step_dl_lib_hermes), DL_ALIUNATIVE(InstallStepGroup.LIB_DL, R.string.install_step_dl_lib_aliunative), + DL_BOOTSTRAP(InstallStepGroup.LIB_DL, R.string.install_step_dl_bootstrap), // Kotlin FETCH_KT_VERSION(InstallStepGroup.APK_DL, R.string.install_step_fetch_kt_version), diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 275dfad..cde20bc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -120,6 +120,7 @@ Downloading resource apk Downloading hermes library Downloading AliucordNative library + Downloading bootstrap Fetching target Discord version Downloading Discord APK Downloading Kotlin library