445 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			445 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| #import "LockController.h"
 | |
| #import <QuartzCore/QuartzCore.h>
 | |
| 
 | |
| //
 | |
| //  LockController.m
 | |
| //  Created by EonaCat
 | |
| //  Copyright 2013 EonaCat. All rights reserved.
 | |
| //
 | |
| 
 | |
| //private methods
 | |
| @interface LockController()
 | |
| 
 | |
| - (void)setupSubviews;
 | |
| - (void)setupNavigationBar;
 | |
| - (void)setupTextFields;
 | |
| - (void)resetFields;
 | |
| - (void)passcodeDidNotMatch:(NSString*)incorrectPassword;
 | |
| - (void)dissmissView;
 | |
| 
 | |
| @property (nonatomic, strong) NSMutableString *tempString;
 | |
| @property (nonatomic, strong) UITextField *hiddenField;
 | |
| @property (nonatomic, strong) UINavigationItem *navigationItem;
 | |
| 
 | |
| @end
 | |
| 
 | |
| @implementation LockController
 | |
| 
 | |
| @synthesize delegate;
 | |
| @synthesize style;
 | |
| @synthesize passcode;
 | |
| @synthesize prompt;
 | |
| @synthesize subPrompt;
 | |
| @synthesize hint;
 | |
| @synthesize hiddenField;
 | |
| @synthesize navigationItem;
 | |
| @synthesize tempString;
 | |
| @synthesize title;
 | |
| @synthesize hideCode;
 | |
| @synthesize waitingAlert;
 | |
| 
 | |
| - (id)initWithTitle:(NSString*)newTitle prompt:(NSString*)newPrompt errorMessage:(NSString*)newSubPrompt correctMessage:(NSString*)newCorrectMessage passCode:(NSString*)newPasscode hint:(NSString*)newHint color:(UIColor*)newColor color2:(UIColor*)newColor2 fieldAmount:(NSInteger)newFieldAmount style:(STYLE)newStyle delegate:(id)newDelegate tag:(NSInteger)newTag cancelButton:(BOOL)cancelButton
 | |
| {
 | |
| 	if (self = [super init])
 | |
|     {
 | |
|         _iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
 | |
|         
 | |
|         if (_iPad)
 | |
|         {
 | |
|             _deviceWidth = 768;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             _deviceWidth = 320;
 | |
|         }
 | |
|         
 | |
|         newTitle == nil ? [NSString stringWithFormat:@"Security"] : newTitle;
 | |
|         newPrompt == nil ? [NSString stringWithFormat:@"Insert pincode"] : newPrompt;
 | |
|         newSubPrompt == nil ? [NSString stringWithFormat:@"Invalid code"] : newSubPrompt;
 | |
|         newHint == nil ? [NSString stringWithFormat:@"As a security you need to supply a pincode"] : newHint;
 | |
|         newColor == nil ? [UIColor whiteColor] : newColor;
 | |
|         newColor2 == nil ? [UIColor whiteColor] : newColor2;
 | |
|         //newFieldAmount == 0 ? 4 : newFieldAmount;
 | |
|         newCorrectMessage == nil ? [NSString stringWithFormat:@"Code is valid"] : newCorrectMessage;
 | |
|         newPasscode == nil ? [NSString stringWithFormat:@"0000"] : newCorrectMessage;
 | |
|         
 | |
|         self.cancel = cancelButton;
 | |
|         self.tag = newTag;
 | |
|         self.title = newTitle;
 | |
|         self.prompt = newPrompt;
 | |
|         self.subPrompt = newSubPrompt;
 | |
|         self.hint = newHint;
 | |
|         self.color = newColor;
 | |
|         self.color2 = newColor2;
 | |
|         self.correct = newCorrectMessage;
 | |
|         self.passcode = newPasscode;
 | |
| 		self.style = newStyle;
 | |
|         self.fieldsAmount = newFieldAmount;
 | |
|         self.delegate = newDelegate;
 | |
|         
 | |
| 		self.tempString = [NSMutableString string];
 | |
| 		self.hideCode = true;
 | |
|         self.waitingAlert = false;
 | |
| 	}
 | |
| 	
 | |
| 	return self;
 | |
| }
 | |
| 
 | |
| 
 | |
| - (void)viewDidLoad
 | |
