2
0

Remove PearlAppDelegate.

This commit is contained in:
Maarten Billemont 2020-05-22 17:34:04 -04:00
parent cf74dc5cc2
commit 93ad86e63c
7 changed files with 43 additions and 56 deletions

@ -1 +1 @@
Subproject commit fb38d0e35fb95627fdfedc6976f529d9bed70a8d Subproject commit fbb8e6f94b295ee34a575ca9bdd0cc95bfe615a9

View File

@ -117,7 +117,7 @@ PearlAssociatedObjectProperty( NSMutableArray*, ProductObservers, productObserve
[self performPurchaseProductWithIdentifier:productIdentifier quantity:quantity]; [self performPurchaseProductWithIdentifier:productIdentifier quantity:quantity];
}]]; }]];
[controller addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; [controller addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:controller animated:YES completion:nil]; [self.window.rootViewController presentViewController:controller animated:YES completion:nil];
return; return;
} }
#endif #endif
@ -167,7 +167,7 @@ PearlAssociatedObjectProperty( NSMutableArray*, ProductObservers, productObserve
@"Ensure you are online and try logging out and back into iTunes from your device's Settings." ) @"Ensure you are online and try logging out and back into iTunes from your device's Settings." )
preferredStyle:UIAlertControllerStyleAlert]; preferredStyle:UIAlertControllerStyleAlert];
[controller addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:nil]]; [controller addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:controller animated:YES completion:nil]; [self.window.rootViewController presentViewController:controller animated:YES completion:nil];
} ); } );
#endif #endif
} }

View File

@ -260,7 +260,7 @@
^(UIAlertAction *_Nonnull action) { ^(UIAlertAction *_Nonnull action) {
setResult( nil ); setResult( nil );
}]]; }]];
[self.navigationController presentViewController:controller animated:YES completion:nil]; [self.window.rootViewController presentViewController:controller animated:YES completion:nil];
} ); } );
} ); } );
#endif #endif

View File

@ -20,7 +20,7 @@
#if TARGET_OS_IPHONE #if TARGET_OS_IPHONE
@interface MPAppDelegate_Shared : PearlAppDelegate @interface MPAppDelegate_Shared : UIResponder<UIApplicationDelegate, PearlConfigDelegate>
#else #else

View File

@ -23,6 +23,7 @@
@interface MPiOSAppDelegate : MPAppDelegate_Shared <SKStoreProductViewControllerDelegate> @interface MPiOSAppDelegate : MPAppDelegate_Shared <SKStoreProductViewControllerDelegate>
@property(nonatomic, strong) UIWindow *window;
@property(nonatomic, strong) SKStoreProductViewController *voltoViewController; @property(nonatomic, strong) SKStoreProductViewController *voltoViewController;
- (void)openURL:(NSURL *)url; - (void)openURL:(NSURL *)url;

View File

