From 34645c94333b62efe6c4f2447ff7fa928f84dc48 Mon Sep 17 00:00:00 2001 From: Maarten Billemont Date: Tue, 27 Aug 2013 23:28:10 -0400 Subject: [PATCH] Theming for iOS 6, updated status hiding and more exception handling. [ADDED] More verbose log printing when trace enabled. [ADDED] More exception handling on application launch; we can't allow any of this to keep us from being able to open the emergency generator. [UPDATED] Only apply UI theming on iOS 6-. [ADDED] Modern way of hiding the status bar on iOS 7. --- External/Pearl | 2 +- .../ObjC/iOS/MPMainViewController.m | 5 +- .../ObjC/iOS/MPUnlockViewController.m | 13 +- MasterPassword/ObjC/iOS/MPiOSAppDelegate.m | 316 +++++++++--------- .../ObjC/iOS/MainStoryboard_iPhone.storyboard | 4 +- .../ObjC/iOS/MasterPassword-Info.plist | 4 +- 6 files changed, 181 insertions(+), 163 deletions(-) diff --git a/External/Pearl b/External/Pearl index ed17f533..41c3582a 160000 --- a/External/Pearl +++ b/External/Pearl @@ -1 +1 @@ -Subproject commit ed17f53324c5537d70cb08e25b07eb4def2eb9c5 +Subproject commit 41c3582a72ddb251b9a3a055ecdad3fa49ec18f2 diff --git a/MasterPassword/ObjC/iOS/MPMainViewController.m b/MasterPassword/ObjC/iOS/MPMainViewController.m index b6fa9ee5..c5f72190 100644 --- a/MasterPassword/ObjC/iOS/MPMainViewController.m +++ b/MasterPassword/ObjC/iOS/MPMainViewController.m @@ -120,9 +120,10 @@ } - (void)viewWillAppear:(BOOL)animated { - - [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]; + [self.navigationController setNavigationBarHidden:NO animated:animated]; + if (![super respondsToSelector:@selector(prefersStatusBarHidden)]) + [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]; MPElementEntity *activeElement = [self activeElementForMainThread]; if (activeElement.user != [[MPiOSAppDelegate get] activeUserForMainThread]) diff --git a/MasterPassword/ObjC/iOS/MPUnlockViewController.m b/MasterPassword/ObjC/iOS/MPUnlockViewController.m index d0bbe1a0..eef9d566 100644 --- a/MasterPassword/ObjC/iOS/MPUnlockViewController.m +++ b/MasterPassword/ObjC/iOS/MPUnlockViewController.m @@ -202,7 +202,8 @@ inf(@"Lock screen will appear"); [self.navigationController setNavigationBarHidden:YES animated:animated]; - [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; + if (![super respondsToSelector:@selector(prefersStatusBarHidden)]) + [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; [[MPiOSAppDelegate get] signOutAnimated:NO]; @@ -248,6 +249,16 @@ [super viewWillDisappear:animated]; } +- (BOOL)prefersStatusBarHidden { + + return YES; +} + +- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation { + + return UIStatusBarAnimationSlide; +} + - (BOOL)canBecomeFirstResponder { return YES; diff --git a/MasterPassword/ObjC/iOS/MPiOSAppDelegate.m b/MasterPassword/ObjC/iOS/MPiOSAppDelegate.m index dece565b..84e4386a 100644 --- a/MasterPassword/ObjC/iOS/MPiOSAppDelegate.m +++ b/MasterPassword/ObjC/iOS/MPiOSAppDelegate.m @@ -23,21 +23,21 @@ + (void)initialize { - [MPiOSConfig get]; [PearlLogger get].historyLevel = [[MPiOSConfig get].traceMode boolValue]? PearlLogLevelTrace: PearlLogLevelInfo; #ifdef DEBUG [PearlLogger get].printLevel = PearlLogLevelDebug; - //[NSClassFromString(@"WebView") performSelector:NSSelectorFromString(@"_enableRemoteInspector")]; +#else + [PearlLogger get].printLevel = [[MPiOSConfig get].traceMode boolValue]? PearlLogLevelDebug: PearlLogLevelInfo; #endif } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [[[NSBundle mainBundle] mutableInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"]; - [[[NSBundle mainBundle] mutableLocalizedInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"]; + @try { + [[[NSBundle mainBundle] mutableInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"]; + [[[NSBundle mainBundle] mutableLocalizedInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"]; #ifdef TESTFLIGHT_SDK_VERSION - @try { NSString *testFlightToken = [self testFlightToken]; if ([testFlightToken length]) { inf(@"Initializing TestFlight"); @@ -61,23 +61,13 @@ TFLog( @"TestFlight (%@) initialized for: %@ v%@.", // TESTFLIGHT_SDK_VERSION, [PearlInfoPlist get].CFBundleName, [PearlInfoPlist get].CFBundleVersion ); } - } - @catch (id exception) { - err(@"TestFlight: %@", exception); - } #endif - @try { NSString *googlePlusClientID = [self googlePlusClientID]; if ([googlePlusClientID length]) { inf(@"Initializing Google+"); [[GPPSignIn sharedInstance] setClientID:googlePlusClientID]; } - } - @catch (id exception) { - err(@"Google+: %@", exception); - } #ifdef CRASHLYTICS - @try { NSString *crashlyticsAPIKey = [self crashlyticsAPIKey]; if ([crashlyticsAPIKey length]) { inf(@"Initializing Crashlytics"); @@ -102,13 +92,8 @@ CLSLog( @"Crashlytics (%@) initialized for: %@ v%@.", // [Crashlytics sharedInstance].version, [PearlInfoPlist get].CFBundleName, [PearlInfoPlist get].CFBundleVersion ); } - } - @catch (id exception) { - err(@"Crashlytics: %@", exception); - } #endif #ifdef LOCALYTICS - @try { NSString *localyticsKey = [self localyticsKey]; if ([localyticsKey length]) { inf(@"Initializing Localytics"); @@ -128,161 +113,182 @@ return YES; }]; } +#endif } @catch (id exception) { - err(@"Localytics exception: %@", exception); + err(@"During Analytics Setup: %@", exception); } -#endif + @try { + if (floor( NSFoundationVersionNumber ) <= NSFoundationVersionNumber_iOS_6_1) { + UIImage *navBarImage = [[UIImage imageNamed:@"ui_navbar_container"] resizableImageWithCapInsets:UIEdgeInsetsMake( 0, 5, 0, 5 )]; + [[UINavigationBar appearance] setBackgroundImage:navBarImage forBarMetrics:UIBarMetricsDefault]; + [[UINavigationBar appearance] setBackgroundImage:navBarImage forBarMetrics:UIBarMetricsLandscapePhone]; + [[UINavigationBar appearance] setTitleTextAttributes: + @{ + UITextAttributeTextColor : [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f], + UITextAttributeTextShadowColor : [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.8f], + UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake( 0, -1 )], + UITextAttributeFont : [UIFont fontWithName:@"Exo-Bold" size:20.0f] + }]; -// UIImage *navBarImage = [[UIImage imageNamed:@"ui_navbar_container"] resizableImageWithCapInsets:UIEdgeInsetsMake( 0, 5, 0, 5 )]; -// [[UINavigationBar appearance] setBackgroundImage:navBarImage forBarMetrics:UIBarMetricsDefault]; -// [[UINavigationBar appearance] setBackgroundImage:navBarImage forBarMetrics:UIBarMetricsLandscapePhone]; -// [[UINavigationBar appearance] setTitleTextAttributes: -// @{ -// UITextAttributeTextColor : [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f], -// UITextAttributeTextShadowColor : [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.8f], -// UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake( 0, -1 )], -// UITextAttributeFont : [UIFont fontWithName:@"Exo-Bold" size:20.0f] -// }]; -// -// UIImage *navBarButton = [[UIImage imageNamed:@"ui_navbar_button"] resizableImageWithCapInsets:UIEdgeInsetsMake( 0, 5, 0, 5 )]; -// UIImage *navBarBack = [[UIImage imageNamed:@"ui_navbar_back"] resizableImageWithCapInsets:UIEdgeInsetsMake( 0, 13, 0, 5 )]; -// [[UIBarButtonItem appearance] setBackgroundImage:navBarButton forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; -// [[UIBarButtonItem appearance] setBackgroundImage:nil forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone]; -// [[UIBarButtonItem appearance] setBackButtonBackgroundImage:navBarBack forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; -// [[UIBarButtonItem appearance] setBackButtonBackgroundImage:nil forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone]; -// [[UIBarButtonItem appearance] setTitleTextAttributes: -// @{ -// UITextAttributeTextColor : [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f], -// UITextAttributeTextShadowColor : [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f], -// UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake( 0, 1 )]//, -// // Causes a bug in iOS where image views get oddly stretched... or something. -// //UITextAttributeFont: [UIFont fontWithName:@"HelveticaNeue" size:13.0f] -// } -// forState:UIControlStateNormal]; -// -// UIImage *toolBarImage = [[UIImage imageNamed:@"ui_toolbar_container"] resizableImageWithCapInsets:UIEdgeInsetsMake( 25, 5, 5, 5 )]; -// [[UISearchBar appearance] setBackgroundImage:toolBarImage]; -// [[UIToolbar appearance] setBackgroundImage:toolBarImage forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault]; + UIImage *navBarButton = [[UIImage imageNamed:@"ui_navbar_button"] resizableImageWithCapInsets:UIEdgeInsetsMake( 0, 5, 0, 5 )]; + UIImage *navBarBack = [[UIImage imageNamed:@"ui_navbar_back"] resizableImageWithCapInsets:UIEdgeInsetsMake( 0, 13, 0, 5 )]; + [[UIBarButtonItem appearance] setBackgroundImage:navBarButton forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + [[UIBarButtonItem appearance] setBackgroundImage:nil forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone]; + [[UIBarButtonItem appearance] + setBackButtonBackgroundImage:navBarBack forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + [[UIBarButtonItem appearance] + setBackButtonBackgroundImage:nil forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone]; + [[UIBarButtonItem appearance] setTitleTextAttributes: + @{ + UITextAttributeTextColor : [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f], + UITextAttributeTextShadowColor : [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f], + UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake( 0, 1 )]//, + // Causes a bug in iOS where image views get oddly stretched... or something. + //UITextAttributeFont: [UIFont fontWithName:@"HelveticaNeue" size:13.0f] + } + forState:UIControlStateNormal]; - // UIImage *minImage = [[UIImage imageNamed:@"slider-minimum"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 0)]; - // UIImage *maxImage = [[UIImage imageNamed:@"slider-maximum"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 0)]; - // UIImage *thumbImage = [UIImage imageNamed:@"slider-handle"]; - // - // [[UISlider appearance] setMaximumTrackImage:maxImage forState:UIControlStateNormal]; - // [[UISlider appearance] setMinimumTrackImage:minImage forState:UIControlStateNormal]; - // [[UISlider appearance] setThumbImage:thumbImage forState:UIControlStateNormal]; - // - // UIImage *segmentSelected = [[UIImage imageNamed:@"segcontrol_sel"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 4, 0, 4)]; - // UIImage *segmentUnselected = [[UIImage imageNamed:@"segcontrol_uns"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)]; - // UIImage *segmentSelectedUnselected = [UIImage imageNamed:@"segcontrol_sel-uns"]; - // UIImage *segUnselectedSelected = [UIImage imageNamed:@"segcontrol_uns-sel"]; - // UIImage *segmentUnselectedUnselected = [UIImage imageNamed:@"segcontrol_uns-uns"]; - // - // [[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; - // [[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; - // - // [[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; - // [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; - // [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; + UIImage *toolBarImage = [[UIImage imageNamed:@"ui_toolbar_container"] + resizableImageWithCapInsets:UIEdgeInsetsMake( 25, 5, 5, 5 )]; + [[UISearchBar appearance] setBackgroundImage:toolBarImage]; + [[UIToolbar appearance] setBackgroundImage:toolBarImage forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault]; - [[NSNotificationCenter defaultCenter] addObserverForName:MPCheckConfigNotification object:nil queue:nil usingBlock: - ^(NSNotification *note) { - if ([[MPiOSConfig get].sendInfo boolValue]) { - if ([PearlLogger get].printLevel > PearlLogLevelInfo) - [PearlLogger get].printLevel = PearlLogLevelInfo; + // UIImage *minImage = [[UIImage imageNamed:@"slider-minimum"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 0)]; + // UIImage *maxImage = [[UIImage imageNamed:@"slider-maximum"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 0)]; + // UIImage *thumbImage = [UIImage imageNamed:@"slider-handle"]; + // + // [[UISlider appearance] setMaximumTrackImage:maxImage forState:UIControlStateNormal]; + // [[UISlider appearance] setMinimumTrackImage:minImage forState:UIControlStateNormal]; + // [[UISlider appearance] setThumbImage:thumbImage forState:UIControlStateNormal]; + // + // UIImage *segmentSelected = [[UIImage imageNamed:@"segcontrol_sel"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 4, 0, 4)]; + // UIImage *segmentUnselected = [[UIImage imageNamed:@"segcontrol_uns"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)]; + // UIImage *segmentSelectedUnselected = [UIImage imageNamed:@"segcontrol_sel-uns"]; + // UIImage *segUnselectedSelected = [UIImage imageNamed:@"segcontrol_uns-sel"]; + // UIImage *segmentUnselectedUnselected = [UIImage imageNamed:@"segcontrol_uns-uns"]; + // + // [[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + // [[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; + // + // [[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + // [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + // [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; + } + } + @catch (id exception) { + err(@"During Theme Setup: %@", exception); + } + @try { + [[NSNotificationCenter defaultCenter] addObserverForName:MPCheckConfigNotification object:nil queue:nil usingBlock: + ^(NSNotification *note) { + if ([[MPiOSConfig get].sendInfo boolValue]) { + if ([PearlLogger get].printLevel > PearlLogLevelInfo) + [PearlLogger get].printLevel = PearlLogLevelInfo; #ifdef CRASHLYTICS - [[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].rememberLogin boolValue] forKey:@"rememberLogin"]; - [[Crashlytics sharedInstance] setBoolValue:[self storeManager].cloudEnabled forKey:@"iCloud"]; - [[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].iCloudDecided boolValue] forKey:@"iCloudDecided"]; - [[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].sendInfo boolValue] forKey:@"sendInfo"]; - [[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].helpHidden boolValue] forKey:@"helpHidden"]; - [[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].showSetup boolValue] forKey:@"showQuickStart"]; - [[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].firstRun boolValue] forKey:@"firstRun"]; - [[Crashlytics sharedInstance] setIntValue:[[PearlConfig get].launchCount intValue] forKey:@"launchCount"]; - [[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].askForReviews boolValue] forKey:@"askForReviews"]; - [[Crashlytics sharedInstance] - setIntValue:[[PearlConfig get].reviewAfterLaunches intValue] forKey:@"reviewAfterLaunches"]; - [[Crashlytics sharedInstance] setObjectValue:[PearlConfig get].reviewedVersion forKey:@"reviewedVersion"]; + [[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].rememberLogin boolValue] forKey:@"rememberLogin"]; + [[Crashlytics sharedInstance] setBoolValue:[self storeManager].cloudEnabled forKey:@"iCloud"]; + [[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].iCloudDecided boolValue] forKey:@"iCloudDecided"]; + [[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].sendInfo boolValue] forKey:@"sendInfo"]; + [[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].helpHidden boolValue] forKey:@"helpHidden"]; + [[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].showSetup boolValue] forKey:@"showQuickStart"]; + [[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].firstRun boolValue] forKey:@"firstRun"]; + [[Crashlytics sharedInstance] setIntValue:[[PearlConfig get].launchCount intValue] forKey:@"launchCount"]; + [[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].askForReviews boolValue] forKey:@"askForReviews"]; + [[Crashlytics sharedInstance] + setIntValue:[[PearlConfig get].reviewAfterLaunches intValue] forKey:@"reviewAfterLaunches"]; + [[Crashlytics sharedInstance] setObjectValue:[PearlConfig get].reviewedVersion forKey:@"reviewedVersion"]; #endif #ifdef TESTFLIGHT_SDK_VERSION - [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPConfig get].rememberLogin ) - forKey:@"rememberLogin"]; - [TestFlight addCustomEnvironmentInformation:PearlStringB( [self storeManager].cloudEnabled ) - forKey:@"iCloud"]; - [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPConfig get].iCloudDecided ) - forKey:@"iCloudDecided"]; - [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPiOSConfig get].sendInfo ) - forKey:@"sendInfo"]; - [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPiOSConfig get].helpHidden ) - forKey:@"helpHidden"]; - [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPiOSConfig get].showSetup ) - forKey:@"showQuickStart"]; - [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [PearlConfig get].firstRun ) - forKey:@"firstRun"]; - [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [PearlConfig get].launchCount ) - forKey:@"launchCount"]; - [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [PearlConfig get].askForReviews ) - forKey:@"askForReviews"]; - [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [PearlConfig get].reviewAfterLaunches ) - forKey:@"reviewAfterLaunches"]; - [TestFlight addCustomEnvironmentInformation:[PearlConfig get].reviewedVersion - forKey:@"reviewedVersion"]; + [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPConfig get].rememberLogin ) + forKey:@"rememberLogin"]; + [TestFlight addCustomEnvironmentInformation:PearlStringB( [self storeManager].cloudEnabled ) + forKey:@"iCloud"]; + [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPConfig get].iCloudDecided ) + forKey:@"iCloudDecided"]; + [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPiOSConfig get].sendInfo ) + forKey:@"sendInfo"]; + [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPiOSConfig get].helpHidden ) + forKey:@"helpHidden"]; + [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [MPiOSConfig get].showSetup ) + forKey:@"showQuickStart"]; + [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [PearlConfig get].firstRun ) + forKey:@"firstRun"]; + [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [PearlConfig get].launchCount ) + forKey:@"launchCount"]; + [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [PearlConfig get].askForReviews ) + forKey:@"askForReviews"]; + [TestFlight addCustomEnvironmentInformation:PearlStringNSB( [PearlConfig get].reviewAfterLaunches ) + forKey:@"reviewAfterLaunches"]; + [TestFlight addCustomEnvironmentInformation:[PearlConfig get].reviewedVersion + forKey:@"reviewedVersion"]; #endif - MPCheckpoint( MPCheckpointConfig, @{ - @"rememberLogin" : @([[MPConfig get].rememberLogin boolValue]), - @"iCloud" : @([self storeManager].cloudEnabled), - @"iCloudDecided" : @([[MPConfig get].iCloudDecided boolValue]), - @"sendInfo" : @([[MPiOSConfig get].sendInfo boolValue]), - @"helpHidden" : @([[MPiOSConfig get].helpHidden boolValue]), - @"showQuickStart" : @([[MPiOSConfig get].showSetup boolValue]), - @"firstRun" : @([[PearlConfig get].firstRun boolValue]), - @"launchCount" : NilToNSNull([PearlConfig get].launchCount), - @"askForReviews" : @([[PearlConfig get].askForReviews boolValue]), - @"reviewAfterLaunches" : NilToNSNull([PearlConfig get].reviewAfterLaunches), - @"reviewedVersion" : NilToNSNull([PearlConfig get].reviewedVersion) - } ); - } - }]; - [[NSNotificationCenter defaultCenter] - addObserverForName:kIASKAppSettingChanged object:nil queue:nil usingBlock:^(NSNotification *note) { - [[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification object:note userInfo:nil]; - }]; + MPCheckpoint( MPCheckpointConfig, @{ + @"rememberLogin" : @([[MPConfig get].rememberLogin boolValue]), + @"iCloud" : @([self storeManager].cloudEnabled), + @"iCloudDecided" : @([[MPConfig get].iCloudDecided boolValue]), + @"sendInfo" : @([[MPiOSConfig get].sendInfo boolValue]), + @"helpHidden" : @([[MPiOSConfig get].helpHidden boolValue]), + @"showQuickStart" : @([[MPiOSConfig get].showSetup boolValue]), + @"firstRun" : @([[PearlConfig get].firstRun boolValue]), + @"launchCount" : NilToNSNull([PearlConfig get].launchCount), + @"askForReviews" : @([[PearlConfig get].askForReviews boolValue]), + @"reviewAfterLaunches" : NilToNSNull([PearlConfig get].reviewAfterLaunches), + @"reviewedVersion" : NilToNSNull([PearlConfig get].reviewedVersion) + } ); + } + }]; + [[NSNotificationCenter defaultCenter] + addObserverForName:kIASKAppSettingChanged object:nil queue:nil usingBlock:^(NSNotification *note) { + [[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification object:note userInfo:nil]; + }]; #ifdef ADHOC - [PearlAlert showAlertWithTitle:@"Welcome, tester!" message: - @"Thank you for taking the time to test Master Password.\n\n" - @"Please provide any feedback, however minor it may seem, via the Feedback action item accessible from the top right.\n\n" - @"Contact me directly at:\n" - @"lhunath@lyndir.com\n" - @"Or report detailed issues at:\n" - @"https://youtrack.lyndir.com\n" - viewStyle:UIAlertViewStyleDefault initAlert:nil tappedButtonBlock:nil - cancelTitle:nil otherTitles:[PearlStrings get].commonButtonOkay, nil]; + [PearlAlert showAlertWithTitle:@"Welcome, tester!" message: + @"Thank you for taking the time to test Master Password.\n\n" + @"Please provide any feedback, however minor it may seem, via the Feedback action item accessible from the top right.\n\n" + @"Contact me directly at:\n" + @"lhunath@lyndir.com\n" + @"Or report detailed issues at:\n" + @"https://youtrack.lyndir.com\n" + viewStyle:UIAlertViewStyleDefault initAlert:nil tappedButtonBlock:nil + cancelTitle:nil otherTitles:[PearlStrings get].commonButtonOkay, nil]; #endif + } + @catch (id exception) { + err(@"During Config Test: %@", exception); + } + @try { + [super application:application didFinishLaunchingWithOptions:launchOptions]; + } + @catch (id exception) { + err(@"During Pearl Application Launch: %@", exception); + } + @try { + inf(@"Started up with device identifier: %@", [PearlKeyChain deviceIdentifier]); - [super application:application didFinishLaunchingWithOptions:launchOptions]; + dispatch_async( dispatch_get_main_queue(), ^{ + if ([[MPiOSConfig get].showSetup boolValue]) + [[MPiOSAppDelegate get] showSetup]; + } ); - inf(@"Started up with device identifier: %@", [PearlKeyChain deviceIdentifier]); - - dispatch_async( dispatch_get_main_queue(), ^{ - if ([[MPiOSConfig get].showSetup boolValue]) - [[MPiOSAppDelegate get] showSetup]; - } ); - - MPCheckpoint( MPCheckpointStarted, @{ - @"simulator" : PearlStringB( [PearlDeviceUtils isSimulator] ), - @"encrypted" : PearlStringB( [PearlDeviceUtils isAppEncrypted] ), - @"jailbroken" : PearlStringB( [PearlDeviceUtils isJailbroken] ), - @"platform" : [PearlDeviceUtils platform], + MPCheckpoint( MPCheckpointStarted, @{ + @"simulator" : PearlStringB( [PearlDeviceUtils isSimulator] ), + @"encrypted" : PearlStringB( [PearlDeviceUtils isAppEncrypted] ), + @"jailbroken" : PearlStringB( [PearlDeviceUtils isJailbroken] ), + @"platform" : [PearlDeviceUtils platform], #ifdef APPSTORE - @"legal" : PearlStringB([PearlDeviceUtils isAppEncrypted]), + @"legal" : PearlStringB([PearlDeviceUtils isAppEncrypted]), #else - @"legal" : @"YES", + @"legal" : @"YES", #endif - } ); + } ); + } + @catch (id exception) { + err(@"During Post-Startup: %@", exception); + } return YES; } diff --git a/MasterPassword/ObjC/iOS/MainStoryboard_iPhone.storyboard b/MasterPassword/ObjC/iOS/MainStoryboard_iPhone.storyboard index 120f19d2..3626c9c9 100644 --- a/MasterPassword/ObjC/iOS/MainStoryboard_iPhone.storyboard +++ b/MasterPassword/ObjC/iOS/MainStoryboard_iPhone.storyboard @@ -1089,7 +1089,7 @@ L4m3P4sSw0rD - + @@ -2918,6 +2918,6 @@ However, it means that anyone who finds your device unlocked can do the same. - + \ No newline at end of file diff --git a/MasterPassword/ObjC/iOS/MasterPassword-Info.plist b/MasterPassword/ObjC/iOS/MasterPassword-Info.plist index 72c7f513..2d50ca59 100644 --- a/MasterPassword/ObjC/iOS/MasterPassword-Info.plist +++ b/MasterPassword/ObjC/iOS/MasterPassword-Info.plist @@ -99,9 +99,9 @@ UIMainStoryboardFile MainStoryboard_iPhone UIStatusBarHidden - + UIStatusBarStyle - UIStatusBarStyleBlackOpaque + UIStatusBarStyleDefault UIStatusBarTintParameters UINavigationBar