| {
 | |
|     [super viewDidLoad];
 | |
| 	
 | |
| 	//needs a delegate
 | |
| 	assert (delegate != nil);
 | |
| 	
 | |
| 	//check if passcode is set for AUTHENTICATION
 | |
| 	if (style == AUTHENTICATE)
 | |
|     {
 | |
| 		assert (passcode != nil);
 | |
| 	}
 | |
| 	
 | |
| 	[self setupSubviews];
 | |
| 	
 | |
| }
 | |
| 
 | |
| -(void)handleSingleTap:(UITapGestureRecognizer *)sender
 | |
| {
 | |
|     [alert dismissWithClickedButtonIndex:0 animated:YES];
 | |
| }
 | |
| 
 | |
| - (void)setupSubviews
 | |
| {
 | |
| 	self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
 | |
|     
 | |
|     if (self.waitingAlert)
 | |
|     {
 | |
|         //Alert
 | |
|         alert = [[UIAlertView alloc] initWithTitle:NSLocalizedStringFromTable(@"Status", @"LockController", @"Status")
 | |
|                                            message:NSLocalizedStringFromTable(@"Please wait", @"LockController", @"Please wait")
 | |
|                                           delegate:self
 | |
|                                  cancelButtonTitle:nil
 | |
|                                  otherButtonTitles:nil, nil];
 | |
|         
 | |
|         UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
 | |
|         [alert addGestureRecognizer:singleTap];
 | |
|     }
 | |
|     
 | |
| 	//main prompt
 | |
|     promptLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 70, _deviceWidth, 25)];
 | |
| 	promptLabel.textAlignment = NSTextAlignmentCenter;
 | |
| 	promptLabel.backgroundColor = [UIColor clearColor];
 | |
| 	promptLabel.shadowColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.50];
 | |
| 	promptLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]];
 | |
|     promptLabel.shadowOffset = CGSizeMake(0, -0.75);
 | |
| 	promptLabel.textColor = [UIColor blackColor];
 | |
|     promptLabel.text = prompt;
 | |
| 	[self.view addSubview:promptLabel];
 | |
|     
 | |
|     //subPrompt
 | |
|     subPromptLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 90, _deviceWidth, 25)];
 | |
| 	subPromptLabel.textAlignment = NSTextAlignmentCenter;
 | |
| 	subPromptLabel.backgroundColor = [UIColor clearColor];
 | |
| 	subPromptLabel.textColor = [UIColor redColor];
 | |
| 	subPromptLabel.font = [UIFont systemFontOfSize:14];
 | |
|     subPromptLabel.text = subPrompt;
 | |
|     subPromptLabel.hidden = true;
 | |
| 	[self.view addSubview:subPromptLabel];
 | |
|     
 | |
|     // hint
 | |
| 	hintLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 160, _deviceWidth, 100)];
 | |
| 	hintLabel.textAlignment = NSTextAlignmentCenter;
 | |
| 	hintLabel.backgroundColor = [UIColor clearColor];
 | |
| 	hintLabel.shadowColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.50];
 | |
| 	hintLabel.font = [UIFont systemFontOfSize:14];
 | |
|     hintLabel.shadowOffset = CGSizeMake(0, -0.75);
 | |
|     hintLabel.numberOfLines = 2;
 | |
| 	hintLabel.textColor = [UIColor blackColor];
 | |
|     hintLabel.text = hint;
 | |
| 	[self.view addSubview:hintLabel];
 | |
|     
 | |
| 	//bar
 | |
| 	[self setupNavigationBar];
 | |
|     
 | |
| 	//text fields
 | |
| 	[self setupTextFields];
 | |
| }
 | |
| 
 | |
| - (void)setupNavigationBar
 | |
| {
 | |
|     UINavigationBar *navBar;
 | |
|     
 | |
|     navBar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0,0,_deviceWidth,50)];
 | |
|     navBar.barStyle = UIBarStyleBlack;
 | |
| 	[self.view addSubview:navBar];
 | |
| 	navigationItem = [[UINavigationItem alloc]init];
 | |
|     
 | |
|     if (self.cancel)
 | |
|     {
 | |
|         [navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
 | |
|                                                                                            target:self
 | |
|                                                                                            action:@selector(userDidCancel:)]
 | |
|                                      animated:NO];
 | |
|     }
 | |
| 	
 | |
| 	[navBar pushNavigationItem:navigationItem animated:NO];
 | |
| 	
 | |
| 	navigationItem.title = title;
 | |
|     
 | |
|     if (self.color)
 | |
