mirror of
				https://github.com/SoPat712/YTLitePlus.git
				synced 2025-10-30 20:34:03 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			195 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| //
 | |
| //  YTHFSPrefsManager.m
 | |
| //
 | |
| //  Created by Joshua Seltzer on 12/5/22.
 | |
| //  
 | |
| //
 | |
| 
 | |
| #import "YTHFSPrefsManager.h"
 | |
| #import <CoreHaptics/CoreHaptics.h>
 | |
| #import <sys/utsname.h>
 | |
| #import <rootless.h>
 | |
| 
 | |
| // define constants for the keys used to interact with the settings within user defaults
 | |
| #define kYTHFSHoldGestureEnabledKey     @"YTHFSHoldGestureEnabled"
 | |
| #define kYTHFSAutoApplyRateEnabledKey   @"YTHFSAutoApplyRateEnabled"
 | |
| #define kYTHFSTogglePlaybackRateKey     @"YTHFSTogglePlaybackRate"
 | |
| #define kYTHFSHoldDurationKey           @"YTHFSHoldDuration"
 | |
| #define kYTHFSHapticFeedbackEnabledKey  @"YTHFSHapticFeedbackEnabled"
 | |
| 
 | |
| // define some constants to define the default preference values
 | |
| #define kYTHFSDefaultHoldGestureEnabled     YES
 | |
| #define kYTHFSDefaultAutoApplyRateEnabled   NO
 | |
| #define kYTHFSDefaultTogglePlaybackRate     1.5
 | |
| #define kYTHFSDefaultHoldDuration           1.0
 | |
| 
 | |
| // create static variables that will be determined once
 | |
| static NSBundle *sYTHFSBundle;
 | |
| static BOOL sYTHFSSupportsHapticFeedback;
 | |
| static NSNumberFormatter *sYTHFSDecimalNumberFormatter;
 | |
| 
 | |
| @implementation YTHFSPrefsManager
 | |
| 
 | |
| // return a localized string with a given default value from the localization files in the tweak bundle
 | |
| + (NSString *)localizedStringForKey:(NSString *)key withDefaultValue:(NSString *)defaultValue
 | |
| {
 | |
|     NSBundle *tweakBundle = [YTHFSPrefsManager bundle];
 | |
|     if (tweakBundle != nil) {
 | |
|         return [tweakBundle localizedStringForKey:key value:defaultValue table:@"Localizable"];
 | |
|     } else {
 | |
|         return defaultValue;
 | |
|     }
 | |
| }
 | |
| 
 | |
| // intended to be invoked when the tweak is initialized to ensure all of the default values are available
 | |
| + (void)registerDefaults
 | |
| {
 | |
|     [[NSUserDefaults standardUserDefaults] registerDefaults:@{kYTHFSHoldGestureEnabledKey:[NSNumber numberWithBool:kYTHFSDefaultHoldGestureEnabled],
 | |
|                                                               kYTHFSAutoApplyRateEnabledKey:[NSNumber numberWithBool:kYTHFSDefaultAutoApplyRateEnabled],
 | |
|                                                               kYTHFSTogglePlaybackRateKey:[NSNumber numberWithFloat:kYTHFSDefaultTogglePlaybackRate],
 | |
|                                                               kYTHFSHoldDurationKey:[NSNumber numberWithFloat:kYTHFSDefaultHoldDuration],
 | |
|                                                               kYTHFSHapticFeedbackEnabledKey:[NSNumber numberWithBool:[YTHFSPrefsManager supportsHapticFeedback]]}];
 | |
| }
 | |
| 
 | |
| // returns whether or not the device supports haptic feedback
 | |
| + (BOOL)supportsHapticFeedback
 | |
