Skip to content
This repository has been archived by the owner on Jul 7, 2024. It is now read-only.

Commit

Permalink
Add most patching steps
Browse files Browse the repository at this point in the history
  • Loading branch information
wingio committed Jan 25, 2024
1 parent c7c05c0 commit 493760b
Show file tree
Hide file tree
Showing 13 changed files with 200 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.beefers.vendetta.manager.installer.step.base
package dev.beefers.vendetta.manager.installer.step

import androidx.annotation.StringRes
import androidx.compose.runtime.Stable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.beefers.vendetta.manager.installer.step.base
package dev.beefers.vendetta.manager.installer.step

import androidx.annotation.StringRes
import dev.beefers.vendetta.manager.R
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.beefers.vendetta.manager.installer.step.base
package dev.beefers.vendetta.manager.installer.step

import android.content.Context
import android.os.Environment
Expand All @@ -8,6 +8,7 @@ import dev.beefers.vendetta.manager.installer.step.download.DownloadBaseStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadLangStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadLibsStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadResourcesStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadVendettaStep
import dev.beefers.vendetta.manager.utils.DiscordVersion
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
Expand Down Expand Up @@ -45,6 +46,7 @@ class StepRunner(
DownloadLibsStep(discordCacheDir, discordVersion.toVersionCode()),
DownloadLangStep(discordCacheDir, discordVersion.toVersionCode()),
DownloadResourcesStep(discordCacheDir, discordVersion.toVersionCode()),
DownloadVendettaStep()
)

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.beefers.vendetta.manager.installer.step.base
package dev.beefers.vendetta.manager.installer.step

