1+ package io.github.chsbuffer.revancedxposed.youtube.interaction
2+
3+ import android.app.Activity
4+ import app.revanced.extension.youtube.patches.DownloadsPatch
5+ import app.revanced.extension.youtube.settings.preference.ExternalDownloaderPreference
6+ import app.revanced.extension.youtube.videoplayer.ExternalDownloadButton
7+ import io.github.chsbuffer.revancedxposed.AccessFlags
8+ import io.github.chsbuffer.revancedxposed.R
9+ import io.github.chsbuffer.revancedxposed.fingerprint
10+ import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceScreenPreference
11+ import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.PreferenceScreenPreference.Sorting
12+ import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.SwitchPreference
13+ import io.github.chsbuffer.revancedxposed.shared.misc.settings.preference.TextPreference
14+ import io.github.chsbuffer.revancedxposed.youtube.YoutubeHook
15+ import io.github.chsbuffer.revancedxposed.youtube.misc.BottomControl
16+ import io.github.chsbuffer.revancedxposed.youtube.misc.PlayerControls
17+ import io.github.chsbuffer.revancedxposed.youtube.misc.PreferenceScreen
18+ import io.github.chsbuffer.revancedxposed.youtube.misc.addBottomControl
19+ import io.github.chsbuffer.revancedxposed.youtube.misc.initializeBottomControl
20+ import io.github.chsbuffer.revancedxposed.youtube.video.VideoInformationHook
21+ import org.luckypray.dexkit.query.enums.StringMatchType
22+
23+ fun YoutubeHook.Downloads () {
24+
25+ dependsOn(
26+ ::PlayerControls ,
27+ ::VideoInformationHook ,
28+ )
29+
30+ PreferenceScreen .PLAYER .addPreferences(
31+ PreferenceScreenPreference (
32+ key = " revanced_external_downloader_screen" ,
33+ sorting = Sorting .UNSORTED ,
34+ preferences = setOf (
35+ SwitchPreference (" revanced_external_downloader" ),
36+ SwitchPreference (" revanced_external_downloader_action_button" ),
37+ TextPreference (
38+ " revanced_external_downloader_name" ,
39+ tag = ExternalDownloaderPreference ::class .java
40+ ),
41+ ),
42+ ),
43+ )
44+
45+ addBottomControl(R .layout.revanced_external_download_button)
46+ initializeBottomControl(
47+ BottomControl (
48+ R .id.revanced_external_download_button,
49+ ExternalDownloadButton ::initializeButton,
50+ ExternalDownloadButton ::setVisibility,
51+ ExternalDownloadButton ::setVisibilityImmediate,
52+ ExternalDownloadButton ::setVisibilityNegatedImmediate,
53+ )
54+ )
55+
56+ getDexMethod(" mainActivityOnCreateFingerprint" ) {
57+ fingerprint {
58+ returns(" V" )
59+ parameters(" Landroid/os/Bundle;" )
60+ methodMatcher { name = " onCreate" }
61+ classMatcher { className(" .MainActivity" , StringMatchType .EndsWith ) }
62+ }
63+ }.hookMethod { after { DownloadsPatch .activityCreated(it.thisObject as Activity ) } }
64+
65+ getDexMethod(" offlineVideoEndpointFingerprint" ) {
66+ fingerprint {
67+ accessFlags(AccessFlags .PUBLIC , AccessFlags .FINAL )
68+ returns(" V" )
69+ parameters(
70+ " Ljava/util/Map;" ,
71+ " L" ,
72+ " Ljava/lang/String" , // VideoId
73+ " L" ,
74+ )
75+ strings(" Object is not an offlineable video: " )
76+ }
77+ }.hookMethod {
78+ before {
79+ if (DownloadsPatch .inAppDownloadButtonOnClick(it.args[2 ] as String ))
80+ it.result = null
81+ }
82+ }
83+ }
0 commit comments