@ -35,7 +35,7 @@
@implementation CountlyPushNotifications(MPNotifications) @implementation CountlyPushNotifications(MPNotifications)
- (void)openURL:(NSString *)URLString { - (void)openURL:(NSString *)URLString {
[[MPiOSAppDelegate get].navigationController performSegueWithIdentifier:@"web" sender:[NSURL URLWithString:URLString]]; [[MPiOSAppDelegate get].window.rootViewController performSegueWithIdentifier:@"web" sender:[NSURL URLWithString:URLString]];
} }
@end @end
@ -48,6 +48,8 @@
@implementation MPiOSAppDelegate @implementation MPiOSAppDelegate
@synthesize window;
+ (void)initialize { + (void)initialize {
[MPiOSConfig get]; [MPiOSConfig get];
@ -150,12 +152,6 @@
@catch (id exception) { @catch (id exception) {
err( @"During Config Test: %@", exception ); err( @"During Config Test: %@", exception );
} }
@try {
[super application:application didFinishLaunchingWithOptions:launchOptions];
}
@catch (id exception) {
err( @"During Pearl Application Launch: %@", exception );
}
@try { @try {
inf( @"Started up with device identifier: %@", [PearlKeyChain deviceIdentifier] ); inf( @"Started up with device identifier: %@", [PearlKeyChain deviceIdentifier] );
@ -206,7 +202,7 @@
PearlMainQueueOperation( ^{ PearlMainQueueOperation( ^{
if ([[MPiOSConfig get].showSetup boolValue]) if ([[MPiOSConfig get].showSetup boolValue])
[self.navigationController performSegueWithIdentifier:@"setup" sender:self]; [self.window.rootViewController performSegueWithIdentifier:@"setup" sender:self];
[self consentFeatures]; [self consentFeatures];
} ); } );
@ -244,7 +240,7 @@
(id)[error localizedDescription]?: error ) (id)[error localizedDescription]?: error )
preferredStyle:UIAlertControllerStyleAlert]; preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
return; return;
} }
@ -256,7 +252,7 @@
@"Master Password couldn't understand the import file." @"Master Password couldn't understand the import file."
preferredStyle:UIAlertControllerStyleAlert]; preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
return; return;
} }
@ -296,8 +292,7 @@
[self consentFeatures]; [self consentFeatures];
}]]; }]];
[(self.navigationController.presentedViewController?: (UIViewController *)self.navigationController) [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
presentViewController:alert animated:YES completion:nil];
} ); } );
return YES; return YES;
@ -342,8 +337,7 @@
[MPiOSConfig get].notificationsDecided = @(YES); [MPiOSConfig get].notificationsDecided = @(YES);
} }
}]]; }]];
[(self.navigationController.presentedViewController?: (UIViewController *)self.navigationController) [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
presentViewController:alert animated:YES completion:nil];
} ); } );
} }
@ -372,7 +366,7 @@
[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
setResult( nil ); setResult( nil );
}]]; }]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
} ); } );
} askUserPassword:^NSString *(NSString *userName) { } askUserPassword:^NSString *(NSString *userName) {
@ -390,7 +384,7 @@
[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
setResult( nil ); setResult( nil );
}]]; }]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
} ); } );
} result:^(NSError *error) { } result:^(NSError *error) {
@ -401,7 +395,7 @@
UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"Error" message:[error localizedDescription] UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"Error" message:[error localizedDescription]
preferredStyle:UIAlertControllerStyleAlert]; preferredStyle:UIAlertControllerStyleAlert];
[controller addAction:[UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:nil]]; [controller addAction:[UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:controller animated:YES completion:nil]; [self.window.rootViewController presentViewController:controller animated:YES completion:nil];
} }
} ); } );
}]; }];
@ -411,8 +405,6 @@
inf( @"Will foreground" ); inf( @"Will foreground" );
[super applicationWillEnterForeground:application];
[self.hangDetector start]; [self.hangDetector start];
} }
@ -435,20 +427,16 @@
[UIPasteboard generalPasteboard].string = @""; [UIPasteboard generalPasteboard].string = @"";
}]]; }]];
[alert addAction:[UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
} }
mpw_marshal_file_free( &importFile ); mpw_marshal_file_free( &importFile );
} ); } );
[super applicationDidBecomeActive:application];
} }
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
inf( @"Received memory warning." ); inf( @"Received memory warning." );
[super applicationDidReceiveMemoryWarning:application];
} }
- (void)applicationDidEnterBackground:(UIApplication *)application { - (void)applicationDidEnterBackground:(UIApplication *)application {
@ -461,8 +449,6 @@
} }
[self.hangDetector stop]; [self.hangDetector stop];
[super applicationDidEnterBackground:application];
} }
#pragma mark - Behavior #pragma mark - Behavior
@ -479,7 +465,7 @@
else if ([url.host isEqualToString:@"show-url"]) { else if ([url.host isEqualToString:@"show-url"]) {
for (NSURLQueryItem *item in [NSURLComponents componentsWithString:[url absoluteString]].queryItems) for (NSURLQueryItem *item in [NSURLComponents componentsWithString:[url absoluteString]].queryItems)
if ([item.name isEqualToString:@"url"]) { if ([item.name isEqualToString:@"url"]) {
[[MPiOSAppDelegate get].navigationController performSegueWithIdentifier:@"web" sender:[NSURL URLWithString:item.value]]; [self.window.rootViewController performSegueWithIdentifier:@"web" sender:[NSURL URLWithString:item.value]];
return; return;
} }
} }
@ -512,7 +498,7 @@
@"help@masterpassword.app" @"help@masterpassword.app"
preferredStyle:UIAlertControllerStyleAlert]; preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"Okay" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Okay" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} }
else if (logs) { else if (logs) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Feedback" message: UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Feedback" message:
@ -526,7 +512,7 @@
[alert addAction:[UIAlertAction actionWithTitle:@"No Logs" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [alert addAction:[UIAlertAction actionWithTitle:@"No Logs" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
[self openFeedbackWithLogs:NO forVC:viewController]; [self openFeedbackWithLogs:NO forVC:viewController];
}]]; }]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} }
else else
[self openFeedbackWithLogs:NO forVC:viewController]; [self openFeedbackWithLogs:NO forVC:viewController];
@ -580,7 +566,7 @@
[self deleteAndResetStore]; [self deleteAndResetStore];
}]]; }]];
[alert addAction:[UIAlertAction actionWithTitle:@"Ignore" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Ignore" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
} ); } );
} }
@ -605,10 +591,10 @@
[self showExportRevealPasswords:YES forVC:viewController]; [self showExportRevealPasswords:YES forVC:viewController];
}]]; }]];
[sheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; [sheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:sheet animated:YES completion:nil]; [self.window.rootViewController presentViewController:sheet animated:YES completion:nil];
}]]; }]];
[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} }
- (void)showExportRevealPasswords:(BOOL)revealPasswords forVC:(UIViewController *)viewController { - (void)showExportRevealPasswords:(BOOL)revealPasswords forVC:(UIViewController *)viewController {
@ -619,7 +605,7 @@
@"Close Master Password, go into Settings and add a Mail account." @"Close Master Password, go into Settings and add a Mail account."
preferredStyle:UIAlertControllerStyleAlert]; preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"Okay" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Okay" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
return; return;
} }
@ -644,7 +630,7 @@
handler:^(UIAlertAction *action) { handler:^(UIAlertAction *action) {
setResult( nil ); setResult( nil );
}]]; }]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
} ); } );
} error:&error]; } error:&error];
@ -655,7 +641,7 @@
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Export Error" message:[error localizedDescription] UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Export Error" message:[error localizedDescription]
preferredStyle:UIAlertControllerStyleAlert]; preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"Okay" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Okay" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} }
if (!exportedUser) if (!exportedUser)
return; return;
@ -711,7 +697,7 @@
} }
}]]; }]];
[alert addAction:[UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Continue" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
}]; }];
} }
@ -735,7 +721,7 @@
^(UIAlertAction *action) { [self migrateFor:user_]; }]]; ^(UIAlertAction *action) { [self migrateFor:user_]; }]];
PearlMainQueue( ^{ PearlMainQueue( ^{
[self.navigationController presentViewController:usersSheet animated:YES completion:nil]; [self.window.rootViewController presentViewController:usersSheet animated:YES completion:nil];
} ); } );
}]; }];
return; return;
@ -757,7 +743,7 @@
^(UIAlertAction *action) { setResult( alert.textFields.firstObject.text ); }]]; ^(UIAlertAction *action) { setResult( alert.textFields.firstObject.text ); }]];
[alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler: [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:
^(UIAlertAction *action) { setResult( nil ); }]]; ^(UIAlertAction *action) { setResult( nil ); }]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
} ); } );
} error:&error]; } error:&error];
@ -769,7 +755,7 @@
message:[error localizedDescription] message:[error localizedDescription]
preferredStyle:UIAlertControllerStyleAlert]; preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"Okay" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Okay" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} }
if (!exportedUser) if (!exportedUser)
return; return;
@ -784,7 +770,7 @@
} }
else if (self.voltoViewController) else if (self.voltoViewController)
[self.navigationController presentViewController:self.voltoViewController animated:YES completion:nil]; [self.window.rootViewController presentViewController:self.voltoViewController animated:YES completion:nil];
} }
- (void)changeMasterPasswordFor:(MPUserEntity *)user saveInContext:(NSManagedObjectContext *)moc didResetBlock:(void ( ^ )(void))didReset { - (void)changeMasterPasswordFor:(MPUserEntity *)user saveInContext:(NSManagedObjectContext *)moc didResetBlock:(void ( ^ )(void))didReset {
@ -808,7 +794,7 @@
didReset(); didReset();
}]]; }]];
[alert addAction:[UIAlertAction actionWithTitle:@"Abort" style:UIAlertActionStyleCancel handler:nil]]; [alert addAction:[UIAlertAction actionWithTitle:@"Abort" style:UIAlertActionStyleCancel handler:nil]];
[self.navigationController presentViewController:alert animated:YES completion:nil]; [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
} ); } );
} }

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16096" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="Q1S-vU-GGO"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="Q1S-vU-GGO">
<device id="retina6_1" orientation="portrait" appearance="light"/> <device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
@ -97,10 +97,10 @@
</constraints> </constraints>
</imageView> </imageView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0Sa-Vg-EEI" userLabel="Name Backdrop"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0Sa-Vg-EEI" userLabel="Name Backdrop">
<rect key="frame" x="43.5" y="263" width="128.5" height="16"/> <rect key="frame" x="43.5" y="263" width="128" height="16"/>
<subviews> <subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalCompressionResistancePriority="1000" text="Maarten Billemont" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cLT-s0-4SQ" userLabel="Name Field"> <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalCompressionResistancePriority="1000" text="Maarten Billemont" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cLT-s0-4SQ" userLabel="Name Field">
<rect key="frame" x="5" y="0.0" width="118.5" height="16"/> <rect key="frame" x="5" y="0.0" width="118" height="16"/>
<fontDescription key="fontDescription" name="Exo2.0-ExtraBold" family="Exo 2.0" pointSize="13"/> <fontDescription key="fontDescription" name="Exo2.0-ExtraBold" family="Exo 2.0" pointSize="13"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
@ -288,14 +288,14 @@
</connections> </connections>
</button> </button>
<view userInteractionEnabled="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="069-Pu-yXe" userLabel="Thanks Tip"> <view userInteractionEnabled="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="069-Pu-yXe" userLabel="Thanks Tip">
<rect key="frame" x="91" y="0.0" width="232.5" height="60"/> <rect key="frame" x="90.5" y="0.0" width="233" height="60"/>
<subviews> <subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" translatesAutoresizingMaskIntoConstraints="NO" id="Z8P-ZK-aS0"> <imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" translatesAutoresizingMaskIntoConstraints="NO" id="Z8P-ZK-aS0">
<rect key="frame" x="0.0" y="0.0" width="232.5" height="60"/> <rect key="frame" x="0.0" y="0.0" width="233" height="60"/>
<rect key="contentStretch" x="0.15000000000000002" y="0.0" width="0.69999999999999973" height="1"/> <rect key="contentStretch" x="0.15000000000000002" y="0.0" width="0.69999999999999973" height="1"/>
</imageView> </imageView>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Why is Master Password free?" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="BLV-3x-Q0z"> <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Why is Master Password free?" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="BLV-3x-Q0z">
<rect key="frame" x="20" y="11.5" width="192.5" height="17"/> <rect key="frame" x="20" y="11.5" width="193" height="17"/>
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="14"/> <fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="14"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
@ -2240,7 +2240,7 @@ Suspendisse potenti. Etiam ut nisi id augue tempor ultrices et sit amet sapien.
<dataDetectorType key="dataDetectorTypes" link="YES"/> <dataDetectorType key="dataDetectorTypes" link="YES"/>
</textView> </textView>
<toolbar contentMode="scaleToFill" barStyle="black" translatesAutoresizingMaskIntoConstraints="NO" id="WmH-JB-jp2"> <toolbar contentMode="scaleToFill" barStyle="black" translatesAutoresizingMaskIntoConstraints="NO" id="WmH-JB-jp2">
<rect key="frame" x="0.0" y="764" width="414" height="49"/> <rect key="frame" x="0.0" y="769" width="414" height="44"/>
<items> <items>
<barButtonItem systemItem="compose" id="BSV-3i-01h"> <barButtonItem systemItem="compose" id="BSV-3i-01h">
<connections> <connections>
@ -2255,7 +2255,7 @@ Suspendisse potenti. Etiam ut nisi id augue tempor ultrices et sit amet sapien.
<barButtonItem systemItem="flexibleSpace" id="Lp4-ss-KxI"/> <barButtonItem systemItem="flexibleSpace" id="Lp4-ss-KxI"/>
<barButtonItem style="plain" id="aMS-HH-mnE"> <barButtonItem style="plain" id="aMS-HH-mnE">
<segmentedControl key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="lxp-wx-uCy"> <segmentedControl key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="lxp-wx-uCy">
<rect key="frame" x="267" y="11" width="127" height="32"/> <rect key="frame" x="267" y="6" width="127" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments> <segments>
<segment title="Normal"/> <segment title="Normal"/>
@ -2755,7 +2755,7 @@ Invested: 3.7 work hours</string>
<rect key="frame" x="188.5" y="20" width="37" height="37"/> <rect key="frame" x="188.5" y="20" width="37" height="37"/>
</activityIndicatorView> </activityIndicatorView>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" verticalCompressionResistancePriority="751" text="Loading products..." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="NPg-it-juF"> <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" verticalCompressionResistancePriority="751" text="Loading products..." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="NPg-it-juF">
<rect key="frame" x="134.5" y="97" width="145.5" height="25"/> <rect key="frame" x="134" y="97" width="146" height="25"/>
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="17"/> <fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="17"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
@ -3271,7 +3271,7 @@ Ut in geometria, prima si dederis, danda sunt omnia. Nonne igitur tibi videntur,
</scene> </scene>
</scenes> </scenes>
<inferredMetricsTieBreakers> <inferredMetricsTieBreakers>
<segue reference="k2G-nL-x3l"/> <segue reference="Ql4-wf-T8u"/>
<segue reference="gtb-zE-u9H"/> <segue reference="gtb-zE-u9H"/>
</inferredMetricsTieBreakers> </inferredMetricsTieBreakers>
<color key="tintColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <color key="tintColor" white="1" alpha="1" colorSpace="calibratedWhite"/>