#define kBundlePath @"/Library/Application Support/AVLockBundle.bundle" @interface SBOrientationLockManager +(SBOrientationLockManager *)sharedInstance; -(bool)isUserLocked; -(void)lock; -(void)unlock; -(void)myIsUserLocked; @end @interface AVTransportControlsView : UIView -(void)deviceOrientationDidChange; //@property (assign, nonatomic) AVButton *skipBackButton; @end 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 -(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; 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; 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{ CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("avlock.toggle"), (void*)myObserver, NULL, true); } %end