Initial commit
This commit is contained in:
BIN
EonaCatTools/Tools/Lockscreen/.DS_Store
vendored
Normal file
BIN
EonaCatTools/Tools/Lockscreen/.DS_Store
vendored
Normal file
Binary file not shown.
@@ -0,0 +1,6 @@
|
||||
// Dutch language file
|
||||
|
||||
"Please wait" = "Een ogenblik geduld";
|
||||
"Decimal title" = "Alleen nummers";
|
||||
"Decimal message" = "Alleen nummers zijn toegestaan";
|
||||
"OK" = "OK";
|
||||
@@ -0,0 +1,6 @@
|
||||
// English language file
|
||||
|
||||
"Please wait" = "Please wait";
|
||||
"Decimal title" = "Decimals only";
|
||||
"Decimal message" = "You can only insert decimals";
|
||||
"OK" = "OK";
|
||||
73
EonaCatTools/Tools/Lockscreen/LockController.h
Normal file
73
EonaCatTools/Tools/Lockscreen/LockController.h
Normal file
@@ -0,0 +1,73 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
//
|
||||
// LockController.h
|
||||
// Created by EonaCat
|
||||
// Copyright 2013 EonaCat. All rights reserved.
|
||||
//
|
||||
|
||||
typedef enum
|
||||
{
|
||||
AUTHENTICATE,
|
||||
SET
|
||||
} STYLE;
|
||||
|
||||
@protocol LockControllerDelegate
|
||||
|
||||
@required
|
||||
//- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
||||
- (void)lockControllerDidFinish:(NSString*)passcode tag:(NSInteger)tag;
|
||||
- (void)lockControllerIncorrectPassword:(NSString*)incorrectPassword tag:(NSInteger)tag;
|
||||
- (void)lockControllerDidCancel:(NSInteger)tag;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface LockController : UIViewController <UITextFieldDelegate>
|
||||
{
|
||||
//Public
|
||||
STYLE style;
|
||||
NSString *passcode;
|
||||
NSString *givenPasscode;
|
||||
NSString *title;
|
||||
UILabel *promptLabel;
|
||||
UILabel *subPromptLabel;
|
||||
UILabel *hintLabel;
|
||||
UIAlertView *alert;
|
||||
int _deviceWidth;
|
||||
|
||||
id <LockControllerDelegate> __weak delegate;
|
||||
BOOL hideCode;
|
||||
|
||||
//Private
|
||||
BOOL _iPad;
|
||||
BOOL retry;
|
||||
NSMutableString *tempString;
|
||||
|
||||
UITextField *hiddenField;
|
||||
UINavigationItem *navigationItem;
|
||||
NSMutableArray *textFieldArray;
|
||||
}
|
||||
|
||||
@property (nonatomic, weak) id delegate;
|
||||
@property (nonatomic, copy) NSString *title;
|
||||
@property (nonatomic) STYLE style;
|
||||
@property (nonatomic, strong) UIColor *color;
|
||||
@property (nonatomic, strong) UIColor *color2;
|
||||
@property (nonatomic, strong) NSString *passcode;
|
||||
@property (nonatomic, strong) NSString *prompt;
|
||||
@property (nonatomic, strong) NSString *subPrompt;
|
||||
@property (nonatomic, strong) NSString *hint;
|
||||
@property (nonatomic, strong) NSString *correct;
|
||||
@property (nonatomic) NSInteger tag;
|
||||
@property (nonatomic) BOOL cancel;
|
||||
@property (nonatomic) NSInteger fieldsAmount;
|
||||
@property (nonatomic) BOOL hideCode;
|
||||
@property (nonatomic) BOOL 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;
|
||||
|
||||
- (void)incorrect;
|
||||
- (void)finished;
|
||||
|
||||
@end
|
||||
444
EonaCatTools/Tools/Lockscreen/LockController.m
Normal file
444
EonaCatTools/Tools/Lockscreen/LockController.m
Normal file
@@ -0,0 +1,444 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user