activeUser refactor, tool tip hiding and dismiss when logout.
[UPDATED] Made activeUser access follow same pattern as activeElement which makes it more clear what the thread model is like. [FIXED] Save after update of all elements. [UPDATED] Tool tips hidden in IB now; makes it less cluttered. [FIXED] Dismissing view controllers when logging out.
This commit is contained in:
parent
ee93412dd1
commit
c31df49599
2
External/Pearl
vendored
2
External/Pearl
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 0d30693440fd520715f22789d33d5551b3b681c4
|
Subproject commit 737b198043a3acb3a262a38a8b14e265801ce682
|
@ -73,11 +73,8 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
|
|||||||
if (self.key)
|
if (self.key)
|
||||||
self.key = nil;
|
self.key = nil;
|
||||||
|
|
||||||
if (self.activeUser) {
|
self.activeUser = nil;
|
||||||
self.activeUser = nil;
|
[[NSNotificationCenter defaultCenter] postNotificationName:MPSignedOutNotification object:self userInfo:@{@"animated": @(animated)}];
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPSignedOutNotification object:self userInfo:
|
|
||||||
@{@"animated": @(animated)}];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)signInAsUser:(MPUserEntity *)user usingMasterPassword:(NSString *)password {
|
- (BOOL)signInAsUser:(MPUserEntity *)user usingMasterPassword:(NSString *)password {
|
||||||
@ -235,7 +232,7 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
|
|||||||
[moc saveToStore];
|
[moc saveToStore];
|
||||||
|
|
||||||
#ifdef PEARL_UIKIT
|
#ifdef PEARL_UIKIT
|
||||||
[activityAlert cancelAlert];
|
[activityAlert cancelAlertAnimated:YES];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,11 +15,12 @@
|
|||||||
@interface MPAppDelegate_Shared : NSObject <PearlConfigDelegate>
|
@interface MPAppDelegate_Shared : NSObject <PearlConfigDelegate>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@property (strong, nonatomic) MPUserEntity *activeUser;
|
|
||||||
@property (strong, nonatomic) MPKey *key;
|
@property (strong, nonatomic) MPKey *key;
|
||||||
|
|
||||||
+ (instancetype)get;
|
+ (instancetype)get;
|
||||||
|
|
||||||
|
- (MPUserEntity *)activeUserForThread;
|
||||||
- (MPUserEntity *)activeUserInContext:(NSManagedObjectContext *)moc;
|
- (MPUserEntity *)activeUserInContext:(NSManagedObjectContext *)moc;
|
||||||
|
- (void)setActiveUser:(MPUserEntity *)activeUser;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
- (MPUserEntity *)activeUser {
|
- (MPUserEntity *)activeUserForThread {
|
||||||
|
|
||||||
if (!_activeUserOID)
|
if (!_activeUserOID)
|
||||||
return nil;
|
return nil;
|
||||||
@ -36,7 +36,7 @@
|
|||||||
NSError *error;
|
NSError *error;
|
||||||
MPUserEntity *activeUser = (MPUserEntity *)[moc existingObjectWithID:_activeUserOID error:&error];
|
MPUserEntity *activeUser = (MPUserEntity *)[moc existingObjectWithID:_activeUserOID error:&error];
|
||||||
if (!activeUser)
|
if (!activeUser)
|
||||||
err(@"Failed to retrieve active user: %@", error);
|
err(@"Failed to retrieve active user: %@", error);
|
||||||
|
|
||||||
return activeUser;
|
return activeUser;
|
||||||
}
|
}
|
||||||
|
@ -356,8 +356,8 @@ PearlAssociatedObjectProperty(NSManagedObjectContext*, MainManagedObjectContext,
|
|||||||
self.privateManagedObjectContext = privateManagedObjectContext;
|
self.privateManagedObjectContext = privateManagedObjectContext;
|
||||||
self.mainManagedObjectContext = mainManagedObjectContext;
|
self.mainManagedObjectContext = mainManagedObjectContext;
|
||||||
|
|
||||||
[self.handleCloudContentAlert cancelAlert];
|
[self.handleCloudContentAlert cancelAlertAnimated:YES];
|
||||||
[self.fixCloudContentAlert cancelAlert];
|
[self.fixCloudContentAlert cancelAlertAnimated:YES];
|
||||||
[self.storeLoading cancelOverlay];
|
[self.storeLoading cancelOverlay];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,7 +391,7 @@ PearlAssociatedObjectProperty(NSManagedObjectContext*, MainManagedObjectContext,
|
|||||||
- (void)showCloudContentAlert {
|
- (void)showCloudContentAlert {
|
||||||
|
|
||||||
__weak MPAppDelegate_Shared *wSelf = self;
|
__weak MPAppDelegate_Shared *wSelf = self;
|
||||||
[self.handleCloudContentAlert cancelAlert];
|
[self.handleCloudContentAlert cancelAlertAnimated:NO];
|
||||||
self.handleCloudContentAlert = [PearlAlert showActivityWithTitle:@"iCloud Sync Problem" message:
|
self.handleCloudContentAlert = [PearlAlert showActivityWithTitle:@"iCloud Sync Problem" message:
|
||||||
@"Waiting for your other device to auto‑correct the problem..."
|
@"Waiting for your other device to auto‑correct the problem..."
|
||||||
initAlert:^(UIAlertView *alert) {
|
initAlert:^(UIAlertView *alert) {
|
||||||
@ -634,7 +634,7 @@ PearlAssociatedObjectProperty(NSManagedObjectContext*, MainManagedObjectContext,
|
|||||||
|
|
||||||
- (NSString *)exportSitesShowingPasswords:(BOOL)showPasswords {
|
- (NSString *)exportSitesShowingPasswords:(BOOL)showPasswords {
|
||||||
|
|
||||||
MPUserEntity *activeUser = self.activeUser;
|
MPUserEntity *activeUser = [self activeUserForThread];
|
||||||
inf(@"Exporting sites, %@, for: %@", showPasswords? @"showing passwords": @"omitting passwords", activeUser.userID);
|
inf(@"Exporting sites, %@, for: %@", showPasswords? @"showing passwords": @"omitting passwords", activeUser.userID);
|
||||||
|
|
||||||
// Header.
|
// Header.
|
||||||
|
@ -362,7 +362,7 @@
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
[activityAlert cancelAlert];
|
[activityAlert cancelAlertAnimated:YES];
|
||||||
});
|
});
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
@ -489,7 +489,7 @@
|
|||||||
|
|
||||||
- (void)openFeedbackWithLogs:(BOOL)logs forVC:(UIViewController *)viewController {
|
- (void)openFeedbackWithLogs:(BOOL)logs forVC:(UIViewController *)viewController {
|
||||||
|
|
||||||
NSString *userName = [MPAppDelegate get].activeUser.name;
|
NSString *userName = [[MPAppDelegate get] activeUserForThread].name;
|
||||||
PearlLogLevel logLevel = [[MPiOSConfig get].sendInfo boolValue]? PearlLogLevelDebug: PearlLogLevelInfo;
|
PearlLogLevel logLevel = [[MPiOSConfig get].sendInfo boolValue]? PearlLogLevelDebug: PearlLogLevelInfo;
|
||||||
|
|
||||||
[[[PearlEMail alloc] initForEMailTo:@"Master Password Development <masterpassword@lyndir.com>"
|
[[[PearlEMail alloc] initForEMailTo:@"Master Password Development <masterpassword@lyndir.com>"
|
||||||
@ -555,12 +555,12 @@
|
|||||||
NSString *message;
|
NSString *message;
|
||||||
|
|
||||||
if (showPasswords)
|
if (showPasswords)
|
||||||
message = PearlString(@"Export of Master Password sites with passwords included.\n"
|
message = PearlString(@"Export of Master Password sites with passwords included.\n\n"
|
||||||
@"REMINDER: Make sure nobody else sees this file! Passwords are visible!\n\n\n"
|
@"REMINDER: Make sure nobody else sees this file! Passwords are visible!\n\n\n"
|
||||||
@"--\n"
|
@"--\n"
|
||||||
@"%@\n"
|
@"%@\n"
|
||||||
@"Master Password %@, build %@",
|
@"Master Password %@, build %@",
|
||||||
self.activeUser.name,
|
[self activeUserForThread].name,
|
||||||
[PearlInfoPlist get].CFBundleShortVersionString,
|
[PearlInfoPlist get].CFBundleShortVersionString,
|
||||||
[PearlInfoPlist get].CFBundleVersion);
|
[PearlInfoPlist get].CFBundleVersion);
|
||||||
else
|
else
|
||||||
@ -568,7 +568,7 @@
|
|||||||
@"--\n"
|
@"--\n"
|
||||||
@"%@\n"
|
@"%@\n"
|
||||||
@"Master Password %@, build %@",
|
@"Master Password %@, build %@",
|
||||||
self.activeUser.name,
|
[self activeUserForThread].name,
|
||||||
[PearlInfoPlist get].CFBundleShortVersionString,
|
[PearlInfoPlist get].CFBundleShortVersionString,
|
||||||
[PearlInfoPlist get].CFBundleVersion);
|
[PearlInfoPlist get].CFBundleVersion);
|
||||||
|
|
||||||
@ -578,7 +578,7 @@
|
|||||||
[PearlEMail sendEMailTo:nil subject:@"Master Password Export" body:message
|
[PearlEMail sendEMailTo:nil subject:@"Master Password Export" body:message
|
||||||
attachments:[[PearlEMailAttachment alloc] initWithContent:[exportedSites dataUsingEncoding:NSUTF8StringEncoding]
|
attachments:[[PearlEMailAttachment alloc] initWithContent:[exportedSites dataUsingEncoding:NSUTF8StringEncoding]
|
||||||
mimeType:@"text/plain" fileName:
|
mimeType:@"text/plain" fileName:
|
||||||
PearlString(@"%@ (%@).mpsites", self.activeUser.name, [exportDateFormatter stringFromDate:[NSDate date]])],
|
PearlString(@"%@ (%@).mpsites", [self activeUserForThread].name, [exportDateFormatter stringFromDate:[NSDate date]])],
|
||||||
nil];
|
nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
[self performUpgradeAllWithCompletion:^(BOOL success, NSDictionary *changes) {
|
[self performUpgradeAllWithCompletion:^(BOOL success, NSDictionary *changes) {
|
||||||
dispatch_async( dispatch_get_main_queue(), ^{
|
dispatch_async( dispatch_get_main_queue(), ^{
|
||||||
[self showUpgradeChanges:changes];
|
[self showUpgradeChanges:changes];
|
||||||
[activity cancelAlert];
|
[activity cancelAlertAnimated:YES];
|
||||||
} );
|
} );
|
||||||
}];
|
}];
|
||||||
} cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:[PearlStrings get].commonButtonContinue, nil];
|
} cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:[PearlStrings get].commonButtonContinue, nil];
|
||||||
@ -110,6 +110,7 @@
|
|||||||
} forKey:element.name];
|
} forKey:element.name];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[moc saveToStore];
|
||||||
completion(YES, elementChanges);
|
completion(YES, elementChanges);
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@
|
|||||||
|
|
||||||
- (void)updateData {
|
- (void)updateData {
|
||||||
|
|
||||||
MPUserEntity *activeUser = [MPAppDelegate get].activeUser;
|
MPUserEntity *activeUser = [[MPAppDelegate get] activeUserForThread];
|
||||||
if (!activeUser)
|
if (!activeUser)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@
|
|||||||
NSString *query = [self.searchDisplayController.searchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
NSString *query = [self.searchDisplayController.searchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
||||||
cell.textLabel.text = query;
|
cell.textLabel.text = query;
|
||||||
cell.detailTextLabel.text = PearlString(@"New site: %@",
|
cell.detailTextLabel.text = PearlString(@"New site: %@",
|
||||||
[MPAlgorithmDefault shortNameOfType:[[MPAppDelegate get].activeUser defaultType]]);
|
[MPAlgorithmDefault shortNameOfType:[[[MPAppDelegate get] activeUserForThread] defaultType]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||||
|
@ -33,6 +33,12 @@
|
|||||||
|
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
|
|
||||||
|
self.siteNameTip.hidden = NO;
|
||||||
|
self.contentTip.hidden = NO;
|
||||||
|
self.usernameTip.hidden = NO;
|
||||||
|
self.typeTip.hidden = NO;
|
||||||
|
self.toolTip.hidden = NO;
|
||||||
|
|
||||||
self.tickCount = 30;
|
self.tickCount = 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,19 +84,29 @@
|
|||||||
}];
|
}];
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:MPElementUpdatedNotification object:nil queue:nil usingBlock:
|
[[NSNotificationCenter defaultCenter] addObserverForName:MPElementUpdatedNotification object:nil queue:nil usingBlock:
|
||||||
^void(NSNotification *note) {
|
^void(NSNotification *note) {
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
if (activeElement.type & MPElementTypeClassStored && ![[activeElement.content description] length])
|
if (activeElement.type & MPElementTypeClassStored && ![[activeElement.content description] length])
|
||||||
[self showToolTip:@"Tap to set a password." withIcon:self.toolTipEditIcon];
|
[self showToolTip:@"Tap to set a password." withIcon:self.toolTipEditIcon];
|
||||||
if (activeElement.requiresExplicitMigration)
|
if (activeElement.requiresExplicitMigration)
|
||||||
[self showToolTip:@"Password outdated. Tap to upgrade it." withIcon:nil];
|
[self showToolTip:@"Password outdated. Tap to upgrade it." withIcon:nil];
|
||||||
}];
|
|
||||||
}];
|
}];
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:MPSignedOutNotification object:nil queue:nil usingBlock:
|
[[NSNotificationCenter defaultCenter] addObserverForName:MPSignedOutNotification object:nil queue:nil usingBlock:
|
||||||
^(NSNotification *note) {
|
^(NSNotification *note) {
|
||||||
|
BOOL animated = [[note.userInfo objectForKey:@"animated"] boolValue];
|
||||||
|
|
||||||
_activeElementOID = nil;
|
_activeElementOID = nil;
|
||||||
self.suppressOutdatedAlert = NO;
|
self.suppressOutdatedAlert = NO;
|
||||||
[self updateAnimated:NO];
|
[self updateAnimated:NO];
|
||||||
[self.navigationController popToRootViewControllerAnimated:[[note.userInfo objectForKey:@"animated"] boolValue]];
|
|
||||||
|
[[PearlSheet activeSheets] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
|
||||||
|
[obj cancelSheetAnimated:NO];
|
||||||
|
}];
|
||||||
|
if (![self.navigationController presentedViewController])
|
||||||
|
[self.navigationController popToRootViewControllerAnimated:animated];
|
||||||
|
else
|
||||||
|
[self.navigationController dismissViewControllerAnimated:animated completion:^{
|
||||||
|
[self.navigationController popToRootViewControllerAnimated:animated];
|
||||||
|
}];
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
@ -104,18 +114,19 @@
|
|||||||
|
|
||||||
- (void)viewWillAppear:(BOOL)animated {
|
- (void)viewWillAppear:(BOOL)animated {
|
||||||
|
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
if (activeElement.user != [MPAppDelegate get].activeUser)
|
if (activeElement.user != [[MPAppDelegate get] activeUserForThread])
|
||||||
_activeElementOID = nil;
|
_activeElementOID = nil;
|
||||||
}];
|
|
||||||
|
|
||||||
self.searchDisplayController.searchBar.text = nil;
|
self.searchDisplayController.searchBar.text = nil;
|
||||||
self.alertContainer.alpha = 0;
|
self.alertContainer.hidden = NO;
|
||||||
self.outdatedAlertContainer.alpha = 0;
|
self.outdatedAlertContainer.hidden = NO;
|
||||||
self.searchTipContainer.alpha = 0;
|
self.searchTipContainer.hidden = NO;
|
||||||
self.actionsTipContainer.alpha = 0;
|
self.actionsTipContainer.hidden = NO;
|
||||||
self.typeTipContainer.alpha = 0;
|
self.typeTipContainer.hidden = NO;
|
||||||
self.toolTipContainer.alpha = 0;
|
self.toolTipContainer.hidden = NO;
|
||||||
|
self.contentTipContainer.hidden = NO;
|
||||||
|
self.loginNameTipContainer.hidden = NO;
|
||||||
|
|
||||||
[self updateAnimated:NO];
|
[self updateAnimated:NO];
|
||||||
|
|
||||||
@ -132,7 +143,7 @@
|
|||||||
// Needed for when we appear after a modal VC dismisses:
|
// Needed for when we appear after a modal VC dismisses:
|
||||||
// We can't present until the other modal VC has been fully dismissed and presenting in -viewWillAppear: will fail.
|
// We can't present until the other modal VC has been fully dismissed and presenting in -viewWillAppear: will fail.
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
|
||||||
MPUserEntity *activeUser = [MPAppDelegate get].activeUser;
|
MPUserEntity *activeUser = [[MPAppDelegate get] activeUserForThread];
|
||||||
if ([MPAlgorithmDefault migrateUser:activeUser] && !self.suppressOutdatedAlert)
|
if ([MPAlgorithmDefault migrateUser:activeUser] && !self.suppressOutdatedAlert)
|
||||||
[UIView animateWithDuration:0.3f animations:^{
|
[UIView animateWithDuration:0.3f animations:^{
|
||||||
self.outdatedAlertContainer.alpha = 1;
|
self.outdatedAlertContainer.alpha = 1;
|
||||||
@ -182,59 +193,58 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
[self setHelpChapter:activeElement? @"2": @"1"];
|
[self setHelpChapter:activeElement? @"2": @"1"];
|
||||||
[self updateHelpHiddenAnimated:NO];
|
[self updateHelpHiddenAnimated:NO];
|
||||||
|
|
||||||
self.passwordCounter.alpha = 0;
|
self.passwordCounter.alpha = 0;
|
||||||
self.passwordIncrementer.alpha = 0;
|
self.passwordIncrementer.alpha = 0;
|
||||||
self.passwordEdit.alpha = 0;
|
self.passwordEdit.alpha = 0;
|
||||||
self.passwordUpgrade.alpha = 0;
|
self.passwordUpgrade.alpha = 0;
|
||||||
self.passwordUser.alpha = 0;
|
self.passwordUser.alpha = 0;
|
||||||
self.displayContainer.alpha = 0;
|
self.displayContainer.alpha = 0;
|
||||||
|
|
||||||
if (activeElement) {
|
if (activeElement) {
|
||||||
self.passwordUser.alpha = 0.5f;
|
self.passwordUser.alpha = 0.5f;
|
||||||
self.displayContainer.alpha = 1.0f;
|
self.displayContainer.alpha = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (activeElement.requiresExplicitMigration)
|
if (activeElement.requiresExplicitMigration)
|
||||||
self.passwordUpgrade.alpha = 0.5f;
|
self.passwordUpgrade.alpha = 0.5f;
|
||||||
|
|
||||||
else {
|
else {
|
||||||
if (activeElement.type & MPElementTypeClassGenerated) {
|
if (activeElement.type & MPElementTypeClassGenerated) {
|
||||||
self.passwordCounter.alpha = 0.5f;
|
self.passwordCounter.alpha = 0.5f;
|
||||||
self.passwordIncrementer.alpha = 0.5f;
|
self.passwordIncrementer.alpha = 0.5f;
|
||||||
} else
|
} else
|
||||||
if (activeElement.type & MPElementTypeClassStored)
|
if (activeElement.type & MPElementTypeClassStored)
|
||||||
self.passwordEdit.alpha = 0.5f;
|
self.passwordEdit.alpha = 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.siteName.text = activeElement.name;
|
self.siteName.text = activeElement.name;
|
||||||
|
|
||||||
self.typeButton.alpha = activeElement? 1: 0;
|
self.typeButton.alpha = activeElement? 1: 0;
|
||||||
[self.typeButton setTitle:activeElement.typeName
|
[self.typeButton setTitle:activeElement.typeName
|
||||||
forState:UIControlStateNormal];
|
forState:UIControlStateNormal];
|
||||||
|
|
||||||
if ([activeElement isKindOfClass:[MPElementGeneratedEntity class]])
|
if ([activeElement isKindOfClass:[MPElementGeneratedEntity class]])
|
||||||
self.passwordCounter.text = PearlString(@"%u", ((MPElementGeneratedEntity *)activeElement).counter);
|
self.passwordCounter.text = PearlString(@"%u", ((MPElementGeneratedEntity *)activeElement).counter);
|
||||||
|
|
||||||
self.contentField.enabled = NO;
|
self.contentField.enabled = NO;
|
||||||
self.contentField.text = @"";
|
self.contentField.text = @"";
|
||||||
if (activeElement.name && ![activeElement isDeleted])
|
if (activeElement.name && ![activeElement isDeleted])
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
|
||||||
NSString *description = [activeElement.content description];
|
NSString *description = [activeElement.content description];
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
self.contentField.text = description;
|
self.contentField.text = description;
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
self.loginNameField.enabled = NO;
|
self.loginNameField.enabled = NO;
|
||||||
self.loginNameField.text = activeElement.loginName;
|
self.loginNameField.text = activeElement.loginName;
|
||||||
self.siteInfoHidden = !activeElement || ([[MPiOSConfig get].siteInfoHidden boolValue] && (activeElement.loginName == nil));
|
self.siteInfoHidden = !activeElement || ([[MPiOSConfig get].siteInfoHidden boolValue] && (activeElement.loginName == nil));
|
||||||
[self updateUserHiddenAnimated:NO];
|
[self updateUserHiddenAnimated:NO];
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)toggleHelpAnimated:(BOOL)animated {
|
- (void)toggleHelpAnimated:(BOOL)animated {
|
||||||
@ -344,12 +354,11 @@
|
|||||||
|
|
||||||
- (void)webViewDidFinishLoad:(UIWebView *)webView {
|
- (void)webViewDidFinishLoad:(UIWebView *)webView {
|
||||||
|
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
NSString *error = [self.helpView stringByEvaluatingJavaScriptFromString:
|
NSString *error = [self.helpView stringByEvaluatingJavaScriptFromString:
|
||||||
PearlString(@"setClass('%@');", activeElement.typeClassName)];
|
PearlString(@"setClass('%@');", activeElement.typeClassName)];
|
||||||
if (error.length)
|
if (error.length)
|
||||||
err(@"helpView.setClass: %@", error);
|
err(@"helpView.setClass: %@", error);
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)showContentTip:(NSString *)message withIcon:(UIImageView *)icon {
|
- (void)showContentTip:(NSString *)message withIcon:(UIImageView *)icon {
|
||||||
@ -451,43 +460,41 @@
|
|||||||
|
|
||||||
- (IBAction)copyContent {
|
- (IBAction)copyContent {
|
||||||
|
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
id content = activeElement.content;
|
id content = activeElement.content;
|
||||||
if (!content)
|
if (!content)
|
||||||
// Nothing to copy.
|
// Nothing to copy.
|
||||||
return;
|
return;
|
||||||
|
|
||||||
inf(@"Copying password for: %@", activeElement.name);
|
inf(@"Copying password for: %@", activeElement.name);
|
||||||
[UIPasteboard generalPasteboard].string = [content description];
|
[UIPasteboard generalPasteboard].string = [content description];
|
||||||
|
|
||||||
[self showContentTip:@"Copied!" withIcon:nil];
|
[self showContentTip:@"Copied!" withIcon:nil];
|
||||||
|
|
||||||
#ifdef TESTFLIGHT_SDK_VERSION
|
#ifdef TESTFLIGHT_SDK_VERSION
|
||||||
[TestFlight passCheckpoint:MPCheckpointCopyToPasteboard];
|
[TestFlight passCheckpoint:MPCheckpointCopyToPasteboard];
|
||||||
#endif
|
#endif
|
||||||
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointCopyToPasteboard attributes:@{@"type" : activeElement.typeName,
|
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointCopyToPasteboard attributes:@{@"type" : activeElement.typeName,
|
||||||
@"version" : @(activeElement.version)}];
|
@"version" : @(activeElement.version)}];
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)copyLoginName:(UITapGestureRecognizer *)sender {
|
- (IBAction)copyLoginName:(UITapGestureRecognizer *)sender {
|
||||||
|
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
if (!activeElement.loginName)
|
if (!activeElement.loginName)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
inf(@"Copying user name for: %@", activeElement.name);
|
inf(@"Copying user name for: %@", activeElement.name);
|
||||||
[UIPasteboard generalPasteboard].string = activeElement.loginName;
|
[UIPasteboard generalPasteboard].string = activeElement.loginName;
|
||||||
|
|
||||||
[self showLoginNameTip:@"Copied!"];
|
[self showLoginNameTip:@"Copied!"];
|
||||||
|
|
||||||
#ifdef TESTFLIGHT_SDK_VERSION
|
#ifdef TESTFLIGHT_SDK_VERSION
|
||||||
[TestFlight passCheckpoint:MPCheckpointCopyLoginNameToPasteboard];
|
[TestFlight passCheckpoint:MPCheckpointCopyLoginNameToPasteboard];
|
||||||
#endif
|
#endif
|
||||||
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointCopyLoginNameToPasteboard
|
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointCopyLoginNameToPasteboard
|
||||||
attributes:@{@"type" : activeElement.typeName,
|
attributes:@{@"type" : activeElement.typeName,
|
||||||
@"version" : @(activeElement.version)}];
|
@"version" : @(activeElement.version)}];
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)incrementPasswordCounter {
|
- (IBAction)incrementPasswordCounter {
|
||||||
@ -522,34 +529,30 @@
|
|||||||
if (sender.state != UIGestureRecognizerStateBegan)
|
if (sender.state != UIGestureRecognizerStateBegan)
|
||||||
// Only fire when the gesture was first detected.
|
// Only fire when the gesture was first detected.
|
||||||
return;
|
return;
|
||||||
__block BOOL abort = NO;
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
if (![activeElement isKindOfClass:[MPElementGeneratedEntity class]]) {
|
||||||
if (![activeElement isKindOfClass:[MPElementGeneratedEntity class]]) {
|
// Not of a type that supports a password counter.
|
||||||
// Not of a type that supports a password counter.
|
err(@"Cannot reset password counter: Element is not generated: %@", activeElement.name);
|
||||||
err(@"Cannot reset password counter: Element is not generated: %@", activeElement.name);
|
|
||||||
abort = YES;
|
|
||||||
} else
|
|
||||||
if (((MPElementGeneratedEntity *)activeElement).counter == 1)
|
|
||||||
// Counter has initial value, no point resetting.
|
|
||||||
abort = YES;
|
|
||||||
}];
|
|
||||||
if (abort)
|
|
||||||
return;
|
return;
|
||||||
|
} else
|
||||||
|
if (((MPElementGeneratedEntity *)activeElement).counter == 1)
|
||||||
|
// Counter has initial value, no point resetting.
|
||||||
|
return;
|
||||||
|
|
||||||
[self changeActiveElementWithWarning:
|
[self changeActiveElementWithWarning:
|
||||||
@"You are resetting the site's password counter.\n\n"
|
@"You are resetting the site's password counter.\n\n"
|
||||||
@"If you continue, the site's password will change back to its original value. "
|
@"If you continue, the site's password will change back to its original value. "
|
||||||
@"You will then need to update your account's password back to this original value."
|
@"You will then need to update your account's password back to this original value."
|
||||||
do:^BOOL(MPElementEntity *activeElement){
|
do:^BOOL(MPElementEntity *activeElement_){
|
||||||
inf(@"Resetting password counter for: %@", activeElement.name);
|
inf(@"Resetting password counter for: %@", activeElement_.name);
|
||||||
((MPElementGeneratedEntity *)activeElement).counter = 1;
|
((MPElementGeneratedEntity *)activeElement_).counter = 1;
|
||||||
|
|
||||||
#ifdef TESTFLIGHT_SDK_VERSION
|
#ifdef TESTFLIGHT_SDK_VERSION
|
||||||
[TestFlight passCheckpoint:MPCheckpointResetPasswordCounter];
|
[TestFlight passCheckpoint:MPCheckpointResetPasswordCounter];
|
||||||
#endif
|
#endif
|
||||||
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointResetPasswordCounter
|
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointResetPasswordCounter
|
||||||
attributes:@{@"type": activeElement.typeName,
|
attributes:@{@"type": activeElement_.typeName,
|
||||||
@"version": @(activeElement.version)}];
|
@"version": @(activeElement_.version)}];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
@ -560,19 +563,18 @@
|
|||||||
// Only fire when the gesture was first detected.
|
// Only fire when the gesture was first detected.
|
||||||
return;
|
return;
|
||||||
|
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
if (!activeElement)
|
if (!activeElement)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
self.loginNameField.enabled = YES;
|
self.loginNameField.enabled = YES;
|
||||||
[self.loginNameField becomeFirstResponder];
|
[self.loginNameField becomeFirstResponder];
|
||||||
|
|
||||||
#ifdef TESTFLIGHT_SDK_VERSION
|
#ifdef TESTFLIGHT_SDK_VERSION
|
||||||
[TestFlight passCheckpoint:MPCheckpointEditLoginName];
|
[TestFlight passCheckpoint:MPCheckpointEditLoginName];
|
||||||
#endif
|
#endif
|
||||||
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointEditLoginName attributes:@{@"type" : activeElement.typeName,
|
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointEditLoginName attributes:@{@"type" : activeElement.typeName,
|
||||||
@"version" : @(activeElement.version)}];
|
@"version" : @(activeElement.version)}];
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)changeActiveElementWithWarning:(NSString *)warning do:(BOOL (^)(MPElementEntity *activeElement))task; {
|
- (void)changeActiveElementWithWarning:(NSString *)warning do:(BOOL (^)(MPElementEntity *activeElement))task; {
|
||||||
@ -588,101 +590,92 @@
|
|||||||
|
|
||||||
- (void)changeActiveElementWithoutWarningDo:(BOOL (^)(MPElementEntity *activeElement))task; {
|
- (void)changeActiveElementWithoutWarningDo:(BOOL (^)(MPElementEntity *activeElement))task; {
|
||||||
|
|
||||||
// Update element, keeping track of the old password.
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
NSString *oldPassword = [activeElement.content description];
|
||||||
// Perform the task.
|
if (!task( activeElement ))
|
||||||
NSString *oldPassword = [activeElement.content description];
|
return;
|
||||||
if (!task( activeElement ))
|
NSString *newPassword = [activeElement.content description];
|
||||||
return;
|
|
||||||
NSString *newPassword = [activeElement.content description];
|
|
||||||
|
|
||||||
// Save.
|
// Save.
|
||||||
[activeElement.managedObjectContext saveToStore];
|
[activeElement.managedObjectContext saveToStore];
|
||||||
|
|
||||||
// Update the UI.
|
// Update the UI.
|
||||||
dispatch_async( dispatch_get_main_queue(), ^{
|
dispatch_async( dispatch_get_main_queue(), ^{
|
||||||
[self updateAnimated:YES];
|
[self updateAnimated:YES];
|
||||||
|
|
||||||
// Show new and old password.
|
// Show new and old password.
|
||||||
if ([oldPassword length] && ![oldPassword isEqualToString:newPassword])
|
if ([oldPassword length] && ![oldPassword isEqualToString:newPassword])
|
||||||
[self showAlertWithTitle:@"Password Changed!"
|
[self showAlertWithTitle:@"Password Changed!"
|
||||||
message:PearlString( @"The password for %@ has changed.\n\n"
|
message:PearlString( @"The password for %@ has changed.\n\n"
|
||||||
@"IMPORTANT:\n"
|
@"IMPORTANT:\n"
|
||||||
@"Don't forget to update the site with your new password! "
|
@"Don't forget to update the site with your new password! "
|
||||||
@"Your old password was:\n"
|
@"Your old password was:\n"
|
||||||
@"%@", activeElement.name, oldPassword )];
|
@"%@", activeElement.name, oldPassword )];
|
||||||
} );
|
} );
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)activeElementDo:(void (^)(MPElementEntity *activeElement))task {
|
- (MPElementEntity *)activeElementForThread {
|
||||||
|
|
||||||
if (!_activeElementOID) {
|
if (!_activeElementOID)
|
||||||
task(nil);
|
return nil;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSManagedObjectContext *moc = [MPAppDelegate managedObjectContextForThreadIfReady];
|
NSManagedObjectContext *moc = [MPAppDelegate managedObjectContextForThreadIfReady];
|
||||||
if (!moc) {
|
if (!moc)
|
||||||
task(nil);
|
return nil;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSError *error;
|
NSError *error;
|
||||||
MPElementEntity *activeElement = (MPElementEntity *)[moc existingObjectWithID:_activeElementOID error:&error];
|
MPElementEntity *activeElement = (MPElementEntity *)[moc existingObjectWithID:_activeElementOID error:&error];
|
||||||
if (!activeElement)
|
if (!activeElement)
|
||||||
err(@"Couldn't retrieve active element: %@", error);
|
err(@"Couldn't retrieve active element: %@", error);
|
||||||
|
|
||||||
task(activeElement);
|
return activeElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (IBAction)editPassword {
|
- (IBAction)editPassword {
|
||||||
|
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
if (!(activeElement.type & MPElementTypeClassStored)) {
|
if (!(activeElement.type & MPElementTypeClassStored)) {
|
||||||
// Not of a type that supports editing the content.
|
// Not of a type that supports editing the content.
|
||||||
err(@"Cannot edit content: Element is not stored: %@", activeElement.name);
|
err(@"Cannot edit content: Element is not stored: %@", activeElement.name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.contentField.enabled = YES;
|
self.contentField.enabled = YES;
|
||||||
[self.contentField becomeFirstResponder];
|
[self.contentField becomeFirstResponder];
|
||||||
|
|
||||||
#ifdef TESTFLIGHT_SDK_VERSION
|
#ifdef TESTFLIGHT_SDK_VERSION
|
||||||
[TestFlight passCheckpoint:MPCheckpointEditPassword];
|
[TestFlight passCheckpoint:MPCheckpointEditPassword];
|
||||||
#endif
|
#endif
|
||||||
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointEditPassword attributes:@{@"type" : activeElement.typeName,
|
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointEditPassword attributes:@{@"type" : activeElement.typeName,
|
||||||
@"version" : @(activeElement.version)}];
|
@"version" : @(activeElement.version)}];
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)upgradePassword {
|
- (IBAction)upgradePassword {
|
||||||
|
|
||||||
__block NSString *warning = nil;
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
if (!activeElement)
|
||||||
warning = activeElement.type & MPElementTypeClassGenerated?
|
return;
|
||||||
|
|
||||||
|
NSString *warning = activeElement.type & MPElementTypeClassGenerated?
|
||||||
@"You are upgrading the site.\n\n"
|
@"You are upgrading the site.\n\n"
|
||||||
@"This upgrade improves the site's compatibility with the latest version of Master Password.\n\n"
|
@"This upgrade improves the site's compatibility with the latest version of Master Password.\n\n"
|
||||||
@"Your password will change and you will need to update your site's account."
|
@"Your password will change and you will need to update your site's account."
|
||||||
:
|
:
|
||||||
@"You are upgrading the site.\n\n"
|
@"You are upgrading the site.\n\n"
|
||||||
@"This upgrade improves the site's compatibility with the latest version of Master Password.";
|
@"This upgrade improves the site's compatibility with the latest version of Master Password.";
|
||||||
}];
|
|
||||||
if (!warning)
|
|
||||||
return;
|
|
||||||
|
|
||||||
[self changeActiveElementWithWarning:warning do:
|
[self changeActiveElementWithWarning:warning do:
|
||||||
^BOOL(MPElementEntity *activeElement) {
|
^BOOL(MPElementEntity *activeElement_) {
|
||||||
inf(@"Explicitly migrating element: %@", activeElement);
|
inf(@"Explicitly migrating element: %@", activeElement_);
|
||||||
[activeElement migrateExplicitly:YES];
|
[activeElement_ migrateExplicitly:YES];
|
||||||
|
|
||||||
#ifdef TESTFLIGHT_SDK_VERSION
|
#ifdef TESTFLIGHT_SDK_VERSION
|
||||||
[TestFlight passCheckpoint:MPCheckpointExplicitMigration];
|
[TestFlight passCheckpoint:MPCheckpointExplicitMigration];
|
||||||
#endif
|
#endif
|
||||||
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointExplicitMigration attributes:@{
|
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointExplicitMigration attributes:@{
|
||||||
@"type" : activeElement.typeName,
|
@"type" : activeElement_.typeName,
|
||||||
@"version" : @(activeElement.version)
|
@"version" : @(activeElement_.version)
|
||||||
}];
|
}];
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
@ -783,12 +776,7 @@
|
|||||||
|
|
||||||
- (MPElementEntity *)selectedElement {
|
- (MPElementEntity *)selectedElement {
|
||||||
|
|
||||||
__block MPElementEntity *selectedElement;
|
return [self activeElementForThread];
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
|
||||||
selectedElement = activeElement;
|
|
||||||
}];
|
|
||||||
|
|
||||||
return selectedElement;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)didSelectType:(MPElementType)type {
|
- (void)didSelectType:(MPElementType)type {
|
||||||
@ -839,36 +827,34 @@
|
|||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
inf(@"Selected: %@", activeElement.name);
|
inf(@"Selected: %@", activeElement.name);
|
||||||
dbg(@"Element:\n%@", [activeElement debugDescription]);
|
|
||||||
|
|
||||||
if (![[MPiOSConfig get].typeTipShown boolValue])
|
if (![[MPiOSConfig get].typeTipShown boolValue])
|
||||||
[UIView animateWithDuration:0.5f animations:^{
|
[UIView animateWithDuration:0.5f animations:^{
|
||||||
self.typeTipContainer.alpha = 1;
|
self.typeTipContainer.alpha = 1;
|
||||||
} completion:^(BOOL finished) {
|
} completion:^(BOOL finished) {
|
||||||
if (finished) {
|
if (finished) {
|
||||||
[MPiOSConfig get].typeTipShown = PearlBool(YES);
|
[MPiOSConfig get].typeTipShown = PearlBool(YES);
|
||||||
|
|
||||||
dispatch_after(
|
dispatch_after(
|
||||||
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||||
[UIView animateWithDuration:0.2f animations:^{
|
[UIView animateWithDuration:0.2f animations:^{
|
||||||
self.typeTipContainer.alpha = 0;
|
self.typeTipContainer.alpha = 0;
|
||||||
}];
|
}];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
|
|
||||||
[self.searchDisplayController setActive:NO animated:YES];
|
[self.searchDisplayController setActive:NO animated:YES];
|
||||||
self.searchDisplayController.searchBar.text = activeElement.name;
|
self.searchDisplayController.searchBar.text = activeElement.name;
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPElementUpdatedNotification object:activeElement.objectID];
|
[[NSNotificationCenter defaultCenter] postNotificationName:MPElementUpdatedNotification object:activeElement.objectID];
|
||||||
#ifdef TESTFLIGHT_SDK_VERSION
|
#ifdef TESTFLIGHT_SDK_VERSION
|
||||||
[TestFlight passCheckpoint:PearlString(MPCheckpointUseType @"_%@", activeElement.typeShortName)];
|
[TestFlight passCheckpoint:PearlString(MPCheckpointUseType @"_%@", activeElement.typeShortName)];
|
||||||
#endif
|
#endif
|
||||||
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointUseType attributes:@{@"type" : activeElement.typeName,
|
[[LocalyticsSession sharedLocalyticsSession] tagEvent:MPCheckpointUseType attributes:@{@"type" : activeElement.typeName,
|
||||||
@"version" : @(activeElement.version)}];
|
@"version" : @(activeElement.version)}];
|
||||||
}];
|
|
||||||
[self updateAnimated:YES];
|
[self updateAnimated:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -886,21 +872,17 @@
|
|||||||
|
|
||||||
if (textField == self.contentField) {
|
if (textField == self.contentField) {
|
||||||
self.contentField.enabled = NO;
|
self.contentField.enabled = NO;
|
||||||
__block BOOL abort = NO;
|
MPElementEntity *activeElement = [self activeElementForThread];
|
||||||
[self activeElementDo:^(MPElementEntity *activeElement) {
|
if (![activeElement isKindOfClass:[MPElementStoredEntity class]]) {
|
||||||
if (![activeElement isKindOfClass:[MPElementStoredEntity class]]) {
|
// Not of a type whose content can be edited.
|
||||||
// Not of a type whose content can be edited.
|
err(@"Cannot update element content: Element is not stored: %@", activeElement.name);
|
||||||
err(@"Cannot update element content: Element is not stored: %@", activeElement.name);
|
return;
|
||||||
abort = YES;
|
} else if ([((MPElementStoredEntity *)activeElement).content isEqual:self.contentField.text])
|
||||||
} else if ([((MPElementStoredEntity *)activeElement).content isEqual:self.contentField.text])
|
// Content hasn't changed.
|
||||||
// Content hasn't changed.
|
|
||||||
abort = YES;
|
|
||||||
}];
|
|
||||||
if (abort)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
[self changeActiveElementWithoutWarningDo:^BOOL(MPElementEntity *activeElement) {
|
[self changeActiveElementWithoutWarningDo:^BOOL(MPElementEntity *activeElement_) {
|
||||||
((MPElementStoredEntity *)activeElement).content = self.contentField.text;
|
((MPElementStoredEntity *)activeElement_).content = self.contentField.text;
|
||||||
return YES;
|
return YES;
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
@ -47,12 +47,12 @@
|
|||||||
} options:0];
|
} options:0];
|
||||||
[avatar onSelect:^(BOOL selected) {
|
[avatar onSelect:^(BOOL selected) {
|
||||||
if (selected) {
|
if (selected) {
|
||||||
MPUserEntity *activeUser = [MPAppDelegate get].activeUser;
|
MPUserEntity *activeUser = [[MPAppDelegate get] activeUserForThread];
|
||||||
activeUser.avatar = (unsigned)avatar.tag;
|
activeUser.avatar = (unsigned)avatar.tag;
|
||||||
[activeUser.managedObjectContext saveToStore];
|
[activeUser.managedObjectContext saveToStore];
|
||||||
}
|
}
|
||||||
} options:0];
|
} options:0];
|
||||||
avatar.selected = (a == [MPAppDelegate get].activeUser.avatar);
|
avatar.selected = (a == [[MPAppDelegate get] activeUserForThread].avatar);
|
||||||
}
|
}
|
||||||
|
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
@ -68,8 +68,9 @@
|
|||||||
}
|
}
|
||||||
} recurse:NO];
|
} recurse:NO];
|
||||||
|
|
||||||
self.savePasswordSwitch.on = [MPAppDelegate get].activeUser.saveKey;
|
MPUserEntity *activeUser = [[MPAppDelegate get] activeUserForThread];
|
||||||
self.defaultTypeLabel.text = [[MPAppDelegate get].key.algorithm shortNameOfType:[MPAppDelegate get].activeUser.defaultType];
|
self.savePasswordSwitch.on = activeUser.saveKey;
|
||||||
|
self.defaultTypeLabel.text = [[MPAppDelegate get].key.algorithm shortNameOfType:activeUser.defaultType];
|
||||||
|
|
||||||
[super viewWillAppear:animated];
|
[super viewWillAppear:animated];
|
||||||
}
|
}
|
||||||
@ -113,7 +114,7 @@
|
|||||||
|
|
||||||
else
|
else
|
||||||
if (cell == self.changeMPCell) {
|
if (cell == self.changeMPCell) {
|
||||||
MPUserEntity *activeUser = [MPAppDelegate get].activeUser;
|
MPUserEntity *activeUser = [[MPAppDelegate get] activeUserForThread];
|
||||||
[[MPAppDelegate get] changeMasterPasswordFor:activeUser inContext:activeUser.managedObjectContext didResetBlock:nil];
|
[[MPAppDelegate get] changeMasterPasswordFor:activeUser inContext:activeUser.managedObjectContext didResetBlock:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +133,7 @@
|
|||||||
|
|
||||||
- (void)didSelectType:(MPElementType)type {
|
- (void)didSelectType:(MPElementType)type {
|
||||||
|
|
||||||
MPUserEntity *activeUser = [MPAppDelegate get].activeUser;
|
MPUserEntity *activeUser = [[MPAppDelegate get] activeUserForThread];
|
||||||
activeUser.defaultType = type;
|
activeUser.defaultType = type;
|
||||||
[activeUser.managedObjectContext saveToStore];
|
[activeUser.managedObjectContext saveToStore];
|
||||||
|
|
||||||
@ -141,14 +142,14 @@
|
|||||||
|
|
||||||
- (MPElementType)selectedType {
|
- (MPElementType)selectedType {
|
||||||
|
|
||||||
return [MPAppDelegate get].activeUser.defaultType;
|
return [[MPAppDelegate get] activeUserForThread].defaultType;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - IBActions
|
#pragma mark - IBActions
|
||||||
|
|
||||||
- (IBAction)didToggleSwitch:(UISwitch *)sender {
|
- (IBAction)didToggleSwitch:(UISwitch *)sender {
|
||||||
|
|
||||||
MPUserEntity *activeUser = [MPAppDelegate get].activeUser;
|
MPUserEntity *activeUser = [[MPAppDelegate get] activeUserForThread];
|
||||||
if ((activeUser.saveKey = sender.on))
|
if ((activeUser.saveKey = sender.on))
|
||||||
[[MPAppDelegate get] storeSavedKeyFor:activeUser];
|
[[MPAppDelegate get] storeSavedKeyFor:activeUser];
|
||||||
else
|
else
|
||||||
|
@ -120,8 +120,8 @@
|
|||||||
self.nameLabel.layer.cornerRadius = 5;
|
self.nameLabel.layer.cornerRadius = 5;
|
||||||
self.avatarTemplate.hidden = YES;
|
self.avatarTemplate.hidden = YES;
|
||||||
self.spinner.alpha = 0;
|
self.spinner.alpha = 0;
|
||||||
self.passwordTipView.alpha = 0;
|
self.passwordTipView.hidden = NO;
|
||||||
self.createPasswordTipView.alpha = 0;
|
self.createPasswordTipView.hidden = NO;
|
||||||
|
|
||||||
NSMutableArray *wordListLines = [NSMutableArray arrayWithCapacity:27413];
|
NSMutableArray *wordListLines = [NSMutableArray arrayWithCapacity:27413];
|
||||||
[[[NSString alloc] initWithData:[NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"dictionary" withExtension:@"lst"]]
|
[[[NSString alloc] initWithData:[NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"dictionary" withExtension:@"lst"]]
|
||||||
@ -317,38 +317,36 @@
|
|||||||
- (void)showNewUserNameAlertFor:(MPUserEntity *)newUser inContext:(NSManagedObjectContext *)moc
|
- (void)showNewUserNameAlertFor:(MPUserEntity *)newUser inContext:(NSManagedObjectContext *)moc
|
||||||
completion:(void (^)(BOOL finished))completion {
|
completion:(void (^)(BOOL finished))completion {
|
||||||
|
|
||||||
PEARL_MAIN_THREAD_START
|
[PearlAlert showAlertWithTitle:@"Enter Your Name"
|
||||||
[PearlAlert showAlertWithTitle:@"Enter Your Name"
|
message:nil viewStyle:UIAlertViewStylePlainTextInput
|
||||||
message:nil viewStyle:UIAlertViewStylePlainTextInput
|
initAlert:^(UIAlertView *alert, UITextField *firstField) {
|
||||||
initAlert:^(UIAlertView *alert, UITextField *firstField) {
|
firstField.autocapitalizationType = UITextAutocapitalizationTypeWords;
|
||||||
firstField.autocapitalizationType = UITextAutocapitalizationTypeWords;
|
firstField.keyboardType = UIKeyboardTypeAlphabet;
|
||||||
firstField.keyboardType = UIKeyboardTypeAlphabet;
|
firstField.text = newUser.name;
|
||||||
firstField.text = newUser.name;
|
firstField.placeholder = @"eg. Robert Lee Mitchell";
|
||||||
firstField.placeholder = @"eg. Robert Lee Mitchell";
|
firstField.enablesReturnKeyAutomatically = YES;
|
||||||
firstField.enablesReturnKeyAutomatically = YES;
|
|
||||||
}
|
|
||||||
tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
|
||||||
if (buttonIndex == [alert cancelButtonIndex]) {
|
|
||||||
completion(NO);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
NSString *name = [alert textFieldAtIndex:0].text;
|
tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
||||||
if (!name.length) {
|
if (buttonIndex == [alert cancelButtonIndex]) {
|
||||||
[PearlAlert showAlertWithTitle:@"Name Is Required" message:nil viewStyle:UIAlertViewStyleDefault initAlert:nil
|
completion(NO);
|
||||||
tappedButtonBlock:^(UIAlertView *alert_, NSInteger buttonIndex_) {
|
return;
|
||||||
[self showNewUserNameAlertFor:newUser inContext:moc completion:completion];
|
|
||||||
} cancelTitle:@"Try Again" otherTitles:nil];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save
|
|
||||||
[moc performBlockAndWait:^{
|
|
||||||
newUser.name = name;
|
|
||||||
}];
|
|
||||||
[self showNewUserAvatarAlertFor:newUser inContext:moc completion:completion];
|
|
||||||
}
|
}
|
||||||
cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:[PearlStrings get].commonButtonSave, nil];
|
NSString *name = [alert textFieldAtIndex:0].text;
|
||||||
PEARL_MAIN_THREAD_END
|
if (!name.length) {
|
||||||
|
[PearlAlert showAlertWithTitle:@"Name Is Required" message:nil viewStyle:UIAlertViewStyleDefault initAlert:nil
|
||||||
|
tappedButtonBlock:^(UIAlertView *alert_, NSInteger buttonIndex_) {
|
||||||
|
[self showNewUserNameAlertFor:newUser inContext:moc completion:completion];
|
||||||
|
} cancelTitle:@"Try Again" otherTitles:nil];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save
|
||||||
|
[moc performBlockAndWait:^{
|
||||||
|
newUser.name = name;
|
||||||
|
}];
|
||||||
|
[self showNewUserAvatarAlertFor:newUser inContext:moc completion:completion];
|
||||||
|
}
|
||||||
|
cancelTitle:[PearlStrings get].commonButtonCancel otherTitles:[PearlStrings get].commonButtonSave, nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)showNewUserAvatarAlertFor:(MPUserEntity *)newUser inContext:(NSManagedObjectContext *)moc
|
- (void)showNewUserAvatarAlertFor:(MPUserEntity *)newUser inContext:(NSManagedObjectContext *)moc
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="NKe-nv-566" customClass="MPTypeViewController" sceneMemberID="viewController">
|
<tableViewController id="NKe-nv-566" customClass="MPTypeViewController" sceneMemberID="viewController">
|
||||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="btl-G4-V0S">
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="btl-G4-V0S">
|
||||||
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
|
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" red="0.12549020350000001" green="0.1411764771" blue="0.14901961389999999" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="backgroundColor" red="0.12549020350000001" green="0.1411764771" blue="0.14901961389999999" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<view key="tableFooterView" contentMode="scaleToFill" id="aNa-wb-cYK">
|
<view key="tableFooterView" contentMode="scaleToFill" id="aNa-wb-cYK">
|
||||||
@ -481,11 +481,11 @@ Your passwords will be AES-encrypted with your master password.</string>
|
|||||||
<objects>
|
<objects>
|
||||||
<viewController id="PQa-Xl-A3x" customClass="MPMainViewController" sceneMemberID="viewController">
|
<viewController id="PQa-Xl-A3x" customClass="MPMainViewController" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="Ep0-Hn-5TR">
|
<view key="view" contentMode="scaleToFill" id="Ep0-Hn-5TR">
|
||||||
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
|
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" image="background.png" id="0hY-LL-ITu">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" image="background.png" id="0hY-LL-ITu">
|
||||||
<rect key="frame" x="0.0" y="44" width="320" height="460"/>
|
<rect key="frame" x="0.0" y="44" width="320" height="372"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<view contentMode="scaleToFill" id="Juh-jm-UDr" userLabel="View - Content">
|
<view contentMode="scaleToFill" id="Juh-jm-UDr" userLabel="View - Content">
|
||||||
@ -662,9 +662,10 @@ Your passwords will be AES-encrypted with your master password.</string>
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view contentMode="scaleToFill" id="61G-By-qLB" userLabel="View - Help">
|
<view contentMode="scaleToFill" id="61G-By-qLB" userLabel="View - Help">
|
||||||
<rect key="frame" x="0.0" y="334" width="320" height="170"/>
|
<rect key="frame" x="0.0" y="246" width="320" height="170"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="top" image="Square-bottom.png" id="lbm-A0-3PK">
|
<imageView userInteractionEnabled="NO" contentMode="top" image="Square-bottom.png" id="lbm-A0-3PK">
|
||||||
@ -706,7 +707,7 @@ Your passwords will be AES-encrypted with your master password.</string>
|
|||||||
<color key="tintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="tintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="URL"/>
|
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="URL"/>
|
||||||
</searchBar>
|
</searchBar>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="foz-tW-xGw" userLabel="View - Action Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="foz-tW-xGw" userLabel="View - Action Tip">
|
||||||
<rect key="frame" x="10" y="0.0" width="300" height="60"/>
|
<rect key="frame" x="10" y="0.0" width="300" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -729,7 +730,7 @@ Your passwords will be AES-encrypted with your master password.</string>
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="zOR-Du-qRL" userLabel="View - Search Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="zOR-Du-qRL" userLabel="View - Search Tip">
|
||||||
<rect key="frame" x="10" y="15" width="300" height="60"/>
|
<rect key="frame" x="10" y="15" width="300" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -748,9 +749,9 @@ Your passwords will be AES-encrypted with your master password.</string>
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="UM8-56-kAO" userLabel="View - Tool Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="UM8-56-kAO" userLabel="View - Tool Tip">
|
||||||
<rect key="frame" x="10" y="15" width="266" height="60"/>
|
<rect key="frame" x="10" y="15" width="266" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black_bottom_right.png" id="LqX-rO-rep">
|
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black_bottom_right.png" id="LqX-rO-rep">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="266" height="60"/>
|
<rect key="frame" x="0.0" y="0.0" width="266" height="60"/>
|
||||||
@ -771,7 +772,7 @@ Your passwords will be AES-encrypted with your master password.</string>
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="g55-0m-WjS" userLabel="View - Type Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="g55-0m-WjS" userLabel="View - Type Tip">
|
||||||
<rect key="frame" x="10" y="228" width="300" height="60"/>
|
<rect key="frame" x="10" y="228" width="300" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -790,7 +791,7 @@ Your passwords will be AES-encrypted with your master password.</string>
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="v2m-Gf-pEV" userLabel="View - Content Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="v2m-Gf-pEV" userLabel="View - Content Tip">
|
||||||
<rect key="frame" x="55" y="50" width="210" height="60"/>
|
<rect key="frame" x="55" y="50" width="210" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -808,7 +809,7 @@ Your passwords will be AES-encrypted with your master password.</string>
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="b9W-aA-93r" userLabel="View - User Name Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="b9W-aA-93r" userLabel="View - User Name Tip">
|
||||||
<rect key="frame" x="55" y="110" width="210" height="60"/>
|
<rect key="frame" x="55" y="110" width="210" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -826,8 +827,8 @@ Your passwords will be AES-encrypted with your master password.</string>
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view alpha="0.0" contentMode="scaleToFill" id="6wk-NU-VQG" userLabel="View - Outdated Alert">
|
<view hidden="YES" alpha="0.0" contentMode="scaleToFill" id="6wk-NU-VQG" userLabel="View - Outdated Alert">
|
||||||
<rect key="frame" x="10" y="318" width="300" height="180"/>
|
<rect key="frame" x="10" y="230" width="300" height="180"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView contentMode="scaleToFill" image="tip_alert_black.png" id="f30-i7-VBv">
|
<imageView contentMode="scaleToFill" image="tip_alert_black.png" id="f30-i7-VBv">
|
||||||
@ -904,8 +905,8 @@ These sites should be upgraded and their account's passwords updated as soon as
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view alpha="0.0" contentMode="scaleToFill" id="yRY-qt-gz8" userLabel="View - Alert">
|
<view hidden="YES" alpha="0.0" contentMode="scaleToFill" id="yRY-qt-gz8" userLabel="View - Alert">
|
||||||
<rect key="frame" x="10" y="318" width="300" height="180"/>
|
<rect key="frame" x="10" y="230" width="300" height="180"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_alert_black.png" id="TUv-Tl-xTc">
|
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_alert_black.png" id="TUv-Tl-xTc">
|
||||||
@ -1084,15 +1085,15 @@ L4m3P4sSw0rD</string>
|
|||||||
<objects>
|
<objects>
|
||||||
<viewController storyboardIdentifier="MPUnlockViewController" wantsFullScreenLayout="YES" modalTransitionStyle="flipHorizontal" id="Nbn-Rv-sP1" customClass="MPUnlockViewController" sceneMemberID="viewController">
|
<viewController storyboardIdentifier="MPUnlockViewController" wantsFullScreenLayout="YES" modalTransitionStyle="flipHorizontal" id="Nbn-Rv-sP1" customClass="MPUnlockViewController" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="GeE-5J-ZZO">
|
<view key="view" contentMode="scaleToFill" id="GeE-5J-ZZO">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="QWe-Gw-rD3">
|
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="QWe-Gw-rD3">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<view contentMode="scaleToFill" id="PHH-XC-9QQ">
|
<view contentMode="scaleToFill" id="PHH-XC-9QQ">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="ui_spinner.png" id="27q-lX-0vy">
|
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="ui_spinner.png" id="27q-lX-0vy">
|
||||||
@ -1251,7 +1252,7 @@ L4m3P4sSw0rD</string>
|
|||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="Tap and hold to delete or reset user." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="DBJ-Qi-ZcF">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="Tap and hold to delete or reset user." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="DBJ-Qi-ZcF">
|
||||||
<rect key="frame" x="20" y="548" width="280" height="20"/>
|
<rect key="frame" x="20" y="460" width="280" height="20"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/>
|
<fontDescription key="fontDescription" name="Copperplate" family="Copperplate" pointSize="12"/>
|
||||||
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
|
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||||
@ -1260,7 +1261,7 @@ L4m3P4sSw0rD</string>
|
|||||||
</label>
|
</label>
|
||||||
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" indicatorStyle="white" delaysContentTouches="NO" id="Blg-F1-9NA">
|
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" indicatorStyle="white" delaysContentTouches="NO" id="Blg-F1-9NA">
|
||||||
<rect key="frame" x="0.0" y="16" width="320" height="340"/>
|
<rect key="frame" x="0.0" y="16" width="320" height="340"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="top" showsTouchWhenHighlighted="YES" adjustsImageWhenHighlighted="NO" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" id="Ten-ig-gog">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="top" showsTouchWhenHighlighted="YES" adjustsImageWhenHighlighted="NO" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" id="Ten-ig-gog">
|
||||||
<rect key="frame" x="105" y="30" width="110" height="110"/>
|
<rect key="frame" x="105" y="30" width="110" height="110"/>
|
||||||
@ -1283,7 +1284,7 @@ L4m3P4sSw0rD</string>
|
|||||||
</scrollView>
|
</scrollView>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="left" text="Maarten Billemont" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumFontSize="10" id="8s0-nT-Aoq">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="left" text="Maarten Billemont" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumFontSize="10" id="8s0-nT-Aoq">
|
||||||
<rect key="frame" x="90" y="377" width="140" height="15"/>
|
<rect key="frame" x="90" y="377" width="140" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
<fontDescription key="fontDescription" name="Futura-CondensedExtraBold" family="Futura" pointSize="13"/>
|
<fontDescription key="fontDescription" name="Futura-CondensedExtraBold" family="Futura" pointSize="13"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
@ -1291,15 +1292,15 @@ L4m3P4sSw0rD</string>
|
|||||||
</label>
|
</label>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Maarten Billemont" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumFontSize="10" id="0NM-NI-7UR">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Maarten Billemont" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumFontSize="10" id="0NM-NI-7UR">
|
||||||
<rect key="frame" x="90" y="174" width="140" height="15"/>
|
<rect key="frame" x="90" y="174" width="140" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<fontDescription key="fontDescription" name="Futura-CondensedExtraBold" family="Futura" pointSize="13"/>
|
<fontDescription key="fontDescription" name="Futura-CondensedExtraBold" family="Futura" pointSize="13"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="xWL-xQ-KjX">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="xWL-xQ-KjX" userLabel="View - Create Password Tip">
|
||||||
<rect key="frame" x="20" y="60" width="280" height="100"/>
|
<rect key="frame" x="20" y="60" width="280" height="100"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" id="Xrk-S4-ZN5">
|
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" id="Xrk-S4-ZN5">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="280" height="100"/>
|
<rect key="frame" x="0.0" y="0.0" width="280" height="100"/>
|
||||||
@ -1321,7 +1322,7 @@ You could use the word wall for inspiration in finding a memorable master passw
|
|||||||
</view>
|
</view>
|
||||||
<view contentMode="scaleToFill" id="7cc-yu-i0m">
|
<view contentMode="scaleToFill" id="7cc-yu-i0m">
|
||||||
<rect key="frame" x="20" y="168" width="280" height="88"/>
|
<rect key="frame" x="20" y="168" width="280" height="88"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Enter your master password:" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="RhX-bA-EhC">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Enter your master password:" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="RhX-bA-EhC">
|
||||||
<rect key="frame" x="10" y="0.0" width="260" height="20"/>
|
<rect key="frame" x="10" y="0.0" width="260" height="20"/>
|
||||||
@ -1345,7 +1346,7 @@ You could use the word wall for inspiration in finding a memorable master passw
|
|||||||
<outlet property="delegate" destination="Nbn-Rv-sP1" id="Y0T-cI-gF1"/>
|
<outlet property="delegate" destination="Nbn-Rv-sP1" id="Y0T-cI-gF1"/>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="NvG-0R-eTZ">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="NvG-0R-eTZ" userLabel="View - Password Tip">
|
||||||
<rect key="frame" x="35" y="0.0" width="210" height="60"/>
|
<rect key="frame" x="35" y="0.0" width="210" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -1443,7 +1444,7 @@ You could use the word wall for inspiration in finding a memorable master passw
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<webView opaque="NO" contentMode="scaleToFill" id="rGU-aZ-XVm">
|
<webView opaque="NO" contentMode="scaleToFill" id="rGU-aZ-XVm">
|
||||||
<rect key="frame" x="0.0" y="499" width="320" height="44"/>
|
<rect key="frame" x="0.0" y="411" width="320" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
<dataDetectorType key="dataDetectorTypes"/>
|
<dataDetectorType key="dataDetectorTypes"/>
|
||||||
@ -1491,14 +1492,19 @@ You could use the word wall for inspiration in finding a memorable master passw
|
|||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="455" y="145"/>
|
<point key="canvasLocation" x="455" y="145"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Navigation Controller-->
|
<!--Pearl Navigation Controller-->
|
||||||
<scene sceneID="wrY-9D-LEc">
|
<scene sceneID="wrY-9D-LEc">
|
||||||
<objects>
|
<objects>
|
||||||
<navigationController definesPresentationContext="YES" id="uu3-4d-bYN" sceneMemberID="viewController">
|
<navigationController definesPresentationContext="YES" id="uu3-4d-bYN" customClass="PearlNavigationController" sceneMemberID="viewController">
|
||||||
<navigationBar key="navigationBar" contentMode="scaleToFill" id="T2Q-L6-b8f">
|
<navigationBar key="navigationBar" contentMode="scaleToFill" id="T2Q-L6-b8f">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<color key="tintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="tintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
</navigationBar>
|
</navigationBar>
|
||||||
|
<userDefinedRuntimeAttributes>
|
||||||
|
<userDefinedRuntimeAttribute type="number" keyPath="supportedInterfaceOrientations">
|
||||||
|
<integer key="value" value="2"/>
|
||||||
|
</userDefinedRuntimeAttribute>
|
||||||
|
</userDefinedRuntimeAttributes>
|
||||||
<connections>
|
<connections>
|
||||||
<segue destination="Q4b-t4-pwH" kind="relationship" relationship="rootViewController" id="5mm-gX-15G"/>
|
<segue destination="Q4b-t4-pwH" kind="relationship" relationship="rootViewController" id="5mm-gX-15G"/>
|
||||||
</connections>
|
</connections>
|
||||||
@ -1512,11 +1518,11 @@ You could use the word wall for inspiration in finding a memorable master passw
|
|||||||
<objects>
|
<objects>
|
||||||
<viewController id="Q4b-t4-pwH" customClass="MPSetupViewController" sceneMemberID="viewController">
|
<viewController id="Q4b-t4-pwH" customClass="MPSetupViewController" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="FnB-rI-puV">
|
<view key="view" contentMode="scaleToFill" id="FnB-rI-puV">
|
||||||
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
|
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="RjU-5e-mti">
|
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="RjU-5e-mti">
|
||||||
<rect key="frame" x="0.0" y="-64" width="320" height="568"/>
|
<rect key="frame" x="0.0" y="-64" width="320" height="480"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="top" image="cloud.png" id="Ahr-aa-V1N">
|
<imageView userInteractionEnabled="NO" contentMode="top" image="cloud.png" id="Ahr-aa-V1N">
|
||||||
@ -1570,7 +1576,7 @@ If you set a custom password, it will be encrypted before it is saved to the clo
|
|||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="idA-Pj-1U9" customClass="MPElementListAllViewController" sceneMemberID="viewController">
|
<tableViewController id="idA-Pj-1U9" customClass="MPElementListAllViewController" sceneMemberID="viewController">
|
||||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="48" sectionHeaderHeight="22" sectionFooterHeight="22" id="N83-sj-4tl">
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="48" sectionHeaderHeight="22" sectionFooterHeight="22" id="N83-sj-4tl">
|
||||||
<rect key="frame" x="0.0" y="20" width="320" height="548"/>
|
<rect key="frame" x="0.0" y="20" width="320" height="460"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<navigationBar key="tableHeaderView" contentMode="scaleToFill" id="l0p-Tu-L9k">
|
<navigationBar key="tableHeaderView" contentMode="scaleToFill" id="l0p-Tu-L9k">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||||
@ -1608,33 +1614,40 @@ If you set a custom password, it will be encrypted before it is saved to the clo
|
|||||||
<scene sceneID="3cC-Qq-rgU">
|
<scene sceneID="3cC-Qq-rgU">
|
||||||
<objects>
|
<objects>
|
||||||
<viewController wantsFullScreenLayout="YES" id="2Th-Tb-22a" customClass="MPAppsViewController" sceneMemberID="viewController">
|
<viewController wantsFullScreenLayout="YES" id="2Th-Tb-22a" customClass="MPAppsViewController" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="DHZ-5g-6vT">
|
<view key="view" contentMode="scaleToFill" id="AhE-Ed-ajP">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="center" image="book.png" id="wjL-OU-K7k">
|
<view contentMode="scaleToFill" id="DHZ-5g-6vT">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
||||||
</imageView>
|
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="page-gorillas.png" id="QQT-37-azo">
|
|
||||||
<rect key="frame" x="0.0" y="81" width="305" height="400"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
|
||||||
</imageView>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="drq-47-KK9">
|
|
||||||
<rect key="frame" x="85" y="536" width="150" height="32"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
<subviews>
|
||||||
<state key="normal">
|
<imageView userInteractionEnabled="NO" contentMode="center" image="book.png" id="wjL-OU-K7k">
|
||||||
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
|
||||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
</state>
|
</imageView>
|
||||||
<state key="highlighted">
|
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="page-gorillas.png" id="QQT-37-azo">
|
||||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<rect key="frame" x="0.0" y="38" width="305" height="400"/>
|
||||||
</state>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||||
<connections>
|
</imageView>
|
||||||
<action selector="exit" destination="2Th-Tb-22a" eventType="touchUpInside" id="6Ra-GC-jSG"/>
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="drq-47-KK9">
|
||||||
</connections>
|
<rect key="frame" x="85" y="448" width="150" height="32"/>
|
||||||
</button>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||||
|
<state key="normal">
|
||||||
|
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" 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>
|
||||||
|
<connections>
|
||||||
|
<action selector="exit" destination="2Th-Tb-22a" eventType="touchUpInside" id="6Ra-GC-jSG"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<color key="backgroundColor" cocoaTouchSystemColor="viewFlipsideBackgroundColor"/>
|
||||||
|
</view>
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" cocoaTouchSystemColor="viewFlipsideBackgroundColor"/>
|
<color key="backgroundColor" cocoaTouchSystemColor="viewFlipsideBackgroundColor"/>
|
||||||
</view>
|
</view>
|
||||||
@ -1647,10 +1660,10 @@ If you set a custom password, it will be encrypted before it is saved to the clo
|
|||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="-85" y="-495"/>
|
<point key="canvasLocation" x="-85" y="-495"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Navigation Controller-->
|
<!--Pearl Navigation Controller-->
|
||||||
<scene sceneID="8r0-wA-Zre">
|
<scene sceneID="8r0-wA-Zre">
|
||||||
<objects>
|
<objects>
|
||||||
<navigationController id="KZF-fe-y9n" sceneMemberID="viewController">
|
<navigationController id="KZF-fe-y9n" customClass="PearlNavigationController" sceneMemberID="viewController">
|
||||||
<toolbarItems/>
|
<toolbarItems/>
|
||||||
<navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="sif-x3-Fol">
|
<navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="sif-x3-Fol">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||||
@ -1658,6 +1671,9 @@ If you set a custom password, it will be encrypted before it is saved to the clo
|
|||||||
<color key="tintColor" red="0.37254901960784315" green="0.39215686274509803" blue="0.42745098039215684" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="tintColor" red="0.37254901960784315" green="0.39215686274509803" blue="0.42745098039215684" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
</navigationBar>
|
</navigationBar>
|
||||||
<nil name="viewControllers"/>
|
<nil name="viewControllers"/>
|
||||||
|
<userDefinedRuntimeAttributes>
|
||||||
|
<userDefinedRuntimeAttribute type="boolean" keyPath="forwardInterfaceRotation" value="YES"/>
|
||||||
|
</userDefinedRuntimeAttributes>
|
||||||
<connections>
|
<connections>
|
||||||
<segue destination="uu3-4d-bYN" kind="modal" identifier="MP_Setup" id="qw3-O5-NEa"/>
|
<segue destination="uu3-4d-bYN" kind="modal" identifier="MP_Setup" id="qw3-O5-NEa"/>
|
||||||
<segue destination="Nbn-Rv-sP1" kind="relationship" relationship="rootViewController" id="Gzv-dM-6bM"/>
|
<segue destination="Nbn-Rv-sP1" kind="relationship" relationship="rootViewController" id="Gzv-dM-6bM"/>
|
||||||
@ -1673,7 +1689,7 @@ If you set a custom password, it will be encrypted before it is saved to the clo
|
|||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="oLN-6u-GLb" customClass="MPPreferencesViewController" sceneMemberID="viewController">
|
<tableViewController id="oLN-6u-GLb" customClass="MPPreferencesViewController" sceneMemberID="viewController">
|
||||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="oSh-Ap-kLt">
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="oSh-Ap-kLt">
|
||||||
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
|
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" red="0.12549020350000001" green="0.1411764771" blue="0.14901961389999999" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="backgroundColor" red="0.12549020350000001" green="0.1411764771" blue="0.14901961389999999" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<view key="tableFooterView" contentMode="scaleToFill" id="63M-7L-M7o">
|
<view key="tableFooterView" contentMode="scaleToFill" id="63M-7L-M7o">
|
||||||
@ -1797,7 +1813,7 @@ If you set a custom password, it will be encrypted before it is saved to the clo
|
|||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="ilG-0h-SOb">
|
<switch opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="ilG-0h-SOb">
|
||||||
<rect key="frame" x="221" y="8" width="79" height="27"/>
|
<rect key="frame" x="221" y="8" width="79" height="27"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
|
||||||
<color key="onTintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="onTintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="didToggleSwitch:" destination="oLN-6u-GLb" eventType="valueChanged" id="e5q-mf-XK7"/>
|
<action selector="didToggleSwitch:" destination="oLN-6u-GLb" eventType="valueChanged" id="e5q-mf-XK7"/>
|
||||||
@ -1838,7 +1854,7 @@ If you set a custom password, it will be encrypted before it is saved to the clo
|
|||||||
</label>
|
</label>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Long" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="vKJ-1b-NeO">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Long" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="vKJ-1b-NeO">
|
||||||
<rect key="frame" x="200" y="11" width="100" height="21"/>
|
<rect key="frame" x="200" y="11" width="100" height="21"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
@ -2060,11 +2076,11 @@ If you set a custom password, it will be encrypted before it is saved to the clo
|
|||||||
<objects>
|
<objects>
|
||||||
<viewController id="ZgN-2j-05b" customClass="MPSetupViewController" sceneMemberID="viewController">
|
<viewController id="ZgN-2j-05b" customClass="MPSetupViewController" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="QIH-dS-sqD">
|
<view key="view" contentMode="scaleToFill" id="QIH-dS-sqD">
|
||||||
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
|
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="FTf-06-1Pg">
|
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="FTf-06-1Pg">
|
||||||
<rect key="frame" x="0.0" y="-64" width="320" height="568"/>
|
<rect key="frame" x="0.0" y="-64" width="320" height="480"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Getting Started" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="FkR-cP-Y7K">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Getting Started" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="FkR-cP-Y7K">
|
||||||
@ -2075,7 +2091,7 @@ If you set a custom password, it will be encrypted before it is saved to the clo
|
|||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" usesAttributedText="YES" id="hwP-ds-GDh">
|
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" usesAttributedText="YES" id="hwP-ds-GDh">
|
||||||
<rect key="frame" x="20" y="137" width="280" height="367"/>
|
<rect key="frame" x="20" y="137" width="280" height="279"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
<attributedString key="attributedText">
|
<attributedString key="attributedText">
|
||||||
@ -2187,11 +2203,11 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
<objects>
|
<objects>
|
||||||
<viewController id="myN-X7-9Tg" customClass="MPGuideViewController" sceneMemberID="viewController">
|
<viewController id="myN-X7-9Tg" customClass="MPGuideViewController" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="vkG-Oi-PHo">
|
<view key="view" contentMode="scaleToFill" id="vkG-Oi-PHo">
|
||||||
<rect key="frame" x="0.0" y="20" width="320" height="548"/>
|
<rect key="frame" x="0.0" y="20" width="320" height="460"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" image="background.png" id="C2i-R4-36i">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" image="background.png" id="C2i-R4-36i">
|
||||||
<rect key="frame" x="0.0" y="44" width="320" height="504"/>
|
<rect key="frame" x="0.0" y="44" width="320" height="416"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<view clipsSubviews="YES" contentMode="scaleToFill" id="vSk-nT-Vwf" userLabel="View - Display">
|
<view clipsSubviews="YES" contentMode="scaleToFill" id="vSk-nT-Vwf" userLabel="View - Display">
|
||||||
@ -2331,7 +2347,7 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
</scopeButtonTitles>
|
</scopeButtonTitles>
|
||||||
</searchBar>
|
</searchBar>
|
||||||
<view alpha="0.60000000000000009" contentMode="scaleToFill" id="Ahl-o0-lMv">
|
<view alpha="0.60000000000000009" contentMode="scaleToFill" id="Ahl-o0-lMv">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="548"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="460"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="3wI-lo-tWc">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="3wI-lo-tWc">
|
||||||
@ -2351,7 +2367,7 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="UHf-cp-97W">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="UHf-cp-97W">
|
||||||
<rect key="frame" x="33" y="502" width="44" height="44"/>
|
<rect key="frame" x="33" y="414" width="44" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<accessibility key="accessibilityConfiguration" hint="" label="Close"/>
|
<accessibility key="accessibilityConfiguration" hint="" label="Close"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||||
@ -2367,7 +2383,7 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="jDS-Vh-ETL">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="jDS-Vh-ETL">
|
||||||
<rect key="frame" x="124" y="234" width="72" height="80"/>
|
<rect key="frame" x="124" y="190" width="72" height="80"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||||
<accessibility key="accessibilityConfiguration" hint="" label="Close"/>
|
<accessibility key="accessibilityConfiguration" hint="" label="Close"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||||
@ -2383,7 +2399,7 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="nXW-Eq-JOa">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="nXW-Eq-JOa">
|
||||||
<rect key="frame" x="243" y="502" width="44" height="44"/>
|
<rect key="frame" x="243" y="414" width="44" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<accessibility key="accessibilityConfiguration" hint="" label="Close"/>
|
<accessibility key="accessibilityConfiguration" hint="" label="Close"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||||
@ -2399,16 +2415,16 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<progressView opaque="NO" contentMode="scaleToFill" id="nf7-oM-7dh">
|
<progressView opaque="NO" contentMode="scaleToFill" id="nf7-oM-7dh">
|
||||||
<rect key="frame" x="85" y="519" width="150" height="9"/>
|
<rect key="frame" x="85" y="431" width="150" height="9"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<color key="progressTintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="progressTintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
</progressView>
|
</progressView>
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" cocoaTouchSystemColor="viewFlipsideBackgroundColor"/>
|
<color key="backgroundColor" cocoaTouchSystemColor="viewFlipsideBackgroundColor"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="nDU-uf-V0X" userLabel="View - Tool Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="nDU-uf-V0X" userLabel="View - Tool Tip">
|
||||||
<rect key="frame" x="10" y="59" width="266" height="60"/>
|
<rect key="frame" x="10" y="59" width="266" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black_bottom_right.png" id="Tmk-FU-w4D">
|
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black_bottom_right.png" id="Tmk-FU-w4D">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="266" height="60"/>
|
<rect key="frame" x="0.0" y="0.0" width="266" height="60"/>
|
||||||
@ -2425,7 +2441,7 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="cUZ-lb-h7x" userLabel="View - Search Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="cUZ-lb-h7x" userLabel="View - Site Name Tip">
|
||||||
<rect key="frame" x="10" y="55" width="300" height="60"/>
|
<rect key="frame" x="10" y="55" width="300" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -2444,7 +2460,7 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="X0C-Qf-SMn" userLabel="View - Content Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="X0C-Qf-SMn" userLabel="View - Content Tip">
|
||||||
<rect key="frame" x="55" y="110" width="210" height="60"/>
|
<rect key="frame" x="55" y="110" width="210" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -2462,7 +2478,7 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="w3j-Qm-9gD" userLabel="View - User Name Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="w3j-Qm-9gD" userLabel="View - User Name Tip">
|
||||||
<rect key="frame" x="55" y="166" width="210" height="60"/>
|
<rect key="frame" x="55" y="166" width="210" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -2480,7 +2496,7 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
</view>
|
</view>
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" id="Pub-jz-pkR" userLabel="View - Type Tip">
|
<view hidden="YES" userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" id="Pub-jz-pkR" userLabel="View - Type Tip">
|
||||||
<rect key="frame" x="10" y="272" width="300" height="60"/>
|
<rect key="frame" x="10" y="272" width="300" height="60"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@ -2539,11 +2555,11 @@ You can make passwords for anything, like email addresses, sites or real-world t
|
|||||||
<objects>
|
<objects>
|
||||||
<viewController id="kSj-yX-DmT" customClass="MPSetupViewController" sceneMemberID="viewController">
|
<viewController id="kSj-yX-DmT" customClass="MPSetupViewController" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="sT4-Jb-e5D">
|
<view key="view" contentMode="scaleToFill" id="sT4-Jb-e5D">
|
||||||
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
|
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="Eqt-R0-LTj">
|
<imageView userInteractionEnabled="NO" contentMode="center" image="background.png" id="Eqt-R0-LTj">
|
||||||
<rect key="frame" x="0.0" y="-64" width="320" height="568"/>
|
<rect key="frame" x="0.0" y="-64" width="320" height="480"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="top" image="unlocked.png" id="4ah-P0-2DG">
|
<imageView userInteractionEnabled="NO" contentMode="top" image="unlocked.png" id="4ah-P0-2DG">
|
||||||
@ -2764,7 +2780,6 @@ However, it means that anyone who finds your device unlocked can do the same.</s
|
|||||||
<source key="sourceIdentifier" type="project" relativePath="./Classes/MPSetupViewController.h"/>
|
<source key="sourceIdentifier" type="project" relativePath="./Classes/MPSetupViewController.h"/>
|
||||||
<relationships>
|
<relationships>
|
||||||
<relationship kind="action" name="close:" candidateClass="UIBarButtonItem"/>
|
<relationship kind="action" name="close:" candidateClass="UIBarButtonItem"/>
|
||||||
<relationship kind="action" name="showGuide:" candidateClass="UIBarButtonItem"/>
|
|
||||||
<relationship kind="outlet" name="cloudSwitch" candidateClass="UISwitch"/>
|
<relationship kind="outlet" name="cloudSwitch" candidateClass="UISwitch"/>
|
||||||
<relationship kind="outlet" name="rememberLoginSwitch" candidateClass="UISwitch"/>
|
<relationship kind="outlet" name="rememberLoginSwitch" candidateClass="UISwitch"/>
|
||||||
</relationships>
|
</relationships>
|
||||||
@ -2802,14 +2817,17 @@ However, it means that anyone who finds your device unlocked can do the same.</s
|
|||||||
<relationship kind="outlet" name="wordWall" candidateClass="UIView"/>
|
<relationship kind="outlet" name="wordWall" candidateClass="UIView"/>
|
||||||
</relationships>
|
</relationships>
|
||||||
</class>
|
</class>
|
||||||
|
<class className="PearlNavigationController" superclassName="UINavigationController">
|
||||||
|
<source key="sourceIdentifier" type="project" relativePath="./Classes/PearlNavigationController.h"/>
|
||||||
|
</class>
|
||||||
</classes>
|
</classes>
|
||||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||||
<nil key="statusBar"/>
|
<nil key="statusBar"/>
|
||||||
<simulatedOrientationMetrics key="orientation"/>
|
<simulatedOrientationMetrics key="orientation"/>
|
||||||
<simulatedScreenMetrics key="destination" type="retina4"/>
|
<simulatedScreenMetrics key="destination"/>
|
||||||
</simulatedMetricsContainer>
|
</simulatedMetricsContainer>
|
||||||
<inferredMetricsTieBreakers>
|
<inferredMetricsTieBreakers>
|
||||||
<segue reference="KIl-ZW-M7G"/>
|
<segue reference="swi-5o-hfK"/>
|
||||||
<segue reference="jgo-j3-gbW"/>
|
<segue reference="9Bs-cD-ddF"/>
|
||||||
</inferredMetricsTieBreakers>
|
</inferredMetricsTieBreakers>
|
||||||
</document>
|
</document>
|
@ -12,7 +12,9 @@
|
|||||||
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */; };
|
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */; };
|
||||||
93D3932889B6B4206E66A6D6 /* PearlEMail.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39F7C9F47BF6387FBC5C3 /* PearlEMail.h */; };
|
93D3932889B6B4206E66A6D6 /* PearlEMail.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39F7C9F47BF6387FBC5C3 /* PearlEMail.h */; };
|
||||||
93D395F08A087F8A24689347 /* NSArray+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */; };
|
93D395F08A087F8A24689347 /* NSArray+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */; };
|
||||||
|
93D396AA30690B256F30378A /* PearlNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3956915634581E737B38C /* PearlNavigationController.m */; };
|
||||||
93D396BA1C74C4A06FD86437 /* PearlOverlay.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D3942A356B639724157982 /* PearlOverlay.h */; };
|
93D396BA1C74C4A06FD86437 /* PearlOverlay.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D3942A356B639724157982 /* PearlOverlay.h */; };
|
||||||
|
93D3992FA1546E01F498F665 /* PearlNavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */; };
|
||||||
93D399433EA75E50656040CB /* Twitter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93D394077F8FAB8167647187 /* Twitter.framework */; };
|
93D399433EA75E50656040CB /* Twitter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93D394077F8FAB8167647187 /* Twitter.framework */; };
|
||||||
93D39C34FE35830EF5BE1D2A /* NSArray+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D396D04E57792A54D437AC /* NSArray+Indexing.h */; };
|
93D39C34FE35830EF5BE1D2A /* NSArray+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D396D04E57792A54D437AC /* NSArray+Indexing.h */; };
|
||||||
93D39E281E3658B30550CB55 /* NSDictionary+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39AA1EE2E1E7B81372240 /* NSDictionary+Indexing.m */; };
|
93D39E281E3658B30550CB55 /* NSDictionary+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39AA1EE2E1E7B81372240 /* NSDictionary+Indexing.m */; };
|
||||||
@ -1017,8 +1019,10 @@
|
|||||||
93D393BB973253D4BAAC84AA /* PearlEMail.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlEMail.m; sourceTree = "<group>"; };
|
93D393BB973253D4BAAC84AA /* PearlEMail.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlEMail.m; sourceTree = "<group>"; };
|
||||||
93D394077F8FAB8167647187 /* Twitter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Twitter.framework; path = System/Library/Frameworks/Twitter.framework; sourceTree = SDKROOT; };
|
93D394077F8FAB8167647187 /* Twitter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Twitter.framework; path = System/Library/Frameworks/Twitter.framework; sourceTree = SDKROOT; };
|
||||||
93D3942A356B639724157982 /* PearlOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlOverlay.h; sourceTree = "<group>"; };
|
93D3942A356B639724157982 /* PearlOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlOverlay.h; sourceTree = "<group>"; };
|
||||||
|
93D3956915634581E737B38C /* PearlNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlNavigationController.m; sourceTree = "<group>"; };
|
||||||
93D396D04E57792A54D437AC /* NSArray+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Indexing.h"; sourceTree = "<group>"; };
|
93D396D04E57792A54D437AC /* NSArray+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Indexing.h"; sourceTree = "<group>"; };
|
||||||
93D39730673227EFF6DEFF19 /* MPSetupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSetupViewController.h; sourceTree = "<group>"; };
|
93D39730673227EFF6DEFF19 /* MPSetupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSetupViewController.h; sourceTree = "<group>"; };
|
||||||
|
93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlNavigationController.h; sourceTree = "<group>"; };
|
||||||
93D39A28369954D147E239BA /* MPSetupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSetupViewController.m; sourceTree = "<group>"; };
|
93D39A28369954D147E239BA /* MPSetupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSetupViewController.m; sourceTree = "<group>"; };
|
||||||
93D39AA1EE2E1E7B81372240 /* NSDictionary+Indexing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+Indexing.m"; sourceTree = "<group>"; };
|
93D39AA1EE2E1E7B81372240 /* NSDictionary+Indexing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+Indexing.m"; sourceTree = "<group>"; };
|
||||||
93D39F7C9F47BF6387FBC5C3 /* PearlEMail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlEMail.h; sourceTree = "<group>"; };
|
93D39F7C9F47BF6387FBC5C3 /* PearlEMail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlEMail.h; sourceTree = "<group>"; };
|
||||||
@ -3506,6 +3510,8 @@
|
|||||||
DAFE4A1215039824003ABA7C /* UIImage+PearlScaling.m */,
|
DAFE4A1215039824003ABA7C /* UIImage+PearlScaling.m */,
|
||||||
93D390FADEB325D8D54A957D /* PearlOverlay.m */,
|
93D390FADEB325D8D54A957D /* PearlOverlay.m */,
|
||||||
93D3942A356B639724157982 /* PearlOverlay.h */,
|
93D3942A356B639724157982 /* PearlOverlay.h */,
|
||||||
|
93D3956915634581E737B38C /* PearlNavigationController.m */,
|
||||||
|
93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */,
|
||||||
);
|
);
|
||||||
path = "Pearl-UIKit";
|
path = "Pearl-UIKit";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -3630,6 +3636,7 @@
|
|||||||
93D3932889B6B4206E66A6D6 /* PearlEMail.h in Headers */,
|
93D3932889B6B4206E66A6D6 /* PearlEMail.h in Headers */,
|
||||||
DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */,
|
DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */,
|
||||||
93D396BA1C74C4A06FD86437 /* PearlOverlay.h in Headers */,
|
93D396BA1C74C4A06FD86437 /* PearlOverlay.h in Headers */,
|
||||||
|
93D3992FA1546E01F498F665 /* PearlNavigationController.h in Headers */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -4842,6 +4849,7 @@
|
|||||||
93D39262A8A97DB748213309 /* PearlEMail.m in Sources */,
|
93D39262A8A97DB748213309 /* PearlEMail.m in Sources */,
|
||||||
DA3509FF15F101A500C14A8E /* PearlQueue.m in Sources */,
|
DA3509FF15F101A500C14A8E /* PearlQueue.m in Sources */,
|
||||||
93D3922A53E41A54832E90D9 /* PearlOverlay.m in Sources */,
|
93D3922A53E41A54832E90D9 /* PearlOverlay.m in Sources */,
|
||||||
|
93D396AA30690B256F30378A /* PearlNavigationController.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user