chore: merge branch dev to main (#1978)

This commit is contained in:
oSumAtrIX 2023-04-27 23:35:32 +02:00 committed by GitHub
commit 1b2627fec6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 178 additions and 140 deletions

View file

@ -1,3 +1,45 @@
# [2.171.0-dev.5](https://github.com/revanced/revanced-patches/compare/v2.171.0-dev.4...v2.171.0-dev.5) (2023-04-27)
### Bug Fixes
* **enable-android-debugging:** make option `debuggable` false by default ([e717e26](https://github.com/revanced/revanced-patches/commit/e717e260fd0449a97929c3c82da577362586c5e1))
# [2.171.0-dev.4](https://github.com/revanced/revanced-patches/compare/v2.171.0-dev.3...v2.171.0-dev.4) (2023-04-27)
### Bug Fixes
* **youtube/minimized-playback:** disable minimized playback for shorts ([#1990](https://github.com/revanced/revanced-patches/issues/1990)) ([b91d18d](https://github.com/revanced/revanced-patches/commit/b91d18d24f332a9aa8721dc053e395d352b5796d))
# [2.171.0-dev.3](https://github.com/revanced/revanced-patches/compare/v2.171.0-dev.2...v2.171.0-dev.3) (2023-04-26)
### Features
* **youtube/sponsorblock:** automatically hide skip button ([#1956](https://github.com/revanced/revanced-patches/issues/1956)) ([c3c8ae6](https://github.com/revanced/revanced-patches/commit/c3c8ae6b4377b12838971cedc32779e12c07363c))
# [2.171.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.171.0-dev.1...v2.171.0-dev.2) (2023-04-25)
### Features
* **youtube:** `hide-player-overlay` patch ([#1965](https://github.com/revanced/revanced-patches/issues/1965)) ([d233d96](https://github.com/revanced/revanced-patches/commit/d233d96faf838b22f4c458ad445af048362e7421))
# [2.171.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.170.1-dev.1...v2.171.0-dev.1) (2023-04-25)
### Features
* **id-austria:** remove compatibility version constraint ([#1952](https://github.com/revanced/revanced-patches/issues/1952)) ([94ffd5a](https://github.com/revanced/revanced-patches/commit/94ffd5a26fe42f223a09ad6bd7f34f1fac0986ad))
## [2.170.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.170.0...v2.170.1-dev.1) (2023-04-25)
### Bug Fixes
* **youtube/spoof-signature-verification:** additional fixes for subtitle window positions ([#1975](https://github.com/revanced/revanced-patches/issues/1975)) ([08584e6](https://github.com/revanced/revanced-patches/commit/08584e680fc658f37e8730499fa5197a08370776))
# [2.170.0](https://github.com/revanced/revanced-patches/compare/v2.169.0...v2.170.0) (2023-04-24) # [2.170.0](https://github.com/revanced/revanced-patches/compare/v2.169.0...v2.170.0) (2023-04-24)

View file

@ -38,6 +38,7 @@ The official Patch bundle provided by ReVanced and the community.
| `hide-floating-microphone-button` | Hides the floating microphone button which appears in search. | 18.15.40 | | `hide-floating-microphone-button` | Hides the floating microphone button which appears in search. | 18.15.40 |
| `hide-info-cards` | Hides info cards in videos. | 18.15.40 | | `hide-info-cards` | Hides info cards in videos. | 18.15.40 |
| `hide-player-buttons` | Adds the option to hide video player previous and next buttons. | all | | `hide-player-buttons` | Adds the option to hide video player previous and next buttons. | all |
| `hide-player-overlay` | Hides the dark player overlay when player controls are visible. | all |
| `hide-seekbar` | Hides the seekbar. | 18.15.40 | | `hide-seekbar` | Hides the seekbar. | 18.15.40 |
| `hide-shorts-button` | Hides the shorts button on the navigation bar. | 18.15.40 | | `hide-shorts-button` | Hides the shorts button on the navigation bar. | 18.15.40 |
| `hide-timestamp` | Hides timestamp in video player. | 18.15.40 | | `hide-timestamp` | Hides timestamp in video player. | 18.15.40 |
@ -181,8 +182,8 @@ The official Patch bundle provided by ReVanced and the community.
| 💊 Patch | 📜 Description | 🏹 Target Version | | 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:| |:--------:|:--------------:|:-----------------:|
| `remove-root-detection` | Removes the check for root permissions and unlocked bootloader. | 2.6.0 | | `remove-root-detection` | Removes the check for root permissions and unlocked bootloader. | all |
| `spoof-signature` | Spoofs the signature of the app. | 2.6.0 | | `spoof-signature` | Spoofs the signature of the app. | all |
</details> </details>
### [📦 `com.myprog.hexedit`](https://play.google.com/store/apps/details?id=com.myprog.hexedit) ### [📦 `com.myprog.hexedit`](https://play.google.com/store/apps/details?id=com.myprog.hexedit)
@ -305,14 +306,6 @@ The official Patch bundle provided by ReVanced and the community.
| `unlock-prime` | Unlocks Nova Prime and all functions of the app. | all | | `unlock-prime` | Unlocks Nova Prime and all functions of the app. | all |
</details> </details>
### [📦 `ginlemon.iconpackstudio`](https://play.google.com/store/apps/details?id=ginlemon.iconpackstudio)
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `unlock-pro` | Unlocks all pro features. | all |
</details>
### [📦 `co.windyapp.android`](https://play.google.com/store/apps/details?id=co.windyapp.android) ### [📦 `co.windyapp.android`](https://play.google.com/store/apps/details?id=co.windyapp.android)
<details> <details>
@ -321,14 +314,6 @@ The official Patch bundle provided by ReVanced and the community.
| `unlock-pro` | Unlocks all pro features. | all | | `unlock-pro` | Unlocks all pro features. | all |
</details> </details>
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `unlock-pro` | Unlocks pro features. | all |
</details>
### [📦 `org.totschnig.myexpenses`](https://play.google.com/store/apps/details?id=org.totschnig.myexpenses) ### [📦 `org.totschnig.myexpenses`](https://play.google.com/store/apps/details?id=org.totschnig.myexpenses)
<details> <details>
@ -345,6 +330,22 @@ The official Patch bundle provided by ReVanced and the community.
| `unlock-pro` | Unlocks pro features. | 4.6364 | | `unlock-pro` | Unlocks pro features. | 4.6364 |
</details> </details>
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `unlock-pro` | Unlocks pro features. | all |
</details>
### [📦 `ginlemon.iconpackstudio`](https://play.google.com/store/apps/details?id=ginlemon.iconpackstudio)
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `unlock-pro` | Unlocks all pro features. | all |
</details>
### [📦 `com.awedea.nyx`](https://play.google.com/store/apps/details?id=com.awedea.nyx) ### [📦 `com.awedea.nyx`](https://play.google.com/store/apps/details?id=com.awedea.nyx)
<details> <details>

View file

@ -1,2 +1,2 @@
kotlin.code.style = official kotlin.code.style = official
version = 2.170.0 version = 2.171.0-dev.5

File diff suppressed because one or more lines are too long

View file

@ -33,7 +33,7 @@ class EnableAndroidDebuggingPatch : ResourcePatch {
var debuggable: Boolean? by option( var debuggable: Boolean? by option(
PatchOption.BooleanOption( PatchOption.BooleanOption(
key = "debuggable", key = "debuggable",
default = true, default = false,
title = "App debugging", title = "App debugging",
description = "Whether to make the app debuggable on Android.", description = "Whether to make the app debuggable on Android.",
) )

View file

@ -3,6 +3,6 @@ package app.revanced.patches.idaustria.detection.shared.annotations
import app.revanced.patcher.annotation.Compatibility import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package import app.revanced.patcher.annotation.Package
@Compatibility([Package("at.gv.oe.app", arrayOf("2.5.2", "2.6.0"))]) @Compatibility([Package("at.gv.oe.app")])
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
internal annotation class DetectionCompatibility internal annotation class DetectionCompatibility

View file

@ -0,0 +1,8 @@
package app.revanced.patches.youtube.layout.hide.player.overlay.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.google.android.youtube")])
@Target(AnnotationTarget.CLASS)
internal annotation class HidePlayerOverlayPatchCompatibility

View file

@ -0,0 +1,46 @@
package app.revanced.patches.youtube.layout.hide.player.overlay.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.Patch
import app.revanced.patches.youtube.layout.hide.player.overlay.annotations.HidePlayerOverlayPatchCompatibility
@Patch
@Name("hide-player-overlay")
@Description("Hides the dark player overlay when player controls are visible.")
@HidePlayerOverlayPatchCompatibility
@Version("0.0.1")
class HidePlayerOverlayPatch : ResourcePatch {
override fun execute(context: ResourceContext): PatchResult {
val attributes = arrayOf("height", "width")
context.xmlEditor[RESOURCE_FILE_PATH].use { editor ->
editor.file.getElementsByTagName("FrameLayout").item(0).childNodes.apply {
for (i in 1 until length) {
val view = item(i)
if (
view.attributes.getNamedItem("android:id")
?.nodeValue
?.endsWith("scrim_overlay") == true
) {
attributes.forEach {
view.attributes.getNamedItem("android:layout_$it").nodeValue = "0.0dip"
}
break
}
}
}
}
return PatchResultSuccess()
}
private companion object {
const val RESOURCE_FILE_PATH = "res/layout/youtube_controls_overlay.xml"
}
}

View file

@ -24,6 +24,7 @@ import app.revanced.patches.youtube.misc.fix.playback.fingerprints.SubtitleWindo
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
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.video.videoid.patch.VideoIdPatch
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@Patch @Patch
@ -34,7 +35,8 @@ import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
IntegrationsPatch::class, IntegrationsPatch::class,
SettingsPatch::class, SettingsPatch::class,
PlayerTypeHookPatch::class, PlayerTypeHookPatch::class,
ClientSpoofPatch::class ClientSpoofPatch::class,
VideoIdPatch::class
]) ])
@Version("0.0.1") @Version("0.0.1")
class SpoofSignatureVerificationPatch : BytecodePatch( class SpoofSignatureVerificationPatch : BytecodePatch(
@ -57,6 +59,9 @@ class SpoofSignatureVerificationPatch : BytecodePatch(
) )
) )
// Hook video id, required for subtitle fix.
VideoIdPatch.injectCall("$INTEGRATIONS_CLASS_DESCRIPTOR->setCurrentVideoId(Ljava/lang/String;)V")
// hook parameter // hook parameter
ProtobufParameterBuilderFingerprint.result?.let { ProtobufParameterBuilderFingerprint.result?.let {
val setParamMethod = context val setParamMethod = context
@ -102,7 +107,7 @@ class SpoofSignatureVerificationPatch : BytecodePatch(
invoke-static {p1, p2, p3, p4, p5}, $INTEGRATIONS_CLASS_DESCRIPTOR->getSubtitleWindowSettingsOverride(IIIZZ)[I invoke-static {p1, p2, p3, p4, p5}, $INTEGRATIONS_CLASS_DESCRIPTOR->getSubtitleWindowSettingsOverride(IIIZZ)[I
move-result-object v0 move-result-object v0
const/4 v1, 0x0 const/4 v1, 0x0
aget p1, v0, v1 # ap, anchor configuration aget p1, v0, v1 # ap, anchor position
const/4 v1, 0x1 const/4 v1, 0x1
aget p2, v0, v1 # ah, horizontal anchor aget p2, v0, v1 # ah, horizontal anchor
const/4 v1, 0x2 const/4 v1, 0x2

View file

@ -1,23 +0,0 @@
package app.revanced.patches.youtube.misc.minimizedplayback.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 KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerprint(
"V",
AccessFlags.PUBLIC or AccessFlags.FINAL,
listOf("I", "L", "L"),
listOf(
Opcode.IF_EQZ,
Opcode.SGET_OBJECT,
Opcode.IF_NE,
Opcode.CONST_4,
Opcode.IPUT_BOOLEAN,
Opcode.IF_EQZ,
Opcode.IGET,
Opcode.INVOKE_STATIC
),
customFingerprint = { it.definingClass.endsWith("MinimizedPlaybackPolicyController;") }
)

View file

@ -1,16 +0,0 @@
package app.revanced.patches.youtube.misc.minimizedplayback.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 PipControllerFingerprint : MethodFingerprint(
returnType = "L",
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("L"),
opcodes = listOf(
Opcode.IGET_BOOLEAN
),
customFingerprint = { it.definingClass.endsWith("DefaultPipController;") }
)

View file

@ -7,28 +7,23 @@ import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.data.toMethodWalker import app.revanced.patcher.data.toMethodWalker
import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.instruction
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult 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.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.shared.settings.preference.impl.NonInteractivePreference
import app.revanced.patches.shared.settings.preference.impl.StringResource 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.minimizedplayback.annotations.MinimizedPlaybackCompatibility import app.revanced.patches.youtube.misc.minimizedplayback.annotations.MinimizedPlaybackCompatibility
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.PipControllerFingerprint
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
import org.jf.dexlib2.iface.instruction.ReferenceInstruction import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
import org.jf.dexlib2.iface.reference.MethodReference import org.jf.dexlib2.iface.reference.MethodReference
@Patch @Patch
@Name("minimized-playback") @Name("minimized-playback")
@Description("Enables minimized and background playback.") @Description("Enables minimized and background playback.")
@ -37,34 +32,31 @@ import org.jf.dexlib2.iface.reference.MethodReference
@Version("0.0.1") @Version("0.0.1")
class MinimizedPlaybackPatch : BytecodePatch( class MinimizedPlaybackPatch : BytecodePatch(
listOf( listOf(
KidsMinimizedPlaybackPolicyControllerFingerprint,
MinimizedPlaybackManagerFingerprint, MinimizedPlaybackManagerFingerprint,
MinimizedPlaybackSettingsFingerprint, MinimizedPlaybackSettingsFingerprint
PipControllerFingerprint
) )
) { ) {
override fun execute(context: BytecodeContext): PatchResult { override fun execute(context: BytecodeContext): PatchResult {
// TODO: remove this empty preference sometime after mid 2023
SettingsPatch.PreferenceScreen.MISC.addPreferences( SettingsPatch.PreferenceScreen.MISC.addPreferences(
SwitchPreference( NonInteractivePreference(
"revanced_enable_minimized_playback", StringResource("revanced_minimized_playback_enabled_title", "Minimized playback"),
StringResource("revanced_minimized_playback_enabled_title", "Enable minimized playback"), StringResource("revanced_minimized_playback_summary_on", "This setting can be found in Settings -> General")
true,
StringResource("revanced_minimized_playback_summary_on", "Minimized playback is enabled"),
StringResource("revanced_minimized_playback_summary_off", "Minimized playback is disabled")
) )
) )
MinimizedPlaybackManagerFingerprint.result?.apply { MinimizedPlaybackManagerFingerprint.result?.apply {
mutableMethod.addInstructions( mutableMethod.addInstructions(
0, """ 0, """
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->isMinimizedPlaybackEnabled()Z invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->isPlaybackNotShort()Z
move-result v0 move-result v0
return v0 return v0
""" """
) )
} ?: return MinimizedPlaybackManagerFingerprint.toErrorResult() } ?: return MinimizedPlaybackManagerFingerprint.toErrorResult()
val method = MinimizedPlaybackSettingsFingerprint.result!!.mutableMethod // Enable minimized playback option in YouTube settings
MinimizedPlaybackSettingsFingerprint.result?.apply {
val booleanCalls = method.implementation!!.instructions.withIndex() val booleanCalls = method.implementation!!.instructions.withIndex()
.filter { ((it.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z" } .filter { ((it.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z" }
@ -74,38 +66,13 @@ class MinimizedPlaybackPatch : BytecodePatch(
settingsBooleanMethod.addInstructions( settingsBooleanMethod.addInstructions(
0, """ 0, """
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->isMinimizedPlaybackEnabled()Z invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->overrideMinimizedPlaybackAvailable()Z
move-result v0 move-result v0
return v0 return v0
""" """
) )
} ?: return MinimizedPlaybackSettingsFingerprint.toErrorResult()
KidsMinimizedPlaybackPolicyControllerFingerprint.result?.apply {
mutableMethod.addInstructions(
0, """
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->isMinimizedPlaybackEnabled()Z
move-result v0
if-eqz v0, :enable
return-void
:enable
nop
"""
)
} ?: return KidsMinimizedPlaybackPolicyControllerFingerprint.toErrorResult()
PipControllerFingerprint.result?.apply {
val insertIndex = scanResult.patternScanResult!!.endIndex + 1
val pipEnabledRegister = (mutableMethod.instruction(insertIndex - 1) as TwoRegisterInstruction).registerA
mutableMethod.addInstructions(
insertIndex,
"""
invoke-static {v$pipEnabledRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->isNotPlayingShorts(Z)Z
move-result v$pipEnabledRegister
"""
)
} ?: return PipControllerFingerprint.toErrorResult()
return PatchResultSuccess() return PatchResultSuccess()
} }

View file

@ -2,42 +2,59 @@
<resources> <resources>
<string name="sb_enable_sb">Enable SponsorBlock</string> <string name="sb_enable_sb">Enable SponsorBlock</string>
<string name="sb_enable_sb_sum">SponsorBlock is a crowd-sourced system for skipping annoying parts of YouTube videos</string> <string name="sb_enable_sb_sum">SponsorBlock is a crowd-sourced system for skipping annoying parts of YouTube videos</string>
<string name="sb_appearance_category">Appearance</string>
<string name="sb_enable_voting">Show voting button</string> <string name="sb_enable_voting">Show voting button</string>
<string name="sb_enable_voting_sum_on">Segment voting button is shown</string> <string name="sb_enable_voting_sum_on">Segment voting button is shown</string>
<string name="sb_enable_voting_sum_off">Segment voting button is not shown</string> <string name="sb_enable_voting_sum_off">Segment voting button is not shown</string>
<string name="sb_enable_create_segment">Show create new segment button</string>
<string name="sb_enable_create_segment_sum_on">Create new segment button is shown</string>
<string name="sb_enable_create_segment_sum_off">Create new segment button is not shown</string>
<string name="sb_enable_compact_skip_button">Use compact skip button</string> <string name="sb_enable_compact_skip_button">Use compact skip button</string>
<string name="sb_enable_compact_skip_button_sum_on">Skip button styled for minimum width</string> <string name="sb_enable_compact_skip_button_sum_on">Skip button styled for minimum width</string>
<string name="sb_enable_compact_skip_button_sum_off">Skip button styled for best appearance</string> <string name="sb_enable_compact_skip_button_sum_off">Skip button styled for best appearance</string>
<string name="sb_diff_segments">What to do with different segments</string> <string name="sb_enable_auto_hide_skip_segment_button">Automatically hide skip button</string>
<string name="sb_general">General</string> <string name="sb_enable_auto_hide_skip_segment_button_sum_on">Skip button hides after a few seconds</string>
<string name="sb_general_skiptoast">Show a toast when skipping segment automatically</string> <string name="sb_enable_auto_hide_skip_segment_button_sum_off">Skip button displayed for entire segment</string>
<string name="sb_general_skiptoast">Show a toast when skipping automatically</string>
<string name="sb_general_skiptoast_sum_on">Toast shown when a segment is automatically skipped. Tap here to see an example</string> <string name="sb_general_skiptoast_sum_on">Toast shown when a segment is automatically skipped. Tap here to see an example</string>
<string name="sb_general_skiptoast_sum_off">Toast not shown. Tap here to see an example</string> <string name="sb_general_skiptoast_sum_off">Toast not shown. Tap here to see an example</string>
<string name="sb_general_skipcount">Enable skip count tracking</string>
<string name="sb_general_skipcount_sum_on">Lets the SponsorBlock leaderboard know how much time is saved. A message is sent to the leaderboard each time a segment is skipped</string>
<string name="sb_general_skipcount_sum_off">Skip count tracking is not enabled</string>
<string name="sb_general_time_without">Show video length without segments</string> <string name="sb_general_time_without">Show video length without segments</string>
<string name="sb_general_time_without_sum_on">Video length minus all segments, shown in parentheses next to the full video length</string> <string name="sb_general_time_without_sum_on">Video length minus all segments, shown in parentheses next to the full video length</string>
<string name="sb_general_time_without_sum_off">Full video length shown</string> <string name="sb_general_time_without_sum_off">Full video length shown</string>
<string name="sb_create_segment_category">Creating new segments</string>
<string name="sb_enable_create_segment">Show create new segment button</string>
<string name="sb_enable_create_segment_sum_on">Create new segment button is shown</string>
<string name="sb_enable_create_segment_sum_off">Create new segment button is not shown</string>
<string name="sb_general_adjusting">Adjust new segment step</string> <string name="sb_general_adjusting">Adjust new segment step</string>
<string name="sb_general_adjusting_sum">Number of milliseconds the time adjustment buttons move when creating new segments</string> <string name="sb_general_adjusting_sum">Number of milliseconds the time adjustment buttons move when creating new segments</string>
<string name="sb_general_adjusting_invalid">Value must be a positive number</string> <string name="sb_general_adjusting_invalid">Value must be a positive number</string>
<string name="sb_guidelines_preference_title">View guidelines</string>
<string name="sb_guidelines_preference_sum">Guidelines contain rules and tips for creating new segments</string>
<string name="sb_guidelines_popup_title">Follow the guidelines</string>
<string name="sb_guidelines_popup_content">Read the SponsorBlock guidelines before creating new segments</string>
<string name="sb_guidelines_popup_already_read">Already read</string>
<string name="sb_guidelines_popup_open">Show me</string>
<string name="sb_general">General</string>
<string name="sb_general_skipcount">Enable skip count tracking</string>
<string name="sb_general_skipcount_sum_on">Lets the SponsorBlock leaderboard know how much time is saved. A message is sent to the leaderboard each time a segment is skipped</string>
<string name="sb_general_skipcount_sum_off">Skip count tracking is not enabled</string>
<string name="sb_general_min_duration">Minimum segment duration</string> <string name="sb_general_min_duration">Minimum segment duration</string>
<string name="sb_general_min_duration_sum">Segments shorter than this value (in seconds) will not be shown or skipped</string> <string name="sb_general_min_duration_sum">Segments shorter than this value (in seconds) will not be shown or skipped</string>
<string name="sb_general_uuid">Your private user id</string> <string name="sb_general_uuid">Your private user id</string>
<string name="sb_general_uuid_sum">This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you</string> <string name="sb_general_uuid_sum">This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you</string>
<string name="sb_general_uuid_invalid">User id cannot be blank</string> <string name="sb_general_uuid_invalid">User id cannot be blank</string>
<string name="sb_general_api_url">Change API URL</string>
<string name="sb_general_api_url_sum">The address SponsorBlock uses to make calls to the server. Do not change this unless you know what you\'re doing</string>
<string name="sb_api_url_reset">API URL reset</string>
<string name="sb_api_url_invalid">API URL is invalid</string>
<string name="sb_api_url_changed">API URL changed</string>
<string name="sb_settings_ie">Import/Export settings</string> <string name="sb_settings_ie">Import/Export settings</string>
<string name="sb_settings_ie_sum">Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms. This includes your private user id. Be sure to share this wisely</string> <string name="sb_settings_ie_sum">Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms. This includes your private user id. Be sure to share this wisely</string>
<string name="sb_general_api_url">Change API URL</string>
<string name="sb_general_api_url_sum">The address SponsorBlock uses to make calls to the server. &lt;b>Don\'t change this unless you know what you\'re doing&lt;/b></string>
<string name="sb_settings_import_successful">Settings imported successfully</string> <string name="sb_settings_import_successful">Settings imported successfully</string>
<string name="sb_settings_import_failed">Failed to import: %s</string> <string name="sb_settings_import_failed">Failed to import: %s</string>
<string name="sb_settings_export_failed">Failed to export settings (try clearing app data)</string> <string name="sb_settings_export_failed">Failed to export settings (try clearing app data)</string>
<string name="sb_diff_segments">Change segment behavior</string>
<string name="sb_segments_sponsor">Sponsor</string> <string name="sb_segments_sponsor">Sponsor</string>
<string name="sb_segments_sponsor_sum">Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shout-outs to causes/creators/websites/products they like</string> <string name="sb_segments_sponsor_sum">Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shout-outs to causes/creators/websites/products they like</string>
<string name="sb_segments_selfpromo">Unpaid/Self Promotion</string> <string name="sb_segments_selfpromo">Unpaid/Self Promotion</string>
@ -96,11 +113,6 @@
<string name="sb_skip_seekbaronly">Show in seek bar</string> <string name="sb_skip_seekbaronly">Show in seek bar</string>
<string name="sb_skip_ignore">Disable</string> <string name="sb_skip_ignore">Disable</string>
<string name="sb_about">About</string>
<string name="sb_about_api">sponsor.ajay.app</string>
<string name="sb_about_api_sum">Data is provided by the SponsorBlock API. Tap here to learn more and see downloads for other platforms</string>
<string name="sb_about_made_by">ReVanced integration by JakubWeg,\nrecoded by oSumAtrIX</string>
<string name="sb_submit_failed_invalid" formatted="false">Can\'t submit the segment: %s</string> <string name="sb_submit_failed_invalid" formatted="false">Can\'t submit the segment: %s</string>
<string name="sb_submit_failed_timeout">Unable to submit segments (API timed out)</string> <string name="sb_submit_failed_timeout">Unable to submit segments (API timed out)</string>
<string name="sb_submit_failed_unknown_error" formatted="false">Unable to submit segments (status: %d %s)</string> <string name="sb_submit_failed_unknown_error" formatted="false">Unable to submit segments (status: %d %s)</string>
@ -139,13 +151,6 @@
<string name="sb_new_segment_edit_by_hand_content">Do you want to edit the timing for the start or end of the segment?</string> <string name="sb_new_segment_edit_by_hand_content">Do you want to edit the timing for the start or end of the segment?</string>
<string name="sb_new_segment_edit_by_hand_parse_error">Invalid time given</string> <string name="sb_new_segment_edit_by_hand_parse_error">Invalid time given</string>
<string name="sb_guidelines_preference_title">View guidelines</string>
<string name="sb_guidelines_preference_sum">Guidelines contain rules and tips for creating new segments</string>
<string name="sb_guidelines_popup_title">Follow the guidelines</string>
<string name="sb_guidelines_popup_content">Read the SponsorBlock guidelines before creating new segments</string>
<string name="sb_guidelines_popup_already_read">Already read</string>
<string name="sb_guidelines_popup_open">Show me</string>
<string name="sb_stats">Stats</string> <string name="sb_stats">Stats</string>
<string name="sb_stats_connection_failure">Stats temporarily not available (API is down)</string> <string name="sb_stats_connection_failure">Stats temporarily not available (API is down)</string>
<string name="sb_stats_loading">Loading...</string> <string name="sb_stats_loading">Loading...</string>
@ -166,6 +171,7 @@
<string name="sb_stats_saved_hour_format" formatted="false">%d hours %d minutes</string> <string name="sb_stats_saved_hour_format" formatted="false">%d hours %d minutes</string>
<string name="sb_stats_saved_minute_format" formatted="false">%d minutes %d seconds</string> <string name="sb_stats_saved_minute_format" formatted="false">%d minutes %d seconds</string>
<string name="sb_stats_saved_second_format" formatted="false">%d seconds</string> <string name="sb_stats_saved_second_format" formatted="false">%d seconds</string>
<string name="sb_color_dot_label">Color:</string> <string name="sb_color_dot_label">Color:</string>
<string name="sb_color_changed">Color changed</string> <string name="sb_color_changed">Color changed</string>
<string name="sb_color_reset">Color reset</string> <string name="sb_color_reset">Color reset</string>
@ -173,7 +179,9 @@
<string name="sb_reset_color">Reset color</string> <string name="sb_reset_color">Reset color</string>
<string name="sb_reset">Reset</string> <string name="sb_reset">Reset</string>
<string name="sb_api_url_reset">API URL reset</string>
<string name="sb_api_url_invalid">API URL is invalid</string> <string name="sb_about">About</string>
<string name="sb_api_url_changed">API URL changed</string> <string name="sb_about_api">sponsor.ajay.app</string>
<string name="sb_about_api_sum">Data is provided by the SponsorBlock API. Tap here to learn more and see downloads for other platforms</string>
<string name="sb_about_made_by">ReVanced integration by JakubWeg,\nrecoded by oSumAtrIX</string>
</resources> </resources>