Compare commits

...

21 Commits

Author SHA1 Message Date
semantic-release-bot
59af825d0a chore(release): 2.52.1 [skip ci]
## [2.52.1](https://github.com/revanced/revanced-patches/compare/v2.52.0...v2.52.1) (2022-09-08)

### Bug Fixes

* multiple compatible pkgs on readme ([3f82a13](04ffffbdf2))
2022-09-08 20:05:20 +00:00
Sculas
04ffffbdf2 fix: multiple compatible pkgs on readme 2022-09-08 22:03:30 +02:00
semantic-release-bot
ecc131fa4f chore(release): 2.52.0 [skip ci]
# [2.52.0](https://github.com/revanced/revanced-patches/compare/v2.51.3...v2.52.0) (2022-09-08)

### Features

* add deprecated & options to patches.json ([759315b](a4f1d3558e))
2022-09-08 19:43:07 +00:00
Sculas
a4f1d3558e feat: add deprecated & options to patches.json 2022-09-08 21:40:59 +02:00
Sculas
4cbd58721d build: update patcher dependency 2022-09-08 21:10:41 +02:00
semantic-release-bot
7cfe43e666 chore(release): 2.51.3 [skip ci]
## [2.51.3](https://github.com/revanced/revanced-patches/compare/v2.51.2...v2.51.3) (2022-09-08)

### Bug Fixes

