From e5763f9d7b121576305e7a283ef2ce0136d97cd7 Mon Sep 17 00:00:00 2001 From: Lobanov Dmitry Date: Mon, 24 Aug 2015 17:30:39 +0300 Subject: [PATCH] change old pin: screen added --- .../ABPadLockScreenAbstractViewController.h | 8 +- .../ABPadLockScreenAbstractViewController.m | 100 +++--- .../ABPadLockScreenChangeOldViewController.h | 35 +++ .../ABPadLockScreenChangeOldViewController.m | 284 ++++++++++++++++++ ...ockScreenChangeOldViewControllerDelegate.h | 54 ++++ ABPadLockScreen/ABPadLockScreenDelegate.h | 18 ++ .../project.pbxproj | 10 + .../Your Modules/ExampleViewController.h | 3 +- .../Your Modules/ExampleViewController.m | 22 +- .../Your Modules/ExampleViewController.xib | 23 +- 10 files changed, 502 insertions(+), 55 deletions(-) create mode 100644 ABPadLockScreen/ABPadLockScreenChangeOldViewController.h create mode 100644 ABPadLockScreen/ABPadLockScreenChangeOldViewController.m create mode 100644 ABPadLockScreen/ABPadLockScreenChangeOldViewControllerDelegate.h create mode 100644 ABPadLockScreen/ABPadLockScreenDelegate.h diff --git a/ABPadLockScreen/ABPadLockScreenAbstractViewController.h b/ABPadLockScreen/ABPadLockScreenAbstractViewController.h index 8e523f8..a7b3412 100755 --- a/ABPadLockScreen/ABPadLockScreenAbstractViewController.h +++ b/ABPadLockScreen/ABPadLockScreenAbstractViewController.h @@ -20,20 +20,18 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -@import UIKit; - /** Abstract Class that encapsulates common functionality between the lock and setup screen. It is not designed to be used directly */ +#import "ABPadLockScreenDelegate.h" @class ABPadLockScreenView; @interface ABPadLockScreenAbstractViewController : UIViewController -{ - ABPadLockScreenView* lockScreenView; -} +@property (strong, nonatomic, readonly) ABPadLockScreenView *lockScreenView; @property (nonatomic, strong) NSString *currentPin; +@property (nonatomic, weak) id delegate; @property (nonatomic, readonly, getter = isComplexPin) BOOL complexPin; @property (nonatomic, assign) BOOL tapSoundEnabled; //No by Default @property (nonatomic, assign) BOOL errorVibrateEnabled; //No by Default diff --git a/ABPadLockScreen/ABPadLockScreenAbstractViewController.m b/ABPadLockScreen/ABPadLockScreenAbstractViewController.m index 41ae677..a8021ba 100755 --- a/ABPadLockScreen/ABPadLockScreenAbstractViewController.m +++ b/ABPadLockScreen/ABPadLockScreenAbstractViewController.m @@ -25,12 +25,11 @@ #import "ABPinSelectionView.h" #import -#define lockScreenView ((ABPadLockScreenView *) [self view]) - @interface ABPadLockScreenAbstractViewController () - (void)setUpButtonMapping; - (void)buttonSelected:(UIButton *)sender; +- (void)cancelButtonSelected:(UIButton *)sender; - (void)deleteButtonSelected:(UIButton *)sender; - (void)okButtonSelected:(UIButton *)sender; @@ -38,6 +37,10 @@ - (void)okButtonSelected:(UIButton *)sender; @implementation ABPadLockScreenAbstractViewController +- (ABPadLockScreenView *)lockScreenView { + return (ABPadLockScreenView *) [self view]; +} + #pragma mark - #pragma mark - init methods - (instancetype)init @@ -48,7 +51,7 @@ - (instancetype)init _tapSoundEnabled = NO; _errorVibrateEnabled = NO; _currentPin = @""; - _complexPin = NO; + _complexPin = NO; //default to NO } return self; } @@ -68,7 +71,7 @@ - (id)initWithComplexPin:(BOOL)complexPin - (void)viewDidLoad { [super viewDidLoad]; - + CGRect bounds = self.view.bounds; if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) { if (bounds.size.width > bounds.size.height) { @@ -78,12 +81,13 @@ - (void)viewDidLoad bounds.size.width = width; } } - + self.view = [[ABPadLockScreenView alloc] initWithFrame:bounds complexPin:self.isComplexPin]; - + [self setUpButtonMapping]; - [lockScreenView.deleteButton addTarget:self action:@selector(deleteButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; - [lockScreenView.okButton addTarget:self action:@selector(okButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; + [self.lockScreenView.cancelButton addTarget:self action:@selector(cancelButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; + [self.lockScreenView.deleteButton addTarget:self action:@selector(deleteButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; + [self.lockScreenView.okButton addTarget:self action:@selector(okButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; } - (NSUInteger)supportedInterfaceOrientations @@ -91,35 +95,35 @@ - (NSUInteger)supportedInterfaceOrientations UIUserInterfaceIdiom interfaceIdiom = [[UIDevice currentDevice] userInterfaceIdiom]; if (interfaceIdiom == UIUserInterfaceIdiomPad) return UIInterfaceOrientationMaskAll; if (interfaceIdiom == UIUserInterfaceIdiomPhone) return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; - + return UIInterfaceOrientationMaskAll; } - (UIStatusBarStyle)preferredStatusBarStyle { - if(lockScreenView.backgroundView != nil) + if(self.lockScreenView.backgroundView != nil) { //Background view is shown - need light content status bar. return UIStatusBarStyleLightContent; } - + //Check background color if light or dark. - UIColor* color = lockScreenView.backgroundColor; - + UIColor* color = self.lockScreenView.backgroundColor; + if(color == nil) { - color = lockScreenView.backgroundColor = [UIColor blackColor]; + color = self.lockScreenView.backgroundColor = [UIColor blackColor]; } - + const CGFloat *componentColors = CGColorGetComponents(color.CGColor); - + //Determine brightness CGFloat colorBrightness = (CGColorGetNumberOfComponents(color.CGColor) == 2 ? //Black and white color componentColors[0] : //RGB color ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000); - + if (colorBrightness < 0.5) { return UIStatusBarStyleLightContent; @@ -140,35 +144,35 @@ - (void)viewWillAppear:(BOOL)animated - (void)setLockScreenTitle:(NSString *)title { self.title = title; - lockScreenView.enterPasscodeLabel.text = title; + self.lockScreenView.enterPasscodeLabel.text = title; } - (void)setSubtitleText:(NSString *)text { - lockScreenView.detailLabel.text = text; + self.lockScreenView.detailLabel.text = text; } - (void)setCancelButtonText:(NSString *)text { - [lockScreenView.cancelButton setTitle:text forState:UIControlStateNormal]; - [lockScreenView.cancelButton sizeToFit]; + [self.lockScreenView.cancelButton setTitle:text forState:UIControlStateNormal]; + [self.lockScreenView.cancelButton sizeToFit]; } - (void)setDeleteButtonText:(NSString *)text { - [lockScreenView.deleteButton setTitle:text forState:UIControlStateNormal]; - [lockScreenView.deleteButton sizeToFit]; + [self.lockScreenView.deleteButton setTitle:text forState:UIControlStateNormal]; + [self.lockScreenView.deleteButton sizeToFit]; } - (void)setEnterPasscodeLabelText:(NSString *)text { - lockScreenView.enterPasscodeLabel.text = text; + self.lockScreenView.enterPasscodeLabel.text = text; } - (void)setBackgroundView:(UIView *)backgroundView { - [lockScreenView setBackgroundView:backgroundView]; - + [self.lockScreenView setBackgroundView:backgroundView]; + if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) { [self setNeedsStatusBarAppearanceUpdate]; @@ -179,7 +183,7 @@ - (void)setBackgroundView:(UIView *)backgroundView #pragma mark - Helper Methods - (void)setUpButtonMapping { - for (UIButton *button in [lockScreenView buttonArray]) + for (UIButton *button in [self.lockScreenView buttonArray]) { [button addTarget:self action:@selector(buttonSelected:) forControlEvents:UIControlEventTouchUpInside]; } @@ -187,7 +191,7 @@ - (void)setUpButtonMapping - (void)cancelButtonDisabled:(BOOL)disabled { - lockScreenView.cancelButtonDisabled = disabled; + self.lockScreenView.cancelButtonDisabled = disabled; } - (void)processPin @@ -203,31 +207,31 @@ - (void)newPinSelected:(NSInteger)pinNumber { return; } - + self.currentPin = [NSString stringWithFormat:@"%@%ld", self.currentPin, (long)pinNumber]; - + if(self.isComplexPin) { - [lockScreenView updatePinTextfieldWithLength:self.currentPin.length]; + [self.lockScreenView updatePinTextfieldWithLength:self.currentPin.length]; } else { NSUInteger curSelected = [self.currentPin length] - 1; - [lockScreenView.digitsArray[curSelected] setSelected:YES animated:YES completion:nil]; + [self.lockScreenView.digitsArray[curSelected] setSelected:YES animated:YES completion:nil]; } - + if ([self.currentPin length] == 1) { - [lockScreenView showDeleteButtonAnimated:YES completion:nil]; - + [self.lockScreenView showDeleteButtonAnimated:YES completion:nil]; + if(self.complexPin) { - [lockScreenView showOKButton:YES animated:YES completion:nil]; + [self.lockScreenView showOKButton:YES animated:YES completion:nil]; } } else if (!self.isComplexPin && [self.currentPin length] == SIMPLE_PIN_LENGTH) { - [lockScreenView.digitsArray.lastObject setSelected:YES animated:YES completion:nil]; + [self.lockScreenView.digitsArray.lastObject setSelected:YES animated:YES completion:nil]; [self processPin]; } } @@ -238,23 +242,23 @@ - (void)deleteFromPin { return; } - + self.currentPin = [self.currentPin substringWithRange:NSMakeRange(0, [self.currentPin length] - 1)]; - + if(self.isComplexPin) { - [lockScreenView updatePinTextfieldWithLength:self.currentPin.length]; + [self.lockScreenView updatePinTextfieldWithLength:self.currentPin.length]; } else { NSUInteger pinToDeselect = [self.currentPin length]; - [lockScreenView.digitsArray[pinToDeselect] setSelected:NO animated:YES completion:nil]; + [self.lockScreenView.digitsArray[pinToDeselect] setSelected:NO animated:YES completion:nil]; } - + if ([self.currentPin length] == 0) { - [lockScreenView showCancelButtonAnimated:YES completion:nil]; - [lockScreenView showOKButton:NO animated:YES completion:nil]; + [self.lockScreenView showCancelButtonAnimated:YES completion:nil]; + [self.lockScreenView showOKButton:NO animated:YES completion:nil]; } } @@ -268,6 +272,14 @@ - (void)buttonSelected:(UIButton *)sender [self newPinSelected:tag]; } +- (void)cancelButtonSelected:(UIButton *)sender +{ + if ([self.delegate respondsToSelector:@selector(unlockWasCancelledForPadLockScreenViewController:)]) + { + [self.delegate unlockWasCancelledForPadLockScreenViewController:self]; + } +} + - (void)deleteButtonSelected:(UIButton *)sender { [self deleteFromPin]; diff --git a/ABPadLockScreen/ABPadLockScreenChangeOldViewController.h b/ABPadLockScreen/ABPadLockScreenChangeOldViewController.h new file mode 100644 index 0000000..10fcf43 --- /dev/null +++ b/ABPadLockScreen/ABPadLockScreenChangeOldViewController.h @@ -0,0 +1,35 @@ +// +// ABPadLockScreenChangeOldViewController.h +// ABPadLockScreenDemo +// +// Created by Lobanov Dmitry on 21.06.15. +// Copyright (c) 2015 Aron Bury. All rights reserved. +// + +#import "ABPadLockScreenAbstractViewController.h" +#import "ABPadLockScreenChangeOldViewControllerDelegate.h" + +@interface ABPadLockScreenChangeOldViewController : ABPadLockScreenAbstractViewController +@property (nonatomic, weak, readonly) id lockScreenDelegate; +@property (nonatomic, strong, readonly) NSString *subtitleLabelText; +@property (nonatomic, strong) NSString *oldPinPromptText; +@property (nonatomic, strong) NSString *futurePinPromptText; +@property (nonatomic, strong) NSString *oldPinNotMatchedText; +@property (nonatomic, strong) NSString *pinNotMatchedText; +@property (nonatomic, strong) NSString *pinConfirmationText; + +@property (nonatomic, assign, readonly) NSInteger totalAttempts; +@property (nonatomic, assign, readonly) NSInteger remainingAttempts; + +- (void)setAllowedAttempts:(NSInteger)allowedAttempts; + +- (void)setLockedOutText:(NSString *)title; +- (void)setPluralAttemptsLeftText:(NSString *)title; +- (void)setSingleAttemptLeftText:(NSString *)title; + +- (instancetype)initWithDelegate:(id)delegate; +- (instancetype)initWithDelegate:(id)delegate complexPin:(BOOL)complexPin; +- (instancetype)initWithDelegate:(id)delegate complexPin:(BOOL)complexPin subtitleLabelText:(NSString *)subtitleLabelText; +- (instancetype)initWithDelegate:(id)delegate complexPin:(BOOL)complexPin subtitleLabelText:(NSString *)subtitleLabelText oldPin:(NSString *)oldPin; + +@end \ No newline at end of file diff --git a/ABPadLockScreen/ABPadLockScreenChangeOldViewController.m b/ABPadLockScreen/ABPadLockScreenChangeOldViewController.m new file mode 100644 index 0000000..905308e --- /dev/null +++ b/ABPadLockScreen/ABPadLockScreenChangeOldViewController.m @@ -0,0 +1,284 @@ +// +// ABPadLockScreenChangeOldViewController.m +// ABPadLockScreenDemo +// +// Created by Lobanov Dmitry on 21.06.15. +// Copyright (c) 2015 Aron Bury. All rights reserved. +// + +#import "ABPadLockScreenChangeOldViewController.h" +#import "ABPadLockScreenView.h" +#import "ABPinSelectionView.h" +#import + +@interface ABPadLockScreenChangeOldViewController () { + struct { + NSUInteger attemptsExpired : 1; + NSUInteger pinSet : 1; + NSUInteger validatePin : 1; + NSUInteger unlockWasSuccessful : 1; + NSUInteger unlockWasUnsuccessfulAfterAttemptNumber : 1; + NSUInteger unlockWasCancelled : 1; + }_delegateFlags; +} + +@property (nonatomic, strong) NSString *oldPin; +@property (nonatomic, strong) NSString *enteredOldPin; +@property (nonatomic) BOOL oldPinValid; +@property (nonatomic, strong) NSString *enteredPin; + +@property (nonatomic, copy) NSString *lockedOutString; +@property (nonatomic, copy) NSString *pluralAttemptsLeftString; +@property (nonatomic, copy) NSString *singleAttemptLeftString; + +- (void)startPinConfirmation; +- (void)validateConfirmedPin; + + +@end + +@implementation ABPadLockScreenChangeOldViewController + +#pragma mark - +#pragma mark - Delegates setup + +- (void) setLockScreenDelegate:(id)lockScreenDelegate { + + _delegateFlags.attemptsExpired = [lockScreenDelegate respondsToSelector:@selector(attemptsExpiredForPadLockScreenViewController:)] + 0; + _delegateFlags.pinSet = [lockScreenDelegate respondsToSelector:@selector(pinSet:padLockScreenSetupViewController:)] + 0; + _delegateFlags.validatePin = [lockScreenDelegate respondsToSelector:@selector(padLockScreenViewController:validatePin:)] + 0; + _delegateFlags.unlockWasCancelled = [lockScreenDelegate respondsToSelector:@selector(unlockWasCancelledForPadLockScreenViewController:)] + 0; + _delegateFlags.unlockWasSuccessful = [lockScreenDelegate respondsToSelector:@selector(unlockWasSuccessfulForPadLockScreenViewController:)] + 0; + _delegateFlags.unlockWasUnsuccessfulAfterAttemptNumber = [lockScreenDelegate respondsToSelector:@selector(unlockWasUnsuccessful:afterAttemptNumber:padLockScreenViewController:)] + 0; + + _lockScreenDelegate = lockScreenDelegate; +} + +#pragma mark - +#pragma mark - Init Methods +- (instancetype)initWithDelegate:(id)delegate +{ + self = [self initWithDelegate:delegate complexPin:NO]; + return self; +} + +- (instancetype)initWithDelegate:(id)delegate complexPin:(BOOL)complexPin +{ + self = [super initWithComplexPin:complexPin]; + if (self) + { + self.delegate = delegate; + self.lockScreenDelegate = delegate; + _remainingAttempts = -1; + _enteredOldPin = nil; + _enteredPin = nil; + [self setDefaultTexts]; + } + return self; +} + +- (instancetype)initWithDelegate:(id)delegate complexPin:(BOOL)complexPin subtitleLabelText:(NSString *)subtitleLabelText +{ + self = [self initWithDelegate:delegate complexPin:complexPin]; + if (self) + { + _subtitleLabelText = subtitleLabelText; + dispatch_async(dispatch_get_main_queue(), ^{ + [self.lockScreenView updateDetailLabelWithString:_subtitleLabelText animated:NO completion:nil]; + }); + } + return self; +} + +- (instancetype)initWithDelegate:(id)delegate complexPin:(BOOL)complexPin subtitleLabelText:(NSString *)subtitleLabelText oldPin:(NSString *)oldPin { + self = [self initWithDelegate:delegate complexPin:complexPin subtitleLabelText:subtitleLabelText]; + + if (self) + { + _oldPin = [oldPin copy]; + } + return self; +} + +- (void)setDefaultTexts +{ + _lockedOutString = NSLocalizedString(@"You have been locked out.", @""); + _pluralAttemptsLeftString = NSLocalizedString(@"attempts left", @""); + _singleAttemptLeftString = NSLocalizedString(@"attempt left", @""); + _futurePinPromptText = NSLocalizedString(@"Enter your future pincode", @""); +// _oldPinConfirmationText = NSLocalizedString(@"Enter your old pincode", @""); + _oldPinNotMatchedText = NSLocalizedString(@"Old pincode did not match.", @""); + _pinNotMatchedText = NSLocalizedString(@"Pincode did not match.", @""); + _pinConfirmationText = NSLocalizedString(@"Re-enter your new pincode", @""); +} + +#pragma mark - +#pragma mark - Attempts +- (void)setAllowedAttempts:(NSInteger)allowedAttempts +{ + _totalAttempts = 0; + _remainingAttempts = allowedAttempts; +} + +#pragma mark - +#pragma mark - Localisation Methods +- (void)setLockedOutText:(NSString *)title +{ + _lockedOutString = title; +} + +- (void)setPluralAttemptsLeftText:(NSString *)title +{ + _pluralAttemptsLeftString = title; +} + +- (void)setSingleAttemptLeftText:(NSString *)title +{ + _singleAttemptLeftString = title; +} + + +#pragma mark - +#pragma mark - Pin Processing +- (void)processPin +{ + + if (self.oldPinValid) { + [self processNewPin]; + } + else { + [self validateOldPin]; + } +} + +- (void)processNewPin +{ + if (!self.enteredPin) + { + [self startPinConfirmation]; + } + else + { + [self validateConfirmedPin]; + } +} + +- (void)processFuturePin +{ + self.currentPin = @""; + [self.lockScreenView updateDetailLabelWithString:self.futurePinPromptText animated:YES completion:nil]; + [self.lockScreenView resetAnimated:YES]; +} + +- (void)processOldPinFailure +{ + _remainingAttempts --; + _totalAttempts ++; + [self.lockScreenView resetAnimated:YES]; + [self.lockScreenView animateFailureNotification]; + + if (self.remainingAttempts > 1) + { + [self.lockScreenView updateDetailLabelWithString:[NSString stringWithFormat:@"%ld %@", (long)self.remainingAttempts, self.pluralAttemptsLeftString] + animated:YES completion:nil]; + } + else if (self.remainingAttempts == 1) + { + [self.lockScreenView updateDetailLabelWithString:[NSString stringWithFormat:@"%ld %@", (long)self.remainingAttempts, self.singleAttemptLeftString] + animated:YES completion:nil]; + } + else if (self.remainingAttempts == 0) + { + [self lockScreen]; + } + + if (_delegateFlags.unlockWasUnsuccessfulAfterAttemptNumber) + { + [self.lockScreenDelegate unlockWasUnsuccessful:self.currentPin afterAttemptNumber:self.totalAttempts padLockScreenViewController:self]; + } +} + +- (BOOL)isOldPin:(NSString *)oldPin validToPin:(NSString *)enteredOldPin +{ + if (_delegateFlags.validatePin) { + return [self.lockScreenDelegate padLockScreenViewController:self validatePin:enteredOldPin]; + } + else { + return [oldPin isEqualToString:enteredOldPin]; + } +} + +- (void)validateOldPin +{ + + if (!self.enteredOldPin) { + self.enteredOldPin = [self.currentPin copy]; + } + + self.oldPinValid = [self isOldPin:self.oldPin validToPin:self.enteredOldPin]; + if (!self.oldPinValid) + { + [self.lockScreenView updateDetailLabelWithString:self.oldPinNotMatchedText animated:YES completion:nil]; + [self.lockScreenView animateFailureNotification]; + [self.lockScreenView resetAnimated:YES]; + self.enteredOldPin = nil; + self.currentPin = @""; + [self processOldPinFailure]; + } + else { + [self processFuturePin]; + + if (_delegateFlags.unlockWasSuccessful) + { + [self.lockScreenDelegate unlockWasSuccessfulForPadLockScreenViewController:self]; + } + } +} + +- (void)startPinConfirmation +{ + self.enteredPin = [self.currentPin copy]; + self.currentPin = @""; + [self.lockScreenView updateDetailLabelWithString:self.pinConfirmationText animated:YES completion:nil]; + [self.lockScreenView resetAnimated:YES]; +} + +- (void)validateConfirmedPin +{ + if ([self.currentPin isEqualToString:self.enteredPin]) + { + if (_delegateFlags.pinSet) + { + [self.lockScreenDelegate pinSet:self.currentPin padLockScreenSetupViewController:self]; + } + } + else + { + [self.lockScreenView updateDetailLabelWithString:self.pinNotMatchedText animated:YES completion:nil]; + [self.lockScreenView animateFailureNotification]; + [self.lockScreenView resetAnimated:YES]; + self.enteredPin = nil; + self.currentPin = @""; + [self processFuturePin]; + // viberate feedback + if (self.errorVibrateEnabled) + { + AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); + } + } +} + +#pragma mark - +#pragma mark - Pin Selection +- (void)lockScreen +{ + [self.lockScreenView updateDetailLabelWithString:self.lockedOutString animated:YES completion:nil]; + [self.lockScreenView lockViewAnimated:YES completion:nil]; + + if (_delegateFlags.attemptsExpired) + { + [self.lockScreenDelegate attemptsExpiredForPadLockScreenViewController:self]; + } +} + +@end diff --git a/ABPadLockScreen/ABPadLockScreenChangeOldViewControllerDelegate.h b/ABPadLockScreen/ABPadLockScreenChangeOldViewControllerDelegate.h new file mode 100644 index 0000000..714116c --- /dev/null +++ b/ABPadLockScreen/ABPadLockScreenChangeOldViewControllerDelegate.h @@ -0,0 +1,54 @@ +// +// ABPadLockScreenChangeOldViewControllerDelegate.h +// ABPadLockScreenDemo +// +// Created by Lobanov Dmitry on 21.06.15. +// Copyright (c) 2015 Aron Bury. All rights reserved. +// + +#import +#import "ABPadLockScreenDelegate.h" + +@class ABPadLockScreenChangeOldViewController; + +@protocol ABPadLockScreenChangeOldViewControllerDelegate + +@required + +/** + Called when the unlock was completed successfully + */ +- (void)unlockWasSuccessfulForPadLockScreenViewController:(ABPadLockScreenChangeOldViewController *)padLockScreenViewController; + +/** + Called when an unlock was unsuccessfully, providing the entry code and the attempt number + */ +- (void)unlockWasUnsuccessful:(NSString *)falsePin afterAttemptNumber:(NSInteger)attemptNumber padLockScreenViewController:(ABPadLockScreenChangeOldViewController *)padLockScreenViewController; + +/** + Called when the user cancels the unlock + */ +- (void)unlockWasCancelledForPadLockScreenViewController:(ABPadLockScreenChangeOldViewController *)padLockScreenViewController; + + +/** + Called when the user set new pin successfully + */ +- (void)pinSet:(NSString *)pin padLockScreenSetupViewController:(ABPadLockScreenChangeOldViewController *)padLockScreenViewController; + + +@optional + +/** + Called when pin validation is needed + */ +- (BOOL)padLockScreenViewController:(ABPadLockScreenChangeOldViewController *)padLockScreenViewController validatePin:(NSString*)pin; + +/** + Called when the user has expired their attempts + */ +- (void)attemptsExpiredForPadLockScreenViewController:(ABPadLockScreenChangeOldViewController *)padLockScreenViewController; + + + +@end diff --git a/ABPadLockScreen/ABPadLockScreenDelegate.h b/ABPadLockScreen/ABPadLockScreenDelegate.h new file mode 100644 index 0000000..fc63b79 --- /dev/null +++ b/ABPadLockScreen/ABPadLockScreenDelegate.h @@ -0,0 +1,18 @@ +// +// ABPadLockScreenDelegate.h +// ABPadLockScreenDemo +// +// Created by Lobanov Dmitry on 21.06.15. +// Copyright (c) 2015 Aron Bury. All rights reserved. +// + +#import + +@class ABPadLockScreenAbstractViewController; + +@protocol ABPadLockScreenDelegate + +@required +- (void)unlockWasCancelledForPadLockScreenViewController:(ABPadLockScreenAbstractViewController *)padLockScreenViewController; + +@end diff --git a/ABPadLockScreenDemo/ABPadLockScreenDemo.xcodeproj/project.pbxproj b/ABPadLockScreenDemo/ABPadLockScreenDemo.xcodeproj/project.pbxproj index 8c6e6a6..a0b5c63 100755 --- a/ABPadLockScreenDemo/ABPadLockScreenDemo.xcodeproj/project.pbxproj +++ b/ABPadLockScreenDemo/ABPadLockScreenDemo.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 04BD51781B8B5C5200762F29 /* ABPadLockScreenChangeOldViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 04BD51761B8B5C5200762F29 /* ABPadLockScreenChangeOldViewController.m */; }; 9C79B0D8188A184A00D465D8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C79B0D7188A184A00D465D8 /* Foundation.framework */; }; 9C79B0DA188A184A00D465D8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C79B0D9188A184A00D465D8 /* CoreGraphics.framework */; }; 9C79B0DC188A184A00D465D8 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C79B0DB188A184A00D465D8 /* UIKit.framework */; }; @@ -45,6 +46,10 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 04BD51751B8B5C5200762F29 /* ABPadLockScreenChangeOldViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABPadLockScreenChangeOldViewController.h; sourceTree = ""; }; + 04BD51761B8B5C5200762F29 /* ABPadLockScreenChangeOldViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ABPadLockScreenChangeOldViewController.m; sourceTree = ""; }; + 04BD51771B8B5C5200762F29 /* ABPadLockScreenChangeOldViewControllerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABPadLockScreenChangeOldViewControllerDelegate.h; sourceTree = ""; }; + 04BD51791B8B5D1F00762F29 /* ABPadLockScreenDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABPadLockScreenDelegate.h; sourceTree = ""; }; 9C79B0D4188A184A00D465D8 /* ABPadLockScreenDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ABPadLockScreenDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9C79B0D7188A184A00D465D8 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 9C79B0D9188A184A00D465D8 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -220,6 +225,10 @@ 9CC50D30188A797700DBC969 /* Controller */ = { isa = PBXGroup; children = ( + 04BD51791B8B5D1F00762F29 /* ABPadLockScreenDelegate.h */, + 04BD51751B8B5C5200762F29 /* ABPadLockScreenChangeOldViewController.h */, + 04BD51761B8B5C5200762F29 /* ABPadLockScreenChangeOldViewController.m */, + 04BD51771B8B5C5200762F29 /* ABPadLockScreenChangeOldViewControllerDelegate.h */, 9CC50D37188A803200DBC969 /* ABPadLockScreenSetupViewController.h */, 9CC50D38188A803200DBC969 /* ABPadLockScreenSetupViewController.m */, 9CC50D27188A797400DBC969 /* ABPadLockScreenViewController.h */, @@ -346,6 +355,7 @@ 9C79B10C188A18A100D465D8 /* ABPadLockScreenAppDelegate.m in Sources */, 9CC50D2B188A797400DBC969 /* ABPadButton.m in Sources */, 9CC50D2F188A797400DBC969 /* ABPinSelectionView.m in Sources */, + 04BD51781B8B5C5200762F29 /* ABPadLockScreenChangeOldViewController.m in Sources */, 9CC50D2E188A797400DBC969 /* ABPadLockScreenViewController.m in Sources */, 9C79B0E4188A184A00D465D8 /* main.m in Sources */, 9CC50D1D188A73D100DBC969 /* UIColor+HexValue.m in Sources */, diff --git a/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.h b/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.h index 65d7ddc..3bd91a7 100644 --- a/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.h +++ b/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.h @@ -8,7 +8,8 @@ #import "ABPadLockScreenViewController.h" #import "ABPadLockScreenSetupViewController.h" +#import "ABPadLockScreenChangeOldViewController.h" -@interface ExampleViewController : UIViewController +@interface ExampleViewController : UIViewController @end diff --git a/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.m b/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.m index d127909..13de1e9 100644 --- a/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.m +++ b/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.m @@ -61,6 +61,20 @@ - (IBAction)setPin:(id)sender [self presentViewController:lockScreen animated:YES completion:nil]; } +- (IBAction)changePin:(id)sender { + if (!self.thePin) { + [[[UIAlertView alloc] initWithTitle:@"No Pin" message:@"Please Set a pin before trying to change it" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; + return; + } + + ABPadLockScreenChangeOldViewController *changePin = [[ABPadLockScreenChangeOldViewController alloc] initWithDelegate:self complexPin:YES]; + [changePin setAllowedAttempts:3]; + changePin.modalPresentationStyle = UIModalPresentationFullScreen; + changePin.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; + + [self presentViewController:changePin animated:YES completion:nil]; +} + - (IBAction)lockApp:(id)sender { if (!self.thePin) @@ -96,7 +110,13 @@ - (BOOL)padLockScreenViewController:(ABPadLockScreenViewController *)padLockScre - (void)unlockWasSuccessfulForPadLockScreenViewController:(ABPadLockScreenViewController *)padLockScreenViewController { - [self dismissViewControllerAnimated:YES completion:nil]; + if ([padLockScreenViewController isKindOfClass:[ABPadLockScreenChangeOldViewController class]]) { + + } + else { + [self dismissViewControllerAnimated:YES completion:nil]; + } + NSLog(@"Pin entry successfull"); } diff --git a/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.xib b/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.xib index 4558e5d..a60b1a0 100644 --- a/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.xib +++ b/ABPadLockScreenDemo/ABPadLockScreenDemo/Your Modules/ExampleViewController.xib @@ -1,7 +1,8 @@ - + - + + @@ -35,6 +36,15 @@ + @@ -43,13 +53,18 @@ + + - - + + + + +