2
0

Better password font.

[FIXED]     MP-10: The font used to show didn't make a clear enough
            distinction between certain different characters.
This commit is contained in:
Maarten Billemont 2012-03-04 10:12:32 +01:00
parent d34ec96b94
commit 9899104891
22 changed files with 242 additions and 174 deletions

View File

@ -107,6 +107,15 @@
DA5BFA5B147E415C00F98B1E /* MPAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5BFA5A147E415C00F98B1E /* MPAppDelegate.m */; }; DA5BFA5B147E415C00F98B1E /* MPAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5BFA5A147E415C00F98B1E /* MPAppDelegate.m */; };
DA5BFA64147E415C00F98B1E /* MasterPassword.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = DA5BFA62147E415C00F98B1E /* MasterPassword.xcdatamodeld */; }; DA5BFA64147E415C00F98B1E /* MasterPassword.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = DA5BFA62147E415C00F98B1E /* MasterPassword.xcdatamodeld */; };
DA5BFA67147E415C00F98B1E /* MPMainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5BFA66147E415C00F98B1E /* MPMainViewController.m */; }; DA5BFA67147E415C00F98B1E /* MPMainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5BFA66147E415C00F98B1E /* MPMainViewController.m */; };
DA5BFCD01502CDF5005BFE16 /* Exo-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA5BFCBE1502CDF5005BFE16 /* Exo-Black.otf */; };
DA5BFCD21502CDF5005BFE16 /* Exo-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA5BFCC01502CDF5005BFE16 /* Exo-Bold.otf */; };
DA5BFCD41502CDF5005BFE16 /* Exo-DemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA5BFCC21502CDF5005BFE16 /* Exo-DemiBold.otf */; };
DA5BFCD61502CDF5005BFE16 /* Exo-ExtraBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA5BFCC41502CDF5005BFE16 /* Exo-ExtraBold.otf */; };
DA5BFCD81502CDF5005BFE16 /* Exo-ExtraLight.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA5BFCC61502CDF5005BFE16 /* Exo-ExtraLight.otf */; };
DA5BFCDA1502CDF5005BFE16 /* Exo-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA5BFCC81502CDF5005BFE16 /* Exo-Light.otf */; };
DA5BFCDC1502CDF5005BFE16 /* Exo-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA5BFCCA1502CDF5005BFE16 /* Exo-Medium.otf */; };
DA5BFCDE1502CDF5005BFE16 /* Exo-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA5BFCCC1502CDF5005BFE16 /* Exo-Regular.otf */; };
DA5BFCE01502CDF5005BFE16 /* Exo-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA5BFCCE1502CDF5005BFE16 /* Exo-Thin.otf */; };
DA5DB7A614BE4B19002DD256 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5DB7A514BE4B19002DD256 /* Default.png */; }; DA5DB7A614BE4B19002DD256 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5DB7A514BE4B19002DD256 /* Default.png */; };
DA5DB7A814BE4B4B002DD256 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5DB7A714BE4B4B002DD256 /* Default@2x.png */; }; DA5DB7A814BE4B4B002DD256 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5DB7A714BE4B4B002DD256 /* Default@2x.png */; };
DA6556FE14D730B700841C99 /* guide_page_1.png in Resources */ = {isa = PBXBuildFile; fileRef = DA6556F814D730B700841C99 /* guide_page_1.png */; }; DA6556FE14D730B700841C99 /* guide_page_1.png in Resources */ = {isa = PBXBuildFile; fileRef = DA6556F814D730B700841C99 /* guide_page_1.png */; };
@ -935,6 +944,15 @@
DA5BFA63147E415C00F98B1E /* MasterPassword.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MasterPassword.xcdatamodel; sourceTree = "<group>"; }; DA5BFA63147E415C00F98B1E /* MasterPassword.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MasterPassword.xcdatamodel; sourceTree = "<group>"; };
DA5BFA65147E415C00F98B1E /* MPMainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPMainViewController.h; sourceTree = "<group>"; }; DA5BFA65147E415C00F98B1E /* MPMainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPMainViewController.h; sourceTree = "<group>"; };
DA5BFA66147E415C00F98B1E /* MPMainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPMainViewController.m; sourceTree = "<group>"; }; DA5BFA66147E415C00F98B1E /* MPMainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPMainViewController.m; sourceTree = "<group>"; };
DA5BFCBE1502CDF5005BFE16 /* Exo-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo-Black.otf"; sourceTree = "<group>"; };
DA5BFCC01502CDF5005BFE16 /* Exo-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo-Bold.otf"; sourceTree = "<group>"; };
DA5BFCC21502CDF5005BFE16 /* Exo-DemiBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo-DemiBold.otf"; sourceTree = "<group>"; };
DA5BFCC41502CDF5005BFE16 /* Exo-ExtraBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo-ExtraBold.otf"; sourceTree = "<group>"; };
DA5BFCC61502CDF5005BFE16 /* Exo-ExtraLight.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo-ExtraLight.otf"; sourceTree = "<group>"; };
DA5BFCC81502CDF5005BFE16 /* Exo-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo-Light.otf"; sourceTree = "<group>"; };
DA5BFCCA1502CDF5005BFE16 /* Exo-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo-Medium.otf"; sourceTree = "<group>"; };
DA5BFCCC1502CDF5005BFE16 /* Exo-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo-Regular.otf"; sourceTree = "<group>"; };
DA5BFCCE1502CDF5005BFE16 /* Exo-Thin.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Exo-Thin.otf"; sourceTree = "<group>"; };
DA5DB7A514BE4B19002DD256 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = ../Default.png; sourceTree = "<group>"; }; DA5DB7A514BE4B19002DD256 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = ../Default.png; sourceTree = "<group>"; };
DA5DB7A714BE4B4B002DD256 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "../Default@2x.png"; sourceTree = "<group>"; }; DA5DB7A714BE4B4B002DD256 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "../Default@2x.png"; sourceTree = "<group>"; };
DA6556F814D730B700841C99 /* guide_page_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = guide_page_1.png; sourceTree = "<group>"; }; DA6556F814D730B700841C99 /* guide_page_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = guide_page_1.png; sourceTree = "<group>"; };
@ -2304,6 +2322,7 @@
DA5BFA51147E415C00F98B1E /* Supporting Files */ = { DA5BFA51147E415C00F98B1E /* Supporting Files */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
DA5BFCBC1502CDF5005BFE16 /* Fonts */,
DA566D3114F8EB0700A6EB2E /* Background */, DA566D3114F8EB0700A6EB2E /* Background */,
DA566D1E14F8EAF200A6EB2E /* Lock */, DA566D1E14F8EAF200A6EB2E /* Lock */,
DA8E8E4514DD7C1D0044257E /* logo-bare.png */, DA8E8E4514DD7C1D0044257E /* logo-bare.png */,
@ -2332,6 +2351,23 @@
name = "Supporting Files"; name = "Supporting Files";
sourceTree = "<group>"; sourceTree = "<group>";
}; };
DA5BFCBC1502CDF5005BFE16 /* Fonts */ = {
isa = PBXGroup;
children = (
DA5BFCBE1502CDF5005BFE16 /* Exo-Black.otf */,
DA5BFCC41502CDF5005BFE16 /* Exo-ExtraBold.otf */,
DA5BFCC01502CDF5005BFE16 /* Exo-Bold.otf */,
DA5BFCC21502CDF5005BFE16 /* Exo-DemiBold.otf */,
DA5BFCCA1502CDF5005BFE16 /* Exo-Medium.otf */,
DA5BFCCC1502CDF5005BFE16 /* Exo-Regular.otf */,
DA5BFCC81502CDF5005BFE16 /* Exo-Light.otf */,
DA5BFCC61502CDF5005BFE16 /* Exo-ExtraLight.otf */,
DA5BFCCE1502CDF5005BFE16 /* Exo-Thin.otf */,
);
name = Fonts;
path = Resources/Fonts;
sourceTree = "<group>";
};
DA6556F714D730B700841C99 /* Guide */ = { DA6556F714D730B700841C99 /* Guide */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -3591,6 +3627,15 @@
DA67305314F98B6F004A189C /* icon_wrench.png in Resources */, DA67305314F98B6F004A189C /* icon_wrench.png in Resources */,
DA67305414F98B6F004A189C /* icon_wrench@2x.png in Resources */, DA67305414F98B6F004A189C /* icon_wrench@2x.png in Resources */,
DADC288814FDAC0C00047FEB /* Pearl.strings in Resources */, DADC288814FDAC0C00047FEB /* Pearl.strings in Resources */,
DA5BFCD01502CDF5005BFE16 /* Exo-Black.otf in Resources */,
DA5BFCD21502CDF5005BFE16 /* Exo-Bold.otf in Resources */,
DA5BFCD41502CDF5005BFE16 /* Exo-DemiBold.otf in Resources */,
DA5BFCD61502CDF5005BFE16 /* Exo-ExtraBold.otf in Resources */,
DA5BFCD81502CDF5005BFE16 /* Exo-ExtraLight.otf in Resources */,
DA5BFCDA1502CDF5005BFE16 /* Exo-Light.otf in Resources */,
DA5BFCDC1502CDF5005BFE16 /* Exo-Medium.otf in Resources */,
DA5BFCDE1502CDF5005BFE16 /* Exo-Regular.otf in Resources */,
DA5BFCE01502CDF5005BFE16 /* Exo-Thin.otf in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@ -1,10 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
version = "1.3"> version = "1.3">
<BuildAction> <BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForRunning = "YES"> buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "DA5BFA43147E415C00F98B1E" BlueprintIdentifier = "DA5BFA43147E415C00F98B1E"
@ -15,11 +21,23 @@
</BuildActionEntry> </BuildActionEntry>
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
</TestAction>
<LaunchAction <LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
buildConfiguration = "Production"> buildConfiguration = "Production"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable> <BuildableProductRunnable>
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
@ -29,5 +47,21 @@
ReferencedContainer = "container:MasterPassword.xcodeproj"> ReferencedContainer = "container:MasterPassword.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme> </Scheme>

View File

@ -1,10 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
version = "1.3"> version = "1.3">
<BuildAction> <BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForRunning = "YES"> buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "DA5BFA43147E415C00F98B1E" BlueprintIdentifier = "DA5BFA43147E415C00F98B1E"
@ -15,11 +21,23 @@
</BuildActionEntry> </BuildActionEntry>
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
</TestAction>
<LaunchAction <LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"> buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable> <BuildableProductRunnable>
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
@ -29,5 +47,21 @@
ReferencedContainer = "container:MasterPassword.xcodeproj"> ReferencedContainer = "container:MasterPassword.xcodeproj">
</BuildableReference> </BuildableReference>
</BuildableProductRunnable> </BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme> </Scheme>

Binary file not shown.

Binary file not shown.

View File

@ -94,6 +94,8 @@
- (void)viewDidLoad { - (void)viewDidLoad {
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"ui_background"]]; self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"ui_background"]];
self.contentField.font = [UIFont fontWithName:@"Exo-Black" size:self.contentField.font.pointSize];
// Put the search tip on the window so it's above the nav bar. // Put the search tip on the window so it's above the nav bar.
if (![self.searchTipContainer.superview isEqual:self.navigationController.navigationBar.superview]) { if (![self.searchTipContainer.superview isEqual:self.navigationController.navigationBar.superview]) {
@ -367,124 +369,123 @@
case 4: case 4:
[TestFlight openFeedbackView]; [TestFlight openFeedbackView];
break; break;
case 5: { case 5:
#else #else
case 4: { case 4:
#endif #endif
[[MPAppDelegate get] signOut]; [[MPAppDelegate get] signOut];
break; break;
} }
}
#ifndef PRODUCTION
[TestFlight passCheckpoint:MPTestFlightCheckpointAction];
#endif
} cancelTitle:[PearlStrings get].commonButtonCancel destructiveTitle:nil
otherTitles:
[self isHelpVisible]? @"Hide Help": @"Show Help", @"FAQ", @"Tutorial", @"Settings",
#ifndef PRODUCTION
@"Feedback",
#endif
@"Sign Out",
nil];
}
- (MPElementType)selectedType {
return self.activeElement.type;
}
- (void)didSelectType:(MPElementType)type {
[self updateElement:^{
// Update password type.
if (ClassFromMPElementType(type) != ClassFromMPElementType(self.activeElement.type))
// Type requires a different class of element. Recreate the element.
[[MPAppDelegate managedObjectContext] performBlockAndWait:^{
MPElementEntity *newElement = [NSEntityDescription insertNewObjectForEntityForName:ClassNameFromMPElementType(type)
inManagedObjectContext:[MPAppDelegate managedObjectContext]];
newElement.name = self.activeElement.name;
newElement.mpHashHex = self.activeElement.mpHashHex;
newElement.uses = self.activeElement.uses;
newElement.lastUsed = self.activeElement.lastUsed;
[[MPAppDelegate managedObjectContext] deleteObject:self.activeElement];
self.activeElement = newElement;
}];
self.activeElement.type = type;
#ifndef PRODUCTION #ifndef PRODUCTION
[TestFlight passCheckpoint:[NSString stringWithFormat:MPTestFlightCheckpointSelectType, NSStringFromMPElementType(type)]]; [TestFlight passCheckpoint:MPTestFlightCheckpointAction];
#endif #endif
} cancelTitle:[PearlStrings get].commonButtonCancel destructiveTitle:nil
if (type & MPElementTypeClassStored && ![self.activeElement.description length]) otherTitles:
[self showContentTip:@"Tap to set a password." withIcon:self.contentTipEditIcon]; [self isHelpVisible]? @"Hide Help": @"Show Help", @"FAQ", @"Tutorial", @"Settings",
}];
}
- (void)didSelectElement:(MPElementEntity *)element {
if (element) {
self.activeElement = element;
[self.activeElement use];
[self.searchDisplayController setActive:NO animated:YES];
self.searchDisplayController.searchBar.text = self.activeElement.name;
#ifndef PRODUCTION #ifndef PRODUCTION
[TestFlight passCheckpoint:MPTestFlightCheckpointSelectElement]; @"Feedback",
#endif #endif
} @"Sign Out",
nil];
[self updateAnimated:YES]; }
}
- (MPElementType)selectedType {
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
return self.activeElement.type;
if (textField == self.contentField) }
[self.contentField resignFirstResponder];
- (void)didSelectType:(MPElementType)type {
return YES;
} [self updateElement:^{
// Update password type.
- (void)textFieldDidEndEditing:(UITextField *)textField { if (ClassFromMPElementType(type) != ClassFromMPElementType(self.activeElement.type))
// Type requires a different class of element. Recreate the element.
if (textField == self.contentField) { [[MPAppDelegate managedObjectContext] performBlockAndWait:^{
self.contentField.enabled = NO; MPElementEntity *newElement = [NSEntityDescription insertNewObjectForEntityForName:ClassNameFromMPElementType(type)
if (![self.activeElement isKindOfClass:[MPElementStoredEntity class]]) inManagedObjectContext:[MPAppDelegate managedObjectContext]];
// Not of a type whose content can be edited. newElement.name = self.activeElement.name;
return; newElement.mpHashHex = self.activeElement.mpHashHex;
newElement.uses = self.activeElement.uses;
if ([((MPElementStoredEntity *) self.activeElement).content isEqual:self.contentField.text]) newElement.lastUsed = self.activeElement.lastUsed;
// Content hasn't changed.
return; [[MPAppDelegate managedObjectContext] deleteObject:self.activeElement];
self.activeElement = newElement;
[self updateElement:^{ }];
((MPElementStoredEntity *) self.activeElement).content = self.contentField.text;
}]; self.activeElement.type = type;
}
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
#ifndef PRODUCTION #ifndef PRODUCTION
[TestFlight passCheckpoint:MPTestFlightCheckpointExternalLink]; [TestFlight passCheckpoint:[NSString stringWithFormat:MPTestFlightCheckpointSelectType, NSStringFromMPElementType(type)]];
#endif #endif
[[UIApplication sharedApplication] openURL:[request URL]]; if (type & MPElementTypeClassStored && ![self.activeElement.description length])
return NO; [self showContentTip:@"Tap to set a password." withIcon:self.contentTipEditIcon];
} }];
}
return YES;
} - (void)didSelectElement:(MPElementEntity *)element {
- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController *)sender { if (element) {
self.activeElement = element;
while ([self.navigationController.viewControllers containsObject:sender]) [self.activeElement use];
[self.navigationController popViewControllerAnimated:YES];
} [self.searchDisplayController setActive:NO animated:YES];
self.searchDisplayController.searchBar.text = self.activeElement.name;
@end
#ifndef PRODUCTION
[TestFlight passCheckpoint:MPTestFlightCheckpointSelectElement];
#endif
}
[self updateAnimated:YES];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (textField == self.contentField)
[self.contentField resignFirstResponder];
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
if (textField == self.contentField) {
self.contentField.enabled = NO;
if (![self.activeElement isKindOfClass:[MPElementStoredEntity class]])
// Not of a type whose content can be edited.
return;
if ([((MPElementStoredEntity *) self.activeElement).content isEqual:self.contentField.text])
// Content hasn't changed.
return;
[self updateElement:^{
((MPElementStoredEntity *) self.activeElement).content = self.contentField.text;
}];
}
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
#ifndef PRODUCTION
[TestFlight passCheckpoint:MPTestFlightCheckpointExternalLink];
#endif
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}
return YES;
}
- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController *)sender {
while ([self.navigationController.viewControllers containsObject:sender])
[self.navigationController popViewControllerAnimated:YES];
}
@end

View File

@ -811,64 +811,6 @@ L4m3P4sSw0rD</string>
<image name="ui_spinner.png" width="75" height="75"/> <image name="ui_spinner.png" width="75" height="75"/>
<image name="ui_textfield.png" width="158" height="34"/> <image name="ui_textfield.png" width="158" height="34"/>
</resources> </resources>
<classes>
<class className="MPGuideViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/MPGuideViewController.h"/>
<relationships>
<relationship kind="action" name="close"/>
<relationship kind="outlet" name="scrollView" candidateClass="UIScrollView"/>
</relationships>
</class>
<class className="MPMainViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/MPMainViewController.h"/>
<relationships>
<relationship kind="action" name="action:" candidateClass="UIBarButtonItem"/>
<relationship kind="action" name="closeAlert"/>
<relationship kind="action" name="copyContent"/>
<relationship kind="action" name="editPassword"/>
<relationship kind="action" name="incrementPasswordCounter"/>
<relationship kind="outlet" name="alertBody" candidateClass="UITextView"/>
<relationship kind="outlet" name="alertContainer" candidateClass="UIView"/>
<relationship kind="outlet" name="alertTitle" candidateClass="UILabel"/>
<relationship kind="outlet" name="contentContainer" candidateClass="UIView"/>
<relationship kind="outlet" name="contentField" candidateClass="UITextField"/>
<relationship kind="outlet" name="contentTipBody" candidateClass="UILabel"/>
<relationship kind="outlet" name="contentTipContainer" candidateClass="UIView"/>
<relationship kind="outlet" name="contentTipEditIcon" candidateClass="UIImageView"/>
<relationship kind="outlet" name="helpContainer" candidateClass="UIView"/>
<relationship kind="outlet" name="helpView" candidateClass="UIWebView"/>
<relationship kind="outlet" name="passwordCounter" candidateClass="UILabel"/>
<relationship kind="outlet" name="passwordEdit" candidateClass="UIButton"/>
<relationship kind="outlet" name="passwordIncrementer" candidateClass="UIButton"/>
<relationship kind="outlet" name="searchResultsController" candidateClass="MPSearchDelegate"/>
<relationship kind="outlet" name="searchTipContainer" candidateClass="UIView"/>
<relationship kind="outlet" name="siteName" candidateClass="UILabel"/>
<relationship kind="outlet" name="typeButton" candidateClass="UIButton"/>
</relationships>
</class>
<class className="MPSearchDelegate" superclassName="NSObject">
<source key="sourceIdentifier" type="project" relativePath="./Classes/MPSearchDelegate.h"/>
<relationships>
<relationship kind="outlet" name="delegate"/>
<relationship kind="outlet" name="searchDisplayController" candidateClass="UISearchDisplayController"/>
<relationship kind="outlet" name="searchTipContainer" candidateClass="UIView"/>
</relationships>
</class>
<class className="MPTypeViewController" superclassName="UITableViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/MPTypeViewController.h"/>
</class>
<class className="MPUnlockViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/MPUnlockViewController.h"/>
<relationships>
<relationship kind="action" name="changeMP"/>
<relationship kind="outlet" name="changeMPView" candidateClass="UIView"/>
<relationship kind="outlet" name="field" candidateClass="UITextField"/>
<relationship kind="outlet" name="lock" candidateClass="UIImageView"/>
<relationship kind="outlet" name="messageLabel" candidateClass="UILabel"/>
<relationship kind="outlet" name="spinner" candidateClass="UIImageView"/>
</relationships>
</class>
</classes>
<simulatedMetricsContainer key="defaultSimulatedMetrics"> <simulatedMetricsContainer key="defaultSimulatedMetrics">
<nil key="statusBar"/> <nil key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/> <simulatedOrientationMetrics key="orientation"/>

View File

@ -46,6 +46,18 @@
<true/> <true/>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>© 2011-2012, Lyndir</string> <string>© 2011-2012, Lyndir</string>
<key>UIAppFonts</key>
<array>
<string>Exo-Black.otf</string>
<string>Exo-ExtraBold.otf</string>
<string>Exo-Bold.otf</string>
<string>Exo-DemiBold.otf</string>
<string>Exo-Medium.otf</string>
<string>Exo-Regular.otf</string>
<string>Exo-Light.otf</string>
<string>Exo-ExtraLight.otf</string>
<string>Exo-Thin.otf</string>
</array>
<key>UIMainStoryboardFile</key> <key>UIMainStoryboardFile</key>
<string>MainStoryboard_iPhone</string> <string>MainStoryboard_iPhone</string>
<key>UIMainStoryboardFile~ipad</key> <key>UIMainStoryboardFile~ipad</key>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.