chore: merge branch dev to main (#1409)

This commit is contained in:
oSumAtrIX 2022-12-31 21:20:25 +01:00 committed by GitHub
commit e56219e036
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 462 additions and 16 deletions

View File

@ -32,7 +32,8 @@
{
"path": "patches.json"
}
]
],
successComment: false
}
],
[

View File

@ -1,3 +1,15 @@
# [2.151.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.150.0...v2.151.0-dev.1) (2022-12-31)
### Bug Fixes
* **youtube/general-ads:** restore swipe back to exit gesture ([#1405](https://github.com/revanced/revanced-patches/issues/1405)) ([2440587](https://github.com/revanced/revanced-patches/commit/24405877dd935a757fa61c7580887c1a47a25ea9))
### Features
* **youtube:** `copy-video-url` patch ([#1402](https://github.com/revanced/revanced-patches/issues/1402)) ([bf982e8](https://github.com/revanced/revanced-patches/commit/bf982e8d7765c2a89a5475b6db8b203a3ac4ddf9))
# [2.150.0](https://github.com/revanced/revanced-patches/compare/v2.149.0...v2.150.0) (2022-12-31)

View File

@ -12,6 +12,7 @@ The official Patch bundle provided by ReVanced and the community.
| `always-autorepeat` | Always repeats the playing video again. | 17.49.37 |
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
| `comments` | Hides components related to comments. | 17.49.37 |
| `copy-video-url` | Adds buttons in player to copy video links. | 17.49.37 |
| `custom-branding` | Changes the YouTube launcher icon and name to your choice (defaults to ReVanced). | all |
| `custom-video-buffer` | Lets you change the buffers of videos. | 17.49.37 |
| `custom-video-speed` | Adds more video speed options. | 17.49.37 |

View File

@ -1,2 +1,2 @@
kotlin.code.style = official
version = 2.150.0
version = 2.151.0-dev.1

File diff suppressed because one or more lines are too long

View File

@ -17,6 +17,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.ad.general.annotation.GeneralAdsCompatibility
import app.revanced.patches.youtube.ad.general.bytecode.fingerprints.ReelConstructorFingerprint
import app.revanced.patches.youtube.ad.general.resource.patch.GeneralAdsResourcePatch
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.patch.FixBackToExitGesturePatch
import app.revanced.patches.youtube.misc.fix.verticalscroll.patch.VerticalScrollPatch
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
import org.jf.dexlib2.iface.instruction.formats.Instruction31i
@ -24,7 +25,7 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction35c
@Patch
@DependsOn([GeneralAdsResourcePatch::class, VerticalScrollPatch::class])
@DependsOn([GeneralAdsResourcePatch::class, VerticalScrollPatch::class, FixBackToExitGesturePatch::class])
@Name("general-ads")
@Description("Removes general ads.")
@GeneralAdsCompatibility

View File

@ -0,0 +1,13 @@
package app.revanced.patches.youtube.interaction.copyvideourl.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 CopyVideoUrlCompatibility

View File

@ -0,0 +1,49 @@
package app.revanced.patches.youtube.interaction.copyvideourl.bytecode.patch
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.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.youtube.interaction.copyvideourl.annotation.CopyVideoUrlCompatibility
import app.revanced.patches.youtube.interaction.copyvideourl.resource.patch.CopyVideoUrlResourcePatch
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
import app.revanced.patches.youtube.misc.video.information.patch.VideoInformationPatch
@Patch
@Name("copy-video-url")
@Description("Adds buttons in player to copy video links.")
@DependsOn([
CopyVideoUrlResourcePatch::class,
PlayerControlsBytecodePatch::class,
VideoInformationPatch::class
])
@CopyVideoUrlCompatibility
@Version("0.0.1")
class CopyVideoUrlBytecodePatch : BytecodePatch() {
private companion object {
const val INTEGRATIONS_PACKAGE = "Lapp/revanced/integrations"
const val INTEGRATIONS_PLAYER_PACKAGE = "$INTEGRATIONS_PACKAGE/videoplayer"
val BUTTONS_DESCRIPTORS = listOf(
"$INTEGRATIONS_PLAYER_PACKAGE/CopyVideoUrlButton;",
"$INTEGRATIONS_PLAYER_PACKAGE/CopyVideoUrlTimestampButton;"
)
}
override fun execute(context: BytecodeContext): PatchResult {
// Initialize buttons and inject visibility control
BUTTONS_DESCRIPTORS.forEach { descriptor ->
val initializeButtonDescriptor = "$descriptor->initializeButton(Ljava/lang/Object;)V"
val visibilityDescriptor = "$descriptor->changeVisibility(Z)V"
PlayerControlsBytecodePatch.initializeControl(initializeButtonDescriptor)
PlayerControlsBytecodePatch.injectVisibilityCheckCall(visibilityDescriptor)
}
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,62 @@
package app.revanced.patches.youtube.interaction.copyvideourl.resource.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen
import app.revanced.patches.shared.settings.preference.impl.StringResource
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
import app.revanced.patches.youtube.interaction.copyvideourl.annotation.CopyVideoUrlCompatibility
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
import app.revanced.patches.youtube.misc.playercontrols.resource.patch.BottomControlsResourcePatch
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
import app.revanced.util.resources.ResourceUtils
import app.revanced.util.resources.ResourceUtils.copyResources
@Name("copy-video-url-resource")
@Description("Makes necessary changes to resources for copy video link buttons.")
@DependsOn([BottomControlsResourcePatch::class, FixLocaleConfigErrorPatch::class, SettingsPatch::class])
@CopyVideoUrlCompatibility
@Version("0.0.1")
class CopyVideoUrlResourcePatch : ResourcePatch {
override fun execute(context: ResourceContext): PatchResult {
SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences(
PreferenceScreen(
"revanced_copy_video_url",
StringResource("revanced_copy_video_url_title", "Copy video URL settings"),
listOf(
SwitchPreference(
"revanced_copy_video_url",
StringResource("revanced_copy_video_url_enabled_title", "Show copy video URL button"),
true,
StringResource("revanced_copy_video_url_enabled_summary_on", "Button is shown, click to copy video URL without timestamp"),
StringResource("revanced_copy_video_url_enabled_summary_off", "Button is not shown")
),
SwitchPreference(
"revanced_copy_video_url_timestamp",
StringResource("revanced_copy_video_url_timestamp_enabled_title", "Show copy timestamp URL button"),
true,
StringResource("revanced_copy_video_url_timestamp_enabled_summary_on", "Button is shown, click to copy video URL with timestamp"),
StringResource("revanced_copy_video_url_timestamp_enabled_summary_off", "Button is not shown")
)
),
StringResource("revanced_copy_video_url_summary", "Settings related to copy URL buttons in video player")
)
)
context.copyResources("copyvideourl", ResourceUtils.ResourceGroup(
resourceDirectoryName = "drawable",
"revanced_yt_copy.xml",
"revanced_yt_copy_timestamp.xml"
))
BottomControlsResourcePatch.addControls("copyvideourl/host/layout/${BottomControlsResourcePatch.TARGET_RESOURCE_NAME}")
return PatchResultSuccess()
}
}

View File

@ -12,11 +12,11 @@ import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.youtube.interaction.downloads.annotation.DownloadsCompatibility
import app.revanced.patches.youtube.interaction.downloads.resource.patch.DownloadsResourcePatch
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
import app.revanced.patches.youtube.misc.video.information.patch.VideoInformationPatch
@Patch
@Name("downloads")
@DependsOn([DownloadsResourcePatch::class, PlayerControlsBytecodePatch::class, VideoIdPatch::class])
@DependsOn([DownloadsResourcePatch::class, PlayerControlsBytecodePatch::class, VideoInformationPatch::class])
@Description("Enables downloading music and videos from YouTube.")
@DownloadsCompatibility
@Version("0.0.1")
@ -29,7 +29,7 @@ class DownloadsBytecodePatch : BytecodePatch() {
initialize the control
*/
val initializeDownloadsDescriptor = "$classDescriptor->initializeDownloadButton(Ljava/lang/Object;)V"
val initializeDownloadsDescriptor = "$classDescriptor->initializeButton(Ljava/lang/Object;)V"
PlayerControlsBytecodePatch.initializeControl(initializeDownloadsDescriptor)
/*
@ -39,14 +39,6 @@ class DownloadsBytecodePatch : BytecodePatch() {
val changeVisibilityDescriptor = "$classDescriptor->changeVisibility(Z)V"
PlayerControlsBytecodePatch.injectVisibilityCheckCall(changeVisibilityDescriptor)
/*
add code to change to update the video id
*/
val setVideoIdDescriptor =
"L$integrationsPackage/patches/downloads/DownloadsPatch;->setVideoId(Ljava/lang/String;)V"
VideoIdPatch.injectCall(setVideoIdDescriptor)
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,13 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.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 FixBackToExitGestureCompatibility

View File

@ -0,0 +1,14 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object OnBackPressedFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.RETURN_VOID
),
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("WatchWhileActivity;")
&& methodDef.name == "onBackPressed"
}
)

View File

@ -0,0 +1,19 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object RecyclerViewScrollingFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.IF_EQZ,
Opcode.IGET_OBJECT,
Opcode.CHECK_CAST,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IF_LEZ,
Opcode.IGET_OBJECT,
Opcode.CONST_4,
)
)

View File

@ -0,0 +1,27 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
object RecyclerViewTopScrollingFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf(), listOf(
Opcode.IGET_OBJECT,
Opcode.IF_EQZ,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT,
Opcode.IF_EQZ,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
Opcode.CONST_4,
Opcode.INVOKE_VIRTUAL,
Opcode.GOTO,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
)
)

View File

@ -0,0 +1,20 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object RecyclerViewTopScrollingParentFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.CONST_16,
Opcode.INVOKE_VIRTUAL,
Opcode.NEW_INSTANCE
),
customFingerprint = { methodDef ->
methodDef.name == "<init>"
}
)

