Operational emergency generator.
This commit is contained in:
parent
b2624c7572
commit
87b01fcaaf
@ -111,7 +111,7 @@ const long MPAvatarAdd = 10000;
|
||||
_newUser = YES;
|
||||
}
|
||||
else
|
||||
self.avatarImageView.image = [UIImage imageNamed:strf( @"avatar-%ld", avatar )];
|
||||
self.avatarImageView.image = [UIImage imageNamed:strf( @"avatar-%ld", _avatar )];
|
||||
}
|
||||
|
||||
- (NSString *)name {
|
||||
|
@ -20,18 +20,19 @@
|
||||
|
||||
@interface MPEmergencyViewController : UIViewController <UITextFieldDelegate>
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UIView *emergencyGeneratorDialog;
|
||||
@property(weak, nonatomic) IBOutlet UIView *emergencyGeneratorContainer;
|
||||
@property(weak, nonatomic) IBOutlet UITextField *emergencyName;
|
||||
@property(weak, nonatomic) IBOutlet UITextField *emergencyMasterPassword;
|
||||
@property(weak, nonatomic) IBOutlet UITextField *emergencySite;
|
||||
@property(weak, nonatomic) IBOutlet UIStepper *emergencyCounterStepper;
|
||||
@property(weak, nonatomic) IBOutlet UISegmentedControl *emergencyTypeControl;
|
||||
@property(weak, nonatomic) IBOutlet UILabel *emergencyCounter;
|
||||
@property(weak, nonatomic) IBOutlet UIActivityIndicatorView *emergencyActivity;
|
||||
@property(weak, nonatomic) IBOutlet UIButton *emergencyPassword;
|
||||
@property(weak, nonatomic) IBOutlet UIView *emergencyContentTipContainer;
|
||||
@property(weak, nonatomic) IBOutlet UIView *dialogView;
|
||||
@property(weak, nonatomic) IBOutlet UIView *containerView;
|
||||
@property(weak, nonatomic) IBOutlet UITextField *userNameField;
|
||||
@property(weak, nonatomic) IBOutlet UITextField *masterPasswordField;
|
||||
@property(weak, nonatomic) IBOutlet UITextField *siteField;
|
||||
@property(weak, nonatomic) IBOutlet UIStepper *counterStepper;
|
||||
@property(weak, nonatomic) IBOutlet UISegmentedControl *typeControl;
|
||||
@property(weak, nonatomic) IBOutlet UILabel *counterLabel;
|
||||
@property(weak, nonatomic) IBOutlet UIActivityIndicatorView *activity;
|
||||
@property(weak, nonatomic) IBOutlet UILabel *passwordLabel;
|
||||
@property(weak, nonatomic) IBOutlet UIView *tipContainer;
|
||||
|
||||
- (IBAction)emergencyCopy:(id)sender;
|
||||
- (IBAction)controlChanged:(UIControl *)control;
|
||||
- (IBAction)copyPassword:(UITapGestureRecognizer *)recognizer;
|
||||
|
||||
@end
|
||||
|
@ -18,20 +18,36 @@
|
||||
|
||||
#import "MPEmergencyViewController.h"
|
||||
#import "MPEntities.h"
|
||||
#import "MPAvatarCell.h"
|
||||
#import "MPiOSAppDelegate.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "MPAppDelegate_Key.h"
|
||||
#import "MPEmergencySegue.h"
|
||||
|
||||
@implementation MPEmergencyViewController
|
||||
@implementation MPEmergencyViewController {
|
||||
MPKey *_key;
|
||||
NSOperationQueue *_emergencyKeyQueue;
|
||||
NSOperationQueue *_emergencyPasswordQueue;
|
||||
}
|
||||
|
||||
- (void)viewDidLoad {
|
||||
|
||||
[super viewDidLoad];
|
||||
|
||||
[_emergencyKeyQueue = [NSOperationQueue new] setMaxConcurrentOperationCount:1];
|
||||
[_emergencyPasswordQueue = [NSOperationQueue new] setMaxConcurrentOperationCount:1];
|
||||
|
||||
self.view.backgroundColor = [UIColor clearColor];
|
||||
self.emergencyGeneratorDialog.layer.cornerRadius = 5;
|
||||
self.dialogView.layer.cornerRadius = 5;
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
|
||||
[super viewWillAppear:animated];
|
||||
|
||||
[self reset];
|
||||
}
|
||||
|
||||
- (void)viewDidDisappear:(BOOL)animated {
|
||||
|
||||
[super viewDidDisappear:animated];
|
||||
|
||||
[self reset];
|
||||
}
|
||||
|
||||
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender {
|
||||
@ -48,28 +64,112 @@
|
||||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (void)textFieldDidEndEditing:(UITextField *)textField {
|
||||
}
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||
|
||||
[textField resignFirstResponder];
|
||||
return YES;
|
||||
}
|
||||
|
||||
// This isn't really in UITextFieldDelegate. We fake it from UITextFieldTextDidChangeNotification.
|
||||
- (void)textFieldEditingChanged:(UITextField *)textField {
|
||||
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)emergencyClose:(id)sender {
|
||||
- (IBAction)controlChanged:(UIControl *)control {
|
||||
|
||||
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
|
||||
if (control == self.userNameField || control == self.masterPasswordField)
|
||||
[self updateKey];
|
||||
else
|
||||
[self updatePassword];
|
||||
}
|
||||
|
||||
- (IBAction)emergencyCopy:(id)sender {
|
||||
- (IBAction)copyPassword:(UITapGestureRecognizer *)recognizer {
|
||||
|
||||
if (recognizer.state == UIGestureRecognizerStateEnded) {
|
||||
NSString *sitePassword = self.passwordLabel.text;
|
||||
if ([sitePassword length]) {
|
||||
[UIPasteboard generalPasteboard].string = sitePassword;
|
||||
[UIView animateWithDuration:0.3f animations:^{
|
||||
self.tipContainer.alpha = 1;
|
||||
} completion:^(BOOL finished) {
|
||||
if (finished)
|
||||
PearlMainQueueAfter( 3, ^{
|
||||
self.tipContainer.alpha = 0;
|
||||
} );
|
||||
}];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (void)updateKey {
|
||||
|
||||
NSString *userName = self.userNameField.text;
|
||||
NSString *masterPassword = self.masterPasswordField.text;
|
||||
|
||||
self.passwordLabel.text = nil;
|
||||
[self.activity startAnimating];
|
||||
[_emergencyKeyQueue cancelAllOperations];
|
||||
[_emergencyKeyQueue addOperationWithBlock:^{
|
||||
if ([masterPassword length] && [userName length])
|
||||
_key = [MPAlgorithmDefault keyForPassword:masterPassword ofUserNamed:userName];
|
||||
else
|
||||
_key = nil;
|
||||
|
||||
PearlMainQueue( ^{
|
||||
[self updatePassword];
|
||||
} );
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)updatePassword {
|
||||
|
||||
NSString *siteName = self.siteField.text;
|
||||
MPElementType siteType = [self siteType];
|
||||
NSUInteger siteCounter = (NSUInteger)self.counterStepper.value;
|
||||
self.counterLabel.text = strf( @"%d", siteCounter );
|
||||
|
||||
self.passwordLabel.text = nil;
|
||||
[self.activity startAnimating];
|
||||
[_emergencyPasswordQueue cancelAllOperations];
|
||||
[_emergencyPasswordQueue addOperationWithBlock:^{
|
||||
NSString *sitePassword = nil;
|
||||
if (_key && [siteName length])
|
||||
sitePassword = [MPAlgorithmDefault generateContentNamed:siteName ofType:siteType withCounter:siteCounter usingKey:_key];
|
||||
|
||||
PearlMainQueue( ^{
|
||||
[self.activity stopAnimating];
|
||||
self.passwordLabel.text = sitePassword;
|
||||
} );
|
||||
}];
|
||||
}
|
||||
|
||||
- (enum MPElementType)siteType {
|
||||
|
||||
switch (self.typeControl.selectedSegmentIndex) {
|
||||
case 0:
|
||||
return MPElementTypeGeneratedMaximum;
|
||||
case 1:
|
||||
return MPElementTypeGeneratedLong;
|
||||
case 2:
|
||||
return MPElementTypeGeneratedMedium;
|
||||
case 3:
|
||||
return MPElementTypeGeneratedBasic;
|
||||
case 4:
|
||||
return MPElementTypeGeneratedShort;
|
||||
case 5:
|
||||
return MPElementTypeGeneratedPIN;
|
||||
default:
|
||||
Throw(@"Unsupported type index: %ld", (long)self.typeControl.selectedSegmentIndex);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)reset {
|
||||
|
||||
self.userNameField.text = nil;
|
||||
self.masterPasswordField.text = nil;
|
||||
self.siteField.text = nil;
|
||||
self.counterStepper.value = 1;
|
||||
self.typeControl.selectedSegmentIndex = 1;
|
||||
[self updateKey];
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -25,6 +25,8 @@
|
||||
|
||||
@implementation MPPasswordLargeCell
|
||||
|
||||
#pragma mark - Life
|
||||
|
||||
+ (instancetype)dequeueCellWithType:(MPElementType)type fromCollectionView:(UICollectionView *)collectionView
|
||||
atIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
@ -34,7 +36,7 @@
|
||||
else if (type & MPElementTypeClassStored)
|
||||
reuseIdentifier = NSStringFromClass( [MPPasswordLargeStoredCell class] );
|
||||
else
|
||||
Throw(@"Unexpected password type: %@", [MPAlgorithmDefault nameOfType:type]);
|
||||
Throw(@"Unexpected password type: %@", [MPAlgorithmDefault nameOfType:type]);
|
||||
|
||||
MPPasswordLargeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
|
||||
cell.type = type;
|
||||
@ -42,6 +44,110 @@
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (void)awakeFromNib {
|
||||
|
||||
[super awakeFromNib];
|
||||
|
||||
[self prepareForReuse];
|
||||
}
|
||||
|
||||
- (void)prepareForReuse {
|
||||
|
||||
_contentFieldMode = 0;
|
||||
self.contentField.text = nil;
|
||||
|
||||
[super prepareForReuse];
|
||||
}
|
||||
|
||||
- (void)reloadWithTransientSite:(NSString *)siteName {
|
||||
|
||||
[super reloadWithTransientSite:siteName];
|
||||
|
||||
self.loginButton.alpha = 0;
|
||||
self.upgradeButton.alpha = 0;
|
||||
self.typeLabel.text = [MPAlgorithmDefault nameOfType:self.type];
|
||||
if (self.type & MPElementTypeClassStored) {
|
||||
self.contentField.enabled = YES;
|
||||
self.contentField.placeholder = strl( @"Set custom password" );
|
||||
}
|
||||
else if (self.type & MPElementTypeClassGenerated) {
|
||||
self.contentField.enabled = NO;
|
||||
self.contentField.placeholder = strl( @"Generating..." );
|
||||
}
|
||||
else {
|
||||
self.contentField.enabled = NO;
|
||||
self.contentField.placeholder = nil;
|
||||
}
|
||||
|
||||
self.contentField.text = nil;
|
||||
[self resolveContentOfCellTypeForTransientSite:siteName usingKey:[MPiOSAppDelegate get].key result:^(NSString *string) {
|
||||
PearlMainQueue( ^{ self.contentField.text = string; } );
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)reloadWithElement:(MPElementEntity *)mainElement {
|
||||
|
||||
[super reloadWithElement:mainElement];
|
||||
|
||||
self.loginButton.alpha = 1;
|
||||
self.typeLabel.text = [mainElement.algorithm nameOfType:self.type];
|
||||
|
||||
if (mainElement.requiresExplicitMigration)
|
||||
self.upgradeButton.alpha = 1;
|
||||
else
|
||||
self.upgradeButton.alpha = 0;
|
||||
|
||||
switch (self.contentFieldMode) {
|
||||
case MPContentFieldModePassword: {
|
||||
if (self.type & MPElementTypeClassStored) {
|
||||
self.contentField.enabled = YES;
|
||||
self.contentField.placeholder = strl( @"Set custom password" );
|
||||
}
|
||||
else if (self.type & MPElementTypeClassGenerated) {
|
||||
self.contentField.enabled = NO;
|
||||
self.contentField.placeholder = strl( @"Generating..." );
|
||||
}
|
||||
else {
|
||||
self.contentField.enabled = NO;
|
||||
self.contentField.placeholder = nil;
|
||||
}
|
||||
|
||||
self.contentField.text = nil;
|
||||
MPKey *key = [MPiOSAppDelegate get].key;
|
||||
if (self.type == mainElement.type)
|
||||
[mainElement resolveContentUsingKey:key result:^(NSString *string) {
|
||||
PearlMainQueue( ^{ self.contentField.text = string; } );
|
||||
}];
|
||||
else
|
||||
[self resolveContentOfCellTypeForElement:mainElement usingKey:key result:^(NSString *string) {
|
||||
PearlMainQueue( ^{ self.contentField.text = string; } );
|
||||
}];
|
||||
break;
|
||||
}
|
||||
case MPContentFieldModeUser: {
|
||||
self.contentField.enabled = YES;
|
||||
self.contentField.placeholder = strl( @"Enter login name" );
|
||||
self.contentField.text = mainElement.loginName;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)resolveContentOfCellTypeForTransientSite:(NSString *)siteName usingKey:(MPKey *)key result:(void (^)(NSString *))resultBlock {
|
||||
|
||||
resultBlock( nil );
|
||||
}
|
||||
|
||||
- (void)resolveContentOfCellTypeForElement:(MPElementEntity *)element usingKey:(MPKey *)key result:(void (^)(NSString *))resultBlock {
|
||||
|
||||
resultBlock( nil );
|
||||
}
|
||||
|
||||
- (MPElementEntity *)saveContentTypeWithElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
return [[MPiOSAppDelegate get] changeElement:element saveInContext:context toType:self.type];
|
||||
}
|
||||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||
@ -76,94 +182,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Life cycle
|
||||
|
||||
- (void)prepareForReuse {
|
||||
|
||||
_contentFieldMode = 0;
|
||||
|
||||
[super prepareForReuse];
|
||||
}
|
||||
|
||||
- (void)reloadWithTransientSite:(NSString *)siteName {
|
||||
|
||||
[super reloadWithTransientSite:siteName];
|
||||
|
||||
self.loginButton.alpha = 0;
|
||||
self.upgradeButton.alpha = 0;
|
||||
self.contentField.enabled = NO;
|
||||
self.contentField.placeholder = strl( @"Tap to enter password" );
|
||||
self.typeLabel.text = [MPAlgorithmDefault nameOfType:self.type];
|
||||
|
||||
[self resolveContentOfCellTypeForTransientSite:siteName usingKey:[MPiOSAppDelegate get].key result:^(NSString *string) {
|
||||
PearlMainQueue( ^{ self.contentField.text = string; } );
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)reloadWithElement:(MPElementEntity *)mainElement {
|
||||
|
||||
[super reloadWithElement:mainElement];
|
||||
|
||||
self.loginButton.alpha = 1;
|
||||
self.typeLabel.text = [mainElement.algorithm nameOfType:self.type];
|
||||
|
||||
if (mainElement.requiresExplicitMigration)
|
||||
self.upgradeButton.alpha = 1;
|
||||
else
|
||||
self.upgradeButton.alpha = 0;
|
||||
|
||||
switch (self.contentFieldMode) {
|
||||
case MPContentFieldModePassword: {
|
||||
if (self.type & MPElementTypeClassStored) {
|
||||
self.contentField.enabled = YES;
|
||||
self.contentField.placeholder = strl( @"Enter custom password" );
|
||||
}
|
||||
else if (self.type & MPElementTypeClassGenerated) {
|
||||
self.contentField.enabled = NO;
|
||||
self.contentField.placeholder = strl( @"Generating..." );
|
||||
}
|
||||
else {
|
||||
self.contentField.enabled = NO;
|
||||
self.contentField.placeholder = nil;
|
||||
}
|
||||
self.contentField.text = nil;
|
||||
|
||||
MPKey *key = [MPiOSAppDelegate get].key;
|
||||
|
||||
if (self.type == mainElement.type)
|
||||
[mainElement resolveContentUsingKey:key result:^(NSString *string) {
|
||||
PearlMainQueue( ^{ self.contentField.text = string; } );
|
||||
}];
|
||||
else
|
||||
[self resolveContentOfCellTypeForElement:mainElement usingKey:key result:^(NSString *string) {
|
||||
PearlMainQueue( ^{ self.contentField.text = string; } );
|
||||
}];
|
||||
break;
|
||||
}
|
||||
case MPContentFieldModeUser: {
|
||||
self.contentField.enabled = YES;
|
||||
self.contentField.placeholder = strl( @"Enter login name" );
|
||||
self.contentField.text = mainElement.loginName;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)resolveContentOfCellTypeForTransientSite:(NSString *)siteName usingKey:(MPKey *)key result:(void (^)(NSString *))resultBlock {
|
||||
|
||||
resultBlock( nil );
|
||||
}
|
||||
|
||||
- (void)resolveContentOfCellTypeForElement:(MPElementEntity *)element usingKey:(MPKey *)key result:(void (^)(NSString *))resultBlock {
|
||||
|
||||
resultBlock( nil );
|
||||
}
|
||||
|
||||
- (MPElementEntity *)saveContentTypeWithElement:(MPElementEntity *)element saveInContext:(NSManagedObjectContext *)context {
|
||||
|
||||
return [[MPiOSAppDelegate get] changeElement:element saveInContext:context toType:self.type];
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)doUser:(id)sender {
|
||||
|
@ -37,7 +37,6 @@
|
||||
NSArray *_notificationObservers;
|
||||
__weak UITapGestureRecognizer *_passwordsDismissRecognizer;
|
||||
NSFetchedResultsController *_fetchedResultsController;
|
||||
NSManagedObjectID *_activeElementOID;
|
||||
BOOL _exactMatch;
|
||||
NSMutableDictionary *_fetchedUpdates;
|
||||
UIColor *_backgroundColor;
|
||||
@ -143,21 +142,24 @@
|
||||
initAlert:nil tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
||||
if (buttonIndex == [alert cancelButtonIndex]) {
|
||||
// Cancel
|
||||
[collectionView selectItemAtIndexPath:indexPath animated:NO
|
||||
NSIndexPath *indexPath_ = [collectionView indexPathForCell:cell];
|
||||
[collectionView selectItemAtIndexPath:indexPath_ animated:NO
|
||||
scrollPosition:UICollectionViewScrollPositionCenteredHorizontally];
|
||||
[collectionView deselectItemAtIndexPath:indexPath animated:YES];
|
||||
[collectionView deselectItemAtIndexPath:indexPath_ animated:YES];
|
||||
return;
|
||||
}
|
||||
|
||||
// Create
|
||||
[[MPiOSAppDelegate get] addElementNamed:newSiteName completion:^(MPElementEntity *element) {
|
||||
self.activeElement = element;
|
||||
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
|
||||
PearlMainQueue( ^{
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:strf( @"Added %@", newSiteName ) dismissAfter:2];
|
||||
[collectionView selectItemAtIndexPath:indexPath animated:NO
|
||||
scrollPosition:UICollectionViewScrollPositionCenteredHorizontally];
|
||||
[collectionView deselectItemAtIndexPath:indexPath animated:YES];
|
||||
}];
|
||||
PearlMainQueueAfter( 0.2f, ^{
|
||||
NSIndexPath *indexPath_ = [collectionView indexPathForCell:cell];
|
||||
[collectionView selectItemAtIndexPath:indexPath_ animated:NO
|
||||
scrollPosition:UICollectionViewScrollPositionCenteredHorizontally];
|
||||
[collectionView deselectItemAtIndexPath:indexPath_ animated:YES];
|
||||
} );
|
||||
} );
|
||||
}];
|
||||
} cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:[PearlStrings get].commonButtonYes, nil];
|
||||
return;
|
||||
@ -178,24 +180,32 @@
|
||||
@"emergency" : @NO
|
||||
} );
|
||||
|
||||
[element use];
|
||||
[element resolveContentUsingKey:[MPAppDelegate_Shared get].key result:^(NSString *result) {
|
||||
if (![result length]) {
|
||||
[collectionView selectItemAtIndexPath:indexPath animated:NO
|
||||
scrollPosition:UICollectionViewScrollPositionCenteredHorizontally];
|
||||
[collectionView deselectItemAtIndexPath:indexPath animated:YES];
|
||||
PearlMainQueue(^{
|
||||
NSIndexPath *indexPath_ = [collectionView indexPathForCell:cell];
|
||||
[collectionView selectItemAtIndexPath:indexPath_ animated:NO
|
||||
scrollPosition:UICollectionViewScrollPositionCenteredHorizontally];
|
||||
[collectionView deselectItemAtIndexPath:indexPath_ animated:YES];
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
[UIPasteboard generalPasteboard].string = result;
|
||||
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
|
||||
PearlMainQueue( ^{
|
||||
[PearlOverlay showTemporaryOverlayWithTitle:@"Password Copied" dismissAfter:2];
|
||||
PearlMainQueueAfter( 0.1f, ^{
|
||||
[collectionView selectItemAtIndexPath:indexPath animated:NO
|
||||
PearlMainQueueAfter( 0.2f, ^{
|
||||
NSIndexPath *indexPath_ = [collectionView indexPathForCell:cell];
|
||||
[collectionView selectItemAtIndexPath:indexPath_ animated:NO
|
||||
scrollPosition:UICollectionViewScrollPositionCenteredHorizontally];
|
||||
[collectionView deselectItemAtIndexPath:indexPath animated:YES];
|
||||
[collectionView deselectItemAtIndexPath:indexPath_ animated:YES];
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
[[cell elementInContext:context] use];
|
||||
[context saveToStore];
|
||||
}];
|
||||
} );
|
||||
}];
|
||||
} );
|
||||
}];
|
||||
}
|
||||
|
||||
@ -335,6 +345,16 @@
|
||||
|
||||
#pragma mark - UISearchBarDelegate
|
||||
|
||||
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
|
||||
|
||||
if (searchBar == self.passwordsSearchBar) {
|
||||
searchBar.text = nil;
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
|
||||
|
||||
if (searchBar == self.passwordsSearchBar) {
|
||||
@ -404,7 +424,6 @@
|
||||
queue:nil usingBlock:^(NSNotification *note) {
|
||||
Strongify(self);
|
||||
|
||||
self.activeElement = nil;
|
||||
_fetchedResultsController = nil;
|
||||
self.passwordsSearchBar.text = nil;
|
||||
[self updatePasswords];
|
||||
@ -438,8 +457,8 @@
|
||||
_mocObserver = [[NSNotificationCenter defaultCenter]
|
||||
addObserverForName:NSManagedObjectContextObjectsDidChangeNotification object:mainContext
|
||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||
Strongify(self);
|
||||
[self updatePasswords];
|
||||
// Strongify(self);
|
||||
// [self updatePasswords];
|
||||
}];
|
||||
if (!_storeObserver)
|
||||
_storeObserver = [[NSNotificationCenter defaultCenter]
|
||||
@ -534,13 +553,6 @@
|
||||
return _fetchedResultsController;
|
||||
}
|
||||
|
||||
- (void)setActiveElement:(MPElementEntity *)activeElement {
|
||||
|
||||
_activeElementOID = activeElement.objectID;
|
||||
|
||||
[self updatePasswords];
|
||||
}
|
||||
|
||||
- (void)setActive:(BOOL)active {
|
||||
|
||||
[self setActive:active animated:NO completion:nil];
|
||||
|
@ -27,7 +27,8 @@
|
||||
@property(weak, nonatomic) IBOutlet LLGitTip *gitTipButton;
|
||||
@property(weak, nonatomic) IBOutlet UITextField *entryField;
|
||||
@property(weak, nonatomic) IBOutlet UILabel *entryLabel;
|
||||
@property(weak, nonatomic) IBOutlet UILabel *entryTip;
|
||||
@property(weak, nonatomic) IBOutlet UILabel *entryTipTitleLabel;
|
||||
@property(weak, nonatomic) IBOutlet UILabel *entryTipSubtitleLabel;
|
||||
@property(weak, nonatomic) IBOutlet UIView *entryTipContainer;
|
||||
@property(weak, nonatomic) IBOutlet UIView *entryContainer;
|
||||
@property(weak, nonatomic) IBOutlet UIView *footerContainer;
|
||||
|
@ -127,7 +127,7 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) {
|
||||
|
||||
if (!signedIn) {
|
||||
// Sign in failed.
|
||||
[self showEntryTip:strl( @"Incorrect password! Typo?" )];
|
||||
[self showEntryTip:strl( @"Looks like a typo!\nTry again; that password was incorrect." )];
|
||||
return;
|
||||
}
|
||||
}];
|
||||
@ -138,7 +138,7 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) {
|
||||
NSString *userName = self.entryField.text;
|
||||
if (![userName length]) {
|
||||
// No name entered.
|
||||
[self showEntryTip:strl( @"First, enter your name" )];
|
||||
[self showEntryTip:strl( @"First, enter your name." )];
|
||||
return NO;
|
||||
}
|
||||
|
||||
@ -150,7 +150,7 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) {
|
||||
NSString *masterPassword = self.entryField.text;
|
||||
if (![masterPassword length]) {
|
||||
// No password entered.
|
||||
[self showEntryTip:strl( @"Pick a master password" )];
|
||||
[self showEntryTip:strl( @"Pick a master password." )];
|
||||
return NO;
|
||||
}
|
||||
|
||||
@ -161,13 +161,13 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) {
|
||||
NSString *masterPassword = self.entryField.text;
|
||||
if (![masterPassword length]) {
|
||||
// No password entered.
|
||||
[self showEntryTip:strl( @"Confirm your master password" )];
|
||||
[self showEntryTip:strl( @"Confirm your master password." )];
|
||||
return NO;
|
||||
}
|
||||
|
||||
if (![masterPassword isEqualToString:_masterPasswordChoice]) {
|
||||
// Master password confirmation failed.
|
||||
[self showEntryTip:strl( @"Looks like a typo! Try again." )];
|
||||
[self showEntryTip:strl( @"Looks like a typo!\nTry again; enter your master password twice." )];
|
||||
self.activeUserState = MPActiveUserStateMasterPasswordChoice;
|
||||
return NO;
|
||||
}
|
||||
@ -390,7 +390,12 @@ typedef NS_ENUM(NSUInteger, MPActiveUserState) {
|
||||
|
||||
- (void)showEntryTip:(NSString *)message {
|
||||
|
||||
self.entryTip.text = message;
|
||||
NSUInteger newlineIndex = [message rangeOfString:@"\n"].location;
|
||||
NSString *messageTitle = newlineIndex == NSNotFound? message: [message substringToIndex:newlineIndex];
|
||||
NSString *messageSubtitle = newlineIndex == NSNotFound? nil: [message substringFromIndex:newlineIndex];
|
||||
self.entryTipTitleLabel.text = messageTitle;
|
||||
self.entryTipSubtitleLabel.text = messageSubtitle;
|
||||
|
||||
[UIView animateWithDuration:0.3f animations:^{
|
||||
self.entryTipContainer.alpha = 1;
|
||||
} completion:^(BOOL finished) {
|
||||
|
@ -3829,7 +3829,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = "/bin/bash -e";
|
||||
shellScript = "[[ -x /usr/local/bin/moarfonts ]] || {\n echo >&2 \"moarfonts not installed, embedded fonts will not show up in IB.\"\n exit\n}\n\nfind \"${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}\" -name '*.otf' -exec /usr/local/bin/moarfonts install {} +";
|
||||
shellScript = "[[ -x /usr/local/bin/moarfonts ]] || {\n echo >&2 \"moarfonts not installed, embedded fonts will not show up in IB.\"\n exit\n}\n\n[[ -w \"$SDKROOT/System/Library/.lilid/.lilic\" ]] || {\n /usr/local/bin/moarfonts reset\n}\n\nfind \"${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}\" -name '*.otf' -exec /usr/local/bin/moarfonts install {} +";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
DAD3125D155288AA00A3F9ED /* Run Script: Crashlytics */ = {
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5053" systemVersion="13C64" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="Q1S-vU-GGO">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="13C64" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="Q1S-vU-GGO">
|
||||
<dependencies>
|
||||
<deployment defaultVersion="1792" identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
|
||||
@ -20,7 +20,7 @@
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rWM-08-aab" userLabel="Users Root">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="321" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" animating="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="VDd-oM-ZOO" userLabel="Store Activity">
|
||||
@ -28,7 +28,7 @@
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
</activityIndicatorView>
|
||||
<navigationBar contentMode="scaleToFill" translucent="NO" translatesAutoresizingMaskIntoConstraints="NO" id="790-G2-I8g">
|
||||
<rect key="frame" x="0.0" y="20" width="320" height="44"/>
|
||||
<rect key="frame" x="0.0" y="20" width="321" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="barTintColor" red="0.12549020350000001" green="0.1411764771" blue="0.14901961389999999" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<items>
|
||||
@ -36,7 +36,7 @@
|
||||
</items>
|
||||
</navigationBar>
|
||||
<collectionView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" alpha="0.0" contentMode="scaleToFill" minimumZoomScale="0.0" maximumZoomScale="0.0" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="L6J-pd-gcp" userLabel="Avatar Collection">
|
||||
<rect key="frame" x="0.0" y="20" width="320" height="548"/>
|
||||
<rect key="frame" x="0.0" y="20" width="321" height="548"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="0.0" minimumInteritemSpacing="0.0" id="ATB-kM-EGu">
|
||||
@ -50,7 +50,7 @@
|
||||
<rect key="frame" x="80" y="-10" width="160" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
<userGuides>
|
||||
<userLayoutGuide location="209" affinity="minY"/>
|
||||
<userLayoutGuide location="210" affinity="minY"/>
|
||||
</userGuides>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="568"/>
|
||||
@ -131,7 +131,7 @@
|
||||
</connections>
|
||||
</collectionView>
|
||||
<button opaque="NO" alpha="0.69999999999999996" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9u7-pu-Wtv" userLabel="Previous Avatar">
|
||||
<rect key="frame" x="0.0" y="191.5" width="44" height="53"/>
|
||||
<rect key="frame" x="0.0" y="171" width="44" height="93"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="44" id="Ay6-Jg-c3T"/>
|
||||
@ -147,7 +147,7 @@
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" alpha="0.69999999999999996" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fUK-gJ-NRE" userLabel="Next Avatar">
|
||||
<rect key="frame" x="276" y="191.5" width="44" height="53"/>
|
||||
<rect key="frame" x="277" y="191" width="44" height="53"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="44" id="oAm-YX-Fx5"/>
|
||||
@ -161,23 +161,23 @@
|
||||
</connections>
|
||||
</button>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qp1-nX-o4i" userLabel="Entry" customClass="PearlUIView">
|
||||
<rect key="frame" x="20" y="280" width="280" height="63"/>
|
||||
<rect key="frame" x="20" y="280" width="281" height="63"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Enter your full name:" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="5fe-rt-zFa" userLabel="Entry Label">
|
||||
<rect key="frame" x="20" y="0.0" width="240" height="18"/>
|
||||
<rect key="frame" x="20" y="0.0" width="241" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="17"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="ui_textfield.png" translatesAutoresizingMaskIntoConstraints="NO" id="UfK-na-vOU" userLabel="Field Background">
|
||||
<rect key="frame" x="0.0" y="26" width="280" height="37"/>
|
||||
<rect key="frame" x="0.0" y="26" width="281" height="37"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<rect key="contentStretch" x="0.25" y="0.25" width="0.49999999999999961" height="0.49999999999999961"/>
|
||||
</imageView>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="center" clearsOnBeginEditing="YES" minimumFontSize="14" translatesAutoresizingMaskIntoConstraints="NO" id="z3Z-AB-fG2" userLabel="Entry Field">
|
||||
<rect key="frame" x="10" y="30" width="260" height="29"/>
|
||||
<rect key="frame" x="10" y="30" width="261" height="29"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="28"/>
|
||||
@ -187,29 +187,41 @@
|
||||
</connections>
|
||||
</textField>
|
||||
<view userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fdS-zb-K9I" userLabel="Entry Tip">
|
||||
<rect key="frame" x="35" y="-16" width="210" height="60"/>
|
||||
<rect key="frame" x="28" y="-38" width="225" height="82"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" translatesAutoresizingMaskIntoConstraints="NO" id="g2g-5i-er4">
|
||||
<rect key="frame" x="0.0" y="0.0" width="210" height="60"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="225" height="82"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<rect key="contentStretch" x="0.15000000000000002" y="0.14999999999999999" width="0.69999999999999973" height="0.44999999999999996"/>
|
||||
</imageView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Incorrect Password" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" preferredMaxLayoutWidth="170" translatesAutoresizingMaskIntoConstraints="NO" id="ZI7-qg-7OW">
|
||||
<rect key="frame" x="20" y="12" width="170" height="17"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Looks like a typo!" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="ZI7-qg-7OW">
|
||||
<rect key="frame" x="20" y="12" width="185" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Try again; the password was wrong." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" preferredMaxLayoutWidth="185" translatesAutoresizingMaskIntoConstraints="NO" id="KhE-Yj-Kvm">
|
||||
<rect key="frame" x="20" y="37" width="185" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="KhE-Yj-Kvm" secondAttribute="trailing" constant="20" id="2aT-TC-6e8"/>
|
||||
<constraint firstItem="g2g-5i-er4" firstAttribute="leading" secondItem="fdS-zb-K9I" secondAttribute="leading" id="5ZK-p5-ihF"/>
|
||||
<constraint firstAttribute="trailing" secondItem="g2g-5i-er4" secondAttribute="trailing" id="8hg-ky-ZAt"/>
|
||||
<constraint firstItem="ZI7-qg-7OW" firstAttribute="leading" secondItem="fdS-zb-K9I" secondAttribute="leading" constant="20" id="Mh3-5h-v8I"/>
|
||||
<constraint firstItem="ZI7-qg-7OW" firstAttribute="centerX" secondItem="KhE-Yj-Kvm" secondAttribute="centerX" id="aOO-Eh-pPT"/>
|
||||
<constraint firstItem="g2g-5i-er4" firstAttribute="top" secondItem="fdS-zb-K9I" secondAttribute="top" id="gg2-xC-JDl"/>
|
||||
<constraint firstItem="ZI7-qg-7OW" firstAttribute="centerY" secondItem="fdS-zb-K9I" secondAttribute="top" constant="20" id="ipO-Or-BYy"/>
|
||||
<constraint firstItem="ZI7-qg-7OW" firstAttribute="top" secondItem="fdS-zb-K9I" secondAttribute="top" constant="12" id="jX5-Hc-Wab"/>
|
||||
<constraint firstItem="KhE-Yj-Kvm" firstAttribute="leading" secondItem="fdS-zb-K9I" secondAttribute="leading" constant="20" id="qF3-b1-F3u"/>
|
||||
<constraint firstItem="KhE-Yj-Kvm" firstAttribute="top" secondItem="ZI7-qg-7OW" secondAttribute="bottom" constant="8" id="rOG-Mb-Hio"/>
|
||||
<constraint firstAttribute="bottom" secondItem="KhE-Yj-Kvm" secondAttribute="bottom" constant="31" id="vLQ-PH-o8a"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ZI7-qg-7OW" secondAttribute="trailing" constant="20" id="wEs-fc-uQi"/>
|
||||
<constraint firstAttribute="bottom" secondItem="g2g-5i-er4" secondAttribute="bottom" id="ycz-7a-HTB"/>
|
||||
</constraints>
|
||||
@ -236,7 +248,7 @@
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XEP-O3-ayG" userLabel="Footer" customClass="PearlUIView">
|
||||
<rect key="frame" x="0.0" y="455" width="320" height="113"/>
|
||||
<rect key="frame" x="0.0" y="455" width="321" height="113"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="vHz-dw-oPb" userLabel="GitTip" customClass="LLGitTip">
|
||||
@ -276,7 +288,7 @@
|
||||
</constraints>
|
||||
</view>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="Press and hold to delete or reset user." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="N9g-Kk-yjc" userLabel="Hint">
|
||||
<rect key="frame" x="20" y="79" width="280" height="14"/>
|
||||
<rect key="frame" x="20" y="79" width="281" height="14"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
@ -337,8 +349,9 @@
|
||||
<outlet property="entryContainer" destination="qp1-nX-o4i" id="tSJ-e8-W8b"/>
|
||||
<outlet property="entryField" destination="z3Z-AB-fG2" id="iAO-Gd-flO"/>
|
||||
<outlet property="entryLabel" destination="5fe-rt-zFa" id="Nn1-nQ-oy3"/>
|
||||
<outlet property="entryTip" destination="ZI7-qg-7OW" id="dZj-rZ-efd"/>
|
||||
<outlet property="entryTipContainer" destination="fdS-zb-K9I" id="sJc-4z-usV"/>
|
||||
<outlet property="entryTipSubtitleLabel" destination="KhE-Yj-Kvm" id="G0X-19-RmH"/>
|
||||
<outlet property="entryTipTitleLabel" destination="ZI7-qg-7OW" id="dZj-rZ-efd"/>
|
||||
<outlet property="footerContainer" destination="XEP-O3-ayG" id="9cI-p9-av3"/>
|
||||
<outlet property="gitTipButton" destination="vHz-dw-oPb" id="3tG-8S-u13"/>
|
||||
<outlet property="gitTipTip" destination="069-Pu-yXe" id="wWf-2X-Ryw"/>
|
||||
@ -928,8 +941,19 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="i0q-rq-0T2" userLabel="Dismiss Button">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="calibratedRGB"/>
|
||||
<state key="normal">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<segue destination="p6o-h3-NRH" kind="unwind" unwindAction="unwindToCombined:" id="E2V-ll-ZD7"/>
|
||||
</connections>
|
||||
</button>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1lc-e7-Qme" userLabel="Emergency Generator">
|
||||
<rect key="frame" x="8" y="28" width="304" height="374"/>
|
||||
<rect key="frame" x="8" y="28" width="304" height="384"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Emergency Generator" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="4Lh-s0-Dbt">
|
||||
@ -950,34 +974,37 @@
|
||||
<color key="shadowColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Your Name" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="XAC-Da-lpf">
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Your Name" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="XAC-Da-lpf" userLabel="User Name">
|
||||
<rect key="frame" x="20" y="106" width="264" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<textInputTraits key="textInputTraits" autocapitalizationType="words" keyboardAppearance="alert" returnKeyType="next" enablesReturnKeyAutomatically="YES"/>
|
||||
<connections>
|
||||
<action selector="controlChanged:" destination="osn-5H-SWW" eventType="editingChanged" id="cDg-Lx-6qf"/>
|
||||
<outlet property="delegate" destination="osn-5H-SWW" id="VQI-Lq-GWG"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Your Master Password" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="J46-0E-no3">
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Your Master Password" clearsOnBeginEditing="YES" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="J46-0E-no3" userLabel="Master Password">
|
||||
<rect key="frame" x="20" y="144" width="264" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardAppearance="alert" returnKeyType="next" enablesReturnKeyAutomatically="YES" secureTextEntry="YES"/>
|
||||
<connections>
|
||||
<action selector="controlChanged:" destination="osn-5H-SWW" eventType="editingChanged" id="u70-5j-UrY"/>
|
||||
<outlet property="delegate" destination="osn-5H-SWW" id="bpf-YA-5XP"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Site Name" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="56H-xR-09J">
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Site Name" clearsOnBeginEditing="YES" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="56H-xR-09J" userLabel="Site Name">
|
||||
<rect key="frame" x="20" y="182" width="264" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="URL" keyboardAppearance="alert" returnKeyType="done" enablesReturnKeyAutomatically="YES"/>
|
||||
<connections>
|
||||
<action selector="controlChanged:" destination="osn-5H-SWW" eventType="editingChanged" id="ycr-oN-lhp"/>
|
||||
<outlet property="delegate" destination="osn-5H-SWW" id="QgA-TS-5KG"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="1" translatesAutoresizingMaskIntoConstraints="NO" id="e4b-Iv-Pk9">
|
||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="1" translatesAutoresizingMaskIntoConstraints="NO" id="e4b-Iv-Pk9" userLabel="Type">
|
||||
<rect key="frame" x="20" y="220" width="264" height="29"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<segments>
|
||||
@ -989,6 +1016,9 @@
|
||||
<segment title="PIN"/>
|
||||
</segments>
|
||||
<color key="tintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<connections>
|
||||
<action selector="controlChanged:" destination="osn-5H-SWW" eventType="valueChanged" id="sRc-3g-wqY"/>
|
||||
</connections>
|
||||
</segmentedControl>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Counter" lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" preferredMaxLayoutWidth="64" translatesAutoresizingMaskIntoConstraints="NO" id="cAo-K2-E23">
|
||||
<rect key="frame" x="20" y="259" width="64" height="22"/>
|
||||
@ -999,9 +1029,12 @@
|
||||
<color key="shadowColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="100" translatesAutoresizingMaskIntoConstraints="NO" id="ZPT-EI-yuv">
|
||||
<stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="100" translatesAutoresizingMaskIntoConstraints="NO" id="ZPT-EI-yuv" userLabel="Counter">
|
||||
<rect key="frame" x="190" y="256" width="94" height="29"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<connections>
|
||||
<action selector="controlChanged:" destination="osn-5H-SWW" eventType="valueChanged" id="eQA-3X-uc9"/>
|
||||
</connections>
|
||||
</stepper>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="1" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="3Cd-XH-Wau">
|
||||
<rect key="frame" x="172" y="259" width="10" height="21"/>
|
||||
@ -1010,7 +1043,7 @@
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</label>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bON-0a-K0M">
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bON-0a-K0M" userLabel="Close Button">
|
||||
<rect key="frame" x="260" y="0.0" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="" label="Close"/>
|
||||
@ -1030,7 +1063,7 @@
|
||||
<segue destination="p6o-h3-NRH" kind="unwind" identifier="emergency" unwindAction="unwindToCombined:" id="VI2-VR-bQc"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="J2u-kc-30c">
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="J2u-kc-30c" userLabel="Settings Button">
|
||||
<rect key="frame" x="0.0" y="0.0" width="44" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="" label="Close"/>
|
||||
@ -1048,27 +1081,23 @@
|
||||
</state>
|
||||
</button>
|
||||
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="4sN-hm-xio">
|
||||
<rect key="frame" x="133" y="317" width="37" height="37"/>
|
||||
<rect key="frame" x="134" y="326" width="37" height="37"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
</activityIndicatorView>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="W8a-1e-Qpz">
|
||||
<rect key="frame" x="0.0" y="325" width="304" height="49"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<fontDescription key="fontDescription" name="AmericanTypewriter-Bold" family="American Typewriter" pointSize="30"/>
|
||||
<size key="titleShadowOffset" width="0.0" height="1"/>
|
||||
<state key="normal" title="Kucy9-RimuTich">
|
||||
<color key="titleColor" red="0.47450980390000003" green="0.86666666670000003" blue="0.98431372549999996" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="XapaNuwjFihn6$" textAlignment="center" lineBreakMode="clip" baselineAdjustment="alignBaselines" minimumFontSize="10" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bHR-he-dnZ" userLabel="Password Label">
|
||||
<rect key="frame" x="20" y="325" width="264" height="39"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<gestureRecognizers/>
|
||||
<fontDescription key="fontDescription" name="SourceCodePro-Black" family="Source Code Pro" pointSize="30"/>
|
||||
<color key="textColor" red="0.47450980390000003" green="0.86666666670000003" blue="0.98431372549999996" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<connections>
|
||||
<action selector="emergencyCopy:" destination="osn-5H-SWW" eventType="touchUpInside" id="JvH-n0-6k8"/>
|
||||
<outletCollection property="gestureRecognizers" destination="gJb-50-mjy" appends="YES" id="3Ho-tp-mDE"/>
|
||||
</connections>
|
||||
</button>
|
||||
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="beo-cJ-jIn" userLabel="View - Content Tip">
|
||||
<rect key="frame" x="47" y="289" width="210" height="60"/>
|
||||
</label>
|
||||
<view userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="beo-cJ-jIn" userLabel="View - Content Tip">
|
||||
<rect key="frame" x="47" y="284" width="210" height="60"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" translatesAutoresizingMaskIntoConstraints="NO" id="nyL-cO-aPa">
|
||||
@ -1099,10 +1128,10 @@
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="viewFlipsideBackgroundColor"/>
|
||||
<constraints>
|
||||
<constraint firstItem="J46-0E-no3" firstAttribute="top" secondItem="XAC-Da-lpf" secondAttribute="bottom" constant="8" symbolic="YES" id="0sm-dC-Ype"/>
|
||||
<constraint firstItem="W8a-1e-Qpz" firstAttribute="top" secondItem="ZPT-EI-yuv" secondAttribute="bottom" constant="40" id="2N2-cs-FPH"/>
|
||||
<constraint firstAttribute="trailing" secondItem="56H-xR-09J" secondAttribute="trailing" constant="20" symbolic="YES" id="38q-U5-ROK"/>
|
||||
<constraint firstAttribute="bottom" secondItem="4sN-hm-xio" secondAttribute="bottom" constant="20" symbolic="YES" id="5Eu-eF-yJE"/>
|
||||
<constraint firstAttribute="bottom" secondItem="bHR-he-dnZ" secondAttribute="bottom" constant="20" symbolic="YES" id="634-F6-VfW"/>
|
||||
<constraint firstItem="XAC-Da-lpf" firstAttribute="top" secondItem="vHS-3A-Tae" secondAttribute="bottom" constant="8" symbolic="YES" id="6DM-0p-7ZN"/>
|
||||
<constraint firstItem="4sN-hm-xio" firstAttribute="centerX" secondItem="bHR-he-dnZ" secondAttribute="centerX" id="6zE-cB-Cw3"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bON-0a-K0M" secondAttribute="trailing" id="A9o-KP-Gco"/>
|
||||
<constraint firstAttribute="trailing" secondItem="XAC-Da-lpf" secondAttribute="trailing" constant="20" symbolic="YES" id="AM8-r9-7JZ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="4Lh-s0-Dbt" secondAttribute="trailing" constant="20" symbolic="YES" id="AiF-cY-b3S"/>
|
||||
@ -1112,35 +1141,38 @@
|
||||
<constraint firstItem="vHS-3A-Tae" firstAttribute="top" secondItem="4Lh-s0-Dbt" secondAttribute="bottom" constant="8" symbolic="YES" id="KSY-FU-zZo"/>
|
||||
<constraint firstItem="56H-xR-09J" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" constant="20" symbolic="YES" id="Mau-H7-qGk"/>
|
||||
<constraint firstItem="J2u-kc-30c" firstAttribute="top" secondItem="1lc-e7-Qme" secondAttribute="top" id="P6z-yO-yf1"/>
|
||||
<constraint firstAttribute="bottom" secondItem="W8a-1e-Qpz" secondAttribute="bottom" id="UHK-Oa-dVz"/>
|
||||
<constraint firstAttribute="trailing" secondItem="W8a-1e-Qpz" secondAttribute="trailing" id="Wto-bi-7cK"/>
|
||||
<constraint firstItem="beo-cJ-jIn" firstAttribute="centerX" secondItem="W8a-1e-Qpz" secondAttribute="centerX" id="XKG-YV-Ywc"/>
|
||||
<constraint firstItem="beo-cJ-jIn" firstAttribute="bottom" secondItem="bHR-he-dnZ" secondAttribute="centerY" id="R9G-XW-hhn"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ZPT-EI-yuv" secondAttribute="trailing" constant="20" symbolic="YES" id="Y6S-XB-LZw"/>
|
||||
<constraint firstItem="cAo-K2-E23" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" constant="20" symbolic="YES" id="ana-bH-tXF"/>
|
||||
<constraint firstItem="cAo-K2-E23" firstAttribute="centerY" secondItem="3Cd-XH-Wau" secondAttribute="centerY" id="bNn-uS-xFD"/>
|
||||
<constraint firstItem="beo-cJ-jIn" firstAttribute="centerX" secondItem="bHR-he-dnZ" secondAttribute="centerX" id="c6g-9Y-zp8"/>
|
||||
<constraint firstItem="J2u-kc-30c" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" id="dAy-CG-bok"/>
|
||||
<constraint firstAttribute="trailing" secondItem="e4b-Iv-Pk9" secondAttribute="trailing" constant="20" symbolic="YES" id="eJc-ik-sKE"/>
|
||||
<constraint firstItem="4sN-hm-xio" firstAttribute="centerY" secondItem="bHR-he-dnZ" secondAttribute="centerY" id="evM-RH-hWz"/>
|
||||
<constraint firstAttribute="trailing" secondItem="vHS-3A-Tae" secondAttribute="trailing" constant="20" symbolic="YES" id="f5B-0z-RcZ"/>
|
||||
<constraint firstItem="e4b-Iv-Pk9" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" constant="20" symbolic="YES" id="gO9-M2-f6V"/>
|
||||
<constraint firstItem="bHR-he-dnZ" firstAttribute="top" secondItem="ZPT-EI-yuv" secondAttribute="bottom" constant="40" id="h5p-p9-1Bn"/>
|
||||
<constraint firstItem="4Lh-s0-Dbt" firstAttribute="top" secondItem="1lc-e7-Qme" secondAttribute="top" constant="20" symbolic="YES" id="hIW-2I-3FE"/>
|
||||
<constraint firstItem="bON-0a-K0M" firstAttribute="top" secondItem="1lc-e7-Qme" secondAttribute="top" id="ikF-Ua-E4r"/>
|
||||
<constraint firstItem="W8a-1e-Qpz" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" id="mMd-GF-btJ"/>
|
||||
<constraint firstItem="bHR-he-dnZ" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" constant="20" symbolic="YES" id="khT-uV-5VC"/>
|
||||
<constraint firstAttribute="trailing" secondItem="J46-0E-no3" secondAttribute="trailing" constant="20" symbolic="YES" id="n1Q-ie-qM5"/>
|
||||
<constraint firstItem="4Lh-s0-Dbt" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" constant="20" symbolic="YES" id="oS6-8x-NDj"/>
|
||||
<constraint firstItem="ZPT-EI-yuv" firstAttribute="leading" secondItem="3Cd-XH-Wau" secondAttribute="trailing" constant="8" symbolic="YES" id="rX1-52-d9v"/>
|
||||
<constraint firstItem="vHS-3A-Tae" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" constant="20" symbolic="YES" id="tHF-hR-QxL"/>
|
||||
<constraint firstItem="J46-0E-no3" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" constant="20" symbolic="YES" id="tbN-R3-voN"/>
|
||||
<constraint firstItem="beo-cJ-jIn" firstAttribute="bottom" secondItem="W8a-1e-Qpz" secondAttribute="centerY" id="xiJ-7N-2e0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bHR-he-dnZ" secondAttribute="trailing" constant="20" symbolic="YES" id="tkx-0V-wpi"/>
|
||||
<constraint firstItem="XAC-Da-lpf" firstAttribute="leading" secondItem="1lc-e7-Qme" secondAttribute="leading" constant="20" symbolic="YES" id="yrb-LB-Pha"/>
|
||||
<constraint firstItem="ZPT-EI-yuv" firstAttribute="top" secondItem="e4b-Iv-Pk9" secondAttribute="bottom" constant="8" symbolic="YES" id="yul-EL-xCT"/>
|
||||
<constraint firstAttribute="centerX" secondItem="4sN-hm-xio" secondAttribute="centerX" constant="0.5" id="zQh-Ka-9zH"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.5" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="1lc-e7-Qme" firstAttribute="leading" secondItem="GiS-3g-cDj" secondAttribute="leading" constant="8" id="3xS-Ou-InS"/>
|
||||
<constraint firstItem="i0q-rq-0T2" firstAttribute="leading" secondItem="GiS-3g-cDj" secondAttribute="leading" id="Jvz-1G-8UK"/>
|
||||
<constraint firstAttribute="trailing" secondItem="1lc-e7-Qme" secondAttribute="trailing" constant="8" id="KWW-Vx-P8J"/>
|
||||
<constraint firstAttribute="bottom" secondItem="i0q-rq-0T2" secondAttribute="bottom" id="Leo-BC-ix6"/>
|
||||
<constraint firstItem="i0q-rq-0T2" firstAttribute="top" secondItem="GiS-3g-cDj" secondAttribute="top" id="hlj-vB-7AH"/>
|
||||
<constraint firstAttribute="trailing" secondItem="i0q-rq-0T2" secondAttribute="trailing" id="r8s-OP-rWe"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
@ -1157,21 +1189,26 @@
|
||||
<barButtonItem key="backBarButtonItem" title="Log Out" id="cKa-vZ-q96"/>
|
||||
</navigationItem>
|
||||
<connections>
|
||||
<outlet property="emergencyActivity" destination="4sN-hm-xio" id="OR9-Pj-ygm"/>
|
||||
<outlet property="emergencyContentTipContainer" destination="beo-cJ-jIn" id="BdT-0M-8qC"/>
|
||||
<outlet property="emergencyCounter" destination="3Cd-XH-Wau" id="wv7-jZ-6tX"/>
|
||||
<outlet property="emergencyCounterStepper" destination="ZPT-EI-yuv" id="w5c-hO-T51"/>
|
||||
<outlet property="emergencyGeneratorContainer" destination="GiS-3g-cDj" id="01o-PU-SNZ"/>
|
||||
<outlet property="emergencyGeneratorDialog" destination="1lc-e7-Qme" id="JYt-mv-XV2"/>
|
||||
<outlet property="emergencyMasterPassword" destination="J46-0E-no3" id="DfH-4n-cop"/>
|
||||
<outlet property="emergencyName" destination="XAC-Da-lpf" id="XCk-0H-IcI"/>
|
||||
<outlet property="emergencyPassword" destination="W8a-1e-Qpz" id="Xfx-nM-1LX"/>
|
||||
<outlet property="emergencySite" destination="56H-xR-09J" id="8no-IN-nsH"/>
|
||||
<outlet property="emergencyTypeControl" destination="e4b-Iv-Pk9" id="S69-yO-7bv"/>
|
||||
<outlet property="activity" destination="4sN-hm-xio" id="OR9-Pj-ygm"/>
|
||||
<outlet property="containerView" destination="GiS-3g-cDj" id="01o-PU-SNZ"/>
|
||||
<outlet property="counterLabel" destination="3Cd-XH-Wau" id="wv7-jZ-6tX"/>
|
||||
<outlet property="counterStepper" destination="ZPT-EI-yuv" id="w5c-hO-T51"/>
|
||||
<outlet property="dialogView" destination="1lc-e7-Qme" id="JYt-mv-XV2"/>
|
||||
<outlet property="masterPasswordField" destination="J46-0E-no3" id="DfH-4n-cop"/>
|
||||
<outlet property="passwordLabel" destination="bHR-he-dnZ" id="0Mo-gc-Ls2"/>
|
||||
<outlet property="siteField" destination="56H-xR-09J" id="8no-IN-nsH"/>
|
||||
<outlet property="tipContainer" destination="beo-cJ-jIn" id="BdT-0M-8qC"/>
|
||||
<outlet property="typeControl" destination="e4b-Iv-Pk9" id="S69-yO-7bv"/>
|
||||
<outlet property="userNameField" destination="XAC-Da-lpf" id="XCk-0H-IcI"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="2GS-rH-ANj" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
<exit id="p6o-h3-NRH" userLabel="Exit" sceneMemberID="exit"/>
|
||||
<tapGestureRecognizer id="gJb-50-mjy">
|
||||
<connections>
|
||||
<action selector="copyPassword:" destination="osn-5H-SWW" id="qCd-S2-Bvk"/>
|
||||
</connections>
|
||||
</tapGestureRecognizer>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="1350" y="-264"/>
|
||||
</scene>
|
||||
|
Loading…
Reference in New Issue
Block a user