diff --git a/External/Pearl b/External/Pearl index 04a91a86..e50cad14 160000 --- a/External/Pearl +++ b/External/Pearl @@ -1 +1 @@ -Subproject commit 04a91a866fab0d0be753100961279bb7116082d9 +Subproject commit e50cad1411aaafe8083b3863e48b53a1f722c239 diff --git a/MasterPassword/ObjC/iOS/MPGuideViewController.h b/MasterPassword/ObjC/iOS/MPGuideViewController.h index e5d76e9c..c4e829ba 100644 --- a/MasterPassword/ObjC/iOS/MPGuideViewController.h +++ b/MasterPassword/ObjC/iOS/MPGuideViewController.h @@ -8,27 +8,13 @@ #import -@interface MPGuideViewController : UIViewController +@interface MPGuideViewController : UIViewController -@property(weak, nonatomic) IBOutlet UISearchBar *searchBar; -@property(weak, nonatomic) IBOutlet UIView *siteNameTip; -@property(weak, nonatomic) IBOutlet UIView *contentTip; -@property(weak, nonatomic) IBOutlet UILabel *contentTipText; -@property(weak, nonatomic) IBOutlet UIButton *usernameButton; -@property(weak, nonatomic) IBOutlet UIView *usernameTip; -@property(weak, nonatomic) IBOutlet UIButton *typeButton; -@property(weak, nonatomic) IBOutlet UIView *typeTip; -@property(weak, nonatomic) IBOutlet UIButton *toolButton; -@property(weak, nonatomic) IBOutlet UIView *toolTip; -@property(weak, nonatomic) IBOutlet UIProgressView *progress; -@property(weak, nonatomic) IBOutlet UIView *content; -@property(weak, nonatomic) IBOutlet UIButton *contentButton; -@property(weak, nonatomic) IBOutlet UITextField *contentText; -@property(weak, nonatomic) IBOutlet UIButton *largePlayButton; -@property(weak, nonatomic) IBOutlet UIButton *smallPlayButton; -@property(weak, nonatomic) IBOutlet UIView *alertTip; +@property(nonatomic) IBOutlet UICollectionView *collectionView; +@property(nonatomic) IBOutlet UILabel *captionLabel; +@property(nonatomic) IBOutlet UIPageControl *pageControl; +@property(nonatomic) IBOutlet UINavigationBar *navigationBar; -- (IBAction)play; -- (IBAction)close; +- (IBAction)close:(id)sender; @end diff --git a/MasterPassword/ObjC/iOS/MPGuideViewController.m b/MasterPassword/ObjC/iOS/MPGuideViewController.m index 4802e341..4918cc4b 100644 --- a/MasterPassword/ObjC/iOS/MPGuideViewController.m +++ b/MasterPassword/ObjC/iOS/MPGuideViewController.m @@ -8,17 +8,86 @@ #import "MPGuideViewController.h" +@interface MPGuideStep : NSObject + +@property(nonatomic) UIImage *image; +@property(nonatomic) NSString *caption; + ++ (instancetype)stepWithImage:(UIImage *)image caption:(NSString *)caption; + +@end + +@interface MPGuideStepCell : UICollectionViewCell + +@property(nonatomic) IBOutlet UIImageView *imageView; + +@end + @interface MPGuideViewController() -@property(nonatomic, strong) NSTimer *timer; -@property(nonatomic) int tickCount; -@property(nonatomic) int currentTick; -@property(nonatomic) int lastTick; -@property(nonatomic) BOOL muted; +@property(nonatomic, strong) NSArray *steps; @end @implementation MPGuideViewController +#pragma mark - Life + +- (void)viewDidLoad { + + [super viewDidLoad]; + + self.steps = @[ + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-0"] caption: + @"To begin, tap the \"New User\" icon and add yourself as a user to the application."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-1"] caption: + @"Enter your full name. Double-check that you have spelled your name correctly and capitalized it appropriately. Your passwords will depend on it."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-2"] caption: + @"Choose a master password: Use something new and long. A short sentence is ideal.\nDO NOT FORGET THIS ONE PASSWORD."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-3"] caption: + @"After logging in, you'll see an empty screen with a search box.\nTap the search box to begin adding sites."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-4"] caption: + @"To add a site, just enter its name fully and tap the result. Names can be anything, but we recommend using a site's bare domain name."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-5"] caption: + @"Your sites are easy to find and sorted by recency.\nTap any site to copy its password.\nYou can now switch and paste it in another app."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-6"] caption: + @"If the site you're looking for isn't easy to find, just type a few letters in the search box to filter the site list."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-7"] caption: + @"If you ever need a new password for the site, just tap the plus icon to increment its counter.\nYou can hold down to reset it back to 1."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-8"] caption: + @"The user icon lets you save your site's login.\nThis is useful if you find it hard to remember the user name for this site."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-9"] caption: + @"Master Password lets you swipe to upgrade or downgrade your password's complexity.\nSome sites won't let you use complex passwords."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-10"] caption: + @"To delete a site, swipe it all the way left to find the \"Delete Site\" button."], + [MPGuideStep stepWithImage:[UIImage imageNamed:@"image-11"] caption: + @"If you have a password that you cannot change, you can save it as a Personal password. Device Private means the site will not be backed up."], + ]; +} + +- (void)viewWillAppear:(BOOL)animated { + + [super viewWillAppear:animated]; + + [self.pageControl observeKeyPath:@"currentPage" + withBlock:^(id from, id to, NSKeyValueChange cause, UIPageControl *pageControl) { + MPGuideStep *activeStep = self.steps[pageControl.currentPage]; + self.captionLabel.text = activeStep.caption; + }]; + + [self.collectionView setContentOffset:CGPointZero]; + self.pageControl.currentPage = 0; + + if (self.navigationController) + [self.navigationBar removeFromSuperview]; +} + +- (void)viewWillDisappear:(BOOL)animated { + + [super viewWillDisappear:animated]; + + [self.pageControl removeKeyPathObservers]; +} + - (BOOL)shouldAutorotate { return NO; @@ -39,207 +108,72 @@ return UIInterfaceOrientationPortrait; } -- (void)viewDidLoad { +#pragma mark - UICollectionViewDataSource - [super viewDidLoad]; +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - self.siteNameTip.hidden = NO; - self.contentTip.hidden = NO; - self.usernameTip.hidden = NO; - self.typeTip.hidden = NO; - self.toolTip.hidden = NO; - self.alertTip.hidden = NO; - - self.tickCount = 30; + return self.pageControl.numberOfPages = [self.steps count]; } -- (void)viewWillAppear:(BOOL)animated { +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { - [self.navigationController setNavigationBarHidden:YES animated:animated]; + MPGuideStepCell *cell = [MPGuideStepCell dequeueCellFromCollectionView:collectionView indexPath:indexPath]; + cell.imageView.image = ((MPGuideStep *)self.steps[indexPath.item]).image; - inf(@"Guide will appear."); - [super viewWillAppear:animated]; - - if (self.navigationController) { - // Via setup - self.smallPlayButton.hidden = YES; - - self.searchBar.text = nil; - self.siteNameTip.alpha = 0; - self.content.alpha = 0; - self.content.frame = CGRectSetHeight( self.content.frame, 180 ); - self.contentTip.alpha = 0; - self.contentButton.highlighted = NO; - self.usernameTip.alpha = 0; - self.usernameButton.highlighted = NO; - self.typeTip.alpha = 0; - self.typeButton.highlighted = NO; - self.toolTip.alpha = 0; - self.toolButton.highlighted = NO; - self.alertTip.alpha = 0; - } - else { - // Via segue - self.largePlayButton.hidden = YES; - - self.searchBar.text = @"gmail.com"; - self.siteNameTip.alpha = 1; - self.content.alpha = 1; - self.content.frame = CGRectSetHeight( self.content.frame, 231 ); - self.contentTip.alpha = 1; - self.contentTipText.text = @"Tap to copy"; - self.contentButton.highlighted = NO; - self.usernameTip.alpha = 1; - self.usernameButton.highlighted = NO; - self.typeTip.alpha = 1; - self.typeButton.highlighted = NO; - self.toolTip.alpha = 0; - self.toolButton.highlighted = NO; - self.alertTip.alpha = 1; - } + return cell; } -- (void)viewWillDisappear:(BOOL)animated { +#pragma mark - UICollectionViewDelegateFlowLayout - inf(@"Guide will disappear."); - [super viewWillDisappear:animated]; +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout + sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + + return collectionView.bounds.size; } -- (IBAction)play { +#pragma mark - UIScrollViewDelegate - if (self.timer) { - // Pause - [self.timer invalidate]; - self.timer = nil; +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { - self.smallPlayButton.hidden = NO; - [self.smallPlayButton setImage:[UIImage imageNamed:@"icon_play"] forState:UIControlStateNormal]; - } - - else { - // Play - self.smallPlayButton.hidden = NO; - self.largePlayButton.hidden = YES; - [self.smallPlayButton setImage:[UIImage imageNamed:@"icon_pause"] forState:UIControlStateNormal]; - - self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tick:) - userInfo:nil repeats:YES]; - } + if (scrollView == self.collectionView) + self.pageControl.currentPage = [self.collectionView indexPathForItemAtPoint:CGRectGetCenter( self.collectionView.bounds )].item; } -- (IBAction)close { +#pragma mark - Actions - [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; +- (IBAction)close:(id)sender { + + [MPiOSConfig get].showSetup = @NO; + [self.navigationController dismissViewControllerAnimated:YES completion:nil]; + [self dismissViewControllerAnimated:YES completion:nil]; } -- (void)tick:(NSTimer *)timer { +#pragma mark - Private - self.lastTick = self.currentTick; - ++self.currentTick; - [self.progress setProgress:(float)self.currentTick / self.tickCount animated:YES]; +@end - if (self.currentTick < 5) { - [UIView animateWithDuration:0.5 animations:^{ - self.searchBar.text = nil; - self.siteNameTip.alpha = 1; - self.content.alpha = 0; - self.content.frame = CGRectSetHeight( self.content.frame, 180 ); - self.contentTip.alpha = 0; - self.usernameTip.alpha = 0; - self.typeTip.alpha = 0; - self.toolTip.alpha = 0; - self.alertTip.alpha = 0; - }]; - } - else if (self.currentTick < 10) { - [UIView animateWithDuration:0.5 animations:^{ - self.searchBar.text = @"gmail.com"; - self.siteNameTip.alpha = 0; - self.content.alpha = 1; - self.contentTip.alpha = 1; - self.contentTipText.text = @"Your password"; - self.usernameTip.alpha = 0; - self.typeTip.alpha = 0; - self.toolTip.alpha = 0; - self.alertTip.alpha = 0; - }]; - } - else if (self.currentTick < 15) { - [UIView animateWithDuration:0.5 animations:^{ - self.searchBar.text = @"gmail.com"; - self.siteNameTip.alpha = 0; - self.content.alpha = 1; - self.contentTip.alpha = 1; - self.contentTipText.text = @"Tap to copy"; - self.contentButton.highlighted = YES; - self.usernameTip.alpha = 0; - self.typeTip.alpha = 0; - self.toolButton.highlighted = NO; - self.toolTip.alpha = 0; - self.alertTip.alpha = 0; - }]; - } - else if (self.currentTick < 20) { - [UIView animateWithDuration:0.5 animations:^{ - self.searchBar.text = @"gmail.com"; - self.siteNameTip.alpha = 0; - self.content.alpha = 1; - self.content.frame = CGRectSetHeight( self.content.frame, 231 ); - self.contentTip.alpha = 0; - self.contentButton.highlighted = NO; - self.usernameButton.highlighted = YES; - self.usernameTip.alpha = 1; - self.typeTip.alpha = 0; - self.toolTip.alpha = 0; - self.alertTip.alpha = 0; - }]; - } - else if (self.currentTick < 25) { - [UIView animateWithDuration:0.5 animations:^{ - self.searchBar.text = @"gmail.com"; - self.siteNameTip.alpha = 0; - self.content.alpha = 1; - self.contentTip.alpha = 0; - self.usernameButton.highlighted = NO; - self.usernameTip.alpha = 0; - self.typeTip.alpha = 1; - self.typeButton.highlighted = YES; - self.toolTip.alpha = 0; - self.alertTip.alpha = 0; - }]; - } - else if (self.currentTick < 30) { - [UIView animateWithDuration:0.5 animations:^{ - self.searchBar.text = @"gmail.com"; - self.siteNameTip.alpha = 0; - self.content.alpha = 1; - self.contentTip.alpha = 0; - self.usernameTip.alpha = 0; - self.typeTip.alpha = 0; - self.typeButton.highlighted = NO; - self.toolButton.highlighted = YES; - self.toolTip.alpha = 1; - self.alertTip.alpha = 0; - self.contentText.text = @"XupuMajf4'Hafh"; - }]; - } - else if (self.currentTick <= self.tickCount) { - [self.timer invalidate]; - self.timer = nil; - self.currentTick = 0; - [UIView animateWithDuration:0.5 animations:^{ - [self.smallPlayButton setImage:[UIImage imageNamed:@"icon_play"] forState:UIControlStateNormal]; - self.searchBar.text = @"gmail.com"; - self.siteNameTip.alpha = 1; - self.content.alpha = 1; - self.contentTip.alpha = 1; - self.usernameTip.alpha = 1; - self.typeTip.alpha = 1; - self.toolButton.highlighted = NO; - self.toolTip.alpha = 0; - self.alertTip.alpha = 1; - }]; - } +@implementation MPGuideStep + ++ (instancetype)stepWithImage:(UIImage *)image caption:(NSString *)caption { + + MPGuideStep *step = [self new]; + step.image = image; + step.caption = caption; + + return step; +} + +@end + +@implementation MPGuideStepCell + +- (void)awakeFromNib { + + [super awakeFromNib]; + + self.imageView.layer.shadowColor = [UIColor grayColor].CGColor; + self.imageView.layer.shadowOffset = CGSizeZero; + self.imageView.layer.shadowOpacity = 0.5f; } @end diff --git a/MasterPassword/ObjC/iOS/MPNavigationController.m b/MasterPassword/ObjC/iOS/MPNavigationController.m index a7cf07aa..e852bfd1 100644 --- a/MasterPassword/ObjC/iOS/MPNavigationController.m +++ b/MasterPassword/ObjC/iOS/MPNavigationController.m @@ -21,6 +21,14 @@ @implementation MPNavigationController +- (void)viewDidAppear:(BOOL)animated { + + [super viewDidAppear:animated]; + + if ([[MPiOSConfig get].showSetup boolValue]) + [self performSegueWithIdentifier:@"setup" sender:self]; +} + - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"web"]) diff --git a/MasterPassword/ObjC/iOS/MPPasswordLargeGeneratedCell.m b/MasterPassword/ObjC/iOS/MPPasswordLargeGeneratedCell.m index 1a9c175d..0ac1466a 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordLargeGeneratedCell.m +++ b/MasterPassword/ObjC/iOS/MPPasswordLargeGeneratedCell.m @@ -158,16 +158,16 @@ switch (type) { case MPElementTypeGeneratedMaximum: - self.strengthLabel.text = @"> age of the universe"; + self.strengthLabel.text = @"422 quintillion years"; break; case MPElementTypeGeneratedLong: - self.strengthLabel.text = @"196 billion years"; + self.strengthLabel.text = @"1.4 years"; break; case MPElementTypeGeneratedMedium: - self.strengthLabel.text = @"5 months"; + self.strengthLabel.text = @"2 seconds"; break; case MPElementTypeGeneratedBasic: - self.strengthLabel.text = @"12 days"; + self.strengthLabel.text = @"trivial"; break; case MPElementTypeGeneratedShort: self.strengthLabel.text = @"trivial"; diff --git a/MasterPassword/ObjC/iOS/MPPasswordTypesCell.m b/MasterPassword/ObjC/iOS/MPPasswordTypesCell.m index 413df533..c67192d0 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordTypesCell.m +++ b/MasterPassword/ObjC/iOS/MPPasswordTypesCell.m @@ -216,7 +216,7 @@ if (scrollView == self.contentCollectionView) { NSIndexPath *targetIndexPath = [self.contentCollectionView indexPathForItemAtPoint: CGPointPlusCGPoint( *targetContentOffset, self.contentCollectionView.center )]; - *targetContentOffset = CGPointFromCGRectTopLeft( + *targetContentOffset = CGRectGetTopLeft( [self.contentCollectionView layoutAttributesForItemAtIndexPath:targetIndexPath].frame ); } } @@ -315,7 +315,7 @@ - (void)saveContentType { - CGPoint centerPoint = CGPointFromCGRectCenter( self.contentCollectionView.bounds ); + CGPoint centerPoint = CGRectGetCenter( self.contentCollectionView.bounds ); NSIndexPath *centerIndexPath = [self.contentCollectionView indexPathForItemAtPoint:centerPoint]; MPElementType type = [self typeForContentIndexPath:centerIndexPath]; if (type == ((MPElementType)NSNotFound)) diff --git a/MasterPassword/ObjC/iOS/MPPasswordsViewController.h b/MasterPassword/ObjC/iOS/MPPasswordsViewController.h index eacf3ba8..d203624d 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordsViewController.h +++ b/MasterPassword/ObjC/iOS/MPPasswordsViewController.h @@ -33,8 +33,6 @@ @property(assign, nonatomic) BOOL active; -@property(nonatomic, readonly) MPCoachmark *coachmark; - - (void)setActive:(BOOL)active animated:(BOOL)animated completion:(void (^)(BOOL finished))completion; - (void)updatePasswords; diff --git a/MasterPassword/ObjC/iOS/MPPasswordsViewController.m b/MasterPassword/ObjC/iOS/MPPasswordsViewController.m index 559dd683..ccc4c06d 100644 --- a/MasterPassword/ObjC/iOS/MPPasswordsViewController.m +++ b/MasterPassword/ObjC/iOS/MPPasswordsViewController.m @@ -52,7 +52,6 @@ _backgroundColor = self.passwordCollectionView.backgroundColor; _darkenedBackgroundColor = [_backgroundColor colorWithAlphaComponent:0.6f]; - _coachmark = [MPCoachmark coachmarkForClass:[self class] version:0]; self.view.backgroundColor = [UIColor clearColor]; [self.passwordCollectionView automaticallyAdjustInsetsForKeyboard]; @@ -72,16 +71,6 @@ [self updatePasswords]; } -- (void)viewDidAppear:(BOOL)animated { - - [super viewDidAppear:animated]; - - PearlMainQueueAfter( 1, ^{ - if (!self.coachmark.coached) - [self performSegueWithIdentifier:@"coachmarks" sender:self]; - } ); -} - - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; @@ -94,8 +83,6 @@ if ([segue.identifier isEqualToString:@"popdown"]) _popdownVC = segue.destinationViewController; - if ([segue.identifier isEqualToString:@"coachmarks"]) - ((MPCoachmarkViewController *)segue.destinationViewController).coachmark = self.coachmark; } - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { @@ -110,7 +97,7 @@ - (CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { - return CGSizeMake( collectionView.bounds.size.width, CGPointFromCGRectBottom( self.passwordsSearchBar.frame ).y ); + return CGSizeMake( collectionView.bounds.size.width, CGRectGetBottom( self.passwordsSearchBar.frame ).y ); } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout diff --git a/MasterPassword/ObjC/iOS/MPPreferencesViewController.h b/MasterPassword/ObjC/iOS/MPPreferencesViewController.h index f8fa6c49..fd97b35a 100644 --- a/MasterPassword/ObjC/iOS/MPPreferencesViewController.h +++ b/MasterPassword/ObjC/iOS/MPPreferencesViewController.h @@ -14,7 +14,7 @@ @property(weak, nonatomic) IBOutlet UISwitch *savePasswordSwitch; @property(weak, nonatomic) IBOutlet UITableViewCell *signOutCell; @property(weak, nonatomic) IBOutlet UITableViewCell *feedbackCell; -@property(weak, nonatomic) IBOutlet UITableViewCell *coachmarksCell; +@property(weak, nonatomic) IBOutlet UITableViewCell *showHelpCell; @property(weak, nonatomic) IBOutlet UITableViewCell *exportCell; @property(weak, nonatomic) IBOutlet UITableViewCell *checkInconsistencies; @property(weak, nonatomic) IBOutlet UIImageView *avatarImage; diff --git a/MasterPassword/ObjC/iOS/MPPreferencesViewController.m b/MasterPassword/ObjC/iOS/MPPreferencesViewController.m index fba96b81..55dc5354 100644 --- a/MasterPassword/ObjC/iOS/MPPreferencesViewController.m +++ b/MasterPassword/ObjC/iOS/MPPreferencesViewController.m @@ -65,10 +65,9 @@ [[MPiOSAppDelegate get] showFeedbackWithLogs:YES forVC:self]; if (cell == self.exportCell) [[MPiOSAppDelegate get] showExportForVC:self]; - if (cell == self.coachmarksCell) { + if (cell == self.showHelpCell) { MPPasswordsViewController *passwordsVC = [self dismissPopup]; - passwordsVC.coachmark.coached = NO; - [passwordsVC performSegueWithIdentifier:@"coachmarks" sender:self]; + [passwordsVC performSegueWithIdentifier:@"guide" sender:self]; } if (cell == self.checkInconsistencies) [MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) { diff --git a/MasterPassword/ObjC/iOS/MPUsersViewController.m b/MasterPassword/ObjC/iOS/MPUsersViewController.m index 9485901e..2d486a18 100644 --- a/MasterPassword/ObjC/iOS/MPUsersViewController.m +++ b/MasterPassword/ObjC/iOS/MPUsersViewController.m @@ -684,7 +684,6 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) { - (void)setActive:(BOOL)active animated:(BOOL)animated { _active = active; - dbg(@"active -> %d", active); if (active) [self setActiveUserState:MPActiveUserStateNone animated:animated]; @@ -695,7 +694,6 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) { - (void)setUserIDs:(NSArray *)userIDs { _userIDs = userIDs; - dbg(@"userIDs -> %lu", (unsigned long)[userIDs count]); PearlMainQueue( ^{ BOOL isNew = NO; @@ -732,7 +730,6 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) { } [_afterUpdates setSuspended:YES]; - dbg(@"suspend updates"); __block BOOL requestFirstResponder = NO; [UIView animateWithDuration:animated? 0.4f: 0 animations:^{ MPAvatarCell *selectedAvatar = [self selectedAvatar]; @@ -752,10 +749,8 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) { // Set the entry container's contents. switch (activeUserState) { case MPActiveUserStateNone: - dbg(@"activeUserState -> none"); break; case MPActiveUserStateLogin: { - dbg(@"activeUserState -> login"); self.entryLabel.text = strl( @"Enter your master password:" ); self.entryField.secureTextEntry = YES; self.entryField.autocapitalizationType = UITextAutocapitalizationTypeNone; @@ -763,7 +758,6 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) { break; } case MPActiveUserStateUserName: { - dbg(@"activeUserState -> userName"); self.entryLabel.text = strl( @"Enter your full name:" ); self.entryField.secureTextEntry = NO; self.entryField.autocapitalizationType = UITextAutocapitalizationTypeWords; @@ -771,7 +765,6 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) { break; } case MPActiveUserStateMasterPasswordChoice: { - dbg(@"activeUserState -> masterPasswordChoice"); self.entryLabel.text = strl( @"Choose your master password:" ); self.entryField.secureTextEntry = YES; self.entryField.autocapitalizationType = UITextAutocapitalizationTypeNone; @@ -779,7 +772,6 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) { break; } case MPActiveUserStateMasterPasswordConfirmation: { - dbg(@"activeUserState -> masterPasswordConfirmation"); _masterPasswordChoice = self.entryField.text; self.entryLabel.text = strl( @"Confirm your master password:" ); self.entryField.secureTextEntry = YES; @@ -788,7 +780,6 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) { break; } case MPActiveUserStateMinimized: - dbg(@"activeUserState -> minimized"); break; } @@ -821,18 +812,12 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) { } } } completion:^(BOOL finished) { - dbg(@"resume updates"); [_afterUpdates setSuspended:NO]; }]; - UIResponder *oldFirstResponder = [UIResponder findFirstResponder]; + [self.entryField resignFirstResponder]; if (requestFirstResponder) [self.entryField becomeFirstResponder]; - else - [self.entryField resignFirstResponder]; - UIResponder *newFirstResponder = [UIResponder findFirstResponder]; - if (newFirstResponder != oldFirstResponder) - dbg(@"first responder: %@ -> %@", oldFirstResponder, newFirstResponder); } #pragma mark - Actions diff --git a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj index d61e169b..373ff4da 100644 --- a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj +++ b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj @@ -59,6 +59,34 @@ DA071BF3190187FE00179766 /* empty@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA071BF1190187FE00179766 /* empty@2x.png */; }; DA071BF4190187FE00179766 /* empty.png in Resources */ = {isa = PBXBuildFile; fileRef = DA071BF2190187FE00179766 /* empty.png */; }; DA095E75172F4CD8001C948B /* MPLogsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3979190DACEBD1F6AE9F4 /* MPLogsViewController.m */; }; + DA2509FB1956484D00AC23F1 /* image-11@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509E11956484D00AC23F1 /* image-11@2x.png */; }; + DA2509FC1956484D00AC23F1 /* image-11.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509E21956484D00AC23F1 /* image-11.png */; }; + DA2509FD1956484D00AC23F1 /* image-10@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509E31956484D00AC23F1 /* image-10@2x.png */; }; + DA2509FE1956484D00AC23F1 /* image-10.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509E41956484D00AC23F1 /* image-10.png */; }; + DA2509FF1956484D00AC23F1 /* image-9@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509E51956484D00AC23F1 /* image-9@2x.png */; }; + DA250A001956484D00AC23F1 /* image-9.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509E61956484D00AC23F1 /* image-9.png */; }; + DA250A011956484D00AC23F1 /* image-8@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509E71956484D00AC23F1 /* image-8@2x.png */; }; + DA250A021956484D00AC23F1 /* image-8.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509E81956484D00AC23F1 /* image-8.png */; }; + DA250A031956484D00AC23F1 /* image-7@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509E91956484D00AC23F1 /* image-7@2x.png */; }; + DA250A041956484D00AC23F1 /* image-7.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509EA1956484D00AC23F1 /* image-7.png */; }; + DA250A051956484D00AC23F1 /* image-6@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509EB1956484D00AC23F1 /* image-6@2x.png */; }; + DA250A061956484D00AC23F1 /* image-6.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509EC1956484D00AC23F1 /* image-6.png */; }; + DA250A071956484D00AC23F1 /* image-5@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509ED1956484D00AC23F1 /* image-5@2x.png */; }; + DA250A081956484D00AC23F1 /* image-5.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509EE1956484D00AC23F1 /* image-5.png */; }; + DA250A091956484D00AC23F1 /* image-4@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509EF1956484D00AC23F1 /* image-4@2x.png */; }; + DA250A0A1956484D00AC23F1 /* image-4.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509F01956484D00AC23F1 /* image-4.png */; }; + DA250A0B1956484D00AC23F1 /* image-3@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509F11956484D00AC23F1 /* image-3@2x.png */; }; + DA250A0C1956484D00AC23F1 /* image-3.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509F21956484D00AC23F1 /* image-3.png */; }; + DA250A0D1956484D00AC23F1 /* image-2@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509F31956484D00AC23F1 /* image-2@2x.png */; }; + DA250A0E1956484D00AC23F1 /* image-2.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509F41956484D00AC23F1 /* image-2.png */; }; + DA250A0F1956484D00AC23F1 /* image-1@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509F51956484D00AC23F1 /* image-1@2x.png */; }; + DA250A101956484D00AC23F1 /* image-1.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509F61956484D00AC23F1 /* image-1.png */; }; + DA250A111956484D00AC23F1 /* image-0@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509F71956484D00AC23F1 /* image-0@2x.png */; }; + DA250A121956484D00AC23F1 /* image-0.png in Resources */ = {isa = PBXBuildFile; fileRef = DA2509F81956484D00AC23F1 /* image-0.png */; }; + DA250A17195665A100AC23F1 /* UITableView+PearlReloadFromArray.m in Sources */ = {isa = PBXBuildFile; fileRef = DA250A13195665A100AC23F1 /* UITableView+PearlReloadFromArray.m */; }; + DA250A18195665A100AC23F1 /* UITableView+PearlReloadFromArray.h in Headers */ = {isa = PBXBuildFile; fileRef = DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */; }; + DA250A19195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m in Sources */ = {isa = PBXBuildFile; fileRef = DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */; }; + DA250A1A195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h in Headers */ = {isa = PBXBuildFile; fileRef = DA250A16195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h */; }; DA2CA4DD18D28859007798F8 /* NSArray+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4D918D28859007798F8 /* NSArray+Pearl.m */; }; DA2CA4DE18D28859007798F8 /* NSArray+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2CA4DA18D28859007798F8 /* NSArray+Pearl.h */; }; DA2CA4DF18D28859007798F8 /* NSTimer+PearlBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4DB18D28859007798F8 /* NSTimer+PearlBlock.m */; }; @@ -541,6 +569,34 @@ DA04E33D14B1E70400ECA4F3 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; DA071BF1190187FE00179766 /* empty@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "empty@2x.png"; sourceTree = ""; }; DA071BF2190187FE00179766 /* empty.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = empty.png; sourceTree = ""; }; + DA2509E11956484D00AC23F1 /* image-11@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-11@2x.png"; sourceTree = ""; }; + DA2509E21956484D00AC23F1 /* image-11.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-11.png"; sourceTree = ""; }; + DA2509E31956484D00AC23F1 /* image-10@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-10@2x.png"; sourceTree = ""; }; + DA2509E41956484D00AC23F1 /* image-10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-10.png"; sourceTree = ""; }; + DA2509E51956484D00AC23F1 /* image-9@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-9@2x.png"; sourceTree = ""; }; + DA2509E61956484D00AC23F1 /* image-9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-9.png"; sourceTree = ""; }; + DA2509E71956484D00AC23F1 /* image-8@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-8@2x.png"; sourceTree = ""; }; + DA2509E81956484D00AC23F1 /* image-8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-8.png"; sourceTree = ""; }; + DA2509E91956484D00AC23F1 /* image-7@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-7@2x.png"; sourceTree = ""; }; + DA2509EA1956484D00AC23F1 /* image-7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-7.png"; sourceTree = ""; }; + DA2509EB1956484D00AC23F1 /* image-6@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-6@2x.png"; sourceTree = ""; }; + DA2509EC1956484D00AC23F1 /* image-6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-6.png"; sourceTree = ""; }; + DA2509ED1956484D00AC23F1 /* image-5@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-5@2x.png"; sourceTree = ""; }; + DA2509EE1956484D00AC23F1 /* image-5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-5.png"; sourceTree = ""; }; + DA2509EF1956484D00AC23F1 /* image-4@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-4@2x.png"; sourceTree = ""; }; + DA2509F01956484D00AC23F1 /* image-4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-4.png"; sourceTree = ""; }; + DA2509F11956484D00AC23F1 /* image-3@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-3@2x.png"; sourceTree = ""; }; + DA2509F21956484D00AC23F1 /* image-3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-3.png"; sourceTree = ""; }; + DA2509F31956484D00AC23F1 /* image-2@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-2@2x.png"; sourceTree = ""; }; + DA2509F41956484D00AC23F1 /* image-2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-2.png"; sourceTree = ""; }; + DA2509F51956484D00AC23F1 /* image-1@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-1@2x.png"; sourceTree = ""; }; + DA2509F61956484D00AC23F1 /* image-1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-1.png"; sourceTree = ""; }; + DA2509F71956484D00AC23F1 /* image-0@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-0@2x.png"; sourceTree = ""; }; + DA2509F81956484D00AC23F1 /* image-0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image-0.png"; sourceTree = ""; }; + DA250A13195665A100AC23F1 /* UITableView+PearlReloadFromArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITableView+PearlReloadFromArray.m"; sourceTree = ""; }; + DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITableView+PearlReloadFromArray.h"; sourceTree = ""; }; + DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UICollectionReusableView+PearlDequeue.m"; sourceTree = ""; }; + DA250A16195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UICollectionReusableView+PearlDequeue.h"; sourceTree = ""; }; DA2CA4D918D28859007798F8 /* NSArray+Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Pearl.m"; sourceTree = ""; }; DA2CA4DA18D28859007798F8 /* NSArray+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Pearl.h"; sourceTree = ""; }; DA2CA4DB18D28859007798F8 /* NSTimer+PearlBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+PearlBlock.m"; sourceTree = ""; }; @@ -1598,6 +1654,37 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + DA2509B619563E1E00AC23F1 /* Guide */ = { + isa = PBXGroup; + children = ( + DA2509E11956484D00AC23F1 /* image-11@2x.png */, + DA2509E21956484D00AC23F1 /* image-11.png */, + DA2509E31956484D00AC23F1 /* image-10@2x.png */, + DA2509E41956484D00AC23F1 /* image-10.png */, + DA2509E51956484D00AC23F1 /* image-9@2x.png */, + DA2509E61956484D00AC23F1 /* image-9.png */, + DA2509E71956484D00AC23F1 /* image-8@2x.png */, + DA2509E81956484D00AC23F1 /* image-8.png */, + DA2509E91956484D00AC23F1 /* image-7@2x.png */, + DA2509EA1956484D00AC23F1 /* image-7.png */, + DA2509EB1956484D00AC23F1 /* image-6@2x.png */, + DA2509EC1956484D00AC23F1 /* image-6.png */, + DA2509ED1956484D00AC23F1 /* image-5@2x.png */, + DA2509EE1956484D00AC23F1 /* image-5.png */, + DA2509EF1956484D00AC23F1 /* image-4@2x.png */, + DA2509F01956484D00AC23F1 /* image-4.png */, + DA2509F11956484D00AC23F1 /* image-3@2x.png */, + DA2509F21956484D00AC23F1 /* image-3.png */, + DA2509F31956484D00AC23F1 /* image-2@2x.png */, + DA2509F41956484D00AC23F1 /* image-2.png */, + DA2509F51956484D00AC23F1 /* image-1@2x.png */, + DA2509F61956484D00AC23F1 /* image-1.png */, + DA2509F71956484D00AC23F1 /* image-0@2x.png */, + DA2509F81956484D00AC23F1 /* image-0.png */, + ); + path = Guide; + sourceTree = ""; + }; DA5BFA39147E415C00F98B1E = { isa = PBXGroup; children = ( @@ -1696,6 +1783,7 @@ DABD360D1711E29400CF925C /* Media */ = { isa = PBXGroup; children = ( + DA2509B619563E1E00AC23F1 /* Guide */, DA071BF1190187FE00179766 /* empty@2x.png */, DA071BF2190187FE00179766 /* empty.png */, DADBB55918DB0CFC00D099FE /* keyboard-dark@2x.png */, @@ -2904,6 +2992,10 @@ DAFE460715039823003ABA7C /* Pearl-UIKit */ = { isa = PBXGroup; children = ( + DA250A13195665A100AC23F1 /* UITableView+PearlReloadFromArray.m */, + DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */, + DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */, + DA250A16195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h */, DAEC85B118E3DD9A007FC0DF /* PearlUIView.m */, DAEC85B218E3DD9A007FC0DF /* PearlUINavigationBar.m */, DAEC85B318E3DD9A007FC0DF /* PearlUINavigationBar.h */, @@ -3020,6 +3112,7 @@ DAEB936F18AA537D000490CC /* rc4.h in Headers */, DAEB933318AA537D000490CC /* crypto_aesctr.h in Headers */, DAEB936718AA537D000490CC /* ossl_typ.h in Headers */, + DA250A1A195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.h in Headers */, DAEB937018AA537D000490CC /* ripemd.h in Headers */, DAEB933F18AA537D000490CC /* asn1t.h in Headers */, DAEB936418AA537D000490CC /* ocsp.h in Headers */, @@ -3046,6 +3139,7 @@ DAFE4A2815039824003ABA7C /* PearlMathUtils.h in Headers */, DAEB934418AA537D000490CC /* camellia.h in Headers */, DAFE4A2A15039824003ABA7C /* PearlObjectUtils.h in Headers */, + DA250A18195665A100AC23F1 /* UITableView+PearlReloadFromArray.h in Headers */, DAEB936D18AA537D000490CC /* rand.h in Headers */, DAFE4A2C15039824003ABA7C /* PearlResettable.h in Headers */, DAFE4A2D15039824003ABA7C /* PearlStrings.h in Headers */, @@ -3425,6 +3519,7 @@ DACA296F1705DF81002C6C22 /* Crashlytics.plist in Resources */, DADEF4171810D2940052CA3E /* love-lyndir.button.red@2x.png in Resources */, DACA29731705E1A8002C6C22 /* ciphers.plist in Resources */, + DA250A0F1956484D00AC23F1 /* image-1@2x.png in Resources */, DACA29741705E1A8002C6C22 /* dictionary.lst in Resources */, DA45224C190628B2008F650A /* icon_gear@2x.png in Resources */, DA854C8318D4CFBF00106317 /* avatar-add@2x.png in Resources */, @@ -3435,17 +3530,20 @@ DA4522451902355C008F650A /* icon_book@2x.png in Resources */, DABD39371711E29700CF925C /* avatar-0.png in Resources */, DABD39381711E29700CF925C /* avatar-0@2x.png in Resources */, + DA250A041956484D00AC23F1 /* image-7.png in Resources */, DABD39391711E29700CF925C /* avatar-1.png in Resources */, DA7304E5194E025900E72520 /* tip_basic_black.png in Resources */, DABD393A1711E29700CF925C /* avatar-10.png in Resources */, DABD393B1711E29700CF925C /* avatar-10@2x.png in Resources */, DADEF41C1810D2940052CA3E /* love-lyndir.heart.red.png in Resources */, DABD393C1711E29700CF925C /* avatar-11.png in Resources */, + DA250A0A1956484D00AC23F1 /* image-4.png in Resources */, DABD393D1711E29700CF925C /* avatar-11@2x.png in Resources */, DA73049D194E022700E72520 /* ui_spinner.png in Resources */, DABD393E1711E29700CF925C /* avatar-12.png in Resources */, DABD393F1711E29700CF925C /* avatar-12@2x.png in Resources */, DA67461018DE7F0C00DFE240 /* Exo2.0-Bold.otf in Resources */, + DA2509FC1956484D00AC23F1 /* image-11.png in Resources */, DABD39401711E29700CF925C /* avatar-13.png in Resources */, DABD39411711E29700CF925C /* avatar-13@2x.png in Resources */, DABD39421711E29700CF925C /* avatar-14.png in Resources */, @@ -3456,9 +3554,11 @@ DABD39461711E29700CF925C /* avatar-16.png in Resources */, DABD39471711E29700CF925C /* avatar-16@2x.png in Resources */, DA7304E7194E027C00E72520 /* Square-bottom.png in Resources */, + DA250A091956484D00AC23F1 /* image-4@2x.png in Resources */, DABD39481711E29700CF925C /* avatar-17.png in Resources */, DABD39491711E29700CF925C /* avatar-17@2x.png in Resources */, DAC8DF47192831E100BA7D71 /* icon_key.png in Resources */, + DA250A071956484D00AC23F1 /* image-5@2x.png in Resources */, DAC8DF48192831E100BA7D71 /* icon_key@2x.png in Resources */, DABD394A1711E29700CF925C /* avatar-18.png in Resources */, DABD394B1711E29700CF925C /* avatar-18@2x.png in Resources */, @@ -3467,19 +3567,24 @@ DA67460E18DE7F0C00DFE240 /* Exo2.0-Regular.otf in Resources */, DABD394D1711E29700CF925C /* avatar-2.png in Resources */, DABD394E1711E29700CF925C /* avatar-2@2x.png in Resources */, + DA250A061956484D00AC23F1 /* image-6.png in Resources */, DABD394F1711E29700CF925C /* avatar-3.png in Resources */, DA67460F18DE7F0C00DFE240 /* Exo2.0-ExtraBold.otf in Resources */, DABD39501711E29700CF925C /* avatar-3@2x.png in Resources */, DABD39511711E29700CF925C /* avatar-4.png in Resources */, + DA2509FD1956484D00AC23F1 /* image-10@2x.png in Resources */, DABD39521711E29700CF925C /* avatar-4@2x.png in Resources */, DABD39531711E29700CF925C /* avatar-5.png in Resources */, DA73049E194E022700E72520 /* ui_spinner@2x.png in Resources */, DABD39541711E29700CF925C /* avatar-5@2x.png in Resources */, + DA250A031956484D00AC23F1 /* image-7@2x.png in Resources */, DABD39551711E29700CF925C /* avatar-6.png in Resources */, DABD39561711E29700CF925C /* avatar-6@2x.png in Resources */, DABD39571711E29700CF925C /* avatar-7.png in Resources */, DABD39581711E29700CF925C /* avatar-7@2x.png in Resources */, DABD39591711E29700CF925C /* avatar-8.png in Resources */, + DA250A0D1956484D00AC23F1 /* image-2@2x.png in Resources */, + DA250A051956484D00AC23F1 /* image-6@2x.png in Resources */, DADEF41D1810D2940052CA3E /* love-lyndir.heart.red@2x.png in Resources */, DABD395A1711E29700CF925C /* avatar-8@2x.png in Resources */, DABD395B1711E29700CF925C /* avatar-9.png in Resources */, @@ -3488,8 +3593,10 @@ DA45224719062899008F650A /* icon_settings.png in Resources */, DABD395E1711E29700CF925C /* background@2x.png in Resources */, DA945C8717E3F3FD0053236B /* Images.xcassets in Resources */, + DA250A101956484D00AC23F1 /* image-1.png in Resources */, DABD39871711E29700CF925C /* SourceCodePro-Black.otf in Resources */, DADEF4161810D2940052CA3E /* love-lyndir.button.red.png in Resources */, + DA2509FE1956484D00AC23F1 /* image-10.png in Resources */, DADEF44E1810FA3B0052CA3E /* LoveLyndir.storyboard in Resources */, DABD39881711E29700CF925C /* SourceCodePro-ExtraLight.otf in Resources */, DABD39A01711E29700CF925C /* icon_action.png in Resources */, @@ -3497,6 +3604,7 @@ DABD39F21711E29700CF925C /* icon_cancel.png in Resources */, DA73049F194E022B00E72520 /* ui_textfield.png in Resources */, DABD39F31711E29700CF925C /* icon_cancel@2x.png in Resources */, + DA250A0C1956484D00AC23F1 /* image-3.png in Resources */, DABD3A261711E29700CF925C /* icon_edit.png in Resources */, DABD3A271711E29700CF925C /* icon_edit@2x.png in Resources */, DADEF41B1810D2940052CA3E /* love-lyndir.heart.grey@2x.png in Resources */, @@ -3512,14 +3620,17 @@ DADEF4141810D2940052CA3E /* love-lyndir.button.grey.png in Resources */, DABD3ABD1711E29800CF925C /* icon_play@2x.png in Resources */, DABD3ABE1711E29800CF925C /* icon_plus.png in Resources */, + DA250A081956484D00AC23F1 /* image-5.png in Resources */, DABD3ABF1711E29800CF925C /* icon_plus@2x.png in Resources */, DADEF4181810D2940052CA3E /* love-lyndir.heart.green.png in Resources */, DA69540717D975D900BF294E /* icon_gears@2x.png in Resources */, DABD3B1C1711E29800CF925C /* icon_up.png in Resources */, DABD3B1D1711E29800CF925C /* icon_up@2x.png in Resources */, + DA250A121956484D00AC23F1 /* image-0.png in Resources */, DA9B51551895D79E009D2A0B /* gittip.png in Resources */, DA4522441902355C008F650A /* icon_book.png in Resources */, DABD3B8A1711E29800CF925C /* help.html in Resources */, + DA2509FF1956484D00AC23F1 /* image-9@2x.png in Resources */, DABD3B8D1711E29800CF925C /* keypad.png in Resources */, DABD3B8E1711E29800CF925C /* logo-bare.png in Resources */, DADEF44B1810E7F30052CA3E /* love-lyndir.picker.png in Resources */, @@ -3533,11 +3644,14 @@ DA7304A0194E022B00E72520 /* ui_textfield@2x.png in Resources */, DA452249190628A1008F650A /* icon_wrench.png in Resources */, DA45224819062899008F650A /* icon_settings@2x.png in Resources */, + DA250A001956484D00AC23F1 /* image-9.png in Resources */, DADEF4121810D2940052CA3E /* love-lyndir.button.green.png in Resources */, DA854C8418D4CFBF00106317 /* avatar-add.png in Resources */, DABD3C241711E2DC00CF925C /* MasterPassword.entitlements in Resources */, DABD3C251711E2DC00CF925C /* Settings.bundle in Resources */, DABD3C261711E2DC00CF925C /* InfoPlist.strings in Resources */, + DA2509FB1956484D00AC23F1 /* image-11@2x.png in Resources */, + DA250A0B1956484D00AC23F1 /* image-3@2x.png in Resources */, DABD3FCA1712446200CF925C /* cloud.png in Resources */, DABD3FCB1712446200CF925C /* cloud@2x.png in Resources */, DABD3FCE1714F45C00CF925C /* identity.png in Resources */, @@ -3546,11 +3660,15 @@ DA45224B190628B2008F650A /* icon_gear.png in Resources */, DAE1EF2217E942DE00BC0086 /* Localizable.strings in Resources */, DA38D6A318CCB5BF009AEB3E /* Storyboard.storyboard in Resources */, + DA250A021956484D00AC23F1 /* image-8.png in Resources */, DA5A09DF171A70E4005284AB /* play.png in Resources */, DA5A09E0171A70E4005284AB /* play@2x.png in Resources */, DA5A09EA171BB0F7005284AB /* unlocked.png in Resources */, + DA250A0E1956484D00AC23F1 /* image-2.png in Resources */, DA5A09EB171BB0F7005284AB /* unlocked@2x.png in Resources */, DADEF44C1810E7F30052CA3E /* love-lyndir.picker@2x.png in Resources */, + DA250A011956484D00AC23F1 /* image-8@2x.png in Resources */, + DA250A111956484D00AC23F1 /* image-0@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3699,6 +3817,7 @@ DAFE4A3015039824003ABA7C /* PearlStringUtils.m in Sources */, DAFE4A3515039824003ABA7C /* PearlCryptUtils.m in Sources */, DAFE4A3715039824003ABA7C /* PearlKeyChain.m in Sources */, + DA250A17195665A100AC23F1 /* UITableView+PearlReloadFromArray.m in Sources */, DAFE4A3915039824003ABA7C /* PearlRSAKey.m in Sources */, DAFE4A3B15039824003ABA7C /* PearlSCrypt.m in Sources */, DAFE4A3F15039824003ABA7C /* PearlAlert.m in Sources */, @@ -3706,6 +3825,7 @@ DAFE4A4315039824003ABA7C /* PearlBoxView.m in Sources */, DAFE4A4515039824003ABA7C /* PearlGradientView.m in Sources */, DAFE4A4715039824003ABA7C /* PearlLayout.m in Sources */, + DA250A19195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m in Sources */, DAFE4A4915039824003ABA7C /* PearlLayoutView.m in Sources */, DAFE4A4B15039824003ABA7C /* PearlMessageView.m in Sources */, DAFE4A4D15039824003ABA7C /* PearlRootViewController.m in Sources */, diff --git a/MasterPassword/ObjC/iOS/Storyboard.storyboard b/MasterPassword/ObjC/iOS/Storyboard.storyboard index 928f45a6..0b692f56 100644 --- a/MasterPassword/ObjC/iOS/Storyboard.storyboard +++ b/MasterPassword/ObjC/iOS/Storyboard.storyboard @@ -361,11 +361,11 @@ - + - + @@ -504,9 +504,43 @@ - + + + + + + + + + + + + + + + + + + + + + + + @@ -539,7 +573,7 @@ - + @@ -605,7 +639,7 @@ - + @@ -685,7 +719,7 @@ - + @@ -729,7 +763,7 @@ - + @@ -762,40 +796,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -959,11 +959,11 @@ - + @@ -1403,7 +1403,7 @@ - + @@ -1522,7 +1522,7 @@ - + @@ -1852,23 +1852,133 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1886,7 +1996,7 @@ - + @@ -2222,437 +2332,6 @@ However, it means that anyone who finds your device unlocked can do the same. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2818,17 +2497,40 @@ See - + + + + + + + + + + + + + + + + + + + + + + + + @@ -2843,6 +2545,7 @@ See + @@ -2855,6 +2558,7 @@ See - + + diff --git a/MasterPassword/Resources/Media/Guide/image-0.png b/MasterPassword/Resources/Media/Guide/image-0.png new file mode 100644 index 00000000..03084b95 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-0.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-0@2x.png b/MasterPassword/Resources/Media/Guide/image-0@2x.png new file mode 100644 index 00000000..639d3bbd Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-0@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-1.png b/MasterPassword/Resources/Media/Guide/image-1.png new file mode 100644 index 00000000..bbb994a6 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-1.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-10.png b/MasterPassword/Resources/Media/Guide/image-10.png new file mode 100644 index 00000000..98103e97 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-10.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-10@2x.png b/MasterPassword/Resources/Media/Guide/image-10@2x.png new file mode 100644 index 00000000..4dd18646 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-10@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-11.png b/MasterPassword/Resources/Media/Guide/image-11.png new file mode 100644 index 00000000..63558f75 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-11.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-11@2x.png b/MasterPassword/Resources/Media/Guide/image-11@2x.png new file mode 100644 index 00000000..92d90b67 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-11@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-1@2x.png b/MasterPassword/Resources/Media/Guide/image-1@2x.png new file mode 100644 index 00000000..0ed7f1d7 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-1@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-2.png b/MasterPassword/Resources/Media/Guide/image-2.png new file mode 100644 index 00000000..75fc55de Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-2.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-2@2x.png b/MasterPassword/Resources/Media/Guide/image-2@2x.png new file mode 100644 index 00000000..e6fbcb65 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-2@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-3.png b/MasterPassword/Resources/Media/Guide/image-3.png new file mode 100644 index 00000000..64a9fbf2 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-3.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-3@2x.png b/MasterPassword/Resources/Media/Guide/image-3@2x.png new file mode 100644 index 00000000..71de522b Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-3@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-4.png b/MasterPassword/Resources/Media/Guide/image-4.png new file mode 100644 index 00000000..8e82abe9 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-4.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-4@2x.png b/MasterPassword/Resources/Media/Guide/image-4@2x.png new file mode 100644 index 00000000..7d505187 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-4@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-5.png b/MasterPassword/Resources/Media/Guide/image-5.png new file mode 100644 index 00000000..3c1654f4 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-5.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-5@2x.png b/MasterPassword/Resources/Media/Guide/image-5@2x.png new file mode 100644 index 00000000..c0e65203 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-5@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-6.png b/MasterPassword/Resources/Media/Guide/image-6.png new file mode 100644 index 00000000..d26b3bd8 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-6.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-6@2x.png b/MasterPassword/Resources/Media/Guide/image-6@2x.png new file mode 100644 index 00000000..1ee86fe9 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-6@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-7.png b/MasterPassword/Resources/Media/Guide/image-7.png new file mode 100644 index 00000000..1ed99659 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-7.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-7@2x.png b/MasterPassword/Resources/Media/Guide/image-7@2x.png new file mode 100644 index 00000000..bec99ab7 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-7@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-8.png b/MasterPassword/Resources/Media/Guide/image-8.png new file mode 100644 index 00000000..dde61cf2 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-8.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-8@2x.png b/MasterPassword/Resources/Media/Guide/image-8@2x.png new file mode 100644 index 00000000..4c80ff94 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-8@2x.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-9.png b/MasterPassword/Resources/Media/Guide/image-9.png new file mode 100644 index 00000000..88db5ad1 Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-9.png differ diff --git a/MasterPassword/Resources/Media/Guide/image-9@2x.png b/MasterPassword/Resources/Media/Guide/image-9@2x.png new file mode 100644 index 00000000..0654136d Binary files /dev/null and b/MasterPassword/Resources/Media/Guide/image-9@2x.png differ diff --git a/MasterPassword/Resources/Media/screen.png b/MasterPassword/Resources/Media/screen.png new file mode 100644 index 00000000..05ea760d Binary files /dev/null and b/MasterPassword/Resources/Media/screen.png differ diff --git a/MasterPassword/Resources/Media/small-screen.png b/MasterPassword/Resources/Media/small-screen.png new file mode 100644 index 00000000..4ac2f1ab Binary files /dev/null and b/MasterPassword/Resources/Media/small-screen.png differ