diff --git a/External/Pearl b/External/Pearl index d37640cc..c1403378 160000 --- a/External/Pearl +++ b/External/Pearl @@ -1 +1 @@ -Subproject commit d37640cc0133e56b1d58baf7ed44ce69dcb20f2f +Subproject commit c140337883f04a803a547ba9932315e29f1fce16 diff --git a/MasterPassword/ObjC/iOS/MPPasswordCell.h b/MasterPassword/ObjC/iOS/MPPasswordCell.h index 1bafd03a..5eba3dbe 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordCell.h +++ b/MasterPassword/ObjC/iOS/MPPasswordCell.h @@ -22,13 +22,7 @@ @interface MPPasswordCell : MPCell -@property(strong, nonatomic) IBOutlet UILabel *nameLabel; -@property(strong, nonatomic) IBOutlet UIButton *loginButton; - /** Populate our UI to reflect the current state. */ - (void)updateAnimated:(BOOL)animated; -- (void)reloadWithElement:(MPElementEntity *)mainElement; -- (void)reloadWithTransientSite:(NSString *)siteName; - @end diff --git a/MasterPassword/ObjC/iOS/MPPasswordCell.m b/MasterPassword/ObjC/iOS/MPPasswordCell.m index 97171766..2c69f422 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordCell.m +++ b/MasterPassword/ObjC/iOS/MPPasswordCell.m @@ -24,17 +24,6 @@ #pragma mark - Life cycle -- (void)awakeFromNib { - - [super awakeFromNib]; - - self.layer.cornerRadius = 5; - self.layer.shadowOffset = CGSizeZero; - self.layer.shadowRadius = 5; - self.layer.shadowOpacity = 0; - self.layer.shadowColor = [UIColor whiteColor].CGColor; -} - - (void)prepareForReuse { [super prepareForReuse]; @@ -83,14 +72,4 @@ }]; } -- (void)reloadWithElement:(MPElementEntity *)mainElement { - - self.nameLabel.text = mainElement.name; -} - -- (void)reloadWithTransientSite:(NSString *)siteName { - - self.nameLabel.text = strl( @"%@ - Tap to create", siteName ); -} - @end diff --git a/MasterPassword/ObjC/iOS/MPPasswordElementCell.h b/MasterPassword/ObjC/iOS/MPPasswordElementCell.h deleted file mode 100644 index ef90205e..00000000 --- a/MasterPassword/ObjC/iOS/MPPasswordElementCell.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com) - * - * See the enclosed file LICENSE for license information (LGPLv3). If you did - * not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt - * - * @author Maarten Billemont - * @license http://www.gnu.org/licenses/lgpl-3.0.txt - */ - -// -// MPPasswordElementCell.h -// MPPasswordElementCell -// -// Created by lhunath on 2014-04-03. -// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved. -// - -#import -#import "MPPasswordCell.h" -#import "MPPasswordsViewController.h" - -@interface MPPasswordElementCell : MPPasswordCell - -@property(nonatomic, copy) NSString *transientSite; -@property(nonatomic, weak) MPPasswordsViewController *passwordsViewController; - -- (MPElementEntity *)mainElement; -- (MPElementEntity *)elementInContext:(NSManagedObjectContext *)context; -- (void)setElement:(MPElementEntity *)element; -- (void)reloadData; - -@end diff --git a/MasterPassword/ObjC/iOS/MPPasswordElementCell.m b/MasterPassword/ObjC/iOS/MPPasswordElementCell.m deleted file mode 100644 index a2904b40..00000000 --- a/MasterPassword/ObjC/iOS/MPPasswordElementCell.m +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com) - * - * See the enclosed file LICENSE for license information (LGPLv3). If you did - * not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt - * - * @author Maarten Billemont - * @license http://www.gnu.org/licenses/lgpl-3.0.txt - */ - -// -// MPPasswordElementCell.h -// MPPasswordElementCell -// -// Created by lhunath on 2014-04-03. -// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved. -// - -#import "MPPasswordElementCell.h" -#import "MPiOSAppDelegate.h" -#import "MPAppDelegate_Store.h" - -@implementation MPPasswordElementCell { - NSManagedObjectID *_elementOID; -} - -- (void)prepareForReuse { - - _elementOID = nil; - _transientSite = nil; - - [super prepareForReuse]; -} - -- (void)setTransientSite:(NSString *)transientSite { - - if ([_transientSite isEqualToString:transientSite]) - return; - - dbg(@"transientSite: %@ -> %@", _transientSite, transientSite); - - _transientSite = transientSite; - _elementOID = nil; - - [self updateAnimated:YES]; - [self reloadData]; -} - -- (void)setElement:(MPElementEntity *)element { - - NSManagedObjectID *newElementOID = element.objectID; - NSAssert(!newElementOID.isTemporaryID, @"Element doesn't have a permanent objectID: %@", element); - if ([_elementOID isEqual:newElementOID]) - return; - - dbg(@"element: %@ -> %@", _elementOID, newElementOID); - - _transientSite = nil; - _elementOID = newElementOID; - - [self updateAnimated:YES]; - [self reloadData]; -} - -- (MPElementEntity *)mainElement { - - return [self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]]; -} - -- (MPElementEntity *)elementInContext:(NSManagedObjectContext *)context { - - return [MPElementEntity existingObjectWithID:_elementOID inContext:context]; -} - -- (void)reloadData { - - if (self.transientSite) - PearlMainQueue( ^{ - [self reloadWithTransientSite:self.transientSite]; - } ); - else - [MPiOSAppDelegate managedObjectContextForMainThreadPerformBlockAndWait:^(NSManagedObjectContext *mainContext) { - [self reloadWithElement:[self elementInContext:mainContext]]; - }]; -} - -@end diff --git a/MasterPassword/ObjC/iOS/MPPasswordLargeCell.h b/MasterPassword/ObjC/iOS/MPPasswordLargeCell.h index b82329dc..782b01b2 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordLargeCell.h +++ b/MasterPassword/ObjC/iOS/MPPasswordLargeCell.h @@ -33,9 +33,14 @@ typedef NS_ENUM (NSUInteger, MPContentFieldMode) { @property(nonatomic, strong) IBOutlet UILabel *typeLabel; @property(nonatomic, strong) IBOutlet UITextField *contentField; @property(nonatomic, strong) IBOutlet UIButton *upgradeButton; +@property(nonatomic, strong) IBOutlet UILabel *nameLabel; +@property(nonatomic, strong) IBOutlet UIButton *loginButton; + (instancetype)dequeueCellWithType:(MPElementType)type fromCollectionView:(UICollectionView *)collectionView atIndexPath:(NSIndexPath *)indexPath; +- (void)reloadWithElement:(MPElementEntity *)mainElement; +- (void)reloadWithTransientSite:(NSString *)siteName; + - (void)resolveContentOfCellTypeForTransientSite:(NSString *)siteName usingKey:(MPKey *)key result:(void (^)(NSString *))resultBlock; - (void)resolveContentOfCellTypeForElement:(MPElementEntity *)element usingKey:(MPKey *)key result:(void (^)(NSString *))resultBlock; diff --git a/MasterPassword/ObjC/iOS/MPPasswordLargeCell.m b/MasterPassword/ObjC/iOS/MPPasswordLargeCell.m index ec0f9f04..cd106de7 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordLargeCell.m +++ b/MasterPassword/ObjC/iOS/MPPasswordLargeCell.m @@ -51,6 +51,12 @@ [super awakeFromNib]; + self.layer.cornerRadius = 5; + self.layer.shadowOffset = CGSizeZero; + self.layer.shadowRadius = 5; + self.layer.shadowOpacity = 0; + self.layer.shadowColor = [UIColor whiteColor].CGColor; + [self prepareForReuse]; } @@ -64,7 +70,7 @@ - (void)reloadWithTransientSite:(NSString *)siteName { - [super reloadWithTransientSite:siteName]; + self.nameLabel.text = strl( @"%@ - Tap to create", siteName ); self.loginButton.alpha = 0; self.upgradeButton.alpha = 0; @@ -90,25 +96,29 @@ - (void)reloadWithElement:(MPElementEntity *)mainElement { - [super reloadWithElement:mainElement]; - if (!mainElement) { self.loginButton.alpha = 0; + self.upgradeButton.alpha = 0; + self.typeLabel.text = @""; self.nameLabel.text = @""; self.contentField.text = @""; return; } - self.nameLabel.alpha = 1; self.loginButton.alpha = 1; - if (self.type != (MPElementType)NSNotFound) - self.typeLabel.text = [mainElement.algorithm nameOfType:self.type]; if (mainElement.requiresExplicitMigration) self.upgradeButton.alpha = 1; else self.upgradeButton.alpha = 0; + if (self.type == (MPElementType)NSNotFound) + self.typeLabel.text = @"Delete"; + else + self.typeLabel.text = [mainElement.algorithm nameOfType:self.type]; + + self.nameLabel.text = mainElement.name; + switch (self.contentFieldMode) { case MPContentFieldModePassword: { if (self.type & MPElementTypeClassStored) { @@ -174,7 +184,7 @@ NSString *newContent = textField.text; [MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) { - MPElementEntity *element = [[MPPasswordElementCell findAsSuperviewOf:self] elementInContext:context]; + MPElementEntity *element = [[MPPasswordTypesCell findAsSuperviewOf:self] elementInContext:context]; if (!element) return; @@ -215,11 +225,11 @@ - (IBAction)doUpgrade:(UIButton *)sender { [MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) { - if ([[[MPPasswordElementCell findAsSuperviewOf:self] elementInContext:context] migrateExplicitly:YES]) { + if ([[[MPPasswordTypesCell findAsSuperviewOf:self] elementInContext:context] migrateExplicitly:YES]) { [context saveToStore]; PearlMainQueue( ^{ - [[MPPasswordElementCell findAsSuperviewOf:self] reloadData]; + [[MPPasswordTypesCell findAsSuperviewOf:self] reloadData]; [PearlOverlay showTemporaryOverlayWithTitle:@"Site Upgraded" dismissAfter:2]; } ); } @@ -239,7 +249,7 @@ _contentFieldMode = contentFieldMode; - [[MPPasswordElementCell findAsSuperviewOf:self] reloadData]; + [[MPPasswordTypesCell findAsSuperviewOf:self] reloadData]; } @end diff --git a/MasterPassword/ObjC/iOS/MPPasswordLargeDeleteCell.m b/MasterPassword/ObjC/iOS/MPPasswordLargeDeleteCell.m index 12f37947..a422f54a 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordLargeDeleteCell.m +++ b/MasterPassword/ObjC/iOS/MPPasswordLargeDeleteCell.m @@ -17,9 +17,6 @@ // #import "MPPasswordLargeDeleteCell.h" -#import "MPiOSAppDelegate.h" -#import "MPAppDelegate_Store.h" -#import "MPPasswordElementCell.h" @implementation MPPasswordLargeDeleteCell diff --git a/MasterPassword/ObjC/iOS/MPPasswordLargeGeneratedCell.m b/MasterPassword/ObjC/iOS/MPPasswordLargeGeneratedCell.m index 86f5036b..354c8eba 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordLargeGeneratedCell.m +++ b/MasterPassword/ObjC/iOS/MPPasswordLargeGeneratedCell.m @@ -19,7 +19,7 @@ #import "MPPasswordLargeGeneratedCell.h" #import "MPiOSAppDelegate.h" #import "MPAppDelegate_Store.h" -#import "MPPasswordElementCell.h" +#import "MPPasswordTypesCell.h" @implementation MPPasswordLargeGeneratedCell @@ -125,7 +125,7 @@ - (MPElementGeneratedEntity *)generatedElementInContext:(NSManagedObjectContext *)context { - return [self generatedElement:[[MPPasswordElementCell findAsSuperviewOf:self] elementInContext:context]]; + return [self generatedElement:[[MPPasswordTypesCell findAsSuperviewOf:self] elementInContext:context]]; } - (MPElementGeneratedEntity *)generatedElement:(MPElementEntity *)element { diff --git a/MasterPassword/ObjC/iOS/MPPasswordLargeStoredCell.m b/MasterPassword/ObjC/iOS/MPPasswordLargeStoredCell.m index 3fb430b9..269e5ed5 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordLargeStoredCell.m +++ b/MasterPassword/ObjC/iOS/MPPasswordLargeStoredCell.m @@ -19,7 +19,7 @@ #import "MPPasswordLargeStoredCell.h" #import "MPiOSAppDelegate.h" #import "MPAppDelegate_Store.h" -#import "MPPasswordElementCell.h" +#import "MPPasswordTypesCell.h" @interface MPPasswordLargeStoredCell() @@ -96,7 +96,7 @@ - (MPElementStoredEntity *)storedElementInContext:(NSManagedObjectContext *)context { - return [self storedElement:[[MPPasswordElementCell findAsSuperviewOf:self] elementInContext:context]]; + return [self storedElement:[[MPPasswordTypesCell findAsSuperviewOf:self] elementInContext:context]]; } - (MPElementStoredEntity *)storedElement:(MPElementEntity *)element { diff --git a/MasterPassword/ObjC/iOS/MPPasswordSmallCell.h b/MasterPassword/ObjC/iOS/MPPasswordSmallCell.h deleted file mode 100644 index ff6bb0bb..00000000 --- a/MasterPassword/ObjC/iOS/MPPasswordSmallCell.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com) - * - * See the enclosed file LICENSE for license information (LGPLv3). If you did - * not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt - * - * @author Maarten Billemont - * @license http://www.gnu.org/licenses/lgpl-3.0.txt - */ - -// -// MPPasswordSmallCell.h -// MPPasswordSmallCell -// -// Created by lhunath on 2014-03-28. -// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved. -// - -#import -#import "MPPasswordCell.h" - -@interface MPPasswordSmallCell : MPPasswordElementCell - -+ (instancetype)dequeueCellForElement:(MPElementEntity *)element - fromCollectionView:(UICollectionView *)collectionView atIndexPath:(NSIndexPath *)indexPath; - -@end - -@interface MPPasswordSmallGeneratedCell : MPPasswordSmallCell -@end - -@interface MPPasswordSmallStoredCell : MPPasswordSmallCell -@end diff --git a/MasterPassword/ObjC/iOS/MPPasswordSmallCell.m b/MasterPassword/ObjC/iOS/MPPasswordSmallCell.m deleted file mode 100644 index c89f2af9..00000000 --- a/MasterPassword/ObjC/iOS/MPPasswordSmallCell.m +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com) - * - * See the enclosed file LICENSE for license information (LGPLv3). If you did - * not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt - * - * @author Maarten Billemont - * @license http://www.gnu.org/licenses/lgpl-3.0.txt - */ - -// -// MPPasswordSmallCell.h -// MPPasswordSmallCell -// -// Created by lhunath on 2014-03-28. -// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved. -// - -#import "MPPasswordElementCell.h" -#import "MPPasswordSmallCell.h" - -@implementation MPPasswordSmallCell { -} - -+ (instancetype)dequeueCellForElement:(MPElementEntity *)element fromCollectionView:(UICollectionView *)collectionView - atIndexPath:(NSIndexPath *)indexPath { - - NSString *reuseIdentifier; - if (element.type & MPElementTypeClassGenerated) - reuseIdentifier = NSStringFromClass( [MPPasswordSmallGeneratedCell class] ); - else if (element.type & MPElementTypeClassStored) - reuseIdentifier = NSStringFromClass( [MPPasswordSmallStoredCell class] ); - else - Throw(@"Unexpected password type: %@", [MPAlgorithmDefault nameOfType:element.type]); - - MPPasswordSmallCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; - [cell setElement:element]; - - return cell; -} - -@end - -@implementation MPPasswordSmallGeneratedCell -@end - -@implementation MPPasswordSmallStoredCell -@end diff --git a/MasterPassword/ObjC/iOS/MPPasswordTypesCell.h b/MasterPassword/ObjC/iOS/MPPasswordTypesCell.h index 626dd495..1a48f773 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordTypesCell.h +++ b/MasterPassword/ObjC/iOS/MPPasswordTypesCell.h @@ -19,15 +19,23 @@ #import #import "MPCell.h" #import "MPPasswordCell.h" -#import "MPPasswordElementCell.h" #import "MPPasswordsViewController.h" -@interface MPPasswordTypesCell : MPPasswordElementCell +@interface MPPasswordTypesCell : MPPasswordCell @property(nonatomic, strong) IBOutlet UICollectionView *contentCollectionView; -@property(nonatomic, strong) id algorithm; +@property(nonatomic, weak) MPPasswordsViewController *passwordsViewController; +@property(nonatomic, copy) NSString *transientSite; + +@property(nonatomic, strong) id algorithm; @property(nonatomic) MPElementType activeType; + +- (MPElementEntity *)mainElement; +- (MPElementEntity *)elementInContext:(NSManagedObjectContext *)context; +- (void)setElement:(MPElementEntity *)element; +- (void)reloadData; + + (instancetype)dequeueCellForElement:(MPElementEntity *)element fromCollectionView:(UICollectionView *)collectionView atIndexPath:(NSIndexPath *)indexPath; + (instancetype)dequeueCellForTransientSite:(NSString *)siteName diff --git a/MasterPassword/ObjC/iOS/MPPasswordTypesCell.m b/MasterPassword/ObjC/iOS/MPPasswordTypesCell.m index f3dd3b79..0dc15c50 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordTypesCell.m +++ b/MasterPassword/ObjC/iOS/MPPasswordTypesCell.m @@ -21,7 +21,9 @@ #import "MPiOSAppDelegate.h" #import "MPAppDelegate_Store.h" -@implementation MPPasswordTypesCell +@implementation MPPasswordTypesCell { + NSManagedObjectID *_elementOID; +} #pragma mark - Lifecycle @@ -57,6 +59,8 @@ - (void)prepareForReuse { + _elementOID = nil; + _transientSite = nil; _activeType = 0; _algorithm = MPAlgorithmDefault; @@ -71,24 +75,6 @@ [self scrollToActiveType]; } -- (void)reloadWithTransientSite:(NSString *)siteName { - - [super reloadWithTransientSite:siteName]; - - [self.contentCollectionView reloadData]; - self.activeType = IfElse( [[MPiOSAppDelegate get] activeUserForMainThread].defaultType, MPElementTypeGeneratedLong ); -} - -- (void)reloadWithElement:(MPElementEntity *)mainElement { - - [super reloadWithElement:mainElement]; - - self.algorithm = IfNotNilElse( [self mainElement].algorithm, MPAlgorithmDefault ); - - [self.contentCollectionView reloadData]; - self.activeType = mainElement.type; -} - #pragma mark - UICollectionViewDataSource - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout @@ -219,6 +205,23 @@ #pragma mark - Private +- (void)reloadData { + + if (self.transientSite) + PearlMainQueue( ^{ + [self.contentCollectionView reloadData]; + self.activeType = IfElse( [[MPiOSAppDelegate get] activeUserForMainThread].defaultType, MPElementTypeGeneratedLong ); + } ); + else + [MPiOSAppDelegate managedObjectContextForMainThreadPerformBlockAndWait:^(NSManagedObjectContext *mainContext) { + MPElementEntity *mainElement = [self mainElement]; + + self.algorithm = IfNotNilElse( mainElement.algorithm, MPAlgorithmDefault ); + [self.contentCollectionView reloadData]; + self.activeType = mainElement.type; + }]; +} + - (void)scrollToActiveType { if (self.activeType && self.activeType != (MPElementType)NSNotFound) @@ -283,6 +286,46 @@ #pragma mark - State +- (void)setTransientSite:(NSString *)transientSite { + + if ([_transientSite isEqualToString:transientSite]) + return; + + dbg( @"transientSite: %@ -> %@", _transientSite, transientSite ); + + _transientSite = transientSite; + _elementOID = nil; + + [self updateAnimated:YES]; + [self reloadData]; +} + +- (void)setElement:(MPElementEntity *)element { + + NSManagedObjectID *newElementOID = element.objectID; + NSAssert( !newElementOID.isTemporaryID, @"Element doesn't have a permanent objectID: %@", element ); + if ([_elementOID isEqual:newElementOID]) + return; + + dbg( @"element: %@ -> %@", _elementOID, newElementOID ); + + _transientSite = nil; + _elementOID = newElementOID; + + [self updateAnimated:YES]; + [self reloadData]; +} + +- (MPElementEntity *)mainElement { + + return [self elementInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]]; +} + +- (MPElementEntity *)elementInContext:(NSManagedObjectContext *)context { + + return [MPElementEntity existingObjectWithID:_elementOID inContext:context]; +} + - (void)setActiveType:(MPElementType)activeType { _activeType = activeType; diff --git a/MasterPassword/ObjC/iOS/MPPasswordsViewController.m b/MasterPassword/ObjC/iOS/MPPasswordsViewController.m index 2bdf9076..2c9b6286 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordsViewController.m +++ b/MasterPassword/ObjC/iOS/MPPasswordsViewController.m @@ -21,7 +21,6 @@ #import "MPAppDelegate_Store.h" #import "MPPasswordLargeCell.h" #import "MPPasswordTypesCell.h" -#import "MPPasswordSmallCell.h" #import "MPPopdownSegue.h" #import "MPAppDelegate_Key.h" #import "MPCoachmarkViewController.h" @@ -146,7 +145,7 @@ referenceSizeForHeaderInSection:(NSInteger)section { if (collectionView == self.passwordCollectionView) { [UIView setAnimationsEnabled:NO]; - MPPasswordElementCell *cell; + MPPasswordTypesCell *cell; if (indexPath.item < ((id)self.fetchedResultsController.sections[indexPath.section]).numberOfObjects) { MPElementEntity *element = [self.fetchedResultsController objectAtIndexPath:indexPath]; cell = [MPPasswordTypesCell dequeueCellForElement:element fromCollectionView:collectionView atIndexPath:indexPath]; diff --git a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj index 75382895..2fc0dada 100644 --- a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj +++ b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj @@ -17,7 +17,6 @@ 93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */; }; 93D3932889B6B4206E66A6D6 /* PearlEMail.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39F7C9F47BF6387FBC5C3 /* PearlEMail.h */; }; 93D39392DEDA376F93C6C718 /* MPCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39BAA71DE51B4D8A1286C /* MPCell.m */; }; - 93D393BA1B8402D08DB40231 /* MPPasswordElementCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39342E5F115EFCC90E976 /* MPPasswordElementCell.m */; }; 93D393DB5325820241BA90A7 /* PearlSizedTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39A4759186F6D2D34AA6B /* PearlSizedTextView.h */; }; 93D394982CBD25D46692DD7C /* MPWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3990E0CD1B5CF9FBB2C07 /* MPWebViewController.m */; }; 93D394B5036C882B33C71872 /* MPPasswordsSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39E7A12CC352B2825AA66 /* MPPasswordsSegue.m */; }; @@ -54,7 +53,6 @@ 93D39E281E3658B30550CB55 /* NSDictionary+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39AA1EE2E1E7B81372240 /* NSDictionary+Indexing.m */; }; 93D39E34FD28D24FE3442C48 /* UITextView+PearlAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3977321EB249981821AB0 /* UITextView+PearlAttributes.m */; }; 93D39EAA4D064193074D3021 /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A813CA9D7E192261ED2 /* MPFixable.m */; }; - 93D39EDD960C381D64E4DCDD /* MPPasswordSmallCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3952CC60991B97D69F26A /* MPPasswordSmallCell.m */; }; 93D39F8A9254177891F38705 /* MPSetupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A28369954D147E239BA /* MPSetupViewController.m */; }; 93D39FA97F4C3F69A75D5A03 /* MPPasswordLargeGeneratedCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3993422E207BF0B21D089 /* MPPasswordLargeGeneratedCell.m */; }; DA04E33E14B1E70400ECA4F3 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA04E33D14B1E70400ECA4F3 /* MobileCoreServices.framework */; }; @@ -117,6 +115,9 @@ DA95D5F214DF0B2C008D1B94 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA95D5F014DF0B1E008D1B94 /* MessageUI.framework */; }; DA9B51551895D79E009D2A0B /* gittip.png in Resources */ = {isa = PBXBuildFile; fileRef = DA9B51541895D79E009D2A0B /* gittip.png */; }; DA9B51581895D853009D2A0B /* LLGitTip.m in Sources */ = {isa = PBXBuildFile; fileRef = DA9B51561895D853009D2A0B /* LLGitTip.m */; }; + DAA141201922FF020032B392 /* PearlTween.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA1411C1922FF020032B392 /* PearlTween.m */; }; + DAA141211922FF020032B392 /* PearlTween.h in Headers */ = {isa = PBXBuildFile; fileRef = DAA1411D1922FF020032B392 /* PearlTween.h */; }; + DAA141221922FF020032B392 /* map-macro.h in Headers */ = {isa = PBXBuildFile; fileRef = DAA1411F1922FF020032B392 /* map-macro.h */; }; DABB981615100B4000B05417 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DABB981515100B4000B05417 /* SystemConfiguration.framework */; }; DABD38DB1711E29700CF925C /* ui_background.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD360F1711E29400CF925C /* ui_background.png */; }; DABD38DC1711E29700CF925C /* ui_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD36101711E29400CF925C /* ui_background@2x.png */; }; @@ -535,9 +536,7 @@ 93D3923B42DA2DA18F287092 /* LLModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LLModel.m; sourceTree = ""; }; 93D3924EE15017F8A12CB436 /* MPPasswordsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordsViewController.m; sourceTree = ""; }; 93D392876BE5C011DE73B43F /* MPPopdownSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPopdownSegue.h; sourceTree = ""; }; - 93D3932D6C25F2C2D929F8A1 /* MPPasswordElementCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordElementCell.h; sourceTree = ""; }; 93D393310223DDB35218467A /* MPCombinedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCombinedViewController.m; sourceTree = ""; }; - 93D39342E5F115EFCC90E976 /* MPPasswordElementCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordElementCell.m; sourceTree = ""; }; 93D3937712BF1B67623E5764 /* MPEmergencySegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEmergencySegue.m; sourceTree = ""; }; 93D3937863061C3916AF7AD2 /* MPPasswordLargeCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordLargeCell.m; sourceTree = ""; }; 93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Indexing.h"; sourceTree = ""; }; @@ -546,7 +545,6 @@ 93D3942A356B639724157982 /* PearlOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlOverlay.h; sourceTree = ""; }; 93D394482BB07F90E8FD1314 /* UIResponder+PearlFirstResponder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIResponder+PearlFirstResponder.h"; sourceTree = ""; }; 93D3947F6BB69CA9A9124A5D /* MPPasswordLargeStoredCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordLargeStoredCell.m; sourceTree = ""; }; - 93D3952CC60991B97D69F26A /* MPPasswordSmallCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordSmallCell.m; sourceTree = ""; }; 93D3956915634581E737B38C /* PearlNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlNavigationController.m; sourceTree = ""; }; 93D395BA6B2CFF5F49A4D25F /* MPPasswordLargeStoredCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordLargeStoredCell.h; sourceTree = ""; }; 93D3966B527CA47A0A661CE2 /* MPPasswordLargeDeleteCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordLargeDeleteCell.h; sourceTree = ""; }; @@ -558,7 +556,6 @@ 93D397E3650384498E7E53C4 /* MPPasswordsCoachmarkViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordsCoachmarkViewController.m; sourceTree = ""; }; 93D3983278751A530262F64E /* LLConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LLConfig.h; sourceTree = ""; }; 93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlNavigationController.h; sourceTree = ""; }; - 93D39888EE06F06264CC963B /* MPPasswordSmallCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordSmallCell.h; sourceTree = ""; }; 93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+PearlFullDescription.h"; sourceTree = ""; }; 93D3990E0CD1B5CF9FBB2C07 /* MPWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPWebViewController.m; sourceTree = ""; }; 93D3993422E207BF0B21D089 /* MPPasswordLargeGeneratedCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordLargeGeneratedCell.m; sourceTree = ""; }; @@ -649,6 +646,11 @@ DA9B51541895D79E009D2A0B /* gittip.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gittip.png; sourceTree = ""; }; DA9B51561895D853009D2A0B /* LLGitTip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LLGitTip.m; sourceTree = ""; }; DA9B51571895D853009D2A0B /* LLGitTip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LLGitTip.h; sourceTree = ""; }; + DAA141191922FED80032B392 /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Crashlytics.framework; sourceTree = ""; }; + DAA1411B1922FED80032B392 /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Crashlytics.framework; sourceTree = ""; }; + DAA1411C1922FF020032B392 /* PearlTween.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlTween.m; sourceTree = ""; }; + DAA1411D1922FF020032B392 /* PearlTween.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlTween.h; sourceTree = ""; }; + DAA1411F1922FF020032B392 /* map-macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "map-macro.h"; sourceTree = ""; }; DAAC35DD156BD77D00C5FD93 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; DABB981515100B4000B05417 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; DABD360F1711E29400CF925C /* ui_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ui_background.png; sourceTree = ""; }; @@ -1359,7 +1361,6 @@ DAC632871486D95D0075AEA5 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; DAC77CAD148291A600BCF976 /* libPearl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPearl.a; sourceTree = BUILT_PRODUCTS_DIR; }; DAC77CB1148291A600BCF976 /* Pearl-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Pearl-Prefix.pch"; path = "../../MasterPassword/ObjC/Pearl/Pearl-Prefix.pch"; sourceTree = ""; }; - DACA22181705DE28002C6C22 /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Crashlytics.framework; sourceTree = ""; }; DACA22B71705DE7D002C6C22 /* UbiquityStoreManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UbiquityStoreManager.m; sourceTree = ""; }; DACA22B81705DE7D002C6C22 /* NSError+UbiquityStoreManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+UbiquityStoreManager.h"; sourceTree = ""; }; DACA22B91705DE7D002C6C22 /* NSError+UbiquityStoreManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+UbiquityStoreManager.m"; sourceTree = ""; }; @@ -1777,6 +1778,30 @@ path = include; sourceTree = ""; }; + DAA141181922FED80032B392 /* iOS */ = { + isa = PBXGroup; + children = ( + DAA141191922FED80032B392 /* Crashlytics.framework */, + ); + path = iOS; + sourceTree = ""; + }; + DAA1411A1922FED80032B392 /* Mac */ = { + isa = PBXGroup; + children = ( + DAA1411B1922FED80032B392 /* Crashlytics.framework */, + ); + path = Mac; + sourceTree = ""; + }; + DAA1411E1922FF020032B392 /* include */ = { + isa = PBXGroup; + children = ( + DAA1411F1922FF020032B392 /* map-macro.h */, + ); + path = include; + sourceTree = ""; + }; DABD360D1711E29400CF925C /* Media */ = { isa = PBXGroup; children = ( @@ -2589,10 +2614,6 @@ 93D390519405B76CC6A57C4F /* MPCell.h */, 93D39097C0AAE62C1C321BFC /* MPPasswordTypesCell.m */, 93D391243F64A77798B4D6A4 /* MPPasswordTypesCell.h */, - 93D3952CC60991B97D69F26A /* MPPasswordSmallCell.m */, - 93D39888EE06F06264CC963B /* MPPasswordSmallCell.h */, - 93D39342E5F115EFCC90E976 /* MPPasswordElementCell.m */, - 93D3932D6C25F2C2D929F8A1 /* MPPasswordElementCell.h */, 93D3937712BF1B67623E5764 /* MPEmergencySegue.m */, 93D39A41340CF778E00D0E6D /* MPEmergencySegue.h */, 93D39E7A12CC352B2825AA66 /* MPPasswordsSegue.m */, @@ -2627,8 +2648,9 @@ DACA22121705DDC5002C6C22 /* External */ = { isa = PBXGroup; children = ( + DAA141181922FED80032B392 /* iOS */, + DAA1411A1922FED80032B392 /* Mac */, DADEF3E91810D1980052CA3E /* LoveLyndir */, - DACA22181705DE28002C6C22 /* Crashlytics.framework */, DAFC5662172C57EC00CB5CC5 /* InAppSettingsKit */, DACA22C71705DEB0002C6C22 /* Localytics */, DAC77CAF148291A600BCF976 /* Pearl */, @@ -2953,6 +2975,9 @@ DAFE45D715039823003ABA7C /* Pearl */ = { isa = PBXGroup; children = ( + DAA1411C1922FF020032B392 /* PearlTween.m */, + DAA1411D1922FF020032B392 /* PearlTween.h */, + DAA1411E1922FF020032B392 /* include */, DAF4EF4E190A81E400023C90 /* NSManagedObject+Pearl.m */, DAF4EF4F190A81E400023C90 /* NSManagedObject+Pearl.h */, DA2CA4D918D28859007798F8 /* NSArray+Pearl.m */, @@ -3253,6 +3278,7 @@ DA30E9D715723E6900A68B4C /* PearlLazy.h in Headers */, DAEB936918AA537D000490CC /* pem2.h in Headers */, DAEB937F18AA537D000490CC /* ui_compat.h in Headers */, + DAA141211922FF020032B392 /* PearlTween.h in Headers */, DAFE4A63150399FF003ABA84 /* UIControl+PearlBlocks.h in Headers */, DAEB934A18AA537D000490CC /* crypto.h in Headers */, DAEB935618AA537D000490CC /* engine.h in Headers */, @@ -3286,6 +3312,7 @@ DAEB936218AA537D000490CC /* obj_mac.h in Headers */, DAEB934218AA537D000490CC /* bn.h in Headers */, DAF4EF51190A81E400023C90 /* NSManagedObject+Pearl.h in Headers */, + DAA141221922FF020032B392 /* map-macro.h in Headers */, 93D39B76DD5AB108BA8928E8 /* UIScrollView+PearlAdjustInsets.h in Headers */, 93D3980046016EFD05B35BC5 /* PearlUICollectionView.h in Headers */, 93D39536EB550E811CCD04BC /* UIResponder+PearlFirstResponder.h in Headers */, @@ -3861,8 +3888,6 @@ 93D39392DEDA376F93C6C718 /* MPCell.m in Sources */, 93D399278165FD6D950F0025 /* MPPasswordTypesCell.m in Sources */, 93D39A5FF670957C0AF8298D /* MPPasswordCell.m in Sources */, - 93D39EDD960C381D64E4DCDD /* MPPasswordSmallCell.m in Sources */, - 93D393BA1B8402D08DB40231 /* MPPasswordElementCell.m in Sources */, 93D398ECD7D1A0DEDDADF516 /* MPEmergencyViewController.m in Sources */, 93D391ED37C9F687FA51EAA1 /* MPEmergencySegue.m in Sources */, 93D394B5036C882B33C71872 /* MPPasswordsSegue.m in Sources */, @@ -3956,6 +3981,7 @@ 93D3954E96236384AFA00453 /* UIScrollView+PearlAdjustInsets.m in Sources */, 93D39A8EA1C49CE43B63F47B /* PearlUICollectionView.m in Sources */, 93D399246DC90F50913A1287 /* UIResponder+PearlFirstResponder.m in Sources */, + DAA141201922FF020032B392 /* PearlTween.m in Sources */, 93D391ECBD9BD2C64115B5DD /* PearlSizedTextView.m in Sources */, 93D39E34FD28D24FE3442C48 /* UITextView+PearlAttributes.m in Sources */, );