/* Cydia - iPhone UIKit Front-End for Debian APT
- * Copyright (C) 2008-2009 Jay Freeman (saurik)
+ * Copyright (C) 2008-2010 Jay Freeman (saurik)
*/
/* Modified BSD License {{{ */
#define _pooled _H<NSAutoreleasePool> _pool([[NSAutoreleasePool alloc] init], true);
+static const NSUInteger UIViewAutoresizingFlexibleBoth(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
+
void NSLogPoint(const char *fix, const CGPoint &point) {
NSLog(@"%s(%g,%g)", fix, point.x, point.y);
}
@end
/* }}} */
-@interface CYActionSheet : UIActionSheet {
+@interface CYActionSheet : UIAlertView {
unsigned button_;
}
@implementation CYActionSheet
- (id) initWithTitle:(NSString *)title buttons:(NSArray *)buttons defaultButtonIndex:(int)index {
- if ((self = [super initWithTitle:title buttons:buttons defaultButtonIndex:index delegate:self context:nil]) != nil) {
+ if ((self = [super init])) {
+ [self setDelegate:self];
+ for (NSString *button in buttons) [self addButtonWithTitle:button];
+ [self setCancelButtonIndex:index];
} return self;
}
-- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button {
- button_ = button;
+- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
+ button_ = buttonIndex + 1;
}
- (int) yieldToPopupAlertAnimated:(BOOL)animated {
- (void) popSubview:(UIView *)view {
UITransitionView *transition([[[PopTransitionView alloc] initWithFrame:[self bounds]] autorelease]);
- [transition setDelegate:transition];
+ [transition setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[self addSubview:transition];
- UIView *blank = [[[UIView alloc] initWithFrame:[transition bounds]] autorelease];
+ [transition setDelegate:transition];
+
+ UIView *blank([[[UIView alloc] initWithFrame:[transition bounds]] autorelease]);
+ [blank setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[transition transition:UITransitionNone toView:blank];
[transition transition:UITransitionPushFromBottom toView:view];
}
#define IgnoreInstall (0 && !ForRelease)
#define RecycleWebViews 0
#define RecyclePackageViews (1 && ForRelease)
-#define AlwaysReload (0 && !ForRelease)
+#define AlwaysReload (1 && !ForRelease)
#if !TraceLogging
#undef _trace
@end
/* }}} */
+NSUInteger WebScriptObject$countByEnumeratingWithState$objects$count$(WebScriptObject *self, SEL sel, NSFastEnumerationState *state, id *objects, NSUInteger count) {
+ size_t length([self count] - state->state);
+ if (length <= 0)
+ return 0;
+ else if (length > count)
+ length = count;
+ for (size_t i(0); i != length; ++i)
+ objects[i] = [self objectAtIndex:state->state++];
+ state->itemsPtr = objects;
+ state->mutationsPtr = (unsigned long *) self;
+ return length;
+}
+
NSUInteger DOMNodeList$countByEnumeratingWithState$objects$count$(DOMNodeList *self, SEL sel, NSFastEnumerationState *state, id *objects, NSUInteger count) {
size_t length([self length] - state->state);
if (length <= 0)
- (NSString *) stringByCachingURLWithCurrentCDN {
return [self
- stringByReplacingOccurrencesOfString:@"://"
- withString:@"://ne.edgecastcdn.net/8003A4/"
- options:0
- /* XXX: this is somewhat inaccurate */
- range:NSMakeRange(0, 10)
+ stringByReplacingOccurrencesOfString:@"://cydia.saurik.com/"
+ withString:@"://cache.cydia.saurik.com/"
];
}
- (void) setPackageView:(PackageView *)view;
- (void) clearPackage:(Package *)package;
- (void) installPackage:(Package *)package;
+- (void) installPackages:(NSArray *)packages;
- (void) removePackage:(Package *)package;
- (void) slideUp:(UIActionSheet *)alert;
- (void) distUpgrade;
/* Web Scripting {{{ */
@interface CydiaObject : NSObject {
id indirect_;
+ id delegate_;
}
- (id) initWithDelegate:(IndirectDelegate *)indirect;
} return self;
}
+- (void) setDelegate:(id)delegate {
+ delegate_ = delegate;
+}
+
+ (NSArray *) _attributeKeys {
return [NSArray arrayWithObjects:@"device", @"firewire", @"imei", @"mac", @"serial", nil];
}
return @"getInstalledPackages";
else if (selector == @selector(getPackageById:))
return @"getPackageById";
+ else if (selector == @selector(installPackages:))
+ return @"installPackages";
else if (selector == @selector(setAutoPopup:))
return @"setAutoPopup";
else if (selector == @selector(setButtonImage:withStyle:toFunction:))
- (NSArray *) getInstalledPackages {
NSArray *packages([[Database sharedInstance] packages]);
NSMutableArray *installed([NSMutableArray arrayWithCapacity:[packages count]]);
- for (Package *package in installed)
+ for (Package *package in packages)
if ([package installed] != nil)
[installed addObject:package];
return installed;
[indirect_ close];
}
+- (void) installPackages:(NSArray *)packages {
+ [delegate_ performSelectorOnMainThread:@selector(installPackages:) withObject:packages waitUntilDone:NO];
+}
+
- (void) setAutoPopup:(BOOL)popup {
[indirect_ setAutoPopup:popup];
}
NSString *host([url host]);
[self setHeaders:headers forHost:host];
- if ([host isEqualToString:@"cydia.saurik.com"] || [scheme isEqualToString:@"file"])
+ if (
+ [host isEqualToString:@"cydia.saurik.com"] ||
+ [host hasSuffix:@".cydia.saurik.com"] ||
+ [scheme isEqualToString:@"file"]
+ )
[window setValue:cydia_ forKey:@"cydia"];
}
return copy;
}
+- (void) setDelegate:(id)delegate {
+ [super setDelegate:delegate];
+ [cydia_ setDelegate:delegate];
+}
+
- (id) initWithBook:(RVBook *)book forWidth:(float)width {
if ((self = [super initWithBook:book forWidth:width ofClass:[CydiaBrowserView class]]) != nil) {
cydia_ = [[CydiaObject alloc] initWithDelegate:indirect_];
- WebView *webview([webview_ webView]);
+ WebView *webview([document_ webView]);
Package *package([[Database sharedInstance] packageWithName:@"cydia"]);
context:@"remove"
];
+ [essential_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[essential_ setDestructiveButtonIndex:1];
[essential_ setBodyText:UCLocalize("REMOVING_ESSENTIALS_EX")];
} else {
context:@"unable"
];
+ [essential_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[essential_ setBodyText:UCLocalize("UNABLE_TO_COMPLY_EX")];
}
nil];
[self loadURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"confirm" ofType:@"html"]]];
+
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
delegate_ = delegate;
transition_ = [[UITransitionView alloc] initWithFrame:[self bounds]];
+ [transition_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[transition_ setDelegate:self];
overlay_ = [[UIView alloc] initWithFrame:[transition_ bounds]];
+ [overlay_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
background_ = [[UIView alloc] initWithFrame:[self bounds]];
[background_ setBackgroundColor:[UIColor blackColor]];
CGRect navrect = {{0, 0}, navsize};
navbar_ = [[UINavigationBar alloc] initWithFrame:navrect];
+ [navbar_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[overlay_ addSubview:navbar_];
[navbar_ setBarStyle:1];
}, prgsize};
progress_ = [[UIProgressBar alloc] initWithFrame:prgrect];
+ [progress_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin)];
[progress_ setStyle:0];
status_ = [[UITextLabel alloc] initWithFrame:CGRectMake(
24
)];
+ [status_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin)];
+
[status_ setColor:[UIColor whiteColor]];
[status_ setBackgroundColor:[UIColor clearColor]];
bounds.size.height - navsize.height - 62 - navrect.size.height
)];
+ [output_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [overlay_ addSubview:output_];
+
//[output_ setTextFont:@"Courier New"];
[output_ setFont:[[output_ font] fontWithSize:12]];
[output_ setAllowsRubberBanding:YES];
[output_ setEditable:NO];
- [overlay_ addSubview:output_];
-
close_ = [[UIPushButton alloc] initWithFrame:CGRectMake(
10,
bounds.size.height - prgsize.height - 50,
32 + prgsize.height
)];
+ [close_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin)];
+
[close_ setAutosizesToFit:NO];
[close_ setDrawsShadow:YES];
[close_ setStretchBackground:YES];
context:@"conffile"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:[NSString stringWithFormat:@"%@\n\n%@", UCLocalize("CONFIGURATION_UPGRADE_EX"), ofile]];
[sheet popupAlertAnimated:YES];
}
delegate_ = delegate;
}
+/* Fix landscape: redraw when frame changes. */
+- (void) setFrame:(CGRect)frame {
+ [super setFrame:frame];
+ [self setNeedsDisplay];
+}
+
- (void) drawRect:(CGRect)rect {
[super drawRect:rect];
[delegate_ drawContentRect:rect];
if ((self = [super initWithFrame:frame reuseIdentifier:@"Package"]) != nil) {
UIView *content([self contentView]);
CGRect bounds([content bounds]);
+
content_ = [[ContentView alloc] initWithFrame:bounds];
+ [content_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [content addSubview:content_];
+
[content_ setDelegate:self];
- [content_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[content_ setOpaque:YES];
- [content addSubview:content_];
if ([self respondsToSelector:@selector(selectionPercent)])
faded_ = YES;
+
+ [self setNeedsDisplayOnBoundsChange:YES];
} return self;
}
}
}
+- (void) setFrame:(CGRect)frame {
+ [super setFrame:frame];
+ CGRect rect([switch_ frame]);
+ [switch_ setFrame:CGRectMake(frame.size.width - 102, 9, rect.size.width, rect.size.height)];
+}
+
- (void) drawContentInRect:(CGRect)rect selected:(BOOL)selected {
[icon_ drawInRect:CGRectMake(8, 7, 32, 32)];
float width(rect.size.width + 23);
if (editing_)
- width -= 86;
+ width -= 110;
[name_ drawAtPoint:CGPointMake(48, 9) forWidth:(width - 70) withFont:Font22Bold_ ellipsis:2];
[list_ addTableColumn:column];
[list_ setDelegate:self];
[list_ setReusesTableCells:YES];
+
+ [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
[buttons_ addObject:UCLocalize("REMOVE")];
if (special_ != NULL) {
- CGRect frame([webview_ frame]);
+ CGRect frame([document_ frame]);
frame.size.width = 320;
frame.size.height = 0;
- [webview_ setFrame:frame];
+ [document_ setFrame:frame];
if ([scroller_ respondsToSelector:@selector(scrollPointVisibleAtTopLeft:)])
[scroller_ scrollPointVisibleAtTopLeft:CGPointZero];
[scroller_ scrollRectToVisible:CGRectZero animated:NO];
WebThreadLock();
- [[[webview_ webView] windowScriptObject] setValue:package_ forKey:@"package"];
+ [[[document_ webView] windowScriptObject] setValue:package_ forKey:@"package"];
[self setButtonTitle:nil withStyle:nil toFunction:nil];
sections_ = [[NSMutableArray arrayWithCapacity:16] retain];
list_ = [[UITableView alloc] initWithFrame:[self bounds] style:UITableViewStylePlain];
+ [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [self addSubview:list_];
+
[list_ setDataSource:self];
[list_ setDelegate:self];
- [self addSubview:list_];
-
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [list_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
context:@"warning"
] autorelease];
- [sheet setNumberOfRows:1];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+ [sheet setNumberOfRows:1];
[sheet setBodyText:warning];
[sheet popupAlertAnimated:YES];
} else
context:@"urlerror"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:[error_ localizedDescription]];
[sheet popupAlertAnimated:YES];
} else {
context:@"trivial"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:UCLocalize("NOT_REPOSITORY_EX")];
[sheet popupAlertAnimated:YES];
}
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:[NSURL URLWithString:href]
cachePolicy:NSURLRequestUseProtocolCachePolicy
- timeoutInterval:20.0
+ timeoutInterval:120.0
];
[request setHTTPMethod:method];
if (Machine_ != NULL)
[request setValue:[NSString stringWithUTF8String:Machine_] forHTTPHeaderField:@"X-Machine"];
- if (Token_ != nil)
- [request setValue:Token_ forHTTPHeaderField:@"X-Cydia-Token"];
+ if (UniqueID_ != nil)
+ [request setValue:UniqueID_ forHTTPHeaderField:@"X-Unique-ID"];
if (Role_ != nil)
[request setValue:Role_ forHTTPHeaderField:@"X-Role"];
//list_ = [[UITable alloc] initWithFrame:[self bounds]];
list_ = [[UISectionList alloc] initWithFrame:[self bounds] showSectionIndex:NO];
- [list_ setShouldHideHeaderInShortLists:NO];
-
+ [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[self addSubview:list_];
+
+ [list_ setShouldHideHeaderInShortLists:NO];
[list_ setDataSource:self];
UITableColumn *column = [[UITableColumn alloc]
[self reloadData];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [list_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
context:@"source"
] autorelease];
- [sheet setNumberOfRows:1];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+ [sheet setNumberOfRows:1];
[sheet addTextFieldWithValue:@"http://" label:@""];
UITextInputTraits *traits = [[sheet textField] textInputTraits];
with:[NSNumber numberWithBool:YES]
];
+ [packages_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[self addSubview:packages_];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [packages_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
}
- (void) _leftButtonClicked {
- UIActionSheet *sheet = [[[UIActionSheet alloc]
- initWithTitle:UCLocalize("ABOUT_CYDIA")
- buttons:[NSArray arrayWithObjects:UCLocalize("CLOSE"), nil]
- defaultButtonIndex:0
- delegate:self
- context:@"about"
- ] autorelease];
+ UIAlertView *alert = [[[UIAlertView alloc] init] autorelease];
+ [alert setTitle:UCLocalize("ABOUT_CYDIA")];
+ [alert addButtonWithTitle:UCLocalize("CLOSE")];
+ [alert setCancelButtonIndex:0];
- [sheet setBodyText:
- @"Copyright (C) 2008-2009\n"
+ [alert setMessage:
+ @"Copyright (C) 2008-2010\n"
"Jay Freeman (saurik)\n"
"saurik@saurik.com\n"
- "http://www.saurik.com/\n"
- "\n"
- "The Okori Group\n"
- "http://www.theokorigroup.com/\n"
- "\n"
- "College of Creative Studies,\n"
- "University of California,\n"
- "Santa Barbara\n"
- "http://www.ccs.ucsb.edu/"
+ "http://www.saurik.com/"
];
- [sheet popupAlertAnimated:YES];
+ [alert show];
}
- (NSString *) leftButtonTitle {
ovrrect.origin.y = -ovrrect.size.height;
overlay_ = [[UINavigationBar alloc] initWithFrame:ovrrect];
+ [overlay_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[self addSubview:overlay_];
ovrrect.origin.y = frame.size.height;
underlay_ = [[UINavigationBar alloc] initWithFrame:ovrrect];
- [underlay_ setTintColor:[UIColor colorWithRed:0.23 green:0.23 blue:0.23 alpha:1]];
+ [underlay_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[self addSubview:underlay_];
+ [underlay_ setTintColor:[UIColor colorWithRed:0.23 green:0.23 blue:0.23 alpha:1]];
+
[overlay_ setBarStyle:1];
[underlay_ setBarStyle:1];
} , prgsize};
progress_ = [[UIProgressBar alloc] initWithFrame:prgrect];
- [progress_ setStyle:0];
+ [progress_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[overlay_ addSubview:progress_];
+ [progress_ setStyle:0];
+
cancel_ = [[UINavigationButton alloc] initWithTitle:UCLocalize("CANCEL") style:UINavigationButtonStyleHighlighted];
+ [progress_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
[cancel_ addTarget:self action:@selector(_onCancel) forControlEvents:UIControlEventTouchUpInside];
CGRect frame = [cancel_ frame];
context:@"refresh"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:error];
[sheet popupAlertAnimated:YES];
_transient Database *database_;
NSMutableArray *sections_;
NSMutableArray *filtered_;
- UITransitionView *transition_;
UITable *list_;
UIView *accessory_;
BOOL editing_;
[sections_ release];
[filtered_ release];
- [transition_ release];
[list_ release];
[accessory_ release];
[super dealloc];
sections_ = [[NSMutableArray arrayWithCapacity:16] retain];
filtered_ = [[NSMutableArray arrayWithCapacity:16] retain];
- transition_ = [[UITransitionView alloc] initWithFrame:[self bounds]];
- [self addSubview:transition_];
-
- list_ = [[UITable alloc] initWithFrame:[transition_ bounds]];
- [transition_ transition:0 toView:list_];
+ list_ = [[UITable alloc] initWithFrame:[self bounds]];
+ [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [self addSubview:list_];
UITableColumn *column = [[[UITableColumn alloc]
initWithTitle:UCLocalize("NAME")
[self reloadData];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [list_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
unsigned upgrades_;
}
-- (id) initWithBook:(RVBook *)book database:(Database *)database;
+- (id) initWithBook:(RVBook *)book database:(Database *)database delegate:(id)delegate;
- (void) reloadData;
@end
[delegate_ distUpgrade];
}
-- (id) initWithBook:(RVBook *)book database:(Database *)database {
+- (id) initWithBook:(RVBook *)book database:(Database *)database delegate:(id)delegate {
if ((self = [super initWithBook:book]) != nil) {
database_ = database;
sections_ = [[NSMutableArray arrayWithCapacity:16] retain];
list_ = [[UITableView alloc] initWithFrame:[self bounds] style:UITableViewStylePlain];
+ [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[self addSubview:list_];
//XXX:[list_ setShouldHideHeaderInShortLists:NO];
[list_ setDelegate:self];
//[list_ setSectionListStyle:1];
+ delegate_ = delegate;
[self reloadData];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [list_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
-- (void) reloadData {
- NSArray *packages = [database_ packages];
-
- [packages_ removeAllObjects];
- [sections_ removeAllObjects];
-
+- (void) _reloadPackages:(NSArray *)packages {
_trace();
for (Package *package in packages)
if (
_trace();
[packages_ radixSortUsingFunction:reinterpret_cast<SKRadixFunction>(&PackageChangesRadix) withContext:NULL];
_trace();
+}
+
+- (void) reloadData {
+ NSArray *packages = [database_ packages];
+
+ [packages_ removeAllObjects];
+ [sections_ removeAllObjects];
+
+ UIProgressHUD *hud([delegate_ addProgressHUD]);
+ // XXX: localize
+ [hud setText:@"Loading Changes"];
+ NSLog(@"HUD:%@::%@", delegate_, hud);
+ [self yieldToSelector:@selector(_reloadPackages:) withObject:packages];
+ [delegate_ removeProgressHUD:hud];
Section *upgradable = [[[Section alloc] initWithName:UCLocalize("AVAILABLE_UPGRADES") localize:NO] autorelease];
Section *ignored = [[[Section alloc] initWithName:UCLocalize("IGNORED_UPGRADES") localize:NO] autorelease];
UIView *accessory_;
UISearchField *field_;
FilteredPackageTable *table_;
- UIView *dimmed_;
bool reload_;
}
[accessory_ release];
[field_ release];
[table_ release];
- [dimmed_ release];
[super dealloc];
}
if ((self = [super initWithBook:book]) != nil) {
CGRect pageBounds = [book_ pageBounds];
- dimmed_ = [[UIView alloc] initWithFrame:pageBounds];
- CGColor dimmed(space_, 0, 0, 0, 0.5);
- [dimmed_ setBackgroundColor:[UIColor colorWithCGColor:dimmed]];
-
table_ = [[FilteredPackageTable alloc]
initWithBook:book
database:database
with:nil
];
- [table_ setShouldHideHeaderInShortLists:NO];
+ [table_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[self addSubview:table_];
+ [table_ setShouldHideHeaderInShortLists:NO];
+
CGRect cnfrect = {{7, 38}, {17, 18}};
CGRect area;
area.size.height = [UISearchField defaultHeight];
field_ = [[UISearchField alloc] initWithFrame:area];
+ [field_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
UIFont *font = [UIFont systemFontOfSize:16];
[field_ setFont:font];
CGRect accrect = {{0, 6}, {6 + cnfrect.size.width + 6 + area.size.width + 6, area.size.height}};
accessory_ = [[UIView alloc] initWithFrame:accrect];
+ [accessory_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[accessory_ addSubview:field_];
- [self setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
- [table_ setAutoresizingMask:UIViewAutoresizingFlexibleHeight];
+ [self setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
} return self;
}
@end
/* }}} */
+@interface CydiaViewController : UIViewController {
+}
+
+@end
+
+@implementation CydiaViewController
+
+- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation {
+ return NO; // XXX: return YES;
+}
+
+@end
+
@interface Cydia : UIApplication <
ConfirmationViewDelegate,
ProgressViewDelegate,
CydiaDelegate
> {
UIWindow *window_;
+ CydiaViewController *root_;
UIView *underlay_;
UIView *overlay_;
CYBook *book_;
- UIToolbar *toolbar_;
+
+ NSArray *items_;
+ UITabBar *toolbar_;
RVBook *confirm_;
Database *database_;
ProgressView *progress_;
- unsigned tag_;
+ int tag_;
UIKeyboard *keyboard_;
UIProgressHUD *hud_;
context:@"fixhalf"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:UCLocalize("HALFINSTALLED_PACKAGE_EX")];
[sheet popupAlertAnimated:YES];
} else if (!Ignored_ && [essential_ count] != 0) {
context:@"upgrade"
] autorelease];
+ [sheet setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
+
[sheet setBodyText:UCLocalize("ESSENTIAL_UPGRADE_EX")];
[sheet popupAlertAnimated:YES];
}
[self _saveConfig];
/* XXX: this is just stupid */
- if (tag_ != 2 && sections_ != nil)
+ if (tag_ != 1 && sections_ != nil)
[sections_ reloadData];
- if (tag_ != 3 && changes_ != nil)
+ if (tag_ != 2 && changes_ != nil)
[changes_ reloadData];
- if (tag_ != 5 && search_ != nil)
+ if (tag_ != 4 && search_ != nil)
[search_ reloadData];
[book_ reloadData];
if (changes != 0) {
NSString *badge([[NSNumber numberWithInt:changes] stringValue]);
- [toolbar_ setBadgeValue:badge forButton:3];
+ [[[toolbar_ items] objectAtIndex:2] setBadgeValue:badge];
if ([toolbar_ respondsToSelector:@selector(setBadgeAnimated:forButton:)])
- [toolbar_ setBadgeAnimated:([essential_ count] != 0) forButton:3];
+ [[[toolbar_ items] objectAtIndex:2] setAnimatedBadge:YES];
if ([self respondsToSelector:@selector(setApplicationBadge:)])
[self setApplicationBadge:badge];
else
[self setApplicationBadgeString:badge];
} else {
- [toolbar_ setBadgeValue:nil forButton:3];
+ [[[toolbar_ items] objectAtIndex:2] setBadgeValue:nil];
if ([toolbar_ respondsToSelector:@selector(setBadgeAnimated:forButton:)])
- [toolbar_ setBadgeAnimated:NO forButton:3];
+ [[[toolbar_ items] objectAtIndex:2] setAnimatedBadge:NO];
if ([self respondsToSelector:@selector(removeApplicationBadge)])
[self removeApplicationBadge];
else // XXX: maybe use setApplicationBadgeString also?
}
Queuing_ = false;
- [toolbar_ setBadgeValue:nil forButton:4];
+ [[[toolbar_ items] objectAtIndex:3] setBadgeValue:nil];
[self _updateData];
return false;
confirm_ = [[RVBook alloc] initWithFrame:[self popUpBounds]];
+ [confirm_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[confirm_ setDelegate:self];
ConfirmationView *page([[[ConfirmationView alloc] initWithBook:confirm_ database:database_] autorelease]);
}
}
+- (void) installPackages:(NSArray *)packages {
+ @synchronized (self) {
+ for (Package *package in packages)
+ [package install];
+ [self resolve];
+ [self perform];
+ }
+}
+
- (void) installPackage:(Package *)package {
@synchronized (self) {
[package install];
- (ChangesView *) changesView {
if (changes_ == nil)
- changes_ = [[ChangesView alloc] initWithBook:book_ database:database_];
+ changes_ = [[ChangesView alloc] initWithBook:book_ database:database_ delegate:self];
return changes_;
}
return search_;
}
-- (void) buttonBarItemTapped:(id)sender {
- unsigned tag = [sender tag];
+- (void) tabBar:(UITabBar *)sender didSelectItem:(UITabBarItem *)item {
+ int tag = [item tag];
if (tag == tag_) {
[book_ resetViewAnimated:YES];
return;
- } else if (tag_ == 2)
+ } else if (tag_ == 1)
[[self sectionsView] resetView];
switch (tag) {
- case 1: _setHomePage(self); break;
+ case 0: _setHomePage(self); break;
- case 2: [self setPage:[self sectionsView]]; break;
- case 3: [self setPage:[self changesView]]; break;
- case 4: [self setPage:[self manageView]]; break;
- case 5: [self setPage:[self searchView]]; break;
+ case 1: [self setPage:[self sectionsView]]; break;
+ case 2: [self setPage:[self changesView]]; break;
+ case 3: [self setPage:[self manageView]]; break;
+ case 4: [self setPage:[self searchView]]; break;
_nodefault
}
[self _reloadData];
else {
Queuing_ = true;
- [toolbar_ setBadgeValue:UCLocalize("Q_D") forButton:4];
+ [[[toolbar_ items] objectAtIndex:3] setBadgeValue:UCLocalize("Q_D")];
[book_ reloadData];
}
- (UIProgressHUD *) addProgressHUD {
UIProgressHUD *hud([[[UIProgressHUD alloc] initWithWindow:window_] autorelease]);
+ [hud setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+
[window_ setUserInteractionEnabled:NO];
[hud show:YES];
[progress_ addSubview:hud];
- (RVPage *) pageForURL:(NSURL *)url hasTag:(int *)tag {
if (tag != NULL)
- tag = 0;
+ *tag = -1;
NSString *href([url absoluteString]);
if ([href hasPrefix:@"apptapp://package/"])
int tag;
if (RVPage *page = [self pageForURL:url hasTag:&tag]) {
[self setPage:page];
- [toolbar_ showSelectionForButton:tag];
tag_ = tag;
+ [toolbar_ setSelectedItem:(tag_ == -1 ? nil : [items_ objectAtIndex:tag_])];
}
}
Font18Bold_ = [[UIFont boldSystemFontOfSize:18] retain];
Font22Bold_ = [[UIFont boldSystemFontOfSize:22] retain];
- tag_ = 1;
+ tag_ = 0;
essential_ = [[NSMutableArray alloc] initWithCapacity:4];
broken_ = [[NSMutableArray alloc] initWithCapacity:4];
- window_ = [[UIWindow alloc] initWithContentRect:[UIHardware fullScreenApplicationContentRect]];
+ UIScreen *screen([UIScreen mainScreen]);
+
+ window_ = [[UIWindow alloc] initWithFrame:[screen bounds]];
[window_ orderFront:self];
[window_ makeKey:self];
[window_ setHidden:NO];
- //[window_ setAutorotates:YES];
- //[window_ setDelegate:self];
+
+ root_ = [[CydiaViewController alloc] init];
+ [window_ addSubview:[root_ view]];
database_ = [Database sharedInstance];
- progress_ = [[ProgressView alloc] initWithFrame:[window_ bounds] database:database_ delegate:self];
+ progress_ = [[ProgressView alloc] initWithFrame:[[root_ view] bounds] database:database_ delegate:self];
+ [progress_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [[root_ view] addSubview:progress_];
+
[database_ setDelegate:progress_];
- [window_ setContentView:progress_];
underlay_ = [[UIView alloc] initWithFrame:[progress_ bounds]];
+ [underlay_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[progress_ setContentView:underlay_];
[progress_ resetView];
_trace();
overlay_ = [[UIView alloc] initWithFrame:[underlay_ bounds]];
+ [overlay_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
CGRect screenrect = [UIHardware fullScreenApplicationContentRect];
+
book_ = [[CYBook alloc] initWithFrame:CGRectMake(
0, 0, screenrect.size.width, screenrect.size.height - 48
) database:database_];
- [book_ setDelegate:self];
-
+ [book_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
[overlay_ addSubview:book_];
- NSArray *buttonitems = [NSArray arrayWithObjects:
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"home-up.png", kUIButtonBarButtonInfo,
- @"home-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:1], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- @"Cydia", kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
-
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"install-up.png", kUIButtonBarButtonInfo,
- @"install-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:2], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- UCLocalize("SECTIONS"), kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
-
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"changes-up.png", kUIButtonBarButtonInfo,
- @"changes-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:3], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- UCLocalize("CHANGES"), kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
-
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"manage-up.png", kUIButtonBarButtonInfo,
- @"manage-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:4], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- UCLocalize("MANAGE"), kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
-
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"buttonBarItemTapped:", kUIButtonBarButtonAction,
- @"search-up.png", kUIButtonBarButtonInfo,
- @"search-dn.png", kUIButtonBarButtonSelectedInfo,
- [NSNumber numberWithInt:5], kUIButtonBarButtonTag,
- self, kUIButtonBarButtonTarget,
- UCLocalize("SEARCH"), kUIButtonBarButtonTitle,
- @"0", kUIButtonBarButtonType,
- nil],
- nil];
+ [book_ setDelegate:self];
- toolbar_ = [[UIToolbar alloc]
- initInView:overlay_
- withFrame:CGRectMake(
+ items_ = [[NSArray arrayWithObjects:
+ [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage applicationImageNamed:@"home.png"] tag:0] autorelease],
+ [[[UITabBarItem alloc] initWithTitle:UCLocalize("SECTIONS") image:[UIImage applicationImageNamed:@"install.png"] tag:1] autorelease],
+ [[[UITabBarItem alloc] initWithTitle:UCLocalize("CHANGES") image:[UIImage applicationImageNamed:@"changes.png"] tag:2] autorelease],
+ [[[UITabBarItem alloc] initWithTitle:UCLocalize("MANAGE") image:[UIImage applicationImageNamed:@"manage.png"] tag:3] autorelease],
+ [[[UITabBarItem alloc] initWithTitle:UCLocalize("SEARCH") image:[UIImage applicationImageNamed:@"search.png"] tag:4] autorelease],
+ nil] retain];
+
+ toolbar_ = [[UITabBar alloc]
+ initWithFrame:CGRectMake(
0, screenrect.size.height - ButtonBarHeight_,
screenrect.size.width, ButtonBarHeight_
)
- withItemList:buttonitems
];
+ [toolbar_ setItems:items_];
+
+ [toolbar_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin)];
+ [overlay_ addSubview:toolbar_];
+
[toolbar_ setDelegate:self];
- [toolbar_ setBarStyle:1];
- [toolbar_ setButtonBarTrackingMode:2];
- int buttons[5] = {1, 2, 3, 4, 5};
+ /*int buttons[5] = {1, 2, 3, 4, 5};
[toolbar_ registerButtonGroup:0 withButtons:buttons withCount:5];
[toolbar_ showButtonGroup:0 withDuration:0];
- for (int i = 0; i != 5; ++i)
- [[toolbar_ viewWithTag:(i + 1)] setFrame:CGRectMake(
+ for (int i = 0; i != 5; ++i) {
+ UIView *button([toolbar_ viewWithTag:(i + 1)]);
+
+ [button setFrame:CGRectMake(
i * (screenrect.size.width / 5) + (screenrect.size.width / 5 - ButtonBarWidth_) / 2, 1,
ButtonBarWidth_, ButtonBarHeight_
)];
- [toolbar_ showSelectionForButton:1];
- [overlay_ addSubview:toolbar_];
+ [button setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
+ }*/
+
+ [toolbar_ setSelectedItem:[items_ objectAtIndex:0]];
[UIKeyboard initImplementationNow];
/*CGSize keysize = [UIKeyboard defaultSize];
}
- (void) slideUp:(UIActionSheet *)alert {
+ [alert setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[alert presentSheetInView:overlay_];
}
PackageName = reinterpret_cast<CYString &(*)(Package *, SEL)>(method_getImplementation(class_getInstanceMethod([Package class], @selector(cyname))));
/* Library Hacks {{{ */
+ class_addMethod(objc_getClass("WebScriptObject"), @selector(countByEnumeratingWithState:objects:count:), (IMP) &WebScriptObject$countByEnumeratingWithState$objects$count$, "I20@0:4^{NSFastEnumerationState}8^@12I16");
class_addMethod(objc_getClass("DOMNodeList"), @selector(countByEnumeratingWithState:objects:count:), (IMP) &DOMNodeList$countByEnumeratingWithState$objects$count$, "I20@0:4^{NSFastEnumerationState}8^@12I16");
$WebDefaultUIKitDelegate = objc_getClass("WebDefaultUIKitDelegate");
if (access("/tmp/.cydia.fw", F_OK) == 0) {
unlink("/tmp/.cydia.fw");
goto firmware;
- } else if (access("/User", F_OK) != 0 || version < 1) {
+ } else if (access("/User", F_OK) != 0 || version < 2) {
firmware:
_trace();
system("/usr/libexec/cydia/firmware.sh");