14 Commits

Author SHA1 Message Date
semantic-release-bot
7141d121dd chore: Release v1.1.0-dev.8 [skip ci]
# [1.1.0-dev.8](https://github.com/ReVanced/revanced-manager-downloaders/compare/v1.1.0-dev.7...v1.1.0-dev.8) (2025-07-08)

### Bug Fixes

* Prefixing APKs with `revanced-manager-` ([f4c91f0](f4c91f0455))
2025-07-08 19:13:03 +00:00
brosssh
f4c91f0455 fix: Prefixing APKs with revanced-manager- 2025-07-08 21:08:43 +02:00
semantic-release-bot
35a51ea76d chore: Release v1.1.0-dev.7 [skip ci]
# [1.1.0-dev.7](https://github.com/ReVanced/revanced-manager-downloaders/compare/v1.1.0-dev.6...v1.1.0-dev.7) (2025-07-08)

### Bug Fixes

* Refactor of shared module + minor fixes ([5f6c7e5](5f6c7e5333))
2025-07-08 11:28:29 +00:00
brosssh
5f6c7e5333 fix: Refactor of shared module + minor fixes 2025-07-08 13:23:26 +02:00
semantic-release-bot
e75f8da85a chore: Release v1.1.0-dev.6 [skip ci]
# [1.1.0-dev.6](https://github.com/ReVanced/revanced-manager-downloaders/compare/v1.1.0-dev.5...v1.1.0-dev.6) (2025-07-04)

### Bug Fixes

* Showing progress if downloading an APK + minor fixes ([d46f002](d46f002aa2))
2025-07-04 16:43:53 +00:00
brosssh
d46f002aa2 fix: Showing progress if downloading an APK + minor fixes 2025-07-04 18:37:26 +02:00
semantic-release-bot
dbc64e583a chore: Release v1.1.0-dev.5 [skip ci]
# [1.1.0-dev.5](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/compare/v1.1.0-dev.4...v1.1.0-dev.5) (2025-07-04)

### Bug Fixes

* Correctly removing bundle attributes from manifest ([6433d98](6433d98495))
2025-07-04 13:11:32 +00:00
brosssh
6433d98495 fix: Correctly removing bundle attributes from manifest 2025-07-04 15:07:24 +02:00
semantic-release-bot
bdd3efef96 chore: Release v1.1.0-dev.4 [skip ci]
# [1.1.0-dev.4](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/compare/v1.1.0-dev.3...v1.1.0-dev.4) (2025-07-03)

### Bug Fixes

* Add gradle sha256 checksum ([f259821](f259821f7c))
2025-07-03 12:48:29 +00:00
brosssh
f259821f7c fix: Add gradle sha256 checksum 2025-07-03 14:44:44 +02:00
semantic-release-bot
7b6138b45b chore: Release v1.1.0-dev.3 [skip ci]
# [1.1.0-dev.3](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/compare/v1.1.0-dev.2...v1.1.0-dev.3) (2025-07-03)

### Bug Fixes

* Fix release workflow (again) ([5bde601](5bde601bdd))
2025-07-03 12:31:14 +00:00
brosssh
5bde601bdd fix: Fix release workflow (again) 2025-07-03 14:27:15 +02:00
semantic-release-bot
9f5d7ac728 chore: Release v1.1.0-dev.2 [skip ci]
# [1.1.0-dev.2](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/compare/v1.1.0-dev.1...v1.1.0-dev.2) (2025-07-03)

### Bug Fixes

* Fix release workflow ([847bcdb](847bcdb8df))
2025-07-03 12:14:46 +00:00
brosssh
847bcdb8df fix: Fix release workflow 2025-07-03 14:11:01 +02:00
46 changed files with 191 additions and 409 deletions

View File

@@ -19,9 +19,6 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
with:
# Make sure the release step uses its own credentials:
# https://github.com/cycjimmy/semantic-release-action#private-packages
persist-credentials: false
submodules: true
- name: Setup Java
@@ -58,14 +55,14 @@ jobs:
run: |
echo "${{ secrets.KEYSTORE }}" | base64 --decode > "keystore.jks"}
- name: Release
- name: Semantic Release
uses: cycjimmy/semantic-release-action@v4
id: release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEYSTORE_ENTRY_ALIAS: ${{ secrets.KEYSTORE_ENTRY_ALIAS }}
KEYSTORE_ENTRY_PASSWORD: ${{ secrets.KEYSTORE_ENTRY_PASSWORD }}
run: |
npx semantic-release
- name: Attest
if: steps.release.outputs.new_release_published == 'true'

