EonaCat-Tools/EonaCatTools/Tools/Lockscreen/LockController.m

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