X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/864db79b71f7e38c80acd3bf341e0dc9cb1bc871..ea0e9eb1e63a99a059f22d4e78ea38f8744404fb:/MobileCydia.mm?ds=sidebyside diff --git a/MobileCydia.mm b/MobileCydia.mm index 97cc8c1f..dd645d9f 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; @@ -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 { @@ -7677,6 +7679,7 @@ freeing the view controllers on tab change */ } - (void) completeUpdate { + if (!updating_) return; updating_ = false; [self raiseBar:YES]; @@ -7685,8 +7688,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 { @@ -7986,6 +7991,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 +8033,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 +8069,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:YES]; 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 +8439,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]; } @@ -8557,6 +8582,38 @@ static _finline void _setHomePage(Cydia *self) { database_ = [Database sharedInstance]; + NSMutableArray *items([NSMutableArray arrayWithObjects: + [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage applicationImageNamed:@"home.png"] tag:kCydiaTag] autorelease], + [[[UITabBarItem alloc] initWithTitle:UCLocalize("SECTIONS") image:[UIImage applicationImageNamed:@"install.png"] tag:kSectionsTag] autorelease], + [[[UITabBarItem alloc] initWithTitle:UCLocalize("CHANGES") image:[UIImage applicationImageNamed:@"changes.png"] tag:kChangesTag] autorelease], + [[[UITabBarItem alloc] initWithTitle:UCLocalize("SEARCH") image:[UIImage applicationImageNamed:@"search.png"] tag:kSearchTag] autorelease], + nil]); + + if (IsWildcat_) { + [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("SOURCES") image:[UIImage applicationImageNamed:@"source.png"] tag:kSourcesTag] autorelease] atIndex:3]; + [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("INSTALLED") image:[UIImage applicationImageNamed:@"manage.png"] tag:kInstalledTag] autorelease] atIndex:3]; + } else { + [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("MANAGE") image:[UIImage applicationImageNamed:@"manage.png"] tag:kManageTag] autorelease] atIndex:3]; + } + + NSMutableArray *controllers([NSMutableArray array]); + + for (UITabBarItem *item in items) { + CYNavigationController *controller([[[CYNavigationController alloc] initWithDatabase:database_] autorelease]); + [controller setTabBarItem:item]; + [controllers addObject:controller]; + } + + tabbar_ = [[CYTabBarController alloc] initWithDatabase:database_]; + [tabbar_ setViewControllers:controllers]; + [tabbar_ setDelegate:self]; + [tabbar_ setSelectedIndex:0]; + + container_ = [[CYContainer alloc] initWithDatabase:database_]; + [container_ setUpdateDelegate:self]; + [container_ setTabBarController:tabbar_]; + [window_ addSubview:[container_ view]]; + if ( readlink("/Applications", NULL, 0) == -1 && errno == EINVAL || readlink("/Library/Ringtones", NULL, 0) == -1 && errno == EINVAL || @@ -8589,39 +8646,8 @@ static _finline void _setHomePage(Cydia *self) { return; } - _trace(); - - NSMutableArray *items([NSMutableArray arrayWithObjects: - [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage applicationImageNamed:@"home.png"] tag:kCydiaTag] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SECTIONS") image:[UIImage applicationImageNamed:@"install.png"] tag:kSectionsTag] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("CHANGES") image:[UIImage applicationImageNamed:@"changes.png"] tag:kChangesTag] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SEARCH") image:[UIImage applicationImageNamed:@"search.png"] tag:kSearchTag] autorelease], - nil]); - - if (IsWildcat_) { - [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("SOURCES") image:[UIImage applicationImageNamed:@"source.png"] tag:kSourcesTag] autorelease] atIndex:3]; - [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("INSTALLED") image:[UIImage applicationImageNamed:@"manage.png"] tag:kInstalledTag] autorelease] atIndex:3]; - } else { - [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("MANAGE") image:[UIImage applicationImageNamed:@"manage.png"] tag:kManageTag] autorelease] atIndex:3]; - } - - NSMutableArray *controllers([NSMutableArray array]); - - for (UITabBarItem *item in items) { - CYNavigationController *controller([[[CYNavigationController alloc] initWithDatabase:database_] autorelease]); - [controller setTabBarItem:item]; - [controllers addObject:controller]; - } - - tabbar_ = [[CYTabBarController alloc] initWithDatabase:database_]; - [tabbar_ setViewControllers:controllers]; - [tabbar_ setDelegate:self]; - [tabbar_ setSelectedIndex:0]; - - container_ = [[CYContainer alloc] initWithDatabase:database_]; - [container_ setUpdateDelegate: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 +8665,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 {