| {
 | |
|     static dispatch_once_t pred;
 | |
|     dispatch_once(&pred, ^{
 | |
|         // determine if the current device is able to support haptic feedback
 | |
|         if (!CHHapticEngine.capabilitiesForHardware.supportsHaptics) {
 | |
|             // ensure we are not on an iPhone 7 family device, since those devices are not covered under
 | |
|             // the supportsHaptics call as of 2022-12-08 / iOS 16.1 SDK
 | |
|             struct utsname systemInfo;
 | |
|             uname(&systemInfo);
 | |
|             NSString *currentDeviceIdentifier = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
 | |
|             if ([currentDeviceIdentifier isEqualToString:@"iPhone9,1"] ||
 | |
|                 [currentDeviceIdentifier isEqualToString:@"iPhone9,3"] ||
 | |
|                 [currentDeviceIdentifier isEqualToString:@"iPhone9,2"] ||
 | |
|                 [currentDeviceIdentifier isEqualToString:@"iPhone9,4"]) {
 | |
|                 sYTHFSSupportsHapticFeedback = YES;
 | |
|             } else {
 | |
|                 sYTHFSSupportsHapticFeedback = NO;
 | |
|             }
 | |
|         } else {
 | |
|             sYTHFSSupportsHapticFeedback = YES;
 | |
|         }
 | |
|     });
 | |
|     return sYTHFSSupportsHapticFeedback;
 | |
| }
 | |
| 
 | |
| // return the value that corresponds to the given hold duration option
 | |
| + (CGFloat)holdDurationValueForOption:(YTHFSHoldDurationOption)holdDurationOption
 | |
| {
 | |
|     return (holdDurationOption + 1) * 0.25;
 | |
| }
 | |
| 
 | |
| // return the value that corresponds to the given playback rate option
 | |
| + (CGFloat)playbackRateValueForOption:(YTHFSPlaybackRateOption)playbackRateOption
 | |
| {
 | |
|     CGFloat playbackRateOffset = 0.25;
 | |
|     if (playbackRateOption > kYTHFSPlaybackRateOption075) {
 | |
|         playbackRateOffset = playbackRateOffset * 2;
 | |
|     }
 | |
|     return playbackRateOption * 0.25 + playbackRateOffset;
 | |
| }
 | |
| 
 | |
| // return the hold playback option for the given value
 | |
| + (YTHFSHoldDurationOption)holdDurationOptionForValue:(CGFloat)value
 | |
| {
 | |
|     return MAX(MIN((NSInteger)(value / 0.25) - 1, kYTHFSHoldDurationOption200), kYTHFSHoldDurationOption025);
 | |
| }
 | |
| 
 | |
| // return the playback rate option for the given value
 | |
| + (YTHFSPlaybackRateOption)playbackRateOptionForValue:(CGFloat)value
 | |
| {
 | |
|     NSInteger playbackRateOptionOffset = 1;
 | |
|     if (value > 1.00) {
 | |
|         ++playbackRateOptionOffset;
 | |
|     }
 | |
|     return MAX(MIN((NSInteger)(value / 0.25) - playbackRateOptionOffset, kYTHFSPlaybackRateOption200), kYTHFSPlaybackRateOption025);
 | |
| }
 | |
| 
 | |
| // return the appropriate string representation of the hold duration for the given value
 | |
| + (NSString *)holdDurationStringForValue:(CGFloat)value
 | |
| {
 | |
|     return [NSString stringWithFormat:[YTHFSPrefsManager localizedStringForKey:@"X_SECONDS" withDefaultValue:@"%@ seconds"], [[YTHFSPrefsManager decimalNumberFormatter] stringFromNumber:[NSNumber numberWithFloat:value]]];
 | |
| }
 | |
| 
 | |
| // return the appropriate string representation of the playback rate for the given value
 | |
| + (NSString *)playbackRateStringForValue:(CGFloat)value
 | |
| {
 | |
|     return [NSString stringWithFormat:@"%@x", [[YTHFSPrefsManager decimalNumberFormatter] stringFromNumber:[NSNumber numberWithFloat:value]]];
 | |
| }
 | |
