Skip to content

Commit 70013d8

Browse files
LisoUseInAIKyriosoSumAtrIX
andauthored
feat(YouTube - Miniplayer): Rename Tablet mini player and allow selecting the style of the in-app miniplayer (#3302)
Co-authored-by: oSumAtrIX <[email protected]>
1 parent 8a33fe9 commit 70013d8

31 files changed

+805
-220
lines changed

api/revanced-patches.api

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1528,6 +1528,12 @@ public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPa
15281528
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
15291529
}
15301530

1531+
public final class app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch : app/revanced/patcher/patch/BytecodePatch {
1532+
public static final field INSTANCE Lapp/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch;
1533+
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
1534+
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
1535+
}
1536+
15311537
public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch : app/revanced/patcher/patch/BytecodePatch {
15321538
public static final field INSTANCE Lapp/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch;
15331539
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
@@ -1894,13 +1900,15 @@ public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPat
18941900
public final class app/revanced/util/BytecodeUtilsKt {
18951901
public static final fun containsWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z
18961902
public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;
1903+
public static final fun findOpcodeIndicesReversed (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List;
18971904
public static final fun getException (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/patch/PatchException;
18981905
public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;)I
18991906
public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)I
19001907
public static synthetic fun indexOfFirstInstruction$default (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)I
19011908
public static final fun indexOfFirstInstructionOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;)I
19021909
public static synthetic fun indexOfFirstInstructionOrThrow$default (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)I
19031910
public static final fun indexOfFirstWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)I
1911+
public static final fun indexOfFirstWideLiteralInstructionValueOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;J)I
19041912
public static final fun indexOfIdResource (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
19051913
public static final fun indexOfIdResourceOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
19061914
public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V

src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package app.revanced.patches.shared.misc.mapping
22

33
import app.revanced.patcher.data.ResourceContext
4+
import app.revanced.patcher.patch.PatchException
45
import app.revanced.patcher.patch.ResourcePatch
56
import org.w3c.dom.Element
67
import java.util.*
@@ -51,9 +52,10 @@ object ResourceMappingPatch : ResourcePatch() {
5152
threadPoolExecutor.also { it.shutdown() }.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS)
5253
}
5354

54-
operator fun get(type: String, name: String) = resourceMappings.first {
55-
it.type == type && it.name == name
56-
}.id
55+
operator fun get(type: String, name: String) =
56+
resourceMappings.firstOrNull {
57+
it.type == type && it.name == name
58+
}?.id ?: throw PatchException("Could not find resource type: $type name: $name")
5759

5860
data class ResourceElement(val type: String, val name: String, val id: Long)
5961
}

src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt

Lines changed: 370 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package app.revanced.patches.youtube.layout.miniplayer
2+
3+
import app.revanced.patcher.data.ResourceContext
4+
import app.revanced.patcher.patch.PatchException
5+
import app.revanced.patcher.patch.ResourcePatch
6+
import app.revanced.patcher.patch.annotation.Patch
7+
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
8+
9+
@Patch(dependencies = [ResourceMappingPatch::class])
10+
internal object MiniplayerResourcePatch : ResourcePatch() {
11+
var floatyBarButtonTopMargin = -1L
12+
13+
// Only available in 19.15 and upwards.
14+
var ytOutlineXWhite24 = -1L
15+
var ytOutlinePictureInPictureWhite24 = -1L
16+
var scrimOverlay = -1L
17+
var modernMiniplayerClose = -1L
18+
var modernMiniplayerExpand = -1L
19+
var modernMiniplayerRewindButton = -1L
20+
var modernMiniplayerForwardButton = -1L
21+
var playerOverlays = -1L
22+
23+
override fun execute(context: ResourceContext) {
24+
floatyBarButtonTopMargin = ResourceMappingPatch[
25+
"dimen",
26+
"floaty_bar_button_top_margin"
27+
]
28+
29+
try {
30+
ytOutlinePictureInPictureWhite24 = ResourceMappingPatch[
31+
"drawable",
32+
"yt_outline_picture_in_picture_white_24"
33+
]
34+
} catch (exception: PatchException) {
35+
// Ignore, and assume the app is 19.14 or earlier.
36+
return
37+
}
38+
39+
ytOutlineXWhite24 = ResourceMappingPatch[
40+
"drawable",
41+
"yt_outline_x_white_24"
42+
]
43+
44+
scrimOverlay = ResourceMappingPatch[
45+
"id",
46+
"scrim_overlay"
47+
]
48+
49+
modernMiniplayerClose = ResourceMappingPatch[
50+
"id",
51+
"modern_miniplayer_close"
52+
]
53+
54+
modernMiniplayerExpand = ResourceMappingPatch[
55+
"id",
56+
"modern_miniplayer_expand"
57+
]
58+
59+
modernMiniplayerRewindButton = ResourceMappingPatch[
60+
"id",
61+
"modern_miniplayer_rewind_button"
62+
]
63+
64+
modernMiniplayerForwardButton = ResourceMappingPatch[
65+
"id",
66+
"modern_miniplayer_forward_button"
67+
]
68+
69+
playerOverlays = ResourceMappingPatch[
70+
"layout",
71+
"player_overlays"
72+
]
73+
74+
// Resource id is not used during patching, but is used by integrations.
75+
// Verify the resource is present while patching.
76+
ResourceMappingPatch[
77+
"id",
78+
"modern_miniplayer_subtitle_text"
79+
]
80+
}
81+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package app.revanced.patches.youtube.layout.miniplayer.fingerprints
2+
3+
import app.revanced.patcher.extensions.or
4+
import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch
5+
import app.revanced.util.patch.LiteralValueFingerprint
6+
import com.android.tools.smali.dexlib2.AccessFlags
7+
8+
internal object MiniplayerDimensionsCalculatorParentFingerprint : LiteralValueFingerprint(
9+
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
10+
returnType = "V",
11+
parameters = listOf("L"),
12+
literalSupplier = { MiniplayerResourcePatch.floatyBarButtonTopMargin }
13+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package app.revanced.patches.youtube.layout.miniplayer.fingerprints
2+
3+
import app.revanced.patcher.extensions.or
4+
import app.revanced.patcher.fingerprint.MethodFingerprint
5+
import com.android.tools.smali.dexlib2.AccessFlags
6+
7+
/**
8+
* Resolves using the class found in [MiniplayerModernViewParentFingerprint].
9+
*/
10+
internal object MiniplayerModernAddViewListenerFingerprint : MethodFingerprint(
11+
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
12+
returnType = "V",
13+
parameters = listOf("Landroid/view/View;")
14+
)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package app.revanced.patches.youtube.layout.miniplayer.fingerprints
2+
3+
import app.revanced.patcher.extensions.or
4+
import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch
5+
import app.revanced.util.patch.LiteralValueFingerprint
6+
import com.android.tools.smali.dexlib2.AccessFlags
7+
8+
/**
9+
* Resolves using the class found in [MiniplayerModernViewParentFingerprint].
10+
*/
11+
internal object MiniplayerModernCloseButtonFingerprint : LiteralValueFingerprint(
12+
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
13+
returnType = "Landroid/widget/ImageView;",
14+
parameters = listOf(),
15+
literalSupplier = { MiniplayerResourcePatch.modernMiniplayerClose }
16+
)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package app.revanced.patches.youtube.layout.miniplayer.fingerprints
2+
3+
import app.revanced.patcher.extensions.or
4+
import app.revanced.util.patch.LiteralValueFingerprint
5+
import com.android.tools.smali.dexlib2.AccessFlags
6+
7+
internal object MiniplayerModernConstructorFingerprint : LiteralValueFingerprint(
8+
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
9+
parameters = listOf("L"),
10+
literalSupplier = { 45623000L } // Magic number found in the constructor.
11+
)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package app.revanced.patches.youtube.layout.miniplayer.fingerprints
2+
3+
import app.revanced.patcher.extensions.or
4+
import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch
5+
import app.revanced.util.patch.LiteralValueFingerprint
6+
import com.android.tools.smali.dexlib2.AccessFlags
7+
8+
/**
9+
* Resolves using the class found in [MiniplayerModernViewParentFingerprint].
10+
*/
11+
internal object MiniplayerModernExpandButtonFingerprint : LiteralValueFingerprint(
12+
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
13+
returnType = "Landroid/widget/ImageView;",
14+
parameters = listOf(),
15+
literalSupplier = { MiniplayerResourcePatch.modernMiniplayerExpand }
16+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package app.revanced.patches.youtube.layout.miniplayer.fingerprints
2+
3+
import app.revanced.patcher.extensions.or
4+
import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch
5+
import app.revanced.util.patch.LiteralValueFingerprint
6+
import com.android.tools.smali.dexlib2.AccessFlags
7+
8+
/**
9+
* Resolves using the class found in [MiniplayerModernViewParentFingerprint].
10+
*/
11+
internal object MiniplayerModernExpandCloseDrawablesFingerprint : LiteralValueFingerprint(
12+
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
13+
returnType = "V",
14+
parameters = listOf("L"),
15+
literalSupplier = { MiniplayerResourcePatch.ytOutlinePictureInPictureWhite24 }
16+
)

0 commit comments

Comments
 (0)