View File

@ -0,0 +1,86 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.annotation.FixBackToExitGestureCompatibility
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.OnBackPressedFingerprint
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewScrollingFingerprint
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingFingerprint
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingParentFingerprint
@Description("Fixes the swipe back to exit gesture.")
@FixBackToExitGestureCompatibility
@Version("0.0.1")
class FixBackToExitGesturePatch : BytecodePatch(
listOf(
RecyclerViewTopScrollingParentFingerprint,
RecyclerViewScrollingFingerprint,
OnBackPressedFingerprint,
)
) {
override fun execute(context: BytecodeContext): PatchResult {
RecyclerViewTopScrollingFingerprint.apply {
resolve(
context,
RecyclerViewTopScrollingParentFingerprint.result?.classDef
?: return RecyclerViewTopScrollingParentFingerprint.toErrorResult()
)
}
mapOf(
RecyclerViewTopScrollingFingerprint to IntegrationsMethod(
methodName = "onTopView"
),
RecyclerViewScrollingFingerprint to IntegrationsMethod(
methodName = "onScrollingViews"
),
OnBackPressedFingerprint to IntegrationsMethod(
"p0", "onBackPressed", "Lcom/google/android/apps/youtube/app/watchwhile/WatchWhileActivity;"
)
).forEach { (fingerprint, target) ->
try {
fingerprint.injectCall(target)
} catch (error: PatchResultError) {
return error
}
}
return PatchResultSuccess()
}
private companion object {
/**
* A reference to a method from the integrations for [FixBackToExitGesturePatch].
*
* @param register The method registers.
* @param methodName The method name.
* @param parameterTypes The parameters of the method.
*/
data class IntegrationsMethod(
val register: String = "", val methodName: String, val parameterTypes: String = ""
) {
override fun toString() =
"invoke-static {$register}, Lapp/revanced/integrations/patches/FixBackToExitGesturePatch;->$methodName($parameterTypes)V"
}
/**
* Inject a call to a method from the integrations.
*
* @param targetMethod The target method to call.
*/
fun MethodFingerprint.injectCall(targetMethod: IntegrationsMethod) = result?.apply {
mutableMethod.addInstruction(
scanResult.patternScanResult!!.endIndex, targetMethod.toString()
)
} ?: throw this.toErrorResult()
}
}

