2
0

Fix unlock screen when MOC unavailable.

[REMOVED]   Disable TestFlight for release, it doesn't work anyway.
[FIXED]     Properly handle unlock screen when there is no MOC yet.
[FIXED]     Some log statements format strings & arguments.
This commit is contained in:
Maarten Billemont 2012-08-04 23:15:50 +02:00
parent 553a14dced
commit c928b1ca2c
8 changed files with 105 additions and 85 deletions

2
External/Pearl vendored

@ -1 +1 @@
Subproject commit f81514bfd87773c6b1ea202520d75841c159ce9f Subproject commit cc97c1be4c0f2ee0080af417940244ac8f3e5f47

View File

@ -192,7 +192,7 @@
return nil; return nil;
if (!(element.type & MPElementTypeClassGenerated)) { if (!(element.type & MPElementTypeClassGenerated)) {
err(@"Incorrect type (is not MPElementTypeClassGenerated): %d, for: %@", [self nameOfType:element.type], element.name); err(@"Incorrect type (is not MPElementTypeClassGenerated): %@, for: %@", [self nameOfType:element.type], element.name);
return nil; return nil;
} }
if (!element.name.length) { if (!element.name.length) {

View File

@ -54,7 +54,7 @@
return nil; return nil;
if (!(element.type & MPElementTypeClassGenerated)) { if (!(element.type & MPElementTypeClassGenerated)) {
err(@"Incorrect type (is not MPElementTypeClassGenerated): %d, for: %@", [self nameOfType:element.type], element.name); err(@"Incorrect type (is not MPElementTypeClassGenerated): %@, for: %@", [self nameOfType:element.type], element.name);
return nil; return nil;
} }
if (!element.name.length) { if (!element.name.length) {

View File

@ -34,7 +34,7 @@
[MPiOSConfig get]; [MPiOSConfig get];
#ifdef DEBUG #ifdef DEBUG
[PearlLogger get].autoprintLevel = PearlLogLevelDebug; [PearlLogger get].printLevel = PearlLogLevelDebug;
//[NSClassFromString(@"WebView") performSelector:NSSelectorFromString(@"_enableRemoteInspector")]; //[NSClassFromString(@"WebView") performSelector:NSSelectorFromString(@"_enableRemoteInspector")];
#endif #endif
} }
@ -49,16 +49,14 @@
[[[NSBundle mainBundle] mutableInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"]; [[[NSBundle mainBundle] mutableInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"];
[[[NSBundle mainBundle] mutableLocalizedInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"]; [[[NSBundle mainBundle] mutableLocalizedInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"];
#ifdef ADHOC
@try { @try {
NSString *testFlightToken = [self testFlightToken]; NSString *testFlightToken = [self testFlightToken];
if ([testFlightToken length]) { if ([testFlightToken length]) {
inf(@"Initializing TestFlight"); inf(@"Initializing TestFlight");
[TestFlight addCustomEnvironmentInformation:@"Anonymous" forKey:@"username"]; [TestFlight addCustomEnvironmentInformation:@"Anonymous" forKey:@"username"];
#ifdef ADHOC
[TestFlight setDeviceIdentifier:[(id)[UIDevice currentDevice] uniqueIdentifier]]; [TestFlight setDeviceIdentifier:[(id)[UIDevice currentDevice] uniqueIdentifier]];
#else // [TestFlight setDeviceIdentifier:[PearlKeyChain deviceIdentifier]];
[TestFlight setDeviceIdentifier:[PearlKeyChain deviceIdentifier]];
#endif
[TestFlight setOptions:[NSDictionary dictionaryWithObjectsAndKeys: [TestFlight setOptions:[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], @"logToConsole", [NSNumber numberWithBool:NO], @"logToConsole",
[NSNumber numberWithBool:NO], @"logToSTDERR", [NSNumber numberWithBool:NO], @"logToSTDERR",
@ -81,6 +79,7 @@
@catch (id exception) { @catch (id exception) {
err(@"TestFlight: %@", exception); err(@"TestFlight: %@", exception);
} }
#endif
@try { @try {
NSString *crashlyticsAPIKey = [self crashlyticsAPIKey]; NSString *crashlyticsAPIKey = [self crashlyticsAPIKey];
if ([crashlyticsAPIKey length]) { if ([crashlyticsAPIKey length]) {
@ -115,13 +114,13 @@
[[LocalyticsSession sharedLocalyticsSession] startSession:localyticsKey]; [[LocalyticsSession sharedLocalyticsSession] startSession:localyticsKey];
[[PearlLogger get] registerListener:^BOOL(PearlLogMessage *message) { [[PearlLogger get] registerListener:^BOOL(PearlLogMessage *message) {
if (message.level >= PearlLogLevelWarn) if (message.level >= PearlLogLevelWarn)
[[LocalyticsSession sharedLocalyticsSession] tagEvent:@"Problem" attributes: [[LocalyticsSession sharedLocalyticsSession] tagEvent:@"Problem"
[NSDictionary dictionaryWithObjectsAndKeys: attributes:[NSDictionary
[message levelDescription], dictionaryWithObjectsAndKeys:
@"level", [NSString stringWithCString:PearlLogLevelStr(message.level)
message.message, encoding:NSASCIIStringEncoding], @"level",
@"message", message.message, @"message",
nil]]; nil]];
return YES; return YES;
}]; }];
@ -155,7 +154,7 @@
[NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset, [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset,
[UIFont fontWithName:@"Helvetica-Neue" size:0.0f], UITextAttributeFont, [UIFont fontWithName:@"Helvetica-Neue" size:0.0f], UITextAttributeFont,
nil] nil]
forState:UIControlStateNormal]; forState:UIControlStateNormal];
UIImage *toolBarImage = [[UIImage imageNamed:@"ui_toolbar_container"] resizableImageWithCapInsets:UIEdgeInsetsMake(25, 5, 5, 5)]; UIImage *toolBarImage = [[UIImage imageNamed:@"ui_toolbar_container"] resizableImageWithCapInsets:UIEdgeInsetsMake(25, 5, 5, 5)];
[[UISearchBar appearance] setBackgroundImage:toolBarImage]; [[UISearchBar appearance] setBackgroundImage:toolBarImage];
@ -190,7 +189,7 @@
[self.navigationController performSegueWithIdentifier:@"MP_Unlock" sender:nil]; [self.navigationController performSegueWithIdentifier:@"MP_Unlock" sender:nil];
else else
[self.navigationController presentViewController:[self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"MPUnlockViewController"] [self.navigationController presentViewController:[self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"MPUnlockViewController"]
animated:NO completion:nil]; animated:NO completion:nil];
}]; }];
[[NSNotificationCenter defaultCenter] addObserverForName:kIASKAppSettingChanged object:nil queue:nil [[NSNotificationCenter defaultCenter] addObserverForName:kIASKAppSettingChanged object:nil queue:nil
usingBlock:^(NSNotification *note) { usingBlock:^(NSNotification *note) {
@ -224,7 +223,7 @@
__autoreleasing NSError *error; __autoreleasing NSError *error;
__autoreleasing NSURLResponse *response; __autoreleasing NSURLResponse *response;
NSData *importedSitesData = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url] NSData *importedSitesData = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url]
returningResponse:&response error:&error]; returningResponse:&response error:&error];
if (error) if (error)
err(@"While reading imported sites from %@: %@", url, error); err(@"While reading imported sites from %@: %@", url, error);
if (!importedSitesData) if (!importedSitesData)
@ -237,33 +236,33 @@
^(UIAlertView *alert, NSInteger buttonIndex) { ^(UIAlertView *alert, NSInteger buttonIndex) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
MPImportResult result = [self importSites:importedSitesString withPassword:[alert textFieldAtIndex:0].text MPImportResult result = [self importSites:importedSitesString withPassword:[alert textFieldAtIndex:0].text
askConfirmation:^BOOL(NSUInteger importCount, NSUInteger deleteCount) { askConfirmation:^BOOL(NSUInteger importCount, NSUInteger deleteCount) {
__block BOOL confirmation = NO; __block BOOL confirmation = NO;
dispatch_group_t confirmationGroup = dispatch_group_create(); dispatch_group_t confirmationGroup = dispatch_group_create();
dispatch_group_enter(confirmationGroup); dispatch_group_enter(confirmationGroup);
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[PearlAlert showAlertWithTitle:@"Import Sites?" [PearlAlert showAlertWithTitle:@"Import Sites?"
message:PearlString( message:PearlString(
@"Import %d sites, overwriting %d existing sites?", @"Import %d sites, overwriting %d existing sites?",
importCount, deleteCount) importCount, deleteCount)
viewStyle:UIAlertViewStyleDefault viewStyle:UIAlertViewStyleDefault
initAlert:nil initAlert:nil
tappedButtonBlock:^(UIAlertView *alert_, NSInteger buttonIndex_) { tappedButtonBlock:^(UIAlertView *alert_, NSInteger buttonIndex_) {
if (buttonIndex_ if (buttonIndex_
!= [alert_ cancelButtonIndex]) != [alert_ cancelButtonIndex])
confirmation = YES; confirmation = YES;
dispatch_group_leave(confirmationGroup); dispatch_group_leave(confirmationGroup);
} }
cancelTitle:[PearlStrings get].commonButtonCancel cancelTitle:[PearlStrings get].commonButtonCancel
otherTitles:@"Import", nil]; otherTitles:@"Import", nil];
}); });
dispatch_group_wait( dispatch_group_wait(
confirmationGroup, DISPATCH_TIME_FOREVER); confirmationGroup, DISPATCH_TIME_FOREVER);
return confirmation; return confirmation;
}]; }];
switch (result) { switch (result) {
case MPImportResultSuccess: case MPImportResultSuccess:
@ -281,15 +280,15 @@
} }
}); });
} }
cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:@"Unlock File", nil]; cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:@"Unlock File", nil];
return YES; return YES;
} }
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
wrn(@"Received memory warning."); wrn(@"Received memory warning.");
[super applicationDidReceiveMemoryWarning:application]; [super applicationDidReceiveMemoryWarning:application];
} }
@ -352,8 +351,8 @@
if ([[MPConfig get].iCloud boolValue] != [self.storeManager iCloudEnabled]) if ([[MPConfig get].iCloud boolValue] != [self.storeManager iCloudEnabled])
[self.storeManager useiCloudStore:[[MPConfig get].iCloud boolValue] alertUser:YES]; [self.storeManager useiCloudStore:[[MPConfig get].iCloud boolValue] alertUser:YES];
if ([[MPiOSConfig get].sendInfo boolValue]) { if ([[MPiOSConfig get].sendInfo boolValue]) {
if ([PearlLogger get].autoprintLevel > PearlLogLevelInfo) if ([PearlLogger get].printLevel > PearlLogLevelInfo)
[PearlLogger get].autoprintLevel = PearlLogLevelInfo; [PearlLogger get].printLevel = PearlLogLevelInfo;
[[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].rememberLogin boolValue] forKey:@"rememberLogin"]; [[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].rememberLogin boolValue] forKey:@"rememberLogin"];
[[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].iCloud boolValue] forKey:@"iCloud"]; [[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].iCloud boolValue] forKey:@"iCloud"];
@ -396,11 +395,14 @@
? @"YES": @"NO", @"showQuickStart", ? @"YES": @"NO", @"showQuickStart",
[[PearlConfig get].firstRun boolValue] [[PearlConfig get].firstRun boolValue]
? @"YES": @"NO", @"firstRun", ? @"YES": @"NO", @"firstRun",
[[PearlConfig get].launchCount description], @"launchCount", [[PearlConfig get].launchCount description],
@"launchCount",
[[PearlConfig get].askForReviews boolValue] [[PearlConfig get].askForReviews boolValue]
? @"YES": @"NO", @"askForReviews", ? @"YES": @"NO", @"askForReviews",
[[PearlConfig get].reviewAfterLaunches description], @"reviewAfterLaunches", [[PearlConfig get].reviewAfterLaunches description],
[PearlConfig get].reviewedVersion, @"reviewedVersion", @"reviewAfterLaunches",
[PearlConfig get].reviewedVersion,
@"reviewedVersion",
nil]]; nil]];
} }
} }
@ -433,8 +435,8 @@
if (buttonIndex_ == [alert_ firstOtherButtonIndex] + 1) if (buttonIndex_ == [alert_ firstOtherButtonIndex] + 1)
// Show Passwords // Show Passwords
[self exportShowPasswords:YES]; [self exportShowPasswords:YES];
} cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:@"Safe Export", @"Show Passwords", nil]; } cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:@"Safe Export", @"Show Passwords", nil];
} otherTitles:nil]; } otherTitles:nil];
} }
- (void)exportShowPasswords:(BOOL)showPasswords { - (void)exportShowPasswords:(BOOL)showPasswords {
@ -442,11 +444,10 @@
if (![MFMailComposeViewController canSendMail]) { if (![MFMailComposeViewController canSendMail]) {
[PearlAlert showAlertWithTitle:@"Cannot Send Mail" [PearlAlert showAlertWithTitle:@"Cannot Send Mail"
message: message:
@"Your device is not yet set up for sending mail.\n" @"Your device is not yet set up for sending mail.\n"
@"Close Master Password, go into Settings and add a Mail account." @"Close Master Password, go into Settings and add a Mail account."
viewStyle:UIAlertViewStyleDefault viewStyle:UIAlertViewStyleDefault
initAlert:nil tappedButtonBlock:nil initAlert:nil tappedButtonBlock:nil cancelTitle:[PearlStrings get].commonButtonOkay
cancelTitle:[PearlStrings get].commonButtonOkay
otherTitles:nil]; otherTitles:nil];
return; return;
} }
@ -456,18 +457,18 @@
if (showPasswords) if (showPasswords)
message = PearlString(@"Export of Master Password sites with passwords included.\n" message = PearlString(@"Export of Master Password sites with passwords included.\n"
@"REMINDER: Make sure nobody else sees this file! Passwords are visible!\n\n\n" @"REMINDER: Make sure nobody else sees this file! Passwords are visible!\n\n\n"
@"--\n" @"--\n"
@"%@\n" @"%@\n"
@"Master Password %@, build %@", @"Master Password %@, build %@",
self.activeUser.name, self.activeUser.name,
[PearlInfoPlist get].CFBundleShortVersionString, [PearlInfoPlist get].CFBundleShortVersionString,
[PearlInfoPlist get].CFBundleVersion); [PearlInfoPlist get].CFBundleVersion);
else else
message = PearlString(@"Backup of Master Password sites.\n\n\n" message = PearlString(@"Backup of Master Password sites.\n\n\n"
@"--\n" @"--\n"
@"%@\n" @"%@\n"
@"Master Password %@, build %@", @"Master Password %@, build %@",
self.activeUser.name, self.activeUser.name,
[PearlInfoPlist get].CFBundleShortVersionString, [PearlInfoPlist get].CFBundleShortVersionString,
[PearlInfoPlist get].CFBundleVersion); [PearlInfoPlist get].CFBundleVersion);
@ -481,13 +482,13 @@
[composer setMessageBody:message isHTML:NO]; [composer setMessageBody:message isHTML:NO];
[composer addAttachmentData: [composer addAttachmentData:
[exportedSites dataUsingEncoding:NSUTF8StringEncoding] mimeType:@"text/plain" [exportedSites dataUsingEncoding:NSUTF8StringEncoding] mimeType:@"text/plain"
fileName:PearlString(@"%@ (%@).mpsites", fileName:PearlString(@"%@ (%@).mpsites",
self.activeUser.name, self.activeUser.name,
[exportDateFormatter stringFromDate:[NSDate date]])]; [exportDateFormatter stringFromDate:[NSDate date]])];
[self.window.rootViewController presentModalViewController:composer animated:YES]; [self.window.rootViewController presentModalViewController:composer animated:YES];
} }
- (void)changeMasterPasswordFor:(MPUserEntity *)user didResetBlock:(void(^)(void))didReset { - (void)changeMasterPasswordFor:(MPUserEntity *)user didResetBlock:(void (^)(void))didReset {
[PearlAlert showAlertWithTitle:@"Changing Master Password" [PearlAlert showAlertWithTitle:@"Changing Master Password"
message: message:
@ -508,11 +509,10 @@
didReset(); didReset();
[TestFlight passCheckpoint:MPCheckpointChangeMP]; [TestFlight passCheckpoint:MPCheckpointChangeMP];
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointChangeMP [[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointChangeMP attributes:nil];
attributes:nil];
} }
cancelTitle:[PearlStrings get].commonButtonAbort cancelTitle:[PearlStrings get].commonButtonAbort
otherTitles:[PearlStrings get].commonButtonContinue, nil]; otherTitles:[PearlStrings get].commonButtonContinue, nil];
} }
#pragma mark - PearlConfigDelegate #pragma mark - PearlConfigDelegate
@ -540,7 +540,7 @@
tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) { tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
if (buttonIndex == [alert firstOtherButtonIndex]) if (buttonIndex == [alert firstOtherButtonIndex])
return; return;
} otherTitles:@"Retry", nil]; } otherTitles:@"Retry", nil];
return; return;
case MFMailComposeResultCancelled: case MFMailComposeResultCancelled:
break; break;
@ -581,7 +581,7 @@
initAlert:nil tappedButtonBlock:^(UIAlertView *alert_, NSInteger buttonIndex_) { initAlert:nil tappedButtonBlock:^(UIAlertView *alert_, NSInteger buttonIndex_) {
[self ubiquityStoreManager:manager didSwitchToiCloud:iCloudEnabled]; [self ubiquityStoreManager:manager didSwitchToiCloud:iCloudEnabled];
} }
cancelTitle:[PearlStrings get].commonButtonThanks otherTitles:nil]; cancelTitle:[PearlStrings get].commonButtonThanks otherTitles:nil];
return; return;
} }
@ -590,7 +590,7 @@
return; return;
if (buttonIndex == [alert firstOtherButtonIndex] + 1) if (buttonIndex == [alert firstOtherButtonIndex] + 1)
[manager useiCloudStore:YES alertUser:NO]; [manager useiCloudStore:YES alertUser:NO];
} cancelTitle:@"Leave iCloud Off" otherTitles:@"Explain?", @"Enable iCloud", nil]; } cancelTitle:@"Leave iCloud Off" otherTitles:@"Explain?", @"Enable iCloud", nil];
} }
} }
} }

