Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(YouTube Music): Add Settings patch #2708

Draft
wants to merge 2 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 32 additions & 1 deletion api/revanced-patches.api
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,10 @@ public final class app/revanced/patches/music/misc/androidauto/BypassCertificate
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}

public final class app/revanced/patches/music/misc/debugging/DebuggingPatch : app/revanced/patches/shared/misc/debugging/BaseDebuggingPatch {
public static final field INSTANCE Lapp/revanced/patches/music/misc/debugging/DebuggingPatch;
}

public final class app/revanced/patches/music/misc/gms/Constants {
public static final field INSTANCE Lapp/revanced/patches/music/misc/gms/Constants;
}
Expand All @@ -362,6 +366,26 @@ public final class app/revanced/patches/music/misc/integrations/IntegrationsPatc
public static final field INSTANCE Lapp/revanced/patches/music/misc/integrations/IntegrationsPatch;
}

public final class app/revanced/patches/music/misc/settings/SettingsPatch : app/revanced/patcher/patch/BytecodePatch, java/io/Closeable {
public static final field INSTANCE Lapp/revanced/patches/music/misc/settings/SettingsPatch;
public fun close ()V
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
public final fun newIntent (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;
}

public final class app/revanced/patches/music/misc/settings/SettingsPatch$PreferenceScreen : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen {
public static final field INSTANCE Lapp/revanced/patches/music/misc/settings/SettingsPatch$PreferenceScreen;
public fun commit (Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreen;)V
public final fun getMISC ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;
}

public final class app/revanced/patches/music/misc/settings/SettingsResourcePatch : app/revanced/patches/shared/misc/settings/BaseSettingsResourcePatch {
public static final field INSTANCE Lapp/revanced/patches/music/misc/settings/SettingsResourcePatch;
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
}

public final class app/revanced/patches/music/premium/backgroundplay/BackgroundPlayPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/music/premium/backgroundplay/BackgroundPlayPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
Expand Down Expand Up @@ -580,6 +604,13 @@ public final class app/revanced/patches/serviceportalbund/detection/root/RootDet
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}

public abstract class app/revanced/patches/shared/misc/debugging/BaseDebuggingPatch : app/revanced/patcher/patch/ResourcePatch {
public fun <init> (Lkotlin/reflect/KClass;Lkotlin/reflect/KClass;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/util/Set;Ljava/util/Set;)V
public synthetic fun <init> (Lkotlin/reflect/KClass;Lkotlin/reflect/KClass;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
}

public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
Expand Down Expand Up @@ -1473,7 +1504,7 @@ public final class app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}