|     {
 | |
|         CAGradientLayer *gradient = [CAGradientLayer layer];
 | |
|         gradient.frame = self.view.bounds;
 | |
|         gradient.colors = @[(id)[self.color CGColor], (id)[self.color2 CGColor],(id)[self.color CGColor], (id)[self.color CGColor]];
 | |
|         [self.view.layer insertSublayer:gradient atIndex:0];
 | |
|         
 | |
|         if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0)
 | |
|         {
 | |
|             [navBar setTintColor:self.color];
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             [navBar setBarTintColor:self.color];
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (void)setupTextFields
 | |
| {
 | |
| 	int toppadding;
 | |
| 	int leftpadding;
 | |
| 	int width;
 | |
| 	int height;
 | |
| 	int padding;
 | |
|     CGFloat fontsize;
 | |
|     
 | |
|     
 | |
|     if (_iPad)
 | |
|     {
 | |
|         if (_fieldsAmount == 4)
 | |
|         {
 | |
|             leftpadding = 150;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             leftpadding = 130;
 | |
|         }
 | |
|         
 | |
|         width = 100;
 | |
|         height = 100;
 | |
|         toppadding = 250;
 | |
|         padding = 60;
 | |
|         fontsize = 64;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         if (_fieldsAmount == 4)
 | |
|         {
 | |
|             leftpadding = 40;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             leftpadding = 20;
 | |
|         }
 | |
|         width = 50;
 | |
|         height = 50;
 | |
|         toppadding = 125;
 | |
|         padding = 30;
 | |
|         fontsize = 32;
 | |
|     }
 | |
|     
 | |
|     // Initialise the textField array
 | |
|     textFieldArray = [NSMutableArray array];
 | |
|     
 | |
|     for (int i = 0; i < self.fieldsAmount; i++)
 | |
|     {
 | |
|         UITextField *textField;
 | |
|         
 | |
|         textField = [[UITextField alloc]initWithFrame:CGRectMake(leftpadding + width*i + padding,toppadding,width,height)];
 | |
|         
 | |
|         textField.backgroundColor = [UIColor whiteColor];
 | |
|         textField.borderStyle = UITextBorderStyleBezel;
 | |
|         textField.secureTextEntry = self.hideCode;
 | |
|         textField.font = [UIFont systemFontOfSize:fontsize];
 | |
|         textField.textAlignment = NSTextAlignmentCenter;
 | |
|         textField.tag = i;
 | |
|         textField.enabled = false;
 | |
|         
 | |
|         [self.view addSubview:textField];
 | |
|         [textFieldArray addObject:textField];
 | |
|     }
 | |
|     
 | |
| 	hiddenField = [[UITextField alloc]initWithFrame:CGRectMake(0,0,500,500)];
 | |
| 	hiddenField.text = @"";
 | |
| 	hiddenField.keyboardType = UIKeyboardTypeNumberPad;
 | |
|     hiddenField.keyboardAppearance = UIKeyboardAppearanceAlert;
 | |
| 	hiddenField.delegate = self;
 | |
|     hiddenField.hidden = true;
 | |
| 	[hiddenField becomeFirstResponder];
 | |
|     [self.view setBackgroundColor:[UIColor whiteColor]];
 | |
| 	[self.view addSubview:hiddenField];
 | |
| }
 | |
| 
 | |
| -(BOOL)checkDecimal:(NSString *)string
 | |
| {
 | |
|     NSNumberFormatter *numberFormat = [[NSNumberFormatter alloc] init];
 | |
|     BOOL isDecimal = [numberFormat numberFromString:string] != nil;
 | |
|     
 | |
|     if (!isDecimal)
 | |
|     {
 | |
|         UIAlertView * decimalAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedStringFromTable(@"Decimal title", @"LockController", @"Decimal title")
 | |
|                                                                 message:NSLocalizedStringFromTable(@"Decimal message", @"LockController", @"Decimal message")
 | |
|                                                                delegate:self
 | |
|                                                       cancelButtonTitle:@"OK"
 | |
|                                                       otherButtonTitles:nil, nil];
 | |
|         [decimalAlert show];
 | |
|     }
 | |
|     return isDecimal;
 | |
| }
 | |
| 
 | |
| - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 | |
| {
 | |
|     @try
 | |
|     {
 | |
|         if ([string isEqualToString:@""] || [self checkDecimal:string])
 | |
|         {
 | |
|             UITextField *currentTextField;
 | |
|             
 | |
|             // Check if the backSpace was pressed
 | |
|             if ([string isEqualToString:@""])
 | |
|             {
 | |
|                 [self.tempString setString:[self.tempString substringToIndex:[self.tempString length]-1]];
 | |
|                 currentTextField = textFieldArray[[self.tempString length]];
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 [self.tempString appendString:string];
 | |
|                 currentTextField = textFieldArray[[self.tempString length] -1];
 | |
|             }
 | |
|             
 | |
|             currentTextField.text = string;
 | |
|             
 | |
|             // we have reached the maximum characters
 | |
|             if ([self.tempString length] == [textFieldArray count])
 | |
|             {
 | |
|                 if (self.style == SET)
 | |
|                 {
 | |
|                     if (passcode == nil)
 | |
|                     {
 | |
|                         //empty tempstring to passcode string
 | |
|                         passcode = [self.tempString copy];
 | |
|                         
 | |
|                         self.tempString = [NSMutableString string];
 | |
|                         
 | |
|                         //reset fields
 | |
|                         [self resetFields];
 | |
|                         textField.text = @"";
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         //check if confirm matches first
 | |
|                         givenPasscode = [self.tempString copy];
 | |
|                         if ([passcode isEqualToString:self.tempString])
 | |
|                         {
 | |
|                             subPromptLabel.textColor = [UIColor greenColor];
 | |
|                             subPromptLabel.text = self.correct;
 | |
|                             [delegate lockControllerDidFinish:givenPasscode tag:self.tag];
 | |
|                             [self dissmissView];
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             [self passcodeDidNotMatch:givenPasscode];
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|                 else if(self.style == AUTHENTICATE)
 | |
|                 {
 | |
|                     givenPasscode = [self.tempString copy];
 | |
|                     if ([passcode isEqualToString:self.tempString])
 | |
|                     {
 | |
|                         subPromptLabel.textColor = [UIColor greenColor];
 | |
|                         subPromptLabel.text = self.correct;
 | |
|                         [delegate lockControllerDidFinish:givenPasscode tag:self.tag];
 | |
|                         [self dissmissView];
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         [self passcodeDidNotMatch:givenPasscode];
 | |
|                     }
 | |
|                     return false;
 | |
|                 }
 | |
|             }
 | |
|             return true;
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
|     @catch (NSException *exception)
 | |
|     {
 | |
|         // Do nothing
 | |
|     }
 | |
| }
 | |
| 
 | |
| - (void)passcodeDidNotMatch:(NSString*)incorrectPassword
 | |
| {
 | |
|     if (self.waitingAlert)
 | |
|     {
 | |
|         [alert show];
 | |
|     }
 | |
|     
 | |
| 	self.tempString = [NSMutableString string];
 | |
|     
 | |
|     subPromptLabel.textColor = [UIColor redColor];
 | |
|     subPromptLabel.text = self.subPrompt;
 | |
| 	subPromptLabel.hidden = false;
 | |
|     
 | |
| 	[self resetFields];
 | |
|     [delegate lockControllerIncorrectPassword:incorrectPassword tag:self.tag];
 | |
| }
 | |
| 
 | |
| - (void)resetFields
 | |
| {
 | |
|     for (UITextField *textField in textFieldArray)
 | |
|     {
 | |
|         textField.text = @"";
 | |
|     }
 | |
| 	hiddenField.text = @"";
 | |
| }
 | |
| 
 | |
| - (void)incorrect
 | |
| {
 | |
|     if (self.waitingAlert)
 | |
|     {
 | |
|         [alert dismissWithClickedButtonIndex:0 animated:true];
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| - (void)finished
 | |
| {
 | |
|     if (self.waitingAlert)
 | |
|     {
 | |
|         [alert dismissWithClickedButtonIndex:0 animated:true];
 | |
|     }
 | |
|     
 | |
|     subPromptLabel.textColor = [UIColor greenColor];
 | |
|     subPromptLabel.text = self.correct;
 | |
| }
 | |
| 
 | |
| - (void)dissmissView
 | |
| {
 | |
| 	[self dismissViewControllerAnimated:TRUE completion:nil];	
 | |
| }
 | |
| 
 | |
| - (void)userDidCancel:(id)sender
 | |
| {
 | |
| 	[delegate lockControllerDidCancel:self.tag];
 | |
| 	[self dissmissView];
 | |
| }
 | |
| 
 | |
| - (void)didReceiveMemoryWarning
 | |
| {
 | |
|     [super didReceiveMemoryWarning];
 | |
| }
 | |
| 
 | |
| @end
 |