Skip to content

Commit 6837348

Browse files
fix(YouTube - Remove background playback restrictions): Restore PiP button functionality after screen is unlocked
1 parent 9544027 commit 6837348

File tree

11 files changed

+62
-32
lines changed

11 files changed

+62
-32
lines changed

patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import app.revanced.util.findFreeRegister
1414
import app.revanced.util.findInstructionIndicesReversedOrThrow
1515
import app.revanced.util.getReference
1616
import app.revanced.util.indexOfFirstInstructionOrThrow
17-
import app.revanced.util.insertFeatureFlagBooleanOverride
17+
import app.revanced.util.insertLiteralOverride
1818
import app.revanced.util.returnEarly
1919
import com.android.tools.smali.dexlib2.AccessFlags
2020
import com.android.tools.smali.dexlib2.Opcode
@@ -235,7 +235,7 @@ fun spoofVideoStreamsPatch(
235235

236236
// region Fix iOS livestream current time.
237237

238-
hlsCurrentTimeFingerprint.method.insertFeatureFlagBooleanOverride(
238+
hlsCurrentTimeFingerprint.method.insertLiteralOverride(
239239
HLS_CURRENT_TIME_FEATURE_FLAG,
240240
"$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z"
241241
)
@@ -245,21 +245,21 @@ fun spoofVideoStreamsPatch(
245245
// region turn off stream config replacement feature flag.
246246

247247
if (fixMediaFetchHotConfigChanges()) {
248-
mediaFetchHotConfigFingerprint.method.insertFeatureFlagBooleanOverride(
248+
mediaFetchHotConfigFingerprint.method.insertLiteralOverride(
249249
MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG,
250250
"$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z"
251251
)
252252
}
253253

254254
if (fixMediaFetchHotConfigAlternativeChanges()) {
255-
mediaFetchHotConfigAlternativeFingerprint.method.insertFeatureFlagBooleanOverride(
255+
mediaFetchHotConfigAlternativeFingerprint.method.insertLiteralOverride(
256256
MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG,
257257
"$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z"
258258
)
259259
}
260260

261261
if (fixParsePlaybackResponseFeatureFlag()) {
262-
playbackStartDescriptorFeatureFlagFingerprint.method.insertFeatureFlagBooleanOverride(
262+
playbackStartDescriptorFeatureFlagFingerprint.method.insertLiteralOverride(
263263
PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG,
264264
"$EXTENSION_CLASS_DESCRIPTOR->usePlaybackStartFeatureFlag(Z)Z"
265265
)

patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ val swipeControlsPatch = bytecodePatch(
117117
// region patch to enable/disable swipe to change video.
118118

119119
if (is_19_43_or_greater) {
120-
swipeChangeVideoFingerprint.method.insertFeatureFlagBooleanOverride(
120+
swipeChangeVideoFingerprint.method.insertLiteralOverride(
121121
SWIPE_CHANGE_VIDEO_FEATURE_FLAG,
122122
"$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z"
123123
)

patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen
1818
import app.revanced.patches.youtube.misc.settings.settingsPatch
1919
import app.revanced.util.getReference
2020
import app.revanced.util.indexOfFirstInstructionOrThrow
21-
import app.revanced.util.insertFeatureFlagBooleanOverride
21+
import app.revanced.util.insertLiteralOverride
2222
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
2323
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
2424
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@@ -119,17 +119,17 @@ val navigationButtonsPatch = bytecodePatch(
119119

120120
// Force on/off translucent effect on status bar and navigation buttons.
121121
if (is_19_25_or_greater) {
122-
translucentNavigationStatusBarFeatureFlagFingerprint.method.insertFeatureFlagBooleanOverride(
122+
translucentNavigationStatusBarFeatureFlagFingerprint.method.insertLiteralOverride(
123123
TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG,
124124
"$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z",
125125
)
126126

127-
translucentNavigationButtonsFeatureFlagFingerprint.method.insertFeatureFlagBooleanOverride(
127+
translucentNavigationButtonsFeatureFlagFingerprint.method.insertLiteralOverride(
128128
TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG,
129129
"$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z",
130130
)
131131

132-
translucentNavigationButtonsSystemFeatureFlagFingerprint.method.insertFeatureFlagBooleanOverride(
132+
translucentNavigationButtonsSystemFeatureFlagFingerprint.method.insertLiteralOverride(
133133
TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG,
134134
"$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z",
135135
)

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ val miniplayerPatch = bytecodePatch(
278278
fun Fingerprint.insertMiniplayerFeatureFlagBooleanOverride(
279279
literal: Long,
280280
extensionMethod: String,
281-
) = method.insertFeatureFlagBooleanOverride(
281+
) = method.insertLiteralOverride(
282282
literal,
283283
"$EXTENSION_CLASS_DESCRIPTOR->$extensionMethod(Z)Z"
284284
)

patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import app.revanced.patches.youtube.layout.shortsplayer.openShortsInRegularPlaye
55
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
66
import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater
77
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
8-
import app.revanced.util.insertFeatureFlagBooleanOverride
8+
import app.revanced.util.insertLiteralOverride
99

1010
internal const val EXTENSION_CLASS_DESCRIPTOR =
1111
"Lapp/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch;"
@@ -24,7 +24,7 @@ internal val openVideosFullscreenHookPatch = bytecodePatch {
2424
return@execute
2525
}
2626

27-
openVideosFullscreenPortraitFingerprint.method.insertFeatureFlagBooleanOverride(
27+
openVideosFullscreenPortraitFingerprint.method.insertLiteralOverride(
2828
OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG,
2929
"$EXTENSION_CLASS_DESCRIPTOR->openVideoFullscreenPortrait(Z)Z"
3030
)

patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt

+5-13
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ import app.revanced.util.findElementByAttributeValueOrThrow
2828
import app.revanced.util.findInstructionIndicesReversedOrThrow
2929
import app.revanced.util.getReference
3030
import app.revanced.util.indexOfFirstInstructionOrThrow
31-
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
3231
import app.revanced.util.inputStreamFromBundledResource
33-
import app.revanced.util.insertFeatureFlagBooleanOverride
32+
import app.revanced.util.insertLiteralOverride
3433
import com.android.tools.smali.dexlib2.AccessFlags
3534
import com.android.tools.smali.dexlib2.Opcode
3635
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
@@ -229,16 +228,9 @@ val seekbarColorPatch = bytecodePatch(
229228

230229
execute {
231230
fun MutableMethod.addColorChangeInstructions(resourceId: Long) {
232-
val index = indexOfFirstLiteralInstructionOrThrow(resourceId)
233-
val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT)
234-
val register = getInstruction<OneRegisterInstruction>(insertIndex).registerA
235-
236-
addInstructions(
237-
insertIndex + 1,
238-
"""
239-
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarColor(I)I
240-
move-result v$register
241-
"""
231+
insertLiteralOverride(
232+
resourceId,
233+
"$EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarColor(I)I"
242234
)
243235
}
244236

@@ -354,7 +346,7 @@ val seekbarColorPatch = bytecodePatch(
354346
launchScreenLayoutTypeFingerprint,
355347
mainActivityOnCreateFingerprint
356348
).forEach { fingerprint ->
357-
fingerprint.method.insertFeatureFlagBooleanOverride(
349+
fingerprint.method.insertLiteralOverride(
358350
launchScreenLayoutTypeLotteFeatureFlag,
359351
"$EXTENSION_CLASS_DESCRIPTOR->useLotteLaunchSplashScreen(Z)Z"
360352
)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
2121
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
2222
import app.revanced.patches.youtube.misc.settings.settingsPatch
2323
import app.revanced.util.forEachChildElement
24-
import app.revanced.util.insertFeatureFlagBooleanOverride
24+
import app.revanced.util.insertLiteralOverride
2525
import org.w3c.dom.Element
2626

2727
private const val EXTENSION_CLASS_DESCRIPTOR =
@@ -233,7 +233,7 @@ val themePatch = bytecodePatch(
233233
SwitchPreference("revanced_gradient_loading_screen"),
234234
)
235235

236-
useGradientLoadingScreenFingerprint.method.insertFeatureFlagBooleanOverride(
236+
useGradientLoadingScreenFingerprint.method.insertLiteralOverride(
237237
GRADIENT_LOADING_SCREEN_AB_CONSTANT,
238238
"$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z"
239239
)

patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt

+11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import app.revanced.patches.shared.misc.mapping.resourceMappings
1212
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
1313
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
1414
import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch
15+
import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater
16+
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
1517
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
1618
import app.revanced.patches.youtube.misc.settings.settingsPatch
1719
import app.revanced.patches.youtube.video.information.videoInformationPatch
@@ -44,6 +46,7 @@ val backgroundPlaybackPatch = bytecodePatch(
4446
playerTypeHookPatch,
4547
videoInformationPatch,
4648
settingsPatch,
49+
versionCheckPatch
4750
)
4851

4952
compatibleWith(
@@ -100,5 +103,13 @@ val backgroundPlaybackPatch = bytecodePatch(
100103

101104
// Force allowing background play for videos labeled for kids.
102105
kidsBackgroundPlaybackPolicyControllerFingerprint.method.returnEarly()
106+
107+
// Fix PiP buttons not working after locking/unlocking device screen.
108+
if (is_19_34_or_greater) {
109+
pipInputConsumerFeatureFlagFingerprint.method.insertLiteralOverride(
110+
PIP_INPUT_CONSUMER_FEATURE_FLAG,
111+
false
112+
)
113+
}
103114
}
104115
}

patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt

+7
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,11 @@ internal val shortsBackgroundPlaybackFeatureFlagFingerprint = fingerprint {
8383
returns("Z")
8484
parameters()
8585
literal { 45415425 }
86+
}
87+
88+
internal const val PIP_INPUT_CONSUMER_FEATURE_FLAG = 45638483L
89+
90+
// Fix 'E/InputDispatcher: Window handle pip_input_consumer has no registered input channel'
91+
internal val pipInputConsumerFeatureFlagFingerprint = fingerprint {
92+
literal { PIP_INPUT_CONSUMER_FEATURE_FLAG}
8693
}

patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ val settingsPatch = bytecodePatch(
269269
}
270270

271271
// Add setting to force cairo settings fragment on/off.
272-
cairoFragmentConfigFingerprint.method.insertFeatureFlagBooleanOverride(
272+
cairoFragmentConfigFingerprint.method.insertLiteralOverride(
273273
CAIRO_CONFIG_LITERAL_VALUE,
274274
"$activityHookClassDescriptor->useCairoSettingsFragment(Z)Z"
275275
)

patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt

+23-3
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,12 @@ fun Method.findInstructionIndicesReversedOrThrow(opcode: Opcode): List<Int> {
636636
return instructions
637637
}
638638

639-
internal fun MutableMethod.insertFeatureFlagBooleanOverride(literal: Long, extensionsMethod: String) {
639+
/**
640+
* Overrides the first move result with an extension call.
641+
* Suitable for calls to extension code to override boolean and integer values.
642+
*/
643+
internal fun MutableMethod.insertLiteralOverride(literal: Long, extensionMethodDescriptor: String) {
644+
// TODO: make this work with objects and wide values.
640645
val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal)
641646
val index = indexOfFirstInstructionOrThrow(literalIndex, MOVE_RESULT)
642647
val register = getInstruction<OneRegisterInstruction>(index).registerA
@@ -650,9 +655,24 @@ internal fun MutableMethod.insertFeatureFlagBooleanOverride(literal: Long, exten
650655
addInstructions(
651656
index + 1,
652657
"""
653-
$operation, $extensionsMethod
658+
$operation, $extensionMethodDescriptor
654659
move-result v$register
655-
""",
660+
"""
661+
)
662+
}
663+
664+
/**
665+
* Overrides a literal value result with a constant value.
666+
*/
667+
internal fun MutableMethod.insertLiteralOverride(literal: Long, override: Boolean) {
668+
val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal)
669+
val index = indexOfFirstInstructionOrThrow(literalIndex, MOVE_RESULT)
670+
val register = getInstruction<OneRegisterInstruction>(index).registerA
671+
val overrideValue = if (override) "0x1" else "0x0"
672+
673+
addInstruction(
674+
index + 1,
675+
"const v$register, $overrideValue"
656676
)
657677
}
658678

0 commit comments

Comments
 (0)