mirror of
				https://github.com/SoPat712/YTLitePlus.git
				synced 2025-10-30 12:23:58 -04:00 
			
		
		
		
	
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -55,3 +55,6 @@ | |||||||
| [submodule "Tweaks/YouTimeStamp"] | [submodule "Tweaks/YouTimeStamp"] | ||||||
| 	path = Tweaks/YouTimeStamp | 	path = Tweaks/YouTimeStamp | ||||||
| 	url = https://github.com/arichornloverALT/YouTimeStamp.git | 	url = https://github.com/arichornloverALT/YouTimeStamp.git | ||||||
|  | [submodule "Tweaks/YouLoop"] | ||||||
|  | 	path = Tweaks/YouLoop | ||||||
|  | 	url = https://github.com/bhackel/YouLoop | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Makefile
									
									
									
									
									
								
							| @@ -15,7 +15,7 @@ EXTRA_CFLAGS := $(addprefix -I,$(shell find Tweaks/FLEX -name '*.h' -exec dirnam | |||||||
| # Allow YouTubeHeader to be accessible using #include <...> | # Allow YouTubeHeader to be accessible using #include <...> | ||||||
| export ADDITIONAL_CFLAGS = -I$(THEOS_PROJECT_DIR)/Tweaks | export ADDITIONAL_CFLAGS = -I$(THEOS_PROJECT_DIR)/Tweaks | ||||||
|  |  | ||||||
| YTLitePlus_INJECT_DYLIBS = Tweaks/YTLite/var/jb/Library/MobileSubstrate/DynamicLibraries/YTLite.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib .theos/obj/YouMute.dylib .theos/obj/DontEatMyContent.dylib .theos/obj/YTHoldForSpeed.dylib .theos/obj/YTVideoOverlay.dylib .theos/obj/YouGroupSettings.dylib .theos/obj/YouQuality.dylib .theos/obj/YouTimeStamp.dylib | YTLitePlus_INJECT_DYLIBS = Tweaks/YTLite/var/jb/Library/MobileSubstrate/DynamicLibraries/YTLite.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib .theos/obj/YouMute.dylib .theos/obj/DontEatMyContent.dylib .theos/obj/YTHoldForSpeed.dylib .theos/obj/YTVideoOverlay.dylib .theos/obj/YouGroupSettings.dylib .theos/obj/YouQuality.dylib .theos/obj/YouTimeStamp.dylib .theos/obj/YouLoop.dylib | ||||||
| YTLitePlus_FILES = YTLitePlus.xm $(shell find Source -name '*.xm' -o -name '*.x' -o -name '*.m') $(shell find Tweaks/FLEX -type f \( -iname \*.c -o -iname \*.m -o -iname \*.mm \)) | YTLitePlus_FILES = YTLitePlus.xm $(shell find Source -name '*.xm' -o -name '*.x' -o -name '*.m') $(shell find Tweaks/FLEX -type f \( -iname \*.c -o -iname \*.m -o -iname \*.mm \)) | ||||||
| YTLitePlus_IPA = ./tmp/Payload/YouTube.app | YTLitePlus_IPA = ./tmp/Payload/YouTube.app | ||||||
| YTLitePlus_CFLAGS = -fobjc-arc -Wno-deprecated-declarations -Wno-unsupported-availability-guard -Wno-unused-but-set-variable -DTWEAK_VERSION=$(PACKAGE_VERSION) $(EXTRA_CFLAGS) | YTLitePlus_CFLAGS = -fobjc-arc -Wno-deprecated-declarations -Wno-unsupported-availability-guard -Wno-unused-but-set-variable -DTWEAK_VERSION=$(PACKAGE_VERSION) $(EXTRA_CFLAGS) | ||||||
| @@ -23,7 +23,7 @@ YTLitePlus_FRAMEWORKS = UIKit Security | |||||||
|  |  | ||||||
| include $(THEOS)/makefiles/common.mk | include $(THEOS)/makefiles/common.mk | ||||||
| include $(THEOS_MAKE_PATH)/tweak.mk | include $(THEOS_MAKE_PATH)/tweak.mk | ||||||
| SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YouMute Tweaks/DontEatMyContent Tweaks/YTHoldForSpeed Tweaks/YTVideoOverlay Tweaks/YouQuality Tweaks/YouTimeStamp Tweaks/YouGroupSettings | SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YouMute Tweaks/DontEatMyContent Tweaks/YTHoldForSpeed Tweaks/YTVideoOverlay Tweaks/YouQuality Tweaks/YouTimeStamp Tweaks/YouGroupSettings Tweaks/YouLoop | ||||||
| include $(THEOS_MAKE_PATH)/aggregate.mk | include $(THEOS_MAKE_PATH)/aggregate.mk | ||||||
|  |  | ||||||
| YTLITE_PATH = Tweaks/YTLite | YTLITE_PATH = Tweaks/YTLite | ||||||
| @@ -46,6 +46,7 @@ before-package:: | |||||||
| 	@cp -R Tweaks/YTVideoOverlay/layout/Library/Application\ Support/YTVideoOverlay.bundle Resources/ | 	@cp -R Tweaks/YTVideoOverlay/layout/Library/Application\ Support/YTVideoOverlay.bundle Resources/ | ||||||
| 	@cp -R Tweaks/YouQuality/layout/Library/Application\ Support/YouQuality.bundle Resources/ | 	@cp -R Tweaks/YouQuality/layout/Library/Application\ Support/YouQuality.bundle Resources/ | ||||||
| 	@cp -R Tweaks/YouTimeStamp/layout/Library/Application\ Support/YouTimeStamp.bundle Resources/ | 	@cp -R Tweaks/YouTimeStamp/layout/Library/Application\ Support/YouTimeStamp.bundle Resources/ | ||||||
|  | 	@cp -R Tweaks/YouLoop/layout/Library/Application\ Support/YouLoop.bundle Resources/ | ||||||
| 	@cp -R lang/YTLitePlus.bundle Resources/ | 	@cp -R lang/YTLitePlus.bundle Resources/ | ||||||
| 	@echo -e "==> \033[1mChanging the installation path of dylibs...\033[0m" | 	@echo -e "==> \033[1mChanging the installation path of dylibs...\033[0m" | ||||||
| 	@ldid -r .theos/obj/iSponsorBlock.dylib && install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib | 	@ldid -r .theos/obj/iSponsorBlock.dylib && install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib | ||||||
|   | |||||||
| @@ -1,9 +1,6 @@ | |||||||
| #import "../YTLitePlus.h" | #import "../YTLitePlus.h" | ||||||
|  |  | ||||||
| // | // Low Contrast Mode | ||||||
| static BOOL IsEnabled(NSString *key) { |  | ||||||
|     return [[NSUserDefaults standardUserDefaults] boolForKey:key]; |  | ||||||
| } |  | ||||||
| static int contrastMode() { | static int contrastMode() { | ||||||
|     return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcm"]; |     return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcm"]; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -32,12 +32,6 @@ | |||||||
|         settingItemId:0] |         settingItemId:0] | ||||||
| */ | */ | ||||||
|  |  | ||||||
| static BOOL IsEnabled(NSString *key) { |  | ||||||
|     return [[NSUserDefaults standardUserDefaults] boolForKey:key]; |  | ||||||
| } |  | ||||||
| static int GetSelection(NSString *key) { |  | ||||||
|     return [[NSUserDefaults standardUserDefaults] integerForKey:key]; |  | ||||||
| } |  | ||||||
| static int contrastMode() { | static int contrastMode() { | ||||||
|     return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcm"]; |     return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcm"]; | ||||||
| } | } | ||||||
| @@ -82,7 +76,7 @@ static const NSInteger YTLiteSection = 789; | |||||||
| %end | %end | ||||||
|  |  | ||||||
|  |  | ||||||
| // Settings | // Add YTLitePlus to the settings list | ||||||
| %hook YTAppSettingsPresentationData | %hook YTAppSettingsPresentationData | ||||||
| + (NSArray *)settingsCategoryOrder { | + (NSArray *)settingsCategoryOrder { | ||||||
|     NSArray *order = %orig; |     NSArray *order = %orig; | ||||||
| @@ -110,6 +104,7 @@ static const NSInteger YTLiteSection = 789; | |||||||
|     Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem); |     Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem); | ||||||
|     YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"]; |     YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"]; | ||||||
|  |  | ||||||
|  |     // Add item for going to the YTLitePlus GitHub page | ||||||
|     YTSettingsSectionItem *main = [%c(YTSettingsSectionItem) |     YTSettingsSectionItem *main = [%c(YTSettingsSectionItem) | ||||||
|         itemWithTitle:[NSString stringWithFormat:LOC(@"VERSION"), @(OS_STRINGIFY(TWEAK_VERSION))] |         itemWithTitle:[NSString stringWithFormat:LOC(@"VERSION"), @(OS_STRINGIFY(TWEAK_VERSION))] | ||||||
|         titleDescription:LOC(@"VERSION_CHECK") |         titleDescription:LOC(@"VERSION_CHECK") | ||||||
| @@ -237,6 +232,179 @@ static const NSInteger YTLiteSection = 789; | |||||||
|     [sectionItems addObject:appIcon]; |     [sectionItems addObject:appIcon]; | ||||||
| */ | */ | ||||||
|  |  | ||||||
|  | # pragma mark - Player Gestures - @bhackel | ||||||
|  |     // Helper to get the selected gesture mode | ||||||
|  |     static NSString* (^sectionGestureSelectedModeToString)(GestureMode) = ^(GestureMode sectionIndex) { | ||||||
|  |         switch (sectionIndex) { | ||||||
|  |             case GestureModeVolume: | ||||||
|  |                 return LOC(@"VOLUME"); | ||||||
|  |             case GestureModeBrightness: | ||||||
|  |                 return LOC(@"BRIGHTNESS"); | ||||||
|  |             case GestureModeSeek: | ||||||
|  |                 return LOC(@"SEEK"); | ||||||
|  |             case GestureModeDisabled: | ||||||
|  |                 return LOC(@"DISABLED"); | ||||||
|  |             default: | ||||||
|  |                 return @"Invalid index - Report bug"; | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     // Helper to generate checkmark setting items for selecting gesture modes | ||||||
|  |     static YTSettingsSectionItem* (^gestureCheckmarkSettingItem)(NSInteger, NSString *) = ^(NSInteger idx, NSString *key) { | ||||||
|  |         return [YTSettingsSectionItemClass  | ||||||
|  |             checkmarkItemWithTitle:sectionGestureSelectedModeToString(idx) | ||||||
|  |             selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { | ||||||
|  |                 [[NSUserDefaults standardUserDefaults] setInteger:idx forKey:key]; | ||||||
|  |                 [settingsViewController reloadData]; | ||||||
|  |                 return YES; | ||||||
|  |             } | ||||||
|  |         ]; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     // Helper to generate a section item for selecting a gesture mode | ||||||
|  |     YTSettingsSectionItem *(^createSectionGestureSelector)(NSString *, NSString *) = ^YTSettingsSectionItem *(NSString *sectionLabel, NSString *sectionKey) { | ||||||
|  |         return [YTSettingsSectionItemClass itemWithTitle:LOC(sectionLabel) | ||||||
|  |             accessibilityIdentifier:nil | ||||||
|  |             detailTextBlock:^NSString *() { | ||||||
|  |                 return sectionGestureSelectedModeToString(GetSelection(sectionKey)); | ||||||
|  |             } | ||||||
|  |             selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { | ||||||
|  |                 NSArray <YTSettingsSectionItem *> *rows = @[ | ||||||
|  |                     gestureCheckmarkSettingItem(0, sectionKey), // Volume                              | ||||||
|  |                     gestureCheckmarkSettingItem(1, sectionKey), // Brightness | ||||||
|  |                     gestureCheckmarkSettingItem(2, sectionKey), // Seek | ||||||
|  |                     gestureCheckmarkSettingItem(3, sectionKey)  // Disabled | ||||||
|  |                 ]; | ||||||
|  |                 // Present picker when selecting this settings item | ||||||
|  |                 YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc]  | ||||||
|  |                     initWithNavTitle:LOC(sectionLabel)  | ||||||
|  |                     pickerSectionTitle:nil  | ||||||
|  |                     rows:rows  | ||||||
|  |                     selectedItemIndex:GetSelection(sectionKey)  | ||||||
|  |                     parentResponder:[self parentResponder] | ||||||
|  |                 ]; | ||||||
|  |                 [settingsViewController pushViewController:picker]; | ||||||
|  |                 return YES; | ||||||
|  |             } | ||||||
|  |         ]; | ||||||
|  |     }; | ||||||
|  |     // Configuration picker for deadzone to pick from 0 to 100 pixels with interval of 10 | ||||||
|  |     NSMutableArray<NSNumber *> *deadzoneValues = [NSMutableArray array]; | ||||||
|  |     for (CGFloat value = 0; value <= 100; value += 10) { | ||||||
|  |         [deadzoneValues addObject:@(value)]; | ||||||
|  |     } | ||||||
|  |     YTSettingsSectionItem *deadzonePicker = [YTSettingsSectionItemClass  | ||||||
|  |         itemWithTitle:LOC(@"DEADZONE")  | ||||||
|  |         titleDescription:LOC(@"DEADZONE_DESC") | ||||||
|  |         accessibilityIdentifier:nil  | ||||||
|  |         detailTextBlock:^NSString *() { | ||||||
|  |             return [NSString stringWithFormat:@"%ld px", (long)GetFloat(@"playerGesturesDeadzone")]; | ||||||
|  |         } | ||||||
|  |         selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { | ||||||
|  |             // Generate rows for deadzone picker using the predefined array | ||||||
|  |             NSMutableArray <YTSettingsSectionItem *> *deadzoneRows = [NSMutableArray array]; | ||||||
|  |             for (NSNumber *deadzoneValue in deadzoneValues) { | ||||||
|  |                 CGFloat deadzone = [deadzoneValue floatValue]; | ||||||
|  |                 [deadzoneRows addObject:[YTSettingsSectionItemClass  | ||||||
|  |                     checkmarkItemWithTitle:[NSString stringWithFormat:@"%ld px", (long)deadzone]  | ||||||
|  |                     selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { | ||||||
|  |                         [[NSUserDefaults standardUserDefaults] setFloat:deadzone forKey:@"playerGesturesDeadzone"]; | ||||||
|  |                         [settingsViewController reloadData]; | ||||||
|  |                         return YES; | ||||||
|  |                     } | ||||||
|  |                 ]]; | ||||||
|  |             } | ||||||
|  |             // Determine the index of the currently selected deadzone | ||||||
|  |             CGFloat currentDeadzone = GetFloat(@"playerGesturesDeadzone"); | ||||||
|  |             NSUInteger selectedIndex = [deadzoneValues indexOfObject:@(currentDeadzone)]; | ||||||
|  |             if (selectedIndex == NSNotFound) { | ||||||
|  |                 selectedIndex = 0; // Default to the first item if the current deadzone is not found | ||||||
|  |             } | ||||||
|  |             // Present deadzone picker when selecting this settings item | ||||||
|  |             YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc]  | ||||||
|  |                 initWithNavTitle:LOC(@"DEADZONE")  | ||||||
|  |                 pickerSectionTitle:nil  | ||||||
|  |                 rows:deadzoneRows  | ||||||
|  |                 selectedItemIndex:selectedIndex  | ||||||
|  |                 parentResponder:[self parentResponder] | ||||||
|  |             ]; | ||||||
|  |             [settingsViewController pushViewController:picker]; | ||||||
|  |             return YES; | ||||||
|  |         } | ||||||
|  |     ]; | ||||||
|  |  | ||||||
|  |     // Configuration picker for sensitivity to pick from 0.5 to 2.0 with interval of 0.1 | ||||||
|  |     NSMutableArray<NSNumber *> *sensitivityValues = [NSMutableArray array]; | ||||||
|  |     for (CGFloat value = 0.5; value <= 2.0; value += 0.1) { | ||||||
|  |         [sensitivityValues addObject:@(value)]; | ||||||
|  |     } | ||||||
|  |     YTSettingsSectionItem *sensitivityPicker = [YTSettingsSectionItemClass  | ||||||
|  |         itemWithTitle:LOC(@"SENSITIVITY")  | ||||||
|  |         titleDescription:LOC(@"SENSITIVITY_DESC") | ||||||
|  |         accessibilityIdentifier:nil  | ||||||
|  |         detailTextBlock:^NSString *() { | ||||||
|  |             return [NSString stringWithFormat:@"%.1f", GetFloat(@"playerGesturesSensitivity")]; | ||||||
|  |         } | ||||||
|  |         selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { | ||||||
|  |             // Generate rows for sensitivity picker using the predefined array | ||||||
|  |             NSMutableArray <YTSettingsSectionItem *> *sensitivityRows = [NSMutableArray array]; | ||||||
|  |             for (NSNumber *sensitivityValue in sensitivityValues) { | ||||||
|  |                 CGFloat sensitivity = [sensitivityValue floatValue]; | ||||||
|  |                 [sensitivityRows addObject:[YTSettingsSectionItemClass  | ||||||
|  |                     checkmarkItemWithTitle:[NSString stringWithFormat:@"%.1f", sensitivity]  | ||||||
|  |                     selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { | ||||||
|  |                         [[NSUserDefaults standardUserDefaults] setFloat:sensitivity forKey:@"playerGesturesSensitivity"]; | ||||||
|  |                         [settingsViewController reloadData]; | ||||||
|  |                         return YES; | ||||||
|  |                     } | ||||||
|  |                 ]]; | ||||||
|  |             } | ||||||
|  |             // Determine the index of the currently selected sensitivity | ||||||
|  |             CGFloat currentSensitivity = GetFloat(@"playerGesturesSensitivity"); | ||||||
|  |             NSUInteger selectedIndex = [sensitivityValues indexOfObject:@(currentSensitivity)]; | ||||||
|  |             if (selectedIndex == NSNotFound) { | ||||||
|  |                 selectedIndex = 0; // Default to the first item if the current sensitivity is not found | ||||||
|  |             } | ||||||
|  |             // Present sensitivity picker | ||||||
|  |             YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc]  | ||||||
|  |                 initWithNavTitle:LOC(@"SENSITIVITY")  | ||||||
|  |                 pickerSectionTitle:nil  | ||||||
|  |                 rows:sensitivityRows  | ||||||
|  |                 selectedItemIndex:selectedIndex  | ||||||
|  |                 parentResponder:[self parentResponder] | ||||||
|  |             ]; | ||||||
|  |             [settingsViewController pushViewController:picker]; | ||||||
|  |             return YES; | ||||||
|  |         } | ||||||
|  |     ]; | ||||||
|  |  | ||||||
|  |     // Create and add items to the high level gestures menu | ||||||
|  |     YTSettingsSectionItem *playerGesturesGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"PLAYER_GESTURES_TITLE") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { | ||||||
|  |         NSArray <YTSettingsSectionItem *> *rows = @[ | ||||||
|  |             // Description header item | ||||||
|  |             [YTSettingsSectionItemClass  | ||||||
|  |                 itemWithTitle:nil | ||||||
|  |                 titleDescription:LOC(@"PLAYER_GESTURES_DESC") | ||||||
|  |                 accessibilityIdentifier:nil | ||||||
|  |                 detailTextBlock:nil | ||||||
|  |                 selectBlock:nil | ||||||
|  |             ], | ||||||
|  |             // Toggle for enabling gestures | ||||||
|  |             BASIC_SWITCH(LOC(@"PLAYER_GESTURES_TOGGLE"), nil, @"playerGestures_enabled"), | ||||||
|  |             // Pickers for each gesture section | ||||||
|  |             createSectionGestureSelector(@"TOP_SECTION",    @"playerGestureTopSelection"), | ||||||
|  |             createSectionGestureSelector(@"MIDDLE_SECTION", @"playerGestureMiddleSelection"), | ||||||
|  |             createSectionGestureSelector(@"BOTTOM_SECTION", @"playerGestureBottomSelection"), | ||||||
|  |             // Pickers for configuration settings | ||||||
|  |             deadzonePicker, | ||||||
|  |             sensitivityPicker | ||||||
|  |         ];         | ||||||
|  |         YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Player Gestures (Beta)") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; | ||||||
|  |         [settingsViewController pushViewController:picker]; | ||||||
|  |         return YES; | ||||||
|  |     }]; | ||||||
|  |     [sectionItems addObject:playerGesturesGroup]; | ||||||
|  |  | ||||||
| # pragma mark - Video Controls Overlay Options | # pragma mark - Video Controls Overlay Options | ||||||
|     YTSettingsSectionItem *videoControlOverlayGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { |     YTSettingsSectionItem *videoControlOverlayGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { | ||||||
|         NSArray <YTSettingsSectionItem *> *rows = @[ |         NSArray <YTSettingsSectionItem *> *rows = @[ | ||||||
|   | |||||||
| @@ -1,8 +1,5 @@ | |||||||
| #import "../YTLitePlus.h" | #import "../YTLitePlus.h" | ||||||
|  |  | ||||||
| static BOOL IsEnabled(NSString *key) { |  | ||||||
|     return [[NSUserDefaults standardUserDefaults] boolForKey:key]; |  | ||||||
| } |  | ||||||
| static BOOL isDarkMode() { | static BOOL isDarkMode() { | ||||||
|     return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1); |     return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,9 +1,6 @@ | |||||||
| #import "../YTLitePlus.h" | #import "../YTLitePlus.h" | ||||||
|  |  | ||||||
| // |  | ||||||
| static BOOL IsEnabled(NSString *key) { |  | ||||||
|     return [[NSUserDefaults standardUserDefaults] boolForKey:key]; |  | ||||||
| } |  | ||||||
| static int appVersionSpoofer() { | static int appVersionSpoofer() { | ||||||
|     return [[NSUserDefaults standardUserDefaults] integerForKey:@"versionSpoofer"]; |     return [[NSUserDefaults standardUserDefaults] integerForKey:@"versionSpoofer"]; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								Tweaks/YouLoop
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								Tweaks/YouLoop
									
									
									
									
									
										Submodule
									
								
							 Submodule Tweaks/YouLoop added at 5a424d7531
									
								
							
							
								
								
									
										40
									
								
								YTLitePlus.h
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								YTLitePlus.h
									
									
									
									
									
								
							| @@ -6,10 +6,11 @@ | |||||||
| #import <sys/utsname.h> | #import <sys/utsname.h> | ||||||
| #import <substrate.h> | #import <substrate.h> | ||||||
| #import <rootless.h> | #import <rootless.h> | ||||||
|  | #import <MediaPlayer/MediaPlayer.h> | ||||||
|  | #import <AVFoundation/AVFoundation.h> | ||||||
| #import <AVKit/AVKit.h>         // For AVPlayer and AVPlayerViewController | #import <AVKit/AVKit.h>         // For AVPlayer and AVPlayerViewController | ||||||
| #import <MobileCoreServices/MobileCoreServices.h> // For kUTTypeMovie and kUTTypeVideo | #import <MobileCoreServices/MobileCoreServices.h> // For kUTTypeMovie and kUTTypeVideo | ||||||
|  |  | ||||||
|  |  | ||||||
| #import "Tweaks/FLEX/FLEX.h" | #import "Tweaks/FLEX/FLEX.h" | ||||||
| #import "Tweaks/YouTubeHeader/YTAppDelegate.h" | #import "Tweaks/YouTubeHeader/YTAppDelegate.h" | ||||||
| #import "Tweaks/YouTubeHeader/YTPlayerViewController.h" | #import "Tweaks/YouTubeHeader/YTPlayerViewController.h" | ||||||
| @@ -43,6 +44,8 @@ | |||||||
| #import "Tweaks/YouTubeHeader/YTPlayerBarController.h" | #import "Tweaks/YouTubeHeader/YTPlayerBarController.h" | ||||||
| #import "Tweaks/YouTubeHeader/YTResponder.h" | #import "Tweaks/YouTubeHeader/YTResponder.h" | ||||||
| #import "Tweaks/YouTubeHeader/YTMainAppControlsOverlayView.h" | #import "Tweaks/YouTubeHeader/YTMainAppControlsOverlayView.h" | ||||||
|  | #import "Tweaks/YouTubeHeader/YTMultiSizeViewController.h" | ||||||
|  | #import "Tweaks/YouTubeHeader/YTWatchLayerViewController.h" | ||||||
|  |  | ||||||
| #define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil] | #define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil] | ||||||
| #define YT_BUNDLE_ID @"com.google.ios.youtube" | #define YT_BUNDLE_ID @"com.google.ios.youtube" | ||||||
| @@ -51,6 +54,30 @@ | |||||||
| #define IS_ENABLED(k) [[NSUserDefaults standardUserDefaults] boolForKey:k] | #define IS_ENABLED(k) [[NSUserDefaults standardUserDefaults] boolForKey:k] | ||||||
| #define APP_THEME_IDX [[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] | #define APP_THEME_IDX [[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] | ||||||
|  |  | ||||||
|  | // Avoid issues with multiple includes of this file | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | // Helper methods for key retrieval | ||||||
|  | #define IsEnabled(key) [[NSUserDefaults standardUserDefaults] boolForKey:key] | ||||||
|  | #define GetSelection(key) [[NSUserDefaults standardUserDefaults] integerForKey:key] | ||||||
|  | #define GetFloat(key) [[NSUserDefaults standardUserDefaults] floatForKey:key] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Player Gesture selected mode enum | ||||||
|  | typedef NS_ENUM(NSUInteger, GestureMode) { | ||||||
|  |     GestureModeVolume, | ||||||
|  |     GestureModeBrightness, | ||||||
|  |     GestureModeSeek, | ||||||
|  |     GestureModeDisabled | ||||||
|  | }; | ||||||
|  | // Gesture Section Enum | ||||||
|  | typedef NS_ENUM(NSUInteger, GestureSection) { | ||||||
|  |     GestureSectionTop, | ||||||
|  |     GestureSectionMiddle, | ||||||
|  |     GestureSectionBottom, | ||||||
|  |     GestureSectionInvalid | ||||||
|  | }; | ||||||
|  |  | ||||||
| // YTSpeed | // YTSpeed | ||||||
| @interface YTVarispeedSwitchControllerOption : NSObject | @interface YTVarispeedSwitchControllerOption : NSObject | ||||||
| - (id)initWithTitle:(id)title rate:(float)rate; | - (id)initWithTitle:(id)title rate:(float)rate; | ||||||
| @@ -125,6 +152,17 @@ | |||||||
| @property id <YTResponder> parentResponder; | @property id <YTResponder> parentResponder; | ||||||
| @end | @end | ||||||
|  |  | ||||||
|  | // Player Gestures - @bhackel | ||||||
|  | @interface YTPlayerViewController (YTLitePlus) <UIGestureRecognizerDelegate> | ||||||
|  | @property (nonatomic, retain) UIPanGestureRecognizer *YTLitePlusPanGesture; | ||||||
|  | - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; | ||||||
|  | @end | ||||||
|  | @interface YTWatchFullscreenViewController : YTMultiSizeViewController | ||||||
|  | @end | ||||||
|  | @interface MPVolumeController : NSObject | ||||||
|  | @property (nonatomic, assign, readwrite) float volumeValue; | ||||||
|  | @end | ||||||
|  |  | ||||||
| // Hide Collapse Button - @arichornlover | // Hide Collapse Button - @arichornlover | ||||||
| @interface YTMainAppControlsOverlayView (YTLitePlus) | @interface YTMainAppControlsOverlayView (YTLitePlus) | ||||||
| @property (nonatomic, assign, readwrite) YTQTMButton *watchCollapseButton; | @property (nonatomic, assign, readwrite) YTQTMButton *watchCollapseButton; | ||||||
|   | |||||||
							
								
								
									
										232
									
								
								YTLitePlus.xm
									
									
									
									
									
								
							
							
						
						
									
										232
									
								
								YTLitePlus.xm
									
									
									
									
									
								
							| @@ -33,11 +33,6 @@ static NSString *accessGroupID() { | |||||||
|     return accessGroup; |     return accessGroup; | ||||||
| } | } | ||||||
|  |  | ||||||
| // |  | ||||||
| static BOOL IsEnabled(NSString *key) { |  | ||||||
|     return [[NSUserDefaults standardUserDefaults] boolForKey:key]; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| # pragma mark - Tweaks | # pragma mark - Tweaks | ||||||
|  |  | ||||||
| // Activate FLEX | // Activate FLEX | ||||||
| @@ -645,6 +640,213 @@ BOOL isTabSelected = NO; | |||||||
| } | } | ||||||
| %end | %end | ||||||
|  |  | ||||||
|  | // Gestures - @bhackel | ||||||
|  | %group playerGestures | ||||||
|  | %hook YTWatchLayerViewController | ||||||
|  | // invoked when the player view controller is either created or destroyed | ||||||
|  | - (void)watchController:(YTWatchController *)watchController didSetPlayerViewController:(YTPlayerViewController *)playerViewController { | ||||||
|  |     if (playerViewController) { | ||||||
|  |         // check to see if the pan gesture is already created | ||||||
|  |         if (!playerViewController.YTLitePlusPanGesture) { | ||||||
|  |             playerViewController.YTLitePlusPanGesture = [[UIPanGestureRecognizer alloc] initWithTarget:playerViewController | ||||||
|  |                                                                                                action:@selector(YTLitePlusHandlePanGesture:)]; | ||||||
|  |             playerViewController.YTLitePlusPanGesture.delegate = playerViewController; | ||||||
|  |             [playerViewController.playerView addGestureRecognizer:playerViewController.YTLitePlusPanGesture]; | ||||||
|  |         }         | ||||||
|  |     } | ||||||
|  |     %orig; | ||||||
|  | } | ||||||
|  | %end | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %hook YTPlayerViewController | ||||||
|  | // the pan gesture that will be created and added to the player view | ||||||
|  | %property (nonatomic, retain) UIPanGestureRecognizer *YTLitePlusPanGesture; | ||||||
|  | %new | ||||||
|  | - (void)YTLitePlusHandlePanGesture:(UIPanGestureRecognizer *)panGestureRecognizer { | ||||||
|  |     // Haptic feedback generator | ||||||
|  |     static UIImpactFeedbackGenerator *feedbackGenerator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium]; | ||||||
|  |     // Variables for storing initial values to be adjusted | ||||||
|  |     static float initialVolume; | ||||||
|  |     static float initialBrightness; | ||||||
|  |     static CGFloat currentTime; | ||||||
|  |     // Flag to determine if the pan gesture is valid | ||||||
|  |     static BOOL isValidHorizontalPan = NO; | ||||||
|  |     // Variable to store the section of the screen the gesture is in | ||||||
|  |     static GestureSection gestureSection = GestureSectionInvalid; | ||||||
|  |     // Variable to track the start location of the whole pan gesture | ||||||
|  |     static CGPoint startLocation; | ||||||
|  |     // Variable to track the X translation when exiting the deadzone | ||||||
|  |     static CGFloat deadzoneStartingXTranslation; | ||||||
|  |     // Constant for the deadzone radius that can be changed in the settings | ||||||
|  |     static CGFloat deadzoneRadius = (CGFloat)GetFloat(@"playerGesturesDeadzone"); | ||||||
|  |     // Constant for the sensitivity factor that can be changed in the settings | ||||||
|  |     static CGFloat sensitivityFactor = (CGFloat)GetFloat(@"playerGesturesSensitivity"); | ||||||
|  |  | ||||||
|  | /***** Helper functions *****/ | ||||||
|  |     // Helper function to adjust brightness | ||||||
|  |     void (^adjustBrightness)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialBrightness) { | ||||||
|  |         float newBrightness = initialBrightness + ((translationX / 1000.0) * sensitivityFactor); | ||||||
|  |         newBrightness = fmaxf(fminf(newBrightness, 1.0), 0.0); | ||||||
|  |         [[UIScreen mainScreen] setBrightness:newBrightness]; | ||||||
|  |     }; | ||||||
|  |     // Helper function to adjust volume | ||||||
|  |     void (^adjustVolume)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat initialVolume) { | ||||||
|  |         float newVolume = initialVolume + ((translationX / 1000.0) * sensitivityFactor); | ||||||
|  |         newVolume = fmaxf(fminf(newVolume, 1.0), 0.0); | ||||||
|  |         // https://stackoverflow.com/questions/50737943/how-to-change-volume-programmatically-on-ios-11-4 | ||||||
|  |         MPVolumeView *volumeView = [[MPVolumeView alloc] init]; | ||||||
|  |         UISlider *volumeViewSlider = nil; | ||||||
|  |         for (UIView *view in volumeView.subviews) { | ||||||
|  |             if ([view isKindOfClass:[UISlider class]]) { | ||||||
|  |                 volumeViewSlider = (UISlider *)view; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | ||||||
|  |             volumeViewSlider.value = newVolume; | ||||||
|  |         }); | ||||||
|  |     }; | ||||||
|  |     // Helper function to adjust seek time | ||||||
|  |     void (^adjustSeek)(CGFloat, CGFloat) = ^(CGFloat translationX, CGFloat currentTime) { | ||||||
|  |         // Calculate a seek fraction based on the horizontal translation | ||||||
|  |         CGFloat totalDuration = self.currentVideoTotalMediaTime; | ||||||
|  |         CGFloat viewWidth = self.view.bounds.size.width; | ||||||
|  |         CGFloat seekFraction = (translationX / viewWidth); | ||||||
|  |         // Seek to the new time based on the calculated offset | ||||||
|  |         CGFloat sensitivityFactor = 1; // Adjust this value to make seeking less sensitive | ||||||
|  |         seekFraction = sensitivityFactor * seekFraction; | ||||||
|  |         CGFloat seekTime = currentTime + totalDuration * seekFraction; | ||||||
|  |         [self seekToTime:seekTime]; | ||||||
|  |     }; | ||||||
|  |     // Helper function to run the selected gesture action | ||||||
|  |     void (^runSelectedGesture)(NSString*, CGFloat, CGFloat, CGFloat, CGFloat)  | ||||||
|  |             = ^(NSString *sectionKey, CGFloat translationX, CGFloat initialBrightness, CGFloat initialVolume, CGFloat currentTime) { | ||||||
|  |         // Determine the selected gesture mode using the section key | ||||||
|  |         GestureMode selectedGestureMode = (GestureMode)GetSelection(sectionKey); | ||||||
|  |         // Handle the gesture action based on the selected mode | ||||||
|  |         switch (selectedGestureMode) { | ||||||
|  |             case GestureModeVolume: | ||||||
|  |                 adjustVolume(translationX, initialVolume); | ||||||
|  |                 break; | ||||||
|  |             case GestureModeBrightness: | ||||||
|  |                 adjustBrightness(translationX, initialBrightness); | ||||||
|  |                 break; | ||||||
|  |             case GestureModeSeek: | ||||||
|  |                 adjustSeek(translationX, currentTime); | ||||||
|  |                 break; | ||||||
|  |             case GestureModeDisabled: | ||||||
|  |                 // Do nothing if the gesture is disabled | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 // Show an alert if the gesture mode is invalid | ||||||
|  |                 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Invalid Gesture Mode" message:@"Please report this bug." preferredStyle:UIAlertControllerStyleAlert]; | ||||||
|  |                 UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; | ||||||
|  |                 [alertController addAction:okAction]; | ||||||
|  |                 [self presentViewController:alertController animated:YES completion:nil]; | ||||||
|  |                 break; | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | /***** End of Helper functions *****/ | ||||||
|  |  | ||||||
|  |     // Handle gesture based on current gesture state | ||||||
|  |     if (panGestureRecognizer.state == UIGestureRecognizerStateBegan) { | ||||||
|  |         // Get the gesture's start position | ||||||
|  |         startLocation = [panGestureRecognizer locationInView:self.view]; | ||||||
|  |         CGFloat viewHeight = self.view.bounds.size.height; | ||||||
|  |          | ||||||
|  |         // Determine the section based on the start position | ||||||
|  |         // by dividing the view into thirds | ||||||
|  |         if (startLocation.y <= viewHeight / 3.0) { | ||||||
|  |             gestureSection = GestureSectionTop; | ||||||
|  |             // Cancel the gesture if the mode is disabled | ||||||
|  |             if (GetSelection(@"playerGestureTopSelection") == GestureModeDisabled) { | ||||||
|  |                 panGestureRecognizer.state = UIGestureRecognizerStateCancelled; | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } else if (startLocation.y <= 2 * viewHeight / 3.0) { | ||||||
|  |             gestureSection = GestureSectionMiddle; | ||||||
|  |             // Cancel the gesture if the mode is disabled | ||||||
|  |             if (GetSelection(@"playerGestureMiddleSelection") == GestureModeDisabled) { | ||||||
|  |                 panGestureRecognizer.state = UIGestureRecognizerStateCancelled; | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } else if (startLocation.y <= viewHeight) { | ||||||
|  |             gestureSection = GestureSectionBottom; | ||||||
|  |             // Cancel the gesture if the mode is disabled | ||||||
|  |             if (GetSelection(@"playerGestureBottomSelection") == GestureModeDisabled) { | ||||||
|  |                 panGestureRecognizer.state = UIGestureRecognizerStateCancelled; | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             gestureSection = GestureSectionInvalid; | ||||||
|  |         } | ||||||
|  |         // Deactive the activity flag | ||||||
|  |         isValidHorizontalPan = NO; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (panGestureRecognizer.state == UIGestureRecognizerStateChanged) { | ||||||
|  |         // Determine if the gesture is predominantly horizontal | ||||||
|  |         CGPoint translation = [panGestureRecognizer translationInView:self.view]; | ||||||
|  |         if (!isValidHorizontalPan) { | ||||||
|  |             if (fabs(translation.x) > fabs(translation.y)) { | ||||||
|  |                 // Check if the touch has moved outside the deadzone | ||||||
|  |                 CGFloat distanceFromStart = hypot(translation.x, translation.y); | ||||||
|  |                 if (distanceFromStart < deadzoneRadius) { | ||||||
|  |                     // If within the deadzone, don't activate the pan gesture | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 // If outside the deadzone, activate the pan gesture and store the initial values | ||||||
|  |                 isValidHorizontalPan = YES; | ||||||
|  |                 deadzoneStartingXTranslation = translation.x; | ||||||
|  |                 initialBrightness = [UIScreen mainScreen].brightness; | ||||||
|  |                 initialVolume = [[AVAudioSession sharedInstance] outputVolume]; | ||||||
|  |                 currentTime = self.currentVideoMediaTime; | ||||||
|  |                 // Provide haptic feedback to indicate a gesture start | ||||||
|  |                 [feedbackGenerator prepare]; | ||||||
|  |                 [feedbackGenerator impactOccurred]; | ||||||
|  |             } else { | ||||||
|  |                 // Cancel the gesture if the translation is not horizontal | ||||||
|  |                 panGestureRecognizer.state = UIGestureRecognizerStateCancelled; | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Handle the gesture based on the identified section | ||||||
|  |         if (isValidHorizontalPan) { | ||||||
|  |             // Adjust the X translation based on the value hit after | ||||||
|  |             // exiting the deadzone | ||||||
|  |             CGFloat adjustedTranslationX = translation.x - deadzoneStartingXTranslation; | ||||||
|  |             // Pass the adjusted translation to the selected gesture | ||||||
|  |             if (gestureSection == GestureSectionTop) { | ||||||
|  |                 runSelectedGesture(@"playerGestureTopSelection", adjustedTranslationX, initialBrightness, initialVolume, currentTime); | ||||||
|  |             } else if (gestureSection == GestureSectionMiddle) { | ||||||
|  |                 runSelectedGesture(@"playerGestureMiddleSelection", adjustedTranslationX, initialBrightness, initialVolume, currentTime); | ||||||
|  |             } else if (gestureSection == GestureSectionBottom) { | ||||||
|  |                 runSelectedGesture(@"playerGestureBottomSelection", adjustedTranslationX, initialBrightness, initialVolume, currentTime); | ||||||
|  |             } else { | ||||||
|  |                 // If the section is invalid, cancel the gesture | ||||||
|  |                 panGestureRecognizer.state = UIGestureRecognizerStateCancelled; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     if (panGestureRecognizer.state == UIGestureRecognizerStateEnded) { | ||||||
|  |         if (isValidHorizontalPan) { | ||||||
|  |             // Provide haptic feedback upon successful gesture recognition | ||||||
|  |             [feedbackGenerator prepare]; | ||||||
|  |             [feedbackGenerator impactOccurred]; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  | // allow the pan gesture to be recognized simultaneously with other gestures | ||||||
|  | %new | ||||||
|  | - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { | ||||||
|  |     return YES; | ||||||
|  | } | ||||||
|  | %end | ||||||
|  | %end | ||||||
|  |  | ||||||
| /* | /* | ||||||
| // BigYTMiniPlayer: https://github.com/Galactic-Dev/BigYTMiniPlayer | // BigYTMiniPlayer: https://github.com/Galactic-Dev/BigYTMiniPlayer | ||||||
| %group Main | %group Main | ||||||
| @@ -874,6 +1076,9 @@ BOOL isTabSelected = NO; | |||||||
|     if (IsEnabled(@"disableEngagementOverlay_enabled")) { |     if (IsEnabled(@"disableEngagementOverlay_enabled")) { | ||||||
|         %init(gDisableEngagementOverlay); |         %init(gDisableEngagementOverlay); | ||||||
|     } |     } | ||||||
|  |     if (IsEnabled(@"playerGestures_enabled")) { | ||||||
|  |         %init(playerGestures); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // Change the default value of some options |     // Change the default value of some options | ||||||
|     NSArray *allKeys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]; |     NSArray *allKeys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]; | ||||||
| @@ -889,4 +1094,21 @@ BOOL isTabSelected = NO; | |||||||
|     if (![allKeys containsObject:@"fixCasting_enabled"]) {  |     if (![allKeys containsObject:@"fixCasting_enabled"]) {  | ||||||
|        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"fixCasting_enabled"];  |        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"fixCasting_enabled"];  | ||||||
|     } |     } | ||||||
|  |     // Default gestures as volume, brightness, seek | ||||||
|  |     if (![allKeys containsObject:@"playerGestureTopSelection"]) {  | ||||||
|  |        [[NSUserDefaults standardUserDefaults] setInteger:GestureModeVolume forKey:@"playerGestureTopSelection"];  | ||||||
|  |     } | ||||||
|  |     if (![allKeys containsObject:@"playerGestureMiddleSelection"]) {  | ||||||
|  |        [[NSUserDefaults standardUserDefaults] setInteger:GestureModeBrightness forKey:@"playerGestureMiddleSelection"];  | ||||||
|  |     } | ||||||
|  |     if (![allKeys containsObject:@"playerGestureBottomSelection"]) {  | ||||||
|  |        [[NSUserDefaults standardUserDefaults] setInteger:GestureModeSeek forKey:@"playerGestureBottomSelection"];  | ||||||
|  |     } | ||||||
|  |     // Default configuration options for gestures | ||||||
|  |     if (![allKeys containsObject:@"playerGesturesDeadzone"]) {  | ||||||
|  |        [[NSUserDefaults standardUserDefaults] setFloat:20.0 forKey:@"playerGesturesDeadzone"];  | ||||||
|  |     } | ||||||
|  |     if (![allKeys containsObject:@"playerGesturesSensitivity"]) {  | ||||||
|  |        [[NSUserDefaults standardUserDefaults] setFloat:1.0 forKey:@"playerGesturesSensitivity"];  | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "خيارات تراكب ضوابط الفيديو"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "خيارات تراكب ضوابط الفيديو"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Опции за контрол на видеото"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Опции за контрол на видеото"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Overlay-Optionen für Videosteuerungen"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Overlay-Optionen für Videosteuerungen"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opciones de superposición de controles de vídeo"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opciones de superposición de controles de vídeo"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Options de l'overlay des contrôles vidéo"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Options de l'overlay des contrôles vidéo"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "動画コントロールオーバーレイの設定"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "動画コントロールオーバーレイの設定"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opções de Sobreposição de Controles de Vídeo"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opções de Sobreposição de Controles de Vídeo"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opțiuni Overlay Controale Video"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Opțiuni Overlay Controale Video"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -31,6 +31,22 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Controls Overlay Options"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Kontrol Seç."; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "Video Kontrol Seç."; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,6 +16,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video player options | // Video player options | ||||||
| "VIDEO_PLAYER_OPTIONS" = "Tùy chọn trình phát video"; | "VIDEO_PLAYER_OPTIONS" = "Tùy chọn trình phát video"; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -17,6 +17,22 @@ | |||||||
| "VIDEO_PLAYER" = "Video Player (Beta)"; | "VIDEO_PLAYER" = "Video Player (Beta)"; | ||||||
| "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | "VIDEO_PLAYER_DESC" = "Open a downloaded video in the Apple player"; | ||||||
|  |  | ||||||
|  | // Player Gestures | ||||||
|  | "PLAYER_GESTURES_TOGGLE" = "Enable Player Gestures"; | ||||||
|  | "VOLUME" = "Volume"; | ||||||
|  | "BRIGHTNESS" = "Brightness"; | ||||||
|  | "SEEK" = "Seek"; | ||||||
|  | "DISABLED" = "Disabled"; | ||||||
|  | "DEADZONE" = "Deadzone"; | ||||||
|  | "DEADZONE_DESC" = "Minimum distance to move before a gesture is recognized"; | ||||||
|  | "SENSITIVITY" = "Sensitivity"; | ||||||
|  | "SENSITIVITY_DESC" = "Multiplier on volume and brightness gestures"; | ||||||
|  | "PLAYER_GESTURES_TITLE" = "Player Gestures"; | ||||||
|  | "PLAYER_GESTURES_DESC" = "Configure horizontal pan gestures for the player"; | ||||||
|  | "TOP_SECTION" = "Top Section"; | ||||||
|  | "MIDDLE_SECTION" = "Middle Section"; | ||||||
|  | "BOTTOM_SECTION" = "Bottom Section"; | ||||||
|  |  | ||||||
| // Video controls overlay options | // Video controls overlay options | ||||||
| "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "影片區覆蓋按鈕設定"; | "VIDEO_CONTROLS_OVERLAY_OPTIONS" = "影片區覆蓋按鈕設定"; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Bryce Hackel
					Bryce Hackel