Improved overlay navigation, store refactoring and automatic sizing of store cells.
This commit is contained in:
parent
fe5828c724
commit
466863f8fd
@ -1,12 +1,12 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPAlgorithm
|
||||
@ -24,7 +24,7 @@ id<MPAlgorithm> MPAlgorithmForVersion(NSUInteger version) {
|
||||
versionToAlgorithm = [NSMutableDictionary dictionary];
|
||||
|
||||
id<MPAlgorithm> algorithm = versionToAlgorithm[@(version)];
|
||||
if (!algorithm) if ((algorithm = [NSClassFromString( strf( @"MPAlgorithmV%lu", (unsigned long)version ) ) new]))
|
||||
if (!algorithm && (algorithm = (id<MPAlgorithm>)[NSClassFromString( strf( @"MPAlgorithmV%lu", (unsigned long)version ) ) new]))
|
||||
versionToAlgorithm[@(version)] = algorithm;
|
||||
|
||||
return algorithm;
|
||||
|
@ -6,15 +6,21 @@
|
||||
// Copyright (c) 2011 Lyndir. All rights reserved.
|
||||
//
|
||||
|
||||
#import <StoreKit/StoreKit.h>
|
||||
#import "MPAppDelegate_Shared.h"
|
||||
|
||||
@interface MPAppDelegate_Shared(InApp)<SKProductsRequestDelegate, SKPaymentTransactionObserver>
|
||||
#define MPProductGenerateLogins @"com.lyndir.masterpassword.products.generatelogins"
|
||||
#define MPProductGenerateAnswers @"com.lyndir.masterpassword.products.generateanswers"
|
||||
|
||||
@interface MPAppDelegate_Shared(InApp)
|
||||
|
||||
@property(nonatomic, strong) NSArray /* SKProduct */ *products;
|
||||
@property(nonatomic, strong) NSArray /* SKPaymentTransaction */ *paymentTransactions;
|
||||
|
||||
- (void)updateProducts;
|
||||
- (BOOL)canMakePayments;
|
||||
- (BOOL)isPurchased:(NSString *)productIdentifier;
|
||||
|
||||
- (void)restoreCompletedTransactions;
|
||||
- (void)purchaseProductWithIdentifier:(NSString *)productIdentifier;
|
||||
|
||||
@end
|
||||
|
@ -7,6 +7,10 @@
|
||||
//
|
||||
|
||||
#import "MPAppDelegate_InApp.h"
|
||||
#import <StoreKit/StoreKit.h>
|
||||
|
||||
@interface MPAppDelegate_Shared(InApp_Private)<SKProductsRequestDelegate, SKPaymentTransactionObserver>
|
||||
@end
|
||||
|
||||
@implementation MPAppDelegate_Shared(InApp)
|
||||
|
||||
@ -15,22 +19,46 @@ PearlAssociatedObjectProperty( NSArray*, PaymentTransactions, paymentTransaction
|
||||
|
||||
- (void)updateProducts {
|
||||
|
||||
static dispatch_once_t once = 0;
|
||||
dispatch_once( &once, ^{
|
||||
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
|
||||
} );
|
||||
|
||||
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:
|
||||
[[NSSet alloc] initWithObjects:MPProductGenerateLogins, MPProductGenerateAnswers, nil]];
|
||||
productsRequest.delegate = self;
|
||||
[productsRequest start];
|
||||
}
|
||||
|
||||
- (SKPaymentQueue *)paymentQueue {
|
||||
|
||||
static dispatch_once_t once = 0;
|
||||
dispatch_once( &once, ^{
|
||||
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
|
||||
} );
|
||||
|
||||
return [SKPaymentQueue defaultQueue];
|
||||
}
|
||||
|
||||
- (BOOL)canMakePayments {
|
||||
|
||||
return [SKPaymentQueue canMakePayments];
|
||||
}
|
||||
|
||||
- (BOOL)isPurchased:(NSString *)productIdentifier {
|
||||
|
||||
return YES; //[[NSUserDefaults standardUserDefaults] objectForKey:productIdentifier] != nil;
|
||||
}
|
||||
|
||||
- (void)restoreCompletedTransactions {
|
||||
|
||||
[[self paymentQueue] restoreCompletedTransactions];
|
||||
}
|
||||
|
||||
- (void)purchaseProductWithIdentifier:(NSString *)productIdentifier {
|
||||
|
||||
for (SKProduct *product in self.products)
|
||||
if ([product.productIdentifier isEqualToString:productIdentifier]) {
|
||||
[[self paymentQueue] addPayment:[SKPayment paymentWithProduct:product]];
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - SKProductsRequestDelegate
|
||||
|
||||
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
|
||||
|
@ -6,6 +6,7 @@
|
||||
// Copyright (c) 2011 Lyndir. All rights reserved.
|
||||
//
|
||||
|
||||
#import <StoreKit/StoreKit.h>
|
||||
#import "MPAppDelegate_Shared.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "MPAppDelegate_Key.h"
|
||||
|
@ -87,9 +87,6 @@ typedef NS_ENUM(NSUInteger, MPSiteType) {
|
||||
#define MPSitesImportedNotificationUserKey @"MPSitesImportedNotificationUserKey"
|
||||
#define MPInconsistenciesFixResultUserKey @"MPInconsistenciesFixResultUserKey"
|
||||
|
||||
#define MPProductGenerateLogins @"com.lyndir.masterpassword.products.generatelogins"
|
||||
#define MPProductGenerateAnswers @"com.lyndir.masterpassword.products.generateanswers"
|
||||
|
||||
static void MPCheckpoint(NSString *checkpoint, NSDictionary *attributes) {
|
||||
|
||||
inf(@"%@: %@", checkpoint, attributes);
|
||||
|
@ -32,10 +32,14 @@
|
||||
|
||||
self.tableView.tableHeaderView = [UIView new];
|
||||
self.tableView.tableFooterView = [UIView new];
|
||||
self.tableView.layer.shadowOpacity = 1;
|
||||
self.view.backgroundColor = [UIColor clearColor];
|
||||
}
|
||||
|
||||
- (UIStatusBarStyle)preferredStatusBarStyle {
|
||||
|
||||
return UIStatusBarStyleLightContent;
|
||||
}
|
||||
|
||||
#pragma mark - State
|
||||
|
||||
- (void)setSite:(MPSiteEntity *)site {
|
||||
@ -203,6 +207,7 @@
|
||||
|
||||
- (void)setSite:(MPSiteEntity *)site {
|
||||
|
||||
self.titleLabel.text = strl( @"Answer for %@:", site.name );
|
||||
self.answerField.text = @"...";
|
||||
[site.algorithm resolveAnswerForSite:site usingKey:[MPiOSAppDelegate get].key result:^(NSString *result) {
|
||||
PearlMainQueue( ^{
|
||||
|
@ -19,23 +19,6 @@
|
||||
#import "MPAppSettingsViewController.h"
|
||||
#import "UIColor+Expanded.h"
|
||||
|
||||
@interface MPTableView:UITableView
|
||||
@end
|
||||
|
||||
@implementation MPTableView
|
||||
|
||||
- (void)layoutSubviews {
|
||||
|
||||
[super layoutSubviews];
|
||||
}
|
||||
|
||||
- (void)setContentInset:(UIEdgeInsets)contentInset {
|
||||
|
||||
[super setContentInset:contentInset];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPAppSettingsViewController {
|
||||
}
|
||||
|
||||
|
@ -53,6 +53,11 @@
|
||||
[self reset];
|
||||
}
|
||||
|
||||
- (UIStatusBarStyle)preferredStatusBarStyle {
|
||||
|
||||
return UIStatusBarStyleLightContent;
|
||||
}
|
||||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||
|
@ -1,12 +1,12 @@
|
||||
/**
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||
*
|
||||
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*/
|
||||
|
||||
//
|
||||
// MPOverlayViewController.h
|
||||
@ -18,8 +18,16 @@
|
||||
|
||||
#import "MPOverlayViewController.h"
|
||||
|
||||
@implementation MPOverlayViewController {
|
||||
NSMutableDictionary *_dismissSegueByButton;
|
||||
}
|
||||
|
||||
@implementation MPOverlayViewController
|
||||
- (void)awakeFromNib {
|
||||
|
||||
[super awakeFromNib];
|
||||
|
||||
_dismissSegueByButton = [NSMutableDictionary dictionary];
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
|
||||
@ -29,12 +37,62 @@
|
||||
[self performSegueWithIdentifier:@"root" sender:self];
|
||||
}
|
||||
|
||||
- (UIViewController *)childViewControllerForStatusBarStyle {
|
||||
|
||||
return [self.childViewControllers lastObject];
|
||||
}
|
||||
|
||||
- (UIViewController *)childViewControllerForStatusBarHidden {
|
||||
|
||||
return self.childViewControllerForStatusBarStyle;
|
||||
}
|
||||
|
||||
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController
|
||||
fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
|
||||
|
||||
return [[MPOverlaySegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController];
|
||||
}
|
||||
|
||||
- (void)addDismissButtonForSegue:(MPOverlaySegue *)segue {
|
||||
|
||||
UIButton *dismissButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||||
[dismissButton addTarget:self action:@selector( dismissOverlay: ) forControlEvents:UIControlEventTouchUpInside];
|
||||
dismissButton.backgroundColor = [UIColor colorWithWhite:0 alpha:0.3f];
|
||||
dismissButton.frame = self.view.bounds;
|
||||
dismissButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
_dismissSegueByButton[[NSValue valueWithNonretainedObject:dismissButton]] =
|
||||
[[MPOverlaySegue alloc] initWithIdentifier:@"dismiss-overlay"
|
||||
source:segue.destinationViewController destination:segue.sourceViewController];
|
||||
[self.view addSubview:dismissButton];
|
||||
}
|
||||
|
||||
- (void)dismissOverlay:(UIButton *)dismissButton {
|
||||
|
||||
NSValue *dismissSegueKey = [NSValue valueWithNonretainedObject:dismissButton];
|
||||
[((UIStoryboardSegue *)_dismissSegueByButton[dismissSegueKey]) perform];
|
||||
}
|
||||
|
||||
- (void)removeDismissButtonForViewController:(UIViewController *)viewController {
|
||||
|
||||
UIButton *dismissButton = nil;
|
||||
for (NSValue *dismissButtonValue in [_dismissSegueByButton allKeys])
|
||||
if (((UIStoryboardSegue *)_dismissSegueByButton[dismissButtonValue]).sourceViewController == viewController) {
|
||||
dismissButton = [dismissButtonValue nonretainedObjectValue];
|
||||
NSAssert([self.view.subviews containsObject:dismissButton], @"Missing dismiss button in dictionary.");
|
||||
}
|
||||
if (!dismissButton)
|
||||
return;
|
||||
|
||||
NSValue *dismissSegueKey = [NSValue valueWithNonretainedObject:dismissButton];
|
||||
[_dismissSegueByButton removeObjectForKey:dismissSegueKey];
|
||||
|
||||
[UIView animateWithDuration:0.1f animations:^{
|
||||
dismissButton.alpha = 0;
|
||||
} completion:^(BOOL finished) {
|
||||
[dismissButton removeFromSuperview];
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPOverlaySegue
|
||||
@ -44,7 +102,7 @@
|
||||
UIViewController *sourceViewController = self.sourceViewController;
|
||||
UIViewController *destinationViewController = self.destinationViewController;
|
||||
MPOverlayViewController *containerViewController = self.sourceViewController;
|
||||
while (![containerViewController isKindOfClass:[MPOverlayViewController class]])
|
||||
while (containerViewController && ![(id)containerViewController isKindOfClass:[MPOverlayViewController class]])
|
||||
containerViewController = (id)containerViewController.parentViewController;
|
||||
NSAssert( [containerViewController isKindOfClass:[MPOverlayViewController class]],
|
||||
@"Not an overlay container: %@", containerViewController );
|
||||
@ -52,11 +110,23 @@
|
||||
if (!destinationViewController.parentViewController) {
|
||||
// Winding
|
||||
[containerViewController addChildViewController:destinationViewController];
|
||||
[containerViewController setNeedsStatusBarAppearanceUpdate];
|
||||
|
||||
[containerViewController addDismissButtonForSegue:self];
|
||||
destinationViewController.view.frame = containerViewController.view.bounds;
|
||||
destinationViewController.view.translatesAutoresizingMaskIntoConstraints = YES;
|
||||
destinationViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
[containerViewController.view addSubview:destinationViewController.view];
|
||||
CGRectSetY( destinationViewController.view.frame, containerViewController.view.frame.size.height );
|
||||
[UIView transitionWithView:containerViewController.view duration:0.3f
|
||||
|
||||
CGRectSetY( destinationViewController.view.frame, 100 );
|
||||
destinationViewController.view.transform = CGAffineTransformMakeScale( 1.2f, 1.2f );
|
||||
destinationViewController.view.alpha = 0;
|
||||
|
||||
[UIView transitionWithView:containerViewController.view duration:[self.identifier isEqualToString:@"root"]? 0: 0.3f
|
||||
options:UIViewAnimationOptionAllowAnimatedContent animations:^{
|
||||
destinationViewController.view.transform = CGAffineTransformIdentity;
|
||||
CGRectSetY( destinationViewController.view.frame, 0 );
|
||||
destinationViewController.view.alpha = 1;
|
||||
} completion:^(BOOL finished) {
|
||||
if (finished)
|
||||
[destinationViewController didMoveToParentViewController:containerViewController];
|
||||
@ -65,13 +135,17 @@
|
||||
else {
|
||||
// Unwinding
|
||||
[sourceViewController willMoveToParentViewController:nil];
|
||||
[UIView transitionWithView:containerViewController.view duration:0.3f
|
||||
[UIView transitionWithView:containerViewController.view duration:0.2f
|
||||
options:UIViewAnimationOptionAllowAnimatedContent animations:^{
|
||||
CGRectSetY( sourceViewController.view.bounds, containerViewController.view.frame.size.height );
|
||||
CGRectSetY( sourceViewController.view.frame, 100 );
|
||||
sourceViewController.view.transform = CGAffineTransformMakeScale( 0.8f, 0.8f );
|
||||
sourceViewController.view.alpha = 0;
|
||||
[containerViewController removeDismissButtonForViewController:sourceViewController];
|
||||
} completion:^(BOOL finished) {
|
||||
if (finished) {
|
||||
[sourceViewController.view removeFromSuperview];
|
||||
[sourceViewController removeFromParentViewController];
|
||||
[containerViewController setNeedsStatusBarAppearanceUpdate];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
@ -62,11 +62,10 @@
|
||||
|
||||
[self setupLayer];
|
||||
|
||||
[self observeKeyPath:@"bounds" withBlock:^(id from, id to, NSKeyValueChange cause, id _self) {
|
||||
[self observeKeyPath:@"bounds" withBlock:^(id from, id to, NSKeyValueChange cause, MPPasswordCell *_self) {
|
||||
if (from && !CGSizeEqualToSize( [from CGRectValue].size, [to CGRectValue].size ))
|
||||
[_self setupLayer];
|
||||
}];
|
||||
|
||||
[self.contentButton observeKeyPath:@"highlighted"
|
||||
withBlock:^(id from, id to, NSKeyValueChange cause, UIButton *button) {
|
||||
[UIView animateWithDuration:.2f delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
|
||||
@ -141,6 +140,7 @@
|
||||
|
||||
- (void)dealloc {
|
||||
|
||||
[self removeKeyPathObservers];
|
||||
[self.contentButton removeKeyPathObservers];
|
||||
[self.loginNameButton removeKeyPathObservers];
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "MPTypeViewController.h"
|
||||
|
||||
@class MPStoreProductCell;
|
||||
|
||||
@interface MPStoreViewController : PearlMutableStaticTableViewController
|
||||
|
@ -6,15 +6,11 @@
|
||||
// Copyright (c) 2012 Lyndir. All rights reserved.
|
||||
//
|
||||
|
||||
#import <StoreKit/StoreKit.h>
|
||||
#import "MPStoreViewController.h"
|
||||
#import "MPiOSAppDelegate.h"
|
||||
#import "MPAppDelegate_Key.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "UIColor+Expanded.h"
|
||||
#import "MPPasswordsViewController.h"
|
||||
#import "MPCoachmarkViewController.h"
|
||||
#import "MPAppDelegate_InApp.h"
|
||||
#import <StoreKit/StoreKit.h>
|
||||
|
||||
@interface MPStoreViewController()
|
||||
|
||||
@ -31,6 +27,9 @@
|
||||
self.currencyFormatter = [NSNumberFormatter new];
|
||||
self.currencyFormatter.numberStyle = NSNumberFormatterCurrencyStyle;
|
||||
|
||||
self.tableView.tableHeaderView = [UIView new];
|
||||
self.tableView.tableFooterView = [UIView new];
|
||||
self.tableView.estimatedRowHeight = 400;
|
||||
self.view.backgroundColor = [UIColor clearColor];
|
||||
}
|
||||
|
||||
@ -73,6 +72,13 @@
|
||||
- (MPStoreProductCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
MPStoreProductCell *cell = (MPStoreProductCell *)[super tableView:tableView cellForRowAtIndexPath:indexPath];
|
||||
if (cell.contentView.translatesAutoresizingMaskIntoConstraints) {
|
||||
cell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
[cell addConstraint:
|
||||
[NSLayoutConstraint constraintWithItem:cell attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual
|
||||
toItem:cell.contentView attribute:NSLayoutAttributeWidth multiplier:1 constant:0]];
|
||||
}
|
||||
|
||||
if (indexPath.section == 0)
|
||||
cell.selectionStyle = [[MPiOSAppDelegate get] isPurchased:[self productForCell:cell].productIdentifier]?
|
||||
UITableViewCellSelectionStyleDefault: UITableViewCellSelectionStyleNone;
|
||||
@ -85,9 +91,17 @@
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
|
||||
[cell layoutIfNeeded];
|
||||
|
||||
return cell.contentView.bounds.size.height;
|
||||
}
|
||||
|
||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
|
||||
if (![SKPaymentQueue canMakePayments]) {
|
||||
if (![[MPAppDelegate_Shared get] canMakePayments]) {
|
||||
[PearlAlert showAlertWithTitle:@"Store Not Set Up" message:
|
||||
@"Try logging using the App Store or from Settings."
|
||||
viewStyle:UIAlertViewStyleDefault initAlert:nil
|
||||
@ -99,7 +113,7 @@
|
||||
SKProduct *product = [self productForCell:cell];
|
||||
|
||||
if (product)
|
||||
[[SKPaymentQueue defaultQueue] addPayment:[SKPayment paymentWithProduct:product]];
|
||||
[[MPAppDelegate_Shared get] purchaseProductWithIdentifier:product.productIdentifier];
|
||||
|
||||
[tableView deselectRowAtIndexPath:indexPath animated:YES];
|
||||
}
|
||||
@ -115,7 +129,7 @@
|
||||
if (buttonIndex == [alert cancelButtonIndex])
|
||||
return;
|
||||
|
||||
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
|
||||
[[MPAppDelegate_Shared get] restoreCompletedTransactions];
|
||||
} cancelTitle:@"Cancel" otherTitles:@"Find Purchases", nil];
|
||||
}
|
||||
|
||||
|
@ -74,6 +74,8 @@ typedef NS_ENUM( NSUInteger, MPActiveUserState ) {
|
||||
self.view.backgroundColor = [UIColor clearColor];
|
||||
self.avatarCollectionView.allowsMultipleSelection = YES;
|
||||
[self.entryField addTarget:self action:@selector( textFieldEditingChanged: ) forControlEvents:UIControlEventEditingChanged];
|
||||
|
||||
[self setActive:YES animated:NO];
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
@ -81,7 +83,6 @@ typedef NS_ENUM( NSUInteger, MPActiveUserState ) {
|
||||
[super viewWillAppear:animated];
|
||||
|
||||
self.userSelectionContainer.alpha = 0;
|
||||
[self setActive:YES animated:NO];
|
||||
}
|
||||
|
||||
- (void)viewWillDisappear:(BOOL)animated {
|
||||
|
@ -7,8 +7,6 @@
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <MessageUI/MessageUI.h>
|
||||
#import <StoreKit/StoreKit.h>
|
||||
|
||||
#import "MPAppDelegate_Shared.h"
|
||||
|
||||
|
@ -6,13 +6,10 @@
|
||||
// Copyright (c) 2011 Lyndir. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Crashlytics/Crashlytics.h>
|
||||
#import <MobileCoreServices/MobileCoreServices.h>
|
||||
#import "MPiOSAppDelegate.h"
|
||||
#import "MPAppDelegate_Key.h"
|
||||
#import "MPAppDelegate_Store.h"
|
||||
#import "IASKSettingsReader.h"
|
||||
#import "MPAppDelegate_InApp.h"
|
||||
|
||||
@interface MPiOSAppDelegate()<UIDocumentInteractionControllerDelegate>
|
||||
|
||||
|
@ -123,6 +123,9 @@
|
||||
DA32D01B19D046E1004F3F0E /* PearlFixedTableView.h in Headers */ = {isa = PBXBuildFile; fileRef = DA32D01919D046E1004F3F0E /* PearlFixedTableView.h */; };
|
||||
DA32D03C19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m in Sources */ = {isa = PBXBuildFile; fileRef = DA32D03A19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m */; };
|
||||
DA32D03E19D11293004F3F0E /* libKCOrderedAccessorFix.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA32D02019D111C6004F3F0E /* libKCOrderedAccessorFix.a */; };
|
||||
DA32D04219D27093004F3F0E /* thumb_generated_answers@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA32D03F19D27093004F3F0E /* thumb_generated_answers@3x.png */; };
|
||||
DA32D04319D27093004F3F0E /* thumb_generated_answers@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA32D04019D27093004F3F0E /* thumb_generated_answers@2x.png */; };
|
||||
DA32D04419D27093004F3F0E /* thumb_generated_answers.png in Resources */ = {isa = PBXBuildFile; fileRef = DA32D04119D27093004F3F0E /* thumb_generated_answers.png */; };
|
||||
DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3509FC15F101A500C14A8E /* PearlQueue.h */; };
|
||||
DA3509FF15F101A500C14A8E /* PearlQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3509FD15F101A500C14A8E /* PearlQueue.m */; };
|
||||
DA38D6A318CCB5BF009AEB3E /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */; };
|
||||
@ -543,6 +546,9 @@
|
||||
DA32D02019D111C6004F3F0E /* libKCOrderedAccessorFix.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libKCOrderedAccessorFix.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
DA32D03919D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObjectModel+KCOrderedAccessorFix.h"; sourceTree = "<group>"; };
|
||||
DA32D03A19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObjectModel+KCOrderedAccessorFix.m"; sourceTree = "<group>"; };
|
||||
DA32D03F19D27093004F3F0E /* thumb_generated_answers@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "thumb_generated_answers@3x.png"; sourceTree = "<group>"; };
|
||||
DA32D04019D27093004F3F0E /* thumb_generated_answers@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "thumb_generated_answers@2x.png"; sourceTree = "<group>"; };
|
||||
DA32D04119D27093004F3F0E /* thumb_generated_answers.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = thumb_generated_answers.png; sourceTree = "<group>"; };
|
||||
DA3509FC15F101A500C14A8E /* PearlQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlQueue.h; sourceTree = "<group>"; };
|
||||
DA3509FD15F101A500C14A8E /* PearlQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlQueue.m; sourceTree = "<group>"; };
|
||||
DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = "<group>"; };
|
||||
@ -1597,6 +1603,9 @@
|
||||
DABD360D1711E29400CF925C /* Media */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DA32D03F19D27093004F3F0E /* thumb_generated_answers@3x.png */,
|
||||
DA32D04019D27093004F3F0E /* thumb_generated_answers@2x.png */,
|
||||
DA32D04119D27093004F3F0E /* thumb_generated_answers.png */,
|
||||
DA29993119C9132F00AF7DF1 /* thumb_generated_login@3x.png */,
|
||||
DA29992D19C86F5700AF7DF1 /* thumb_generated_login@2x.png */,
|
||||
DA29992E19C86F5700AF7DF1 /* thumb_generated_login.png */,
|
||||
@ -3116,9 +3125,11 @@
|
||||
DABD394A1711E29700CF925C /* avatar-18.png in Resources */,
|
||||
DABD394B1711E29700CF925C /* avatar-18@2x.png in Resources */,
|
||||
DABD394C1711E29700CF925C /* avatar-1@2x.png in Resources */,
|
||||
DA32D04319D27093004F3F0E /* thumb_generated_answers@2x.png in Resources */,
|
||||
DA29993319C9214600AF7DF1 /* icon_star-hollow.png in Resources */,
|
||||
DA29993019C86F5700AF7DF1 /* thumb_generated_login.png in Resources */,
|
||||
DA071BF3190187FE00179766 /* empty@2x.png in Resources */,
|
||||
DA32D04219D27093004F3F0E /* thumb_generated_answers@3x.png in Resources */,
|
||||
DA67460E18DE7F0C00DFE240 /* Exo2.0-Regular.otf in Resources */,
|
||||
DABD394D1711E29700CF925C /* avatar-2.png in Resources */,
|
||||
DABD394E1711E29700CF925C /* avatar-2@2x.png in Resources */,
|
||||
@ -3181,6 +3192,7 @@
|
||||
DABD3ABF1711E29800CF925C /* icon_plus@2x.png in Resources */,
|
||||
DA69540717D975D900BF294E /* icon_gears@2x.png in Resources */,
|
||||
DABD3B1C1711E29800CF925C /* icon_up.png in Resources */,
|
||||
DA32D04419D27093004F3F0E /* thumb_generated_answers.png in Resources */,
|
||||
DABD3B1D1711E29800CF925C /* icon_up@2x.png in Resources */,
|
||||
DA3BCFCB19BD09D5006B2681 /* SourceCodePro-Regular.otf in Resources */,
|
||||
DA250A121956484D00AC23F1 /* image-0.png in Resources */,
|
||||
|
@ -5,6 +5,7 @@
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
|
||||
<capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
|
||||
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
|
||||
<capability name="Unknown constraint types" minToolsVersion="5.1"/>
|
||||
</dependencies>
|
||||
<customFonts key="customFonts">
|
||||
<mutableArray key="Exo2.0-Bold.otf">
|
||||
@ -612,7 +613,7 @@
|
||||
<scene sceneID="w0h-au-0xw">
|
||||
<objects>
|
||||
<tableViewController automaticallyAdjustsScrollViewInsets="NO" id="JFc-sj-awD" customClass="MPPreferencesViewController" sceneMemberID="viewController">
|
||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="i7C-FZ-DNs" customClass="MPTableView">
|
||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="i7C-FZ-DNs">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" red="0.12549020350000001" green="0.1411764771" blue="0.14901961389999999" alpha="1" colorSpace="calibratedRGB"/>
|
||||
@ -1166,7 +1167,7 @@
|
||||
<rect key="frame" x="0.0" y="20" width="300" height="43"/>
|
||||
<subviews>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="CuzaSasy3*Rimo" textAlignment="center" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="blw-Ou-8I8" userLabel="Password">
|
||||
<rect key="frame" x="0.0" y="0.0" width="300" height="31"/>
|
||||
<rect key="frame" x="8" y="0.0" width="284" height="31"/>
|
||||
<color key="textColor" red="0.40000000600000002" green="0.80000001190000003" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<fontDescription key="fontDescription" name="SourceCodePro-Black" family="Source Code Pro" pointSize="24"/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="alphabet" keyboardAppearance="alert" returnKeyType="next"/>
|
||||
@ -1189,9 +1190,9 @@
|
||||
<constraint firstAttribute="trailing" secondItem="wfM-xz-roR" secondAttribute="trailing" id="O0o-KW-Od0"/>
|
||||
<constraint firstItem="blw-Ou-8I8" firstAttribute="top" secondItem="2tX-WK-ASq" secondAttribute="top" id="Sea-3Y-JdY"/>
|
||||
<constraint firstAttribute="bottom" secondItem="blw-Ou-8I8" secondAttribute="bottom" priority="250" id="bdr-Yi-Dro"/>
|
||||
<constraint firstAttribute="trailing" secondItem="blw-Ou-8I8" secondAttribute="trailing" id="lJn-c1-Cay"/>
|
||||
<constraint firstAttribute="trailing" secondItem="blw-Ou-8I8" secondAttribute="trailing" constant="8" id="lJn-c1-Cay"/>
|
||||
<constraint firstAttribute="bottom" secondItem="wfM-xz-roR" secondAttribute="bottom" id="w1O-DM-5gJ"/>
|
||||
<constraint firstItem="blw-Ou-8I8" firstAttribute="leading" secondItem="2tX-WK-ASq" secondAttribute="leading" id="x6P-h1-nhk"/>
|
||||
<constraint firstItem="blw-Ou-8I8" firstAttribute="leading" secondItem="2tX-WK-ASq" secondAttribute="leading" constant="8" id="x6P-h1-nhk"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="ignoreTouches" value="YES"/>
|
||||
@ -1638,28 +1639,15 @@
|
||||
<viewControllerLayoutGuide type="top" id="cmU-lf-Fxd"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="IV3-lc-Fnf"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="7jl-cw-kaJ" userLabel="Root">
|
||||
<view key="view" contentMode="scaleToFill" id="GiS-3g-cDj" userLabel="Root">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GiS-3g-cDj" userLabel="Emergency Generator Root">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="i0q-rq-0T2" userLabel="Dismiss Button">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="calibratedRGB"/>
|
||||
<state key="normal">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<segue destination="p6o-h3-NRH" kind="unwind" identifier="unwind-popover" unwindAction="unwindToCombined:" id="E2V-ll-ZD7"/>
|
||||
</connections>
|
||||
</button>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1lc-e7-Qme" userLabel="Emergency Generator">
|
||||
<rect key="frame" x="8" y="28" width="359" height="387"/>
|
||||
<rect key="frame" x="20" y="28" width="335" height="387"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Emergency Generator" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="4Lh-s0-Dbt">
|
||||
<rect key="frame" x="20" y="20" width="319" height="21.5"/>
|
||||
<rect key="frame" x="20" y="20" width="295" height="21.5"/>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Bold" family="Exo 2.0" pointSize="17"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
@ -1667,7 +1655,7 @@
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Generate your password without logging in. Great for if you're borrowing a friend's device or are having trouble logging in." lineBreakMode="tailTruncation" numberOfLines="0" minimumFontSize="10" preferredMaxLayoutWidth="264" translatesAutoresizingMaskIntoConstraints="NO" id="vHS-3A-Tae">
|
||||
<rect key="frame" x="20" y="49.5" width="319" height="51.5"/>
|
||||
<rect key="frame" x="20" y="49.5" width="295" height="51.5"/>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Thin" family="Exo 2.0" pointSize="14"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
@ -1675,7 +1663,7 @@
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Your Name" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="XAC-Da-lpf" userLabel="User Name">
|
||||
<rect key="frame" x="20" y="109" width="319" height="30"/>
|
||||
<rect key="frame" x="20" y="109" width="295" height="30"/>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="14"/>
|
||||
<textInputTraits key="textInputTraits" autocapitalizationType="words" keyboardAppearance="alert" returnKeyType="next" enablesReturnKeyAutomatically="YES"/>
|
||||
<connections>
|
||||
@ -1684,7 +1672,7 @@
|
||||
</connections>
|
||||
</textField>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Your Master Password" clearsOnBeginEditing="YES" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="J46-0E-no3" userLabel="Master Password">
|
||||
<rect key="frame" x="20" y="147" width="319" height="30"/>
|
||||
<rect key="frame" x="20" y="147" width="295" height="30"/>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="14"/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardAppearance="alert" returnKeyType="next" enablesReturnKeyAutomatically="YES" secureTextEntry="YES"/>
|
||||
<connections>
|
||||
@ -1693,7 +1681,7 @@
|
||||
</connections>
|
||||
</textField>
|
||||
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Site Name" clearsOnBeginEditing="YES" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="56H-xR-09J" userLabel="Site Name">
|
||||
<rect key="frame" x="20" y="185" width="319" height="30"/>
|
||||
<rect key="frame" x="20" y="185" width="295" height="30"/>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="14"/>
|
||||
<textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="URL" keyboardAppearance="alert" returnKeyType="done" enablesReturnKeyAutomatically="YES"/>
|
||||
<connections>
|
||||
@ -1702,7 +1690,7 @@
|
||||
</connections>
|
||||
</textField>
|
||||
<segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="1" translatesAutoresizingMaskIntoConstraints="NO" id="e4b-Iv-Pk9" userLabel="Type">
|
||||
<rect key="frame" x="20" y="223" width="319" height="29"/>
|
||||
<rect key="frame" x="20" y="223" width="295" height="29"/>
|
||||
<segments>
|
||||
<segment title="Max"/>
|
||||
<segment title="Long"/>
|
||||
@ -1725,19 +1713,19 @@
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
</label>
|
||||
<stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="100" translatesAutoresizingMaskIntoConstraints="NO" id="ZPT-EI-yuv" userLabel="Counter">
|
||||
<rect key="frame" x="245" y="259" width="94" height="29"/>
|
||||
<rect key="frame" x="221" y="259" width="94" height="29"/>
|
||||
<connections>
|
||||
<action selector="controlChanged:" destination="osn-5H-SWW" eventType="valueChanged" id="eQA-3X-uc9"/>
|
||||
</connections>
|
||||
</stepper>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="1" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="3Cd-XH-Wau">
|
||||
<rect key="frame" x="230" y="262.5" width="7" height="20.5"/>
|
||||
<rect key="frame" x="206" y="262.5" width="7" height="20.5"/>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="17"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</label>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bON-0a-K0M" userLabel="Close Button">
|
||||
<rect key="frame" x="315" y="0.0" width="44" height="44"/>
|
||||
<rect key="frame" x="291" y="0.0" width="44" height="44"/>
|
||||
<accessibility key="accessibilityConfiguration" hint="" label="Close"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="44" id="ETb-fm-wAa"/>
|
||||
@ -1772,10 +1760,10 @@
|
||||
</state>
|
||||
</button>
|
||||
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="4sN-hm-xio">
|
||||
<rect key="frame" x="161.5" y="329" width="37" height="37"/>
|
||||
<rect key="frame" x="149.5" y="329" width="37" height="37"/>
|
||||
</activityIndicatorView>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="XapaNuwjFihn6$" textAlignment="center" lineBreakMode="clip" baselineAdjustment="alignBaselines" minimumFontSize="10" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bHR-he-dnZ" userLabel="Password Label">
|
||||
<rect key="frame" x="20" y="328" width="319" height="39"/>
|
||||
<rect key="frame" x="20" y="328" width="295" height="39"/>
|
||||
<gestureRecognizers/>
|
||||
<fontDescription key="fontDescription" name="SourceCodePro-Black" family="Source Code Pro" pointSize="30"/>
|
||||
<color key="textColor" red="0.47450980390000003" green="0.86666666670000003" blue="0.98431372549999996" alpha="1" colorSpace="calibratedRGB"/>
|
||||
@ -1786,7 +1774,7 @@
|
||||
</connections>
|
||||
</label>
|
||||
<view userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="beo-cJ-jIn" userLabel="View - Content Tip">
|
||||
<rect key="frame" x="74.5" y="287" width="210" height="60"/>
|
||||
<rect key="frame" x="62.5" y="287.5" width="210" height="60"/>
|
||||
<subviews>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" translatesAutoresizingMaskIntoConstraints="NO" id="nyL-cO-aPa">
|
||||
<rect key="frame" x="0.0" y="0.0" width="210" height="60"/>
|
||||
@ -1852,24 +1840,19 @@
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="1lc-e7-Qme" firstAttribute="leading" secondItem="GiS-3g-cDj" secondAttribute="leading" constant="8" id="3xS-Ou-InS"/>
|
||||
<constraint firstItem="i0q-rq-0T2" firstAttribute="leading" secondItem="GiS-3g-cDj" secondAttribute="leading" id="Jvz-1G-8UK"/>
|
||||
<constraint firstAttribute="trailing" secondItem="1lc-e7-Qme" secondAttribute="trailing" constant="8" id="KWW-Vx-P8J"/>
|
||||
<constraint firstAttribute="bottom" secondItem="i0q-rq-0T2" secondAttribute="bottom" id="Leo-BC-ix6"/>
|
||||
<constraint firstItem="i0q-rq-0T2" firstAttribute="top" secondItem="GiS-3g-cDj" secondAttribute="top" id="hlj-vB-7AH"/>
|
||||
<constraint firstAttribute="trailing" secondItem="i0q-rq-0T2" secondAttribute="trailing" id="r8s-OP-rWe"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="viewFlipsideBackgroundColor"/>
|
||||
<constraints>
|
||||
<constraint firstItem="1lc-e7-Qme" firstAttribute="leading" secondItem="GiS-3g-cDj" secondAttribute="leading" constant="20" symbolic="YES" id="04d-tv-W4S"/>
|
||||
<constraint firstAttribute="trailing" secondItem="1lc-e7-Qme" secondAttribute="trailing" constant="20" symbolic="YES" id="5af-wt-tGJ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="GiS-3g-cDj" secondAttribute="trailing" id="TjK-B6-KoI"/>
|
||||
<constraint firstItem="GiS-3g-cDj" firstAttribute="top" secondItem="7jl-cw-kaJ" secondAttribute="top" id="Zzd-AD-1X5"/>
|
||||
<constraint firstItem="GiS-3g-cDj" firstAttribute="leading" secondItem="7jl-cw-kaJ" secondAttribute="leading" id="bk6-yS-CW5"/>
|
||||
<constraint firstAttribute="top" secondAttribute="top" id="Zzd-AD-1X5"/>
|
||||
<constraint firstAttribute="leading" secondAttribute="leading" id="bk6-yS-CW5"/>
|
||||
<constraint firstItem="1lc-e7-Qme" firstAttribute="top" secondItem="cmU-lf-Fxd" secondAttribute="bottom" constant="8" id="mhg-9h-rmE"/>
|
||||
<constraint firstItem="IV3-lc-Fnf" firstAttribute="top" secondItem="GiS-3g-cDj" secondAttribute="bottom" id="t22-RN-Hm0"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="ignoreTouches" value="YES"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<navigationItem key="navigationItem" id="Iif-Vk-z5j">
|
||||
<barButtonItem key="backBarButtonItem" title="Log Out" id="cKa-vZ-q96"/>
|
||||
@ -2440,7 +2423,7 @@ See </string>
|
||||
<scene sceneID="j3J-72-mva">
|
||||
<objects>
|
||||
<tableViewController automaticallyAdjustsScrollViewInsets="NO" id="pdl-xv-zjX" customClass="MPStoreViewController" sceneMemberID="viewController">
|
||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Yd8-L6-OMk" customClass="MPTableView">
|
||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Yd8-L6-OMk">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" red="0.12549020350000001" green="0.1411764771" blue="0.14901961389999999" alpha="1" colorSpace="calibratedRGB"/>
|
||||
@ -2462,7 +2445,7 @@ See </string>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="335" translatesAutoresizingMaskIntoConstraints="NO" id="Ra0-yS-99P">
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ra0-yS-99P">
|
||||
<rect key="frame" x="20" y="254" width="335" height="92.5"/>
|
||||
<string key="text">Master Password is great for making your passwords immune to loss, and it even lets you save your login name. But saved login names can't be recovered when all is lost. Generated login names use the same algorithm to generate a good login name to use for each of your sites. In addition, using unique non-identifying login names for your sites helps protect against companies working together to build a bigger picture on your identity.</string>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Thin" family="Exo 2.0" pointSize="11"/>
|
||||
@ -2527,14 +2510,14 @@ See </string>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="335" translatesAutoresizingMaskIntoConstraints="NO" id="yRH-27-edZ">
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yRH-27-edZ">
|
||||
<rect key="frame" x="20" y="254" width="335" height="132"/>
|
||||
<string key="text">The infamous security questions are in fact a veritable assault on your security. For starters, they weaken the protection of your account by allowing an attacker in by simply knowing enough about you, allowing him to bypass guessing your strong password. Arguably worse is the amount of highly personal and private information you're "willingly" divulging to these websites, under the assumption that only you know the answers. Generating security answers allows you to stop sharing your highly personal details and weakening your acccounts by generating unguessable answers to these questions.</string>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Thin" family="Exo 2.0" pointSize="11"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="thumb_generated_login.png" translatesAutoresizingMaskIntoConstraints="NO" id="6km-y3-4gu">
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="thumb_generated_answers.png" translatesAutoresizingMaskIntoConstraints="NO" id="6km-y3-4gu">
|
||||
<rect key="frame" x="88" y="20" width="198" height="198"/>
|
||||
</imageView>
|
||||
<activityIndicatorView hidden="YES" opaque="NO" tag="2" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="X2g-Go-2Hz">
|
||||
@ -2592,7 +2575,7 @@ See </string>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="335" translatesAutoresizingMaskIntoConstraints="NO" id="riF-bB-x5g">
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="riF-bB-x5g">
|
||||
<rect key="frame" x="20" y="254" width="335" height="66.5"/>
|
||||
<string key="text">Up to now, the best way to use your passwords in other iOS apps was by copy/pasting them from Master Password. With iOS integration, you can access your Master Password passwords directly from other applications, without having to switch back and forth between it and Master Password.</string>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Thin" family="Exo 2.0" pointSize="11"/>
|
||||
@ -2657,7 +2640,7 @@ See </string>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="335" translatesAutoresizingMaskIntoConstraints="NO" id="Yxc-Lr-382">
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yxc-Lr-382">
|
||||
<rect key="frame" x="20" y="254" width="335" height="79.5"/>
|
||||
<string key="text">Since the iPhone 5s, all iPhones are now equipped with an advanced Touch ID fingerprint sensor in the home button. This sensor allows you to quickly and easily identify yourself to the system. With Touch ID support, you will be able to skip the step of entering your Master Password manually and gain the ability to unlock your user using Touch ID instead.</string>
|
||||
<fontDescription key="fontDescription" name="Exo2.0-Thin" family="Exo 2.0" pointSize="11"/>
|
||||
@ -2784,16 +2767,6 @@ See </string>
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JMb-s5-kLc" userLabel="Dismiss Button">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="calibratedRGB"/>
|
||||
<state key="normal">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<connections>
|
||||
<segue destination="iXL-Dr-gEZ" kind="unwind" identifier="unwind-popover" unwindAction="unwindToCombined:" id="uvN-tM-jSz"/>
|
||||
</connections>
|
||||
</button>
|
||||
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" barStyle="black" translatesAutoresizingMaskIntoConstraints="NO" id="CqV-Mw-g16">
|
||||
<rect key="frame" x="0.0" y="294" width="375" height="373"/>
|
||||
<items/>
|
||||
@ -2951,7 +2924,7 @@ See </string>
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="viewFlipsideBackgroundColor"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="CqV-Mw-g16" firstAttribute="bottom" secondItem="vKY-AK-ugj" secondAttribute="bottom" id="30y-ji-78v"/>
|
||||
<constraint firstAttribute="trailing" secondItem="vKY-AK-ugj" secondAttribute="trailing" id="5Nj-ev-quC"/>
|
||||
@ -2959,20 +2932,18 @@ See </string>
|
||||
<constraint firstItem="vKY-AK-ugj" firstAttribute="top" relation="greaterThanOrEqual" secondItem="i3q-t5-XCA" secondAttribute="top" constant="100" id="F0k-Ku-5zl"/>
|
||||
<constraint firstItem="CqV-Mw-g16" firstAttribute="leading" secondItem="vKY-AK-ugj" secondAttribute="leading" id="J9c-YW-ANL"/>
|
||||
<constraint firstItem="vKY-AK-ugj" firstAttribute="leading" secondItem="i3q-t5-XCA" secondAttribute="leading" id="RZC-h2-KpP"/>
|
||||
<constraint firstAttribute="trailing" secondItem="JMb-s5-kLc" secondAttribute="trailing" id="Tz3-kq-5jq"/>
|
||||
<constraint firstItem="CqV-Mw-g16" firstAttribute="top" secondItem="vKY-AK-ugj" secondAttribute="top" id="U40-id-tLK"/>
|
||||
<constraint firstItem="9uS-oI-qfo" firstAttribute="top" secondItem="vKY-AK-ugj" secondAttribute="bottom" id="WiT-cf-a89"/>
|
||||
<constraint firstItem="JMb-s5-kLc" firstAttribute="top" secondItem="i3q-t5-XCA" secondAttribute="top" id="ZIm-Ua-ZtR"/>
|
||||
<constraint firstItem="JMb-s5-kLc" firstAttribute="leading" secondItem="i3q-t5-XCA" secondAttribute="leading" id="cjI-Sn-WaM"/>
|
||||
<constraint firstAttribute="bottom" secondItem="JMb-s5-kLc" secondAttribute="bottom" id="ivq-ne-fRk"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="ignoreTouches" value="YES"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="tableView" destination="vKY-AK-ugj" id="p4r-Cb-Vfr"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="D8c-ll-gWC" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
<exit id="iXL-Dr-gEZ" userLabel="Exit" sceneMemberID="exit"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="1408.5" y="2175.5"/>
|
||||
</scene>
|
||||
@ -2995,6 +2966,7 @@ See </string>
|
||||
<image name="icon_up.png" width="32" height="32"/>
|
||||
<image name="identity.png" width="82" height="80"/>
|
||||
<image name="image-0.png" width="320" height="568"/>
|
||||
<image name="thumb_generated_answers.png" width="198" height="198"/>
|
||||
<image name="thumb_generated_login.png" width="198" height="198"/>
|
||||
<image name="tip_basic_black.png" width="210" height="60"/>
|
||||
<image name="ui_spinner.png" width="75" height="75"/>
|
||||
@ -3008,7 +2980,7 @@ See </string>
|
||||
</simulatedMetricsContainer>
|
||||
<inferredMetricsTieBreakers>
|
||||
<segue reference="GZk-I4-JyH"/>
|
||||
<segue reference="k2G-nL-x3l"/>
|
||||
<segue reference="Ql4-wf-T8u"/>
|
||||
</inferredMetricsTieBreakers>
|
||||
<color key="tintColor" name="controlLightHighlightColor" catalog="System" colorSpace="catalog"/>
|
||||
</document>
|
||||
|
BIN
MasterPassword/Resources/Media/thumb_generated_answers.png
Normal file
BIN
MasterPassword/Resources/Media/thumb_generated_answers.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
BIN
MasterPassword/Resources/Media/thumb_generated_answers@2x.png
Normal file
BIN
MasterPassword/Resources/Media/thumb_generated_answers@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 116 KiB |
BIN
MasterPassword/Resources/Media/thumb_generated_answers@3x.png
Normal file
BIN
MasterPassword/Resources/Media/thumb_generated_answers@3x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 253 KiB |
Loading…
Reference in New Issue
Block a user