View File

@ -19,11 +19,12 @@
@property (weak, nonatomic) IBOutlet UILabel *oldNameLabel; @property (weak, nonatomic) IBOutlet UILabel *oldNameLabel;
@property (weak, nonatomic) IBOutlet UIButton *avatarTemplate; @property (weak, nonatomic) IBOutlet UIButton *avatarTemplate;
@property (weak, nonatomic) IBOutlet UIView *createPasswordTipView; @property (weak, nonatomic) IBOutlet UIView *createPasswordTipView;
@property (weak, nonatomic) IBOutlet UILabel *deleteTip; @property (weak, nonatomic) IBOutlet UILabel *tip;
@property (weak, nonatomic) IBOutlet UIView *passwordTipView; @property (weak, nonatomic) IBOutlet UIView *passwordTipView;
@property (weak, nonatomic) IBOutlet UILabel *passwordTipLabel; @property (weak, nonatomic) IBOutlet UILabel *passwordTipLabel;
@property (weak, nonatomic) IBOutlet UIView *wordWall; @property (weak, nonatomic) IBOutlet UIView *wordWall;
@property (strong, nonatomic) IBOutlet UILongPressGestureRecognizer *targetedUserActionGesture; @property (strong, nonatomic) IBOutlet UILongPressGestureRecognizer *targetedUserActionGesture;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *loadingUsersIndicator;
@property (nonatomic, strong) UIColor *avatarShadowColor; @property (nonatomic, strong) UIColor *avatarShadowColor;

