diff --git a/External/Pearl b/External/Pearl index ba3f080a..da89089f 160000 --- a/External/Pearl +++ b/External/Pearl @@ -1 +1 @@ -Subproject commit ba3f080a2c5645d3e4af4de1c71a7b7c4420c626 +Subproject commit da89089f2900ab8990a61f549d061f36325a4e41 diff --git a/External/iOS/Crashlytics.framework/Modules/module.modulemap b/External/iOS/Crashlytics.framework/Modules/module.modulemap new file mode 100644 index 00000000..e552e9ca --- /dev/null +++ b/External/iOS/Crashlytics.framework/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module Crashlytics { + umbrella header "Crashlytics.h" + + export * + module * { export * } +} diff --git a/External/iOS/Crashlytics.framework/Versions/A/Crashlytics b/External/iOS/Crashlytics.framework/Versions/A/Crashlytics index 552e04bb..301497d3 100644 Binary files a/External/iOS/Crashlytics.framework/Versions/A/Crashlytics and b/External/iOS/Crashlytics.framework/Versions/A/Crashlytics differ diff --git a/External/iOS/Crashlytics.framework/Versions/A/Resources/Info.plist b/External/iOS/Crashlytics.framework/Versions/A/Resources/Info.plist index 48c7bd50..14505b8a 100644 --- a/External/iOS/Crashlytics.framework/Versions/A/Resources/Info.plist +++ b/External/iOS/Crashlytics.framework/Versions/A/Resources/Info.plist @@ -15,13 +15,13 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.2.2 + 2.2.4 CFBundleSupportedPlatforms iPhoneOS CFBundleVersion - 36 + 38 DTPlatformName iphoneos MinimumOSVersion diff --git a/External/iOS/Crashlytics.framework/run b/External/iOS/Crashlytics.framework/run index 42c401d3..9ab42065 100755 Binary files a/External/iOS/Crashlytics.framework/run and b/External/iOS/Crashlytics.framework/run differ diff --git a/External/iOS/Crashlytics.framework/submit b/External/iOS/Crashlytics.framework/submit index 3febb780..a74ed3bb 100755 Binary files a/External/iOS/Crashlytics.framework/submit and b/External/iOS/Crashlytics.framework/submit differ diff --git a/MasterPassword/ObjC/MPAlgorithm.h b/MasterPassword/ObjC/MPAlgorithm.h index b8f356fb..2c49452d 100644 --- a/MasterPassword/ObjC/MPAlgorithm.h +++ b/MasterPassword/ObjC/MPAlgorithm.h @@ -62,7 +62,7 @@ NSString *NSStringFromTimeToCrack(TimeToCrack timeToCrack); - (NSString *)generateContentNamed:(NSString *)name ofType:(MPElementType)type withCounter:(NSUInteger)counter usingKey:(MPKey *)key; - (NSString *)storedContentForElement:(MPElementStoredEntity *)element usingKey:(MPKey *)key; -- (void)saveContent:(NSString *)clearContent toElement:(MPElementEntity *)element usingKey:(MPKey *)elementKey; +- (BOOL)saveContent:(NSString *)clearContent toElement:(MPElementEntity *)element usingKey:(MPKey *)elementKey; - (NSString *)resolveContentForElement:(MPElementEntity *)element usingKey:(MPKey *)elementKey; - (void)resolveContentForElement:(MPElementEntity *)element usingKey:(MPKey *)elementKey result:(void (^)(NSString *result))resultBlock; diff --git a/MasterPassword/ObjC/MPAlgorithmV0.m b/MasterPassword/ObjC/MPAlgorithmV0.m index 815f4b51..749d08e0 100644 --- a/MasterPassword/ObjC/MPAlgorithmV0.m +++ b/MasterPassword/ObjC/MPAlgorithmV0.m @@ -369,7 +369,7 @@ return [self decryptContent:element.contentObject usingKey:key]; } -- (void)saveContent:(NSString *)clearContent toElement:(MPElementEntity *)element usingKey:(MPKey *)elementKey { +- (BOOL)saveContent:(NSString *)clearContent toElement:(MPElementEntity *)element usingKey:(MPKey *)elementKey { NSAssert( [elementKey.keyID isEqualToData:element.user.keyID], @"Element does not belong to current user." ); switch (element.type) { @@ -380,26 +380,29 @@ case MPElementTypeGeneratedShort: case MPElementTypeGeneratedPIN: { NSAssert( NO, @"Cannot save content to element with generated type %lu.", (long)element.type ); - break; + return NO; } case MPElementTypeStoredPersonal: { if (![element isKindOfClass:[MPElementStoredEntity class]]) { wrn( @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type, [element class] ); - break; + return NO; } NSData *encryptedContent = [[clearContent dataUsingEncoding:NSUTF8StringEncoding] encryptWithSymmetricKey:[elementKey subKeyOfLength:PearlCryptKeySize].keyData padding:YES]; + if ([((MPElementStoredEntity *)element).contentObject isEqualToData:encryptedContent]) + return NO; + ((MPElementStoredEntity *)element).contentObject = encryptedContent; - break; + return YES; } case MPElementTypeStoredDevicePrivate: { if (![element isKindOfClass:[MPElementStoredEntity class]]) { wrn( @"Element with stored type %lu is not an MPElementStoredEntity, but a %@.", (long)element.type, [element class] ); - break; + return NO; } NSData *encryptedContent = [[clearContent dataUsingEncoding:NSUTF8StringEncoding] @@ -415,9 +418,11 @@ #endif }]; ((MPElementStoredEntity *)element).contentObject = nil; - break; + return YES; } } + + Throw( @"Unsupported type: %d", element.type ); } - (NSString *)resolveContentForElement:(MPElementEntity *)element usingKey:(MPKey *)elementKey { diff --git a/MasterPassword/ObjC/MPAppDelegate_Key.m b/MasterPassword/ObjC/MPAppDelegate_Key.m index fcc99508..5d86146c 100644 --- a/MasterPassword/ObjC/MPAppDelegate_Key.m +++ b/MasterPassword/ObjC/MPAppDelegate_Key.m @@ -143,8 +143,8 @@ static NSDictionary *keyQuery(MPUserEntity *user) { } user.lastUsed = [NSDate date]; - [moc saveToStore]; self.activeUser = user; + [moc saveToStore]; // Perform a data sanity check now that we're logged in as the user to allow fixes that require the user's key. if ([[MPConfig get].checkInconsistency boolValue]) diff --git a/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj index 934bdbdc..34d4a1ce 100644 --- a/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj +++ b/MasterPassword/ObjC/Mac/MasterPassword-Mac.xcodeproj/project.pbxproj @@ -48,6 +48,7 @@ DA3B8452190FC86F00246EEA /* NSManagedObject+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3B8450190FC86F00246EEA /* NSManagedObject+Pearl.m */; }; DA3B8453190FC86F00246EEA /* NSManagedObject+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3B8451190FC86F00246EEA /* NSManagedObject+Pearl.h */; }; DA3B8456190FC89700246EEA /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3B8454190FC89700246EEA /* MPFixable.m */; }; + DA3BCFCD19BD09E0006B2681 /* SourceCodePro-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */; }; DA4425CC1557BED40052177D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; }; DA4DA1D91564471A00F6F596 /* libjrswizzle.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC6326C148680650075AEA5 /* libjrswizzle.a */; }; DA5E5C9417248AA1003798D8 /* libscryptenc-osx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5E5C8717248AA1003798D8 /* libscryptenc-osx.a */; }; @@ -275,6 +276,7 @@ DA3B8451190FC86F00246EEA /* NSManagedObject+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObject+Pearl.h"; sourceTree = ""; }; DA3B8454190FC89700246EEA /* MPFixable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFixable.m; sourceTree = ""; }; DA3B8455190FC89700246EEA /* MPFixable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFixable.h; sourceTree = ""; }; + DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceCodePro-Regular.otf"; sourceTree = ""; }; DA4425CB1557BED40052177D /* libUbiquityStoreManager.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libUbiquityStoreManager.a; sourceTree = BUILT_PRODUCTS_DIR; }; DA5BFA44147E415C00F98B1E /* Master Password.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Master Password.app"; sourceTree = BUILT_PRODUCTS_DIR; }; DA5BFA4A147E415C00F98B1E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -1607,6 +1609,7 @@ DACA268A1705DF81002C6C22 /* Fonts */ = { isa = PBXGroup; children = ( + DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */, DAF4EF52190A828100023C90 /* Exo2.0-Thin.otf */, DAF4EF53190A828100023C90 /* Exo2.0-Regular.otf */, DAF4EF54190A828100023C90 /* Exo2.0-ExtraBold.otf */, @@ -2041,6 +2044,7 @@ DACA27301705DF81002C6C22 /* avatar-18.png in Resources */, DACA27311705DF81002C6C22 /* avatar-4.png in Resources */, DAF4EF58190A828100023C90 /* Exo2.0-ExtraBold.otf in Resources */, + DA3BCFCD19BD09E0006B2681 /* SourceCodePro-Regular.otf in Resources */, DAF4EF56190A828100023C90 /* Exo2.0-Thin.otf in Resources */, DACA27321705DF81002C6C22 /* avatar-16.png in Resources */, DACA27331705DF81002C6C22 /* avatar-12@2x.png in Resources */, diff --git a/MasterPassword/ObjC/iOS/MPPasswordCell.m b/MasterPassword/ObjC/iOS/MPPasswordCell.m index c325d65e..e8ea4ce2 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordCell.m +++ b/MasterPassword/ObjC/iOS/MPPasswordCell.m @@ -24,17 +24,17 @@ @property(nonatomic, strong) IBOutlet UILabel *siteNameLabel; @property(nonatomic, strong) IBOutlet UITextField *passwordField; +@property(nonatomic, strong) IBOutlet UIView *loginNameContainer; @property(nonatomic, strong) IBOutlet UITextField *loginNameField; -@property(nonatomic, strong) IBOutlet UIPageControl *pageControl; @property(nonatomic, strong) IBOutlet UILabel *strengthLabel; @property(nonatomic, strong) IBOutlet UILabel *counterLabel; @property(nonatomic, strong) IBOutlet UIButton *counterButton; @property(nonatomic, strong) IBOutlet UIButton *upgradeButton; @property(nonatomic, strong) IBOutlet UIButton *modeButton; -@property(nonatomic, strong) IBOutlet UIButton *loginModeButton; @property(nonatomic, strong) IBOutlet UIButton *editButton; @property(nonatomic, strong) IBOutlet UIScrollView *modeScrollView; -@property(nonatomic, strong) IBOutlet UIButton *selectionButton; +@property(nonatomic, strong) IBOutlet UIButton *contentButton; +@property(nonatomic, strong) IBOutlet UIButton *loginNameButton; @property(nonatomic, strong) IBOutlet UIView *indicatorView; @property(nonatomic) MPPasswordCellMode mode; @@ -57,31 +57,32 @@ [self.counterButton addGestureRecognizer: [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector( doResetCounter: )]]; - self.selectionButton.layer.cornerRadius = 4; - self.selectionButton.layer.shadowOffset = CGSizeZero; - self.selectionButton.layer.shadowRadius = 5; - self.selectionButton.layer.shadowOpacity = 0; - self.selectionButton.layer.shadowColor = [UIColor whiteColor].CGColor; - self.selectionButton.layer.borderWidth = 1; - self.selectionButton.layer.borderColor = [UIColor colorWithWhite:0.15f alpha:0.6f].CGColor; - self.contentView.layer.shadowRadius = 5; - self.contentView.layer.shadowOpacity = 1; - self.contentView.layer.shadowColor = [UIColor colorWithWhite:0 alpha:0.6f].CGColor; - self.contentView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:self.contentView.bounds cornerRadius:4].CGPath; - self.contentView.layer.masksToBounds = NO; - self.contentView.clipsToBounds = NO; - self.layer.masksToBounds = NO; - self.clipsToBounds = NO; + [self setupLayer]; - self.pageControl.transform = CGAffineTransformMakeScale( 0.4f, 0.4f ); + [self observeKeyPath:@"bounds" withBlock:^(id from, id to, NSKeyValueChange cause, id _self) { + if (from && !CGSizeEqualToSize( [from CGRectValue].size, [to CGRectValue].size )) + [self setupLayer]; + }]; - [self.selectionButton observeKeyPath:@"highlighted" + [self.contentButton observeKeyPath:@"highlighted" + withBlock:^(id from, id to, NSKeyValueChange cause, UIButton *button) { + button.layer.shadowOpacity = button.selected? 0.7f: button.highlighted? 0.3f: 0; + }]; + [self.contentButton observeKeyPath:@"selected" + withBlock:^(id from, id to, NSKeyValueChange cause, UIButton *button) { + button.layer.shadowOpacity = button.selected? 0.7f: button.highlighted? 0.3f: 0; + }]; + [self.loginNameButton observeKeyPath:@"highlighted" withBlock:^(id from, id to, NSKeyValueChange cause, UIButton *button) { - button.layer.shadowOpacity = button.selected? 1: button.highlighted? 0.3f: 0; + button.backgroundColor = [button.backgroundColor colorWithAlphaComponent: + button.selected || button.highlighted? 0.1f: 0]; + button.layer.shadowOpacity = button.selected? 0.7f: button.highlighted? 0.3f: 0; }]; - [self.selectionButton observeKeyPath:@"selected" + [self.loginNameButton observeKeyPath:@"selected" withBlock:^(id from, id to, NSKeyValueChange cause, UIButton *button) { - button.layer.shadowOpacity = button.selected? 1: button.highlighted? 0.3f: 0; + button.backgroundColor = [button.backgroundColor colorWithAlphaComponent: + button.selected || button.highlighted? 0.1f: 0]; + button.layer.shadowOpacity = button.selected? 0.7f: button.highlighted? 0.3f: 0; }]; CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position.y"]; @@ -92,13 +93,36 @@ [self.indicatorView.layer addAnimation:animation forKey:@"bounce"]; } +- (void)setupLayer { + + self.contentButton.layer.cornerRadius = 4; + self.contentButton.layer.shadowOffset = CGSizeZero; + self.contentButton.layer.shadowRadius = 5; + self.contentButton.layer.shadowOpacity = 0; + self.contentButton.layer.shadowColor = [UIColor whiteColor].CGColor; + self.contentButton.layer.borderWidth = 1; + self.contentButton.layer.borderColor = [UIColor colorWithWhite:0.15f alpha:0.6f].CGColor; + self.loginNameButton.layer.cornerRadius = 4; + self.loginNameButton.layer.shadowOffset = CGSizeZero; + self.loginNameButton.layer.shadowRadius = 5; + self.loginNameButton.layer.shadowOpacity = 0; + self.loginNameButton.layer.shadowColor = [UIColor whiteColor].CGColor; + self.contentView.layer.shadowRadius = 5; + self.contentView.layer.shadowOpacity = 1; + self.contentView.layer.shadowColor = [UIColor colorWithWhite:0 alpha:0.6f].CGColor; + self.contentView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:self.contentView.bounds cornerRadius:4].CGPath; + self.contentView.layer.masksToBounds = NO; + self.contentView.clipsToBounds = NO; + self.layer.masksToBounds = NO; + self.clipsToBounds = NO; +} + - (void)prepareForReuse { [super prepareForReuse]; _elementOID = nil; self.transientSite = nil; - self.loginModeButton.selected = NO; self.mode = MPPasswordCellModePassword; [self updateAnimated:NO]; } @@ -130,7 +154,11 @@ - (BOOL)textFieldShouldReturn:(UITextField *)textField { - [textField resignFirstResponder]; + if (textField == self.passwordField) + [self.loginNameField becomeFirstResponder]; + else + [textField resignFirstResponder]; + return YES; } @@ -162,8 +190,8 @@ - (void)textFieldDidEndEditing:(UITextField *)textField { if (textField == self.passwordField || textField == self.loginNameField) { - NSString *text = textField.text; textField.enabled = NO; + NSString *text = textField.text; [MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) { MPElementEntity *element = [self elementInContext:context]; @@ -171,10 +199,10 @@ return; if (textField == self.passwordField) { - [element.algorithm saveContent:text toElement:element usingKey:[MPiOSAppDelegate get].key]; - [PearlOverlay showTemporaryOverlayWithTitle:@"Password Updated" dismissAfter:2]; + if ([element.algorithm saveContent:text toElement:element usingKey:[MPiOSAppDelegate get].key]) + [PearlOverlay showTemporaryOverlayWithTitle:@"Password Updated" dismissAfter:2]; } - else if (textField == self.loginNameField) { + else if (textField == self.loginNameField && ![text isEqualToString:element.loginName]) { element.loginName = text; [PearlOverlay showTemporaryOverlayWithTitle:@"Login Updated" dismissAfter:2]; } @@ -187,12 +215,6 @@ #pragma mark - Actions -- (IBAction)doLoginMode:(UIButton *)sender { - - self.loginModeButton.selected = !self.loginModeButton.selected; - [self updateAnimated:YES]; -} - - (IBAction)doDelete:(UIButton *)sender { MPElementEntity *element = [self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]]; @@ -243,14 +265,13 @@ - (IBAction)doEdit:(UIButton *)sender { - if (self.loginModeButton.selected) { - self.loginNameField.enabled = YES; - [self.loginNameField becomeFirstResponder]; - } - else if ([self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]].type & MPElementTypeClassStored) { - self.passwordField.enabled = YES; + self.loginNameField.enabled = YES; + self.passwordField.enabled = YES; + + if ([self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]].type & MPElementTypeClassStored) [self.passwordField becomeFirstResponder]; - } + else + [self.loginNameField becomeFirstResponder]; } - (IBAction)doMode:(UIButton *)sender { @@ -328,9 +349,11 @@ }]; } -- (IBAction)doUse:(id)sender { +- (IBAction)doContent:(id)sender { - self.selectionButton.selected = YES; + [UIView animateWithDuration:.2f animations:^{ + self.contentButton.selected = YES; + }]; if (self.transientSite) { [[UIResponder findFirstResponder] resignFirstResponder]; @@ -339,15 +362,18 @@ viewStyle:UIAlertViewStyleDefault initAlert:nil tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) { if (buttonIndex == [alert cancelButtonIndex]) { - self.selectionButton.selected = NO; + self.contentButton.selected = NO; return; } [[MPiOSAppDelegate get] addElementNamed:self.transientSite completion:^(MPElementEntity *element, NSManagedObjectContext *context) { [self copyContentOfElement:element saveInContext:context]; - PearlMainQueue( ^{ - self.selectionButton.selected = NO; + + PearlMainQueueAfter( .3f, ^{ + [UIView animateWithDuration:.2f animations:^{ + self.contentButton.selected = NO; + }]; } ); }]; } cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:[PearlStrings get].commonButtonYes, nil]; @@ -356,8 +382,28 @@ [MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) { [self copyContentOfElement:[self elementInContext:context] saveInContext:context]; - PearlMainQueue( ^{ - self.selectionButton.selected = NO; + + PearlMainQueueAfter( .3f, ^{ + [UIView animateWithDuration:.2f animations:^{ + self.contentButton.selected = NO; + }]; + } ); + }]; +} + +- (IBAction)doLoginName:(id)sender { + + [UIView animateWithDuration:.2f animations:^{ + self.loginNameButton.selected = YES; + }]; + + [MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) { + [self copyLoginOfElement:[self elementInContext:context] saveInContext:context]; + + PearlMainQueueAfter( .3f, ^{ + [UIView animateWithDuration:.2f animations:^{ + self.loginNameButton.selected = NO; + }]; } ); }]; } @@ -383,44 +429,25 @@ return; } - [UIView animateWithDuration:animated? 0.3f: 0 animations:^{ + [UIView animateWithDuration:animated? .3f: 0 animations:^{ MPElementEntity *mainElement = [self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]]; // UI - self.selectionButton.layer.shadowOpacity = self.selectionButton.selected? 1: self.selectionButton.highlighted? 0.3f: 0; self.upgradeButton.alpha = mainElement.requiresExplicitMigration? 1: 0; - self.passwordField.alpha = self.loginModeButton.selected? 0: 1; - self.loginNameField.alpha = self.loginModeButton.selected? 1: 0; - self.modeButton.alpha = self.transientSite? 0: 1; - self.loginModeButton.alpha = self.transientSite? 0: 1; - self.counterLabel.alpha = self.counterButton.alpha = mainElement.type & MPElementTypeClassGenerated? 1: 0; + self.loginNameContainer.alpha = [mainElement.loginName length] || self.mode == MPPasswordCellModeSettings? 1: 0; + self.modeButton.alpha = self.transientSite? 0: self.mode == MPPasswordCellModePassword? 0.1f: 0.5f; + self.counterLabel.alpha = self.counterButton.alpha = mainElement.type & MPElementTypeClassGenerated? 0.5f: 0; self.modeButton.selected = self.mode == MPPasswordCellModeSettings; - self.pageControl.currentPage = self.mode == MPPasswordCellModePassword? 0: 1; - self.strengthLabel.alpha = self.mode == MPPasswordCellModePassword? 0: 1; - self.editButton.enabled = self.loginModeButton.selected || mainElement.type & MPElementTypeClassStored; + self.strengthLabel.gone = self.mode == MPPasswordCellModePassword; self.modeScrollView.scrollEnabled = !self.transientSite; - self.pageControl.alpha = self.transientSite? 0: 1; [self.modeScrollView setContentOffset:CGPointMake( self.mode * self.modeScrollView.frame.size.width, 0 ) animated:animated]; // Indicator - if (self.loginModeButton.selected) { - if ([mainElement.loginName length]) - self.indicatorView.alpha = 0; - else { - self.indicatorView.alpha = 1; - [self.indicatorView removeFromSuperview]; - [self.modeScrollView addSubview:self.indicatorView]; - [self.contentView addConstraintsWithVisualFormat:@"V:[indicator][view]" options:NSLayoutFormatAlignAllCenterX - metrics:nil views:@{ - @"indicator" : self.indicatorView, - @"view" : self.mode == MPPasswordCellModeSettings? self.editButton: self.modeButton - }]; - } - } switch (self.mode) { case MPPasswordCellModePassword: - if (mainElement.type & MPElementTypeClassStored) - break; + [self.loginNameField resignFirstResponder]; + [self.passwordField resignFirstResponder]; + break; case MPPasswordCellModeSettings: break; } @@ -430,7 +457,6 @@ self.transientSite? @"Tap to create": [mainElement.algorithm shortNameOfType:mainElement.type] ); // Site Password - self.passwordField.enabled = NO; self.passwordField.secureTextEntry = [[MPiOSConfig get].hidePasswords boolValue]; self.passwordField.attributedPlaceholder = stra( mainElement.type & MPElementTypeClassStored? strl( @"No password" ): @@ -458,19 +484,17 @@ self.passwordField.text = password; self.strengthLabel.text = timeToCrackString; - if (!self.loginModeButton.selected) { - if ([password length]) - self.indicatorView.alpha = 0; - else { - self.indicatorView.alpha = 1; - [self.indicatorView removeFromSuperview]; - [self.modeScrollView addSubview:self.indicatorView]; - [self.contentView addConstraintsWithVisualFormat:@"V:[indicator][view]" options:NSLayoutFormatAlignAllCenterX - metrics:nil views:@{ - @"indicator" : self.indicatorView, - @"view" : self.mode == MPPasswordCellModeSettings? self.editButton: self.modeButton - }]; - } + if ([password length]) + self.indicatorView.alpha = 0; + else { + self.indicatorView.alpha = 1; + [self.indicatorView removeFromSuperview]; + [self.modeScrollView addSubview:self.indicatorView]; + [self.contentView addConstraintsWithVisualFormat:@"V:[indicator][target]" options:NSLayoutFormatAlignAllCenterX + metrics:nil views:@{ + @"indicator" : self.indicatorView, + @"target" : self.mode == MPPasswordCellModeSettings? self.editButton: self.modeButton + }]; } } ); }]; @@ -480,47 +504,47 @@ self.counterLabel.text = strf( @"%lu", (unsigned long)((MPElementGeneratedEntity *)mainElement).counter ); // Site Login Name - self.loginNameField.enabled = NO; self.loginNameField.text = mainElement.loginName; self.loginNameField.attributedPlaceholder = stra( strl( @"Set login name" ), @{ NSForegroundColorAttributeName : [UIColor whiteColor] } ); + self.loginNameField.enabled = self.passwordField.enabled = // + [self.loginNameField isFirstResponder] || [self.passwordField isFirstResponder]; + + [self.contentView layoutIfNeeded]; }]; } - (void)copyContentOfElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context { - // Copy content. - if (self.loginModeButton.selected) { - // Login Mode - inf( @"Copying login for: %@", element.name ); - NSString *loginName = element.loginName; - if (![loginName length]) - return; + inf( @"Copying password for: %@", element.name ); + NSString *password = [element resolveContentUsingKey:[MPAppDelegate_Shared get].key]; + if (![password length]) + return; - PearlMainQueue( ^{ - [PearlOverlay showTemporaryOverlayWithTitle:strl( @"Login Name Copied" ) dismissAfter:2]; - [UIPasteboard generalPasteboard].string = loginName; - } ); + PearlMainQueue( ^{ + [PearlOverlay showTemporaryOverlayWithTitle:strl( @"Password Copied" ) dismissAfter:2]; + [UIPasteboard generalPasteboard].string = password; + } ); - [element use]; - [context saveToStore]; - } - else { - // Password Mode - inf( @"Copying password for: %@", element.name ); - NSString *password = [element resolveContentUsingKey:[MPAppDelegate_Shared get].key]; - if (![password length]) - return; + [element use]; + [context saveToStore]; +} - PearlMainQueue( ^{ - [PearlOverlay showTemporaryOverlayWithTitle:strl( @"Password Copied" ) dismissAfter:2]; - [UIPasteboard generalPasteboard].string = password; - } ); +- (void)copyLoginOfElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context { - [element use]; - [context saveToStore]; - } + inf( @"Copying login for: %@", element.name ); + NSString *loginName = element.loginName; + if (![loginName length]) + return; + + PearlMainQueue( ^{ + [PearlOverlay showTemporaryOverlayWithTitle:strl( @"Login Name Copied" ) dismissAfter:2]; + [UIPasteboard generalPasteboard].string = loginName; + } ); + + [element use]; + [context saveToStore]; } - (MPElementEntity *)elementInContext:(NSManagedObjectContext *)context { diff --git a/MasterPassword/ObjC/iOS/MPUsersViewController.m b/MasterPassword/ObjC/iOS/MPUsersViewController.m index 94e86ef4..705ecab3 100644 --- a/MasterPassword/ObjC/iOS/MPUsersViewController.m +++ b/MasterPassword/ObjC/iOS/MPUsersViewController.m @@ -24,6 +24,7 @@ #import "MPAppDelegate_Key.h" #import "PearlSizedTextView.h" #import "MPWebViewController.h" +#import "UIView+FontScale.h" typedef NS_ENUM(NSUInteger, MPActiveUserState) { /** The users are all inactive */ diff --git a/MasterPassword/ObjC/iOS/MasterPassword-Info.plist b/MasterPassword/ObjC/iOS/MasterPassword-Info.plist index 20ed0e9f..a42280b3 100644 --- a/MasterPassword/ObjC/iOS/MasterPassword-Info.plist +++ b/MasterPassword/ObjC/iOS/MasterPassword-Info.plist @@ -58,17 +58,6 @@ NSHumanReadableCopyright © 2011-2013, Lyndir - ReplacementFonts - - AmericanTypewriter-Bold - SourceCodePro-Black - AmericanTypewriter-Light - SourceCodePro-ExtraLight - Futura-CondensedExtraBold - Exo-ExtraBold - Futura-Medium - Exo - UIAppFonts Exo2.0-Bold.otf @@ -76,6 +65,7 @@ Exo2.0-Regular.otf Exo2.0-Thin.otf SourceCodePro-Black.otf + SourceCodePro-Regular.otf SourceCodePro-ExtraLight.otf UIMainStoryboardFile diff --git a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj index ce68ff96..56ae2e27 100644 --- a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj +++ b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj @@ -107,6 +107,7 @@ DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3509FC15F101A500C14A8E /* PearlQueue.h */; }; DA3509FF15F101A500C14A8E /* PearlQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3509FD15F101A500C14A8E /* PearlQueue.m */; }; DA38D6A318CCB5BF009AEB3E /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */; }; + DA3BCFCB19BD09D5006B2681 /* SourceCodePro-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA3BCFCA19BD09D5006B2681 /* SourceCodePro-Regular.otf */; }; DA4425CC1557BED40052177D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; }; DA44260A1557D9E40052177D /* libUbiquityStoreManager.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA4425CB1557BED40052177D /* libUbiquityStoreManager.a */; }; DA4522441902355C008F650A /* icon_book.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD370C1711E29500CF925C /* icon_book.png */; }; @@ -270,6 +271,12 @@ DACA29BD1705E2DE002C6C22 /* UIColor+HSV.h in Headers */ = {isa = PBXBuildFile; fileRef = DACA29B61705E2DE002C6C22 /* UIColor+HSV.h */; }; DACA29BE1705E2DE002C6C22 /* UIColor+Expanded.m in Sources */ = {isa = PBXBuildFile; fileRef = DACA29BA1705E2DE002C6C22 /* UIColor+Expanded.m */; }; DACA29BF1705E2DE002C6C22 /* UIColor+HSV.m in Sources */ = {isa = PBXBuildFile; fileRef = DACA29BB1705E2DE002C6C22 /* UIColor+HSV.m */; }; + DACE2F6519BA6A0A0010F92E /* PearlProfiler.m in Sources */ = {isa = PBXBuildFile; fileRef = DACE2F6319BA6A0A0010F92E /* PearlProfiler.m */; }; + DACE2F6619BA6A0A0010F92E /* PearlProfiler.h in Headers */ = {isa = PBXBuildFile; fileRef = DACE2F6419BA6A0A0010F92E /* PearlProfiler.h */; }; + DACE2F6B19BA6A2A0010F92E /* UIView+FontScale.m in Sources */ = {isa = PBXBuildFile; fileRef = DACE2F6719BA6A2A0010F92E /* UIView+FontScale.m */; }; + DACE2F6C19BA6A2A0010F92E /* PearlMutableStaticTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DACE2F6819BA6A2A0010F92E /* PearlMutableStaticTableViewController.m */; }; + DACE2F6D19BA6A2A0010F92E /* PearlMutableStaticTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DACE2F6919BA6A2A0010F92E /* PearlMutableStaticTableViewController.h */; }; + DACE2F6E19BA6A2A0010F92E /* UIView+FontScale.h in Headers */ = {isa = PBXBuildFile; fileRef = DACE2F6A19BA6A2A0010F92E /* UIView+FontScale.h */; }; DAD312C21552A22700A3F9ED /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DAD312C01552A20800A3F9ED /* libsqlite3.dylib */; }; DAE1EF2217E942DE00BC0086 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = DAE1EF2417E942DE00BC0086 /* Localizable.strings */; }; DAEBC45314F6364500987BF6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEBC45214F6364500987BF6 /* QuartzCore.framework */; }; @@ -277,6 +284,8 @@ DAEC85B618E3DD9A007FC0DF /* PearlUINavigationBar.m in Sources */ = {isa = PBXBuildFile; fileRef = DAEC85B218E3DD9A007FC0DF /* PearlUINavigationBar.m */; }; DAEC85B718E3DD9A007FC0DF /* PearlUINavigationBar.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEC85B318E3DD9A007FC0DF /* PearlUINavigationBar.h */; }; DAEC85B818E3DD9A007FC0DF /* UIView+Touches.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEC85B418E3DD9A007FC0DF /* UIView+Touches.h */; }; + DAEFB01E19BCBD9E00525079 /* UIView+LayoutGone.m in Sources */ = {isa = PBXBuildFile; fileRef = DAEFB01C19BCBD9E00525079 /* UIView+LayoutGone.m */; }; + DAEFB01F19BCBD9E00525079 /* UIView+LayoutGone.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEFB01D19BCBD9E00525079 /* UIView+LayoutGone.h */; }; DAF4EF50190A81E400023C90 /* NSManagedObject+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DAF4EF4E190A81E400023C90 /* NSManagedObject+Pearl.m */; }; DAF4EF51190A81E400023C90 /* NSManagedObject+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DAF4EF4F190A81E400023C90 /* NSManagedObject+Pearl.h */; }; DAFC5656172C573B00CB5CC5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; }; @@ -486,6 +495,7 @@ DA3509FD15F101A500C14A8E /* PearlQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlQueue.m; sourceTree = ""; }; DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = ""; }; DA3B844D190FC5DF00246EEA /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Crashlytics.framework; path = ../../../External/iOS/Crashlytics.framework; sourceTree = ""; }; + DA3BCFCA19BD09D5006B2681 /* SourceCodePro-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceCodePro-Regular.otf"; sourceTree = ""; }; DA4425CB1557BED40052177D /* libUbiquityStoreManager.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libUbiquityStoreManager.a; sourceTree = BUILT_PRODUCTS_DIR; }; DA5A09DD171A70E4005284AB /* play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = play.png; sourceTree = ""; }; DA5A09DE171A70E4005284AB /* play@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "play@2x.png"; sourceTree = ""; }; @@ -1209,6 +1219,12 @@ DACA29B61705E2DE002C6C22 /* UIColor+HSV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+HSV.h"; sourceTree = ""; }; DACA29BA1705E2DE002C6C22 /* UIColor+Expanded.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Expanded.m"; sourceTree = ""; }; DACA29BB1705E2DE002C6C22 /* UIColor+HSV.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+HSV.m"; sourceTree = ""; }; + DACE2F6319BA6A0A0010F92E /* PearlProfiler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlProfiler.m; sourceTree = ""; }; + DACE2F6419BA6A0A0010F92E /* PearlProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlProfiler.h; sourceTree = ""; }; + DACE2F6719BA6A2A0010F92E /* UIView+FontScale.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+FontScale.m"; sourceTree = ""; }; + DACE2F6819BA6A2A0010F92E /* PearlMutableStaticTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlMutableStaticTableViewController.m; sourceTree = ""; }; + DACE2F6919BA6A2A0010F92E /* PearlMutableStaticTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlMutableStaticTableViewController.h; sourceTree = ""; }; + DACE2F6A19BA6A2A0010F92E /* UIView+FontScale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+FontScale.h"; sourceTree = ""; }; DAD312C01552A20800A3F9ED /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; DADBB55918DB0CFC00D099FE /* keyboard-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "keyboard-dark@2x.png"; sourceTree = ""; }; DAE1EF2317E942DE00BC0086 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; @@ -1218,6 +1234,8 @@ DAEC85B218E3DD9A007FC0DF /* PearlUINavigationBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlUINavigationBar.m; sourceTree = ""; }; DAEC85B318E3DD9A007FC0DF /* PearlUINavigationBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlUINavigationBar.h; sourceTree = ""; }; DAEC85B418E3DD9A007FC0DF /* UIView+Touches.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+Touches.h"; sourceTree = ""; }; + DAEFB01C19BCBD9E00525079 /* UIView+LayoutGone.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+LayoutGone.m"; sourceTree = ""; }; + DAEFB01D19BCBD9E00525079 /* UIView+LayoutGone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+LayoutGone.h"; sourceTree = ""; }; DAF4EF4E190A81E400023C90 /* NSManagedObject+Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObject+Pearl.m"; sourceTree = ""; }; DAF4EF4F190A81E400023C90 /* NSManagedObject+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObject+Pearl.h"; sourceTree = ""; }; DAFC5655172C573B00CB5CC5 /* libInAppSettingsKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libInAppSettingsKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1718,6 +1736,7 @@ DABD36BB1711E29500CF925C /* Fonts */ = { isa = PBXGroup; children = ( + DA3BCFCA19BD09D5006B2681 /* SourceCodePro-Regular.otf */, DA67460918DE7F0C00DFE240 /* Exo2.0-Thin.otf */, DA67460A18DE7F0C00DFE240 /* Exo2.0-Regular.otf */, DA67460B18DE7F0C00DFE240 /* Exo2.0-ExtraBold.otf */, @@ -2469,6 +2488,8 @@ DAFE45D715039823003ABA7C /* Pearl */ = { isa = PBXGroup; children = ( + DACE2F6319BA6A0A0010F92E /* PearlProfiler.m */, + DACE2F6419BA6A0A0010F92E /* PearlProfiler.h */, DAA1411C1922FF020032B392 /* PearlTween.m */, DAA1411D1922FF020032B392 /* PearlTween.h */, DAA1411E1922FF020032B392 /* include */, @@ -2559,6 +2580,12 @@ DAFE460715039823003ABA7C /* Pearl-UIKit */ = { isa = PBXGroup; children = ( + DAEFB01C19BCBD9E00525079 /* UIView+LayoutGone.m */, + DAEFB01D19BCBD9E00525079 /* UIView+LayoutGone.h */, + DACE2F6719BA6A2A0010F92E /* UIView+FontScale.m */, + DACE2F6819BA6A2A0010F92E /* PearlMutableStaticTableViewController.m */, + DACE2F6919BA6A2A0010F92E /* PearlMutableStaticTableViewController.h */, + DACE2F6A19BA6A2A0010F92E /* UIView+FontScale.h */, DA250A13195665A100AC23F1 /* UITableView+PearlReloadFromArray.m */, DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */, DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */, @@ -2686,6 +2713,7 @@ DAFE4A2215039824003ABA7C /* PearlDeviceUtils.h in Headers */, DAFE4A2415039824003ABA7C /* PearlInfoPlist.h in Headers */, DA2CA4E418D28866007798F8 /* NSLayoutConstraint+PearlUIKit.h in Headers */, + DACE2F6D19BA6A2A0010F92E /* PearlMutableStaticTableViewController.h in Headers */, DAFE4A2615039824003ABA7C /* PearlLogger.h in Headers */, DAFE4A2815039824003ABA7C /* PearlMathUtils.h in Headers */, DAFE4A2A15039824003ABA7C /* PearlObjectUtils.h in Headers */, @@ -2699,16 +2727,19 @@ DAFE4A3615039824003ABA7C /* PearlKeyChain.h in Headers */, DAFE4A3815039824003ABA7C /* PearlRSAKey.h in Headers */, DAFE4A3A15039824003ABA7C /* PearlSCrypt.h in Headers */, + DACE2F6E19BA6A2A0010F92E /* UIView+FontScale.h in Headers */, DAFE4A3C15039824003ABA7C /* Pearl-UIKit-Dependencies.h in Headers */, DAEC85B818E3DD9A007FC0DF /* UIView+Touches.h in Headers */, DAFE4A3D15039824003ABA7C /* Pearl-UIKit.h in Headers */, DAFE4A3E15039824003ABA7C /* PearlAlert.h in Headers */, DAFE4A4015039824003ABA7C /* PearlArrayTVC.h in Headers */, DAFE4A4215039824003ABA7C /* PearlBoxView.h in Headers */, + DAEFB01F19BCBD9E00525079 /* UIView+LayoutGone.h in Headers */, DAFE4A4415039824003ABA7C /* PearlGradientView.h in Headers */, DAFE4A4615039824003ABA7C /* PearlLayout.h in Headers */, DAFE4A4815039824003ABA7C /* PearlLayoutView.h in Headers */, DAFE4A4A15039824003ABA7C /* PearlMessageView.h in Headers */, + DACE2F6619BA6A0A0010F92E /* PearlProfiler.h in Headers */, DAFE4A4C15039824003ABA7C /* PearlRootViewController.h in Headers */, DAFE4A4E15039824003ABA7C /* PearlSheet.h in Headers */, DAFE4A5015039824003ABA7C /* PearlUIDebug.h in Headers */, @@ -3092,6 +3123,7 @@ DA69540717D975D900BF294E /* icon_gears@2x.png in Resources */, DABD3B1C1711E29800CF925C /* icon_up.png in Resources */, DABD3B1D1711E29800CF925C /* icon_up@2x.png in Resources */, + DA3BCFCB19BD09D5006B2681 /* SourceCodePro-Regular.otf in Resources */, DA250A121956484D00AC23F1 /* image-0.png in Resources */, DA4522441902355C008F650A /* icon_book.png in Resources */, DABD3B8A1711E29800CF925C /* help.html in Resources */, @@ -3249,6 +3281,7 @@ DAFE4A1815039824003ABA7C /* NSString+PearlSEL.m in Sources */, DAFE4A1B15039824003ABA7C /* PearlAbstractStrings.m in Sources */, DAFE4A1F15039824003ABA7C /* PearlCodeUtils.m in Sources */, + DAEFB01E19BCBD9E00525079 /* UIView+LayoutGone.m in Sources */, DAFE4A2115039824003ABA7C /* PearlConfig.m in Sources */, DAFE4A2315039824003ABA7C /* PearlDeviceUtils.m in Sources */, DAFE4A2515039824003ABA7C /* PearlInfoPlist.m in Sources */, @@ -3270,6 +3303,7 @@ DA250A19195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m in Sources */, DAFE4A4915039824003ABA7C /* PearlLayoutView.m in Sources */, DAFE4A4B15039824003ABA7C /* PearlMessageView.m in Sources */, + DACE2F6519BA6A0A0010F92E /* PearlProfiler.m in Sources */, DAFE4A4D15039824003ABA7C /* PearlRootViewController.m in Sources */, DAFE4A4F15039824003ABA7C /* PearlSheet.m in Sources */, DAFE4A5115039824003ABA7C /* PearlUIDebug.m in Sources */, @@ -3277,6 +3311,7 @@ DAFE4A5515039824003ABA7C /* PearlValidatingTextField.m in Sources */, DAEC85B618E3DD9A007FC0DF /* PearlUINavigationBar.m in Sources */, DAFE4A5715039824003ABA7C /* PearlWebViewController.m in Sources */, + DACE2F6C19BA6A2A0010F92E /* PearlMutableStaticTableViewController.m in Sources */, DAFE4A5915039824003ABA7C /* UIImage+PearlScaling.m in Sources */, DAFE4A62150399FF003ABA7C /* PearlAppDelegate.m in Sources */, DA30E9CF15722ECA00A68B4C /* NSBundle+PearlMutableInfo.m in Sources */, @@ -3289,6 +3324,7 @@ DAEC85B518E3DD9A007FC0DF /* UIView+Touches.m in Sources */, DA2CA4DD18D28859007798F8 /* NSArray+Pearl.m in Sources */, DAFE4A63150399FF003ABA8A /* UIControl+PearlSelect.m in Sources */, + DACE2F6B19BA6A2A0010F92E /* UIView+FontScale.m in Sources */, DAFE4A63150399FF003ABA8E /* UIScrollView+PearlFlashingIndicators.m in Sources */, DAFE4A63150399FF003ABA92 /* NSDateFormatter+RFC3339.m in Sources */, DA2CA4E618D2AC10007798F8 /* NSLayoutConstraint+PearlUIKit.m in Sources */, diff --git a/MasterPassword/ObjC/iOS/Storyboard.storyboard b/MasterPassword/ObjC/iOS/Storyboard.storyboard index 2fe26471..4c8e604a 100644 --- a/MasterPassword/ObjC/iOS/Storyboard.storyboard +++ b/MasterPassword/ObjC/iOS/Storyboard.storyboard @@ -123,7 +123,7 @@ - + - + - + @@ -177,25 +177,25 @@ - + - + - - + - + - + @@ -350,7 +351,7 @@ - + @@ -1019,60 +1020,116 @@ - - - - + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -1286,7 +1336,6 @@ - @@ -1302,30 +1351,25 @@ - - - + - + - - - + + - - - + + - @@ -1343,17 +1387,17 @@ + - + + - - @@ -1545,31 +1589,31 @@ - + - + - + @@ -1577,9 +1621,9 @@ - + - + @@ -1587,9 +1631,9 @@ - + - + @@ -1597,7 +1641,7 @@ - + @@ -1613,25 +1657,25 @@ - + @@ -1673,11 +1717,11 @@ - + @@ -1699,7 +1743,7 @@ @@ -1886,7 +1930,7 @@ - + @@ -1897,7 +1941,7 @@ - + @@ -1928,19 +1972,19 @@ @@ -1973,6 +2017,7 @@ CgoKCgoKCgoKCgoKCg + @@ -2152,7 +2197,7 @@ CgoKCgoKCgoKCgoKCg @@ -2162,14 +2207,14 @@ CgoKCgoKCgoKCgoKCg @@ -2246,19 +2291,19 @@ However, it means that anyone who finds your device unlocked can do the same. - +