X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/864db79b71f7e38c80acd3bf341e0dc9cb1bc871..24fb80c19c6695f8a5f32d3492e30b07033ed8a1:/MobileCydia.mm diff --git a/MobileCydia.mm b/MobileCydia.mm index 97cc8c1f..10c610a4 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -293,6 +293,7 @@ static _finline void UpdateExternalStatus(uint64_t newStatus) { @end /* }}} */ +/* Cydia Action Sheet {{{ */ @interface CYActionSheet : UIAlertView { unsigned button_; } @@ -339,6 +340,7 @@ static _finline void UpdateExternalStatus(uint64_t newStatus) { } @end +/* }}} */ /* NSForcedOrderingSearch doesn't work on the iPhone */ static const NSStringCompareOptions MatchCompareOptions_ = NSLiteralSearch | NSCaseInsensitiveSearch; @@ -4284,7 +4286,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { CGRect prgrect = {{ (bounds.size.width - prgsize.width) / 2, - bounds.size.height - prgsize.height - 64 + bounds.size.height - prgsize.height - 20 }, prgsize}; float closewidth = bounds.size.width - 20; @@ -4293,7 +4295,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [progress_ setFrame:prgrect]; [status_ setFrame:CGRectMake( 10, - bounds.size.height - prgsize.height - 94, + bounds.size.height - prgsize.height - 50, bounds.size.width - 20, 24 )]; @@ -4301,11 +4303,11 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { 10, 20, bounds.size.width - 20, - bounds.size.height - 106 + bounds.size.height - 62 )]; [close_ setFrame:CGRectMake( (bounds.size.width - closewidth) / 2, - bounds.size.height - prgsize.height - 94, + bounds.size.height - prgsize.height - 50, closewidth, 32 + prgsize.height )]; @@ -7024,7 +7026,7 @@ freeing the view controllers on tab change */ - (void) refreshButtonClicked { [delegate_ beginUpdate]; - [[self navigationItem] setLeftBarButtonItem:nil]; + [[self navigationItem] setLeftBarButtonItem:nil animated:YES]; } - (void) upgradeButtonClicked { @@ -7076,7 +7078,7 @@ freeing the view controllers on tab change */ UIProgressHUD *hud([delegate_ addProgressHUD]); // XXX: localize [hud setText:@"Loading Changes"]; - NSLog(@"HUD:%@::%@", delegate_, hud); + //NSLog(@"HUD:%@::%@", delegate_, hud); [self yieldToSelector:@selector(_reloadPackages:) withObject:packages]; [delegate_ removeProgressHUD:hud]; @@ -7381,7 +7383,6 @@ freeing the view controllers on tab change */ @end /* }}} */ - /* Signature Controller {{{ */ @interface SignatureController : CYBrowserController { _transient Database *database_; @@ -7418,6 +7419,7 @@ freeing the view controllers on tab change */ @end /* }}} */ + /* Role Controller {{{ */ @interface RoleController : CYViewController < UITableViewDataSource, @@ -7586,6 +7588,68 @@ freeing the view controllers on tab change */ else return nil; } +@end +/* }}} */ +/* Stash Controller {{{ */ +@interface CYStashController : CYViewController { + UIActivityIndicatorView *spinner_; + UILabel *status_; + UILabel *caption_; +} +@end + +@implementation CYStashController +- (id) init { + if ((self = [super init])) { + [[self view] setBackgroundColor:[UIColor viewFlipsideBackgroundColor]]; + + spinner_ = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + CGRect spinrect = [spinner_ frame]; + spinrect.origin.x = ([[self view] frame].size.width / 2) - (spinrect.size.width / 2); + spinrect.origin.y = [[self view] frame].size.height - 80.0f; + [spinner_ setFrame:spinrect]; + [spinner_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin]; + [[self view] addSubview:spinner_]; + [spinner_ release]; + [spinner_ startAnimating]; + + CGRect captrect; + captrect.size.width = [[self view] frame].size.width; + captrect.size.height = 40.0f; + captrect.origin.x = 0; + captrect.origin.y = ([[self view] frame].size.height / 2) - (captrect.size.height * 2); + caption_ = [[UILabel alloc] initWithFrame:captrect]; + [caption_ setText:@"Initializing Filesystem"]; + [caption_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin]; + [caption_ setFont:[UIFont boldSystemFontOfSize:28.0f]]; + [caption_ setTextColor:[UIColor whiteColor]]; + [caption_ setBackgroundColor:[UIColor clearColor]]; + [caption_ setShadowColor:[UIColor blackColor]]; + [caption_ setTextAlignment:UITextAlignmentCenter]; + [[self view] addSubview:caption_]; + [caption_ release]; + + CGRect statusrect; + statusrect.size.width = [[self view] frame].size.width; + statusrect.size.height = 30.0f; + statusrect.origin.x = 0; + statusrect.origin.y = ([[self view] frame].size.height / 2) - statusrect.size.height; + status_ = [[UILabel alloc] initWithFrame:statusrect]; + [status_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin]; + [status_ setText:@"(Cydia will exit when complete.)"]; + [status_ setFont:[UIFont systemFontOfSize:16.0f]]; + [status_ setTextColor:[UIColor whiteColor]]; + [status_ setBackgroundColor:[UIColor clearColor]]; + [status_ setShadowColor:[UIColor blackColor]]; + [status_ setTextAlignment:UITextAlignmentCenter]; + [[self view] addSubview:status_]; + [status_ release]; + } return self; +} + +- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation { + return IsWildcat_ || orientation == UIInterfaceOrientationPortrait; +} @end /* }}} */ @@ -7677,6 +7741,7 @@ freeing the view controllers on tab change */ } - (void) completeUpdate { + if (!updating_) return; updating_ = false; [self raiseBar:YES]; @@ -7685,8 +7750,10 @@ freeing the view controllers on tab change */ } - (void) cancelUpdate { - [refreshbar_ cancel]; - [self completeUpdate]; + updating_ = false; + [self raiseBar:YES]; + [refreshbar_ stop]; + [updatedelegate_ performSelector:@selector(updateData) withObject:nil afterDelay:0]; } - (void) cancelPressed { @@ -7862,7 +7929,6 @@ typedef enum { > { UIWindow *window_; CYContainer *container_; - id tabbar_; NSMutableArray *essential_; @@ -7883,6 +7949,8 @@ typedef enum { InstalledController *installed_; id queueDelegate_; + CYStashController *stash_; + bool loaded_; } @@ -7986,6 +8054,30 @@ static _finline void _setHomePage(Cydia *self) { - (void) _refreshIfPossible { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + bool recently = false; + NSDate *update([Metadata_ objectForKey:@"LastUpdate"]); + if (update != nil) { + NSTimeInterval interval([update timeIntervalSinceNow]); + if (interval <= 0 && interval > -(15*60)) + recently = true; + } + + // Don't automatic refresh if: + // - We already refreshed recently. + // - We already auto-refreshed this launch. + // - Auto-refresh is disabled. + if (recently || loaded_ || ManualRefresh) { + [self performSelectorOnMainThread:@selector(_loaded) withObject:nil waitUntilDone:NO]; + + // If we are cancelling due to ManualRefresh or a recent refresh + // we need to make sure it knows it's already loaded. + loaded_ = true; + return; + } else { + // We are going to load, so remember that. + loaded_ = true; + } + SCNetworkReachabilityFlags flags; { SCNetworkReachabilityRef reachability(SCNetworkReachabilityCreateWithName(NULL, "cydia.saurik.com")); SCNetworkReachabilityGetFlags(reachability, &flags); @@ -8004,21 +8096,9 @@ static _finline void _setHomePage(Cydia *self) { ) ); - if (loaded_ || ManualRefresh || !reachable) loaded: - [self performSelectorOnMainThread:@selector(_loaded) withObject:nil waitUntilDone:NO]; - else { - loaded_ = true; - - NSDate *update([Metadata_ objectForKey:@"LastUpdate"]); - - if (update != nil) { - NSTimeInterval interval([update timeIntervalSinceNow]); - if (interval <= 0 && interval > -(15*60)) - goto loaded; - } - + // If we can reach the server, auto-refresh! + if (reachable) [container_ performSelectorOnMainThread:@selector(setUpdate:) withObject:update waitUntilDone:NO]; - } [pool release]; } @@ -8052,18 +8132,19 @@ static _finline void _setHomePage(Cydia *self) { } } + UITabBarItem *changesItem = [[[tabbar_ viewControllers] objectAtIndex:[self indexOfTabWithTag:kChangesTag]] tabBarItem]; if (changes != 0) { NSString *badge([[NSNumber numberWithInt:changes] stringValue]); - [[[[tabbar_ viewControllers] objectAtIndex:[self indexOfTabWithTag:kChangesTag]] tabBarItem] setBadgeValue:badge]; - [[[[tabbar_ viewControllers] objectAtIndex:[self indexOfTabWithTag:kChangesTag]] tabBarItem] setAnimatedBadge:YES]; + [changesItem setBadgeValue:badge]; + [changesItem setAnimatedBadge:[essential_ count] == 0]; if ([self respondsToSelector:@selector(setApplicationBadge:)]) [self setApplicationBadge:badge]; else [self setApplicationBadgeString:badge]; } else { - [[[[tabbar_ viewControllers] objectAtIndex:[self indexOfTabWithTag:kChangesTag]] tabBarItem] setBadgeValue:nil]; - [[[[tabbar_ viewControllers] objectAtIndex:[self indexOfTabWithTag:kChangesTag]] tabBarItem] setAnimatedBadge:NO]; + [changesItem setBadgeValue:nil]; + [changesItem setAnimatedBadge:NO]; if ([self respondsToSelector:@selector(removeApplicationBadge)]) [self removeApplicationBadge]; @@ -8421,9 +8502,16 @@ static _finline void _setHomePage(Cydia *self) { } - (void) applicationSuspend:(__GSEvent *)event { - // FIXME: This needs to be fixed, but we no longer have a progress_. - // What's the best solution? - if (hud_ == nil)// && ![progress_ isRunning]) + // Use external process status API internally. + // This is probably a really bad idea. + uint64_t status = 0; + int notify_token; + if (notify_register_check("com.saurik.Cydia.status", ¬ify_token) == NOTIFY_STATUS_OK) { + notify_get_state(notify_token, &status); + notify_cancel(notify_token); + } + + if (hud_ == nil && status == 0) [super applicationSuspend:event]; } @@ -8443,7 +8531,11 @@ static _finline void _setHomePage(Cydia *self) { [window_ setUserInteractionEnabled:NO]; [hud show:YES]; - [[container_ view] addSubview:hud]; + + UIViewController *target = container_; + while ([target modalViewController] != nil) target = [target modalViewController]; + [[target view] addSubview:hud]; + return hud; } @@ -8532,6 +8624,36 @@ static _finline void _setHomePage(Cydia *self) { [super applicationWillResignActive:application]; } +- (void) addStashController { + stash_ = [[CYStashController alloc] init]; + [window_ addSubview:[stash_ view]]; +} + +- (void) removeStashController { + [[stash_ view] removeFromSuperview]; + [stash_ release]; +} + +- (void) stash { + [self setIdleTimerDisabled:YES]; + + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque]; + [self setStatusBarShowsProgress:YES]; + UpdateExternalStatus(1); + + [self yieldToSelector:@selector(system:) withObject:@"/usr/libexec/cydia/free.sh"]; + + UpdateExternalStatus(0); + [self setStatusBarShowsProgress:NO]; + + [self removeStashController]; + + if (ExecFork() == 0) { + execlp("launchctl", "launchctl", "stop", "com.apple.SpringBoard", NULL); + perror("launchctl stop"); + } +} + - (void) applicationDidFinishLaunching:(id)unused { [CYBrowserController _initialize]; @@ -8555,8 +8677,6 @@ static _finline void _setHomePage(Cydia *self) { [window_ makeKey:self]; [window_ setHidden:NO]; - database_ = [Database sharedInstance]; - if ( readlink("/Applications", NULL, 0) == -1 && errno == EINVAL || readlink("/Library/Ringtones", NULL, 0) == -1 && errno == EINVAL || @@ -8569,27 +8689,12 @@ static _finline void _setHomePage(Cydia *self) { //readlink("/var/lib", NULL, 0) == -1 && errno == EINVAL || false ) { - [self setIdleTimerDisabled:YES]; - - hud_ = [self addProgressHUD]; - [hud_ setText:@"Reorganizing:\n\nWill Automatically\nClose When Done"]; - [self setStatusBarShowsProgress:YES]; - - [self yieldToSelector:@selector(system:) withObject:@"/usr/libexec/cydia/free.sh"]; - - [self setStatusBarShowsProgress:NO]; - [self removeProgressHUD:hud_]; - hud_ = nil; - - if (ExecFork() == 0) { - execlp("launchctl", "launchctl", "stop", "com.apple.SpringBoard", NULL); - perror("launchctl stop"); - } - + [self addStashController]; + [self performSelector:@selector(stash) withObject:nil afterDelay:0]; return; } - _trace(); + database_ = [Database sharedInstance]; NSMutableArray *items([NSMutableArray arrayWithObjects: [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage applicationImageNamed:@"home.png"] tag:kCydiaTag] autorelease], @@ -8623,6 +8728,9 @@ static _finline void _setHomePage(Cydia *self) { [container_ setTabBarController:tabbar_]; [window_ addSubview:[container_ view]]; + // Show pinstripes while loading data. + [[container_ view] setBackgroundColor:[UIColor performSelector:@selector(pinStripeColor)]]; + [self performSelector:@selector(loadData) withObject:nil afterDelay:0]; } @@ -8639,6 +8747,9 @@ static _finline void _setHomePage(Cydia *self) { PrintTimes(); _setHomePage(self); + + // XXX: does this actually slow anything down? + [[container_ view] setBackgroundColor:[UIColor clearColor]]; } - (void) showActionSheet:(UIActionSheet *)sheet fromItem:(UIBarButtonItem *)item {