View File

@ -34,11 +34,12 @@
@synthesize nameLabel, oldNameLabel; @synthesize nameLabel, oldNameLabel;
@synthesize avatarTemplate; @synthesize avatarTemplate;
@synthesize createPasswordTipView; @synthesize createPasswordTipView;
@synthesize deleteTip; @synthesize tip;
@synthesize passwordTipView; @synthesize passwordTipView;
@synthesize passwordTipLabel; @synthesize passwordTipLabel;
@synthesize wordWall; @synthesize wordWall;
@synthesize targetedUserActionGesture; @synthesize targetedUserActionGesture;
@synthesize loadingUsersIndicator;
@synthesize avatarShadowColor = _avatarShadowColor; @synthesize avatarShadowColor = _avatarShadowColor;
@synthesize wordWallAnimating = _wordWallAnimating; @synthesize wordWallAnimating = _wordWallAnimating;
@synthesize wordList = _wordList; @synthesize wordList = _wordList;
@ -154,6 +155,8 @@
[self updateUsers]; [self updateUsers];
}]; }];
[self updateLayoutAnimated:NO allowScroll:YES completion:nil];
[super viewDidLoad]; [super viewDidLoad];
} }
@ -165,13 +168,14 @@
[self setAvatarsView:nil]; [self setAvatarsView:nil];
[self setNameLabel:nil]; [self setNameLabel:nil];
[self setAvatarTemplate:nil]; [self setAvatarTemplate:nil];
[self setDeleteTip:nil]; [self setTip:nil];
[self setPasswordTipView:nil]; [self setPasswordTipView:nil];
[self setPasswordTipLabel:nil]; [self setPasswordTipLabel:nil];
[self setTargetedUserActionGesture:nil]; [self setTargetedUserActionGesture:nil];
[self setWordWall:nil]; [self setWordWall:nil];
[self setCreatePasswordTipView:nil]; [self setCreatePasswordTipView:nil];
[self setPasswordFieldLabel:nil]; [self setPasswordFieldLabel:nil];
[self setLoadingUsersIndicator:nil];
[super viewDidUnload]; [super viewDidUnload];
} }
@ -202,9 +206,19 @@
- (void)updateUsers { - (void)updateUsers {
NSManagedObjectContext *moc = [MPAppDelegate managedObjectContextIfReady];
if (!moc) {
self.tip.text = @"Loading...";
[self.loadingUsersIndicator startAnimating];
return;
}
self.tip.text = @"Tap and hold to delete or reset.";
[self.loadingUsersIndicator stopAnimating];
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([MPUserEntity class])]; NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([MPUserEntity class])];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"lastUsed" ascending:NO]]; fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"lastUsed" ascending:NO]];
NSArray *users = [[MPAppDelegate managedObjectContextIfReady] executeFetchRequest:fetchRequest error:nil]; NSArray *users = [moc executeFetchRequest:fetchRequest error:nil];
// Clean up avatars. // Clean up avatars.
for (UIView *subview in [self.avatarsView subviews]) for (UIView *subview in [self.avatarsView subviews])
@ -390,7 +404,6 @@
self.nameLabel.backgroundColor = [UIColor blackColor]; self.nameLabel.backgroundColor = [UIColor blackColor];
self.oldNameLabel.center = self.nameLabel.center; self.oldNameLabel.center = self.nameLabel.center;
self.avatarShadowColor = [UIColor whiteColor]; self.avatarShadowColor = [UIColor whiteColor];
self.deleteTip.alpha = 0;
} else } else
if (!self.selectedUser && self.passwordView.alpha == 1) { if (!self.selectedUser && self.passwordView.alpha == 1) {
// User was just deselected. // User was just deselected.
@ -402,7 +415,6 @@
self.nameLabel.backgroundColor = [UIColor clearColor]; self.nameLabel.backgroundColor = [UIColor clearColor];
self.oldNameLabel.center = self.nameLabel.center; self.oldNameLabel.center = self.nameLabel.center;
self.avatarShadowColor = [UIColor lightGrayColor]; self.avatarShadowColor = [UIColor lightGrayColor];
self.deleteTip.alpha = 0.5;
} }
// Lay out the word wall. // Lay out the word wall.
@ -463,7 +475,7 @@
} }
// Lay out user name label. // Lay out user name label.
self.nameLabel.text = targetedUser? targetedUser.name: @"New User"; self.nameLabel.text = targetedAvatar? targetedUser? targetedUser.name: @"New User": nil;
self.nameLabel.bounds = CGRectSetHeight(self.nameLabel.bounds, self.nameLabel.bounds = CGRectSetHeight(self.nameLabel.bounds,
[self.nameLabel.text sizeWithFont:self.nameLabel.font [self.nameLabel.text sizeWithFont:self.nameLabel.font
constrainedToSize:CGSizeMake(self.nameLabel.bounds.size.width - 10, 100) constrainedToSize:CGSizeMake(self.nameLabel.bounds.size.width - 10, 100)

View File

@ -1414,6 +1414,10 @@ You could use the word wall for inspiration in finding a memorable master passw
</subviews> </subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view> </view>
<activityIndicatorView opaque="NO" contentMode="scaleToFill" hidesWhenStopped="YES" animating="YES" style="whiteLarge" id="XuP-pi-ygN">
<rect key="frame" x="142" y="415" width="37" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
</activityIndicatorView>
</subviews> </subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view> </view>
@ -1422,7 +1426,8 @@ You could use the word wall for inspiration in finding a memorable master passw
<outlet property="avatarTemplate" destination="Ten-ig-gog" id="0ZZ-z5-d5m"/> <outlet property="avatarTemplate" destination="Ten-ig-gog" id="0ZZ-z5-d5m"/>
<outlet property="avatarsView" destination="Blg-F1-9NA" id="2NL-jU-IMI"/> <outlet property="avatarsView" destination="Blg-F1-9NA" id="2NL-jU-IMI"/>
<outlet property="createPasswordTipView" destination="xWL-xQ-KjX" id="Pa1-Bk-pW2"/> <outlet property="createPasswordTipView" destination="xWL-xQ-KjX" id="Pa1-Bk-pW2"/>
<outlet property="deleteTip" destination="DBJ-Qi-ZcF" id="VXD-Zc-UYi"/> <outlet property="tip" destination="DBJ-Qi-ZcF" id="VXD-Zc-UYi"/>
<outlet property="loadingUsersIndicator" destination="XuP-pi-ygN" id="idh-aH-sDL"/>
<outlet property="nameLabel" destination="0NM-NI-7UR" id="GBg-Ry-sqj"/> <outlet property="nameLabel" destination="0NM-NI-7UR" id="GBg-Ry-sqj"/>
<outlet property="oldNameLabel" destination="8s0-nT-Aoq" id="plu-1H-MVc"/> <outlet property="oldNameLabel" destination="8s0-nT-Aoq" id="plu-1H-MVc"/>
<outlet property="passwordField" destination="rTR-7Q-X8o" id="Vsn-uO-4lO"/> <outlet property="passwordField" destination="rTR-7Q-X8o" id="Vsn-uO-4lO"/>
@ -1853,6 +1858,7 @@ You could use the word wall for inspiration in finding a memorable master passw
<relationship kind="action" name="incrementPasswordCounter"/> <relationship kind="action" name="incrementPasswordCounter"/>
<relationship kind="action" name="infoOutdatedAlert"/> <relationship kind="action" name="infoOutdatedAlert"/>
<relationship kind="action" name="resetPasswordCounter:" candidateClass="UILongPressGestureRecognizer"/> <relationship kind="action" name="resetPasswordCounter:" candidateClass="UILongPressGestureRecognizer"/>
<relationship kind="action" name="searchOutdatedElements"/>
<relationship kind="action" name="toggleUser"/> <relationship kind="action" name="toggleUser"/>
<relationship kind="action" name="upgradePassword"/> <relationship kind="action" name="upgradePassword"/>
<relationship kind="outlet" name="actionsTipContainer" candidateClass="UIView"/> <relationship kind="outlet" name="actionsTipContainer" candidateClass="UIView"/>
@ -1922,7 +1928,8 @@ You could use the word wall for inspiration in finding a memorable master passw
<relationship kind="outlet" name="avatarTemplate" candidateClass="UIButton"/> <relationship kind="outlet" name="avatarTemplate" candidateClass="UIButton"/>
<relationship kind="outlet" name="avatarsView" candidateClass="UIScrollView"/> <relationship kind="outlet" name="avatarsView" candidateClass="UIScrollView"/>
<relationship kind="outlet" name="createPasswordTipView" candidateClass="UIView"/> <relationship kind="outlet" name="createPasswordTipView" candidateClass="UIView"/>
<relationship kind="outlet" name="deleteTip" candidateClass="UILabel"/> <relationship kind="outlet" name="tip" candidateClass="UILabel"/>
<relationship kind="outlet" name="loadingUsersIndicator" candidateClass="UIActivityIndicatorView"/>
<relationship kind="outlet" name="nameLabel" candidateClass="UILabel"/> <relationship kind="outlet" name="nameLabel" candidateClass="UILabel"/>
<relationship kind="outlet" name="oldNameLabel" candidateClass="UILabel"/> <relationship kind="outlet" name="oldNameLabel" candidateClass="UILabel"/>
<relationship kind="outlet" name="passwordField" candidateClass="UITextField"/> <relationship kind="outlet" name="passwordField" candidateClass="UITextField"/>
@ -1944,4 +1951,4 @@ You could use the word wall for inspiration in finding a memorable master passw
<inferredMetricsTieBreakers> <inferredMetricsTieBreakers>
<segue reference="9Bs-cD-ddF"/> <segue reference="9Bs-cD-ddF"/>
</inferredMetricsTieBreakers> </inferredMetricsTieBreakers>
</document> </document>

View File

@ -13,7 +13,7 @@
- (void)setUp - (void)setUp
{ {
dbg(@"======================= TEST SET-UP ======================"); dbg(@"======================= TEST SET-UP ======================");
[PearlLogger get].autoprintLevel = PearlLogLevelTrace; [PearlLogger get].printLevel = PearlLogLevelTrace;
[super setUp]; [super setUp];