7 Commits

Author SHA1 Message Date
Pun Butrach
0a5593a792 docs: Use American spelling (#17) 2025-12-14 21:40:05 +01:00
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
44 changed files with 157 additions and 400 deletions

View File

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

View File

@@ -1,3 +1,24 @@
# [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) # [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)

View File

@@ -67,20 +67,21 @@ The collection of ReVanced downloaders.
## 🧑‍💻 Usage ## 🧑‍💻 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. - After installing, restart ReVanced Manager and enable the downloader in the settings.
- The downloader will now be usable. - 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. 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 ### 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. 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] > [!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 ## 📚 Everything else
@@ -108,7 +109,7 @@ Follow the steps below to build ReVanced Manager Downloaders:
> gpr.key = key > gpr.key = key
> ``` > ```
## 📜 Licence ## 📜 License
This project is licensed under the GPLv3 licence. This project is licensed under the GPLv3 licence.
Please see the [license file](LICENSE) for more information. Please see the [license file](LICENSE) for more information.

View File

@@ -5,6 +5,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
alias(libs.plugins.android.application) apply false 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.parcelize) apply false
alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.compose.compiler) 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 = "com.android.application")
apply(plugin = "org.jetbrains.kotlin.android") apply(plugin = "org.jetbrains.kotlin.android")
apply(plugin = "maven-publish") apply(plugin = "maven-publish")
@@ -76,7 +77,7 @@ subprojects {
applicationVariants.all { applicationVariants.all {
outputs.all { outputs.all {
this as ApkVariantOutputImpl this as ApkVariantOutputImpl
outputFileName = "${project.name}-$version.apk" outputFileName = "revanced-manager-${project.name}-downloader-$version.apk"
} }
} }
} }
@@ -90,7 +91,7 @@ subprojects {
tasks.register("assembleReleaseSignApk") { tasks.register("assembleReleaseSignApk") {
dependsOn("assembleRelease") 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") inputs.file(apk).withPropertyName("input")
outputs.file(apk.map { it.asFile.resolveSibling("${it.asFile.name}.asc") }) 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 { dependencies {
implementation(project(":arsclib"))
implementation(project(":shared")) 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 { dependencies {
implementation(libs.gplayapi) implementation(libs.gplayapi)
implementation(project(":arsclib"))
implementation(project(":shared")) implementation(project(":shared"))
implementation(libs.ktor.core) 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.data.Http
import app.revanced.manager.plugin.downloader.play.store.service.CredentialProviderService 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.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.data.models.File as GPlayFile
import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.AppDetailsHelper
import com.aurora.gplayapi.helpers.PurchaseHelper import com.aurora.gplayapi.helpers.PurchaseHelper
import com.reandroid.apk.APKLogger
import io.ktor.client.request.url import io.ktor.client.request.url
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import java.nio.file.Files import java.nio.file.Files
@@ -25,22 +24,6 @@ import kotlin.io.path.outputStream
private val allowedFileTypes = arrayOf(GPlayFile.FileType.BASE, GPlayFile.FileType.SPLIT) private val allowedFileTypes = arrayOf(GPlayFile.FileType.BASE, GPlayFile.FileType.SPLIT)
const val LOG_TAG = "PlayStorePlugin" 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 @Parcelize
class GPlayApp( class GPlayApp(
val files: List<GPlayFile> val files: List<GPlayFile>
@@ -109,7 +92,7 @@ val playStoreDownloader = Downloader<GPlayApp> {
if (apkFiles.size == 1) if (apkFiles.size == 1)
Files.copy(apkFiles.first(), outputStream) Files.copy(apkFiles.first(), outputStream)
else else
Merger.merge(apkDir, ArscLogger).writeApk(outputStream) Merger.merge(apkDir).writeApk(outputStream)
} finally { } finally {
apkDir.deleteRecursively() 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, # resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library # thereby reducing the size of the R class for that library
android.nonTransitiveRClass = true android.nonTransitiveRClass = true
version = 1.1.0-dev.5 version = 1.1.0-dev.8

View File

@@ -2,7 +2,6 @@
agp = "8.7.3" agp = "8.7.3"
kotlin = "2.1.10" kotlin = "2.1.10"
gplayapi = "3.4.4" gplayapi = "3.4.4"
arsclib = "1.3.5"
kotlinx-coroutines-core = "1.9.0" kotlinx-coroutines-core = "1.9.0"
ktor = "2.3.9" 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" } 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" } plugin-api = { group = "app.revanced", name = "revanced-manager-downloader-api", version.ref = "plugin-api" }
gplayapi = { group = "com.auroraoss", name = "gplayapi", version.ref = "gplayapi" } 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-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
compose-ui = { group = "androidx.compose.ui", name = "ui" } compose-ui = { group = "androidx.compose.ui", name = "ui" }
compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "ui-tooling" } 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] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } 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" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

View File

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

View File

@@ -1,8 +1,27 @@
plugins { 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 { dependencies {
implementation(libs.kotlinx.coroutines.core) 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.APKLogger
import com.reandroid.apk.ApkBundle import com.reandroid.apk.ApkBundle
import com.reandroid.apk.ApkModule import com.reandroid.apk.ApkModule
@@ -9,15 +10,31 @@ import java.nio.file.Path
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext 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 { class Merger {
companion object Factory { companion object Factory {
suspend fun merge(apkDir: Path, arscLogger: APKLogger): ApkModule { suspend fun merge(apkDir: Path): ApkModule {
val closeables = mutableSetOf<Closeable>() val closeables = mutableSetOf<Closeable>()
try { try {
// Merge splits // Merge splits
val merged = withContext(Dispatchers.Default) { val merged = withContext(Dispatchers.Default) {
with(ApkBundle()) { with(ApkBundle()) {
setAPKLogger(arscLogger) setAPKLogger(ArscLogger)
loadApkDirectory(apkDir.toFile()) loadApkDirectory(apkDir.toFile())
closeables.addAll(modules) closeables.addAll(modules)
mergeModules().also(closeables::add) mergeModules().also(closeables::add)

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>