mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-15 21:52:27 +01:00
Compare commits
6 Commits
v5.21.0-de
...
v5.21.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6114807c43 | ||
|
|
6d69f01421 | ||
|
|
fd4218154d | ||
|
|
8bed8a6622 | ||
|
|
3174047223 | ||
|
|
15053e2b68 |
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,3 +1,17 @@
|
||||
# [5.21.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.21.0-dev.9...v5.21.0-dev.10) (2025-04-23)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Swipe controls:** Add option for vertical progress bar ([#4811](https://github.com/ReVanced/revanced-patches/issues/4811)) ([ebee07e](https://github.com/ReVanced/revanced-patches/commit/ebee07ec3aba6fd3adbd8e0af30390e197879d89))
|
||||
|
||||
# [5.21.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.21.0-dev.8...v5.21.0-dev.9) (2025-04-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Hide video action buttons:** Hide A/B layout buttons ([4db5d3c](https://github.com/ReVanced/revanced-patches/commit/4db5d3c3d5ac04faf70cc07fb309b324d752e7e3))
|
||||
|
||||
# [5.21.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.21.0-dev.7...v5.21.0-dev.8) (2025-04-20)
|
||||
|
||||
|
||||
|
||||
@@ -342,9 +342,12 @@ public abstract class Setting<T> {
|
||||
|
||||
/**
|
||||
* Identical to calling {@link #save(Object)} using {@link #defaultValue}.
|
||||
*
|
||||
* @return The newly saved default value.
|
||||
*/
|
||||
public void resetToDefault() {
|
||||
public T resetToDefault() {
|
||||
save(defaultValue);
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -17,8 +17,7 @@ public class CustomPlayerOverlayOpacityPatch {
|
||||
|
||||
if (opacity < 0 || opacity > 100) {
|
||||
Utils.showToastLong(str("revanced_player_overlay_opacity_invalid_toast"));
|
||||
Settings.PLAYER_OVERLAY_OPACITY.resetToDefault();
|
||||
opacity = Settings.PLAYER_OVERLAY_OPACITY.defaultValue;
|
||||
opacity = Settings.PLAYER_OVERLAY_OPACITY.resetToDefault();
|
||||
}
|
||||
|
||||
PLAYER_OVERLAY_OPACITY_LEVEL = (opacity * 255) / 100;
|
||||
|
||||
@@ -162,8 +162,7 @@ public final class MiniplayerPatch {
|
||||
|
||||
if (opacity < 0 || opacity > 100) {
|
||||
Utils.showToastLong(str("revanced_miniplayer_opacity_invalid_toast"));
|
||||
Settings.MINIPLAYER_OPACITY.resetToDefault();
|
||||
opacity = Settings.MINIPLAYER_OPACITY.defaultValue;
|
||||
opacity = Settings.MINIPLAYER_OPACITY.resetToDefault();
|
||||
}
|
||||
|
||||
OPACITY_LEVEL = (opacity * 255) / 100;
|
||||
|
||||
@@ -31,7 +31,7 @@ final class ButtonsFilter extends Filter {
|
||||
|
||||
bufferFilterPathGroup = new StringFilterGroup(
|
||||
null,
|
||||
"|ContainerType|button.eml|"
|
||||
"|ContainerType|button.eml"
|
||||
);
|
||||
|
||||
addPathCallbacks(
|
||||
@@ -43,7 +43,7 @@ final class ButtonsFilter extends Filter {
|
||||
),
|
||||
new StringFilterGroup(
|
||||
Settings.HIDE_DOWNLOAD_BUTTON,
|
||||
"|download_button.eml|"
|
||||
"|download_button.eml"
|
||||
),
|
||||
new StringFilterGroup(
|
||||
Settings.HIDE_PLAYLIST_BUTTON,
|
||||
@@ -51,7 +51,7 @@ final class ButtonsFilter extends Filter {
|
||||
),
|
||||
new StringFilterGroup(
|
||||
Settings.HIDE_CLIP_BUTTON,
|
||||
"|clip_button.eml|"
|
||||
"|clip_button.eml"
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -211,7 +211,7 @@ public final class LayoutComponentsFilter extends Filter {
|
||||
|
||||
compactChannelBarInnerButton = new StringFilterGroup(
|
||||
null,
|
||||
"|button.eml|"
|
||||
"|button.eml"
|
||||
);
|
||||
|
||||
joinMembershipButton = new ByteArrayFilterGroup(
|
||||
|
||||
@@ -40,7 +40,7 @@ public class PlayerFlyoutMenuItemsFilter extends Filter {
|
||||
|
||||
addPathCallbacks(
|
||||
videoQualityMenuFooter,
|
||||
new StringFilterGroup(null, "overflow_menu_item.eml|")
|
||||
new StringFilterGroup(null, "overflow_menu_item.eml")
|
||||
);
|
||||
|
||||
flyoutFilterGroupList.addAll(
|
||||
|
||||
@@ -54,12 +54,12 @@ public class CustomPlaybackSpeedPatch {
|
||||
|
||||
static {
|
||||
final float holdSpeed = Settings.SPEED_TAP_AND_HOLD.get();
|
||||
|
||||
if (holdSpeed > 0 && holdSpeed <= PLAYBACK_SPEED_MAXIMUM) {
|
||||
TAP_AND_HOLD_SPEED = holdSpeed;
|
||||
} else {
|
||||
showInvalidCustomSpeedToast();
|
||||
Settings.SPEED_TAP_AND_HOLD.resetToDefault();
|
||||
TAP_AND_HOLD_SPEED = Settings.SPEED_TAP_AND_HOLD.get();
|
||||
TAP_AND_HOLD_SPEED = Settings.SPEED_TAP_AND_HOLD.resetToDefault();
|
||||
}
|
||||
|
||||
loadCustomSpeeds();
|
||||
|
||||
@@ -25,6 +25,7 @@ import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehavi
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.MANUAL_SKIP;
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY;
|
||||
import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.SKIP_AUTOMATICALLY_ONCE;
|
||||
import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider.SwipeOverlayStyle;
|
||||
|
||||
import android.graphics.Color;
|
||||
|
||||
@@ -323,12 +324,14 @@ public class Settings extends BaseSettings {
|
||||
public static final IntegerSetting SWIPE_MAGNITUDE_THRESHOLD = new IntegerSetting("revanced_swipe_threshold", 30, true,
|
||||
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
|
||||
public static final IntegerSetting SWIPE_VOLUME_SENSITIVITY = new IntegerSetting("revanced_swipe_volume_sensitivity", 1, true, parent(SWIPE_VOLUME));
|
||||
public static final BooleanSetting SWIPE_SHOW_CIRCULAR_OVERLAY = new BooleanSetting("revanced_swipe_show_circular_overlay", FALSE, true,
|
||||
public static final EnumSetting<SwipeOverlayStyle> SWIPE_OVERLAY_STYLE = new EnumSetting<>("revanced_swipe_overlay_style", SwipeOverlayStyle.HORIZONTAL,true,
|
||||
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
|
||||
public static final BooleanSetting SWIPE_OVERLAY_MINIMAL_STYLE = new BooleanSetting("revanced_swipe_overlay_minimal_style", FALSE, true,
|
||||
public static final IntegerSetting SWIPE_OVERLAY_TEXT_SIZE = new IntegerSetting("revanced_swipe_text_overlay_size", 14, true,
|
||||
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
|
||||
public static final IntegerSetting SWIPE_OVERLAY_OPACITY = new IntegerSetting("revanced_swipe_overlay_background_opacity", 60, true,
|
||||
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
|
||||
public static final StringSetting SWIPE_OVERLAY_PROGRESS_COLOR = new StringSetting("revanced_swipe_overlay_progress_color", "#FFFFFF", true,
|
||||
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
|
||||
public static final LongSetting SWIPE_OVERLAY_TIMEOUT = new LongSetting("revanced_swipe_overlay_timeout", 500L, true,
|
||||
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
|
||||
public static final BooleanSetting SWIPE_SAVE_AND_RESTORE_BRIGHTNESS = new BooleanSetting("revanced_swipe_save_and_restore_brightness", TRUE, true, parent(SWIPE_BRIGHTNESS));
|
||||
|
||||
@@ -1,95 +1,98 @@
|
||||
package app.revanced.extension.youtube.swipecontrols
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.graphics.Color
|
||||
import app.revanced.extension.shared.Logger
|
||||
import app.revanced.extension.shared.StringRef.str
|
||||
import app.revanced.extension.shared.Utils
|
||||
import app.revanced.extension.youtube.settings.Settings
|
||||
import app.revanced.extension.youtube.shared.PlayerType
|
||||
|
||||
/**
|
||||
* provider for configuration for volume and brightness swipe controls
|
||||
* Provides configuration settings for volume and brightness swipe controls in the YouTube player.
|
||||
* Manages enabling/disabling gestures, overlay appearance, and behavior preferences.
|
||||
*/
|
||||
class SwipeControlsConfigurationProvider {
|
||||
//region swipe enable
|
||||
//region swipe enable
|
||||
/**
|
||||
* should swipe controls be enabled? (global setting)
|
||||
* Indicates whether swipe controls are enabled globally.
|
||||
* Returns true if either volume or brightness controls are enabled and the video is in fullscreen mode.
|
||||
*/
|
||||
val enableSwipeControls: Boolean
|
||||
get() = (enableVolumeControls || enableBrightnessControl) && isFullscreenVideo
|
||||
|
||||
/**
|
||||
* should swipe controls for volume be enabled?
|
||||
* Indicates whether swipe controls for adjusting volume are enabled.
|
||||
*/
|
||||
val enableVolumeControls = Settings.SWIPE_VOLUME.get()
|
||||
|
||||
/**
|
||||
* should swipe controls for volume be enabled?
|
||||
* Indicates whether swipe controls for adjusting brightness are enabled.
|
||||
*/
|
||||
val enableBrightnessControl = Settings.SWIPE_BRIGHTNESS.get()
|
||||
|
||||
/**
|
||||
* is the video player currently in fullscreen mode?
|
||||
* Checks if the video player is currently in fullscreen mode.
|
||||
*/
|
||||
private val isFullscreenVideo: Boolean
|
||||
get() = PlayerType.current == PlayerType.WATCH_WHILE_FULLSCREEN
|
||||
//endregion
|
||||
//endregion
|
||||
|
||||
//region keys enable
|
||||
//region keys enable
|
||||
/**
|
||||
* should volume key controls be overwritten? (global setting)
|
||||
* Indicates whether volume key controls should be overridden by swipe controls.
|
||||
* Returns true if volume controls are enabled and the video is in fullscreen mode.
|
||||
*/
|
||||
val overwriteVolumeKeyControls: Boolean
|
||||
get() = enableVolumeControls && isFullscreenVideo
|
||||
//endregion
|
||||
//endregion
|
||||
|
||||
//region gesture adjustments
|
||||
//region gesture adjustments
|
||||
/**
|
||||
* should press-to-swipe be enabled?
|
||||
* Indicates whether press-to-swipe mode is enabled, requiring a press before swiping to activate controls.
|
||||
*/
|
||||
val shouldEnablePressToSwipe: Boolean
|
||||
get() = Settings.SWIPE_PRESS_TO_ENGAGE.get()
|
||||
|
||||
/**
|
||||
* threshold for swipe detection
|
||||
* this may be called rapidly in onScroll, so we have to load it once and then leave it constant
|
||||
* The threshold for detecting swipe gestures, in pixels.
|
||||
* Loaded once to ensure consistent behavior during rapid scroll events.
|
||||
*/
|
||||
val swipeMagnitudeThreshold: Int
|
||||
get() = Settings.SWIPE_MAGNITUDE_THRESHOLD.get()
|
||||
|
||||
/**
|
||||
* How much volume will change by single swipe.
|
||||
* If it is set to 0, it will reset to the default value because 0 would disable swiping.
|
||||
* */
|
||||
* The sensitivity of volume swipe gestures, determining how much volume changes per swipe.
|
||||
* Resets to default if set to 0, as it would disable swiping.
|
||||
*/
|
||||
val volumeSwipeSensitivity: Int
|
||||
get() {
|
||||
val sensitivity = Settings.SWIPE_VOLUME_SENSITIVITY.get()
|
||||
|
||||
if (sensitivity < 1) {
|
||||
Settings.SWIPE_VOLUME_SENSITIVITY.resetToDefault()
|
||||
|
||||
return Settings.SWIPE_VOLUME_SENSITIVITY.get()
|
||||
return Settings.SWIPE_VOLUME_SENSITIVITY.resetToDefault()
|
||||
}
|
||||
|
||||
return sensitivity
|
||||
}
|
||||
//endregion
|
||||
//endregion
|
||||
|
||||
//region overlay adjustments
|
||||
//region overlay adjustments
|
||||
/**
|
||||
* should the overlay enable haptic feedback?
|
||||
* Indicates whether haptic feedback should be enabled for swipe control interactions.
|
||||
*/
|
||||
val shouldEnableHapticFeedback: Boolean
|
||||
get() = Settings.SWIPE_HAPTIC_FEEDBACK.get()
|
||||
|
||||
/**
|
||||
* how long the overlay should be shown on changes
|
||||
* The duration in milliseconds that the overlay should remain visible after a change.
|
||||
*/
|
||||
val overlayShowTimeoutMillis: Long
|
||||
get() = Settings.SWIPE_OVERLAY_TIMEOUT.get()
|
||||
|
||||
/**
|
||||
* Gets the opacity value (0-100%) is converted to an alpha value (0-255) for transparency.
|
||||
* If the opacity value is out of range, it resets to the default and displays a warning message.
|
||||
* The background opacity of the overlay, converted from a percentage (0-100) to an alpha value (0-255).
|
||||
* Resets to default and shows a toast if the value is out of range.
|
||||
*/
|
||||
val overlayBackgroundOpacity: Int
|
||||
get() {
|
||||
@@ -97,8 +100,7 @@ class SwipeControlsConfigurationProvider {
|
||||
|
||||
if (opacity < 0 || opacity > 100) {
|
||||
Utils.showToastLong(str("revanced_swipe_overlay_background_opacity_invalid_toast"))
|
||||
Settings.SWIPE_OVERLAY_OPACITY.resetToDefault()
|
||||
opacity = Settings.SWIPE_OVERLAY_OPACITY.get()
|
||||
opacity = Settings.SWIPE_OVERLAY_OPACITY.resetToDefault()
|
||||
}
|
||||
|
||||
opacity = opacity * 255 / 100
|
||||
@@ -106,55 +108,125 @@ class SwipeControlsConfigurationProvider {
|
||||
}
|
||||
|
||||
/**
|
||||
* The color of the progress overlay.
|
||||
* The color of the progress bar in the overlay.
|
||||
* Resets to default and shows a toast if the color string is invalid or empty.
|
||||
*/
|
||||
val overlayProgressColor: Int
|
||||
get() = 0xBFFFFFFF.toInt()
|
||||
get() {
|
||||
try {
|
||||
@SuppressLint("UseKtx")
|
||||
val color = Color.parseColor(Settings.SWIPE_OVERLAY_PROGRESS_COLOR.get())
|
||||
return (0xBF000000.toInt() or (color and 0xFFFFFF))
|
||||
} catch (ex: IllegalArgumentException) {
|
||||
Logger.printDebug({ "Could not parse color" }, ex)
|
||||
Utils.showToastLong(str("revanced_swipe_overlay_progress_color_invalid_toast"))
|
||||
Settings.SWIPE_OVERLAY_PROGRESS_COLOR.resetToDefault()
|
||||
return overlayProgressColor // Recursively return.
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The color used for the background of the progress overlay fill.
|
||||
* The background color used for the filled portion of the progress bar in the overlay.
|
||||
*/
|
||||
val overlayFillBackgroundPaint: Int
|
||||
get() = 0x80D3D3D3.toInt()
|
||||
|
||||
/**
|
||||
* The color used for the text and icons in the overlay.
|
||||
* The color used for text and icons in the overlay.
|
||||
*/
|
||||
val overlayTextColor: Int
|
||||
get() = Color.WHITE
|
||||
|
||||
/**
|
||||
* A flag that determines if the overlay should only show the icon.
|
||||
* The text size in the overlay, in density-independent pixels (dp).
|
||||
* Must be between 1 and 30 dp; resets to default and shows a toast if invalid.
|
||||
*/
|
||||
val overlayShowOverlayMinimalStyle: Boolean
|
||||
get() = Settings.SWIPE_OVERLAY_MINIMAL_STYLE.get()
|
||||
val overlayTextSize: Int
|
||||
get() {
|
||||
val size = Settings.SWIPE_OVERLAY_TEXT_SIZE.get()
|
||||
if (size < 1 || size > 30) {
|
||||
Utils.showToastLong(str("revanced_swipe_text_overlay_size_invalid_toast"))
|
||||
return Settings.SWIPE_OVERLAY_TEXT_SIZE.resetToDefault()
|
||||
}
|
||||
return size
|
||||
}
|
||||
|
||||
/**
|
||||
* A flag that determines if the progress bar should be circular.
|
||||
* Defines the style of the swipe controls overlay, determining its layout and appearance.
|
||||
*
|
||||
* @property isMinimal Indicates whether the style is minimalistic, omitting detailed progress indicators.
|
||||
* @property isHorizontalMinimalCenter Indicates whether the style is a minimal horizontal bar centered vertically.
|
||||
* @property isCircular Indicates whether the style uses a circular progress bar.
|
||||
* @property isVertical Indicates whether the style uses a vertical progress bar.
|
||||
*/
|
||||
val isCircularProgressBar: Boolean
|
||||
get() = Settings.SWIPE_SHOW_CIRCULAR_OVERLAY.get()
|
||||
//endregion
|
||||
@Suppress("unused")
|
||||
enum class SwipeOverlayStyle(
|
||||
val isMinimal: Boolean = false,
|
||||
val isHorizontalMinimalCenter: Boolean = false,
|
||||
val isCircular: Boolean = false,
|
||||
val isVertical: Boolean = false
|
||||
) {
|
||||
/**
|
||||
* A full horizontal progress bar with detailed indicators.
|
||||
*/
|
||||
HORIZONTAL,
|
||||
|
||||
//region behaviour
|
||||
/**
|
||||
* A minimal horizontal progress bar positioned at the top.
|
||||
*/
|
||||
HORIZONTAL_MINIMAL_TOP(isMinimal = true),
|
||||
|
||||
/**
|
||||
* A minimal horizontal progress bar centered vertically.
|
||||
*/
|
||||
HORIZONTAL_MINIMAL_CENTER(isMinimal = true, isHorizontalMinimalCenter = true),
|
||||
|
||||
/**
|
||||
* A full circular progress bar with detailed indicators.
|
||||
*/
|
||||
CIRCULAR(isCircular = true),
|
||||
|
||||
/**
|
||||
* A minimal circular progress bar.
|
||||
*/
|
||||
CIRCULAR_MINIMAL(isMinimal = true, isCircular = true),
|
||||
|
||||
/**
|
||||
* A full vertical progress bar with detailed indicators.
|
||||
*/
|
||||
VERTICAL(isVertical = true),
|
||||
|
||||
/**
|
||||
* A minimal vertical progress bar.
|
||||
*/
|
||||
VERTICAL_MINIMAL(isMinimal = true, isVertical = true)
|
||||
}
|
||||
|
||||
/**
|
||||
* should the brightness be saved and restored when exiting or entering fullscreen
|
||||
* The current style of the overlay, determining its layout and appearance.
|
||||
*/
|
||||
val overlayStyle: SwipeOverlayStyle
|
||||
get() = Settings.SWIPE_OVERLAY_STYLE.get()
|
||||
//endregion
|
||||
|
||||
//region behaviour
|
||||
/**
|
||||
* Indicates whether the brightness level should be saved and restored when entering or exiting fullscreen mode.
|
||||
*/
|
||||
val shouldSaveAndRestoreBrightness: Boolean
|
||||
get() = Settings.SWIPE_SAVE_AND_RESTORE_BRIGHTNESS.get()
|
||||
|
||||
/**
|
||||
* should auto-brightness be enabled at the lowest value of the brightness gesture
|
||||
* Indicates whether auto-brightness should be enabled when the brightness gesture reaches its lowest value.
|
||||
*/
|
||||
val shouldLowestValueEnableAutoBrightness: Boolean
|
||||
get() = Settings.SWIPE_LOWEST_VALUE_ENABLE_AUTO_BRIGHTNESS.get()
|
||||
|
||||
/**
|
||||
* variable that stores the brightness gesture value in the settings
|
||||
* The saved brightness value for the swipe gesture, used to restore brightness in fullscreen mode.
|
||||
*/
|
||||
var savedScreenBrightnessValue: Float
|
||||
get() = Settings.SWIPE_BRIGHTNESS_VALUE.get()
|
||||
set(value) = Settings.SWIPE_BRIGHTNESS_VALUE.save(value)
|
||||
//endregion
|
||||
}
|
||||
//endregion
|
||||
}
|
||||
@@ -23,9 +23,7 @@ import java.lang.ref.WeakReference
|
||||
|
||||
/**
|
||||
* The main controller for volume and brightness swipe controls.
|
||||
* note that the superclass is overwritten to the superclass of the MainActivity at patch time
|
||||
*
|
||||
* @smali Lapp/revanced/extension/swipecontrols/SwipeControlsHostActivity;
|
||||
* note that the superclass is overwritten to the superclass of the MainActivity at patch time.
|
||||
*/
|
||||
class SwipeControlsHostActivity : Activity() {
|
||||
/**
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package app.revanced.extension.youtube.swipecontrols.views
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Paint
|
||||
import android.graphics.Rect
|
||||
import android.graphics.RectF
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.os.Handler
|
||||
@@ -11,14 +14,23 @@ import android.util.AttributeSet
|
||||
import android.view.HapticFeedbackConstants
|
||||
import android.view.View
|
||||
import android.widget.RelativeLayout
|
||||
import app.revanced.extension.shared.StringRef.str
|
||||
import app.revanced.extension.shared.Utils
|
||||
import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider
|
||||
import app.revanced.extension.youtube.swipecontrols.misc.SwipeControlsOverlay
|
||||
import kotlin.math.min
|
||||
import kotlin.math.max
|
||||
import kotlin.math.round
|
||||
|
||||
/**
|
||||
* Main overlay layout for displaying volume and brightness level with both circular and horizontal progress bars.
|
||||
* Convert dp to pixels based on system display density.
|
||||
*/
|
||||
fun Float.toDisplayPixels(): Float {
|
||||
return this * Resources.getSystem().displayMetrics.density
|
||||
}
|
||||
|
||||
/**
|
||||
* Main overlay layout for displaying volume and brightness level with circular, horizontal and vertical progress bars.
|
||||
*/
|
||||
class SwipeControlsOverlayLayout(
|
||||
context: Context,
|
||||
@@ -51,18 +63,21 @@ class SwipeControlsOverlayLayout(
|
||||
// Initialize progress bars
|
||||
private val circularProgressView: CircularProgressView
|
||||
private val horizontalProgressView: HorizontalProgressView
|
||||
private val verticalBrightnessProgressView: VerticalProgressView
|
||||
private val verticalVolumeProgressView: VerticalProgressView
|
||||
|
||||
init {
|
||||
// Initialize circular progress bar
|
||||
circularProgressView = CircularProgressView(
|
||||
context,
|
||||
config.overlayBackgroundOpacity,
|
||||
config.overlayShowOverlayMinimalStyle,
|
||||
config.overlayStyle.isMinimal,
|
||||
config.overlayProgressColor,
|
||||
config.overlayFillBackgroundPaint,
|
||||
config.overlayTextColor
|
||||
config.overlayTextColor,
|
||||
config.overlayTextSize
|
||||
).apply {
|
||||
layoutParams = LayoutParams(300, 300).apply {
|
||||
layoutParams = LayoutParams(100f.toDisplayPixels().toInt(), 100f.toDisplayPixels().toInt()).apply {
|
||||
addRule(CENTER_IN_PARENT, TRUE)
|
||||
}
|
||||
visibility = GONE // Initially hidden
|
||||
@@ -71,22 +86,65 @@ class SwipeControlsOverlayLayout(
|
||||
|
||||
// Initialize horizontal progress bar
|
||||
val screenWidth = resources.displayMetrics.widthPixels
|
||||
val layoutWidth = (screenWidth * 2 / 3).toInt() // 2/3 of screen width
|
||||
val layoutWidth = (screenWidth * 4 / 5).toInt() // Cap at ~360dp
|
||||
horizontalProgressView = HorizontalProgressView(
|
||||
context,
|
||||
config.overlayBackgroundOpacity,
|
||||
config.overlayShowOverlayMinimalStyle,
|
||||
config.overlayStyle.isMinimal,
|
||||
config.overlayProgressColor,
|
||||
config.overlayFillBackgroundPaint,
|
||||
config.overlayTextColor
|
||||
config.overlayTextColor,
|
||||
config.overlayTextSize
|
||||
).apply {
|
||||
layoutParams = LayoutParams(layoutWidth, 100).apply {
|
||||
layoutParams = LayoutParams(layoutWidth, 32f.toDisplayPixels().toInt()).apply {
|
||||
addRule(CENTER_HORIZONTAL)
|
||||
topMargin = 40 // Top margin
|
||||
if (config.overlayStyle.isHorizontalMinimalCenter) {
|
||||
addRule(CENTER_VERTICAL)
|
||||
} else {
|
||||
topMargin = 20f.toDisplayPixels().toInt()
|
||||
}
|
||||
}
|
||||
visibility = GONE // Initially hidden
|
||||
}
|
||||
addView(horizontalProgressView)
|
||||
|
||||
// Initialize vertical progress bar for brightness (right side)
|
||||
verticalBrightnessProgressView = VerticalProgressView(
|
||||
context,
|
||||
config.overlayBackgroundOpacity,
|
||||
config.overlayStyle.isMinimal,
|
||||
config.overlayProgressColor,
|
||||
config.overlayFillBackgroundPaint,
|
||||
config.overlayTextColor,
|
||||
config.overlayTextSize
|
||||
).apply {
|
||||
layoutParams = LayoutParams(40f.toDisplayPixels().toInt(), 150f.toDisplayPixels().toInt()).apply {
|
||||
addRule(ALIGN_PARENT_RIGHT)
|
||||
rightMargin = 40f.toDisplayPixels().toInt()
|
||||
addRule(CENTER_VERTICAL)
|
||||
}
|
||||
visibility = GONE // Initially hidden
|
||||
}
|
||||
addView(verticalBrightnessProgressView)
|
||||
|
||||
// Initialize vertical progress bar for volume (left side)
|
||||
verticalVolumeProgressView = VerticalProgressView(
|
||||
context,
|
||||
config.overlayBackgroundOpacity,
|
||||
config.overlayStyle.isMinimal,
|
||||
config.overlayProgressColor,
|
||||
config.overlayFillBackgroundPaint,
|
||||
config.overlayTextColor,
|
||||
config.overlayTextSize
|
||||
).apply {
|
||||
layoutParams = LayoutParams(40f.toDisplayPixels().toInt(), 150f.toDisplayPixels().toInt()).apply {
|
||||
addRule(ALIGN_PARENT_LEFT)
|
||||
leftMargin = 40f.toDisplayPixels().toInt()
|
||||
addRule(CENTER_VERTICAL)
|
||||
}
|
||||
visibility = GONE // Initially hidden
|
||||
}
|
||||
addView(verticalVolumeProgressView)
|
||||
}
|
||||
|
||||
// Handler and callback for hiding progress bars
|
||||
@@ -94,6 +152,8 @@ class SwipeControlsOverlayLayout(
|
||||
private val feedbackHideCallback = Runnable {
|
||||
circularProgressView.visibility = GONE
|
||||
horizontalProgressView.visibility = GONE
|
||||
verticalBrightnessProgressView.visibility = GONE
|
||||
verticalVolumeProgressView.visibility = GONE
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -103,7 +163,11 @@ class SwipeControlsOverlayLayout(
|
||||
feedbackHideHandler.removeCallbacks(feedbackHideCallback)
|
||||
feedbackHideHandler.postDelayed(feedbackHideCallback, config.overlayShowTimeoutMillis)
|
||||
|
||||
val viewToShow = if (config.isCircularProgressBar) circularProgressView else horizontalProgressView
|
||||
val viewToShow = when {
|
||||
config.overlayStyle.isCircular -> circularProgressView
|
||||
config.overlayStyle.isVertical -> if (isBrightness) verticalBrightnessProgressView else verticalVolumeProgressView
|
||||
else -> horizontalProgressView
|
||||
}
|
||||
viewToShow.apply {
|
||||
setProgress(progress, max, value, isBrightness)
|
||||
this.icon = icon
|
||||
@@ -126,7 +190,9 @@ class SwipeControlsOverlayLayout(
|
||||
// Handle brightness change
|
||||
override fun onBrightnessChanged(brightness: Double) {
|
||||
if (config.shouldLowestValueEnableAutoBrightness && brightness <= 0) {
|
||||
showFeedbackView("Auto", 0, 100, autoBrightnessIcon, isBrightness = true)
|
||||
val displayText = if (config.overlayStyle.isVertical) "А"
|
||||
else str("revanced_swipe_lowest_value_enable_auto_brightness_overlay_text")
|
||||
showFeedbackView(displayText, 0, 100, autoBrightnessIcon, isBrightness = true)
|
||||
} else {
|
||||
val brightnessValue = round(brightness).toInt()
|
||||
val icon = when {
|
||||
@@ -135,7 +201,8 @@ class SwipeControlsOverlayLayout(
|
||||
brightnessValue < 75 -> highBrightnessIcon
|
||||
else -> fullBrightnessIcon
|
||||
}
|
||||
showFeedbackView("$brightnessValue%", brightnessValue, 100, icon, isBrightness = true)
|
||||
val displayText = if (config.overlayStyle.isVertical) "$brightnessValue" else "$brightnessValue%"
|
||||
showFeedbackView(displayText, brightnessValue, 100, icon, isBrightness = true)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,11 +223,12 @@ class SwipeControlsOverlayLayout(
|
||||
*/
|
||||
abstract class AbstractProgressView(
|
||||
context: Context,
|
||||
protected val overlayBackgroundOpacity: Int,
|
||||
protected val overlayShowOverlayMinimalStyle: Boolean,
|
||||
protected val overlayProgressColor: Int,
|
||||
protected val overlayFillBackgroundPaint: Int,
|
||||
protected val overlayTextColor: Int,
|
||||
overlayBackgroundOpacity: Int,
|
||||
protected val isMinimalStyle: Boolean,
|
||||
overlayProgressColor: Int,
|
||||
overlayFillBackgroundPaint: Int,
|
||||
private val overlayTextColor: Int,
|
||||
protected val overlayTextSize: Int,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0
|
||||
) : View(context, attrs, defStyleAttr) {
|
||||
@@ -174,26 +242,25 @@ abstract class AbstractProgressView(
|
||||
}
|
||||
|
||||
// Initialize paints
|
||||
public val backgroundPaint = createPaint(overlayBackgroundOpacity, style = Paint.Style.FILL)
|
||||
public val progressPaint = createPaint(overlayProgressColor, style = Paint.Style.STROKE, strokeCap = Paint.Cap.ROUND, strokeWidth = 20f)
|
||||
public val fillBackgroundPaint = createPaint(overlayFillBackgroundPaint, style = Paint.Style.FILL)
|
||||
public val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||
val backgroundPaint = createPaint(overlayBackgroundOpacity, style = Paint.Style.FILL)
|
||||
val progressPaint = createPaint(overlayProgressColor, style = Paint.Style.STROKE, strokeCap = Paint.Cap.ROUND, strokeWidth = 6f.toDisplayPixels())
|
||||
val fillBackgroundPaint = createPaint(overlayFillBackgroundPaint, style = Paint.Style.FILL)
|
||||
val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||
color = overlayTextColor
|
||||
textAlign = Paint.Align.CENTER
|
||||
textSize = 40f // Can adjust based on need
|
||||
textSize = overlayTextSize.toFloat().toDisplayPixels()
|
||||
}
|
||||
|
||||
// Rect for text measurement
|
||||
protected val textBounds = Rect()
|
||||
|
||||
protected var progress = 0
|
||||
protected var maxProgress = 100
|
||||
protected var displayText: String = "0"
|
||||
protected var isBrightness = true
|
||||
public var icon: Drawable? = null
|
||||
var icon: Drawable? = null
|
||||
|
||||
init {
|
||||
// Stroke widths are now set in createPaint for progressPaint and fillBackgroundPaint
|
||||
}
|
||||
|
||||
fun setProgress(value: Int, max: Int, text: String, isBrightnessMode: Boolean) {
|
||||
open fun setProgress(value: Int, max: Int, text: String, isBrightnessMode: Boolean) {
|
||||
progress = value
|
||||
maxProgress = max
|
||||
displayText = text
|
||||
@@ -201,6 +268,11 @@ abstract class AbstractProgressView(
|
||||
invalidate()
|
||||
}
|
||||
|
||||
protected fun measureTextWidth(text: String, paint: Paint): Int {
|
||||
paint.getTextBounds(text, 0, text.length, textBounds)
|
||||
return textBounds.width()
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
// Base class implementation can be empty
|
||||
}
|
||||
@@ -209,34 +281,36 @@ abstract class AbstractProgressView(
|
||||
/**
|
||||
* Custom view for rendering a circular progress indicator with icons and text.
|
||||
*/
|
||||
@SuppressLint("ViewConstructor")
|
||||
class CircularProgressView(
|
||||
context: Context,
|
||||
overlayBackgroundOpacity: Int,
|
||||
overlayShowOverlayMinimalStyle: Boolean,
|
||||
isMinimalStyle: Boolean,
|
||||
overlayProgressColor: Int,
|
||||
overlayFillBackgroundPaint: Int,
|
||||
overlayTextColor: Int,
|
||||
overlayTextSize: Int,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0
|
||||
) : AbstractProgressView(
|
||||
context,
|
||||
overlayBackgroundOpacity,
|
||||
overlayShowOverlayMinimalStyle,
|
||||
isMinimalStyle,
|
||||
overlayProgressColor,
|
||||
overlayFillBackgroundPaint,
|
||||
overlayTextColor,
|
||||
overlayTextSize,
|
||||
attrs,
|
||||
defStyleAttr
|
||||
) {
|
||||
private val rectF = RectF()
|
||||
|
||||
init {
|
||||
textPaint.textSize = 40f // Override default text size for circular view
|
||||
progressPaint.strokeWidth = 20f
|
||||
fillBackgroundPaint.strokeWidth = 20f
|
||||
progressPaint.strokeCap = Paint.Cap.ROUND
|
||||
progressPaint.strokeWidth = 6f.toDisplayPixels()
|
||||
fillBackgroundPaint.strokeWidth = 6f.toDisplayPixels()
|
||||
progressPaint.strokeCap = Paint.Cap.ROUND
|
||||
fillBackgroundPaint.strokeCap = Paint.Cap.BUTT
|
||||
progressPaint.style = Paint.Style.STROKE
|
||||
progressPaint.style = Paint.Style.STROKE
|
||||
fillBackgroundPaint.style = Paint.Style.STROKE
|
||||
}
|
||||
|
||||
@@ -244,7 +318,8 @@ class CircularProgressView(
|
||||
super.onDraw(canvas)
|
||||
|
||||
val size = min(width, height).toFloat()
|
||||
rectF.set(20f, 20f, size - 20f, size - 20f)
|
||||
val inset = 6f.toDisplayPixels()
|
||||
rectF.set(inset, inset, size - inset, size - inset)
|
||||
|
||||
canvas.drawOval(rectF, fillBackgroundPaint) // Draw the outer ring.
|
||||
canvas.drawCircle(width / 2f, height / 2f, size / 3, backgroundPaint) // Draw the inner circle.
|
||||
@@ -255,124 +330,307 @@ class CircularProgressView(
|
||||
|
||||
// Draw the icon in the center.
|
||||
icon?.let {
|
||||
val iconSize = if (overlayShowOverlayMinimalStyle) 100 else 80
|
||||
val iconSize = (if (isMinimalStyle) 36f else 24f).toDisplayPixels().toInt()
|
||||
val iconX = (width - iconSize) / 2
|
||||
val iconY = (height / 2) - if (overlayShowOverlayMinimalStyle) 50 else 80
|
||||
val iconY = if (isMinimalStyle) {
|
||||
(height - iconSize) / 2
|
||||
} else {
|
||||
(height / 2) - 24f.toDisplayPixels().toInt()
|
||||
}
|
||||
it.setBounds(iconX, iconY, iconX + iconSize, iconY + iconSize)
|
||||
it.draw(canvas)
|
||||
}
|
||||
|
||||
// If not a minimal style mode, draw the text inside the ring.
|
||||
if (!overlayShowOverlayMinimalStyle) {
|
||||
canvas.drawText(displayText, width / 2f, height / 2f + 60f, textPaint)
|
||||
if (!isMinimalStyle) {
|
||||
canvas.drawText(displayText, width / 2f, height / 2f + 20f.toDisplayPixels(), textPaint)
|
||||
}
|
||||
}
|
||||
|
||||
override fun setProgress(value: Int, max: Int, text: String, isBrightnessMode: Boolean) {
|
||||
super.setProgress(value, max, text, isBrightnessMode)
|
||||
requestLayout()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom view for rendering a rectangular progress bar with icons and text.
|
||||
*/
|
||||
@SuppressLint("ViewConstructor")
|
||||
class HorizontalProgressView(
|
||||
context: Context,
|
||||
overlayBackgroundOpacity: Int,
|
||||
overlayShowOverlayMinimalStyle: Boolean,
|
||||
isMinimalStyle: Boolean,
|
||||
overlayProgressColor: Int,
|
||||
overlayFillBackgroundPaint: Int,
|
||||
overlayTextColor: Int,
|
||||
overlayTextSize: Int,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0
|
||||
) : AbstractProgressView(
|
||||
context,
|
||||
overlayBackgroundOpacity,
|
||||
overlayShowOverlayMinimalStyle,
|
||||
isMinimalStyle,
|
||||
overlayProgressColor,
|
||||
overlayFillBackgroundPaint,
|
||||
overlayTextColor,
|
||||
overlayTextSize,
|
||||
attrs,
|
||||
defStyleAttr
|
||||
) {
|
||||
|
||||
private val iconSize = 60f
|
||||
private val padding = 40f
|
||||
private val iconSize = 20f.toDisplayPixels()
|
||||
private val padding = 12f.toDisplayPixels()
|
||||
private var textWidth = 0f
|
||||
private val progressBarHeight = 3f.toDisplayPixels()
|
||||
private val progressBarWidth: Float = resources.displayMetrics.widthPixels / 4f
|
||||
|
||||
init {
|
||||
textPaint.textSize = 36f // Override default text size for horizontal view
|
||||
progressPaint.strokeWidth = 0f
|
||||
progressPaint.strokeCap = Paint.Cap.BUTT
|
||||
progressPaint.style = Paint.Style.FILL
|
||||
progressPaint.strokeCap = Paint.Cap.BUTT
|
||||
progressPaint.style = Paint.Style.FILL
|
||||
fillBackgroundPaint.style = Paint.Style.FILL
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate required width based on content
|
||||
* @return Required width to display all elements
|
||||
*/
|
||||
private fun calculateRequiredWidth(): Float {
|
||||
textWidth = measureTextWidth(displayText, textPaint).toFloat()
|
||||
|
||||
return if (!isMinimalStyle) {
|
||||
padding + iconSize + padding + progressBarWidth + padding + textWidth + padding
|
||||
} else {
|
||||
padding + iconSize + padding + textWidth + padding
|
||||
}
|
||||
}
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||
|
||||
val suggestedWidth = MeasureSpec.getSize(widthMeasureSpec)
|
||||
val suggestedHeight = MeasureSpec.getSize(heightMeasureSpec)
|
||||
|
||||
val height = suggestedHeight
|
||||
val requiredWidth = calculateRequiredWidth().toInt()
|
||||
val width = min(max(100, requiredWidth), suggestedWidth)
|
||||
|
||||
setMeasuredDimension(width, height)
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
super.onDraw(canvas)
|
||||
|
||||
val width = width.toFloat()
|
||||
val height = height.toFloat()
|
||||
val viewWidth = width.toFloat()
|
||||
val viewHeight = height.toFloat()
|
||||
val viewHeightHalf = viewHeight / 2
|
||||
|
||||
// Radius for rounded corners
|
||||
val cornerRadius = min(width, height) / 2
|
||||
textWidth = measureTextWidth(displayText, textPaint).toFloat()
|
||||
|
||||
// Calculate the total width for the elements
|
||||
val minimalElementWidth = 5 * padding + iconSize
|
||||
val cornerRadius = viewHeightHalf
|
||||
|
||||
// Calculate the starting point (X) to center the elements
|
||||
val minimalStartX = (width - minimalElementWidth) / 2
|
||||
val startX = padding
|
||||
val iconEndX = startX + iconSize
|
||||
|
||||
// Draw the background
|
||||
if (!overlayShowOverlayMinimalStyle) {
|
||||
canvas.drawRoundRect(0f, 0f, width, height, cornerRadius, cornerRadius, backgroundPaint)
|
||||
} else {
|
||||
canvas.drawRoundRect(minimalStartX, 0f, minimalStartX + minimalElementWidth, height, cornerRadius, cornerRadius, backgroundPaint)
|
||||
}
|
||||
val textStartX = (viewWidth - 1.5f * padding - textWidth)
|
||||
|
||||
if (!overlayShowOverlayMinimalStyle) {
|
||||
// Draw the fill background
|
||||
val startX = 2 * padding + iconSize
|
||||
val endX = width - 4 * padding
|
||||
val fillWidth = endX - startX
|
||||
canvas.drawRoundRect(
|
||||
0f, 0f, viewWidth, viewHeight,
|
||||
cornerRadius, cornerRadius, backgroundPaint
|
||||
)
|
||||
|
||||
canvas.drawRoundRect(
|
||||
startX,
|
||||
height / 2 - 5f,
|
||||
endX,
|
||||
height / 2 + 5f,
|
||||
10f, 10f,
|
||||
fillBackgroundPaint
|
||||
)
|
||||
|
||||
// Draw the progress
|
||||
val progressWidth = (progress.toFloat() / maxProgress) * fillWidth
|
||||
canvas.drawRoundRect(
|
||||
startX,
|
||||
height / 2 - 5f,
|
||||
startX + progressWidth,
|
||||
height / 2 + 5f,
|
||||
10f, 10f,
|
||||
progressPaint
|
||||
)
|
||||
}
|
||||
|
||||
// Draw the icon
|
||||
icon?.let {
|
||||
val iconX = if (!overlayShowOverlayMinimalStyle) {
|
||||
padding
|
||||
} else {
|
||||
padding + minimalStartX
|
||||
}
|
||||
val iconY = height / 2 - iconSize / 2
|
||||
it.setBounds(iconX.toInt(), iconY.toInt(), (iconX + iconSize).toInt(), (iconY + iconSize).toInt())
|
||||
val iconY = viewHeightHalf - iconSize / 2
|
||||
it.setBounds(
|
||||
startX.toInt(),
|
||||
iconY.toInt(),
|
||||
(startX + iconSize).toInt(),
|
||||
(iconY + iconSize).toInt()
|
||||
)
|
||||
it.draw(canvas)
|
||||
}
|
||||
|
||||
// Draw the text on the right
|
||||
val textX = if (!overlayShowOverlayMinimalStyle) {
|
||||
width - 2 * padding
|
||||
} else {
|
||||
minimalStartX + minimalElementWidth - 2 * padding
|
||||
}
|
||||
val textY = height / 2 + textPaint.textSize / 3
|
||||
val textY = viewHeightHalf + textPaint.textSize / 3
|
||||
textPaint.textAlign = Paint.Align.LEFT
|
||||
|
||||
// Draw the text
|
||||
canvas.drawText(displayText, textX, textY, textPaint)
|
||||
if (isMinimalStyle) {
|
||||
canvas.drawText(displayText, textStartX, textY, textPaint)
|
||||
} else {
|
||||
val progressStartX = iconEndX + padding
|
||||
val progressEndX = textStartX - padding
|
||||
val progressWidth = progressEndX - progressStartX
|
||||
|
||||
if (progressWidth > 50) {
|
||||
val progressBarHeightHalf = progressBarHeight / 2.0f
|
||||
val viewHeightHalfMinusProgressBarHeightHalf = viewHeightHalf - progressBarHeightHalf
|
||||
val viewHeightHalfPlusProgressBarHeightHalf = viewHeightHalf + progressBarHeightHalf
|
||||
|
||||
canvas.drawRoundRect(
|
||||
progressStartX,
|
||||
viewHeightHalfMinusProgressBarHeightHalf,
|
||||
progressEndX,
|
||||
viewHeightHalfPlusProgressBarHeightHalf,
|
||||
progressBarHeightHalf,
|
||||
progressBarHeightHalf,
|
||||
fillBackgroundPaint
|
||||
)
|
||||
|
||||
val progressValue = (progress.toFloat() / maxProgress) * progressWidth
|
||||
canvas.drawRoundRect(
|
||||
progressStartX,
|
||||
viewHeightHalfMinusProgressBarHeightHalf,
|
||||
progressStartX + progressValue,
|
||||
viewHeightHalfPlusProgressBarHeightHalf,
|
||||
progressBarHeightHalf,
|
||||
progressBarHeightHalf,
|
||||
progressPaint
|
||||
)
|
||||
}
|
||||
|
||||
canvas.drawText(displayText, textStartX, textY, textPaint)
|
||||
}
|
||||
}
|
||||
|
||||
override fun setProgress(value: Int, max: Int, text: String, isBrightnessMode: Boolean) {
|
||||
super.setProgress(value, max, text, isBrightnessMode)
|
||||
requestLayout()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom view for rendering a vertical progress bar with icons and text.
|
||||
*/
|
||||
@SuppressLint("ViewConstructor")
|
||||
class VerticalProgressView(
|
||||
context: Context,
|
||||
overlayBackgroundOpacity: Int,
|
||||
isMinimalStyle: Boolean,
|
||||
overlayProgressColor: Int,
|
||||
overlayFillBackgroundPaint: Int,
|
||||
overlayTextColor: Int,
|
||||
overlayTextSize: Int,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0
|
||||
) : AbstractProgressView(
|
||||
context,
|
||||
overlayBackgroundOpacity,
|
||||
isMinimalStyle,
|
||||
overlayProgressColor,
|
||||
overlayFillBackgroundPaint,
|
||||
overlayTextColor,
|
||||
overlayTextSize,
|
||||
attrs,
|
||||
defStyleAttr
|
||||
) {
|
||||
|
||||
private val iconSize = 20f.toDisplayPixels()
|
||||
private val padding = 12f.toDisplayPixels()
|
||||
private val progressBarWidth = 3f.toDisplayPixels()
|
||||
private val progressBarHeight: Float = resources.displayMetrics.widthPixels / 3f
|
||||
|
||||
init {
|
||||
progressPaint.strokeWidth = 0f
|
||||
progressPaint.strokeCap = Paint.Cap.BUTT
|
||||
progressPaint.style = Paint.Style.FILL
|
||||
fillBackgroundPaint.style = Paint.Style.FILL
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate required height based on content
|
||||
* @return Required height to display all elements
|
||||
*/
|
||||
private fun calculateRequiredHeight(): Float {
|
||||
return if (!isMinimalStyle) {
|
||||
padding + iconSize + padding + progressBarHeight + padding + textPaint.textSize + padding
|
||||
} else {
|
||||
padding + iconSize + padding + textPaint.textSize + padding
|
||||
}
|
||||
}
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||
|
||||
val suggestedWidth = MeasureSpec.getSize(widthMeasureSpec)
|
||||
val suggestedHeight = MeasureSpec.getSize(heightMeasureSpec)
|
||||
|
||||
val requiredHeight = calculateRequiredHeight().toInt()
|
||||
val height = min(max(100, requiredHeight), suggestedHeight)
|
||||
|
||||
setMeasuredDimension(suggestedWidth, height)
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
super.onDraw(canvas)
|
||||
|
||||
val viewWidth = width.toFloat()
|
||||
val viewHeight = height.toFloat()
|
||||
val viewWidthHalf = viewWidth / 2
|
||||
val cornerRadius = viewWidthHalf
|
||||
|
||||
val startY = padding
|
||||
val iconEndY = startY + iconSize
|
||||
|
||||
val textStartY = viewHeight - padding - textPaint.textSize / 2
|
||||
|
||||
canvas.drawRoundRect(
|
||||
0f, 0f, viewWidth, viewHeight,
|
||||
cornerRadius, cornerRadius, backgroundPaint
|
||||
)
|
||||
|
||||
icon?.let {
|
||||
val iconX = viewWidthHalf - iconSize / 2
|
||||
it.setBounds(
|
||||
iconX.toInt(),
|
||||
startY.toInt(),
|
||||
(iconX + iconSize).toInt(),
|
||||
(startY + iconSize).toInt()
|
||||
)
|
||||
it.draw(canvas)
|
||||
}
|
||||
|
||||
val textX = viewWidthHalf
|
||||
textPaint.textAlign = Paint.Align.CENTER
|
||||
|
||||
if (isMinimalStyle) {
|
||||
canvas.drawText(displayText, textX, textStartY, textPaint)
|
||||
} else {
|
||||
val progressStartY = (iconEndY + padding).toFloat()
|
||||
val progressEndY = textStartY - textPaint.textSize - padding
|
||||
val progressHeight = progressEndY - progressStartY
|
||||
|
||||
if (progressHeight > 50) {
|
||||
val progressBarWidthHalf = progressBarWidth / 2
|
||||
val viewHeightHalfMinusProgressBarHeightHalf = viewWidthHalf - progressBarWidthHalf
|
||||
val viewHeightHalfPlusProgressBarHeightHalf = viewWidthHalf + progressBarWidthHalf
|
||||
|
||||
canvas.drawRoundRect(
|
||||
viewHeightHalfMinusProgressBarHeightHalf,
|
||||
progressStartY,
|
||||
viewHeightHalfPlusProgressBarHeightHalf,
|
||||
progressEndY,
|
||||
progressBarWidthHalf,
|
||||
progressBarWidthHalf,
|
||||
fillBackgroundPaint
|
||||
)
|
||||
|
||||
val progressValue = (progress.toFloat() / maxProgress) * progressHeight
|
||||
canvas.drawRoundRect(
|
||||
viewHeightHalfMinusProgressBarHeightHalf,
|
||||
progressEndY - progressValue,
|
||||
viewHeightHalfPlusProgressBarHeightHalf,
|
||||
progressEndY,
|
||||
progressBarWidthHalf,
|
||||
progressBarWidthHalf,
|
||||
progressPaint
|
||||
)
|
||||
}
|
||||
canvas.drawText(displayText, textX, textStartY, textPaint)
|
||||
}
|
||||
}
|
||||
|
||||
override fun setProgress(value: Int, max: Int, text: String, isBrightnessMode: Boolean) {
|
||||
super.setProgress(value, max, text, isBrightnessMode)
|
||||
requestLayout()
|
||||
}
|
||||
}
|
||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
||||
org.gradle.parallel = true
|
||||
android.useAndroidX = true
|
||||
kotlin.code.style = official
|
||||
version = 5.21.0-dev.8
|
||||
version = 5.21.0-dev.10
|
||||
|
||||
@@ -6,6 +6,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu
|
||||
import app.revanced.patches.all.misc.resources.addResources
|
||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.InputType
|
||||
import app.revanced.patches.shared.misc.settings.preference.ListPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
||||
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
||||
@@ -42,9 +43,13 @@ private val swipeControlsResourcePatch = resourcePatch {
|
||||
SwitchPreference("revanced_swipe_haptic_feedback"),
|
||||
SwitchPreference("revanced_swipe_save_and_restore_brightness"),
|
||||
SwitchPreference("revanced_swipe_lowest_value_enable_auto_brightness"),
|
||||
SwitchPreference("revanced_swipe_show_circular_overlay"),
|
||||
SwitchPreference("revanced_swipe_overlay_minimal_style"),
|
||||
ListPreference(
|
||||
"revanced_swipe_overlay_style",
|
||||
summaryKey = null,
|
||||
),
|
||||
TextPreference("revanced_swipe_overlay_background_opacity", inputType = InputType.NUMBER),
|
||||
TextPreference("revanced_swipe_overlay_progress_color", inputType = InputType.TEXT_CAP_CHARACTERS),
|
||||
TextPreference("revanced_swipe_text_overlay_size", inputType = InputType.NUMBER),
|
||||
TextPreference("revanced_swipe_overlay_timeout", inputType = InputType.NUMBER),
|
||||
TextPreference("revanced_swipe_threshold", inputType = InputType.NUMBER),
|
||||
TextPreference("revanced_swipe_volume_sensitivity", inputType = InputType.NUMBER),
|
||||
|
||||
@@ -479,9 +479,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_swipe_change_video_summary_off">لن يؤدي التمرير في وضع ملء الشاشة إلى التغيير للفيديو التالي/السابق</string>
|
||||
</patch>
|
||||
<patch id="layout.autocaptions.autoCaptionsPatch">
|
||||
<string name="revanced_disable_auto_captions_title">تعطيل التَّرْجَمَة التلقائية</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">تم تعطيل التَّرْجَمَة التلقائية</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">تم تمكين التَّرْجَمَة التلقائية</string>
|
||||
<string name="revanced_disable_auto_captions_title">تعطيل الترجمة التلقائية</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">تم تعطيل الترجمة التلقائية</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">تم تمكين الترجمة التلقائية</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.action.hideButtonsPatch">
|
||||
<string name="revanced_hide_buttons_screen_title">أزرار الإجراء</string>
|
||||
@@ -1132,11 +1132,11 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_change_start_page_entry_virtual_reality">الواقع الافتراضي</string>
|
||||
<string name="revanced_change_start_page_entry_watch_later">شاهد لاحقًا</string>
|
||||
<string name="revanced_change_start_page_entry_your_clips">فيديوهاتك</string>
|
||||
<string name="revanced_change_start_page_always_title">تغيير الصفحة الرئيسية دائمًا</string>
|
||||
<string name="revanced_change_start_page_always_title">تغيير صفحة البداية دائمًا</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"يتم تغيير صفحة البداية دائمًا
|
||||
|
||||
قيود: قد لا يعمل استخدام زر الرجوع على شريط الأدوات"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">يتم تغيير الصفحة الرئيسية فقط عند بدء تشغيل التطبيق</string>
|
||||
القيد: قد لا يعمل استخدام زر الرجوع على شريط الأدوات"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">يتم تغيير صفحة البداية فقط عند بدء تشغيل التطبيق</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">تعطيل استئناف مشغل Shorts</string>
|
||||
|
||||
@@ -136,7 +136,7 @@ Gözlənilməz hallardan xəbərdar olmayacaqsınız."</string>
|
||||
• Son xəbərlər
|
||||
• İzləməyə davam et
|
||||
• Daha çox kanallar kəşf et
|
||||
• Alış-veriş
|
||||
• Mağaza
|
||||
• Təkrar izlə"</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_off">Hissələr göstərilir</string>
|
||||
<!-- 'Join' should be translated using the same localized wording YouTube displays.
|
||||
@@ -355,7 +355,7 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
|
||||
<string name="revanced_hide_buttoned_ads_title">Düyməli reklamları gizlət</string>
|
||||
<string name="revanced_hide_buttoned_ads_summary_on">Düyməli reklamlar gizlədilir</string>
|
||||
<string name="revanced_hide_buttoned_ads_summary_off">Düyməli reklamlar göstərilir</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Ödənişli reklam etiketini gizlət</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Ödənişli tanıtım etiketini gizlət</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Ödənişli reklam etiketi gizlədilib</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_off">Ödənişli reklam etiketi göstərilir</string>
|
||||
<string name="revanced_hide_self_sponsor_ads_title">Öz-sponsorlu kartları gizlət</string>
|
||||
@@ -367,14 +367,14 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur"</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_title">Son ekran mağaza etiketini gizlət</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_on">Mağaza etiketi gizlidir</string>
|
||||
<string name="revanced_hide_end_screen_store_banner_summary_off">Mağaza etiketi görünür</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Oynadıcı alış-veriş bölməsin gizlət</string>
|
||||
<string name="revanced_hide_player_store_shelf_title">Oynadıcı mağaza bölməsin gizlət</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_on">Alış-veriş rəfi gizlidir</string>
|
||||
<string name="revanced_hide_player_store_shelf_summary_off">Alış-veriş rəfi göstərilir</string>
|
||||
<string name="revanced_hide_shopping_links_title">Video açıqlamada alış-veriş linklərin gizlə</string>
|
||||
<string name="revanced_hide_shopping_links_title">Video təsvirdə mağaza linklərin gizlə</string>
|
||||
<string name="revanced_hide_shopping_links_summary_on">Video təsvirində alış-veriş linkləri gizlədilib</string>
|
||||
<string name="revanced_hide_shopping_links_summary_off">Video təsvirində alış-veriş linkləri görünür</string>
|
||||
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_visit_store_button_title">Kanalda \"Mağazaya ziyarət\" düyməsin gizlə</string>
|
||||
<string name="revanced_hide_visit_store_button_title">Kanalda \"Mağazaya baxın\" düyməsin gizlə</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_on">Kanal səhifəsindəki düymə gizlidir</string>
|
||||
<string name="revanced_hide_visit_store_button_summary_off">Kanal səhifəsindəki düymə görünür</string>
|
||||
<string name="revanced_hide_web_search_results_title">Veb axtarış nəticələrini gizlət</string>
|
||||
@@ -479,7 +479,9 @@ Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənz
|
||||
<string name="revanced_swipe_change_video_summary_off">Tam ekran rejimində sürüşdürmə növbəti/əvvəlki videoya ötürməyəcək</string>
|
||||
</patch>
|
||||
<patch id="layout.autocaptions.autoCaptionsPatch">
|
||||
<string name="revanced_disable_auto_captions_title">Avtomatik titrləri qeyri-aktiv et</string>
|
||||
<string name="revanced_disable_auto_captions_title">Avtomatik titrləri qapat</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">Avtomatik titrlər qapalıdır</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">Avtomatik titrlər aktivdir</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.action.hideButtonsPatch">
|
||||
<string name="revanced_hide_buttons_screen_title">Fəaliyyət düymələri</string>
|
||||
@@ -829,6 +831,8 @@ Məhdudiyyət: Bəyənməmələr gizli rejimdə görünməyə bilər"</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_on">Daha kiçik en üçün hazırlanmış Bəyən düyməsi</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_off">Ən yaxşı görünüş üçün tərtib edilmiş Bəyən düyməsi</string>
|
||||
<string name="revanced_ryd_estimated_like_title">Təxmini bəyənmələri göstər</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_on">Bəyənmələri olmayan videolar təxmini bəyənmə sayını göstərir</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_off">Təxmini bəyənmələr göstərilmir</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">API əlçatan deyilsə ani bildiriş göstər</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Return YouTube Dislike əlçatan deyilsə ani bildiriş göstər</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Return YouTube Dislike əlçatan deyilsə ani bildiriş göstərmə</string>
|
||||
@@ -1102,6 +1106,7 @@ Sonradan qapadılarsa, UI səhvlərin önləmək üçün tətbiq məlumatların
|
||||
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - Köhnə fəaliyyət simvolların bərpa et</string>
|
||||
</patch>
|
||||
<patch id="layout.startpage.changeStartPagePatch">
|
||||
<string name="revanced_change_start_page_title">Başlatma səhifəsini dəyişdir</string>
|
||||
<string name="revanced_change_start_page_entry_default">İlkin</string>
|
||||
<string name="revanced_change_start_page_entry_all_subscriptions">Bütün abunəliklər</string>
|
||||
<string name="revanced_change_start_page_entry_browse">Kanallara nəzər yetir</string>
|
||||
@@ -1119,13 +1124,18 @@ Sonradan qapadılarsa, UI səhvlərin önləmək üçün tətbiq məlumatların
|
||||
<string name="revanced_change_start_page_entry_notifications">Bildirişlər</string>
|
||||
<string name="revanced_change_start_page_entry_playlists">Pleylistlər</string>
|
||||
<string name="revanced_change_start_page_entry_search">Axtarış</string>
|
||||
<string name="revanced_change_start_page_entry_shopping">Alış-Veriş</string>
|
||||
<string name="revanced_change_start_page_entry_shopping">Mağaza</string>
|
||||
<string name="revanced_change_start_page_entry_sports">İdman</string>
|
||||
<string name="revanced_change_start_page_entry_subscriptions">Abunəliklər</string>
|
||||
<string name="revanced_change_start_page_entry_trending">Trendlər</string>
|
||||
<string name="revanced_change_start_page_entry_virtual_reality">Faktiki Həyat</string>
|
||||
<string name="revanced_change_start_page_entry_watch_later">Sonra izlə</string>
|
||||
<string name="revanced_change_start_page_entry_your_clips">Klipləriniz</string>
|
||||
<string name="revanced_change_start_page_always_title"> Başlatma səhifəsini həmişə dəyişdir</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"Başlatma səhifəsi həmişə dəyişdirilir
|
||||
|
||||
Məhdudiyyət: Alətlər cizgisindəki geri düyməsin istifadə işləməyə bilər"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Başlatma səhifəsi yalnız tətbiq işə salındıqda dəyişdirilir</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">Shorts oynadıcı başladıcını qapat</string>
|
||||
|
||||
@@ -832,6 +832,8 @@ Rajoitus: Ei-tykkäykset eivät välttämättä näy incognito-tilassa"</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_on">Tykkää-painike on muotoiltu mahdollisimman kapeaksi</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_off">Tykkää-painike on muotoiltu parhaan näköiseksi</string>
|
||||
<string name="revanced_ryd_estimated_like_title">Näytä arvioidut tykkäykset</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_on">Videot, joiden tykkäykset on poistettu käytöstä, näyttävät arvioidun tykkäysten määrän</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_off">Arvioituja tykkäyksiä ei näytetä</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Näytä ponnahdusilmoitus, jos API ei ole käytettävissä</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Ponnahdusilmoitus näytetään, jos Return YouTube Dislike ei ole käytettävissä</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Ponnahdusilmoitusta ei näytetä, jos Return YouTube Dislike ei ole käytettävissä</string>
|
||||
@@ -1105,6 +1107,7 @@ Jos tämä poistetaan myöhemmin käytöstä, on suositeltavaa tyhjentää sovel
|
||||
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - Palauta vanhat navigointikuvakkeet</string>
|
||||
</patch>
|
||||
<patch id="layout.startpage.changeStartPagePatch">
|
||||
<string name="revanced_change_start_page_title">Vaihda aloitussivua</string>
|
||||
<string name="revanced_change_start_page_entry_default">Oletus</string>
|
||||
<string name="revanced_change_start_page_entry_all_subscriptions">Kaikki tilaukset</string>
|
||||
<string name="revanced_change_start_page_entry_browse">Selaa kanavia</string>
|
||||
@@ -1129,6 +1132,11 @@ Jos tämä poistetaan myöhemmin käytöstä, on suositeltavaa tyhjentää sovel
|
||||
<string name="revanced_change_start_page_entry_virtual_reality">Virtuaalitodellisuus</string>
|
||||
<string name="revanced_change_start_page_entry_watch_later">Katso myöhemmin</string>
|
||||
<string name="revanced_change_start_page_entry_your_clips">Omat klipit</string>
|
||||
<string name="revanced_change_start_page_always_title">Vaihda aloitussivu aina</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"Aloitussivu vaihdetaan aina
|
||||
|
||||
Rajoitus: Työkalupalkin takaisin-painikkeen käyttäminen ei välttämättä toimi"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Aloitussivu vaihdetaan vain sovelluksen käynnistyessä</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">Poista Shorts-soittimen jatkaminen käytöstä</string>
|
||||
|
||||
@@ -1134,7 +1134,7 @@ Si désactivé ultérieurement, il est recommandé d'effacer les données de l'a
|
||||
<string name="revanced_change_start_page_always_title">Toujours modifier la page de démarrage</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"La page de démarrage est toujours modifiée
|
||||
|
||||
Limitation : l'utilisation du bouton de retour dans la barre d'outils peut ne pas fonctionner"</string>
|
||||
Limitation : Il se peut que le bouton Retour dans la barre d'outils ne fonctionne pas"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">La page de démarrage est modifiée uniquement au démarrage de l\'application</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
|
||||
@@ -74,7 +74,7 @@ Second \"item\" text"</string>
|
||||
|
||||
MicroG GmsCore に対する電池の最適化を無効にしても、バッテリーの使用に悪影響を及ぼすことはありません。
|
||||
|
||||
続行ボタンをタップして電池の最適化の設定を変更してください。"</string>
|
||||
[続行] をタップして電池の最適化の設定を変更してください。"</string>
|
||||
<string name="gms_core_dialog_continue_text">続行</string>
|
||||
</patch>
|
||||
</app>
|
||||
@@ -1060,7 +1060,7 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ
|
||||
<string name="revanced_sb_stats_submissions_sum">作成したセグメントを表示するには、ここをタップしてください</string>
|
||||
<string name="revanced_sb_stats_saved_zero">SponsorBlock リーダーボード</string>
|
||||
<string name="revanced_sb_stats_saved">合計で <b>%s</b> 個のセグメントから人々を救いました</string>
|
||||
<string name="revanced_sb_stats_saved_sum_zero">グローバルの統計と上位の貢献者を表示するには、ここをタップしてください</string>
|
||||
<string name="revanced_sb_stats_saved_sum_zero">ここをタップすると、全体の統計とセグメント作成者のランキングが表示されます</string>
|
||||
<string name="revanced_sb_stats_saved_sum">時間にして <b>%s</b> です。<br>ここをタップすると、リーダーボードが表示されます</string>
|
||||
<string name="revanced_sb_stats_self_saved">合計で <b>%s</b> 個のセグメントをスキップしました</string>
|
||||
<string name="revanced_sb_stats_self_saved_sum">時間にして <b>%s</b> です</string>
|
||||
@@ -1161,8 +1161,8 @@ Automotive レイアウト
|
||||
</patch>
|
||||
<patch id="layout.miniplayer.miniplayerPatch">
|
||||
<string name="revanced_miniplayer_screen_title">ミニプレーヤー</string>
|
||||
<string name="revanced_miniplayer_screen_summary">動画視聴中に [戻る] ボタンをタップ、または下にスワイプしたときに表示されるプレーヤーの設定</string>
|
||||
<string name="revanced_miniplayer_type_title">ミニプレーヤー タイプ</string>
|
||||
<string name="revanced_miniplayer_screen_summary">動画視聴中に [戻る] ボタンをタップ、または下にスワイプしたときに表示される小さなプレーヤーの設定</string>
|
||||
<string name="revanced_miniplayer_type_title">ミニプレーヤーのタイプ</string>
|
||||
<string name="revanced_miniplayer_type_entry_0">無効</string>
|
||||
<string name="revanced_miniplayer_type_entry_1">デフォルト</string>
|
||||
<string name="revanced_miniplayer_type_entry_2">横長</string>
|
||||
|
||||
@@ -466,8 +466,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">Значение затемнения панели жестов должно быть от 0 до 100</string>
|
||||
<string name="revanced_swipe_threshold_title">Порог величины жеста</string>
|
||||
<string name="revanced_swipe_threshold_summary">Минимальная амплитуда движения, распознаваемого как жест</string>
|
||||
<string name="revanced_swipe_volume_sensitivity_title">Чувствительность свайпа для регулировки громкости</string>
|
||||
<string name="revanced_swipe_volume_sensitivity_summary">На сколько изменяется громкость при каждом свайпе</string>
|
||||
<string name="revanced_swipe_volume_sensitivity_title">Чувствительность жеста регулировки громкости</string>
|
||||
<string name="revanced_swipe_volume_sensitivity_summary">Величина изменения громкости при регулировке жестом</string>
|
||||
<string name="revanced_swipe_show_circular_overlay_title">Показать круговой индикатор</string>
|
||||
<string name="revanced_swipe_show_circular_overlay_summary_on">Круговой индикатор показан</string>
|
||||
<string name="revanced_swipe_show_circular_overlay_summary_off">Горизонтальный индикатор показан</string>
|
||||
@@ -832,8 +832,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_on">Кнопка \"Лайк\" стилизована для минимальной ширины</string>
|
||||
<string name="revanced_ryd_compact_layout_summary_off">Кнопка \"Лайк\" стилизована для лучшего внешнего вида</string>
|
||||
<string name="revanced_ryd_estimated_like_title">Показать примерное количество лайков</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_on">На видео с отключенными лайками отображается примерное количество лайков</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_off">Примерное количество лайков не отображается</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_on">Для видео с отключенными лайками показывается примерное количество лайков</string>
|
||||
<string name="revanced_ryd_estimated_like_summary_off">Примерное количество лайков скрыто</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_title">Уведомление при недоступности API</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_on">Всплывающее уведомление при недоступности Return YouTube Dislike показано</string>
|
||||
<string name="revanced_ryd_toast_on_connection_error_summary_off">Всплывающее уведомление при недоступности Return YouTube Dislike скрыто</string>
|
||||
@@ -1132,11 +1132,11 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_change_start_page_entry_virtual_reality">Виртуальная реальность</string>
|
||||
<string name="revanced_change_start_page_entry_watch_later">Смотреть позже</string>
|
||||
<string name="revanced_change_start_page_entry_your_clips">Ваши клипы</string>
|
||||
<string name="revanced_change_start_page_always_title">Всегда изменять стартовую страницу</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"Начальная страница всегда изменена
|
||||
<string name="revanced_change_start_page_always_title">Всегда изменять начальную страницу</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"Начальная страница изменяется всегда
|
||||
|
||||
Ограничение: использование кнопки \"Назад\" на панели инструментов может не работать"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Стартовая страница изменяется только при запуске приложения</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Начальная страница изменяется только при запуске приложения</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">Отключить возобновление плеера Shorts</string>
|
||||
|
||||
@@ -1106,7 +1106,7 @@ Ako se kasnije isključi, preporučuje se da izbrišete podatke aplikacije da bi
|
||||
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - Vraća stare ikonice navigacije</string>
|
||||
</patch>
|
||||
<patch id="layout.startpage.changeStartPagePatch">
|
||||
<string name="revanced_change_start_page_title">Promeni polaznu stranicu</string>
|
||||
<string name="revanced_change_start_page_title">Promena polazne stranice</string>
|
||||
<string name="revanced_change_start_page_entry_default">Podrazumevana</string>
|
||||
<string name="revanced_change_start_page_entry_all_subscriptions">Sva praćenja</string>
|
||||
<string name="revanced_change_start_page_entry_browse">Pretraga kanala</string>
|
||||
@@ -1131,11 +1131,11 @@ Ako se kasnije isključi, preporučuje se da izbrišete podatke aplikacije da bi
|
||||
<string name="revanced_change_start_page_entry_virtual_reality">Virtuelna realnost</string>
|
||||
<string name="revanced_change_start_page_entry_watch_later">Za kasnije</string>
|
||||
<string name="revanced_change_start_page_entry_your_clips">Vaši klipovi</string>
|
||||
<string name="revanced_change_start_page_always_title">Uvek promeni početnu stranicu</string>
|
||||
<string name="revanced_change_start_page_always_title">Uvek menjaj polaznu stranicu</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"Polazna stranica se uvek menja
|
||||
|
||||
Ograničenje: Korišćenje dugmeta za povratak na traci sa alatkama možda neće funkcionisati"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Početna stranica se menja samo pri pokretanju aplikacije</string>
|
||||
Ograničenje: Korišćenje dugmeta „Nazad” na traci sa alatkama možda neće raditi"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Polazna stranica se menja samo pri pokretanju aplikacije</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">Onemogući nastavak reprodukcije Shorts plejera</string>
|
||||
|
||||
@@ -1106,7 +1106,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">19.01.34 - Враћа старе иконице навигације</string>
|
||||
</patch>
|
||||
<patch id="layout.startpage.changeStartPagePatch">
|
||||
<string name="revanced_change_start_page_title">Промени почетну страницу</string>
|
||||
<string name="revanced_change_start_page_title">Промена полазне странице</string>
|
||||
<string name="revanced_change_start_page_entry_default">Подразумевана</string>
|
||||
<string name="revanced_change_start_page_entry_all_subscriptions">Сва праћења</string>
|
||||
<string name="revanced_change_start_page_entry_browse">Претрага канала</string>
|
||||
@@ -1131,11 +1131,11 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_change_start_page_entry_virtual_reality">Виртуелна реалност</string>
|
||||
<string name="revanced_change_start_page_entry_watch_later">За касније</string>
|
||||
<string name="revanced_change_start_page_entry_your_clips">Ваши клипови</string>
|
||||
<string name="revanced_change_start_page_always_title">Увек промени почетну страницу</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"Почетна страница је увек промењена
|
||||
<string name="revanced_change_start_page_always_title">Увек мењај полазну страницу</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"Полазна страница се увек мења
|
||||
|
||||
Ограничење: Коришћење дугмета за повратак на траци са алаткама можда неће радити"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Почетна страница се мења само при покретању апликације</string>
|
||||
Ограничење: Коришћење дугмета „Назад” на траци са алаткама можда неће радити"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Полазна страница се мења само при покретању апликације</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
<string name="revanced_disable_resuming_shorts_player_title">Онемогући наставак репродукције Shorts плејера</string>
|
||||
|
||||
@@ -1132,10 +1132,10 @@ Daha sonra kapatılırsa, arayüz hatalarını önlemek için uygulama verilerin
|
||||
<string name="revanced_change_start_page_entry_virtual_reality">Sanal Gerçeklik</string>
|
||||
<string name="revanced_change_start_page_entry_watch_later">Daha sonra izle</string>
|
||||
<string name="revanced_change_start_page_entry_your_clips">Sizin klipleriniz</string>
|
||||
<string name="revanced_change_start_page_always_title">Başlangıç sayfası her zaman değiştirilsin</string>
|
||||
<string name="revanced_change_start_page_always_title">Başlangıç sayfasını her zaman değiştir</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"Başlangıç sayfası her zaman değiştirilir
|
||||
|
||||
Sınırlama: Araç çubuğunda geri düğmesini kullanmak işe yaramayabilir"</string>
|
||||
Kısıtlama: Araç çubuğundaki geri düğmesini kullanmak işe yaramayabilir"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Başlangıç sayfası yalnızca uygulama başlatılırken değiştirilir</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
|
||||
@@ -1134,7 +1134,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_change_start_page_always_title">Завжди змінювати початкову сторінку</string>
|
||||
<string name="revanced_change_start_page_always_summary_on">"Початкова сторінка завжди змінюється
|
||||
|
||||
Обмеження: використання кнопки «Назад» на панелі інструментів може не працювати"</string>
|
||||
Обмеження: Використання кнопки \"Назад\" на панелі інструментів може не працювати"</string>
|
||||
<string name="revanced_change_start_page_always_summary_off">Початкова сторінка змінюється лише під час запуску програми</string>
|
||||
</patch>
|
||||
<patch id="layout.startupshortsreset.disableResumingShortsOnStartupPatch">
|
||||
|
||||
@@ -23,8 +23,8 @@ Second \"item\" text"</string>
|
||||
<patch id="misc.checks.checkEnvironmentPatch">
|
||||
<string name="revanced_check_environment_failed_title">Kiểm tra thất bại</string>
|
||||
<string name="revanced_check_environment_dialog_open_official_source_button">Mở trang web chính thức</string>
|
||||
<string name="revanced_check_environment_dialog_ignore_button">Phớt lờ</string>
|
||||
<string name="revanced_check_environment_failed_message"><h5>Ứng dụng này xem ra không được vá bởi bạn.</h5><br>Ứng dụng này có thể không hoạt động chính xác, <b>gây hại hoặc thậm chí nguy hiểm khi dùng</b>.<br><br>Những lần kiểm tra này ngụ ý rằng ứng dụng được vá trước hoặc được nhận được từ ai khác;<br><br><small>%1$s</small><br>Cực kỳ khuyến nghị <b>gỡ cài đặt ứng này và tự vá</b> để chắc chắn bạn dùng ứng dụng hợp lệ và an toàn.<p><br>Nếu phớt lờ, cảnh báo này sẽ chỉ hiện hai lần.</string>
|
||||
<string name="revanced_check_environment_dialog_ignore_button">Bỏ qua</string>
|
||||
<string name="revanced_check_environment_failed_message"><h5>Ứng dụng này xem ra không phải do bạn tự vá.</h5><br>Ứng dụng này có thể không hoạt động chính xác, <b>tiềm ẩn rủi ro hoặc thậm chí gây nguy hiểm khi sử dụng</b>.<br><br>Những kiểm tra này ngụ ý rằng ứng dụng được vá sẵn hoặc lấy từ nguồn khác;<br><br><small>%1$s</small><br>Chúng tôi khuyến nghị bạn nên <b>gỡ cài đặt ứng này và tự vá lại</b> để đảm bảo bạn đang dùng một ứng dụng an toàn và hợp lệ.<p><br>Cảnh báo này sẽ chỉ hiện hai lần, hãy cân nhắc trước khi bỏ qua.</string>
|
||||
<string name="revanced_check_environment_not_same_patching_device">Đã vá trên một thiết bị khác</string>
|
||||
<string name="revanced_check_environment_manager_not_expected_installer">Không được cài đặt bởi ReVanced Manager</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time">Đã vá hơn 10 phút trước</string>
|
||||
@@ -43,19 +43,19 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_import_success">Đã nhập cài đặt %d</string>
|
||||
<string name="revanced_settings_import_failure_parse">Nhập thất bại: %s</string>
|
||||
<string name="revanced_show_menu_icons_title">Hiện biểu tượng cài đặt ReVanced</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Các biểu tượng cài đặt được hiện</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Các biểu tượng cài đặt không được hiện</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Các biểu tượng cài đặt được hiển thị</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Các biểu tượng cài đặt không được hiển thị</string>
|
||||
<string name="revanced_language_title">Ngôn ngữ ReVanced</string>
|
||||
<string name="revanced_language_user_dialog_message">"Dịch cho một số ngôn ngữ có thể bị thiếu hoặc không đầy đủ.
|
||||
<string name="revanced_language_user_dialog_message">"Một số ngôn ngữ có thể chưa được dịch đầy đủ hoặc bị thiếu.
|
||||
|
||||
Để dịch các ngôn ngữ mới, hãy truy cập translate.revanced.app"</string>
|
||||
Để đóng góp bản dịch các ngôn ngữ mới, hãy truy cập translate.revanced.app"</string>
|
||||
<string name="revanced_language_DEFAULT">Ngôn ngữ ứng dụng</string>
|
||||
<string name="revanced_pref_import_export_title">Nhập / Xuất</string>
|
||||
<string name="revanced_pref_import_export_summary">Nhập / Xuất cài đặt ReVanced</string>
|
||||
<!-- Settings about dialog. -->
|
||||
<string name="revanced_settings_about_links_body">Bạn đang dùng Bản vá ReVanced phiên bản <i>%s</i></string>
|
||||
<string name="revanced_settings_about_links_body">Bạn đang dùng ReVanced Patches phiên bản <i>%s</i></string>
|
||||
<string name="revanced_settings_about_links_dev_header">Lưu ý</string>
|
||||
<string name="revanced_settings_about_links_dev_body">Đây là phiên bản tiền phát hành và bạn có thể gặp phải sự cố không mong muốn</string>
|
||||
<string name="revanced_settings_about_links_dev_body">Đây là phiên bản phát hành trước và bạn có thể gặp phải sự cố không mong muốn</string>
|
||||
<string name="revanced_settings_about_links_header">Các liên kết chính thức</string>
|
||||
<!-- NOTE: the about strings above are duplicated in the TikTok about screen code,
|
||||
and changes made here must also be made there. -->
|
||||
@@ -64,17 +64,17 @@ Second \"item\" text"</string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="gms_core_toast_not_installed_message">MicroG GmsCore chưa được cài đặt. Hãy cài đặt ngay.</string>
|
||||
<string name="gms_core_dialog_title">Hành động cần thiết</string>
|
||||
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">"MicroG GmsCore không có quyền chạy ngầm.
|
||||
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">"MicroG GmsCore không có quyền chạy nền.
|
||||
|
||||
Hãy làm theo hướng dẫn \"Đừng tắt ứng dụng\" của điện thoại bạn và áp dụng các hướng dẫn cho cài đặt MicroG của bạn.
|
||||
Hãy làm theo hướng dẫn \"Don't kill my app\" dành cho điện thoại của bạn và áp dụng các bước đó để cài đặt MicroG.
|
||||
|
||||
Điều này là cần thiết để ứng dụng hoạt động."</string>
|
||||
Việc cấp quyền chạy nền là bắt buộc để ứng dụng hoạt động."</string>
|
||||
<string name="gms_core_dialog_open_website_text">Mở trang web</string>
|
||||
<string name="gms_core_dialog_not_whitelisted_using_battery_optimizations_message">"Tối ưu hóa pin MicroG GmsCore phải được tắt để tránh sự cố.
|
||||
<string name="gms_core_dialog_not_whitelisted_using_battery_optimizations_message">"Cần phải tắt tối ưu hóa pin cho MicroG GmsCore để tránh sự cố.
|
||||
|
||||
Tắt tối ưu hóa pin cho MicroG sẽ không ảnh hưởng tiêu cực đến việc sử dụng pin.
|
||||
Tắt tối ưu hóa pin cho MicroG sẽ không ảnh hưởng đáng kể đến hiệu suất sử dụng pin.
|
||||
|
||||
Nhấn nút tiếp tục và cho phép thay đổi tối ưu hóa."</string>
|
||||
Nhấn nút tiếp tục và cho phép thay đổi lựa chọn tối ưu hóa."</string>
|
||||
<string name="gms_core_dialog_continue_text">Tiếp tục</string>
|
||||
</patch>
|
||||
</app>
|
||||
@@ -91,13 +91,13 @@ Nhấn nút tiếp tục và cho phép thay đổi tối ưu hóa."</string>
|
||||
<string name="revanced_settings_screen_11_misc_title">Cài đặt khác</string>
|
||||
<string name="revanced_settings_screen_12_video_title">Video</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">Khôi phục trình đơn cài đặt cũ</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Các trình đơn cài đặt cũ được hiện</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Các trình đơn cài đặt cũ không được hiện</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">Các trình đơn cài đặt cũ được hiển thị</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">Các trình đơn cài đặt cũ không được hiển thị</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">Tắt phát nền cho Shorts</string>
|
||||
<string name="revanced_shorts_disable_background_playback_summary_on">Chạy nền cho Shorts được tắt</string>
|
||||
<string name="revanced_shorts_disable_background_playback_summary_off">Chạy nền cho Shorts được bật</string>
|
||||
<string name="revanced_shorts_disable_background_playback_summary_on">Phát nền cho Shorts đã tắt</string>
|
||||
<string name="revanced_shorts_disable_background_playback_summary_off">Phát nền cho Shorts được bật</string>
|
||||
</patch>
|
||||
<patch id="misc.debugging.enableDebuggingPatch">
|
||||
<string name="revanced_debug_screen_title">Gỡ lỗi</string>
|
||||
@@ -112,131 +112,131 @@ Nhấn nút tiếp tục và cho phép thay đổi tối ưu hóa."</string>
|
||||
<string name="revanced_debug_stacktrace_summary_on">Nhật ký gỡ lỗi bao gồm truy vết stack</string>
|
||||
<string name="revanced_debug_stacktrace_summary_off">Nhật ký gỡ lỗi không bao gồm truy vết stack</string>
|
||||
<string name="revanced_debug_toast_on_error_title">Hiện thông báo nổi về lỗi ReVanced</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_on">Thông báo nổi được hiện nếu xảy ra lỗi</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_off">Thông báo nổi không được hiện nếu xảy ra lỗi</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_on">Thông báo nổi được hiển thị nếu xảy ra lỗi</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_off">Thông báo nổi không được hiển thị nếu xảy ra lỗi</string>
|
||||
<string name="revanced_debug_toast_on_error_user_dialog_message">"Tắt thông báo lỗi sẽ ẩn tất cả thông báo lỗi của ReVanced.
|
||||
|
||||
Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ nào."</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.general.hideLayoutComponentsPatch">
|
||||
<string name="revanced_hide_album_cards_title">Ẩn các thẻ album</string>
|
||||
<string name="revanced_hide_album_cards_summary_on">Các thẻ album được ẩn</string>
|
||||
<string name="revanced_hide_album_cards_summary_off">Các thẻ album được hiện</string>
|
||||
<string name="revanced_hide_album_cards_summary_on">Các thẻ album bị ẩn</string>
|
||||
<string name="revanced_hide_album_cards_summary_off">Các thẻ album được hiển thị</string>
|
||||
<string name="revanced_hide_crowdfunding_box_title">Ẩn hộp chiến dịch gây quỹ</string>
|
||||
<string name="revanced_hide_crowdfunding_box_summary_on">Hộp chiến dịch gây quỹ được ẩn</string>
|
||||
<string name="revanced_hide_crowdfunding_box_summary_off">Hộp chiến dịch gây quỹ được hiện</string>
|
||||
<string name="revanced_hide_crowdfunding_box_summary_on">Hộp chiến dịch gây quỹ bị ẩn</string>
|
||||
<string name="revanced_hide_crowdfunding_box_summary_off">Hộp chiến dịch gây quỹ được hiển thị</string>
|
||||
<string name="revanced_hide_floating_microphone_button_title">Ẩn nút micrô nổi</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_on">Nút micrô được ẩn</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_off">Nút micrô được hiện</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_on">Nút micrô bị ẩn</string>
|
||||
<string name="revanced_hide_floating_microphone_button_summary_off">Nút micrô được hiển thị</string>
|
||||
<string name="revanced_hide_channel_watermark_title">Ẩn hình mờ của kênh</string>
|
||||
<string name="revanced_hide_channel_watermark_summary_on">Hình mờ được ẩn</string>
|
||||
<string name="revanced_hide_channel_watermark_summary_off">Hình mờ được hiện</string>
|
||||
<string name="revanced_hide_channel_watermark_summary_on">Hình mờ bị ẩn</string>
|
||||
<string name="revanced_hide_channel_watermark_summary_off">Hình mờ được hiển thị</string>
|
||||
<string name="revanced_hide_horizontal_shelves_title">Ẩn các kệ ngang</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_on">"Kệ bị ẩn chẳng hạn như:
|
||||
<string name="revanced_hide_horizontal_shelves_summary_on">"Kệ bị ẩn, chẳng hạn như:
|
||||
• Tin tức nóng
|
||||
• Tiếp tục xem
|
||||
• Khám phá thêm kênh
|
||||
• Mua sắm
|
||||
• Xem lại"</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_off">Kệ ngang được hiện</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_off">Kệ ngang được hiển thị</string>
|
||||
<!-- 'Join' should be translated using the same localized wording YouTube displays.
|
||||
This appears in the video player for certain videos. -->
|
||||
<string name="revanced_hide_join_membership_button_title">Ẩn nút Tham gia</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_on">Nút được ẩn</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_off">Nút được hiện</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_on">Nút bị ẩn</string>
|
||||
<string name="revanced_hide_join_membership_button_summary_off">Nút được hiển thị</string>
|
||||
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_for_you_shelf_title">Ẩn kệ \'Dành cho bạn\'</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_on">Kệ trên trang kênh bị ẩn</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_off">Kệ trên trang kênh được hiện</string>
|
||||
<string name="revanced_hide_for_you_shelf_summary_off">Kệ trên trang kênh được hiển thị</string>
|
||||
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||
<string name="revanced_hide_notify_me_button_title">Ẩn nút Thông báo cho tôi</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Nút được ẩn</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Nút được hiện</string>
|
||||
<string name="revanced_hide_notify_me_button_title">Ẩn nút \'Thông báo cho tôi\'</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_on">Nút bị ẩn</string>
|
||||
<string name="revanced_hide_notify_me_button_summary_off">Nút được hiển thị</string>
|
||||
<!-- 'People also watched' should be translated using the same localized wording YouTube displays. -->
|
||||
<string name="revanced_hide_search_result_recommendations_title">Ẩn nhãn \"Mọi người cũng đã xem\"</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Nhãn được ẩn</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Nhãn được hiện</string>
|
||||
<string name="revanced_hide_search_result_recommendations_title">Ẩn nhãn \'Mọi người cũng đã xem\'</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_on">Nhãn bị ẩn</string>
|
||||
<string name="revanced_hide_search_result_recommendations_summary_off">Nhãn được hiển thị</string>
|
||||
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||
This button usually appears when searching for a YT creator. -->
|
||||
<string name="revanced_hide_show_more_button_title">Ẩn nút \'Hiện thêm\'</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Nút được ẩn</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Nút được hiện</string>
|
||||
<string name="revanced_hide_show_more_button_summary_on">Nút bị ẩn</string>
|
||||
<string name="revanced_hide_show_more_button_summary_off">Nút được hiển thị</string>
|
||||
<string name="revanced_hide_timed_reactions_title">Ẩn phản ứng theo thời gian</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Phản ứng theo thời gian được ẩn</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Phản ứng theo thời gian được hiện</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_on">Phản ứng theo thời gian bị ẩn</string>
|
||||
<string name="revanced_hide_timed_reactions_summary_off">Phản ứng theo thời gian được hiển thị</string>
|
||||
<string name="revanced_hide_channel_guidelines_title">Ẩn nguyên tắc của kênh</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Nguyên tắc của kênh được ẩn</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Nguyên tắc của kênh được hiện</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Nguyên tắc của kênh bị ẩn</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Nguyên tắc của kênh được hiển thị</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Ẩn kệ danh mục được đề xuất</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Kệ danh mục được đề xuất được ẩn</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Kệ danh mục được đề xuất được hiện</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Kệ danh mục được đề xuất bị ẩn</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Kệ danh mục được đề xuất được hiển thị</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Ẩn thẻ có thể mở rộng bên dưới video</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Thẻ có thể mở rộng bị ẩn</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Thẻ có thể mở rộng được hiện</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Thẻ có thể mở rộng được hiển thị</string>
|
||||
<string name="revanced_hide_community_posts_title">Ẩn bài đăng cộng đồng</string>
|
||||
<string name="revanced_hide_community_posts_summary_on">Bài đăng cộng đồng được ẩn</string>
|
||||
<string name="revanced_hide_community_posts_summary_off">Bài đăng cộng đồng được hiện</string>
|
||||
<string name="revanced_hide_community_posts_summary_on">Bài đăng cộng đồng bị ẩn</string>
|
||||
<string name="revanced_hide_community_posts_summary_off">Bài đăng cộng đồng được hiển thị</string>
|
||||
<string name="revanced_hide_compact_banner_title">Ẩn biểu ngữ vắn tắt</string>
|
||||
<string name="revanced_hide_compact_banner_summary_on">Biểu ngữ vắn tắt được ẩn</string>
|
||||
<string name="revanced_hide_compact_banner_summary_off">Biểu ngữ vắn tắt được hiện</string>
|
||||
<string name="revanced_hide_compact_banner_summary_on">Biểu ngữ vắn tắt bị ẩn</string>
|
||||
<string name="revanced_hide_compact_banner_summary_off">Biểu ngữ vắn tắt được hiển thị</string>
|
||||
<string name="revanced_hide_movies_section_title">Ẩn phần phim</string>
|
||||
<string name="revanced_hide_movies_section_summary_on">Phần phim được ẩn</string>
|
||||
<string name="revanced_hide_movies_section_summary_off">Phần phim được hiện</string>
|
||||
<string name="revanced_hide_movies_section_summary_on">Phần phim bị ẩn</string>
|
||||
<string name="revanced_hide_movies_section_summary_off">Phần phim được hiển thị</string>
|
||||
<string name="revanced_hide_feed_survey_title">Ẩn khảo sát ở bảng tin</string>
|
||||
<string name="revanced_hide_feed_survey_summary_on">Khảo sát ở bảng tin được ẩn</string>
|
||||
<string name="revanced_hide_feed_survey_summary_off">Khảo sát ở bảng tin được hiện</string>
|
||||
<string name="revanced_hide_feed_survey_summary_on">Khảo sát ở bảng tin bị ẩn</string>
|
||||
<string name="revanced_hide_feed_survey_summary_off">Khảo sát ở bảng tin được hiển thị</string>
|
||||
<string name="revanced_hide_community_guidelines_title">Ẩn nguyên tắc cộng đồng</string>
|
||||
<string name="revanced_hide_community_guidelines_summary_on">Nguyên tắc cộng đồng được ẩn</string>
|
||||
<string name="revanced_hide_community_guidelines_summary_on">Nguyên tắc cộng đồng bị ẩn</string>
|
||||
<string name="revanced_hide_community_guidelines_summary_off">Nguyên tắc cộng đồng được hiện</string>
|
||||
<string name="revanced_hide_subscribers_community_guidelines_title">Ẩn nguyên tắc cộng đồng cho người đăng ký</string>
|
||||
<string name="revanced_hide_subscribers_community_guidelines_summary_on">Nguyên tắc cộng đồng cho người đăng ký được ẩn</string>
|
||||
<string name="revanced_hide_subscribers_community_guidelines_summary_off">Nguyên tắc cộng đồng dành cho người đăng ký được hiện</string>
|
||||
<string name="revanced_hide_subscribers_community_guidelines_summary_on">Nguyên tắc cộng đồng cho người đăng ký bị ẩn</string>
|
||||
<string name="revanced_hide_subscribers_community_guidelines_summary_off">Nguyên tắc cộng đồng dành cho người đăng ký được hiển thị</string>
|
||||
<string name="revanced_hide_channel_member_shelf_title">Ẩn kệ hội viên kênh</string>
|
||||
<string name="revanced_hide_channel_member_shelf_summary_on">Kệ hội viên kênh được ẩn</string>
|
||||
<string name="revanced_hide_channel_member_shelf_summary_off">Kệ hội viên kênh được hiện</string>
|
||||
<string name="revanced_hide_channel_member_shelf_summary_on">Kệ hội viên kênh bị ẩn</string>
|
||||
<string name="revanced_hide_channel_member_shelf_summary_off">Kệ hội viên kênh được hiển thị</string>
|
||||
<string name="revanced_hide_emergency_box_title">Ẩn hộp khẩn cấp</string>
|
||||
<string name="revanced_hide_emergency_box_summary_on">Hộp khẩn cấp được được ẩn</string>
|
||||
<string name="revanced_hide_emergency_box_summary_off">Hộp khẩn cấp được hiện</string>
|
||||
<string name="revanced_hide_emergency_box_summary_on">Hộp khẩn cấp được bị ẩn</string>
|
||||
<string name="revanced_hide_emergency_box_summary_off">Hộp khẩn cấp được hiển thị</string>
|
||||
<string name="revanced_hide_info_panels_title">Ẩn bảng thông tin</string>
|
||||
<string name="revanced_hide_info_panels_summary_on">Bảng thông tin được ẩn</string>
|
||||
<string name="revanced_hide_info_panels_summary_off">Bảng thông tin được hiện</string>
|
||||
<string name="revanced_hide_info_panels_summary_on">Bảng thông tin bị ẩn</string>
|
||||
<string name="revanced_hide_info_panels_summary_off">Bảng thông tin được hiển thị</string>
|
||||
<string name="revanced_hide_medical_panels_title">Ẩn bảng thông tin y tế</string>
|
||||
<string name="revanced_hide_medical_panels_summary_on">Bảng thông tin y tế được ẩn</string>
|
||||
<string name="revanced_hide_medical_panels_summary_off">Bảng thông tin y tế được hiện</string>
|
||||
<string name="revanced_hide_medical_panels_summary_on">Bảng thông tin y tế bị ẩn</string>
|
||||
<string name="revanced_hide_medical_panels_summary_off">Bảng thông tin y tế được hiển thị</string>
|
||||
<string name="revanced_hide_channel_bar_title">Ẩn nút kênh</string>
|
||||
<string name="revanced_hide_channel_bar_summary_on">Nút kênh được ẩn</string>
|
||||
<string name="revanced_hide_channel_bar_summary_off">Nút kênh được hiện</string>
|
||||
<string name="revanced_hide_playables_title">Ẩn phần phát được</string>
|
||||
<string name="revanced_hide_playables_summary_on">Phần phát được ẩn</string>
|
||||
<string name="revanced_hide_playables_summary_off">Phần phát được được hiện</string>
|
||||
<string name="revanced_hide_channel_bar_summary_on">Nút kênh bị ẩn</string>
|
||||
<string name="revanced_hide_channel_bar_summary_off">Nút kênh được hiển thị</string>
|
||||
<string name="revanced_hide_playables_title">Ẩn Playables</string>
|
||||
<string name="revanced_hide_playables_summary_on">Playables bị ẩn</string>
|
||||
<string name="revanced_hide_playables_summary_off">Playables được hiển thị</string>
|
||||
<string name="revanced_hide_quick_actions_title">Ẩn các hành động nhanh khi ở toàn màn hình</string>
|
||||
<string name="revanced_hide_quick_actions_summary_on">Hành động nhanh được ẩn</string>
|
||||
<string name="revanced_hide_quick_actions_summary_off">Hành động nhanh được hiện</string>
|
||||
<string name="revanced_hide_quick_actions_summary_on">Hành động nhanh bị ẩn</string>
|
||||
<string name="revanced_hide_quick_actions_summary_off">Hành động nhanh được hiển thị</string>
|
||||
<string name="revanced_hide_related_videos_title">Ẩn các video liên quan trong hành động nhanh</string>
|
||||
<string name="revanced_hide_related_videos_summary_on">Các video liên quan được ẩn</string>
|
||||
<string name="revanced_hide_related_videos_summary_off">Các video liên quan được hiện</string>
|
||||
<string name="revanced_hide_related_videos_summary_on">Các video liên quan bị ẩn</string>
|
||||
<string name="revanced_hide_related_videos_summary_off">Các video liên quan được hiển thị</string>
|
||||
<string name="revanced_hide_image_shelf_title">Ẩn kệ hình ảnh từ kết quả tìm kiếm</string>
|
||||
<string name="revanced_hide_image_shelf_summary_on">Kệ hình ảnh được ẩn</string>
|
||||
<string name="revanced_hide_image_shelf_summary_off">Kệ hình ảnh được hiện</string>
|
||||
<string name="revanced_hide_image_shelf_summary_on">Kệ hình ảnh bị ẩn</string>
|
||||
<string name="revanced_hide_image_shelf_summary_off">Kệ hình ảnh được hiển thị</string>
|
||||
<string name="revanced_hide_latest_posts_ads_title">Ẩn bài đăng mới nhất</string>
|
||||
<string name="revanced_hide_latest_posts_ads_summary_on">Bài đăng mới nhất được ẩn</string>
|
||||
<string name="revanced_hide_latest_posts_ads_summary_off">Bài đăng mới nhất được hiện</string>
|
||||
<string name="revanced_hide_latest_posts_ads_summary_on">Bài đăng mới nhất bị ẩn</string>
|
||||
<string name="revanced_hide_latest_posts_ads_summary_off">Bài đăng mới nhất được hiển thị</string>
|
||||
<string name="revanced_hide_mix_playlists_title">Ẩn danh sách phát tổng hợp</string>
|
||||
<string name="revanced_hide_mix_playlists_summary_on">Danh sách phát tổng hợp được ẩn</string>
|
||||
<string name="revanced_hide_mix_playlists_summary_off">Danh sách phát tổng hợp được hiện</string>
|
||||
<string name="revanced_hide_mix_playlists_summary_on">Danh sách phát tổng hợp bị ẩn</string>
|
||||
<string name="revanced_hide_mix_playlists_summary_off">Danh sách phát tổng hợp được hiển thị</string>
|
||||
<string name="revanced_hide_artist_cards_title">Ẩn thẻ nghệ sĩ</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Thẻ nghệ sĩ được ẩn</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Thẻ nghệ sĩ được hiện</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Thẻ nghệ sĩ bị ẩn</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Thẻ nghệ sĩ được hiển thị</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_title">Ẩn \'Tóm tắt video do AI tạo\'</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Phần tóm tắt video được ẩn</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Phần tóm tắt video được hiện</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Phần tóm tắt video bị ẩn</string>
|
||||
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Phần tóm tắt video được hiển thị</string>
|
||||
<string name="revanced_hide_attributes_section_title">Ẩn Thuộc tính</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập bị ẩn</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập được hiện</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập được hiển thị</string>
|
||||
<string name="revanced_hide_chapters_section_title">Ẩn Chương</string>
|
||||
<string name="revanced_hide_chapters_section_summary_on">Phần chương được ẩn</string>
|
||||
<string name="revanced_hide_chapters_section_summary_off">Phần chương được hiện</string>
|
||||
<string name="revanced_hide_chapters_section_summary_on">Phần chương bị ẩn</string>
|
||||
<string name="revanced_hide_chapters_section_summary_off">Phần chương được hiển thị</string>
|
||||
<string name="revanced_hide_how_this_was_made_section_title">Ẩn \'Nội dung này được tạo như thế nào\'</string>
|
||||
<string name="revanced_hide_how_this_was_made_section_summary_on">Phần Nội dung này được tạo như thế nào được ẩn</string>
|
||||
<string name="revanced_hide_how_this_was_made_section_summary_off">Phần Nội dung này được tạo như thế nào được hiện</string>
|
||||
@@ -272,7 +272,7 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n
|
||||
<string name="revanced_hide_comments_ai_chat_summary_summary_off">Tóm tắt trò chuyện được hiện</string>
|
||||
<string name="revanced_hide_comments_ai_summary_title">Ẩn tóm tắt Bình luận AI</string>
|
||||
<string name="revanced_hide_comments_ai_summary_summary_on">Tóm tắt bình luận được ẩn</string>
|
||||
<string name="revanced_hide_comments_ai_summary_summary_off">Tóm tắt bình luận được hiện</string>
|
||||
<string name="revanced_hide_comments_ai_summary_summary_off">Tóm tắt bình luận được hiển thị</string>
|
||||
<string name="revanced_hide_comments_by_members_header_title">Ẩn tiêu đề \'Bình luận bởi hội viên\'</string>
|
||||
<string name="revanced_hide_comments_by_members_header_summary_on">Tiêu đề Bình luận bởi hội viên được ẩn</string>
|
||||
<string name="revanced_hide_comments_by_members_header_summary_off">Tiêu đề Bình luận bởi hội viên được hiện</string>
|
||||
@@ -434,7 +434,7 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ hơn"</string>
|
||||
<patch id="interaction.seekbar.enableSeekbarTappingPatch">
|
||||
<string name="revanced_seekbar_tapping_title">Bật nhấn để tua</string>
|
||||
<string name="revanced_seekbar_tapping_summary_on">Nhấn để tua được bật</string>
|
||||
<string name="revanced_seekbar_tapping_summary_off">Nhấn để tua được tắt</string>
|
||||
<string name="revanced_seekbar_tapping_summary_off">Nhấn để tua bị tắt</string>
|
||||
</patch>
|
||||
<patch id="interaction.swipecontrols.swipeControlsResourcePatch">
|
||||
<string name="revanced_swipe_brightness_title">Bật cử chỉ độ sáng</string>
|
||||
@@ -448,8 +448,8 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ hơn"</string>
|
||||
Điều chỉnh âm lượng bằng cách vuốt dọc ở bên phải màn hình"</string>
|
||||
<string name="revanced_swipe_volume_summary_off">Vuốt âm lượng được tắt</string>
|
||||
<string name="revanced_swipe_press_to_engage_title">Bật cử chỉ nhấn-để-vuốt</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_on">Nhấn-để-vuốt được bật</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_off">Nhấn-để-vuốt được tắt</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_on">Nhấn-để-vuốt đã bật</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_off">Nhấn-để-vuốt đã tắt</string>
|
||||
<string name="revanced_swipe_haptic_feedback_title">Bật phản hồi xúc giác</string>
|
||||
<string name="revanced_swipe_haptic_feedback_summary_on">Phản hồi xúc giác đã bật</string>
|
||||
<string name="revanced_swipe_haptic_feedback_summary_off">Phản hồi xúc giác đã tắt</string>
|
||||
@@ -615,9 +615,9 @@ Nếu việc thay đổi cài đặt này không có hiệu lực, hãy thử ch
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Nút bản âm thanh được ẩn</string>
|
||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Nút bản âm thanh được hiện</string>
|
||||
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Menu theo dõi âm thanh bị ẩn
|
||||
<string name="revanced_hide_player_flyout_audio_track_not_available">"Trình đơn bản âm thanh bị ẩn
|
||||
|
||||
Để hiển thị menu Theo dõi âm thanh, hãy thay đổi 'Giả mạo luồng video' thành iOS TV"</string>
|
||||
Để hiển thị Trình đơn bản âm thanh, hãy thay đổi 'Giả mạo luồng phát video trực tuyến' thành iOS TV"</string>
|
||||
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Ẩn Xem trong thực tế ảo</string>
|
||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Trình đơn xem trong thực tế ảo được ẩn</string>
|
||||
@@ -1188,10 +1188,10 @@ Trình phát nhỏ có thể được kéo đến bất kỳ góc nào của mà
|
||||
Trình phát nhỏ có thể được kéo ra khỏi màn hình sang trái hoặc phải"</string>
|
||||
<string name="revanced_miniplayer_horizontal_drag_summary_off">Cử chỉ kéo ngang được tắt</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_title">Ẩn các nút lớp phủ</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Các nút lớp phủ được ẩn</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Các nút lớp phủ bị ẩn</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Các nút lớp phủ được hiện</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Ẩn các nút mở rộng và đóng</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Nút được ẩn
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Các nút bị ẩn
|
||||
|
||||
Vuốt để mở rộng hoặc đóng"</string>
|
||||
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Các nút mở rộng và đóng được hiện</string>
|
||||
@@ -1397,11 +1397,11 @@ Phát lại video có thể không hoạt động"</string>
|
||||
|
||||
AVC có độ phân giải tối đa là 1080p, bộ giải mã âm thanh Opus không khả dụng và phát lại video sẽ sử dụng nhiều dữ liệu internet hơn VP9 hoặc AV1."</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_tv_title">Tác dụng phụ của việc giả mạo iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_tv_summary">"• Phim hoặc video có trả phí không thể phát
|
||||
<string name="revanced_spoof_video_streams_about_ios_tv_summary">"• Phim hoặc video có trả phí có thể không phát được
|
||||
• Âm lượng ổn định không khả dụng
|
||||
• Video có thể kết thúc sớm hơn 1 giây"</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_title">Tác dụng phụ của việc giả mạo Android</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• Trình đơn âm thanh bị thiếu
|
||||
<string name="revanced_spoof_video_streams_about_android_summary">"• Trình đơn bản âm thanh bị thiếu
|
||||
• Âm lượng ổn định không khả dụng
|
||||
• Tùy chọn âm thanh gốc không khả dụng"</string>
|
||||
<string name="revanced_spoof_video_streams_about_no_av1">• Không có bộ giải mã video AV1</string>
|
||||
|
||||
@@ -479,6 +479,9 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_swipe_change_video_summary_off">在全螢幕模式下滑動將不會切換到下一部/上一部影片</string>
|
||||
</patch>
|
||||
<patch id="layout.autocaptions.autoCaptionsPatch">
|
||||
<string name="revanced_disable_auto_captions_title">停用自動產生的字幕</string>
|
||||
<string name="revanced_disable_auto_captions_summary_on">已停用自動產生的字幕</string>
|
||||
<string name="revanced_disable_auto_captions_summary_off">已啟用自動產生的字幕</string>
|
||||
</patch>
|
||||
<patch id="layout.buttons.action.hideButtonsPatch">
|
||||
<string name="revanced_hide_buttons_screen_title">動作按鈕</string>
|
||||
|
||||
@@ -135,6 +135,27 @@
|
||||
<item>IOS_UNPLUGGED</item>
|
||||
</string-array>
|
||||
</patch>
|
||||
<patch id="interaction.swipecontrols.swipeControlsResourcePatch">
|
||||
<string-array name="revanced_swipe_overlay_style_entries">
|
||||
<item>@string/revanced_swipe_overlay_style_entry_1</item>
|
||||
<item>@string/revanced_swipe_overlay_style_entry_2</item>
|
||||
<item>@string/revanced_swipe_overlay_style_entry_3</item>
|
||||
<item>@string/revanced_swipe_overlay_style_entry_4</item>
|
||||
<item>@string/revanced_swipe_overlay_style_entry_5</item>
|
||||
<item>@string/revanced_swipe_overlay_style_entry_6</item>
|
||||
<item>@string/revanced_swipe_overlay_style_entry_7</item>
|
||||
</string-array>
|
||||
<string-array name="revanced_swipe_overlay_style_entry_values">
|
||||
<!-- Extension enum names. -->
|
||||
<item>HORIZONTAL</item>
|
||||
<item>HORIZONTAL_MINIMAL_TOP</item>
|
||||
<item>HORIZONTAL_MINIMAL_CENTER</item>
|
||||
<item>CIRCULAR</item>
|
||||
<item>CIRCULAR_MINIMAL</item>
|
||||
<item>VERTICAL</item>
|
||||
<item>VERTICAL_MINIMAL</item>
|
||||
</string-array>
|
||||
</patch>
|
||||
<patch id="layout.spoofappversion.spoofAppVersionPatch">
|
||||
<string-array name="revanced_spoof_app_version_target_entries">
|
||||
<item>@string/revanced_spoof_app_version_target_entry_1</item>
|
||||
|
||||
@@ -520,21 +520,30 @@ Adjust volume by swiping vertically on the right side of the screen"</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_title">Enable auto-brightness gesture</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_summary_on">Swiping down to the lowest value of the brightness gesture enable auto-brightness</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_summary_off">Swiping down to the lowest value does not enable auto-brightness</string>
|
||||
<string name="revanced_swipe_lowest_value_enable_auto_brightness_overlay_text">Auto</string>
|
||||
<string name="revanced_swipe_overlay_timeout_title">Swipe overlay timeout</string>
|
||||
<string name="revanced_swipe_overlay_timeout_summary">The amount of milliseconds the overlay is visible</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_title">Swipe overlay background opacity</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_summary">Opacity value between 0-100</string>
|
||||
<string name="revanced_swipe_overlay_background_opacity_invalid_toast">Swipe opacity must be between 0-100</string>
|
||||
<string name="revanced_swipe_overlay_progress_color_title">Swipe overlay progress bar color</string>
|
||||
<string name="revanced_swipe_overlay_progress_color_summary">The color of the progress bar for volume and brightness controls</string>
|
||||
<string name="revanced_swipe_overlay_progress_color_invalid_toast">Invalid progress bar color</string>
|
||||
<string name="revanced_swipe_text_overlay_size_title">Swipe overlay text size</string>
|
||||
<string name="revanced_swipe_text_overlay_size_summary">The text size for swipe overlay between 1-30</string>
|
||||
<string name="revanced_swipe_text_overlay_size_invalid_toast">The text size must be between 1-30</string>
|
||||
<string name="revanced_swipe_threshold_title">Swipe magnitude threshold</string>
|
||||
<string name="revanced_swipe_threshold_summary">The amount of threshold for swipe to occur</string>
|
||||
<string name="revanced_swipe_volume_sensitivity_title">Volume swipe sensitivity</string>
|
||||
<string name="revanced_swipe_volume_sensitivity_summary">How much the volume changes per swipe</string>
|
||||
<string name="revanced_swipe_show_circular_overlay_title">Show circular overlay</string>
|
||||
<string name="revanced_swipe_show_circular_overlay_summary_on">Circular overlay is shown</string>
|
||||
<string name="revanced_swipe_show_circular_overlay_summary_off">Horizontal overlay is shown</string>
|
||||
<string name="revanced_swipe_overlay_minimal_style_title">Enable minimal style</string>
|
||||
<string name="revanced_swipe_overlay_minimal_style_summary_on">Minimal overlay style is enabled</string>
|
||||
<string name="revanced_swipe_overlay_minimal_style_summary_off">Minimal overlay style is disabled</string>
|
||||
<string name="revanced_swipe_overlay_style_title">Swipe overlay style</string>
|
||||
<string name="revanced_swipe_overlay_style_entry_1">Horizontal overlay</string>
|
||||
<string name="revanced_swipe_overlay_style_entry_2">Horizontal overlay (minimal - top)</string>
|
||||
<string name="revanced_swipe_overlay_style_entry_3">Horizontal overlay (minimal - center)</string>
|
||||
<string name="revanced_swipe_overlay_style_entry_4">Circular overlay</string>
|
||||
<string name="revanced_swipe_overlay_style_entry_5">Circular overlay (minimal)</string>
|
||||
<string name="revanced_swipe_overlay_style_entry_6">Vertical overlay</string>
|
||||
<string name="revanced_swipe_overlay_style_entry_7">Vertical overlay (minimal)</string>
|
||||
<string name="revanced_swipe_change_video_title">Enable swipe to change videos</string>
|
||||
<string name="revanced_swipe_change_video_summary_on">Swiping in fullscreen mode will change to the next/previous video</string>
|
||||
<string name="revanced_swipe_change_video_summary_off">Swiping in fullscreen mode will not change to the next/previous video</string>
|
||||
|
||||
Reference in New Issue
Block a user