View File

@@ -32,10 +32,7 @@
{
"assets": [
{
"path": "play-store-downloader/build/outputs/apk/release/play-store-downloader-*.apk?(.asc)",
},
{
"path": "apkmirror-downloader/build/outputs/apk/release/apkmirror-downloader-*.apk?(.asc)",
"path": "downloaders/*/build/outputs/apk/release/revanced-manager-*.apk?(.asc)",
}
],
successComment: false

View File

@@ -1,3 +1,52 @@
# [1.1.0-dev.8](https://github.com/ReVanced/revanced-manager-downloaders/compare/v1.1.0-dev.7...v1.1.0-dev.8) (2025-07-08)
### Bug Fixes
* Prefixing APKs with `revanced-manager-` ([f4c91f0](https://github.com/ReVanced/revanced-manager-downloaders/commit/f4c91f0455e19e240a1527ff05f8f987fbf8e054))
# [1.1.0-dev.7](https://github.com/ReVanced/revanced-manager-downloaders/compare/v1.1.0-dev.6...v1.1.0-dev.7) (2025-07-08)
### Bug Fixes
* Refactor of shared module + minor fixes ([5f6c7e5](https://github.com/ReVanced/revanced-manager-downloaders/commit/5f6c7e53331d65b18898fb2997e2ff1ab5c30b87))
# [1.1.0-dev.6](https://github.com/ReVanced/revanced-manager-downloaders/compare/v1.1.0-dev.5...v1.1.0-dev.6) (2025-07-04)
### Bug Fixes
* Showing progress if downloading an APK + minor fixes ([d46f002](https://github.com/ReVanced/revanced-manager-downloaders/commit/d46f002aa234135ad54768d0bdf15eb9d17428c0))
# [1.1.0-dev.5](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/compare/v1.1.0-dev.4...v1.1.0-dev.5) (2025-07-04)
### Bug Fixes
* Correctly removing bundle attributes from manifest ([6433d98](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/commit/6433d984950582d36d29ef758325d50016a62ae8))
# [1.1.0-dev.4](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/compare/v1.1.0-dev.3...v1.1.0-dev.4) (2025-07-03)
### Bug Fixes
* Add gradle sha256 checksum ([f259821](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/commit/f259821f7c1075aeca89759cc7d73ae93d91922a))
# [1.1.0-dev.3](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/compare/v1.1.0-dev.2...v1.1.0-dev.3) (2025-07-03)
### Bug Fixes
* Fix release workflow (again) ([5bde601](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/commit/5bde601bdda26d1b7704172eab239ff9ae41fb20))
# [1.1.0-dev.2](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/compare/v1.1.0-dev.1...v1.1.0-dev.2) (2025-07-03)
### Bug Fixes
* Fix release workflow ([847bcdb](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/commit/847bcdb8dff27c3a0d012772a9946311cc9825d9))
# [1.1.0-dev.1](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/compare/v1.0.0...v1.1.0-dev.1) (2025-07-03)

View File

@@ -67,20 +67,21 @@ The collection of ReVanced downloaders.
## 🧑‍💻 Usage
- A downloader is managed as Android apps. Download and install the APK file from the releases page.
- Downloaders are managed as Android apps. Download and install the APK file from the [releases page](https://github.com/ReVanced/revanced-manager-downloaders/releases/).
- After installing, restart ReVanced Manager and enable the downloader in the settings.
- The downloader will now be usable.
### APMMirror Downloader
### APKMirror Downloader
This downloader will open an [APKMirror](https://www.apkmirror.com/) page where you can download the apk as you would normally do.
If the chosen file is a bundle (.apkm file), the downloader will automatically merge it into a .apk file.
If the chosen file is a bundle (`apkm` file), the downloader will automatically merge it into an `apk` file.
### Play Store Downloader
When you get prompted, log in to Google with your account. After that, you will be able to download apps from the Play Store.
> [!WARNING]
> Due to technical limitations, it is only possible to download the latest version of the app. If the ReVanced suggested version differs from the latest, the installation will fail.
> Due to technical limitations, it is only possible to download the latest version of the app. If the suggested version differs from the latest, the installation will fail.
> This plugin is not officially endorsed by or affiliated with Google. All usage is at your own risk.
## 📚 Everything else

View File

@@ -5,6 +5,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.parcelize) apply false
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.compose.compiler) apply false
@@ -26,7 +27,7 @@ subprojects {
}
}
if (project.path.endsWith("-downloader")) {
if (project.path.startsWith(":downloaders:")) {
apply(plugin = "com.android.application")
apply(plugin = "org.jetbrains.kotlin.android")
apply(plugin = "maven-publish")
@@ -76,7 +77,7 @@ subprojects {
applicationVariants.all {
outputs.all {
this as ApkVariantOutputImpl
outputFileName = "${project.name}-$version.apk"
outputFileName = "revanced-manager-${project.name}-downloader-$version.apk"
}
}
}
@@ -90,7 +91,7 @@ subprojects {
tasks.register("assembleReleaseSignApk") {
dependsOn("assembleRelease")
val apk = layout.buildDirectory.file("outputs/apk/release/${project.name}-$version.apk")
val apk = layout.buildDirectory.file("outputs/apk/release/revanced-manager-${project.name}-downloader-$version.apk")
inputs.file(apk).withPropertyName("input")
outputs.file(apk.map { it.asFile.resolveSibling("${it.asFile.name}.asc") })

View File

@@ -1,110 +0,0 @@
@file:Suppress("Unused")
package app.revanced.manager.plugin.downloader.apkmirror
import android.net.Uri
import android.os.Parcelable
import android.util.Log
import app.revanced.manager.plugin.downloader.DownloadUrl
import app.revanced.manager.plugin.downloader.Downloader
import app.revanced.manager.plugin.downloader.download
import app.revanced.manager.plugin.downloader.webview.runWebView
import app.revanced.manager.plugin.utils.Merger
import com.reandroid.apk.APKLogger
import kotlinx.parcelize.Parcelize
import java.io.File
import java.net.URI
import java.nio.file.Files
import java.util.zip.ZipFile
import kotlin.io.path.ExperimentalPathApi
import kotlin.io.path.deleteRecursively
import kotlin.io.path.outputStream
@Parcelize
class ApkMirrorApp(
val downloadUrl: DownloadUrl,
val packageName: String
) : Parcelable
private object ArscLogger : APKLogger {
const val TAG = "ARSCLib"
override fun logMessage(msg: String) {
Log.i(TAG, msg)
}
override fun logError(msg: String, tr: Throwable?) {
Log.e(TAG, msg, tr)
}
override fun logVerbose(msg: String) {
Log.v(TAG, msg)
}
}
@OptIn(ExperimentalPathApi::class)
val ApkMirrorDownloader = Downloader<ApkMirrorApp> {
get { packageName, version ->
ApkMirrorApp(
downloadUrl = runWebView("APKMirror") {
download { url, _, userAgent ->
finish(
DownloadUrl(
url,
mapOf("User-Agent" to userAgent)
)
)
}
with(Uri.Builder()) {
scheme("https")
authority("www.apkmirror.com")
mapOf(
"post_type" to "app_release",
"searchtype" to "apk",
"s" to (version?.let { "$packageName $it" } ?: packageName),
"bundles%5B%5D" to "apk_files" // bundles[]
).forEach { (key, value) ->
appendQueryParameter(key, value)
}
build().toString()
}
},
packageName = packageName
) to version
}
download { app, outputStream ->
val workingDir = Files.createTempDirectory("apkmirror_dl")
val downloadedFile = workingDir.resolve("${app.packageName}.apk").also {
it.outputStream().use { output ->
app.downloadUrl.toDownloadResult().first.copyTo(output)
}
}
try {
if (URI(app.downloadUrl.url).path.substringAfterLast('/').endsWith(".apk")) {
Files.copy(downloadedFile, outputStream)
} else {
val xapkWorkingDir = workingDir.resolve("xapk").also { it.toFile().mkdirs() }
ZipFile(downloadedFile.toString()).use { zip ->
zip.entries().asSequence().forEach { entry ->
xapkWorkingDir.resolve(entry.name).also { it.parent.toFile().mkdirs() }.also { outputFile ->
zip.getInputStream(entry).use { input ->
File(outputFile.toString()).outputStream().use { output ->
input.copyTo(output)
}
}
}
}
}
Merger.merge(xapkWorkingDir, ArscLogger).writeApk(outputStream)
}
} finally {
workingDir.deleteRecursively()
}
}
}

View File

@@ -10,7 +10,6 @@ android {
}
dependencies {
implementation(project(":arsclib"))
implementation(project(":shared"))
}
}

View File

@@ -0,0 +1,76 @@
@file:Suppress("Unused")
package app.revanced.manager.plugin.downloader.apkmirror
import android.net.Uri
import app.revanced.manager.plugin.downloader.DownloadUrl
import app.revanced.manager.plugin.downloader.Downloader
import app.revanced.manager.plugin.downloader.download
import app.revanced.manager.plugin.downloader.webview.runWebView
import app.revanced.manager.plugin.shared.Merger
import java.net.URI
import java.nio.file.Files
import java.util.UUID
import java.util.zip.ZipFile
import kotlin.io.path.ExperimentalPathApi
import kotlin.io.path.deleteRecursively
import kotlin.io.path.outputStream
@OptIn(ExperimentalPathApi::class)
val ApkMirrorDownloader = Downloader<DownloadUrl> {
get { packageName, version ->
runWebView("APKMirror") {
download { url, _, userAgent ->
finish(
DownloadUrl(
url,
mapOf("User-Agent" to userAgent)
)
)
}
Uri.Builder()
.scheme("https")
.authority("www.apkmirror.com")
.appendQueryParameter("post_type", "app_release")
.appendQueryParameter("searchtype", "apk")
.appendQueryParameter("s", version?.let { "$packageName $it" } ?: packageName)
.appendQueryParameter("bundles%5B%5D" /* bundles[] */, "apk_files")
.toString()
} to version
}
download { downloadUrl, outputStream ->
val workingDir = Files.createTempDirectory("apkmirror_dl")
try {
if (URI(downloadUrl.url).path.substringAfterLast('/').endsWith(".apk")) {
val (inputStream, size) = downloadUrl.toDownloadResult()
inputStream.use {
if (size != null) reportSize(size)
it.copyTo(outputStream)
}
} else {
val downloadedFile = workingDir.resolve(UUID.randomUUID().toString()).also {
it.outputStream().use { output ->
downloadUrl.toDownloadResult().first.copyTo(output)
}
}
val xapkWorkingDir = workingDir.resolve("xapk").also { it.toFile().mkdirs() }
ZipFile(downloadedFile.toString()).use { zip ->
zip.entries().asSequence().forEach { entry ->
xapkWorkingDir.resolve(entry.name).also { it.parent.toFile().mkdirs() }.also { outputFile ->
zip.getInputStream(entry).use { input ->
Files.copy(input, outputFile)
}
}
}
}
Merger.merge(xapkWorkingDir).writeApk(outputStream)
}
} finally {
workingDir.deleteRecursively()
}
}
}

View File

@@ -12,7 +12,6 @@ android {
dependencies {
implementation(libs.gplayapi)
implementation(project(":arsclib"))
implementation(project(":shared"))
implementation(libs.ktor.core)

View File

@@ -7,11 +7,10 @@ import app.revanced.manager.plugin.downloader.play.store.data.Credentials
import app.revanced.manager.plugin.downloader.play.store.data.Http
import app.revanced.manager.plugin.downloader.play.store.service.CredentialProviderService
import app.revanced.manager.plugin.downloader.play.store.ui.AuthActivity
import app.revanced.manager.plugin.utils.Merger
import app.revanced.manager.plugin.shared.Merger
import com.aurora.gplayapi.data.models.File as GPlayFile
import com.aurora.gplayapi.helpers.AppDetailsHelper
import com.aurora.gplayapi.helpers.PurchaseHelper
import com.reandroid.apk.APKLogger
import io.ktor.client.request.url
import kotlinx.parcelize.Parcelize
import java.nio.file.Files
@@ -25,22 +24,6 @@ import kotlin.io.path.outputStream
private val allowedFileTypes = arrayOf(GPlayFile.FileType.BASE, GPlayFile.FileType.SPLIT)
const val LOG_TAG = "PlayStorePlugin"
private object ArscLogger : APKLogger {
const val TAG = "ARSCLib"
override fun logMessage(msg: String) {
Log.i(TAG, msg)
}
override fun logError(msg: String, tr: Throwable?) {
Log.e(TAG, msg, tr)
}
override fun logVerbose(msg: String) {
Log.v(TAG, msg)
}
}
@Parcelize
class GPlayApp(
val files: List<GPlayFile>
@@ -109,7 +92,7 @@ val playStoreDownloader = Downloader<GPlayApp> {
if (apkFiles.size == 1)
Files.copy(apkFiles.first(), outputStream)
else
Merger.merge(apkDir, ArscLogger).writeApk(outputStream)
Merger.merge(apkDir).writeApk(outputStream)
} finally {
apkDir.deleteRecursively()

View File

@@ -21,4 +21,4 @@ kotlin.code.style = official
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass = true
version = 1.1.0-dev.1
version = 1.1.0-dev.8

View File

@@ -2,7 +2,6 @@
agp = "8.7.3"
kotlin = "2.1.10"
gplayapi = "3.4.4"
arsclib = "1.3.5"
kotlinx-coroutines-core = "1.9.0"
ktor = "2.3.9"
@@ -18,7 +17,6 @@ plugin-api = "1.0.0"
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines-core" }
plugin-api = { group = "app.revanced", name = "revanced-manager-downloader-api", version.ref = "plugin-api" }
gplayapi = { group = "com.auroraoss", name = "gplayapi", version.ref = "gplayapi" }
arsclib = { group = "io.github.reandroid", name = "ARSCLib", version.ref = "arsclib" }
compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
compose-ui = { group = "androidx.compose.ui", name = "ui" }
compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "ui-tooling" }
@@ -31,6 +29,7 @@ ktor-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "k
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
android-library = { id = "com.android.library", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version = "2.0.21" }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

View File

@@ -2,5 +2,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -19,6 +19,6 @@ include(":shared")
include(":arsclib")
file("downloaders").listFiles()
?.forEach {
include(":${it.name}")
project(":${it.name}").projectDir = file("downloaders/${it.name}")
include(":downloaders:${it.name}")
project(":downloaders:${it.name}").projectDir = file("downloaders/${it.name}")
}

View File

@@ -1,8 +1,27 @@
plugins {
kotlin("jvm")
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
}
android {
namespace = "app.revanced.manager.plugin.shared"
compileSdk = 35
defaultConfig {
minSdk = 26
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
dependencies {
implementation(libs.kotlinx.coroutines.core)
implementation(project(":arsclib"))
}
api(project(":arsclib"))
}

View File

@@ -1,5 +1,6 @@
package app.revanced.manager.plugin.utils
package app.revanced.manager.plugin.shared
import android.util.Log
import com.reandroid.apk.APKLogger
import com.reandroid.apk.ApkBundle
import com.reandroid.apk.ApkModule
@@ -9,15 +10,31 @@ import java.nio.file.Path
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
private object ArscLogger : APKLogger {
const val TAG = "ARSCLib"
override fun logMessage(msg: String) {
Log.i(TAG, msg)
}
override fun logError(msg: String, tr: Throwable?) {
Log.e(TAG, msg, tr)
}
override fun logVerbose(msg: String) {
Log.v(TAG, msg)
}
}
class Merger {
companion object Factory {
suspend fun merge(apkDir: Path, arscLogger: APKLogger): ApkModule {
suspend fun merge(apkDir: Path): ApkModule {
val closeables = mutableSetOf<Closeable>()
try {
// Merge splits
val merged = withContext(Dispatchers.Default) {
with(ApkBundle()) {
setAPKLogger(arscLogger)
setAPKLogger(ArscLogger)
loadApkDirectory(apkDir.toFile())
closeables.addAll(modules)
mergeModules().also(closeables::add)
@@ -35,7 +52,9 @@ class Merger {
arrayOf(
AndroidManifest.NAME_requiredSplitTypes,
AndroidManifest.NAME_splitTypes
).forEach(manifestElement::removeAttributesWithName)
).forEach {
manifestElement.removeAttributeIf{ attribute -> attribute.name == it }
}
val pattern = "^com\\.android\\.(stamp|vending)\\.".toRegex()
applicationElement.removeElementsIf { element ->

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature android:name="app.revanced.manager.plugin.downloader" />
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
tools:targetApi="35">
<meta-data
android:name="app.revanced.manager.plugin.downloader.class"
android:value="app.revanced.manager.plugin.downloader.apkmirror.APKMirrorDownloaderKt" />
</application>
</manifest>

View File

@@ -1,17 +0,0 @@
@file:Suppress("Unused")
package app.revanced.manager.plugin.downloader.apkmirror
import android.net.Uri
import app.revanced.manager.plugin.downloader.webview.WebViewDownloader
val apkMirrorDownloader = WebViewDownloader { packageName, version ->
Uri.Builder()
.scheme("https")
.authority("www.apkmirror.com")
.appendQueryParameter("post_type", "app_release")
.appendQueryParameter("searchtype", "apk")
.appendQueryParameter("s", version?.let { "$packageName $it" } ?: packageName)
.appendQueryParameter("bundles%5B%5D" /* bundles[] */, "apk_files")
.toString()
}

View File

@@ -1,170 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@@ -1,30 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@@ -1,3 +0,0 @@
<resources>
<string name="app_name">ReVanced Manager: APKMirror downloader</string>
</resources>