View File

@ -20,6 +20,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.misc.video.information.annotation.VideoInformationCompatibility
import app.revanced.patches.youtube.misc.video.information.fingerprints.*
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.builder.MutableMethodImplementation
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@ -31,7 +32,7 @@ import org.jf.dexlib2.util.MethodUtil
@Description("Hooks YouTube to get information about the current playing video.")
@VideoInformationCompatibility
@Version("0.0.1")
@DependsOn([IntegrationsPatch::class])
@DependsOn([IntegrationsPatch::class, VideoIdPatch::class])
class VideoInformationPatch : BytecodePatch(
listOf(
PlayerInitFingerprint,
@ -94,6 +95,11 @@ class VideoInformationPatch : BytecodePatch(
}
}
/*
Inject call for video id
*/
VideoIdPatch.injectCall("$INTEGRATIONS_CLASS_DESCRIPTOR->setVideoId(Ljava/lang/String;)V")
/*
Set the video time method
*/

View File

@ -0,0 +1,51 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M3.938,0.051C3.449,0.145 2.906,0.57 2.652,1.051L2.531,1.281L2.531,18.906L2.633,19.117C2.836,19.516 3.348,19.945 3.758,20.066L3.891,20.105L3.891,1.781L4.027,1.633L4.164,1.477L11.063,1.461L17.961,1.453L17.93,1.32C17.844,0.98 17.422,0.461 17.078,0.266C16.555,-0.016 16.855,0 10.219,0.004C6.883,0.008 4.055,0.027 3.938,0.051ZM3.938,0.051"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M7.188,3.305C7.051,3.344 6.848,3.418 6.742,3.473C6.492,3.602 6.078,4.023 5.945,4.281C5.711,4.738 5.719,4.359 5.719,13.57C5.719,22.848 5.711,22.449 5.949,22.914C6.07,23.148 6.379,23.461 6.688,23.656C7.168,23.961 6.922,23.953 13.691,23.953C17.898,23.953 19.898,23.938 20.09,23.902C20.609,23.809 21.242,23.352 21.473,22.914C21.711,22.449 21.703,22.844 21.703,13.609C21.703,7.43 21.688,4.949 21.652,4.773C21.57,4.41 21.418,4.129 21.121,3.828C20.828,3.535 20.609,3.406 20.219,3.305C19.828,3.203 7.566,3.207 7.188,3.305ZM19.965,4.801C20.035,4.836 20.113,4.922 20.148,4.992C20.188,5.086 20.203,7.125 20.203,13.617L20.203,22.125L20.066,22.273L19.93,22.43L13.844,22.445C10.496,22.449 7.691,22.445 7.613,22.43C7.527,22.414 7.406,22.352 7.34,22.281L7.219,22.156L7.219,13.621C7.223,4.449 7.211,4.938 7.457,4.801C7.633,4.703 19.777,4.707 19.965,4.801ZM19.965,4.801"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M11.5,8.488C11.199,8.547 11.043,8.633 10.43,9.098C9.699,9.648 9.633,9.719 9.453,10.074C9.328,10.332 9.305,10.43 9.305,10.73C9.305,10.996 9.332,11.141 9.406,11.305C9.516,11.547 10.762,13.191 11.023,13.438C11.297,13.703 11.594,13.805 12.047,13.805C12.453,13.801 12.641,13.738 12.992,13.496L13.117,13.406L13.453,13.852L13.797,14.297L13.59,14.48C13.473,14.578 13.316,14.773 13.242,14.91C13.117,15.141 13.102,15.203 13.102,15.609C13.102,16.18 13.133,16.246 13.922,17.273C14.855,18.484 14.98,18.594 15.531,18.699C16.055,18.793 16.375,18.68 17.086,18.141C18.09,17.387 18.254,17.148 18.258,16.453C18.258,15.957 18.188,15.805 17.602,15.043C16.613,13.762 16.566,13.711 16.27,13.551C15.754,13.281 15.133,13.313 14.68,13.641C14.574,13.715 14.469,13.781 14.453,13.781C14.418,13.777 13.828,13.023 13.789,12.941C13.785,12.922 13.902,12.781 14.055,12.629C14.367,12.305 14.5,12 14.504,11.578C14.508,11.125 14.418,10.93 13.836,10.164C12.875,8.891 12.801,8.805 12.469,8.641C12.137,8.48 11.809,8.422 11.5,8.488ZM12.148,9.355C12.324,9.445 13.637,11.16 13.695,11.375C13.719,11.465 13.73,11.617 13.711,11.703C13.684,11.867 13.391,12.234 13.293,12.234C13.266,12.234 13.109,12.066 12.945,11.859C12.672,11.5 12.648,11.484 12.469,11.484C12.141,11.484 11.949,11.781 12.098,12.063C12.133,12.117 12.262,12.297 12.391,12.461L12.629,12.766L12.488,12.871C12.23,13.082 11.836,13.078 11.582,12.863C11.383,12.695 10.223,11.184 10.141,10.977C10.055,10.777 10.094,10.461 10.219,10.297C10.352,10.129 11.367,9.359 11.547,9.297C11.715,9.23 11.957,9.258 12.148,9.355ZM15.938,14.258C16.035,14.32 17.32,15.953 17.434,16.156C17.512,16.316 17.492,16.645 17.391,16.813C17.301,16.965 16.762,17.418 16.27,17.758C16.063,17.898 15.98,17.93 15.801,17.926C15.676,17.926 15.52,17.887 15.43,17.836C15.301,17.758 14.07,16.215 13.93,15.953C13.859,15.82 13.859,15.445 13.926,15.313C14,15.172 14.207,14.953 14.27,14.953C14.297,14.953 14.398,15.07 14.504,15.211C14.785,15.605 14.93,15.723 15.121,15.723C15.25,15.723 15.324,15.688 15.402,15.59C15.582,15.391 15.547,15.25 15.234,14.832C15.078,14.629 14.953,14.445 14.953,14.43C14.953,14.41 15.043,14.34 15.156,14.273C15.32,14.172 15.391,14.156 15.59,14.176C15.723,14.184 15.883,14.223 15.938,14.258ZM15.938,14.258"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M10.648,3.219C12.313,3.23 15.055,3.23 16.742,3.219C18.426,3.215 17.063,3.211 13.711,3.211C10.359,3.211 8.98,3.215 10.648,3.219ZM10.648,3.219"
android:fillColor="#FFFFFF"
android:fillAlpha="0.0588235"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M21.727,13.594C21.727,18.219 21.73,20.113 21.734,17.805C21.746,15.488 21.746,11.699 21.734,9.391C21.73,7.074 21.727,8.969 21.727,13.594ZM21.727,13.594"
android:fillColor="#FFFFFF"
android:fillAlpha="0.121569"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M5.477,1.484C6.074,1.496 7.047,1.496 7.633,1.484C8.219,1.48 7.727,1.477 6.539,1.477C5.352,1.477 4.875,1.48 5.477,1.484ZM5.477,1.484"
android:fillColor="#FFFFFF"
android:fillAlpha="0.160784"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M3.914,4.43C3.914,5.793 3.918,6.348 3.922,5.656C3.934,4.965 3.934,3.848 3.922,3.172C3.918,2.5 3.914,3.063 3.914,4.43ZM3.914,4.43"
android:fillColor="#FFFFFF"
android:fillAlpha="0.168627"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M5.695,13.594C5.695,18.219 5.699,20.113 5.703,17.805C5.715,15.488 5.715,11.699 5.703,9.391C5.699,7.074 5.695,8.969 5.695,13.594ZM5.695,13.594"
android:fillColor="#FFFFFF"
android:fillAlpha="0.180392"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,74 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M3.938,0.051C3.449,0.145 2.906,0.57 2.652,1.051L2.531,1.281L2.531,18.906L2.633,19.117C2.836,19.516 3.348,19.945 3.758,20.066L3.891,20.105L3.891,1.781L4.027,1.633L4.164,1.477L11.063,1.461L17.961,1.453L17.93,1.32C17.844,0.98 17.422,0.461 17.078,0.266C16.555,-0.016 16.855,0 10.219,0.004C6.883,0.008 4.055,0.027 3.938,0.051ZM3.938,0.051"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M7.188,3.305C7.051,3.344 6.848,3.418 6.742,3.473C6.492,3.602 6.078,4.023 5.945,4.281C5.711,4.738 5.719,4.359 5.719,13.57C5.719,22.848 5.711,22.449 5.949,22.914C6.07,23.148 6.379,23.461 6.688,23.656C7.168,23.961 6.922,23.953 13.691,23.953C17.898,23.953 19.898,23.938 20.09,23.902C20.609,23.809 21.242,23.352 21.473,22.914C21.711,22.449 21.703,22.844 21.703,13.609C21.703,7.43 21.688,4.949 21.652,4.773C21.57,4.41 21.418,4.129 21.121,3.828C20.828,3.535 20.609,3.406 20.219,3.305C19.828,3.203 7.566,3.207 7.188,3.305ZM19.965,4.801C20.035,4.836 20.113,4.922 20.148,4.992C20.188,5.086 20.203,7.125 20.203,13.617L20.203,22.125L20.066,22.273L19.93,22.43L13.844,22.445C10.496,22.449 7.691,22.445 7.613,22.43C7.527,22.414 7.406,22.352 7.34,22.281L7.219,22.156L7.219,13.621C7.223,4.449 7.211,4.938 7.457,4.801C7.633,4.703 19.777,4.707 19.965,4.801ZM19.965,4.801"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M12.953,9.207C11.172,9.547 9.801,10.828 9.32,12.613C9.164,13.18 9.168,14.188 9.324,14.789C9.707,16.281 10.742,17.438 12.16,17.973C13.504,18.477 15.023,18.305 16.25,17.508C17.277,16.836 17.977,15.777 18.238,14.508C18.324,14.105 18.309,13.223 18.211,12.773C17.996,11.746 17.469,10.883 16.641,10.18C16.211,9.824 15.422,9.422 14.859,9.281C14.348,9.148 13.426,9.117 12.953,9.207ZM14.508,10.008C15.301,10.176 15.934,10.539 16.504,11.148C18.234,12.984 17.676,15.984 15.398,17.086C14.785,17.383 14.438,17.461 13.734,17.457C13.27,17.457 13.074,17.434 12.777,17.352C12.191,17.184 11.629,16.871 11.203,16.469C8.953,14.352 9.965,10.672 12.984,10.004C13.344,9.922 14.117,9.93 14.508,10.008ZM14.508,10.008"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M13.563,10.5C13.5,10.523 13.41,10.613 13.359,10.695C13.27,10.844 13.266,10.938 13.266,12.336C13.266,13.152 13.285,13.875 13.309,13.938C13.336,14 13.402,14.102 13.457,14.152C13.563,14.246 13.609,14.25 15.086,14.25L16.602,14.25L16.738,14.113C16.848,14.008 16.875,13.938 16.875,13.781C16.875,13.625 16.848,13.555 16.738,13.449L16.602,13.313L14.254,13.313L14.242,12.023L14.227,10.734L14.105,10.617C13.973,10.484 13.719,10.43 13.563,10.5ZM13.563,10.5"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M10.648,3.219C12.313,3.23 15.055,3.23 16.742,3.219C18.426,3.215 17.063,3.211 13.711,3.211C10.359,3.211 8.98,3.215 10.648,3.219ZM10.648,3.219"
android:fillColor="#FFFFFF"
android:fillAlpha="0.0588235"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M14.27,12.117C14.27,12.758 14.277,13.031 14.281,12.719C14.293,12.402 14.293,11.879 14.281,11.547C14.277,11.219 14.27,11.469 14.27,12.117ZM14.27,12.117"
android:fillColor="#FFFFFF"
android:fillAlpha="0.0117647"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M21.727,13.594C21.727,18.219 21.73,20.113 21.734,17.805C21.746,15.488 21.746,11.699 21.734,9.391C21.73,7.074 21.727,8.969 21.727,13.594ZM21.727,13.594"
android:fillColor="#FFFFFF"
android:fillAlpha="0.121569"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M14.828,13.297C15.133,13.309 15.613,13.309 15.906,13.297C16.195,13.293 15.945,13.285 15.352,13.285C14.762,13.285 14.523,13.293 14.828,13.297ZM14.828,13.297"
android:fillColor="#FFFFFF"
android:fillAlpha="0.188235"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M5.477,1.484C6.074,1.496 7.047,1.496 7.633,1.484C8.219,1.48 7.727,1.477 6.539,1.477C5.352,1.477 4.875,1.48 5.477,1.484ZM5.477,1.484"
android:fillColor="#FFFFFF"
android:fillAlpha="0.160784"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M14.477,14.281C14.844,14.293 15.438,14.293 15.789,14.281C16.141,14.277 15.84,14.27 15.117,14.27C14.395,14.27 14.105,14.277 14.477,14.281ZM14.477,14.281"
android:fillColor="#FFFFFF"
android:fillAlpha="0.4"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M3.914,4.43C3.914,5.793 3.918,6.348 3.922,5.656C3.934,4.965 3.934,3.848 3.922,3.172C3.918,2.5 3.914,3.063 3.914,4.43ZM3.914,4.43"
android:fillColor="#FFFFFF"
android:fillAlpha="0.168627"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M5.695,13.594C5.695,18.219 5.699,20.113 5.703,17.805C5.715,15.488 5.715,11.699 5.703,9.391C5.699,7.074 5.695,8.969 5.695,13.594ZM5.695,13.594"
android:fillColor="#FFFFFF"
android:fillAlpha="0.180392"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yt="http://schemas.android.com/apk/res-auto" android:id="@+id/youtube_controls_bottom_ui_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layoutDirection="ltr">
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_timestamp_button" android:paddingLeft="12dp" android:paddingTop="22dp" android:paddingRight="12dp" android:paddingBottom="16dp" android:longClickable="false" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/revanced_yt_copy_timestamp" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" style="@style/YouTubePlayerButton"/>
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_button" android:paddingLeft="12dp" android:paddingTop="22dp" android:paddingRight="12dp" android:paddingBottom="16dp" android:longClickable="false" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/revanced_yt_copy" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" style="@style/YouTubePlayerButton"/>
</android.support.constraint.ConstraintLayout>