enum class StepStatus {
ONGOING,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package dev.beefers.vendetta.manager.installer.step.download

import androidx.compose.runtime.Stable
import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.installer.step.download.base.DownloadStep
import java.io.File

@Stable
class DownloadBaseStep(
dir: File,
version: String
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package dev.beefers.vendetta.manager.installer.step.download

import android.os.Build
import androidx.compose.runtime.Stable
import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.installer.step.download.base.DownloadStep
import java.io.File

@Stable
class DownloadLangStep(
dir: File,
version: String
): DownloadStep() {

override val nameRes = R.string.step_dl_base
override val nameRes = R.string.step_dl_lang

override val destination = dir.resolve("config.en-$version.apk")

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package dev.beefers.vendetta.manager.installer.step.download

import android.os.Build
import androidx.compose.runtime.Stable
import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.installer.step.download.base.DownloadStep
import java.io.File

@Stable
class DownloadLibsStep(
dir: File,
version: String
): DownloadStep() {

private val arch = Build.SUPPORTED_ABIS.first().replace("-v", "_v")

override val nameRes = R.string.step_dl_base
override val nameRes = R.string.step_dl_lib

override val destination = dir.resolve("config.$arch-$version.apk")

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package dev.beefers.vendetta.manager.installer.step.download

import android.os.Build
import androidx.compose.runtime.Stable
import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.installer.step.download.base.DownloadStep
import java.io.File

@Stable
class DownloadResourcesStep(
dir: File,
version: String
): DownloadStep() {

override val nameRes = R.string.step_dl_base
override val nameRes = R.string.step_dl_res

override val destination = dir.resolve("config.xxhdpi-$version.apk")

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package dev.beefers.vendetta.manager.installer.step.download

import android.os.Build
import androidx.compose.runtime.Stable
import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.installer.step.download.base.DownloadStep
import java.io.File

@Stable
class DownloadVendettaStep: DownloadStep() {

override val nameRes = R.string.step_dl_vd

override val destination = preferenceManager.moduleLocation

override val url: String = "https://github.com/vendetta-mod/VendettaXposed/releases/latest/download/app-release.apk"

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.domain.manager.DownloadManager
import dev.beefers.vendetta.manager.domain.manager.DownloadResult
import dev.beefers.vendetta.manager.domain.manager.PreferenceManager
import dev.beefers.vendetta.manager.installer.step.base.Step
import dev.beefers.vendetta.manager.installer.step.base.StepGroup
import dev.beefers.vendetta.manager.installer.step.base.StepRunner
import dev.beefers.vendetta.manager.installer.step.base.StepStatus
import dev.beefers.vendetta.manager.installer.step.Step
import dev.beefers.vendetta.manager.installer.step.StepGroup
import dev.beefers.vendetta.manager.installer.step.StepRunner
import dev.beefers.vendetta.manager.installer.step.StepStatus
import dev.beefers.vendetta.manager.utils.mainThread
import dev.beefers.vendetta.manager.utils.showToast
import kotlinx.coroutines.Dispatchers
Expand All @@ -20,7 +20,6 @@ import java.io.File
@Stable
abstract class DownloadStep: Step() {

private val preferenceManager: PreferenceManager by inject()
private val downloadManager: DownloadManager by inject()
private val context: Context by inject()

Expand All @@ -29,6 +28,7 @@ abstract class DownloadStep: Step() {

override val group: StepGroup = StepGroup.DL

val preferenceManager: PreferenceManager by inject()
val baseUrl = preferenceManager.mirror.baseUrl

open suspend fun verify() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package dev.beefers.vendetta.manager.installer.step.patching

import com.github.diamondminer88.zip.ZipReader
import com.github.diamondminer88.zip.ZipWriter
import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.domain.manager.PreferenceManager
import dev.beefers.vendetta.manager.installer.step.Step
import dev.beefers.vendetta.manager.installer.step.StepGroup
import dev.beefers.vendetta.manager.installer.step.StepRunner
import dev.beefers.vendetta.manager.installer.step.download.DownloadBaseStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadLangStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadLibsStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadResourcesStep
import dev.beefers.vendetta.manager.installer.util.ManifestPatcher
import org.koin.core.component.inject

class PatchManifestsStep : Step() {

private val preferences: PreferenceManager by inject()

override val group = StepGroup.PATCHING
override val nameRes = R.string.step_patch_manifests

override suspend fun run(runner: StepRunner) {
val baseApk = runner.getCompletedStep<DownloadBaseStep>().destination
val libsApk = runner.getCompletedStep<DownloadLibsStep>().destination
val langApk = runner.getCompletedStep<DownloadLangStep>().destination
val resApk = runner.getCompletedStep<DownloadResourcesStep>().destination

arrayOf(baseApk, libsApk, langApk, resApk).forEach { apk ->
val manifest = ZipReader(apk)
.use { zip -> zip.openEntry("AndroidManifest.xml")?.read() }
?: throw IllegalStateException("No manifest in ${apk.name}")

ZipWriter(apk, true).use { zip ->
val patchedManifestBytes = if (apk == baseApk) {
ManifestPatcher.patchManifest(
manifestBytes = manifest,
packageName = preferences.packageName,
appName = preferences.appName,
debuggable = preferences.debuggable,
)
} else {
ManifestPatcher.renamePackage(manifest, preferences.packageName)
}

zip.deleteEntry(
"AndroidManifest.xml",
apk == libsApk
) // Preserve alignment in libs apk
zip.writeEntry("AndroidManifest.xml", patchedManifestBytes)
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package dev.beefers.vendetta.manager.installer.step.patching

import android.os.Build
import com.github.diamondminer88.zip.ZipCompression
import com.github.diamondminer88.zip.ZipReader
import com.github.diamondminer88.zip.ZipWriter
import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.domain.manager.PreferenceManager
import dev.beefers.vendetta.manager.installer.step.Step
import dev.beefers.vendetta.manager.installer.step.StepGroup
import dev.beefers.vendetta.manager.installer.step.StepRunner
import dev.beefers.vendetta.manager.installer.step.download.DownloadBaseStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadLangStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadLibsStep
import dev.beefers.vendetta.manager.installer.step.download.DownloadResourcesStep
import dev.beefers.vendetta.manager.installer.util.ManifestPatcher
import dev.beefers.vendetta.manager.installer.util.Signer
import org.koin.core.component.inject
import java.io.File

class PresignApksStep(
private val signedDir: File
) : Step() {

override val group = StepGroup.PATCHING
override val nameRes = R.string.step_signing

override suspend fun run(runner: StepRunner) {
val baseApk = runner.getCompletedStep<DownloadBaseStep>().destination
val libsApk = runner.getCompletedStep<DownloadLibsStep>().destination
val langApk = runner.getCompletedStep<DownloadLangStep>().destination
val resApk = runner.getCompletedStep<DownloadResourcesStep>().destination

signedDir.mkdirs()
val apks = listOf(baseApk, libsApk, langApk, resApk)

// Align resources.arsc due to targeting api 30 for silent install
if(Build.VERSION.SDK_INT >= 30) {
for (file in apks) {
val bytes = ZipReader(file).use {
if (it.entryNames.contains("resources.arsc")) {
it.openEntry("resources.arsc")?.read()
} else {
null
}
} ?: continue

ZipWriter(file, true).use {
it.deleteEntry("resources.arsc", true)
it.writeEntry("resources.arsc", bytes, ZipCompression.NONE, 4096)
}
}
}

apks.forEach {
Signer.signApk(it, File(signedDir, it.name))
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package dev.beefers.vendetta.manager.installer.step.patching

import android.content.Context
import com.github.diamondminer88.zip.ZipWriter
import dev.beefers.vendetta.manager.R
import dev.beefers.vendetta.manager.installer.step.Step
import dev.beefers.vendetta.manager.installer.step.StepGroup
import dev.beefers.vendetta.manager.installer.step.StepRunner
import dev.beefers.vendetta.manager.installer.step.download.DownloadBaseStep
import org.koin.core.component.inject

class ReplaceIconStep : Step() {

val context: Context by inject()

override val group = StepGroup.PATCHING
override val nameRes = R.string.step_change_icon

override suspend fun run(runner: StepRunner) {
val baseApk = runner.getCompletedStep<DownloadBaseStep>().destination

ZipWriter(baseApk, true).use { apk ->
val mipmaps =
arrayOf("mipmap-xhdpi-v4", "mipmap-xxhdpi-v4", "mipmap-xxxhdpi-v4")
val icons = arrayOf(
"ic_logo_foreground.png",
"ic_logo_square.png",
"ic_logo_foreground.png"
)

for (icon in icons) {
val newIcon = context.assets.open("icons/$icon")
.use { it.readBytes() }

for (mipmap in mipmaps) {
val path = "res/$mipmap/$icon"
apk.deleteEntry(path)
apk.writeEntry(path, newIcon)
}
}
}
}

}

0 comments on commit 493760b

Please sign in to comment.