public final class app/revanced/patches/youtube/misc/debugging/DebuggingPatch : app/revanced/patcher/patch/ResourcePatch {
public final class app/revanced/patches/youtube/misc/debugging/DebuggingPatch : app/revanced/patches/shared/misc/debugging/BaseDebuggingPatch {
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/debugging/DebuggingPatch;
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package app.revanced.patches.music.misc.debugging

import app.revanced.patches.music.misc.integrations.IntegrationsPatch
import app.revanced.patches.music.misc.settings.SettingsPatch
import app.revanced.patches.shared.misc.debugging.BaseDebuggingPatch

@Suppress("unused")
object DebuggingPatch : BaseDebuggingPatch(
integrationsPatch = IntegrationsPatch::class,
settingsPatch = SettingsPatch::class,
compatiblePackages = setOf(CompatiblePackage("com.google.android.apps.youtube.music")),
miscPreferenceScreen = SettingsPatch.PreferenceScreen.MISC,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package app.revanced.patches.music.misc.settings

import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.all.misc.packagename.ChangePackageNamePatch
import app.revanced.patches.all.misc.resources.AddResourcesPatch
import app.revanced.patches.music.misc.integrations.IntegrationsPatch
import app.revanced.patches.music.misc.settings.fingerprints.FullStackTraceActivityFingerprint
import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen
import app.revanced.patches.shared.misc.settings.preference.IntentPreference
import app.revanced.util.exception
import com.android.tools.smali.dexlib2.util.MethodUtil
import java.io.Closeable

@Patch(
description = "Adds settings for ReVanced to YouTube Music.",
dependencies = [
IntegrationsPatch::class,
SettingsResourcePatch::class,
AddResourcesPatch::class
]
)
object SettingsPatch : BytecodePatch(
setOf(FullStackTraceActivityFingerprint)
), Closeable {
private const val INTEGRATIONS_PACKAGE = "app/revanced/integrations/music"
private const val ACTIVITY_HOOK_CLASS_DESCRIPTOR = "L$INTEGRATIONS_PACKAGE/settings/FullStackTraceActivityHook;"

override fun execute(context: BytecodeContext) {
AddResourcesPatch(this::class)

FullStackTraceActivityFingerprint.result?.let { result ->
result.mutableMethod.addInstructions(
1,
"""
invoke-static { p0 }, $ACTIVITY_HOOK_CLASS_DESCRIPTOR->initialize(Landroid/app/Activity;)V
return-void
"""
)

// Remove other methods as they will break as the onCreate method is modified above.
result.mutableClass.apply {
methods.removeIf { it.name != "onCreate" && !MethodUtil.isConstructor(it) }
}
} ?: throw FullStackTraceActivityFingerprint.exception
}

/**
* Creates an intent to open ReVanced settings.
*/
fun newIntent(settingsName: String) = IntentPreference.Intent(
data = settingsName,
targetClass = "com.google.android.libraries.strictmode.penalties.notification.FullStackTraceActivity"
) {
// The package name change has to be reflected in the intent.
ChangePackageNamePatch.setOrGetFallbackPackageName("com.google.android.apps.youtube.music")
}

object PreferenceScreen : BasePreferenceScreen() {
val MISC = Screen("revanced_misc_screen")

override fun commit(screen: app.revanced.patches.shared.misc.settings.preference.PreferenceScreen) {
SettingsResourcePatch += screen
}
}

override fun close() = PreferenceScreen.close()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package app.revanced.patches.music.misc.settings

import app.revanced.patcher.data.ResourceContext
import app.revanced.patches.all.misc.resources.AddResourcesPatch
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
import app.revanced.patches.shared.misc.settings.BaseSettingsResourcePatch
import app.revanced.patches.shared.misc.settings.preference.IntentPreference
import app.revanced.util.ResourceGroup
import app.revanced.util.copyResources

object SettingsResourcePatch : BaseSettingsResourcePatch(
IntentPreference(
"revanced_settings",
intent = SettingsPatch.newIntent("revanced_settings_intent")
) to "settings_headers",
dependencies = setOf(
ResourceMappingPatch::class,
AddResourcesPatch::class,
)
) {
override fun execute(context: ResourceContext) {
super.execute(context)

AddResourcesPatch(this::class)

context.copyResources(
"settings",
ResourceGroup("layout", "revanced_settings_with_toolbar.xml")
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package app.revanced.patches.music.misc.settings.fingerprints

import app.revanced.patcher.fingerprint.MethodFingerprint

internal object FullStackTraceActivityFingerprint : MethodFingerprint(
returnType = "V",
parameters = listOf("Landroid/os/Bundle;"),
customFingerprint = { methodDef, _ ->
methodDef.definingClass.endsWith("/FullStackTraceActivity;") && methodDef.name == "onCreate"
}
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package app.revanced.patches.shared.misc.debugging

import app.revanced.patcher.PatchClass
import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patches.all.misc.resources.AddResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.BasePreference
import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference

abstract class BaseDebuggingPatch(
integrationsPatch: PatchClass,
settingsPatch: PatchClass,
compatiblePackages: Set<CompatiblePackage>,
// TODO: Settings patch should probably be abstracted
// so we do not have to pass it in as a dependency AND it's preference screen at the same time.
private val miscPreferenceScreen: BasePreferenceScreen.Screen,
private val additionalDebugPreferences: Set<BasePreference> = emptySet(),
additionalDependencies: Set<PatchClass> = emptySet()
) : ResourcePatch(
name = "Enable debugging",
description = "Adds options for debugging.",
dependencies = setOf(integrationsPatch, settingsPatch) + AddResourcesPatch::class + additionalDependencies,
compatiblePackages = compatiblePackages
) {
override fun execute(context: ResourceContext) {
AddResourcesPatch(BaseDebuggingPatch::class)

miscPreferenceScreen.addPreferences(
PreferenceScreen(
"revanced_debug_preference_screen",
preferences = setOf(
SwitchPreference("revanced_debug"),
SwitchPreference("revanced_debug_stacktrace"),
SwitchPreference("revanced_debug_toast_on_error")
) + additionalDebugPreferences
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.all.misc.resources.AddResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen
import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen
import app.revanced.patches.twitch.misc.integrations.IntegrationsPatch
import app.revanced.patches.twitch.misc.settings.fingerprints.MenuGroupsOnClickFingerprint
import app.revanced.patches.twitch.misc.settings.fingerprints.MenuGroupsUpdatedFingerprint
Expand Down Expand Up @@ -48,7 +48,7 @@ object SettingsPatch : BytecodePatch(
), Closeable {
private const val REVANCED_SETTINGS_MENU_ITEM_NAME = "RevancedSettings"
private const val REVANCED_SETTINGS_MENU_ITEM_ID = 0x7
private const val REVANCED_SETTINGS_MENU_ITEM_TITLE_RES = "revanced_settings"
private const val REVANCED_SETTINGS_MENU_ITEM_TITLE_RES = "revanced_settings_title"
private const val REVANCED_SETTINGS_MENU_ITEM_ICON_RES = "ic_settings"

private const val MENU_ITEM_ENUM_CLASS_DESCRIPTOR = "Ltv/twitch/android/feature/settings/menu/SettingsMenuItem;"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,26 @@
package app.revanced.patches.youtube.misc.debugging

import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.all.misc.resources.AddResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen
import app.revanced.patches.shared.misc.debugging.BaseDebuggingPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
import app.revanced.patches.youtube.misc.settings.SettingsPatch

@Patch(
name = "Enable debugging",
description = "Adds options for debugging.",
dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class],
compatiblePackages = [CompatiblePackage("com.google.android.youtube")]
)
@Suppress("unused")
object DebuggingPatch : ResourcePatch() {
object DebuggingPatch : BaseDebuggingPatch(
integrationsPatch = IntegrationsPatch::class,
settingsPatch = SettingsPatch::class,
compatiblePackages = setOf(CompatiblePackage("com.google.android.youtube")),
miscPreferenceScreen = SettingsPatch.PreferenceScreen.MISC,
additionalDebugPreferences = setOf(
SwitchPreference("revanced_debug_protobuffer")
),
additionalDependencies = setOf(AddResourcesPatch::class)
) {
override fun execute(context: ResourceContext) {
AddResourcesPatch(this::class)

SettingsPatch.PreferenceScreen.MISC.addPreferences(
PreferenceScreen(
"revanced_debug_preference_screen",
preferences = setOf(
SwitchPreference("revanced_debug"),
SwitchPreference("revanced_debug_protobuffer"),
SwitchPreference("revanced_debug_stacktrace"),
SwitchPreference("revanced_debug_toast_on_error")
)
)
)
super.execute(context)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,10 @@ object SettingsResourcePatch : BaseSettingsResourcePatch(
it.type == "string" && it.name == "app_theme_appearance_dark"
}!!.id

arrayOf(
context.copyResources(
"settings",
ResourceGroup("layout", "revanced_settings_with_toolbar.xml")
).forEach { resourceGroup ->
context.copyResources("settings", resourceGroup)
}
)

// Modify the manifest and add a data intent filter to the LicenseActivity.
// Some devices freak out if undeclared data is passed to an intent,
Expand Down
Loading
Loading