* cleanup & trigger release for ThemePatch ([8d25b21](c93d7bc212)), closes [#447](https://github.com/revanced/revanced-patches/issues/447) [revanced/revanced-patcher#99](https://github.com/revanced/revanced-patcher/issues/99)
2022-09-08 16:37:40 +00:00
Sculas
c93d7bc212 fix: cleanup & trigger release for ThemePatch
Closes #447
Closes revanced/revanced-patcher#99
2022-09-08 18:35:08 +02:00
Sculas
c28fd5cf20 Merge remote-tracking branch 'origin/main' into main 2022-09-08 17:06:32 +02:00
Sculas
069f754d51 refactor: set amoled theme default for ThemePatch 2022-09-08 17:06:16 +02:00
semantic-release-bot
cba04cf5a6 chore(release): 2.51.2 [skip ci]
## [2.51.2](https://github.com/revanced/revanced-patches/compare/v2.51.1...v2.51.2) (2022-09-08)
2022-09-08 15:03:32 +00:00
Sculas
5e358c7319 refactor: update to patcher 4.2.2 2022-09-08 17:01:28 +02:00
Sculas
ce69471684 build: update patcher dependency 2022-09-08 16:59:29 +02:00
semantic-release-bot
a0981dda9d chore(release): 2.51.1 [skip ci]
## [2.51.1](https://github.com/revanced/revanced-patches/compare/v2.51.0...v2.51.1) (2022-09-08)

### Bug Fixes

* wrap theme option ([150c173](6073181ee1))
2022-09-08 11:47:28 +00:00
Sculas
6073181ee1 fix: wrap theme option 2022-09-08 13:45:28 +02:00
Sculas
522587321c build: update patcher 2022-09-08 13:45:10 +02:00
semantic-release-bot
b16748794e chore(release): 2.51.0 [skip ci]
# [2.51.0](https://github.com/revanced/revanced-patches/compare/v2.50.8...v2.51.0) (2022-09-08)

### Features

* Theme Patch ([#440](https://github.com/revanced/revanced-patches/issues/440)) ([f3b92ca](01e9a396d6))
2022-09-08 09:57:04 +00:00
Sculas
01e9a396d6 feat: Theme Patch (#440)
* feat: Theme Patch

* refactor: deprecate AmoledPatch

* Update src/main/kotlin/app/revanced/patches/youtube/layout/theme/patch/ThemePatch.kt

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>

* refactor: apply requested changes

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-08 11:55:06 +02:00
semantic-release-bot
86fcd4d475 chore(release): 2.50.8 [skip ci]
## [2.50.8](https://github.com/revanced/revanced-patches/compare/v2.50.7...v2.50.8) (2022-09-08)
2022-09-08 09:34:38 +00:00
Sculas
8bbc744114 build: update patcher 2022-09-08 11:32:45 +02:00
semantic-release-bot
d7a4ad76ea chore(release): 2.50.7 [skip ci]
## [2.50.7](https://github.com/revanced/revanced-patches/compare/v2.50.6...v2.50.7) (2022-09-08)
2022-09-08 08:28:01 +00:00
E85Addict
7e6ee73908 build: bump patcher dependency version (#443) 2022-09-08 10:25:56 +02:00
13 changed files with 312 additions and 61 deletions

View File

@@ -1,3 +1,44 @@
## [2.52.1](https://github.com/revanced/revanced-patches/compare/v2.52.0...v2.52.1) (2022-09-08)
### Bug Fixes
* multiple compatible pkgs on readme ([3f82a13](https://github.com/revanced/revanced-patches/commit/3f82a1349fb11b1152ac10d76deb930f7325b7c9))
# [2.52.0](https://github.com/revanced/revanced-patches/compare/v2.51.3...v2.52.0) (2022-09-08)
### Features
* add deprecated & options to patches.json ([759315b](https://github.com/revanced/revanced-patches/commit/759315be1b23a6b3655fc87b56a8974ebac648cc))
## [2.51.3](https://github.com/revanced/revanced-patches/compare/v2.51.2...v2.51.3) (2022-09-08)
### Bug Fixes
* cleanup & trigger release for ThemePatch ([8d25b21](https://github.com/revanced/revanced-patches/commit/8d25b214e297797092432b5fe1a4ede1f42115c8)), closes [#447](https://github.com/revanced/revanced-patches/issues/447) [revanced/revanced-patcher#99](https://github.com/revanced/revanced-patcher/issues/99)
## [2.51.2](https://github.com/revanced/revanced-patches/compare/v2.51.1...v2.51.2) (2022-09-08)
## [2.51.1](https://github.com/revanced/revanced-patches/compare/v2.51.0...v2.51.1) (2022-09-08)
### Bug Fixes
* wrap theme option ([150c173](https://github.com/revanced/revanced-patches/commit/150c173adce31d9984d6feca694b472649233056))
# [2.51.0](https://github.com/revanced/revanced-patches/compare/v2.50.8...v2.51.0) (2022-09-08)
### Features
* Theme Patch ([#440](https://github.com/revanced/revanced-patches/issues/440)) ([f3b92ca](https://github.com/revanced/revanced-patches/commit/f3b92cab5a057ce605b6d9e75e3b99161bf1422c))
## [2.50.8](https://github.com/revanced/revanced-patches/compare/v2.50.7...v2.50.8) (2022-09-08)
## [2.50.7](https://github.com/revanced/revanced-patches/compare/v2.50.6...v2.50.7) (2022-09-08)
## [2.50.6](https://github.com/revanced/revanced-patches/compare/v2.50.5...v2.50.6) (2022-09-07) ## [2.50.6](https://github.com/revanced/revanced-patches/compare/v2.50.5...v2.50.6) (2022-09-07)
## [2.50.5](https://github.com/revanced/revanced-patches/compare/v2.50.4...v2.50.5) (2022-09-07) ## [2.50.5](https://github.com/revanced/revanced-patches/compare/v2.50.4...v2.50.5) (2022-09-07)

View File

@@ -12,16 +12,23 @@ This section explains the JSON format for the [patches.json](patches.json) file.
The file contains an array of objects, each object representing a patch. The object contains the following properties: The file contains an array of objects, each object representing a patch. The object contains the following properties:
| key | description | | key | description |
|-------------------------------|------------------------------------------------------------------------------------------------------------------| |-------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `name` | The name of the patch. | | `name` | The name of the patch. |
| `description` | The description of the patch. | | `description` | The description of the patch. |
| `version` | The version of the patch. | | `version` | The version of the patch. |
| `excluded` | Whether a patch is excluded by default. If `true`, the patch must never be included by default. | | `excluded` | Whether the patch is excluded by default. If `true`, the patch must never be included by default. |
| `dependencies` | An array of dependencies, which are patch names. | | `deprecated` | Whether the patch is deprecated. |
| `compatiblePackages` | An array of packages compatible with this patch. | | `options` | An array of options for this patch. |
| `compatiblePackages.name` | The name of the package. | | `options.key` | The key of the option. |
| `compatiblePackages.versions` | An array of versions of the package compatible with this patch. If empty, all versions are seemingly compatible. | | `options.title` | The title of the option. |
| `options.description` | The description of the option. |
| `options.required` | Whether the option is required. |
| `options.choices?` | An array of choices of the option. This may be `null` if this option has no choices. The element type of this array may be any type. It can be a `String`, `Int` or something else. |
| `dependencies` | An array of dependencies, which are patch names. |
| `compatiblePackages` | An array of packages compatible with this patch. |
| `compatiblePackages.name` | The name of the package. |
| `compatiblePackages.versions` | An array of versions of the package compatible with this patch. If empty, all versions are seemingly compatible. |
Example: Example:
@@ -32,6 +39,8 @@ Example:
"description": "Adds the ability to remember the video quality you chose in the video quality flyout.", "description": "Adds the ability to remember the video quality you chose in the video quality flyout.",
"version": "0.0.1", "version": "0.0.1",
"excluded": false, "excluded": false,
"deprecated": false,
"options": [],
"dependencies": [ "dependencies": [
"integrations", "integrations",
"video-id-hook" "video-id-hook"
@@ -46,24 +55,67 @@ Example:
"17.27.39", "17.27.39",
"17.28.34", "17.28.34",
"17.29.34", "17.29.34",
"17.32.35" "17.32.35",
"17.33.42"
] ]
} }
] ]
}, },
{ {
"name": "client-spoof", "name": "theme",
"description": "Spoofs the YouTube or Vanced client to prevent playback issues.", "description": "Enables a custom theme.",
"version": "0.0.1", "version": "0.0.1",
"excluded": false, "excluded": false,
"dependencies": [], "deprecated": false,
"options": [
{
"key": "theme",
"title": "Theme",
"description": "Select a theme.",
"required": true,
"choices": [
"Amoled"
]
}
],
"dependencies": [
"locale-config-fix"
],
"compatiblePackages": [ "compatiblePackages": [
{ {
"name": "com.google.android.youtube", "name": "com.google.android.youtube",
"versions": [] "versions": []
}
]
},
{
"name": "custom-branding",
"description": "Changes the YouTube launcher icon and name to your choice (defaults to ReVanced).",
"version": "0.0.1",
"excluded": false,
"deprecated": false,
"options": [
{
"key": "appName",
"title": "Application Name",
"description": "The name of the application it will show on your home screen.",
"required": true,
"choices": null
}, },
{ {
"name": "com.vanced.android.youtube", "key": "appIconPath",
"title": "Application Icon Path",
"description": "A path to the icon of the application.",
"required": false,
"choices": null
}
],
"dependencies": [
"locale-config-fix"
],
"compatiblePackages": [
{
"name": "com.google.android.youtube",
"versions": [] "versions": []
} }
] ]

101
README.md
View File

@@ -64,6 +64,16 @@ The official Patch bundle provided by ReVanced and the community.
| `tiktok-ads` | Removes ads from TikTok. | all | | `tiktok-ads` | Removes ads from TikTok. | all |
</details> </details>
### 📦 `com.zhiliaoapp.musically`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `tiktok-download` | Remove restrictions on downloads video. | all |
| `tiktok-seekbar` | Show progress bar for all video. | all |
| `tiktok-ads` | Removes ads from TikTok. | all |
</details>
### 📦 `com.google.android.youtube` ### 📦 `com.google.android.youtube`
<details> <details>
@@ -81,6 +91,7 @@ The official Patch bundle provided by ReVanced and the community.
| `custom-branding` | Changes the YouTube launcher icon and name to your choice (defaults to ReVanced). | all | | `custom-branding` | Changes the YouTube launcher icon and name to your choice (defaults to ReVanced). | all |
| `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 17.33.42 | | `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 17.33.42 |
| `old-quality-layout` | Enables the original quality flyout menu. | 17.33.42 | | `old-quality-layout` | Enables the original quality flyout menu. | 17.33.42 |
| `theme` | Enables a custom theme. | all |
| `hide-shorts-button` | Hides the shorts button on the navigation bar. | 17.33.42 | | `hide-shorts-button` | Hides the shorts button on the navigation bar. | 17.33.42 |
| `hide-watermark` | Hides creator's watermarks on videos. | 17.33.42 | | `hide-watermark` | Hides creator's watermarks on videos. | 17.33.42 |
| `sponsorblock` | Integrate SponsorBlock. | 17.33.42 | | `sponsorblock` | Integrate SponsorBlock. | 17.33.42 |
@@ -101,6 +112,14 @@ The official Patch bundle provided by ReVanced and the community.
| `hide-infocard-suggestions` | Hides infocards in videos. | 17.33.42 | | `hide-infocard-suggestions` | Hides infocards in videos. | 17.33.42 |
</details> </details>
### 📦 `com.vanced.android.youtube`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
</details>
## 📝 JSON Format ## 📝 JSON Format
@@ -109,16 +128,23 @@ This section explains the JSON format for the [patches.json](patches.json) file.
The file contains an array of objects, each object representing a patch. The object contains the following properties: The file contains an array of objects, each object representing a patch. The object contains the following properties:
| key | description | | key | description |
|-------------------------------|------------------------------------------------------------------------------------------------------------------| |-------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `name` | The name of the patch. | | `name` | The name of the patch. |
| `description` | The description of the patch. | | `description` | The description of the patch. |
| `version` | The version of the patch. | | `version` | The version of the patch. |
| `excluded` | Whether a patch is excluded by default. If `true`, the patch must never be included by default. | | `excluded` | Whether the patch is excluded by default. If `true`, the patch must never be included by default. |
| `dependencies` | An array of dependencies, which are patch names. | | `deprecated` | Whether the patch is deprecated. |
| `compatiblePackages` | An array of packages compatible with this patch. | | `options` | An array of options for this patch. |
| `compatiblePackages.name` | The name of the package. | | `options.key` | The key of the option. |
| `compatiblePackages.versions` | An array of versions of the package compatible with this patch. If empty, all versions are seemingly compatible. | | `options.title` | The title of the option. |
| `options.description` | The description of the option. |
| `options.required` | Whether the option is required. |
| `options.choices?` | An array of choices of the option. This may be `null` if this option has no choices. The element type of this array may be any type. It can be a `String`, `Int` or something else. |
| `dependencies` | An array of dependencies, which are patch names. |
| `compatiblePackages` | An array of packages compatible with this patch. |
| `compatiblePackages.name` | The name of the package. |
| `compatiblePackages.versions` | An array of versions of the package compatible with this patch. If empty, all versions are seemingly compatible. |
Example: Example:
@@ -129,6 +155,8 @@ Example:
"description": "Adds the ability to remember the video quality you chose in the video quality flyout.", "description": "Adds the ability to remember the video quality you chose in the video quality flyout.",
"version": "0.0.1", "version": "0.0.1",
"excluded": false, "excluded": false,
"deprecated": false,
"options": [],
"dependencies": [ "dependencies": [
"integrations", "integrations",
"video-id-hook" "video-id-hook"
@@ -143,24 +171,67 @@ Example:
"17.27.39", "17.27.39",
"17.28.34", "17.28.34",
"17.29.34", "17.29.34",
"17.32.35" "17.32.35",
"17.33.42"
] ]
} }
] ]
}, },
{ {
"name": "client-spoof", "name": "theme",
"description": "Spoofs the YouTube or Vanced client to prevent playback issues.", "description": "Enables a custom theme.",
"version": "0.0.1", "version": "0.0.1",
"excluded": false, "excluded": false,
"dependencies": [], "deprecated": false,
"options": [
{
"key": "theme",
"title": "Theme",
"description": "Select a theme.",
"required": true,
"choices": [
"Amoled"
]
}
],
"dependencies": [
"locale-config-fix"
],
"compatiblePackages": [ "compatiblePackages": [
{ {
"name": "com.google.android.youtube", "name": "com.google.android.youtube",
"versions": [] "versions": []
}
]
},
{
"name": "custom-branding",
"description": "Changes the YouTube launcher icon and name to your choice (defaults to ReVanced).",
"version": "0.0.1",
"excluded": false,
"deprecated": false,
"options": [
{
"key": "appName",
"title": "Application Name",
"description": "The name of the application it will show on your home screen.",
"required": true,
"choices": null
}, },
{ {
"name": "com.vanced.android.youtube", "key": "appIconPath",
"title": "Application Icon Path",
"description": "A path to the icon of the application.",
"required": false,
"choices": null
}
],
"dependencies": [
"locale-config-fix"
],
"compatiblePackages": [
{
"name": "com.google.android.youtube",
"versions": [] "versions": []
} }
] ]

View File

@@ -20,7 +20,7 @@ repositories {
} }
dependencies { dependencies {
implementation("app.revanced:revanced-patcher:4.1.0") implementation("app.revanced:revanced-patcher:4.2.3")
implementation("app.revanced:multidexlib2:2.5.2.r2") implementation("app.revanced:multidexlib2:2.5.2.r2")
// Required for meta // Required for meta

View File

@@ -1,2 +1,2 @@
kotlin.code.style = official kotlin.code.style = official
version = 2.50.6 version = 2.52.1

File diff suppressed because one or more lines are too long

View File

@@ -3,14 +3,17 @@ package app.revanced.meta.json
import app.revanced.meta.Bundle import app.revanced.meta.Bundle
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
import app.revanced.patcher.extensions.PatchExtensions.dependencies import app.revanced.patcher.extensions.PatchExtensions.dependencies
import app.revanced.patcher.extensions.PatchExtensions.deprecated
import app.revanced.patcher.extensions.PatchExtensions.description import app.revanced.patcher.extensions.PatchExtensions.description
import app.revanced.patcher.extensions.PatchExtensions.include import app.revanced.patcher.extensions.PatchExtensions.include
import app.revanced.patcher.extensions.PatchExtensions.options
import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.extensions.PatchExtensions.version import app.revanced.patcher.extensions.PatchExtensions.version
import com.google.gson.Gson import app.revanced.patcher.patch.PatchOption
import com.google.gson.GsonBuilder
import java.io.File import java.io.File
private val gson = Gson() private val gson = GsonBuilder().serializeNulls().create()
fun generateJson(bundle: Bundle) { fun generateJson(bundle: Bundle) {
val patches = bundle.map { val patches = bundle.map {
@@ -19,6 +22,20 @@ fun generateJson(bundle: Bundle) {
it.description ?: "This patch has no description.", it.description ?: "This patch has no description.",
it.version ?: "0.0.0", it.version ?: "0.0.0",
!it.include, !it.include,
it.deprecated != null,
it.options?.map { option ->
Option(
option.key,
option.title,
option.description,
option.required,
option.let { lo ->
if (lo is PatchOption.ListOption<*>) {
lo.options.toMutableList().toTypedArray()
} else null
}
)
}?.toTypedArray() ?: emptyArray(),
it.dependencies?.map { dep -> it.dependencies?.map { dep ->
dep.java.patchName dep.java.patchName
}?.toTypedArray() ?: emptyArray(), }?.toTypedArray() ?: emptyArray(),

View File

@@ -7,6 +7,8 @@ data class JsonPatch(
val description: String, val description: String,
val version: String, val version: String,
val excluded: Boolean, val excluded: Boolean,
val deprecated: Boolean,
val options: Array<Option>,
val dependencies: Array<String>, val dependencies: Array<String>,
val compatiblePackages: Array<CompatiblePackage>, val compatiblePackages: Array<CompatiblePackage>,
) )
@@ -14,4 +16,12 @@ data class JsonPatch(
data class CompatiblePackage( data class CompatiblePackage(
val name: String, val name: String,
val versions: Array<String>, val versions: Array<String>,
)
data class Option(
val key: String,
val title: String,
val description: String,
val required: Boolean,
val choices: Array<*>?,
) )

View File

@@ -17,13 +17,11 @@ fun generateText(bundle: Bundle) {
val output = StringBuilder() val output = StringBuilder()
val packages = mutableMapOf<String, MutableList<Class<out Patch<Data>>>>() val packages = mutableMapOf<String, MutableList<Class<out Patch<Data>>>>()
bundle.map { for (patch in bundle) {
val packageName = it.compatiblePackages?.first()?.name!! patch.compatiblePackages?.forEach { pkg ->
if (!packages.contains(packageName)) { if (!packages.contains(pkg.name)) packages[pkg.name] = mutableListOf()
packages[packageName] = mutableListOf() packages[pkg.name]!!.add(patch)
} }
packages[packageName]?.add(it)
} }
for (pkg in packages) { for (pkg in packages) {

View File

@@ -2,16 +2,16 @@ package app.revanced.patches.youtube.layout.amoled.patch
import app.revanced.patcher.annotation.Description import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.PatchDeprecated
import app.revanced.patcher.annotation.Version import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.ResourceData import app.revanced.patcher.data.impl.ResourceData
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.ResourcePatch import app.revanced.patcher.patch.impl.ResourcePatch
import app.revanced.patches.youtube.layout.amoled.annotations.AmoledCompatibility import app.revanced.patches.youtube.layout.amoled.annotations.AmoledCompatibility
import app.revanced.patches.youtube.layout.theme.patch.ThemePatch
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
import org.w3c.dom.Element
@Patch @Patch
@DependsOn([FixLocaleConfigErrorPatch::class]) @DependsOn([FixLocaleConfigErrorPatch::class])
@@ -19,24 +19,10 @@ import org.w3c.dom.Element
@Description("Enables pure black theme.") @Description("Enables pure black theme.")
@AmoledCompatibility @AmoledCompatibility
@Version("0.0.1") @Version("0.0.1")
@PatchDeprecated("Theme patch already includes the Amoled theme.", ThemePatch::class)
class AmoledPatch : ResourcePatch() { class AmoledPatch : ResourcePatch() {
override fun execute(data: ResourceData): PatchResult { override fun execute(data: ResourceData): PatchResult {
data.xmlEditor["res/values/colors.xml"].use { editor -> ThemePatch.theme = ThemePatch.Themes.Amoled.name
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element return ThemePatch().execute(data)
for (i in 0 until resourcesNode.childNodes.length) {
val node = resourcesNode.childNodes.item(i)
if (node !is Element) continue
val element = resourcesNode.childNodes.item(i) as Element
element.textContent = when (element.getAttribute("name")) {
"yt_black1", "yt_black1_opacity95", "yt_black2", "yt_black3", "yt_black4", "yt_status_bar_background_dark" -> "@android:color/black"
"yt_selected_nav_label_dark" -> "#ffdf0000"
else -> continue
}
}
}
return PatchResultSuccess()
} }
} }

View File

@@ -75,7 +75,7 @@ class CustomBrandingPatch : ResourcePatch() {
} }
companion object : OptionsContainer() { companion object : OptionsContainer() {
private var appName: String by option( private var appName: String? by option(
PatchOption.StringOption( PatchOption.StringOption(
key = "appName", key = "appName",
default = "YouTube ReVanced", default = "YouTube ReVanced",

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.youtube.layout.theme.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.google.android.youtube")])
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class ThemeCompatibility

View File

@@ -0,0 +1,67 @@
package app.revanced.patches.youtube.layout.theme.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.ResourceData
import app.revanced.patcher.patch.*
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.ResourcePatch
import app.revanced.patches.youtube.layout.theme.annotations.ThemeCompatibility
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
import org.w3c.dom.Element
@Patch
@DependsOn([FixLocaleConfigErrorPatch::class])
@Name("theme")
@Description("Enables a custom theme.")
@ThemeCompatibility
@Version("0.0.1")
class ThemePatch : ResourcePatch() {
override fun execute(data: ResourceData): PatchResult {
val theme = Themes.of(theme!!) ?: return PatchResultError("Theme '$theme' not found.")
data.xmlEditor["res/values/colors.xml"].use { editor ->
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
for (i in 0 until resourcesNode.childNodes.length) {
val node = resourcesNode.childNodes.item(i) as? Element ?: continue
node.textContent = theme.apply(node.getAttribute("name")) ?: continue
}
}
return PatchResultSuccess()
}
companion object : OptionsContainer() {
var theme: String? by option(
PatchOption.StringListOption(
key = "theme",
default = Themes.Amoled.name,
options = Themes.names,
title = "Theme",
description = "Select a theme.",
required = true
)
)
}
enum class Themes(val apply: (String) -> String?) {
Amoled({ attr ->
when (attr) {
"yt_black1", "yt_black1_opacity95", "yt_black2", "yt_black3", "yt_black4",
"yt_status_bar_background_dark" -> "@android:color/black"
"yt_selected_nav_label_dark" -> "#ffdf0000"
else -> null
}
});
companion object {
val names = values().map { it.name }
fun of(name: String) = values().firstOrNull { it.name == name }
}
}
}