diff --git a/AVLock.plist b/AVLock.plist index ad30a27..0067746 100644 --- a/AVLock.plist +++ b/AVLock.plist @@ -1 +1 @@ -{ Filter = { Bundles = ( "com.apple.AVKit", "com.apple.springboard" ); }; } +{ Filter = { Bundles = ( "com.apple.springboard", "com.apple.AVKit" ); }; } diff --git a/Makefile b/Makefile index 02fe8b5..83e33cc 100644 --- a/Makefile +++ b/Makefile @@ -5,12 +5,13 @@ include $(THEOS)/makefiles/common.mk TWEAK_NAME = AVLock AVLock_FILES = Tweak.xm AVLock_FRAMEWORKS = UIKit +AVLock_PRIVATE_FRAMEWORKS = CoreTelephony AudioToolbox include $(THEOS_MAKE_PATH)/tweak.mk BUNDLE_NAME = AVLockBundle -AVLockBundle_INSTALL_PATH = /Library/MobileSubstrate/DynamicLibraries +AVLockBundle_INSTALL_PATH = /Library/Application Support include $(THEOS)/makefiles/bundle.mk after-install:: diff --git a/Resources/Locked@3x.png b/Resources/Locked@3x.png new file mode 100644 index 0000000..ee724e7 Binary files /dev/null and b/Resources/Locked@3x.png differ diff --git a/Resources/Unlocked@3x.png b/Resources/Unlocked@3x.png new file mode 100644 index 0000000..ee489e7 Binary files /dev/null and b/Resources/Unlocked@3x.png differ diff --git a/Tweak.xm b/Tweak.xm index ec720b1..d056226 100644 --- a/Tweak.xm +++ b/Tweak.xm @@ -1,4 +1,4 @@ -#define kBundlePath @"/Library/MobileSubstrate/DynamicLibraries/AVLockBundle.bundle" +#define kBundlePath @"/Library/Application Support/AVLockBundle.bundle" @interface SBOrientationLockManager @@ -6,49 +6,151 @@ -(bool)isUserLocked; -(void)lock; -(void)unlock; +-(void)myIsUserLocked; @end -@interface AVTransportControlsView --(void)addSubview:(id)arg1; -@property CGRect frame; + + +@interface AVTransportControlsView : UIView +-(void)deviceOrientationDidChange; +//@property (assign, nonatomic) AVButton *skipBackButton; @end -static bool firstrun = true; +extern "C" CFNotificationCenterRef CFNotificationCenterGetDistributedCenter(void); + +static UIButton *button = nil; +static NSString *myObserver=@"anObserver"; +static void toggle(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo){ + + if([[%c(SBOrientationLockManager) sharedInstance] isUserLocked]){ + [[%c(SBOrientationLockManager) sharedInstance] unlock]; + }else{ + [[%c(SBOrientationLockManager) sharedInstance] lock]; + } +} +static void lockButton(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo){ + NSBundle *bundle = [[[NSBundle alloc] initWithPath:kBundlePath] autorelease]; + NSString *imagePath = [bundle pathForResource:@"Locked@3x" ofType:@"png"]; + UIImage *img = [UIImage imageWithContentsOfFile:imagePath]; + [button setImage:img forState:UIControlStateNormal]; + [button setImage:img forState:UIControlStateHighlighted]; + [button setImage:img forState:UIControlStateSelected]; + +} +static void unlockButton(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo){ + NSBundle *bundle = [[[NSBundle alloc] initWithPath:kBundlePath] autorelease]; + NSString *imagePath = [bundle pathForResource:@"Unlocked@3x" ofType:@"png"]; + UIImage *img = [UIImage imageWithContentsOfFile:imagePath]; + [button setImage:img forState:UIControlStateNormal]; + [button setImage:img forState:UIControlStateHighlighted]; + [button setImage:img forState:UIControlStateSelected]; + +} +static void firstUpdate(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo){ + [[%c(SBOrientationLockManager) sharedInstance] myIsUserLocked]; + +} + + +%hook SBOrientationLockManager +-(SBOrientationLockManager*)init{ + self = %orig; +CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), + (void*)myObserver, + toggle, + CFSTR("avlock.toggle"), + NULL, + CFNotificationSuspensionBehaviorDeliverImmediately); +CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), + (void*)myObserver, + firstUpdate, + CFSTR("avlock.firstUpdate"), + NULL, + CFNotificationSuspensionBehaviorDeliverImmediately); + + return self; +} +%new +-(void)myIsUserLocked{ + bool locked = [self isUserLocked]; + if(locked){ + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("avlock.lockButton"), (void*)myObserver, NULL, true); + }else{ + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("avlock.unlockButton"), (void*)myObserver, NULL, true); + } +} +-(void)unlock{ + %orig; + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("avlock.unlockButton"), (void*)myObserver, NULL, true); +} +-(void)lock{ + %orig; + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("avlock.lockButton"), (void*)myObserver, NULL, true); +} + +%end + + + %hook AVTransportControlsView --(void)layoutSubviews{ -%orig; -if(firstrun){ - UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; - [button addTarget:self action:@selector(orientationButtonPressed) - forControlEvents:UIControlEventTouchUpInside]; - - NSBundle *bundle = [[NSBundle alloc] initWithPath:kBundlePath]; - NSString *imagePath = [bundle pathForResource:@"Test" ofType:@"png"]; - UIImage *img = [UIImage imageWithContentsOfFile:imagePath]; +-(AVTransportControlsView *)initWithFrame:(CGRect)frame{ + AVTransportControlsView *origself = %orig(frame); + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), + (void*)myObserver, + lockButton, + CFSTR("avlock.lockButton"), + NULL, + CFNotificationSuspensionBehaviorDeliverImmediately); + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), + (void*)myObserver, + unlockButton, + CFSTR("avlock.unlockButton"), + NULL, + CFNotificationSuspensionBehaviorDeliverImmediately); + button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button addTarget:self action:@selector(orientationButtonPressed) forControlEvents:UIControlEventTouchUpInside]; + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("avlock.firstUpdate"), (void*)myObserver, NULL, true); + button.contentMode = UIViewContentModeScaleAspectFit; - [button setImage:img forState:UIControlStateNormal]; - [button setImage:img forState:UIControlStateHighlighted]; - [button setImage:img forState:UIControlStateSelected]; - button.contentMode = UIViewContentModeScaleToFill; - button.frame = CGRectMake(0, 0, img.size.width, img.size.height); - [self addSubview:button]; - firstrun = false; -} + UIInterfaceOrientation orientation =[UIApplication sharedApplication].statusBarOrientation; + if (orientation == UIInterfaceOrientationLandscapeRight || orientation == UIInterfaceOrientationLandscapeLeft){ + button.frame = CGRectMake(6.5, -40, 46, 46); + } + else if(orientation == UIInterfaceOrientationPortrait){ + button.frame = CGRectMake(([UIScreen mainScreen].bounds.size.width / 2) - 142.5, 43, 46, 46); + } + button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10); + + [self addSubview:button]; + [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil]; + + return origself; } + + -(void)dealloc{ -%orig; -firstrun = true; + %orig; + CFNotificationCenterRemoveObserver ( CFNotificationCenterGetDarwinNotifyCenter(), (void*)myObserver, NULL, NULL); +} + +%new +-(void)deviceOrientationDidChange{ + UIInterfaceOrientation orientation =[UIApplication sharedApplication].statusBarOrientation; + if (orientation == UIInterfaceOrientationLandscapeRight || orientation == UIInterfaceOrientationLandscapeLeft){ + button.frame = CGRectMake(6.5, -40, 46, 46); + } + else if(orientation == UIInterfaceOrientationPortrait){ + button.frame = CGRectMake((self.frame.size.width / 2) - 115.5, 43, 46, 46); + } } %new -(void)orientationButtonPressed{ - if([[%c(SBOrientationLockManager) sharedInstance] isUserLocked]){ -[[%c(SBOrientationLockManager) sharedInstance] unlock]; -}else{ -[[%c(SBOrientationLockManager) sharedInstance] lock]; -} + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("avlock.toggle"), (void*)myObserver, NULL, true); + } -%end \ No newline at end of file +%end diff --git a/com.gilshahar7.avlock_0.0.1-56+debug_iphoneos-arm.deb b/com.gilshahar7.avlock_0.0.1-56+debug_iphoneos-arm.deb new file mode 100644 index 0000000..181a4b8 Binary files /dev/null and b/com.gilshahar7.avlock_0.0.1-56+debug_iphoneos-arm.deb differ