@end
/* }}} */
+/* Cydia Action Sheet {{{ */
@interface CYActionSheet : UIAlertView {
unsigned button_;
}
}
@end
+/* }}} */
/* NSForcedOrderingSearch doesn't work on the iPhone */
static const NSStringCompareOptions MatchCompareOptions_ = NSLiteralSearch | NSCaseInsensitiveSearch;
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;
[progress_ setFrame:prgrect];
[status_ setFrame:CGRectMake(
10,
- bounds.size.height - prgsize.height - 94,
+ bounds.size.height - prgsize.height - 50,
bounds.size.width - 20,
24
)];
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
)];
- (void) refreshButtonClicked {
[delegate_ beginUpdate];
- [[self navigationItem] setLeftBarButtonItem:nil];
+ [[self navigationItem] setLeftBarButtonItem:nil animated:YES];
}
- (void) upgradeButtonClicked {
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];
@end
/* }}} */
-
/* Signature Controller {{{ */
@interface SignatureController : CYBrowserController {
_transient Database *database_;
@end
/* }}} */
+
/* Role Controller {{{ */
@interface RoleController : CYViewController <
UITableViewDataSource,
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
/* }}} */
}
- (void) completeUpdate {
+ if (!updating_) return;
updating_ = false;
[self raiseBar:YES];
}
- (void) cancelUpdate {
- [refreshbar_ cancel];
- [self completeUpdate];
+ updating_ = false;
+ [self raiseBar:YES];
+ [refreshbar_ stop];
+ [updatedelegate_ performSelector:@selector(updateData) withObject:nil afterDelay:0];
}
- (void) cancelPressed {
> {
UIWindow *window_;
CYContainer *container_;
-
id tabbar_;
NSMutableArray *essential_;
InstalledController *installed_;
id queueDelegate_;
+ CYStashController *stash_;
+
bool loaded_;
}
- (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);
)
);
- 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];
}
}
}
+ 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];
}
- (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];
}
[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;
}
[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];
[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 ||
//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],
[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];
}
PrintTimes();
_setHomePage(self);
+
+ // XXX: does this actually slow anything down?
+ [[container_ view] setBackgroundColor:[UIColor clearColor]];
}
- (void) showActionSheet:(UIActionSheet *)sheet fromItem:(UIBarButtonItem *)item {