| 
 | |
| // setters and getters for the tweak preferences
 | |
| + (BOOL)holdGestureEnabled
 | |
| {
 | |
|     return [[NSUserDefaults standardUserDefaults] boolForKey:kYTHFSHoldGestureEnabledKey];
 | |
| }
 | |
| + (void)setHoldGestureEnabled:(BOOL)enabled
 | |
| {
 | |
|     [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:kYTHFSHoldGestureEnabledKey];
 | |
| }
 | |
| + (BOOL)autoApplyRateEnabled
 | |
| {
 | |
|     return [[NSUserDefaults standardUserDefaults] boolForKey:kYTHFSAutoApplyRateEnabledKey];
 | |
| }
 | |
| + (void)setAutoApplyRateEnabled:(BOOL)enabled
 | |
| {
 | |
|     [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:kYTHFSAutoApplyRateEnabledKey];
 | |
| }
 | |
| + (CGFloat)togglePlaybackRate
 | |
| {
 | |
|     return [[NSUserDefaults standardUserDefaults] floatForKey:kYTHFSTogglePlaybackRateKey];
 | |
| }
 | |
| + (void)setTogglePlaybackRate:(CGFloat)playbackRate
 | |
| {
 | |
|     [[NSUserDefaults standardUserDefaults] setFloat:playbackRate forKey:kYTHFSTogglePlaybackRateKey];
 | |
| }
 | |
| + (CGFloat)holdDuration
 | |
| {
 | |
|     return [[NSUserDefaults standardUserDefaults] floatForKey:kYTHFSHoldDurationKey];
 | |
| }
 | |
| + (void)setHoldDuration:(CGFloat)holdDuration
 | |
| {
 | |
|     [[NSUserDefaults standardUserDefaults] setFloat:holdDuration forKey:kYTHFSHoldDurationKey];
 | |
| }
 | |
| + (BOOL)hapticFeedbackEnabled
 | |
| {
 | |
|     return [[NSUserDefaults standardUserDefaults] boolForKey:kYTHFSHapticFeedbackEnabledKey];
 | |
| }
 | |
| + (void)setHapticFeedbackEnabled:(BOOL)hapticFeedbackEnabled
 | |
| {
 | |
|     [[NSUserDefaults standardUserDefaults] setBool:hapticFeedbackEnabled forKey:kYTHFSHapticFeedbackEnabledKey];
 | |
| }
 | |
| 
 | |
| // return the bundle for the tweak which can be different depending on the jailbreak / installation method
 | |
| + (NSBundle *)bundle
 | |
| {
 | |
|     static dispatch_once_t pred;
 | |
|     dispatch_once(&pred, ^{
 | |
|         NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"YTHoldForSpeed" ofType:@"bundle"];
 | |
|         if (bundlePath) {
 | |
|             sYTHFSBundle = [NSBundle bundleWithPath:bundlePath];
 | |
|         } else {
 | |
|             sYTHFSBundle = [NSBundle bundleWithPath:ROOT_PATH_NS(@"/Library/Application Support/YTHoldForSpeed.bundle")];
 | |
|         }
 | |
|     });
 | |
|     return sYTHFSBundle;
 | |
| }
 | |
| 
 | |
| // return the number formatter that will be used to create strings for the playback rate and hold duration
 | |
| + (NSNumberFormatter *)decimalNumberFormatter
 | |
| {
 | |
|     static dispatch_once_t pred;
 | |
|     dispatch_once(&pred, ^{
 | |
|         sYTHFSDecimalNumberFormatter = [[NSNumberFormatter alloc] init];
 | |
|         [sYTHFSDecimalNumberFormatter setMinimumFractionDigits:1];
 | |
|         [sYTHFSDecimalNumberFormatter setMaximumFractionDigits:2];
 | |
|     });
 | |
|     return sYTHFSDecimalNumberFormatter;
 | |
| }
 | |
| 
 | |
| @end
 | 
