chore: merge branch dev to main (#1441)
				
					
				
			This commit is contained in:
		
						commit
						67e18b6fde
					
				
							
								
								
									
										15
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| 
						 | 
					@ -1,3 +1,18 @@
 | 
				
			||||||
 | 
					# [2.153.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.152.1-dev.1...v2.153.0-dev.1) (2023-01-07)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **youtube/remember-video-quality:** simplify settings switch state description ([9bd42ec](https://github.com/revanced/revanced-patches/commit/9bd42ec1a1b54b103cd2550211515acdaf90e9de))
 | 
				
			||||||
 | 
					* **youtube:** `remember-playback-rate` patch ([177e908](https://github.com/revanced/revanced-patches/commit/177e908dba260f184a2835b73b834563ca9c29fd))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [2.152.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.152.0...v2.152.1-dev.1) (2023-01-07)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* **youtube/general-ads:** move settings to correct preference screens ([cde45fc](https://github.com/revanced/revanced-patches/commit/cde45fca769eddea64072f13f836d46560a4a89a))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# [2.152.0](https://github.com/revanced/revanced-patches/compare/v2.151.0...v2.152.0) (2023-01-04)
 | 
					# [2.152.0](https://github.com/revanced/revanced-patches/compare/v2.151.0...v2.152.0) (2023-01-04)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,6 +48,7 @@ The official Patch bundle provided by ReVanced and the community.
 | 
				
			||||||
| `old-quality-layout` | Enables the original video quality flyout in the video player settings | 17.49.37 |
 | 
					| `old-quality-layout` | Enables the original video quality flyout in the video player settings | 17.49.37 |
 | 
				
			||||||
| `open-links-directly` | Bypasses URL redirects and opens links directly inside YouTube app. | 17.49.37 |
 | 
					| `open-links-directly` | Bypasses URL redirects and opens links directly inside YouTube app. | 17.49.37 |
 | 
				
			||||||
| `premium-heading` | Shows premium branding on the home screen. | all |
 | 
					| `premium-heading` | Shows premium branding on the home screen. | all |
 | 
				
			||||||
 | 
					| `remember-playback-rate` | Adds the ability to remember the playback rate you chose in the video playback rate flyout. | 17.49.37 |
 | 
				
			||||||
| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 17.49.37 |
 | 
					| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 17.49.37 |
 | 
				
			||||||
| `remove-player-button-background` | Removes the background from the video player buttons. | 17.49.37 |
 | 
					| `remove-player-button-background` | Removes the background from the video player buttons. | 17.49.37 |
 | 
				
			||||||
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 17.49.37 |
 | 
					| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 17.49.37 |
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,2 +1,2 @@
 | 
				
			||||||
kotlin.code.style = official
 | 
					kotlin.code.style = official
 | 
				
			||||||
version = 2.152.0
 | 
					version = 2.153.0-dev.1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
					@ -7,22 +7,21 @@ import app.revanced.patcher.patch.PatchResultSuccess
 | 
				
			||||||
import app.revanced.patcher.patch.ResourcePatch
 | 
					import app.revanced.patcher.patch.ResourcePatch
 | 
				
			||||||
import app.revanced.patcher.patch.annotations.DependsOn
 | 
					import app.revanced.patcher.patch.annotations.DependsOn
 | 
				
			||||||
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
 | 
					import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
 | 
				
			||||||
import app.revanced.patches.shared.settings.preference.impl.InputType
 | 
					import app.revanced.patches.shared.settings.preference.impl.*
 | 
				
			||||||
import app.revanced.patches.shared.settings.preference.impl.StringResource
 | 
					 | 
				
			||||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
 | 
					 | 
				
			||||||
import app.revanced.patches.shared.settings.preference.impl.TextPreference
 | 
					 | 
				
			||||||
import app.revanced.patches.youtube.ad.general.annotation.GeneralAdsCompatibility
 | 
					import app.revanced.patches.youtube.ad.general.annotation.GeneralAdsCompatibility
 | 
				
			||||||
import app.revanced.patches.youtube.misc.litho.filter.patch.LithoFilterPatch
 | 
					import app.revanced.patches.youtube.misc.litho.filter.patch.LithoFilterPatch
 | 
				
			||||||
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
 | 
					import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
 | 
				
			||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
 | 
					import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
 | 
				
			||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch.PreferenceScreen
 | 
					import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch.PreferenceScreen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@DependsOn(dependencies = [
 | 
					@DependsOn(
 | 
				
			||||||
 | 
					    dependencies = [
 | 
				
			||||||
        FixLocaleConfigErrorPatch::class,
 | 
					        FixLocaleConfigErrorPatch::class,
 | 
				
			||||||
        LithoFilterPatch::class,
 | 
					        LithoFilterPatch::class,
 | 
				
			||||||
        SettingsPatch::class,
 | 
					        SettingsPatch::class,
 | 
				
			||||||
        ResourceMappingPatch::class
 | 
					        ResourceMappingPatch::class
 | 
				
			||||||
])
 | 
					    ]
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@GeneralAdsCompatibility
 | 
					@GeneralAdsCompatibility
 | 
				
			||||||
@Version("0.0.1")
 | 
					@Version("0.0.1")
 | 
				
			||||||
class GeneralAdsResourcePatch : ResourcePatch {
 | 
					class GeneralAdsResourcePatch : ResourcePatch {
 | 
				
			||||||
| 
						 | 
					@ -32,20 +31,42 @@ class GeneralAdsResourcePatch : ResourcePatch {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    override fun execute(context: ResourceContext): PatchResult {
 | 
					    override fun execute(context: ResourceContext): PatchResult {
 | 
				
			||||||
        PreferenceScreen.ADS.addPreferences(
 | 
					        PreferenceScreen.LAYOUT.addPreferences(
 | 
				
			||||||
            SwitchPreference(
 | 
					            SwitchPreference(
 | 
				
			||||||
                "revanced_adremover_ad_removal",
 | 
					                "revanced_adremover_separator",
 | 
				
			||||||
                StringResource("revanced_adremover_ad_removal_enabled_title", "Hide general ads"),
 | 
					                StringResource("revanced_adremover_separator_title", "Hide gray separator"),
 | 
				
			||||||
                true,
 | 
					                true,
 | 
				
			||||||
                StringResource("revanced_adremover_ad_removal_enabled_summary_on", "General ads are hidden"),
 | 
					                StringResource("revanced_adremover_separator_summary_on", "Gray separators are hidden"),
 | 
				
			||||||
                StringResource("revanced_adremover_ad_removal_enabled_summary_off", "General ads are shown")
 | 
					                StringResource("revanced_adremover_separator_summary_off", "Gray separators are shown")
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            SwitchPreference(
 | 
					            SwitchPreference(
 | 
				
			||||||
                "revanced_adremover_buttoned",
 | 
					                "revanced_adremover_hide_channel_guidelines",
 | 
				
			||||||
                StringResource("revanced_adremover_buttoned_enabled_title", "Hide buttoned ad"),
 | 
					                StringResource("revanced_adremover_hide_channel_guidelines_enabled_title", "Hide channel guidelines"),
 | 
				
			||||||
                true,
 | 
					                true,
 | 
				
			||||||
                StringResource("revanced_adremover_buttoned_enabled_summary_on", "Buttoned ads are hidden"),
 | 
					                StringResource(
 | 
				
			||||||
                StringResource("revanced_adremover_buttoned_enabled_summary_off", "Buttoned ads are shown")
 | 
					                    "revanced_adremover_hide_channel_guidelines_enabled_summary_on",
 | 
				
			||||||
 | 
					                    "Channel guidelines are hidden"
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                StringResource(
 | 
				
			||||||
 | 
					                    "revanced_adremover_hide_channel_guidelines_enabled_summary_off",
 | 
				
			||||||
 | 
					                    "Channel guidelines are shown"
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            SwitchPreference(
 | 
				
			||||||
 | 
					                "revanced_adremover_chapter_teaser",
 | 
				
			||||||
 | 
					                StringResource(
 | 
				
			||||||
 | 
					                    "revanced_adremover_chapter_teaser_enabled_title",
 | 
				
			||||||
 | 
					                    "Hide chapter teaser under videos"
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                true,
 | 
				
			||||||
 | 
					                StringResource(
 | 
				
			||||||
 | 
					                    "revanced_adremover_chapter_teaser_enabled_summary_on",
 | 
				
			||||||
 | 
					                    "Chapter teasers are hidden"
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                StringResource(
 | 
				
			||||||
 | 
					                    "revanced_adremover_chapter_teaser_enabled_summary_off",
 | 
				
			||||||
 | 
					                    "Chapter teasers are shown"
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            SwitchPreference(
 | 
					            SwitchPreference(
 | 
				
			||||||
                "revanced_adremover_merchandise",
 | 
					                "revanced_adremover_merchandise",
 | 
				
			||||||
| 
						 | 
					@ -104,17 +125,32 @@ class GeneralAdsResourcePatch : ResourcePatch {
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            SwitchPreference(
 | 
					            SwitchPreference(
 | 
				
			||||||
                "revanced_adremover_subscribers_community_guidelines_removal",
 | 
					                "revanced_adremover_subscribers_community_guidelines_removal",
 | 
				
			||||||
                StringResource("revanced_adremover_subscribers_community_guidelines_enabled_title", "Hide subscribers community guidelines"),
 | 
					                StringResource(
 | 
				
			||||||
 | 
					                    "revanced_adremover_subscribers_community_guidelines_enabled_title",
 | 
				
			||||||
 | 
					                    "Hide subscribers community guidelines"
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
                true,
 | 
					                true,
 | 
				
			||||||
                StringResource("revanced_adremover_subscribers_community_guidelines_enabled_summary_on", "Subscribers community guidelines are hidden"),
 | 
					                StringResource(
 | 
				
			||||||
                StringResource("revanced_adremover_subscribers_community_guidelines_enabled_summary_off", "Subscribers community guidelines are shown")
 | 
					                    "revanced_adremover_subscribers_community_guidelines_enabled_summary_on",
 | 
				
			||||||
 | 
					                    "Subscribers community guidelines are hidden"
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                StringResource(
 | 
				
			||||||
 | 
					                    "revanced_adremover_subscribers_community_guidelines_enabled_summary_off",
 | 
				
			||||||
 | 
					                    "Subscribers community guidelines are shown"
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            SwitchPreference(
 | 
					            SwitchPreference(
 | 
				
			||||||
                "revanced_adremover_channel_member_shelf_removal",
 | 
					                "revanced_adremover_channel_member_shelf_removal",
 | 
				
			||||||
                StringResource("revanced_adremover_channel_member_shelf_enabled_title", "Hide channel member shelf"),
 | 
					                StringResource("revanced_adremover_channel_member_shelf_enabled_title", "Hide channel member shelf"),
 | 
				
			||||||
                true,
 | 
					                true,
 | 
				
			||||||
                StringResource("revanced_adremover_channel_member_shelf_enabled_summary_on", "Channel member shelf is hidden"),
 | 
					                StringResource(
 | 
				
			||||||
                StringResource("revanced_adremover_channel_member_shelf_enabled_summary_off", "Channel member shelf is shown")
 | 
					                    "revanced_adremover_channel_member_shelf_enabled_summary_on",
 | 
				
			||||||
 | 
					                    "Channel member shelf is hidden"
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                StringResource(
 | 
				
			||||||
 | 
					                    "revanced_adremover_channel_member_shelf_enabled_summary_off",
 | 
				
			||||||
 | 
					                    "Channel member shelf is shown"
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            SwitchPreference(
 | 
					            SwitchPreference(
 | 
				
			||||||
                "revanced_adremover_emergency_box_removal",
 | 
					                "revanced_adremover_emergency_box_removal",
 | 
				
			||||||
| 
						 | 
					@ -137,6 +173,23 @@ class GeneralAdsResourcePatch : ResourcePatch {
 | 
				
			||||||
                StringResource("revanced_adremover_medical_panel_enabled_summary_on", "Medical panels are hidden"),
 | 
					                StringResource("revanced_adremover_medical_panel_enabled_summary_on", "Medical panels are hidden"),
 | 
				
			||||||
                StringResource("revanced_adremover_medical_panel_enabled_summary_off", "Medical panels are shown")
 | 
					                StringResource("revanced_adremover_medical_panel_enabled_summary_off", "Medical panels are shown")
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PreferenceScreen.ADS.addPreferences(
 | 
				
			||||||
 | 
					            SwitchPreference(
 | 
				
			||||||
 | 
					                "revanced_adremover_ad_removal",
 | 
				
			||||||
 | 
					                StringResource("revanced_adremover_ad_removal_enabled_title", "Hide general ads"),
 | 
				
			||||||
 | 
					                true,
 | 
				
			||||||
 | 
					                StringResource("revanced_adremover_ad_removal_enabled_summary_on", "General ads are hidden"),
 | 
				
			||||||
 | 
					                StringResource("revanced_adremover_ad_removal_enabled_summary_off", "General ads are shown")
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            SwitchPreference(
 | 
				
			||||||
 | 
					                "revanced_adremover_buttoned",
 | 
				
			||||||
 | 
					                StringResource("revanced_adremover_buttoned_enabled_title", "Hide buttoned ad"),
 | 
				
			||||||
 | 
					                true,
 | 
				
			||||||
 | 
					                StringResource("revanced_adremover_buttoned_enabled_summary_on", "Buttoned ads are hidden"),
 | 
				
			||||||
 | 
					                StringResource("revanced_adremover_buttoned_enabled_summary_off", "Buttoned ads are shown")
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
            SwitchPreference(
 | 
					            SwitchPreference(
 | 
				
			||||||
                "revanced_adremover_paid_content",
 | 
					                "revanced_adremover_paid_content",
 | 
				
			||||||
                StringResource("revanced_adremover_paid_content_enabled_title", "Hide paid content"),
 | 
					                StringResource("revanced_adremover_paid_content_enabled_title", "Hide paid content"),
 | 
				
			||||||
| 
						 | 
					@ -158,19 +211,6 @@ class GeneralAdsResourcePatch : ResourcePatch {
 | 
				
			||||||
                StringResource("revanced_adremover_hide_latest_posts_enabled_summary_on", "Latest posts are hidden"),
 | 
					                StringResource("revanced_adremover_hide_latest_posts_enabled_summary_on", "Latest posts are hidden"),
 | 
				
			||||||
                StringResource("revanced_adremover_hide_latest_posts_enabled_summary_off", "Latest posts are shown")
 | 
					                StringResource("revanced_adremover_hide_latest_posts_enabled_summary_off", "Latest posts are shown")
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            SwitchPreference(
 | 
					 | 
				
			||||||
                "revanced_adremover_hide_channel_guidelines",
 | 
					 | 
				
			||||||
                StringResource("revanced_adremover_hide_channel_guidelines_enabled_title", "Hide channel guidelines"),
 | 
					 | 
				
			||||||
                true,
 | 
					 | 
				
			||||||
                StringResource(
 | 
					 | 
				
			||||||
                    "revanced_adremover_hide_channel_guidelines_enabled_summary_on",
 | 
					 | 
				
			||||||
                    "Channel guidelines are hidden"
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
                StringResource(
 | 
					 | 
				
			||||||
                    "revanced_adremover_hide_channel_guidelines_enabled_summary_off",
 | 
					 | 
				
			||||||
                    "Channel guidelines are shown"
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
            SwitchPreference(
 | 
					            SwitchPreference(
 | 
				
			||||||
                "revanced_adremover_self_sponsor",
 | 
					                "revanced_adremover_self_sponsor",
 | 
				
			||||||
                StringResource("revanced_adremover_self_sponsor_enabled_title", "Hide self sponsored cards"),
 | 
					                StringResource("revanced_adremover_self_sponsor_enabled_title", "Hide self sponsored cards"),
 | 
				
			||||||
| 
						 | 
					@ -178,30 +218,7 @@ class GeneralAdsResourcePatch : ResourcePatch {
 | 
				
			||||||
                StringResource("revanced_adremover_self_sponsor_enabled_summary_on", "Self sponsored cards are hidden"),
 | 
					                StringResource("revanced_adremover_self_sponsor_enabled_summary_on", "Self sponsored cards are hidden"),
 | 
				
			||||||
                StringResource("revanced_adremover_self_sponsor_enabled_summary_off", "Self sponsored cards are shown")
 | 
					                StringResource("revanced_adremover_self_sponsor_enabled_summary_off", "Self sponsored cards are shown")
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
            SwitchPreference(
 | 
					            PreferenceScreen(
 | 
				
			||||||
                "revanced_adremover_separator",
 | 
					 | 
				
			||||||
                StringResource("revanced_adremover_separator_title", "Hide gray separator"),
 | 
					 | 
				
			||||||
                true,
 | 
					 | 
				
			||||||
                StringResource("revanced_adremover_separator_summary_on", "Gray separators are hidden"),
 | 
					 | 
				
			||||||
                StringResource("revanced_adremover_separator_summary_off", "Gray separators are shown")
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
            SwitchPreference(
 | 
					 | 
				
			||||||
                "revanced_adremover_chapter_teaser",
 | 
					 | 
				
			||||||
                StringResource(
 | 
					 | 
				
			||||||
                    "revanced_adremover_chapter_teaser_enabled_title",
 | 
					 | 
				
			||||||
                    "Hide chapter teaser under videos"
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
                true,
 | 
					 | 
				
			||||||
                StringResource(
 | 
					 | 
				
			||||||
                    "revanced_adremover_chapter_teaser_enabled_summary_on",
 | 
					 | 
				
			||||||
                    "Chapter teasers are hidden"
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
                StringResource(
 | 
					 | 
				
			||||||
                    "revanced_adremover_chapter_teaser_enabled_summary_off",
 | 
					 | 
				
			||||||
                    "Chapter teasers are shown"
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
            app.revanced.patches.shared.settings.preference.impl.PreferenceScreen(
 | 
					 | 
				
			||||||
                "revanced_adremover_custom",
 | 
					                "revanced_adremover_custom",
 | 
				
			||||||
                StringResource("revanced_adremover_custom_title", "Custom filter"),
 | 
					                StringResource("revanced_adremover_custom_title", "Custom filter"),
 | 
				
			||||||
                listOf(
 | 
					                listOf(
 | 
				
			||||||
| 
						 | 
					@ -221,7 +238,7 @@ class GeneralAdsResourcePatch : ResourcePatch {
 | 
				
			||||||
                            "Custom filter is disabled"
 | 
					                            "Custom filter is disabled"
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
                    ),
 | 
					                    ),
 | 
				
			||||||
                    // TODO: This should be a ListPreference, which does not exist yet
 | 
					                    // TODO: This should be a dynamic ListPreference, which does not exist yet
 | 
				
			||||||
                    TextPreference(
 | 
					                    TextPreference(
 | 
				
			||||||
                        "revanced_adremover_custom_strings",
 | 
					                        "revanced_adremover_custom_strings",
 | 
				
			||||||
                        StringResource("revanced_adremover_custom_strings_title", "Custom filter"),
 | 
					                        StringResource("revanced_adremover_custom_strings_title", "Custom filter"),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,14 +12,14 @@ import app.revanced.patcher.patch.PatchResult
 | 
				
			||||||
import app.revanced.patcher.patch.PatchResultSuccess
 | 
					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.patches.shared.settings.preference.impl.StringResource
 | 
				
			||||||
 | 
					import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
 | 
				
			||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
 | 
					import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
 | 
				
			||||||
 | 
					import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
 | 
				
			||||||
import app.revanced.patches.youtube.misc.video.quality.annotations.RememberVideoQualityCompatibility
 | 
					import app.revanced.patches.youtube.misc.video.quality.annotations.RememberVideoQualityCompatibility
 | 
				
			||||||
import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualityReferenceFingerprint
 | 
					import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualityReferenceFingerprint
 | 
				
			||||||
import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualitySetterFingerprint
 | 
					import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualitySetterFingerprint
 | 
				
			||||||
import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoUserQualityChangeFingerprint
 | 
					import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoUserQualityChangeFingerprint
 | 
				
			||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
 | 
					 | 
				
			||||||
import app.revanced.patches.shared.settings.preference.impl.StringResource
 | 
					 | 
				
			||||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
 | 
					 | 
				
			||||||
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
 | 
					import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
 | 
				
			||||||
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
 | 
					import org.jf.dexlib2.iface.instruction.ReferenceInstruction
 | 
				
			||||||
import org.jf.dexlib2.iface.reference.FieldReference
 | 
					import org.jf.dexlib2.iface.reference.FieldReference
 | 
				
			||||||
| 
						 | 
					@ -47,7 +47,7 @@ class RememberVideoQualityPatch : BytecodePatch(
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
                StringResource(
 | 
					                StringResource(
 | 
				
			||||||
                    "revanced_remember_video_quality_last_selected_summary_off",
 | 
					                    "revanced_remember_video_quality_last_selected_summary_off",
 | 
				
			||||||
                    "Quality changes only apply to the current video and are reverted back to the last remembered quality for future playbacks"
 | 
					                    "Quality changes only apply to the current video"
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					package app.revanced.patches.youtube.misc.video.speed.remember.annotation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import app.revanced.patcher.annotation.Compatibility
 | 
				
			||||||
 | 
					import app.revanced.patcher.annotation.Package
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Compatibility(
 | 
				
			||||||
 | 
					    [Package(
 | 
				
			||||||
 | 
					        "com.google.android.youtube", arrayOf("17.49.37")
 | 
				
			||||||
 | 
					    )]
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					@Target(AnnotationTarget.CLASS)
 | 
				
			||||||
 | 
					@Retention(AnnotationRetention.RUNTIME)
 | 
				
			||||||
 | 
					internal annotation class RememberPlaybackRateCompatibility
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
					package app.revanced.patches.youtube.misc.video.speed.remember.fingerprint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					object ChangePlaybackRateFragmentStateFingerprint : MethodFingerprint(
 | 
				
			||||||
 | 
					    "V",
 | 
				
			||||||
 | 
					    strings = listOf("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT")
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					package app.revanced.patches.youtube.misc.video.speed.remember.fingerprint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					object InitializePlaybackRateValuesFingerprint : MethodFingerprint(
 | 
				
			||||||
 | 
					    parameters = listOf("[L", "I")
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					package app.revanced.patches.youtube.misc.video.speed.remember.fingerprint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
 | 
				
			||||||
 | 
					import org.jf.dexlib2.Opcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					object OnPlaybackRateItemClickFingerprint : MethodFingerprint(
 | 
				
			||||||
 | 
					    customFingerprint = { it.name == "onItemClick" },
 | 
				
			||||||
 | 
					    opcodes = listOf(
 | 
				
			||||||
 | 
					        Opcode.IGET_OBJECT,
 | 
				
			||||||
 | 
					        Opcode.INVOKE_VIRTUAL
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,137 @@
 | 
				
			||||||
 | 
					package app.revanced.patches.youtube.misc.video.speed.remember.patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import app.revanced.extensions.toErrorResult
 | 
				
			||||||
 | 
					import app.revanced.patcher.annotation.Description
 | 
				
			||||||
 | 
					import app.revanced.patcher.annotation.Name
 | 
				
			||||||
 | 
					import app.revanced.patcher.annotation.Version
 | 
				
			||||||
 | 
					import app.revanced.patcher.data.BytecodeContext
 | 
				
			||||||
 | 
					import app.revanced.patcher.extensions.addInstruction
 | 
				
			||||||
 | 
					import app.revanced.patcher.extensions.addInstructions
 | 
				
			||||||
 | 
					import app.revanced.patcher.extensions.instruction
 | 
				
			||||||
 | 
					import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
 | 
				
			||||||
 | 
					import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
 | 
				
			||||||
 | 
					import app.revanced.patcher.patch.*
 | 
				
			||||||
 | 
					import app.revanced.patcher.patch.annotations.DependsOn
 | 
				
			||||||
 | 
					import app.revanced.patcher.patch.annotations.Patch
 | 
				
			||||||
 | 
					import app.revanced.patcher.util.smali.ExternalLabel
 | 
				
			||||||
 | 
					import app.revanced.patches.shared.settings.preference.impl.StringResource
 | 
				
			||||||
 | 
					import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
 | 
				
			||||||
 | 
					import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
 | 
				
			||||||
 | 
					import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
 | 
				
			||||||
 | 
					import app.revanced.patches.youtube.misc.video.speed.remember.annotation.RememberPlaybackRateCompatibility
 | 
				
			||||||
 | 
					import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.ChangePlaybackRateFragmentStateFingerprint
 | 
				
			||||||
 | 
					import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.InitializePlaybackRateValuesFingerprint
 | 
				
			||||||
 | 
					import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.OnPlaybackRateItemClickFingerprint
 | 
				
			||||||
 | 
					import org.jf.dexlib2.Opcode
 | 
				
			||||||
 | 
					import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
 | 
				
			||||||
 | 
					import org.jf.dexlib2.iface.instruction.ReferenceInstruction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Patch
 | 
				
			||||||
 | 
					@Name("remember-playback-rate")
 | 
				
			||||||
 | 
					@Description("Adds the ability to remember the playback rate you chose in the video playback rate flyout.")
 | 
				
			||||||
 | 
					@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
 | 
				
			||||||
 | 
					@RememberPlaybackRateCompatibility
 | 
				
			||||||
 | 
					@Version("0.0.1")
 | 
				
			||||||
 | 
					class RememberPlaybackRatePatch : BytecodePatch(
 | 
				
			||||||
 | 
					    listOf(ChangePlaybackRateFragmentStateFingerprint)
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					    private companion object {
 | 
				
			||||||
 | 
					        const val INTEGRATIONS_CLASS_DESCRIPTOR =
 | 
				
			||||||
 | 
					            "Lapp/revanced/integrations/patches/playback/speed/RememberPlaybackRatePatch;"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun MethodFingerprint.getReference(offsetFromPatternScanResultStartIndex: Int = 0) = this.result!!.let {
 | 
				
			||||||
 | 
					            val referenceInstruction = it.mutableMethod
 | 
				
			||||||
 | 
					                .instruction(it.scanResult.patternScanResult!!.startIndex + offsetFromPatternScanResultStartIndex) as ReferenceInstruction
 | 
				
			||||||
 | 
					            referenceInstruction.reference.toString()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fun BytecodeContext.resolveFingerprints() {
 | 
				
			||||||
 | 
					            ChangePlaybackRateFragmentStateFingerprint.result?.also {
 | 
				
			||||||
 | 
					                fun MethodFingerprint.resolve() = resolve(this@resolveFingerprints, it.classDef)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                OnPlaybackRateItemClickFingerprint.resolve()
 | 
				
			||||||
 | 
					                InitializePlaybackRateValuesFingerprint.resolve()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            } ?: throw ChangePlaybackRateFragmentStateFingerprint.toErrorResult()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun execute(context: BytecodeContext): PatchResult {
 | 
				
			||||||
 | 
					        SettingsPatch.PreferenceScreen.MISC.addPreferences(
 | 
				
			||||||
 | 
					            SwitchPreference(
 | 
				
			||||||
 | 
					                "revanced_remember_playback_rate_last_selected",
 | 
				
			||||||
 | 
					                StringResource("revanced_remember_playback_rate_last_selected_title", "Remember playback rate changes"),
 | 
				
			||||||
 | 
					                true,
 | 
				
			||||||
 | 
					                StringResource(
 | 
				
			||||||
 | 
					                    "revanced_remember_playback_rate_last_selected_summary_on",
 | 
				
			||||||
 | 
					                    "Playback rate changes apply to all videos"
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                StringResource(
 | 
				
			||||||
 | 
					                    "revanced_remember_playback_rate_last_selected_summary_off",
 | 
				
			||||||
 | 
					                    "Playback rate changes only apply to the current video"
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        context.resolveFingerprints()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Set the remembered playback rate.
 | 
				
			||||||
 | 
					        InitializePlaybackRateValuesFingerprint.result!!.apply {
 | 
				
			||||||
 | 
					            // Infer everything necessary for setPlaybackRate()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            val playbackHandlerWrapperFieldReference =
 | 
				
			||||||
 | 
					                (object : MethodFingerprint(opcodes = listOf(Opcode.IF_EQZ)) {}).apply {
 | 
				
			||||||
 | 
					                    OnPlaybackRateItemClickFingerprint.result!!.apply {
 | 
				
			||||||
 | 
					                        resolve(
 | 
				
			||||||
 | 
					                            context,
 | 
				
			||||||
 | 
					                            method,
 | 
				
			||||||
 | 
					                            classDef
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }.getReference(-1)
 | 
				
			||||||
 | 
					            val playbackHandlerWrapperImplementorClassReference = OnPlaybackRateItemClickFingerprint
 | 
				
			||||||
 | 
					                .getReference(-1)
 | 
				
			||||||
 | 
					            val playbackHandlerFieldReference = OnPlaybackRateItemClickFingerprint
 | 
				
			||||||
 | 
					                .getReference()
 | 
				
			||||||
 | 
					            val setPlaybackRateMethodReference = OnPlaybackRateItemClickFingerprint
 | 
				
			||||||
 | 
					                .getReference(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mutableMethod.addInstructions(
 | 
				
			||||||
 | 
					                0,
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					                    invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->getRememberedPlaybackRate()F
 | 
				
			||||||
 | 
					                    move-result v0
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    # check if the playback rate is below 0 (when a playback rate was never remembered)
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    const/4 v1, 0x0
 | 
				
			||||||
 | 
					                    cmpg-float v1, v0, v1
 | 
				
			||||||
 | 
					                    if-lez v1, :do_not_override
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    # invoke setPlaybackRate
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    iget-object v1, p0, $playbackHandlerWrapperFieldReference 
 | 
				
			||||||
 | 
					                    check-cast v1, $playbackHandlerWrapperImplementorClassReference
 | 
				
			||||||
 | 
					                    iget-object v2, v1, $playbackHandlerFieldReference
 | 
				
			||||||
 | 
					                    invoke-virtual {v2, v0}, $setPlaybackRateMethodReference
 | 
				
			||||||
 | 
					                """.trimIndent(),
 | 
				
			||||||
 | 
					                listOf(ExternalLabel("do_not_override", mutableMethod.instruction(0)))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Remember the selected playback rate.
 | 
				
			||||||
 | 
					        OnPlaybackRateItemClickFingerprint.result!!.apply {
 | 
				
			||||||
 | 
					            val setPlaybackRateIndex = scanResult.patternScanResult!!.endIndex
 | 
				
			||||||
 | 
					            val selectedPlaybackRateRegister =
 | 
				
			||||||
 | 
					                (mutableMethod.instruction(setPlaybackRateIndex) as FiveRegisterInstruction).registerD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mutableMethod.addInstruction(
 | 
				
			||||||
 | 
					                setPlaybackRateIndex,
 | 
				
			||||||
 | 
					                "invoke-static { v$selectedPlaybackRateRegister }, $INTEGRATIONS_CLASS_DESCRIPTOR->rememberPlaybackRate(F)V"
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return PatchResultSuccess()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in a new issue