diff --git a/External/Pearl b/External/Pearl
index 046dba15..a72579ea 160000
--- a/External/Pearl
+++ b/External/Pearl
@@ -1 +1 @@
-Subproject commit 046dba155843d7a10d5c087e5b1d698ab271df67
+Subproject commit a72579ea27c797698ddd9546a407578fe8b62003
diff --git a/MasterPassword-iOS.xcodeproj/project.pbxproj b/MasterPassword-iOS.xcodeproj/project.pbxproj
index 8733ebb7..8ae4b220 100644
--- a/MasterPassword-iOS.xcodeproj/project.pbxproj
+++ b/MasterPassword-iOS.xcodeproj/project.pbxproj
@@ -10,12 +10,6 @@
DA04E33E14B1E70400ECA4F3 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA04E33D14B1E70400ECA4F3 /* MobileCoreServices.framework */; };
DA0A1D0515690A9A0092735D /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D0315690A9A0092735D /* Default.png */; };
DA0A1D0615690A9A0092735D /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D0415690A9A0092735D /* Default@2x.png */; };
- DA0A1D0D15690AD40092735D /* tip_arrow_banana.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D0715690AD40092735D /* tip_arrow_banana.png */; };
- DA0A1D0E15690AD40092735D /* tip_arrow_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D0815690AD40092735D /* tip_arrow_black.png */; };
- DA0A1D0F15690AD40092735D /* tip_arrow_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D0915690AD40092735D /* tip_arrow_gray.png */; };
- DA0A1D1015690AD40092735D /* tip_arrow_mercury.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D0A15690AD40092735D /* tip_arrow_mercury.png */; };
- DA0A1D1115690AD40092735D /* tip_arrow_teal.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D0B15690AD40092735D /* tip_arrow_teal.png */; };
- DA0A1D1215690AD40092735D /* tip_arrow_wood.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D0C15690AD40092735D /* tip_arrow_wood.png */; };
DA0A1D1515690AF40092735D /* Icon-72@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D1315690AF30092735D /* Icon-72@2x.png */; };
DA0A1D1615690AF40092735D /* Icon-Small-50@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0A1D1415690AF40092735D /* Icon-Small-50@2x.png */; };
DA30E9CE15722ECA00A68B4C /* NSBundle_PearlMutableInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = DA30E9CB15722ECA00A68B4C /* NSBundle_PearlMutableInfo.h */; };
@@ -82,7 +76,6 @@
DA95D5F714DF0B9F008D1B94 /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = DA95D5CD14DF0691008D1B94 /* IASKPSToggleSwitchSpecifierViewCell.xib */; };
DA95D5F814DF0B9F008D1B94 /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = DA95D5CE14DF0691008D1B94 /* IASKSpecifierValuesView.xib */; };
DAAC35DB156BD62F00C5FD93 /* libApptentiveConnect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAAC35D2156BD51600C5FD93 /* libApptentiveConnect.a */; };
- DAAC35DC156BD66800C5FD93 /* ApptentiveResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DAAC35D6156BD51600C5FD93 /* ApptentiveResources.bundle */; };
DAAC35DE156BD77D00C5FD93 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAAC35DD156BD77D00C5FD93 /* CoreTelephony.framework */; };
DAAC35E4156BDBA700C5FD93 /* Apptentive.plist in Resources */ = {isa = PBXBuildFile; fileRef = DAAC35E2156BDBA700C5FD93 /* Apptentive.plist */; };
DAB8D45D15036BCF00CED3BC /* MasterPassword.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = DAB8D43C15036BCF00CED3BC /* MasterPassword.xcdatamodeld */; };
@@ -672,72 +665,6 @@
DAB8D93715036BF700CED3BC /* lock_red.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6B415036BF600CED3BC /* lock_red.png */; };
DAB8D93815036BF700CED3BC /* lock_red@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6B515036BF600CED3BC /* lock_red@2x.png */; };
DAB8D93915036BF700CED3BC /* logo-bare.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6B615036BF600CED3BC /* logo-bare.png */; };
- DAB8D93A15036BF700CED3BC /* tip_alert_banana.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6B815036BF600CED3BC /* tip_alert_banana.png */; };
- DAB8D93B15036BF700CED3BC /* tip_alert_banana@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6B915036BF600CED3BC /* tip_alert_banana@2x.png */; };
- DAB8D93C15036BF700CED3BC /* tip_alert_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6BA15036BF600CED3BC /* tip_alert_black.png */; };
- DAB8D93D15036BF700CED3BC /* tip_alert_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6BB15036BF600CED3BC /* tip_alert_black@2x.png */; };
- DAB8D93E15036BF700CED3BC /* tip_alert_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6BC15036BF600CED3BC /* tip_alert_gray.png */; };
- DAB8D93F15036BF700CED3BC /* tip_alert_gray@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6BD15036BF600CED3BC /* tip_alert_gray@2x.png */; };
- DAB8D94015036BF700CED3BC /* tip_alert_mercury.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6BE15036BF600CED3BC /* tip_alert_mercury.png */; };
- DAB8D94115036BF700CED3BC /* tip_alert_mercury@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6BF15036BF600CED3BC /* tip_alert_mercury@2x.png */; };
- DAB8D94215036BF700CED3BC /* tip_alert_teal.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C015036BF600CED3BC /* tip_alert_teal.png */; };
- DAB8D94315036BF700CED3BC /* tip_alert_teal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C115036BF600CED3BC /* tip_alert_teal@2x.png */; };
- DAB8D94415036BF700CED3BC /* tip_alert_wood.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C215036BF600CED3BC /* tip_alert_wood.png */; };
- DAB8D94515036BF700CED3BC /* tip_alert_wood@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C315036BF600CED3BC /* tip_alert_wood@2x.png */; };
- DAB8D94615036BF700CED3BC /* tip_arrow_banana@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C415036BF600CED3BC /* tip_arrow_banana@2x.png */; };
- DAB8D94715036BF700CED3BC /* tip_arrow_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C515036BF600CED3BC /* tip_arrow_black@2x.png */; };
- DAB8D94815036BF700CED3BC /* tip_arrow_gray@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C615036BF600CED3BC /* tip_arrow_gray@2x.png */; };
- DAB8D94915036BF700CED3BC /* tip_arrow_mercury@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C715036BF600CED3BC /* tip_arrow_mercury@2x.png */; };
- DAB8D94A15036BF700CED3BC /* tip_arrow_teal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C815036BF600CED3BC /* tip_arrow_teal@2x.png */; };
- DAB8D94B15036BF700CED3BC /* tip_arrow_wood@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6C915036BF600CED3BC /* tip_arrow_wood@2x.png */; };
- DAB8D94C15036BF700CED3BC /* tip_basic_banana.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6CA15036BF600CED3BC /* tip_basic_banana.png */; };
- DAB8D94D15036BF700CED3BC /* tip_basic_banana@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6CB15036BF600CED3BC /* tip_basic_banana@2x.png */; };
- DAB8D94E15036BF700CED3BC /* tip_basic_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6CC15036BF600CED3BC /* tip_basic_black.png */; };
- DAB8D94F15036BF700CED3BC /* tip_basic_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6CD15036BF600CED3BC /* tip_basic_black@2x.png */; };
- DAB8D95015036BF700CED3BC /* tip_basic_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6CE15036BF600CED3BC /* tip_basic_gray.png */; };
- DAB8D95115036BF700CED3BC /* tip_basic_gray@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6CF15036BF600CED3BC /* tip_basic_gray@2x.png */; };
- DAB8D95215036BF700CED3BC /* tip_basic_mercury.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D015036BF600CED3BC /* tip_basic_mercury.png */; };
- DAB8D95315036BF700CED3BC /* tip_basic_mercury@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D115036BF600CED3BC /* tip_basic_mercury@2x.png */; };
- DAB8D95415036BF700CED3BC /* tip_basic_teal.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D215036BF600CED3BC /* tip_basic_teal.png */; };
- DAB8D95515036BF700CED3BC /* tip_basic_teal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D315036BF600CED3BC /* tip_basic_teal@2x.png */; };
- DAB8D95615036BF700CED3BC /* tip_basic_wood.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D415036BF600CED3BC /* tip_basic_wood.png */; };
- DAB8D95715036BF700CED3BC /* tip_basic_wood@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D515036BF600CED3BC /* tip_basic_wood@2x.png */; };
- DAB8D95815036BF700CED3BC /* tip_download_banana.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D615036BF600CED3BC /* tip_download_banana.png */; };
- DAB8D95915036BF700CED3BC /* tip_download_banana@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D715036BF600CED3BC /* tip_download_banana@2x.png */; };
- DAB8D95A15036BF700CED3BC /* tip_download_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D815036BF600CED3BC /* tip_download_black.png */; };
- DAB8D95B15036BF700CED3BC /* tip_download_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6D915036BF600CED3BC /* tip_download_black@2x.png */; };
- DAB8D95C15036BF700CED3BC /* tip_download_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6DA15036BF600CED3BC /* tip_download_gray.png */; };
- DAB8D95D15036BF700CED3BC /* tip_download_gray@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6DB15036BF600CED3BC /* tip_download_gray@2x.png */; };
- DAB8D95E15036BF700CED3BC /* tip_download_mercury.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6DC15036BF600CED3BC /* tip_download_mercury.png */; };
- DAB8D95F15036BF700CED3BC /* tip_download_mercury@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6DD15036BF600CED3BC /* tip_download_mercury@2x.png */; };
- DAB8D96015036BF700CED3BC /* tip_download_teal.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6DE15036BF600CED3BC /* tip_download_teal.png */; };
- DAB8D96115036BF700CED3BC /* tip_download_teal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6DF15036BF600CED3BC /* tip_download_teal@2x.png */; };
- DAB8D96215036BF700CED3BC /* tip_download_wood.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E015036BF600CED3BC /* tip_download_wood.png */; };
- DAB8D96315036BF700CED3BC /* tip_download_wood@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E115036BF600CED3BC /* tip_download_wood@2x.png */; };
- DAB8D96415036BF700CED3BC /* tip_large_banana.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E215036BF600CED3BC /* tip_large_banana.png */; };
- DAB8D96515036BF700CED3BC /* tip_large_banana@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E315036BF600CED3BC /* tip_large_banana@2x.png */; };
- DAB8D96615036BF700CED3BC /* tip_large_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E415036BF600CED3BC /* tip_large_black.png */; };
- DAB8D96715036BF700CED3BC /* tip_large_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E515036BF600CED3BC /* tip_large_black@2x.png */; };
- DAB8D96815036BF700CED3BC /* tip_large_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E615036BF600CED3BC /* tip_large_gray.png */; };
- DAB8D96915036BF700CED3BC /* tip_large_gray@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E715036BF600CED3BC /* tip_large_gray@2x.png */; };
- DAB8D96A15036BF700CED3BC /* tip_large_mercury.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E815036BF600CED3BC /* tip_large_mercury.png */; };
- DAB8D96B15036BF700CED3BC /* tip_large_mercury@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6E915036BF600CED3BC /* tip_large_mercury@2x.png */; };
- DAB8D96C15036BF700CED3BC /* tip_large_teal.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6EA15036BF600CED3BC /* tip_large_teal.png */; };
- DAB8D96D15036BF700CED3BC /* tip_large_teal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6EB15036BF600CED3BC /* tip_large_teal@2x.png */; };
- DAB8D96E15036BF700CED3BC /* tip_large_wood.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6EC15036BF600CED3BC /* tip_large_wood.png */; };
- DAB8D96F15036BF700CED3BC /* tip_large_wood@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6ED15036BF600CED3BC /* tip_large_wood@2x.png */; };
- DAB8D97015036BF700CED3BC /* tip_location_banana.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6EE15036BF600CED3BC /* tip_location_banana.png */; };
- DAB8D97115036BF700CED3BC /* tip_location_banana@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6EF15036BF600CED3BC /* tip_location_banana@2x.png */; };
- DAB8D97215036BF700CED3BC /* tip_location_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F015036BF600CED3BC /* tip_location_black.png */; };
- DAB8D97315036BF700CED3BC /* tip_location_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F115036BF600CED3BC /* tip_location_black@2x.png */; };
- DAB8D97415036BF700CED3BC /* tip_location_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F215036BF600CED3BC /* tip_location_gray.png */; };
- DAB8D97515036BF700CED3BC /* tip_location_gray@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F315036BF600CED3BC /* tip_location_gray@2x.png */; };
- DAB8D97615036BF700CED3BC /* tip_location_mercury.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F415036BF600CED3BC /* tip_location_mercury.png */; };
- DAB8D97715036BF700CED3BC /* tip_location_mercury@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F515036BF600CED3BC /* tip_location_mercury@2x.png */; };
- DAB8D97815036BF700CED3BC /* tip_location_teal.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F615036BF600CED3BC /* tip_location_teal.png */; };
- DAB8D97915036BF700CED3BC /* tip_location_teal@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F715036BF600CED3BC /* tip_location_teal@2x.png */; };
- DAB8D97A15036BF700CED3BC /* tip_location_wood.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F815036BF600CED3BC /* tip_location_wood.png */; };
- DAB8D97B15036BF700CED3BC /* tip_location_wood@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6F915036BF600CED3BC /* tip_location_wood@2x.png */; };
DAB8D97C1503718B00CED3BC /* jquery-1.6.1.min.js in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6AB15036BF600CED3BC /* jquery-1.6.1.min.js */; };
DABB981615100B4000B05417 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DABB981515100B4000B05417 /* SystemConfiguration.framework */; };
DAC6325E1486805C0075AEA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
@@ -746,6 +673,15 @@
DAC6327C1486809A0075AEA5 /* JRSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = DAC6327A1486809A0075AEA5 /* JRSwizzle.m */; };
DAC632891486D9690075AEA5 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC632871486D95D0075AEA5 /* Security.framework */; };
DAC77CAE148291A600BCF976 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
+ DACABB8515729E80008BA211 /* ApptentiveResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DAAC35D6156BD51600C5FD93 /* ApptentiveResources.bundle */; };
+ DACABB861572A2A7008BA211 /* tip_alert_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6BA15036BF600CED3BC /* tip_alert_black.png */; };
+ DACABB871572A2A7008BA211 /* tip_alert_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6BB15036BF600CED3BC /* tip_alert_black@2x.png */; };
+ DACABB881572A2A7008BA211 /* tip_basic_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6CC15036BF600CED3BC /* tip_basic_black.png */; };
+ DACABB891572A2A7008BA211 /* tip_basic_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAB8D6CD15036BF600CED3BC /* tip_basic_black@2x.png */; };
+ DACABB8C1572A4A5008BA211 /* tip_basic_black_top_right.png in Resources */ = {isa = PBXBuildFile; fileRef = DACABB8A1572A4A4008BA211 /* tip_basic_black_top_right.png */; };
+ DACABB8D1572A4A5008BA211 /* tip_basic_black_top_right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DACABB8B1572A4A4008BA211 /* tip_basic_black_top_right@2x.png */; };
+ DACABB901572B76A008BA211 /* tip_basic_black_top.png in Resources */ = {isa = PBXBuildFile; fileRef = DACABB8E1572B769008BA211 /* tip_basic_black_top.png */; };
+ DACABB911572B76A008BA211 /* tip_basic_black_top@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DACABB8F1572B769008BA211 /* tip_basic_black_top@2x.png */; };
DAD3126715528C9C00A3F9ED /* Crashlytics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAD3125F15528C9C00A3F9ED /* Crashlytics.framework */; };
DAD3126815528C9C00A3F9ED /* Crashlytics.plist in Resources */ = {isa = PBXBuildFile; fileRef = DAD3126015528C9C00A3F9ED /* Crashlytics.plist */; };
DAD3126915528C9C00A3F9ED /* libTestFlight.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAD3126215528C9C00A3F9ED /* libTestFlight.a */; };
@@ -1679,6 +1615,10 @@
DAC632871486D95D0075AEA5 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
DAC77CAD148291A600BCF976 /* libPearl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPearl.a; sourceTree = BUILT_PRODUCTS_DIR; };
DAC77CB1148291A600BCF976 /* Pearl-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Pearl-Prefix.pch"; sourceTree = ""; };
+ DACABB8A1572A4A4008BA211 /* tip_basic_black_top_right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tip_basic_black_top_right.png; sourceTree = ""; };
+ DACABB8B1572A4A4008BA211 /* tip_basic_black_top_right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tip_basic_black_top_right@2x.png"; sourceTree = ""; };
+ DACABB8E1572B769008BA211 /* tip_basic_black_top.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tip_basic_black_top.png; sourceTree = ""; };
+ DACABB8F1572B769008BA211 /* tip_basic_black_top@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tip_basic_black_top@2x.png"; sourceTree = ""; };
DAD3125F15528C9C00A3F9ED /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Crashlytics.framework; sourceTree = ""; };
DAD3126015528C9C00A3F9ED /* Crashlytics.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Crashlytics.plist; sourceTree = ""; };
DAD3126215528C9C00A3F9ED /* libTestFlight.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libTestFlight.a; sourceTree = ""; };
@@ -2720,12 +2660,10 @@
DAB8D6B715036BF600CED3BC /* Tooltips */ = {
isa = PBXGroup;
children = (
- DA0A1D0715690AD40092735D /* tip_arrow_banana.png */,
- DA0A1D0815690AD40092735D /* tip_arrow_black.png */,
- DA0A1D0915690AD40092735D /* tip_arrow_gray.png */,
- DA0A1D0A15690AD40092735D /* tip_arrow_mercury.png */,
- DA0A1D0B15690AD40092735D /* tip_arrow_teal.png */,
- DA0A1D0C15690AD40092735D /* tip_arrow_wood.png */,
+ DACABB8E1572B769008BA211 /* tip_basic_black_top.png */,
+ DACABB8F1572B769008BA211 /* tip_basic_black_top@2x.png */,
+ DACABB8A1572A4A4008BA211 /* tip_basic_black_top_right.png */,
+ DACABB8B1572A4A4008BA211 /* tip_basic_black_top_right@2x.png */,
DAB8D6B815036BF600CED3BC /* tip_alert_banana.png */,
DAB8D6B915036BF600CED3BC /* tip_alert_banana@2x.png */,
DAB8D6BA15036BF600CED3BC /* tip_alert_black.png */,
@@ -2738,11 +2676,17 @@
DAB8D6C115036BF600CED3BC /* tip_alert_teal@2x.png */,
DAB8D6C215036BF600CED3BC /* tip_alert_wood.png */,
DAB8D6C315036BF600CED3BC /* tip_alert_wood@2x.png */,
+ DA0A1D0715690AD40092735D /* tip_arrow_banana.png */,
DAB8D6C415036BF600CED3BC /* tip_arrow_banana@2x.png */,
+ DA0A1D0815690AD40092735D /* tip_arrow_black.png */,
DAB8D6C515036BF600CED3BC /* tip_arrow_black@2x.png */,
+ DA0A1D0915690AD40092735D /* tip_arrow_gray.png */,
DAB8D6C615036BF600CED3BC /* tip_arrow_gray@2x.png */,
+ DA0A1D0A15690AD40092735D /* tip_arrow_mercury.png */,
DAB8D6C715036BF600CED3BC /* tip_arrow_mercury@2x.png */,
+ DA0A1D0B15690AD40092735D /* tip_arrow_teal.png */,
DAB8D6C815036BF600CED3BC /* tip_arrow_teal@2x.png */,
+ DA0A1D0C15690AD40092735D /* tip_arrow_wood.png */,
DAB8D6C915036BF600CED3BC /* tip_arrow_wood@2x.png */,
DAB8D6CA15036BF600CED3BC /* tip_basic_banana.png */,
DAB8D6CB15036BF600CED3BC /* tip_basic_banana@2x.png */,
@@ -3356,7 +3300,6 @@
buildActionMask = 2147483647;
files = (
DAB8D97C1503718B00CED3BC /* jquery-1.6.1.min.js in Resources */,
- DAAC35DC156BD66800C5FD93 /* ApptentiveResources.bundle in Resources */,
DA95D5F314DF0B9B008D1B94 /* IASKAppSettingsView.xib in Resources */,
DA95D5F414DF0B9F008D1B94 /* IASKAppSettingsWebView.xib in Resources */,
DA95D5F514DF0B9F008D1B94 /* IASKPSSliderSpecifierViewCell.xib in Resources */,
@@ -3937,87 +3880,24 @@
DAB8D93715036BF700CED3BC /* lock_red.png in Resources */,
DAB8D93815036BF700CED3BC /* lock_red@2x.png in Resources */,
DAB8D93915036BF700CED3BC /* logo-bare.png in Resources */,
- DAB8D93A15036BF700CED3BC /* tip_alert_banana.png in Resources */,
- DAB8D93B15036BF700CED3BC /* tip_alert_banana@2x.png in Resources */,
- DAB8D93C15036BF700CED3BC /* tip_alert_black.png in Resources */,
- DAB8D93D15036BF700CED3BC /* tip_alert_black@2x.png in Resources */,
- DAB8D93E15036BF700CED3BC /* tip_alert_gray.png in Resources */,
- DAB8D93F15036BF700CED3BC /* tip_alert_gray@2x.png in Resources */,
- DAB8D94015036BF700CED3BC /* tip_alert_mercury.png in Resources */,
- DAB8D94115036BF700CED3BC /* tip_alert_mercury@2x.png in Resources */,
- DAB8D94215036BF700CED3BC /* tip_alert_teal.png in Resources */,
- DAB8D94315036BF700CED3BC /* tip_alert_teal@2x.png in Resources */,
- DAB8D94415036BF700CED3BC /* tip_alert_wood.png in Resources */,
- DAB8D94515036BF700CED3BC /* tip_alert_wood@2x.png in Resources */,
- DAB8D94615036BF700CED3BC /* tip_arrow_banana@2x.png in Resources */,
- DAB8D94715036BF700CED3BC /* tip_arrow_black@2x.png in Resources */,
- DAB8D94815036BF700CED3BC /* tip_arrow_gray@2x.png in Resources */,
- DAB8D94915036BF700CED3BC /* tip_arrow_mercury@2x.png in Resources */,
- DAB8D94A15036BF700CED3BC /* tip_arrow_teal@2x.png in Resources */,
- DAB8D94B15036BF700CED3BC /* tip_arrow_wood@2x.png in Resources */,
- DAB8D94C15036BF700CED3BC /* tip_basic_banana.png in Resources */,
- DAB8D94D15036BF700CED3BC /* tip_basic_banana@2x.png in Resources */,
- DAB8D94E15036BF700CED3BC /* tip_basic_black.png in Resources */,
- DAB8D94F15036BF700CED3BC /* tip_basic_black@2x.png in Resources */,
- DAB8D95015036BF700CED3BC /* tip_basic_gray.png in Resources */,
- DAB8D95115036BF700CED3BC /* tip_basic_gray@2x.png in Resources */,
- DAB8D95215036BF700CED3BC /* tip_basic_mercury.png in Resources */,
- DAB8D95315036BF700CED3BC /* tip_basic_mercury@2x.png in Resources */,
- DAB8D95415036BF700CED3BC /* tip_basic_teal.png in Resources */,
- DAB8D95515036BF700CED3BC /* tip_basic_teal@2x.png in Resources */,
- DAB8D95615036BF700CED3BC /* tip_basic_wood.png in Resources */,
- DAB8D95715036BF700CED3BC /* tip_basic_wood@2x.png in Resources */,
- DAB8D95815036BF700CED3BC /* tip_download_banana.png in Resources */,
- DAB8D95915036BF700CED3BC /* tip_download_banana@2x.png in Resources */,
- DAB8D95A15036BF700CED3BC /* tip_download_black.png in Resources */,
- DAB8D95B15036BF700CED3BC /* tip_download_black@2x.png in Resources */,
- DAB8D95C15036BF700CED3BC /* tip_download_gray.png in Resources */,
- DAB8D95D15036BF700CED3BC /* tip_download_gray@2x.png in Resources */,
- DAB8D95E15036BF700CED3BC /* tip_download_mercury.png in Resources */,
- DAB8D95F15036BF700CED3BC /* tip_download_mercury@2x.png in Resources */,
- DAB8D96015036BF700CED3BC /* tip_download_teal.png in Resources */,
- DAB8D96115036BF700CED3BC /* tip_download_teal@2x.png in Resources */,
- DAB8D96215036BF700CED3BC /* tip_download_wood.png in Resources */,
- DAB8D96315036BF700CED3BC /* tip_download_wood@2x.png in Resources */,
- DAB8D96415036BF700CED3BC /* tip_large_banana.png in Resources */,
- DAB8D96515036BF700CED3BC /* tip_large_banana@2x.png in Resources */,
- DAB8D96615036BF700CED3BC /* tip_large_black.png in Resources */,
- DAB8D96715036BF700CED3BC /* tip_large_black@2x.png in Resources */,
- DAB8D96815036BF700CED3BC /* tip_large_gray.png in Resources */,
- DAB8D96915036BF700CED3BC /* tip_large_gray@2x.png in Resources */,
- DAB8D96A15036BF700CED3BC /* tip_large_mercury.png in Resources */,
- DAB8D96B15036BF700CED3BC /* tip_large_mercury@2x.png in Resources */,
- DAB8D96C15036BF700CED3BC /* tip_large_teal.png in Resources */,
- DAB8D96D15036BF700CED3BC /* tip_large_teal@2x.png in Resources */,
- DAB8D96E15036BF700CED3BC /* tip_large_wood.png in Resources */,
- DAB8D96F15036BF700CED3BC /* tip_large_wood@2x.png in Resources */,
- DAB8D97015036BF700CED3BC /* tip_location_banana.png in Resources */,
- DAB8D97115036BF700CED3BC /* tip_location_banana@2x.png in Resources */,
- DAB8D97215036BF700CED3BC /* tip_location_black.png in Resources */,
- DAB8D97315036BF700CED3BC /* tip_location_black@2x.png in Resources */,
- DAB8D97415036BF700CED3BC /* tip_location_gray.png in Resources */,
- DAB8D97515036BF700CED3BC /* tip_location_gray@2x.png in Resources */,
- DAB8D97615036BF700CED3BC /* tip_location_mercury.png in Resources */,
- DAB8D97715036BF700CED3BC /* tip_location_mercury@2x.png in Resources */,
- DAB8D97815036BF700CED3BC /* tip_location_teal.png in Resources */,
- DAB8D97915036BF700CED3BC /* tip_location_teal@2x.png in Resources */,
- DAB8D97A15036BF700CED3BC /* tip_location_wood.png in Resources */,
- DAB8D97B15036BF700CED3BC /* tip_location_wood@2x.png in Resources */,
DAFE4A5A1503982E003ABA7C /* Pearl.strings in Resources */,
DAD3126815528C9C00A3F9ED /* Crashlytics.plist in Resources */,
DAD3126C15528C9C00A3F9ED /* TestFlight.plist in Resources */,
DAD3129015528D1600A3F9ED /* Localytics.plist in Resources */,
DA0A1D0515690A9A0092735D /* Default.png in Resources */,
DA0A1D0615690A9A0092735D /* Default@2x.png in Resources */,
- DA0A1D0D15690AD40092735D /* tip_arrow_banana.png in Resources */,
- DA0A1D0E15690AD40092735D /* tip_arrow_black.png in Resources */,
- DA0A1D0F15690AD40092735D /* tip_arrow_gray.png in Resources */,
- DA0A1D1015690AD40092735D /* tip_arrow_mercury.png in Resources */,
- DA0A1D1115690AD40092735D /* tip_arrow_teal.png in Resources */,
- DA0A1D1215690AD40092735D /* tip_arrow_wood.png in Resources */,
DA0A1D1515690AF40092735D /* Icon-72@2x.png in Resources */,
DA0A1D1615690AF40092735D /* Icon-Small-50@2x.png in Resources */,
DAAC35E4156BDBA700C5FD93 /* Apptentive.plist in Resources */,
+ DACABB8515729E80008BA211 /* ApptentiveResources.bundle in Resources */,
+ DACABB861572A2A7008BA211 /* tip_alert_black.png in Resources */,
+ DACABB871572A2A7008BA211 /* tip_alert_black@2x.png in Resources */,
+ DACABB881572A2A7008BA211 /* tip_basic_black.png in Resources */,
+ DACABB891572A2A7008BA211 /* tip_basic_black@2x.png in Resources */,
+ DACABB8C1572A4A5008BA211 /* tip_basic_black_top_right.png in Resources */,
+ DACABB8D1572A4A5008BA211 /* tip_basic_black_top_right@2x.png in Resources */,
+ DACABB901572B76A008BA211 /* tip_basic_black_top.png in Resources */,
+ DACABB911572B76A008BA211 /* tip_basic_black_top@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/MasterPassword/MPTypes.h b/MasterPassword/MPTypes.h
index af54ff01..7bbe894f 100644
--- a/MasterPassword/MPTypes.h
+++ b/MasterPassword/MPTypes.h
@@ -75,6 +75,7 @@ typedef enum {
#define MPNotificationKeySet @"MPNotificationKeySet"
#define MPNotificationKeyUnset @"MPNotificationKeyUnset"
#define MPNotificationKeyForgotten @"MPNotificationKeyForgotten"
+#define MPNotificationElementUsed @"MPNotificationElementUsed"
NSData *keyForPassword(NSString *password);
NSData *keyIDForPassword(NSString *password);
diff --git a/MasterPassword/iOS/MPAppDelegate.m b/MasterPassword/iOS/MPAppDelegate.m
index c2dbe87d..feea1bfc 100644
--- a/MasterPassword/iOS/MPAppDelegate.m
+++ b/MasterPassword/iOS/MPAppDelegate.m
@@ -16,7 +16,6 @@
#import "TestFlight.h"
#import
#import "ATConnect.h"
-#import "ATAppRatingFlow.h"
@interface MPAppDelegate ()
@@ -148,6 +147,7 @@
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ [[[NSBundle mainBundle] mutableInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"];
[[[NSBundle mainBundle] mutableLocalizedInfoDictionary] setObject:@"Master Password" forKey:@"CFBundleDisplayName"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
@@ -219,23 +219,6 @@
[connection setApiKey:apptentiveAPIKey];
[connection setShouldTakeScreenshot:NO];
[connection addAdditionalInfoToFeedback:[PearlInfoPlist get].CFBundleVersion withKey:@"CFBundleVersion"];
-
- ATAppRatingFlow *ratingsFlow = [ATAppRatingFlow sharedRatingFlowWithAppID:[PearlConfig get].iTunesID];
- [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification object:nil queue:nil
- usingBlock:^(NSNotification *note) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [ratingsFlow appDidEnterForeground:YES
- viewController:self.navigationController];
- });
- }];
- [[NSNotificationCenter defaultCenter] addObserverForName:MPNotificationKeySet object:nil queue:nil
- usingBlock:^(NSNotification *note) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [ratingsFlow userDidPerformSignificantEvent:YES
- viewController:self.navigationController];
- });
- }];
- [ratingsFlow appDidLaunch:YES viewController:self.navigationController];
}
}
@catch (NSException *exception) {
diff --git a/MasterPassword/iOS/MPMainViewController.h b/MasterPassword/iOS/MPMainViewController.h
index b7b74fbc..d4480860 100644
--- a/MasterPassword/iOS/MPMainViewController.h
+++ b/MasterPassword/iOS/MPMainViewController.h
@@ -31,6 +31,8 @@
@property (weak, nonatomic) IBOutlet UILabel *contentTipBody;
@property (weak, nonatomic) IBOutlet UIImageView *contentTipEditIcon;
@property (weak, nonatomic) IBOutlet UIView *searchTipContainer;
+@property (weak, nonatomic) IBOutlet UIView *actionsTipContainer;
+@property (weak, nonatomic) IBOutlet UIView *typeTipContainer;
@property (copy) void (^contentTipCleanup)(BOOL finished);
diff --git a/MasterPassword/iOS/MPMainViewController.m b/MasterPassword/iOS/MPMainViewController.m
index 60b969a0..abf3e029 100644
--- a/MasterPassword/iOS/MPMainViewController.m
+++ b/MasterPassword/iOS/MPMainViewController.m
@@ -21,7 +21,6 @@
@interface MPMainViewController (Private)
- (void)updateAnimated:(BOOL)animated;
-- (void)updateWasAnimated:(BOOL)animated;
- (void)showContentTip:(NSString *)message withIcon:(UIImageView *)icon;
- (void)showAlertWithTitle:(NSString *)title message:(NSString *)message;
- (void)changeElementWithWarning:(NSString *)warning do:(void (^)(void))task;
@@ -46,7 +45,9 @@
@synthesize alertBody = _alertBody;
@synthesize contentTipBody = _contentTipBody;
@synthesize contentTipEditIcon = _contentTipEditIcon;
-@synthesize searchTipContainer = _searchTip;
+@synthesize searchTipContainer = _searchTipContainer;
+@synthesize actionsTipContainer = _actionsTipContainer;
+@synthesize typeTipContainer = _typeTipContainer;
@synthesize contentField = _contentField;
@synthesize contentTipCleanup;
@@ -73,30 +74,38 @@
[super viewWillAppear:animated];
- self.searchTipContainer.hidden = NO;
-
if (![self.activeElement.keyID isEqualToData:[MPAppDelegate get].keyID])
self.activeElement = nil;
self.searchDisplayController.searchBar.text = nil;
-
- if (!self.activeElement.name)
- [UIView animateWithDuration:animated? 0.2f: 0 animations:^{
- self.searchTipContainer.alpha = 1;
- }];
+
+ self.searchTipContainer.alpha = 0;
+ self.actionsTipContainer.alpha = 0;
+ self.typeTipContainer.alpha = 0;
[self setHelpHidden:[[MPiOSConfig get].helpHidden boolValue] animated:animated];
[self updateAnimated:animated];
}
-- (void)viewWillDisappear:(BOOL)animated {
-
- [super viewWillDisappear:animated];
-
- self.searchTipContainer.hidden = YES;
-}
-
- (void)viewDidAppear:(BOOL)animated {
+ if ([[MPiOSConfig get].firstRun boolValue])
+ [UIView animateWithDuration:animated? 0.3f: 0 animations:^{
+ self.actionsTipContainer.alpha = 1;
+ } completion:^(BOOL finished) {
+ if (finished) {
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+ [UIView animateWithDuration:0.2f animations:^{
+ self.actionsTipContainer.alpha = 0;
+ } completion:^(BOOL finished) {
+ if (![self.activeElement.name length])
+ [UIView animateWithDuration:animated? 0.3f: 0 animations:^{
+ self.searchTipContainer.alpha = 1;
+ }];
+ }];
+ });
+ }
+ }];
+
[super viewDidAppear:animated];
}
@@ -106,16 +115,6 @@
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.
- if (![self.searchTipContainer.superview isEqual:self.navigationController.navigationBar.superview]) {
- CGRect frameInWindow = [self.searchTipContainer.window convertRect:self.searchTipContainer.frame
- fromView:self.searchTipContainer.superview];
- [self.searchTipContainer removeFromSuperview];
- [self.navigationController.navigationBar.superview addSubview:self.searchTipContainer];
- self.searchTipContainer.frame = [self.searchTipContainer.window convertRect:frameInWindow
- toView:self.searchTipContainer.superview];
- }
-
self.alertBody.text = nil;
self.contentTipEditIcon.hidden = YES;
@@ -141,22 +140,19 @@
[self setContentTipBody:nil];
[self setContentTipEditIcon:nil];
[self setSearchTipContainer:nil];
+ [self setActionsTipContainer:nil];
+ [self setTypeTipContainer:nil];
[super viewDidUnload];
}
- (void)updateAnimated:(BOOL)animated {
- dispatch_async(dispatch_get_main_queue(), ^{
- if (animated)
- [UIView animateWithDuration:0.3f animations:^{
- [self updateWasAnimated:animated];
- }];
- else
- [self updateWasAnimated:animated];
- });
-}
-
-- (void)updateWasAnimated:(BOOL)animated {
+ if (animated) {
+ [UIView animateWithDuration:0.3f animations:^{
+ [self updateAnimated:NO];
+ }];
+ return;
+ }
[self setHelpChapter:self.activeElement? @"2": @"1"];
self.siteName.text = self.activeElement.name;
@@ -245,7 +241,7 @@
};
icon.hidden = NO;
- [UIView animateWithDuration:0.2f animations:^{
+ [UIView animateWithDuration:0.3f animations:^{
self.contentTipContainer.alpha = 1;
} completion:^(BOOL finished) {
if (finished) {
@@ -271,7 +267,7 @@
self.alertBody.text = message;
[self.alertBody scrollRangeToVisible:scrollRange];
- [UIView animateWithDuration:0.2f animations:^{
+ [UIView animateWithDuration:0.3f animations:^{
self.alertContainer.alpha = 1;
}];
});
@@ -421,15 +417,16 @@
[TestFlight openFeedbackView];
break;
}
- case 6: {
+ case 6:
#else
case 5: {
ATConnect *connection = [ATConnect sharedConnection];
[connection presentFeedbackControllerFromViewController:self];
break;
}
- case 6: {
+ case 6:
#endif
+ {
[[MPAppDelegate get] signOut:self];
[[MPAppDelegate get] loadKey:YES];
break;
@@ -437,12 +434,9 @@
}
[TestFlight passCheckpoint:MPTestFlightCheckpointAction];
- } cancelTitle:[PearlStrings get].commonButtonCancel destructiveTitle:nil
- otherTitles:
- [self isHelpVisible]? @"Hide Help": @"Show Help", @"FAQ", @"Tutorial", @"Settings", @"Export",
- @"Feedback",
- @"Sign Out",
- nil];
+ }
+ cancelTitle:[PearlStrings get].commonButtonCancel destructiveTitle:nil otherTitles:
+ [self isHelpVisible]? @"Hide Help": @"Show Help", @"FAQ", @"Tutorial", @"Settings", @"Export", @"Feedback", @"Sign Out", nil];
}
- (MPElementType)selectedType {
@@ -496,10 +490,24 @@
self.activeElement.name, self.activeElement.name)];
[[MPAppDelegate get] saveContext];
+ if ([[MPiOSConfig get].firstRun boolValue])
+ [UIView animateWithDuration:0.5f animations:^{
+ self.typeTipContainer.alpha = 1;
+ } completion:^(BOOL finished) {
+ if (finished) {
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+ [UIView animateWithDuration:0.2f animations:^{
+ self.typeTipContainer.alpha = 0;
+ }];
+ });
+ }
+ }];
+
[self.searchDisplayController setActive:NO animated:YES];
self.searchDisplayController.searchBar.text = self.activeElement.name;
[TestFlight passCheckpoint:MPTestFlightCheckpointSelectElement];
+ [[NSNotificationCenter defaultCenter] postNotificationName:MPNotificationElementUsed object:self.activeElement];
}
[self updateAnimated:YES];
diff --git a/MasterPassword/iOS/MPTypeViewController.h b/MasterPassword/iOS/MPTypeViewController.h
index b053f972..1e3c1371 100644
--- a/MasterPassword/iOS/MPTypeViewController.h
+++ b/MasterPassword/iOS/MPTypeViewController.h
@@ -20,5 +20,6 @@
@interface MPTypeViewController : UITableViewController
@property (nonatomic, weak) id delegate;
+@property (weak, nonatomic) IBOutlet UIView *recommendedTipContainer;
@end
diff --git a/MasterPassword/iOS/MPTypeViewController.m b/MasterPassword/iOS/MPTypeViewController.m
index 353ebd26..5d571a69 100644
--- a/MasterPassword/iOS/MPTypeViewController.m
+++ b/MasterPassword/iOS/MPTypeViewController.m
@@ -17,9 +17,33 @@
@implementation MPTypeViewController
@synthesize delegate;
+@synthesize recommendedTipContainer;
#pragma mark - View lifecycle
+- (void)viewWillAppear:(BOOL)animated {
+
+ self.recommendedTipContainer.alpha = 0;
+}
+
+- (void)viewDidAppear:(BOOL)animated {
+
+ if ([[MPiOSConfig get].firstRun boolValue])
+ [UIView animateWithDuration:animated? 0.3f: 0 animations:^{
+ self.recommendedTipContainer.alpha = 1;
+ } completion:^(BOOL finished) {
+ if (finished) {
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+ [UIView animateWithDuration:0.2f animations:^{
+ self.recommendedTipContainer.alpha = 0;
+ }];
+ });
+ }
+ }];
+
+ [super viewDidAppear:animated];
+}
+
- (void)viewDidLoad {
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"ui_background"]];
@@ -108,4 +132,8 @@
@throw nil;
}
+- (void)viewDidUnload {
+ [self setRecommendedTipContainer:nil];
+ [super viewDidUnload];
+}
@end
diff --git a/MasterPassword/iOS/MainStoryboard_iPhone.storyboard b/MasterPassword/iOS/MainStoryboard_iPhone.storyboard
index 4b7ed447..393eea54 100644
--- a/MasterPassword/iOS/MainStoryboard_iPhone.storyboard
+++ b/MasterPassword/iOS/MainStoryboard_iPhone.storyboard
@@ -1,5 +1,5 @@
-
+
@@ -61,7 +61,7 @@
-
+
These types create a safe password for your site.
The passwords aren't saved anywhere. This is a major advantage: if you lose your device, your passwords cannot be stolen. You can use any other device to get all your passwords back, no need for restoring backups or any other pains.
@@ -71,6 +71,24 @@ The passwords aren't saved anywhere. This is a major advantage: if you lose you
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -306,6 +324,9 @@ The passwords aren't saved anywhere. This is a major advantage: if you lose you
+
+
+
@@ -447,28 +468,6 @@ The passwords aren't saved anywhere. This is a major advantage: if you lose you
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -537,7 +536,7 @@ L4m3P4sSw0rD
-
+
@@ -547,16 +546,16 @@ L4m3P4sSw0rD
-
+
-
+
-
+
@@ -565,6 +564,70 @@ L4m3P4sSw0rD
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -576,6 +639,7 @@ L4m3P4sSw0rD
+
@@ -594,6 +658,7 @@ L4m3P4sSw0rD
+
@@ -731,7 +796,7 @@ L4m3P4sSw0rD
-
+
@@ -803,12 +868,15 @@ L4m3P4sSw0rD
+
+
+
diff --git a/Resources/Tooltips/tip_basic_black_top.png b/Resources/Tooltips/tip_basic_black_top.png
new file mode 100644
index 00000000..6fb2842c
Binary files /dev/null and b/Resources/Tooltips/tip_basic_black_top.png differ
diff --git a/Resources/Tooltips/tip_basic_black_top@2x.png b/Resources/Tooltips/tip_basic_black_top@2x.png
new file mode 100644
index 00000000..703e87b5
Binary files /dev/null and b/Resources/Tooltips/tip_basic_black_top@2x.png differ
diff --git a/Resources/Tooltips/tip_basic_black_top_right.png b/Resources/Tooltips/tip_basic_black_top_right.png
new file mode 100644
index 00000000..f60737e7
Binary files /dev/null and b/Resources/Tooltips/tip_basic_black_top_right.png differ
diff --git a/Resources/Tooltips/tip_basic_black_top_right@2x.png b/Resources/Tooltips/tip_basic_black_top_right@2x.png
new file mode 100644
index 00000000..0daf53ba
Binary files /dev/null and b/Resources/Tooltips/tip_basic_black_top_right@2x.png differ
diff --git a/Resources/help.html b/Resources/help.html
index 8670670e..3e1d0408 100644
--- a/Resources/help.html
+++ b/Resources/help.html
@@ -210,16 +210,16 @@
It's also important that you've chosen a long master password. Short master passwords, especially 4-digit
PIN codes, are trivial to guess by attackers. Using a 10-character master password provides
sufficient entropy to protect against any modern-day attempt at brute-forcing, assuming the password is not
- based on easily determined facts (names, birth dates, etc.). A better idea yet is to use a pass phrase,
- ideally an absurd sentence. These are usually much easier to remember and much harder to guess by attackers.
- If you're really paranoid, install a keyboard of a non-latin script (russian, chinese, ...) and create a
- master password using these characters or even a mix between scripts.
- Just don't forget it! :-)
+ based on easily determined facts (names, birth dates, etc.).
+
+
+ A better idea yet is to use a pass phrase, ideally an absurd sentence . These are usually
+ much easier to remember and much harder to guess by attackers.
Using the action icon on the top right, select Settings
to find some advanced settings for
the application. Here, you can disable Remember my password
. Doing so will force the
- application to ask for your master password each time you open it. That way, when you show your
+ application to ask for your master password each time you open it. That way, when you show your
phone to somebody else after unlocking it, they can't go through your passwords.
@@ -239,7 +239,7 @@
So how does this thing work internally?
The way Master Password works internally is fully disclosed . The source code for this application
- is also available from GitHub. I invite anyone with a technical background to go through these
+ is also available from GitHub . I invite anyone with a technical background to go through these
resources to make certain of the trustworthyness of Master Password.