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 @@
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
@@ -1090,27 +1147,25 @@
-
-
-
+
-
+
-
+
@@ -1131,10 +1186,10 @@
-
+
-
+
@@ -1262,18 +1317,13 @@
-
+
-
+
-
-
-
-
-
@@ -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 @@
-
+
-
+
@@ -1689,7 +1733,7 @@
-
+
@@ -1699,7 +1743,7 @@
-
+
@@ -1886,7 +1930,7 @@
-
+
@@ -1897,7 +1941,7 @@
-
+
@@ -1928,19 +1972,19 @@
-
+
-
+
-
+
CgoKCgoKCgoKCgoKCg
-
+
@@ -1973,6 +2017,7 @@ CgoKCgoKCgoKCgoKCg
+
@@ -2152,7 +2197,7 @@ CgoKCgoKCgoKCgoKCg
-
+
@@ -2162,14 +2207,14 @@ CgoKCgoKCgoKCgoKCg
-
+
The right balance between security and convenience is often very personal.
To make getting to your passwords faster, you can remain logged in after you close Master Password. This allows you to skip having to log in the next time.
However, it means that anyone who finds your device unlocked can do the same.
-
+
@@ -2246,19 +2291,19 @@ However, it means that anyone who finds your device unlocked can do the same.
-
+
-
+
-
+
@@ -2266,7 +2311,7 @@ However, it means that anyone who finds your device unlocked can do the same.
-
+
@@ -2279,7 +2324,7 @@ You don't need to remember any password generated by this app, but
-
+
@@ -2287,7 +2332,7 @@ You don't need to remember any password generated by this app, but
-
+
@@ -2295,7 +2340,7 @@ You don't need to remember any password generated by this app, but
-
+
@@ -2310,7 +2355,7 @@ You don't need to remember any password generated by this app, but
-
+
@@ -2318,7 +2363,7 @@ You don't need to remember any password generated by this app, but
-
+
@@ -2331,7 +2376,7 @@ See
-
+
@@ -2339,7 +2384,7 @@ See
-
+
@@ -2348,7 +2393,7 @@ See
-
+
diff --git a/MasterPassword/Resources/Media/Fonts/SourceCodePro-Regular.otf b/MasterPassword/Resources/Media/Fonts/SourceCodePro-Regular.otf
new file mode 100644
index 00000000..8f031da9
Binary files /dev/null and b/MasterPassword/Resources/Media/Fonts/SourceCodePro-Regular.otf differ