From 8762a67395f50e22c80a7ebe6d2e2caa1a700004 Mon Sep 17 00:00:00 2001 From: Satraj Bambra Date: Thu, 15 Mar 2018 15:08:41 -0400 Subject: [PATCH] Initial commit. --- Bitcoin Private.xcodeproj/project.pbxproj | 735 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 46050 bytes .../xcschemes/xcschememanagement.plist | 14 + Bitcoin Private/AppDelegate.swift | 51 ++ .../AppIcon.appiconset/Contents.json | 98 +++ Bitcoin Private/Assets.xcassets/Contents.json | 6 + .../backspace.imageset/Contents.json | 26 + .../backspace.imageset/icon--backspace.png | Bin 0 -> 397 bytes .../backspace.imageset/icon--backspace@2x.png | Bin 0 -> 830 bytes .../backspace.imageset/icon--backspace@3x.png | Bin 0 -> 1132 bytes .../camera.imageset/Contents.json | 23 + .../camera.imageset/group4.png | Bin 0 -> 308 bytes .../camera.imageset/group4@2x.png | Bin 0 -> 606 bytes .../camera.imageset/group4@3x.png | Bin 0 -> 1013 bytes .../close.imageset/Contents.json | 23 + .../Assets.xcassets/close.imageset/close.png | Bin 0 -> 196 bytes .../close.imageset/close@2x.png | Bin 0 -> 317 bytes .../close.imageset/close@3x.png | Bin 0 -> 466 bytes .../copy.imageset/Contents.json | 23 + .../Assets.xcassets/copy.imageset/fill2.png | Bin 0 -> 260 bytes .../copy.imageset/fill2@2x.png | Bin 0 -> 373 bytes .../copy.imageset/fill2@3x.png | Bin 0 -> 512 bytes .../icon.imageset/Contents.json | 22 + .../Assets.xcassets/icon.imageset/icon@2x.png | Bin 0 -> 40615 bytes .../Assets.xcassets/icon.imageset/icon@3x.png | Bin 0 -> 65346 bytes .../icon_small.imageset/Contents.json | 21 + .../icon_small.imageset/icon_small@2x.png | Bin 0 -> 7175 bytes .../Base.lproj/LaunchScreen.storyboard | 42 + .../Extensions/UIColor+Gradient.swift | 82 ++ Bitcoin Private/Extensions/UIView+Shake.swift | 21 + Bitcoin Private/Info.plist | 47 ++ .../Utils/AppNavigationController.swift | 43 + Bitcoin Private/Utils/Constants.swift | 32 + Bitcoin Private/Utils/NibLoader.swift | 28 + .../LaunchViewController.swift | 96 +++ .../View Controllers/LaunchViewController.xib | 97 +++ .../ReceiveViewController.swift | 100 +++ .../ReceiveViewController.xib | 149 ++++ .../View Controllers/ScanViewController.swift | 129 +++ .../View Controllers/ScanViewController.xib | 22 + .../SendAmountViewController.swift | 120 +++ .../SendAmountViewController.xib | 361 +++++++++ .../View Controllers/SendViewController.swift | 125 +++ .../View Controllers/SendViewController.xib | 188 +++++ .../MnemonicViewController.swift | 94 +++ .../MnemonicViewController.xib | 97 +++ .../PinViewController.swift | 141 ++++ .../PinViewController.xib | 139 ++++ .../VerificationViewController.swift | 270 +++++++ .../VerificationViewController.xib | 253 ++++++ .../WalletTitleViewController.swift | 54 ++ .../WalletTitleViewController.xib | 78 ++ .../WalletViewController.swift | 130 ++++ .../View Controllers/WalletViewController.xib | 202 +++++ Bitcoin Private/Views/AppButton.swift | 36 + .../Views/Cells/TransactionHistoryCell.swift | 27 + .../Views/Cells/TransactionHistoryCell.xib | 81 ++ Bitcoin Private/Views/Cells/WalletCell.swift | 29 + Bitcoin Private/Views/Cells/WalletCell.xib | 107 +++ .../Views/Cells/WordSuggestionCell.swift | 29 + .../Views/Cells/WordSuggestionCell.xib | 45 ++ Bitcoin Private/Views/PillView.swift | 54 ++ Bitcoin Private/Views/PinView.swift | 51 ++ Bitcoin Private/Views/PinView.xib | 71 ++ .../Bitcoin_PrivateTests.swift | 36 + Bitcoin PrivateTests/Info.plist | 22 + .../Bitcoin_PrivateUITests.swift | 36 + Bitcoin PrivateUITests/Info.plist | 22 + Podfile | 20 + 70 files changed, 4855 insertions(+) create mode 100644 Bitcoin Private.xcodeproj/project.pbxproj create mode 100644 Bitcoin Private.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Bitcoin Private.xcodeproj/project.xcworkspace/xcuserdata/satrajbambra.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Bitcoin Private.xcodeproj/xcuserdata/satrajbambra.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Bitcoin Private/AppDelegate.swift create mode 100644 Bitcoin Private/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Bitcoin Private/Assets.xcassets/Contents.json create mode 100644 Bitcoin Private/Assets.xcassets/backspace.imageset/Contents.json create mode 100644 Bitcoin Private/Assets.xcassets/backspace.imageset/icon--backspace.png create mode 100644 Bitcoin Private/Assets.xcassets/backspace.imageset/icon--backspace@2x.png create mode 100644 Bitcoin Private/Assets.xcassets/backspace.imageset/icon--backspace@3x.png create mode 100644 Bitcoin Private/Assets.xcassets/camera.imageset/Contents.json create mode 100644 Bitcoin Private/Assets.xcassets/camera.imageset/group4.png create mode 100644 Bitcoin Private/Assets.xcassets/camera.imageset/group4@2x.png create mode 100644 Bitcoin Private/Assets.xcassets/camera.imageset/group4@3x.png create mode 100644 Bitcoin Private/Assets.xcassets/close.imageset/Contents.json create mode 100644 Bitcoin Private/Assets.xcassets/close.imageset/close.png create mode 100644 Bitcoin Private/Assets.xcassets/close.imageset/close@2x.png create mode 100644 Bitcoin Private/Assets.xcassets/close.imageset/close@3x.png create mode 100644 Bitcoin Private/Assets.xcassets/copy.imageset/Contents.json create mode 100644 Bitcoin Private/Assets.xcassets/copy.imageset/fill2.png create mode 100644 Bitcoin Private/Assets.xcassets/copy.imageset/fill2@2x.png create mode 100644 Bitcoin Private/Assets.xcassets/copy.imageset/fill2@3x.png create mode 100644 Bitcoin Private/Assets.xcassets/icon.imageset/Contents.json create mode 100644 Bitcoin Private/Assets.xcassets/icon.imageset/icon@2x.png create mode 100644 Bitcoin Private/Assets.xcassets/icon.imageset/icon@3x.png create mode 100644 Bitcoin Private/Assets.xcassets/icon_small.imageset/Contents.json create mode 100644 Bitcoin Private/Assets.xcassets/icon_small.imageset/icon_small@2x.png create mode 100644 Bitcoin Private/Base.lproj/LaunchScreen.storyboard create mode 100644 Bitcoin Private/Extensions/UIColor+Gradient.swift create mode 100644 Bitcoin Private/Extensions/UIView+Shake.swift create mode 100644 Bitcoin Private/Info.plist create mode 100644 Bitcoin Private/Utils/AppNavigationController.swift create mode 100644 Bitcoin Private/Utils/Constants.swift create mode 100644 Bitcoin Private/Utils/NibLoader.swift create mode 100644 Bitcoin Private/View Controllers/LaunchViewController.swift create mode 100644 Bitcoin Private/View Controllers/LaunchViewController.xib create mode 100644 Bitcoin Private/View Controllers/ReceiveViewController.swift create mode 100644 Bitcoin Private/View Controllers/ReceiveViewController.xib create mode 100644 Bitcoin Private/View Controllers/ScanViewController.swift create mode 100644 Bitcoin Private/View Controllers/ScanViewController.xib create mode 100644 Bitcoin Private/View Controllers/SendAmountViewController.swift create mode 100644 Bitcoin Private/View Controllers/SendAmountViewController.xib create mode 100644 Bitcoin Private/View Controllers/SendViewController.swift create mode 100644 Bitcoin Private/View Controllers/SendViewController.xib create mode 100644 Bitcoin Private/View Controllers/Wallet Creation and Restoration/MnemonicViewController.swift create mode 100644 Bitcoin Private/View Controllers/Wallet Creation and Restoration/MnemonicViewController.xib create mode 100644 Bitcoin Private/View Controllers/Wallet Creation and Restoration/PinViewController.swift create mode 100644 Bitcoin Private/View Controllers/Wallet Creation and Restoration/PinViewController.xib create mode 100644 Bitcoin Private/View Controllers/Wallet Creation and Restoration/VerificationViewController.swift create mode 100644 Bitcoin Private/View Controllers/Wallet Creation and Restoration/VerificationViewController.xib create mode 100644 Bitcoin Private/View Controllers/Wallet Creation and Restoration/WalletTitleViewController.swift create mode 100644 Bitcoin Private/View Controllers/Wallet Creation and Restoration/WalletTitleViewController.xib create mode 100644 Bitcoin Private/View Controllers/WalletViewController.swift create mode 100644 Bitcoin Private/View Controllers/WalletViewController.xib create mode 100644 Bitcoin Private/Views/AppButton.swift create mode 100644 Bitcoin Private/Views/Cells/TransactionHistoryCell.swift create mode 100644 Bitcoin Private/Views/Cells/TransactionHistoryCell.xib create mode 100644 Bitcoin Private/Views/Cells/WalletCell.swift create mode 100644 Bitcoin Private/Views/Cells/WalletCell.xib create mode 100644 Bitcoin Private/Views/Cells/WordSuggestionCell.swift create mode 100644 Bitcoin Private/Views/Cells/WordSuggestionCell.xib create mode 100644 Bitcoin Private/Views/PillView.swift create mode 100644 Bitcoin Private/Views/PinView.swift create mode 100644 Bitcoin Private/Views/PinView.xib create mode 100644 Bitcoin PrivateTests/Bitcoin_PrivateTests.swift create mode 100644 Bitcoin PrivateTests/Info.plist create mode 100644 Bitcoin PrivateUITests/Bitcoin_PrivateUITests.swift create mode 100644 Bitcoin PrivateUITests/Info.plist create mode 100644 Podfile diff --git a/Bitcoin Private.xcodeproj/project.pbxproj b/Bitcoin Private.xcodeproj/project.pbxproj new file mode 100644 index 0000000..390dcad --- /dev/null +++ b/Bitcoin Private.xcodeproj/project.pbxproj @@ -0,0 +1,735 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + EC367BAF205ABC37008FF479 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BAE205ABC37008FF479 /* AppDelegate.swift */; }; + EC367BB6205ABC37008FF479 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC367BB5205ABC37008FF479 /* Assets.xcassets */; }; + EC367BB9205ABC37008FF479 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EC367BB7205ABC37008FF479 /* LaunchScreen.storyboard */; }; + EC367BC4205ABC37008FF479 /* Bitcoin_PrivateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BC3205ABC37008FF479 /* Bitcoin_PrivateTests.swift */; }; + EC367BCF205ABC37008FF479 /* Bitcoin_PrivateUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BCE205ABC37008FF479 /* Bitcoin_PrivateUITests.swift */; }; + EC367BF2205ABD7F008FF479 /* WalletViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BDD205ABD7F008FF479 /* WalletViewController.xib */; }; + EC367BF3205ABD7F008FF479 /* VerificationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BDF205ABD7F008FF479 /* VerificationViewController.xib */; }; + EC367BF4205ABD7F008FF479 /* WalletTitleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BE0205ABD7F008FF479 /* WalletTitleViewController.swift */; }; + EC367BF5205ABD7F008FF479 /* MnemonicViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BE1205ABD7F008FF479 /* MnemonicViewController.xib */; }; + EC367BF6205ABD7F008FF479 /* MnemonicViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BE2205ABD7F008FF479 /* MnemonicViewController.swift */; }; + EC367BF7205ABD7F008FF479 /* VerificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BE3205ABD7F008FF479 /* VerificationViewController.swift */; }; + EC367BF8205ABD7F008FF479 /* WalletTitleViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BE4205ABD7F008FF479 /* WalletTitleViewController.xib */; }; + EC367BF9205ABD7F008FF479 /* PinViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BE5205ABD7F008FF479 /* PinViewController.swift */; }; + EC367BFA205ABD7F008FF479 /* PinViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BE6205ABD7F008FF479 /* PinViewController.xib */; }; + EC367BFB205ABD7F008FF479 /* SendViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BE7205ABD7F008FF479 /* SendViewController.xib */; }; + EC367BFC205ABD7F008FF479 /* ReceiveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BE8205ABD7F008FF479 /* ReceiveViewController.swift */; }; + EC367BFD205ABD7F008FF479 /* ScanViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BE9205ABD7F008FF479 /* ScanViewController.xib */; }; + EC367BFE205ABD7F008FF479 /* WalletViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BEA205ABD7F008FF479 /* WalletViewController.swift */; }; + EC367BFF205ABD7F008FF479 /* LaunchViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BEB205ABD7F008FF479 /* LaunchViewController.xib */; }; + EC367C00205ABD7F008FF479 /* SendViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BEC205ABD7F008FF479 /* SendViewController.swift */; }; + EC367C01205ABD7F008FF479 /* SendAmountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BED205ABD7F008FF479 /* SendAmountViewController.swift */; }; + EC367C02205ABD7F008FF479 /* SendAmountViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BEE205ABD7F008FF479 /* SendAmountViewController.xib */; }; + EC367C03205ABD7F008FF479 /* ScanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BEF205ABD7F008FF479 /* ScanViewController.swift */; }; + EC367C04205ABD7F008FF479 /* ReceiveViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367BF0205ABD7F008FF479 /* ReceiveViewController.xib */; }; + EC367C05205ABD7F008FF479 /* LaunchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367BF1205ABD7F008FF479 /* LaunchViewController.swift */; }; + EC367C0B205ABF48008FF479 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C07205ABF48008FF479 /* Constants.swift */; }; + EC367C0D205ABF48008FF479 /* AppNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C09205ABF48008FF479 /* AppNavigationController.swift */; }; + EC367C0E205ABF48008FF479 /* NibLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C0A205ABF48008FF479 /* NibLoader.swift */; }; + EC367C1B205ABF52008FF479 /* WordSuggestionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C11205ABF52008FF479 /* WordSuggestionCell.swift */; }; + EC367C1C205ABF52008FF479 /* WordSuggestionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367C12205ABF52008FF479 /* WordSuggestionCell.xib */; }; + EC367C1D205ABF52008FF479 /* TransactionHistoryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367C13205ABF52008FF479 /* TransactionHistoryCell.xib */; }; + EC367C1E205ABF52008FF479 /* TransactionHistoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C14205ABF52008FF479 /* TransactionHistoryCell.swift */; }; + EC367C1F205ABF52008FF479 /* WalletCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367C15205ABF52008FF479 /* WalletCell.xib */; }; + EC367C20205ABF52008FF479 /* WalletCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C16205ABF52008FF479 /* WalletCell.swift */; }; + EC367C21205ABF52008FF479 /* PillView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C17205ABF52008FF479 /* PillView.swift */; }; + EC367C22205ABF52008FF479 /* AppButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C18205ABF52008FF479 /* AppButton.swift */; }; + EC367C23205ABF52008FF479 /* PinView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C19205ABF52008FF479 /* PinView.swift */; }; + EC367C24205ABF52008FF479 /* PinView.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC367C1A205ABF52008FF479 /* PinView.xib */; }; + EC367C28205ABFD4008FF479 /* UIColor+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C26205ABFD4008FF479 /* UIColor+Gradient.swift */; }; + EC367C29205ABFD4008FF479 /* UIView+Shake.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC367C27205ABFD4008FF479 /* UIView+Shake.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + EC367BC0205ABC37008FF479 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EC367BA3205ABC37008FF479 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EC367BAA205ABC37008FF479; + remoteInfo = "Bitcoin Private"; + }; + EC367BCB205ABC37008FF479 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EC367BA3205ABC37008FF479 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EC367BAA205ABC37008FF479; + remoteInfo = "Bitcoin Private"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + EC367BAB205ABC37008FF479 /* Bitcoin Private.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Bitcoin Private.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + EC367BAE205ABC37008FF479 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + EC367BB5205ABC37008FF479 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + EC367BB8205ABC37008FF479 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + EC367BBA205ABC37008FF479 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + EC367BBF205ABC37008FF479 /* Bitcoin PrivateTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Bitcoin PrivateTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + EC367BC3205ABC37008FF479 /* Bitcoin_PrivateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bitcoin_PrivateTests.swift; sourceTree = ""; }; + EC367BC5205ABC37008FF479 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + EC367BCA205ABC37008FF479 /* Bitcoin PrivateUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Bitcoin PrivateUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + EC367BCE205ABC37008FF479 /* Bitcoin_PrivateUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bitcoin_PrivateUITests.swift; sourceTree = ""; }; + EC367BD0205ABC37008FF479 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + EC367BDD205ABD7F008FF479 /* WalletViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WalletViewController.xib; sourceTree = ""; }; + EC367BDF205ABD7F008FF479 /* VerificationViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VerificationViewController.xib; sourceTree = ""; }; + EC367BE0205ABD7F008FF479 /* WalletTitleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletTitleViewController.swift; sourceTree = ""; }; + EC367BE1205ABD7F008FF479 /* MnemonicViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MnemonicViewController.xib; sourceTree = ""; }; + EC367BE2205ABD7F008FF479 /* MnemonicViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MnemonicViewController.swift; sourceTree = ""; }; + EC367BE3205ABD7F008FF479 /* VerificationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerificationViewController.swift; sourceTree = ""; }; + EC367BE4205ABD7F008FF479 /* WalletTitleViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WalletTitleViewController.xib; sourceTree = ""; }; + EC367BE5205ABD7F008FF479 /* PinViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PinViewController.swift; sourceTree = ""; }; + EC367BE6205ABD7F008FF479 /* PinViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PinViewController.xib; sourceTree = ""; }; + EC367BE7205ABD7F008FF479 /* SendViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SendViewController.xib; sourceTree = ""; }; + EC367BE8205ABD7F008FF479 /* ReceiveViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReceiveViewController.swift; sourceTree = ""; }; + EC367BE9205ABD7F008FF479 /* ScanViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ScanViewController.xib; sourceTree = ""; }; + EC367BEA205ABD7F008FF479 /* WalletViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletViewController.swift; sourceTree = ""; }; + EC367BEB205ABD7F008FF479 /* LaunchViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchViewController.xib; sourceTree = ""; }; + EC367BEC205ABD7F008FF479 /* SendViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendViewController.swift; sourceTree = ""; }; + EC367BED205ABD7F008FF479 /* SendAmountViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendAmountViewController.swift; sourceTree = ""; }; + EC367BEE205ABD7F008FF479 /* SendAmountViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SendAmountViewController.xib; sourceTree = ""; }; + EC367BEF205ABD7F008FF479 /* ScanViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScanViewController.swift; sourceTree = ""; }; + EC367BF0205ABD7F008FF479 /* ReceiveViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ReceiveViewController.xib; sourceTree = ""; }; + EC367BF1205ABD7F008FF479 /* LaunchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchViewController.swift; sourceTree = ""; }; + EC367C07205ABF48008FF479 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + EC367C09205ABF48008FF479 /* AppNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppNavigationController.swift; sourceTree = ""; }; + EC367C0A205ABF48008FF479 /* NibLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NibLoader.swift; sourceTree = ""; }; + EC367C11205ABF52008FF479 /* WordSuggestionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordSuggestionCell.swift; sourceTree = ""; }; + EC367C12205ABF52008FF479 /* WordSuggestionCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WordSuggestionCell.xib; sourceTree = ""; }; + EC367C13205ABF52008FF479 /* TransactionHistoryCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TransactionHistoryCell.xib; sourceTree = ""; }; + EC367C14205ABF52008FF479 /* TransactionHistoryCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionHistoryCell.swift; sourceTree = ""; }; + EC367C15205ABF52008FF479 /* WalletCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WalletCell.xib; sourceTree = ""; }; + EC367C16205ABF52008FF479 /* WalletCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletCell.swift; sourceTree = ""; }; + EC367C17205ABF52008FF479 /* PillView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PillView.swift; sourceTree = ""; }; + EC367C18205ABF52008FF479 /* AppButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppButton.swift; sourceTree = ""; }; + EC367C19205ABF52008FF479 /* PinView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PinView.swift; sourceTree = ""; }; + EC367C1A205ABF52008FF479 /* PinView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PinView.xib; sourceTree = ""; }; + EC367C26205ABFD4008FF479 /* UIColor+Gradient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Gradient.swift"; sourceTree = ""; }; + EC367C27205ABFD4008FF479 /* UIView+Shake.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Shake.swift"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + EC367BA8205ABC37008FF479 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EC367BBC205ABC37008FF479 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EC367BC7205ABC37008FF479 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + EC367BA2205ABC37008FF479 = { + isa = PBXGroup; + children = ( + EC367BAD205ABC37008FF479 /* Bitcoin Private */, + EC367BC2205ABC37008FF479 /* Bitcoin PrivateTests */, + EC367BCD205ABC37008FF479 /* Bitcoin PrivateUITests */, + EC367BAC205ABC37008FF479 /* Products */, + ); + sourceTree = ""; + }; + EC367BAC205ABC37008FF479 /* Products */ = { + isa = PBXGroup; + children = ( + EC367BAB205ABC37008FF479 /* Bitcoin Private.app */, + EC367BBF205ABC37008FF479 /* Bitcoin PrivateTests.xctest */, + EC367BCA205ABC37008FF479 /* Bitcoin PrivateUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + EC367BAD205ABC37008FF479 /* Bitcoin Private */ = { + isa = PBXGroup; + children = ( + EC367BAE205ABC37008FF479 /* AppDelegate.swift */, + EC367C25205ABFD4008FF479 /* Extensions */, + EC367C0F205ABF52008FF479 /* Views */, + EC367C06205ABF48008FF479 /* Utils */, + EC367BDC205ABD7F008FF479 /* View Controllers */, + EC367BB5205ABC37008FF479 /* Assets.xcassets */, + EC367BB7205ABC37008FF479 /* LaunchScreen.storyboard */, + EC367BBA205ABC37008FF479 /* Info.plist */, + ); + path = "Bitcoin Private"; + sourceTree = ""; + }; + EC367BC2205ABC37008FF479 /* Bitcoin PrivateTests */ = { + isa = PBXGroup; + children = ( + EC367BC3205ABC37008FF479 /* Bitcoin_PrivateTests.swift */, + EC367BC5205ABC37008FF479 /* Info.plist */, + ); + path = "Bitcoin PrivateTests"; + sourceTree = ""; + }; + EC367BCD205ABC37008FF479 /* Bitcoin PrivateUITests */ = { + isa = PBXGroup; + children = ( + EC367BCE205ABC37008FF479 /* Bitcoin_PrivateUITests.swift */, + EC367BD0205ABC37008FF479 /* Info.plist */, + ); + path = "Bitcoin PrivateUITests"; + sourceTree = ""; + }; + EC367BDC205ABD7F008FF479 /* View Controllers */ = { + isa = PBXGroup; + children = ( + EC367BDE205ABD7F008FF479 /* Wallet Creation and Restoration */, + EC367BF1205ABD7F008FF479 /* LaunchViewController.swift */, + EC367BEB205ABD7F008FF479 /* LaunchViewController.xib */, + EC367BEF205ABD7F008FF479 /* ScanViewController.swift */, + EC367BE9205ABD7F008FF479 /* ScanViewController.xib */, + EC367BEC205ABD7F008FF479 /* SendViewController.swift */, + EC367BE7205ABD7F008FF479 /* SendViewController.xib */, + EC367BED205ABD7F008FF479 /* SendAmountViewController.swift */, + EC367BEE205ABD7F008FF479 /* SendAmountViewController.xib */, + EC367BE8205ABD7F008FF479 /* ReceiveViewController.swift */, + EC367BF0205ABD7F008FF479 /* ReceiveViewController.xib */, + EC367BEA205ABD7F008FF479 /* WalletViewController.swift */, + EC367BDD205ABD7F008FF479 /* WalletViewController.xib */, + ); + path = "View Controllers"; + sourceTree = ""; + }; + EC367BDE205ABD7F008FF479 /* Wallet Creation and Restoration */ = { + isa = PBXGroup; + children = ( + EC367BE2205ABD7F008FF479 /* MnemonicViewController.swift */, + EC367BE1205ABD7F008FF479 /* MnemonicViewController.xib */, + EC367BE5205ABD7F008FF479 /* PinViewController.swift */, + EC367BE6205ABD7F008FF479 /* PinViewController.xib */, + EC367BE3205ABD7F008FF479 /* VerificationViewController.swift */, + EC367BDF205ABD7F008FF479 /* VerificationViewController.xib */, + EC367BE0205ABD7F008FF479 /* WalletTitleViewController.swift */, + EC367BE4205ABD7F008FF479 /* WalletTitleViewController.xib */, + ); + path = "Wallet Creation and Restoration"; + sourceTree = ""; + }; + EC367C06205ABF48008FF479 /* Utils */ = { + isa = PBXGroup; + children = ( + EC367C07205ABF48008FF479 /* Constants.swift */, + EC367C09205ABF48008FF479 /* AppNavigationController.swift */, + EC367C0A205ABF48008FF479 /* NibLoader.swift */, + ); + path = Utils; + sourceTree = ""; + }; + EC367C0F205ABF52008FF479 /* Views */ = { + isa = PBXGroup; + children = ( + EC367C10205ABF52008FF479 /* Cells */, + EC367C17205ABF52008FF479 /* PillView.swift */, + EC367C18205ABF52008FF479 /* AppButton.swift */, + EC367C19205ABF52008FF479 /* PinView.swift */, + EC367C1A205ABF52008FF479 /* PinView.xib */, + ); + path = Views; + sourceTree = ""; + }; + EC367C10205ABF52008FF479 /* Cells */ = { + isa = PBXGroup; + children = ( + EC367C11205ABF52008FF479 /* WordSuggestionCell.swift */, + EC367C12205ABF52008FF479 /* WordSuggestionCell.xib */, + EC367C14205ABF52008FF479 /* TransactionHistoryCell.swift */, + EC367C13205ABF52008FF479 /* TransactionHistoryCell.xib */, + EC367C16205ABF52008FF479 /* WalletCell.swift */, + EC367C15205ABF52008FF479 /* WalletCell.xib */, + ); + path = Cells; + sourceTree = ""; + }; + EC367C25205ABFD4008FF479 /* Extensions */ = { + isa = PBXGroup; + children = ( + EC367C26205ABFD4008FF479 /* UIColor+Gradient.swift */, + EC367C27205ABFD4008FF479 /* UIView+Shake.swift */, + ); + path = Extensions; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + EC367BAA205ABC37008FF479 /* Bitcoin Private */ = { + isa = PBXNativeTarget; + buildConfigurationList = EC367BD3205ABC38008FF479 /* Build configuration list for PBXNativeTarget "Bitcoin Private" */; + buildPhases = ( + EC367BA7205ABC37008FF479 /* Sources */, + EC367BA8205ABC37008FF479 /* Frameworks */, + EC367BA9205ABC37008FF479 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Bitcoin Private"; + productName = "Bitcoin Private"; + productReference = EC367BAB205ABC37008FF479 /* Bitcoin Private.app */; + productType = "com.apple.product-type.application"; + }; + EC367BBE205ABC37008FF479 /* Bitcoin PrivateTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = EC367BD6205ABC38008FF479 /* Build configuration list for PBXNativeTarget "Bitcoin PrivateTests" */; + buildPhases = ( + EC367BBB205ABC37008FF479 /* Sources */, + EC367BBC205ABC37008FF479 /* Frameworks */, + EC367BBD205ABC37008FF479 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + EC367BC1205ABC37008FF479 /* PBXTargetDependency */, + ); + name = "Bitcoin PrivateTests"; + productName = "Bitcoin PrivateTests"; + productReference = EC367BBF205ABC37008FF479 /* Bitcoin PrivateTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + EC367BC9205ABC37008FF479 /* Bitcoin PrivateUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = EC367BD9205ABC38008FF479 /* Build configuration list for PBXNativeTarget "Bitcoin PrivateUITests" */; + buildPhases = ( + EC367BC6205ABC37008FF479 /* Sources */, + EC367BC7205ABC37008FF479 /* Frameworks */, + EC367BC8205ABC37008FF479 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + EC367BCC205ABC37008FF479 /* PBXTargetDependency */, + ); + name = "Bitcoin PrivateUITests"; + productName = "Bitcoin PrivateUITests"; + productReference = EC367BCA205ABC37008FF479 /* Bitcoin PrivateUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + EC367BA3205ABC37008FF479 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0920; + ORGANIZATIONNAME = "Satraj Bambra"; + TargetAttributes = { + EC367BAA205ABC37008FF479 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Automatic; + }; + EC367BBE205ABC37008FF479 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Automatic; + TestTargetID = EC367BAA205ABC37008FF479; + }; + EC367BC9205ABC37008FF479 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Automatic; + TestTargetID = EC367BAA205ABC37008FF479; + }; + }; + }; + buildConfigurationList = EC367BA6205ABC37008FF479 /* Build configuration list for PBXProject "Bitcoin Private" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = EC367BA2205ABC37008FF479; + productRefGroup = EC367BAC205ABC37008FF479 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + EC367BAA205ABC37008FF479 /* Bitcoin Private */, + EC367BBE205ABC37008FF479 /* Bitcoin PrivateTests */, + EC367BC9205ABC37008FF479 /* Bitcoin PrivateUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + EC367BA9205ABC37008FF479 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EC367C04205ABD7F008FF479 /* ReceiveViewController.xib in Resources */, + EC367BFD205ABD7F008FF479 /* ScanViewController.xib in Resources */, + EC367BFB205ABD7F008FF479 /* SendViewController.xib in Resources */, + EC367BF5205ABD7F008FF479 /* MnemonicViewController.xib in Resources */, + EC367BB9205ABC37008FF479 /* LaunchScreen.storyboard in Resources */, + EC367BF3205ABD7F008FF479 /* VerificationViewController.xib in Resources */, + EC367C1C205ABF52008FF479 /* WordSuggestionCell.xib in Resources */, + EC367BB6205ABC37008FF479 /* Assets.xcassets in Resources */, + EC367BF8205ABD7F008FF479 /* WalletTitleViewController.xib in Resources */, + EC367C1D205ABF52008FF479 /* TransactionHistoryCell.xib in Resources */, + EC367BFF205ABD7F008FF479 /* LaunchViewController.xib in Resources */, + EC367C02205ABD7F008FF479 /* SendAmountViewController.xib in Resources */, + EC367BF2205ABD7F008FF479 /* WalletViewController.xib in Resources */, + EC367C1F205ABF52008FF479 /* WalletCell.xib in Resources */, + EC367C24205ABF52008FF479 /* PinView.xib in Resources */, + EC367BFA205ABD7F008FF479 /* PinViewController.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EC367BBD205ABC37008FF479 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EC367BC8205ABC37008FF479 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + EC367BA7205ABC37008FF479 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EC367BF6205ABD7F008FF479 /* MnemonicViewController.swift in Sources */, + EC367C21205ABF52008FF479 /* PillView.swift in Sources */, + EC367BF4205ABD7F008FF479 /* WalletTitleViewController.swift in Sources */, + EC367C00205ABD7F008FF479 /* SendViewController.swift in Sources */, + EC367C03205ABD7F008FF479 /* ScanViewController.swift in Sources */, + EC367BF9205ABD7F008FF479 /* PinViewController.swift in Sources */, + EC367C1E205ABF52008FF479 /* TransactionHistoryCell.swift in Sources */, + EC367C29205ABFD4008FF479 /* UIView+Shake.swift in Sources */, + EC367C20205ABF52008FF479 /* WalletCell.swift in Sources */, + EC367C23205ABF52008FF479 /* PinView.swift in Sources */, + EC367BF7205ABD7F008FF479 /* VerificationViewController.swift in Sources */, + EC367BFC205ABD7F008FF479 /* ReceiveViewController.swift in Sources */, + EC367C0B205ABF48008FF479 /* Constants.swift in Sources */, + EC367C05205ABD7F008FF479 /* LaunchViewController.swift in Sources */, + EC367C22205ABF52008FF479 /* AppButton.swift in Sources */, + EC367C0D205ABF48008FF479 /* AppNavigationController.swift in Sources */, + EC367C1B205ABF52008FF479 /* WordSuggestionCell.swift in Sources */, + EC367C0E205ABF48008FF479 /* NibLoader.swift in Sources */, + EC367C28205ABFD4008FF479 /* UIColor+Gradient.swift in Sources */, + EC367C01205ABD7F008FF479 /* SendAmountViewController.swift in Sources */, + EC367BFE205ABD7F008FF479 /* WalletViewController.swift in Sources */, + EC367BAF205ABC37008FF479 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EC367BBB205ABC37008FF479 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EC367BC4205ABC37008FF479 /* Bitcoin_PrivateTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EC367BC6205ABC37008FF479 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EC367BCF205ABC37008FF479 /* Bitcoin_PrivateUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + EC367BC1205ABC37008FF479 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = EC367BAA205ABC37008FF479 /* Bitcoin Private */; + targetProxy = EC367BC0205ABC37008FF479 /* PBXContainerItemProxy */; + }; + EC367BCC205ABC37008FF479 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = EC367BAA205ABC37008FF479 /* Bitcoin Private */; + targetProxy = EC367BCB205ABC37008FF479 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + EC367BB7205ABC37008FF479 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + EC367BB8205ABC37008FF479 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + EC367BD1205ABC38008FF479 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + EC367BD2205ABC38008FF479 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + EC367BD4205ABC38008FF479 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2C24FP5V5L; + INFOPLIST_FILE = "Bitcoin Private/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.btcp.Bitcoin-Private"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + EC367BD5205ABC38008FF479 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2C24FP5V5L; + INFOPLIST_FILE = "Bitcoin Private/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.btcp.Bitcoin-Private"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + EC367BD7205ABC38008FF479 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2C24FP5V5L; + INFOPLIST_FILE = "Bitcoin PrivateTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.btcp.Bitcoin-PrivateTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Bitcoin Private.app/Bitcoin Private"; + }; + name = Debug; + }; + EC367BD8205ABC38008FF479 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2C24FP5V5L; + INFOPLIST_FILE = "Bitcoin PrivateTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.btcp.Bitcoin-PrivateTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Bitcoin Private.app/Bitcoin Private"; + }; + name = Release; + }; + EC367BDA205ABC38008FF479 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2C24FP5V5L; + INFOPLIST_FILE = "Bitcoin PrivateUITests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.btcp.Bitcoin-PrivateUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Bitcoin Private"; + }; + name = Debug; + }; + EC367BDB205ABC38008FF479 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2C24FP5V5L; + INFOPLIST_FILE = "Bitcoin PrivateUITests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.btcp.Bitcoin-PrivateUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Bitcoin Private"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + EC367BA6205ABC37008FF479 /* Build configuration list for PBXProject "Bitcoin Private" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EC367BD1205ABC38008FF479 /* Debug */, + EC367BD2205ABC38008FF479 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EC367BD3205ABC38008FF479 /* Build configuration list for PBXNativeTarget "Bitcoin Private" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EC367BD4205ABC38008FF479 /* Debug */, + EC367BD5205ABC38008FF479 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EC367BD6205ABC38008FF479 /* Build configuration list for PBXNativeTarget "Bitcoin PrivateTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EC367BD7205ABC38008FF479 /* Debug */, + EC367BD8205ABC38008FF479 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EC367BD9205ABC38008FF479 /* Build configuration list for PBXNativeTarget "Bitcoin PrivateUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EC367BDA205ABC38008FF479 /* Debug */, + EC367BDB205ABC38008FF479 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = EC367BA3205ABC37008FF479 /* Project object */; +} diff --git a/Bitcoin Private.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Bitcoin Private.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..49cf5ea --- /dev/null +++ b/Bitcoin Private.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Bitcoin Private.xcodeproj/project.xcworkspace/xcuserdata/satrajbambra.xcuserdatad/UserInterfaceState.xcuserstate b/Bitcoin Private.xcodeproj/project.xcworkspace/xcuserdata/satrajbambra.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..aa267f3f79b87fa914ed65864380856c974cc128 GIT binary patch literal 46050 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 K{{P?9>;D2aaN3&y literal 0 HcmV?d00001 diff --git a/Bitcoin Private.xcodeproj/xcuserdata/satrajbambra.xcuserdatad/xcschemes/xcschememanagement.plist b/Bitcoin Private.xcodeproj/xcuserdata/satrajbambra.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..e3cde14 --- /dev/null +++ b/Bitcoin Private.xcodeproj/xcuserdata/satrajbambra.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + Bitcoin Private.xcscheme + + orderHint + 0 + + + + diff --git a/Bitcoin Private/AppDelegate.swift b/Bitcoin Private/AppDelegate.swift new file mode 100644 index 0000000..d711e1a --- /dev/null +++ b/Bitcoin Private/AppDelegate.swift @@ -0,0 +1,51 @@ +// +// AppDelegate.swift +// Bitcoin Private +// +// Created by Satraj Bambra on 2018-03-15. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + let launchViewController = LaunchViewController() + let launchNavController = AppNavigationController.init(rootViewController: launchViewController) + + window = window ?? UIWindow(frame: CGRect(origin: CGPoint.zero, size: UIScreen.main.bounds.size)) + window?.rootViewController = launchNavController + window?.makeKeyAndVisible() + + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Bitcoin Private/Assets.xcassets/AppIcon.appiconset/Contents.json b/Bitcoin Private/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/Bitcoin Private/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Bitcoin Private/Assets.xcassets/Contents.json b/Bitcoin Private/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Bitcoin Private/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Bitcoin Private/Assets.xcassets/backspace.imageset/Contents.json b/Bitcoin Private/Assets.xcassets/backspace.imageset/Contents.json new file mode 100644 index 0000000..81f3e0a --- /dev/null +++ b/Bitcoin Private/Assets.xcassets/backspace.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon--backspace.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon--backspace@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "icon--backspace@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Bitcoin Private/Assets.xcassets/backspace.imageset/icon--backspace.png b/Bitcoin Private/Assets.xcassets/backspace.imageset/icon--backspace.png new file mode 100644 index 0000000000000000000000000000000000000000..b5438418d0d8dd157868a2a8e407fc5473390b30 GIT binary patch literal 397 zcmV;80doF{P)fk<^^IU z!A7wZOKt5WmT4m9W-jCRFWF(7%&fXO@G&#z^3TlKog|5vF=huI-~)QlhXD-X3q~-8 z$&4wZa+g$n-Ut7N zlLY57)S<{a1S_xsxwu4CdkMZ}!ZqI;S-av_x?(>9w{-}`LtkXH{|xzZA;#BH+PtAi02ISl4ABq!0%};zD3OcD+cx^ z1P`GLA=A@s1OgJj4fy9Ch<>U6e9VAm=IZI=SxeLOiNzkgS!cOPxSl=NK(DQgscpw; r>_7xph@HTulVh02P+Ax6x%taC@1gCvsv}Dp00000NkvXXu0mjf+a$2& literal 0 HcmV?d00001 diff --git a/Bitcoin Private/Assets.xcassets/backspace.imageset/icon--backspace@2x.png b/Bitcoin Private/Assets.xcassets/backspace.imageset/icon--backspace@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d40a2c607045cfc72f0fc09244045397f6a8d4f9 GIT binary patch literal 830 zcmV-E1Ht@>P)eddod_zC_-fD)1qFp-w^E8Av|A~6BU&1X z#A?)A2vJaxV1;JM_993Wf@e3peb(FY`_G%ZnYre^xp&??yC?bY+ z3!J1a1U^KEy%OpT`c1im1HLtZ-A?QiwBI+U<~Xqqc>x2vk6^*>tQjJ-++gXH0QMMF z?;|}}%Wd)MZUn%NF#Z^=1lR=C2@LEdA|}zAB+~y++dnjk42dtk!@!PH>K1ZdkOS%` z{uAhiW88MX#jzVr+XIe%obv-ZfNrCzrk6=#6u4eeWSa5K3g$S3K9|I6c%f6hle8Ac zJ&&YrAyW))Fhyy*pqF43OWatuqM0$R#Yw^@oX;`?y)?_9ZP@XEleKhp5qchw&}_*G z1Df91li9(*_AjloT08q?T4%3hi?gqNMBjIv&ZerJyf~iP-kSPvsB;{^ud2tLJdctk z58o)RD$ubC?Lu>?PP12ov9x$@PUCZ}(=L`dUA&;rptdV2&~L-q4_GhIvk7ntJq%bg z5Y7&_Va=Vj}eulpGs{UmPTD16~_j`N&C+ps7&WKveeeAg9Na6q@w1)5iv8CIu%Rrt`k zz<3xhGj(3CJq*(1f)(bvDc^a<{gQvMm^*~ovkE2_l)0w{~{>JbaLCjbBd07*qo IM6N<$g3+#p=>Px# literal 0 HcmV?d00001 diff --git a/Bitcoin Private/Assets.xcassets/backspace.imageset/icon--backspace@3x.png b/Bitcoin Private/Assets.xcassets/backspace.imageset/icon--backspace@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9feac3eb598862139efafa2df4fed3e8a4138879 GIT binary patch literal 1132 zcmV-y1e5!TP)OK1~87{{Bc_yQk?ss}45h*EnH>BTCD){{_0@ZbX}=+%oC zFCJ9zCbR`Ti6VMZEFuU#5EZJ3deMVIm8zgZY^@4utF{&6?;kR8(`2)o-JK>I{NT^d z&dh%EeZS1kzLKc3VCi(a9=ChY4zvm_KnV}gT(VEt_Hi5}Q7^ifNF?sdp)~`-I`j-x zyWJqbg$9IvrN|7&hj7-7rbXt|uA@HOw=z4vYYInVKsbq`(9a8`%>_lJ?K+r;S8*Me-V!WLn=+pp0V-`YFjFWeUK3+Bm zASn4eXsOdv%*&Y@AKy6uVFR5Xp<05V{QZLf!gdb0i*h$1@=zn@4+IbnlJGU8t3;GG z7J;*05%};10feIrbPff+!ng$5MSTnU;?nM?dNAulce7zE?Rqc(>d_fw!#d5tIB!OS z0R|c1m^BVR-2r@ow~r@}i2rh7_GTL2@sh-C}J7&Qc?odNNw3II4maD_o98xS;hO6!9z9kV8rui(CJo11x| zns@6>oQtS`i5e`#meR}H5etrkx)g*hlOf0%b(uDbd4SXwfn^@LM7bKwKzQXA3@{Yy z78Es%3<$k^t+W+|!0DhhA#csF1S74h#vJqkRm%L_C*;A=^Gx?+-l64;X25gyLb8R$Z-`=ZtVB z3=Dly+KY;R5OH>nSNTs_Ae0+0F0xY&IeH>#sV-$NB<+P=3I8 z&ZZUhYd_|8-ShJ4l^~Z_y*j&zTD`a4nFOdo$c$l-Tr z5Xu}!dhgkeE@(d{mLkrb#QxMuyqqfg(0f#^HbG!l&JR2Q5=0lz087da{Awj5cmu9W0_%aM9a(o0000Px#?ny*JR5%f>l)(*xKomrgi#2FGXb(2v(Sz2&Nh_cP8`DBe0PVqx>pWc&!tR$P zVUmGm=Kq2GZ_F|S&bd;wP#SGpx-i={xq`$;x-yd2^zkcx93f!u*5+9KSG(2iT1Vi`<44gSlwiIF~ z{n-!*_)@mH@Z^kU!rF2;n?!}BG>Nq-Wi^4Pi9-3;I)4DCVsl_@R-kPF0000Px%7)eAyR9FekSg}q5K@jCIR>XwFN-5P?USr8GkXYD=4L`x3Q1Am%U_$%@{Qw(l zEd?q|Ekr!uOKvWcJGk3fF1nMv?A+YEnaAC-yU=KOSdt_|z-mK}R(1+h4S*l3x|B1p zcQi22qz9}##0iDmo}s0CDhhXjPwBM7$QoVu&d3Cz1Ka`&;J3rV&EzT{Z{_zB4$2hSOv~> zQ#5P?Bj6jz8)LlJ&T&ky+amA_&9XVi#=sj;Wz5M$!snc1Ehn=GoaUYcpN^}Ia@?sa z(IT)fO;DV3ZqsYs)|a{2oP^)smY9!Q*1;zci18HIQ`c24bIB3YwIsH2vx0Tojylhv2UQI0|%Q|SOTU#y#E^Dh+f1w2hKGa{gwu+COgB_F$ s_Rpgx_Q*K|#=ry!;dN63wZzo+3o2OKH7nn8LI3~&07*qoM6N<$g6mZbtN;K2 literal 0 HcmV?d00001 diff --git a/Bitcoin Private/Assets.xcassets/camera.imageset/group4@3x.png b/Bitcoin Private/Assets.xcassets/camera.imageset/group4@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ba510236f3a91d7eca14e087020ee5b54f72b3 GIT binary patch literal 1013 zcmVPx&uSrBfRA>d|S}|)BK@`3_ENx678ng%^1e8>Q5K@M8!PX`aNJ9RAsiK`Wf&2o! z%ErPJw$UyiDJ%^HEtOzpiUcjhtlxLcoagM@+qr#jz1!UfAG7mz=DqjL?7f|ty;jRu zk|fyztYphLJX>>Mxe8oZv30gqZKE`@hTxWgUxsA8DcW2%3e(060$Kom_y|iVX?wvY zTBQ{PG6$TNKr%E*A9KoZb=?ub3~&-gR$`sLW;9W^ePI zp?m<$1LaNvf5RooPuSf7u7X6Au&wLEzNJX36st+{8g_3+u@oAyFR)ieY}SOi`QH{e z6jIR^V0oaBSQ2Jn4+}9H(up=LNn0kZCs>@nl43`|+@#C`OiDL^DS+}F_zEzo9s3;( zuKPlp=zj}}r+ua70>&(4Pl^GCJHRIJDZ&Zcu&tP-p*Q(WTRhUtsHp@6-4yT^7**KE zKLP!5gpP?!oxLpx@ARW`7YK|qTZAmS^@M#>GYuVIb1Kmi{tfS`_bhaLG_|rR3?$#v z^jTQ6gb#$ExFL!8&E^G78~r0F?+3brypF@}ryd(`II`q&F%)Lw+o7^Roi=DI6v=1U zCbO<3%(ZbSeDzp~WJ~fH?N3XX8-Y+#89Qt+LS3>Y`HVJM2H`8w-t!wuw#G_0KVr{sk3g63rzd{^7!1}=QrWbP00000NkvXXu0mjfbR^O} literal 0 HcmV?d00001 diff --git a/Bitcoin Private/Assets.xcassets/close.imageset/Contents.json b/Bitcoin Private/Assets.xcassets/close.imageset/Contents.json new file mode 100644 index 0000000..ce0bef5 --- /dev/null +++ b/Bitcoin Private/Assets.xcassets/close.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "close.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "close@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "close@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Bitcoin Private/Assets.xcassets/close.imageset/close.png b/Bitcoin Private/Assets.xcassets/close.imageset/close.png new file mode 100644 index 0000000000000000000000000000000000000000..1f164e4af9c3981f203134477d266927b2d89dc0 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}b)GJcAsV7{ zgBX9gP3*UwZuq$IYrT%eG9|kivL9EPAt$py=HTN4KV&G%`)*?q|u@0stQlfgq75WEa%_9{^GrRs{}3Ku;K{sAY1(mj!rx__jQ5Id-*xBgyBMHL7(8A5T-G@yGywo?>`Mp$ literal 0 HcmV?d00001 diff --git a/Bitcoin Private/Assets.xcassets/close.imageset/close@2x.png b/Bitcoin Private/Assets.xcassets/close.imageset/close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d016f5b47f17ef20d2575d595ad36ff28db5f6 GIT binary patch literal 317 zcmV-D0mA-?P)Px#_en%SR7efYmeCHwAP7a9#c$jn_F><+2YWFk!9)IrhK5()xe48k-ZYGANQK&oWOxhMv0Hql7PZAsjmPDt_X+q$qx>@c- zLp;m~7YOlmZKg0&BfhnrOZP@v7Gq@($dki7*JuH)mPx$j7da6R9Fe!ncb4YAPj{&d*RFZtlsU*dDT6^qOk(z7wu*SX(7q^3}`#;vM^iM z^^A5wJF(%ZhorqRoSVX!B*-fo*)Q63Skm0I(G`|wSPXJVaw3}w3q1~50PsPDyTQ`I zHh}KMrockA1zBNkusEYVIkHq(2#+8u*JTkprogJT)d9_)qi)cwX%5u!6>qneJAnW? zOd~8&13El+ctSvD=3FqX%V!<^z>EZ8exsE3PS3v z0H90m$WkuJPu~OTlADOnLRMl2YK&^=gp@5js4+X(sgR6;-=V!iGDoWHSH2MY1J>9_7;%cwmjD0&07*qo IM6N<$f|6^_*Z=?k literal 0 HcmV?d00001 diff --git a/Bitcoin Private/Assets.xcassets/copy.imageset/Contents.json b/Bitcoin Private/Assets.xcassets/copy.imageset/Contents.json new file mode 100644 index 0000000..bc2a0a5 --- /dev/null +++ b/Bitcoin Private/Assets.xcassets/copy.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "fill2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fill2@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "fill2@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Bitcoin Private/Assets.xcassets/copy.imageset/fill2.png b/Bitcoin Private/Assets.xcassets/copy.imageset/fill2.png new file mode 100644 index 0000000000000000000000000000000000000000..bda3cc476d494ec6c440eb7d46b6b1f6181dd262 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_DaPU;cPEB*=VV?2Ir}_a978lj zlYjjGUoS53pDD>np@EUpfGPAp)2HtYAMI2MbI$Pg^z@V`2jk)YN-D(?E*x)UX*_tQTd%XKP)Px$FG)l}R7ef&S33&AKoHGpir6Svq!25wVQ1kXyoA@V(-R1`dIYf(D|@eC{D34_ z%KAojC6LV;m^IZ7JT{rnoAo)cn?On#0dwFCxUf}Vu@JEtFty}34N=31Vw6}f4%kyG zM@~a~qLrn3uu(nLO(scdH7L+WLf4w~JD3O|l22Nhr0@@bV=m5p+<_n##G*EsVHa(^ zS-AIj9_n{T>)O~5&8YDM5Wo{S02~{kxCvwd{X%8mDaCtFJF%WPov0QZsphMFN_|7_ z-&d&jk`^T4I=rM@1q=0F(t;#h2c7t1Me@p#(XsRw3vuXf4b1vbHiURCKQui34Ar$u zYMe&gKU&xv-EnA&X?kw}$6^#yuWKm@nr`&P$KkrLHSD0#61Y2PNS}iANf^BW`{=q{ TW}aYx00000NkvXXu0mjf@oSsH literal 0 HcmV?d00001 diff --git a/Bitcoin Private/Assets.xcassets/copy.imageset/fill2@3x.png b/Bitcoin Private/Assets.xcassets/copy.imageset/fill2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4557c61c701f982063bd89787b1087b765b49273 GIT binary patch literal 512 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

BgbsALyleQp!3^`+LE2AjG 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

p_Gjse(IG)EK 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 literal 0 HcmV?d00001 diff --git a/Bitcoin Private/Assets.xcassets/icon_small.imageset/Contents.json b/Bitcoin Private/Assets.xcassets/icon_small.imageset/Contents.json new file mode 100644 index 0000000..71bdffb --- /dev/null +++ b/Bitcoin Private/Assets.xcassets/icon_small.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "icon_small@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Bitcoin Private/Assets.xcassets/icon_small.imageset/icon_small@2x.png b/Bitcoin Private/Assets.xcassets/icon_small.imageset/icon_small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e8fb34c1631eed9e33db0b23a97d1450ecca8d3d GIT binary patch literal 7175 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 z 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 literal 0 HcmV?d00001 diff --git a/Bitcoin Private/Base.lproj/LaunchScreen.storyboard b/Bitcoin Private/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..e99a55e --- /dev/null +++ b/Bitcoin Private/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/Extensions/UIColor+Gradient.swift b/Bitcoin Private/Extensions/UIColor+Gradient.swift new file mode 100644 index 0000000..4fb99c2 --- /dev/null +++ b/Bitcoin Private/Extensions/UIColor+Gradient.swift @@ -0,0 +1,82 @@ +// +// UIColor+Gradient.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// +import UIKit + +extension UIColor { + convenience init(_ hex: UInt) { + self.init( + red: CGFloat((hex & 0xFF0000) >> 16) / 255.0, + green: CGFloat((hex & 0x00FF00) >> 8) / 255.0, + blue: CGFloat(hex & 0x0000FF) / 255.0, + alpha: CGFloat(1.0) + ) + } +} + +typealias GradientType = (x: CGPoint, y: CGPoint) + +enum GradientPoint { + case leftRight + case rightLeft + case topBottom + case bottomTop + case topLeftBottomRight + case bottomRightTopLeft + case topRightBottomLeft + case bottomLeftTopRight + + func draw() -> GradientType { + switch self { + case .leftRight: + return (x: CGPoint(x: 0, y: 0.5), y: CGPoint(x: 1, y: 0.5)) + case .rightLeft: + return (x: CGPoint(x: 1, y: 0.5), y: CGPoint(x: 0, y: 0.5)) + case .topBottom: + return (x: CGPoint(x: 0.5, y: 0), y: CGPoint(x: 0.5, y: 1)) + case .bottomTop: + return (x: CGPoint(x: 0.5, y: 1), y: CGPoint(x: 0.5, y: 0)) + case .topLeftBottomRight: + return (x: CGPoint(x: 0, y: 0), y: CGPoint(x: 1, y: 1)) + case .bottomRightTopLeft: + return (x: CGPoint(x: 1, y: 1), y: CGPoint(x: 0, y: 0)) + case .topRightBottomLeft: + return (x: CGPoint(x: 1, y: 0), y: CGPoint(x: 0, y: 1)) + case .bottomLeftTopRight: + return (x: CGPoint(x: 0, y: 1), y: CGPoint(x: 1, y: 0)) + } + } +} + +class GradientLayer : CAGradientLayer { + var gradient: GradientType? { + didSet { + startPoint = gradient?.x ?? CGPoint.zero + endPoint = gradient?.y ?? CGPoint.zero + } + } +} + +class GradientView: UIView { + override public class var layerClass: Swift.AnyClass { + get { + return GradientLayer.self + } + } +} + +protocol GradientViewProvider { + associatedtype GradientViewType +} + +extension GradientViewProvider where Self: UIView { + var gradientLayer: GradientViewType { return layer as! GradientViewType } +} + +extension UIView: GradientViewProvider { + typealias GradientViewType = GradientLayer +} diff --git a/Bitcoin Private/Extensions/UIView+Shake.swift b/Bitcoin Private/Extensions/UIView+Shake.swift new file mode 100644 index 0000000..24432b2 --- /dev/null +++ b/Bitcoin Private/Extensions/UIView+Shake.swift @@ -0,0 +1,21 @@ +// +// UIView+Shake.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-13. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +public extension UIView { + func shake(count : Float = 4.0,for duration : TimeInterval = 0.3,withTranslation translation : Float = 10) { + let animation : CABasicAnimation = CABasicAnimation(keyPath: "transform.translation.x") + animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) + animation.repeatCount = count + animation.duration = duration/TimeInterval(animation.repeatCount) + animation.autoreverses = true + animation.byValue = translation + layer.add(animation, forKey: "shake") + } +} diff --git a/Bitcoin Private/Info.plist b/Bitcoin Private/Info.plist new file mode 100644 index 0000000..5201a97 --- /dev/null +++ b/Bitcoin Private/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSCameraUsageDescription + Scanning QR codes + + diff --git a/Bitcoin Private/Utils/AppNavigationController.swift b/Bitcoin Private/Utils/AppNavigationController.swift new file mode 100644 index 0000000..1b702f3 --- /dev/null +++ b/Bitcoin Private/Utils/AppNavigationController.swift @@ -0,0 +1,43 @@ +// +// AppNavigationController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-10. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +protocol AccountCreationDelegate: class { + func createAccount(mnemonic: String) +} + +class AppNavigationController: UINavigationController { + weak var accountCreationDelegate: AccountCreationDelegate? + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + } + + func setupView() { + navigationBar.isTranslucent = false + navigationBar.tintColor = Colors.primaryDark + navigationBar.barTintColor = Colors.white + navigationBar.titleTextAttributes = [ + NSAttributedStringKey.foregroundColor : Colors.primaryDark + ] + + navigationBar.backgroundColor = Colors.white + + } + + func image(fromLayer layer: CALayer) -> UIImage { + UIGraphicsBeginImageContext(layer.frame.size) + layer.render(in: UIGraphicsGetCurrentContext()!) + let outputImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return outputImage! + } +} diff --git a/Bitcoin Private/Utils/Constants.swift b/Bitcoin Private/Utils/Constants.swift new file mode 100644 index 0000000..a735773 --- /dev/null +++ b/Bitcoin Private/Utils/Constants.swift @@ -0,0 +1,32 @@ +// +// Constants.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +struct Colors { + static let primaryDark = UIColor(red: 41.0/255.0, green: 45.0/255.0, blue: 95.0/255.0, alpha: Alphas.opaque) + static let primaryDarkTransparent = UIColor(red: 41.0/255.0, green: 45.0/255.0, blue: 95.0/255.0, alpha: Alphas.transparent) + static let secondaryDark = UIColor(red: 126.0/255.0, green: 158.0/255.0, blue: 209.0/255.0, alpha: Alphas.opaque) + static let secondaryDarkTransparent = UIColor(red: 126.0/255.0, green: 158.0/255.0, blue: 209.0/255.0, alpha: Alphas.transparent) + static let lightBackground = UIColor(red: 252.0/255.0, green: 252.0/255.0, blue: 252.0/255.0, alpha: Alphas.opaque) + static let darkGray = UIColor(red: 74.0/255.0, green: 74.0/255.0, blue: 74.0/255.0, alpha: Alphas.opaque) + static let darkGrayTransparent = UIColor(red: 74.0/255.0, green: 74.0/255.0, blue: 74.0/255.0, alpha: Alphas.opaqueTransparent) + static let lightGray = UIColor(red: 216.0/255.0, green: 216.0/255.0, blue: 216.0/255.0, alpha: Alphas.opaque) + static let shadowGray = UIColor.lightGray + static let black = UIColor.black + static let blackTransparent = UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: Alphas.semiTransparent) + static let white = UIColor.white + static let whiteTransparent = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: Alphas.transparent) +} + +public struct Alphas { + static let opaque = CGFloat(1) + static let opaqueTransparent = CGFloat(0.7) + static let semiTransparent = CGFloat(0.5) + static let transparent = CGFloat(0.2) +} diff --git a/Bitcoin Private/Utils/NibLoader.swift b/Bitcoin Private/Utils/NibLoader.swift new file mode 100644 index 0000000..538204a --- /dev/null +++ b/Bitcoin Private/Utils/NibLoader.swift @@ -0,0 +1,28 @@ +// +// NibLoader.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import Foundation + +struct NibLoader { + let nibName: String + + func loadView() -> T { + return loadView(owner: nil) + } + + func loadView(owner: AnyObject?) -> T { + let bundle = Bundle.main + let views = bundle.loadNibNamed(nibName, owner: owner, options: nil) + + guard let view = views?.first! as? T else { + fatalError("Incorrect view type provided") + } + + return view + } +} diff --git a/Bitcoin Private/View Controllers/LaunchViewController.swift b/Bitcoin Private/View Controllers/LaunchViewController.swift new file mode 100644 index 0000000..c7917c2 --- /dev/null +++ b/Bitcoin Private/View Controllers/LaunchViewController.swift @@ -0,0 +1,96 @@ +// +// LaunchViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class LaunchViewController: UIViewController { + + @IBOutlet var activityIndicator: UIActivityIndicatorView! + @IBOutlet var createWalletButton: UIButton! + @IBOutlet var importWalletButton: UIButton! + @IBOutlet var logoImageView: UIImageView! + + @IBAction func createNewWallet() { + let mnemonicViewController = MnemonicViewController() + let navigationController = AppNavigationController(rootViewController: mnemonicViewController) + navigationController.accountCreationDelegate = self + + present(navigationController, animated: true, completion: nil) + } + + @IBAction func importWallet() { + let verificationViewController = VerificationViewController(type: .recovery, mnemonic: "") + let navigationController = AppNavigationController(rootViewController: verificationViewController) + navigationController.accountCreationDelegate = self + + present(navigationController, animated: true, completion: nil) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + init() { + super.init(nibName: String(describing: LaunchViewController.self), bundle: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + + showButtons() + } + + func setupView() { + UIApplication.shared.statusBarStyle = .default + + navigationController?.isNavigationBarHidden = true + + logoImageView.image = UIImage(named: "icon") + + createWalletButton.backgroundColor = Colors.primaryDark + createWalletButton.setTitleColor(Colors.white, for: .normal) + importWalletButton.backgroundColor = Colors.secondaryDark + importWalletButton.setTitleColor(Colors.white, for: .normal) + view.backgroundColor = Colors.lightBackground + //view.gradientLayer.colors = [Colors.primaryDark.cgColor, Colors.secondaryDark.cgColor] + //view.gradientLayer.gradient = GradientPoint.topBottom.draw() + } + + func hideButtons() { + activityIndicator.startAnimating() + createWalletButton.isHidden = true + importWalletButton.isHidden = true + } + + func showButtons() { + activityIndicator.stopAnimating() + createWalletButton.isHidden = false + importWalletButton.isHidden = false + } + + func displayWallet() { + let walletViewController = WalletViewController() + + navigationController?.pushViewController(walletViewController, animated: true) + } +} + +extension LaunchViewController: AccountCreationDelegate { + func createAccount(mnemonic: String) { + hideButtons() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.displayWallet() + } + } +} diff --git a/Bitcoin Private/View Controllers/LaunchViewController.xib b/Bitcoin Private/View Controllers/LaunchViewController.xib new file mode 100644 index 0000000..7b0af39 --- /dev/null +++ b/Bitcoin Private/View Controllers/LaunchViewController.xib @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/View Controllers/ReceiveViewController.swift b/Bitcoin Private/View Controllers/ReceiveViewController.swift new file mode 100644 index 0000000..6f97785 --- /dev/null +++ b/Bitcoin Private/View Controllers/ReceiveViewController.swift @@ -0,0 +1,100 @@ +// +// ReceiveViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-10. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class ReceiveViewController: UIViewController { + + @IBOutlet var activityIndicator: UIActivityIndicatorView! + @IBOutlet var addressLabel: UILabel! + @IBOutlet var addressTitleLabel: UILabel! + @IBOutlet var addressHolderView: UIView! + @IBOutlet var imageViewHolder: UIView! + @IBOutlet var imageView: UIImageView! + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + var address: String = "" + + @IBAction func copyAddress() { + if let addressText = addressLabel.text, !addressText.isEmpty { + UIPasteboard.general.string = addressLabel.text + + let alert = UIAlertController(title: "Your wallet address has been successfully copied.", message: nil, preferredStyle: UIAlertControllerStyle.alert) + alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) + self.present(alert, animated: true, completion: nil) + } + + } + + init(address: String) { + super.init(nibName: String(describing: ReceiveViewController.self), bundle: nil) + + self.address = address + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + displayGeneratedAddress(value: address) + } + + func setupView() { + navigationItem.title = "My Wallet" + + let image = UIImage(named:"close") + let leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self.dismissView)) + navigationItem.leftBarButtonItem = leftBarButtonItem + + imageViewHolder.layer.shadowColor = Colors.shadowGray.cgColor + imageViewHolder.layer.shadowOpacity = Float(Alphas.transparent) + imageViewHolder.layer.shadowOffset = CGSize(width: 0.0, height: 3.0) + imageViewHolder.layer.shadowRadius = 4.0 + + addressLabel.textColor = Colors.darkGray + addressTitleLabel.textColor = Colors.darkGrayTransparent + addressHolderView.backgroundColor = Colors.lightBackground + view.backgroundColor = Colors.lightBackground + + addressLabel.text = address + } + + @objc func dismissView() { + dismiss(animated: true, completion: nil) + } + + func displayGeneratedAddress(value: String) { + let data = value.data(using: String.Encoding.isoLatin1, allowLossyConversion: false) + + let filter = CIFilter(name: "CIQRCodeGenerator") + filter?.setValue(data, forKey: "inputMessage") + filter?.setValue("H", forKey: "inputCorrectionLevel") + + let colorFilter = CIFilter(name: "CIFalseColor") + colorFilter?.setValue(filter?.outputImage, forKey: "inputImage") + colorFilter?.setValue(CIColor.init(cgColor: Colors.white.cgColor), forKey: "inputColor1") + colorFilter?.setValue(CIColor.init(cgColor: Colors.primaryDark.cgColor), forKey: "inputColor0") + + let qrcodeImage = colorFilter?.outputImage + let scaleX = imageView.frame.size.width / (qrcodeImage?.extent.size.width)! + let scaleY = imageView.frame.size.height / (qrcodeImage?.extent.size.height)! + let transformedImage = qrcodeImage?.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY)) + + activityIndicator.stopAnimating() + + imageView.image = UIImage(ciImage: transformedImage!) + } +} diff --git a/Bitcoin Private/View Controllers/ReceiveViewController.xib b/Bitcoin Private/View Controllers/ReceiveViewController.xib new file mode 100644 index 0000000..272a224 --- /dev/null +++ b/Bitcoin Private/View Controllers/ReceiveViewController.xib @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/View Controllers/ScanViewController.swift b/Bitcoin Private/View Controllers/ScanViewController.swift new file mode 100644 index 0000000..e19e7cb --- /dev/null +++ b/Bitcoin Private/View Controllers/ScanViewController.swift @@ -0,0 +1,129 @@ +// +// ScanViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-11. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import AVFoundation +import UIKit + +protocol ScanViewControllerDelegate: class { + func setQR(value: String) +} + +class ScanViewController: UIViewController { + var captureSession = AVCaptureSession() + var videoPreviewLayer: AVCaptureVideoPreviewLayer? + var qrCodeFrameView: UIView? + + weak var delegate: ScanViewControllerDelegate? + + private let supportedCodeTypes = [AVMetadataObject.ObjectType.upce, + AVMetadataObject.ObjectType.code39, + AVMetadataObject.ObjectType.code39Mod43, + AVMetadataObject.ObjectType.code93, + AVMetadataObject.ObjectType.code128, + AVMetadataObject.ObjectType.ean8, + AVMetadataObject.ObjectType.ean13, + AVMetadataObject.ObjectType.aztec, + AVMetadataObject.ObjectType.pdf417, + AVMetadataObject.ObjectType.itf14, + AVMetadataObject.ObjectType.dataMatrix, + AVMetadataObject.ObjectType.interleaved2of5, + AVMetadataObject.ObjectType.qr] + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + init() { + super.init(nibName: String(describing: ScanViewController.self), bundle: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + setupCamera() + } + + func setupView() { + navigationItem.title = "Scanning..." + + let image = UIImage(named:"close") + let leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self.dismissView)) + navigationItem.leftBarButtonItem = leftBarButtonItem + + view.backgroundColor = Colors.primaryDark + } + + @objc func dismissView() { + captureSession.stopRunning() + videoPreviewLayer?.removeFromSuperlayer() + + dismiss(animated: true, completion: nil) + } + + func setupCamera() { + let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera, .builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back) + + guard let captureDevice = deviceDiscoverySession.devices.first else { + print("No Camera Found.") + return + } + + do { + let input = try AVCaptureDeviceInput(device: captureDevice) + captureSession.addInput(input) + + let captureMetadataOutput = AVCaptureMetadataOutput() + captureSession.addOutput(captureMetadataOutput) + captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) + captureMetadataOutput.metadataObjectTypes = supportedCodeTypes + } catch { + print(error) + return + } + + videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) + videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill + videoPreviewLayer?.frame = view.layer.bounds + view.layer.addSublayer(videoPreviewLayer!) + + captureSession.startRunning() + + qrCodeFrameView = UIView() + + if let qrCodeFrameView = qrCodeFrameView { + qrCodeFrameView.layer.borderColor = Colors.primaryDark.cgColor + qrCodeFrameView.layer.borderWidth = 3.0 + view.addSubview(qrCodeFrameView) + view.bringSubview(toFront: qrCodeFrameView) + } + } +} + +extension ScanViewController: AVCaptureMetadataOutputObjectsDelegate { + func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { + if metadataObjects.count == 0 { + qrCodeFrameView?.frame = CGRect.zero + return + } + + let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject + + if supportedCodeTypes.contains(metadataObj.type) { + let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) + qrCodeFrameView?.frame = barCodeObject!.bounds + + if let qrValue = metadataObj.stringValue { + delegate?.setQR(value: qrValue) + + navigationItem.title = "Valid QR Code Found" + perform(#selector(self.dismissView), with: nil, afterDelay: 0.8) + } + } + } +} diff --git a/Bitcoin Private/View Controllers/ScanViewController.xib b/Bitcoin Private/View Controllers/ScanViewController.xib new file mode 100644 index 0000000..d0010ec --- /dev/null +++ b/Bitcoin Private/View Controllers/ScanViewController.xib @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/View Controllers/SendAmountViewController.swift b/Bitcoin Private/View Controllers/SendAmountViewController.swift new file mode 100644 index 0000000..fcfef13 --- /dev/null +++ b/Bitcoin Private/View Controllers/SendAmountViewController.swift @@ -0,0 +1,120 @@ +// +// SendAmountViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-10. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class SendAmountViewController: UIViewController { + + @IBOutlet var activityIndicator: UIActivityIndicatorView! + @IBOutlet var amountLabel: UILabel! + @IBOutlet var currencyLabel: UILabel! + @IBOutlet var indicatorView: UIView! + @IBOutlet var indicatorTitle: UILabel! + @IBOutlet var keyboardHolderView: UIView! + @IBOutlet var keyboardPad1: UIButton! + @IBOutlet var keyboardPad2: UIButton! + @IBOutlet var keyboardPad3: UIButton! + @IBOutlet var keyboardPad4: UIButton! + @IBOutlet var keyboardPad5: UIButton! + @IBOutlet var keyboardPad6: UIButton! + @IBOutlet var keyboardPad7: UIButton! + @IBOutlet var keyboardPad8: UIButton! + @IBOutlet var keyboardPad9: UIButton! + @IBOutlet var keyboardPadDot: UIButton! + @IBOutlet var keyboardPad0: UIButton! + @IBOutlet var keyboardPadBackspace: UIButton! + @IBOutlet var sendAddressLabel: UILabel! + + var keyboardPads: [UIButton]! + var receiver: String = "" + var sendingAmount: String = "" + + @IBAction func sendPayment() { + guard let amount = amountLabel.text, !amount.isEmpty, amount != "0" else { + return + } + } + + @IBAction func keyboardTapped(sender: UIButton) { + let keyboardPad = keyboardPads[sender.tag] + if keyboardPad == keyboardPadBackspace { + if sendingAmount.count > 1 { + sendingAmount.remove(at: sendingAmount.index(before: sendingAmount.endIndex)) + } else { + sendingAmount = "" + } + } else if keyboardPad == keyboardPadDot { + if sendingAmount.count == 0 { + sendingAmount += "0." + } else if sendingAmount.range(of:".") == nil { + sendingAmount += "." + } + } else { + if sendingAmount.count == 0 && sender.tag == 0 { + sendingAmount = "" + } else { + sendingAmount += String(sender.tag) + } + } + + amountLabel.text = sendingAmount.count > 0 ? sendingAmount : "0" + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + init(reciever: String) { + super.init(nibName: String(describing: SendAmountViewController.self), bundle: nil) + + self.receiver = reciever + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + } + + func setupView() { + navigationItem.title = "My Wallet" + + let image = UIImage(named:"close") + let rightBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self.dismissView)) + navigationItem.rightBarButtonItem = rightBarButtonItem + + indicatorView.isHidden = true + + activityIndicator.tintColor = Colors.darkGray + indicatorTitle.textColor = Colors.darkGray + sendAddressLabel.textColor = Colors.darkGray + amountLabel.textColor = Colors.primaryDark + currencyLabel.textColor = Colors.darkGrayTransparent + keyboardHolderView.backgroundColor = Colors.lightBackground + view.backgroundColor = Colors.primaryDark + + sendAddressLabel.text = "To: \(receiver)" + + keyboardPads = [keyboardPad0, keyboardPad1, keyboardPad2, keyboardPad3, keyboardPad4, keyboardPad5, keyboardPad6, keyboardPad7, keyboardPad8, keyboardPad9, keyboardPadDot, keyboardPadBackspace] + + for (index, keyboardPad) in keyboardPads.enumerated() { + keyboardPad.tintColor = Colors.primaryDark + keyboardPad.setTitleColor(Colors.primaryDark, for: .normal) + keyboardPad.backgroundColor = Colors.lightBackground + keyboardPad.tag = index + } + } + + @objc func dismissView() { + view.endEditing(true) + + dismiss(animated: true, completion: nil) + } +} + + diff --git a/Bitcoin Private/View Controllers/SendAmountViewController.xib b/Bitcoin Private/View Controllers/SendAmountViewController.xib new file mode 100644 index 0000000..d8db5db --- /dev/null +++ b/Bitcoin Private/View Controllers/SendAmountViewController.xib @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/View Controllers/SendViewController.swift b/Bitcoin Private/View Controllers/SendViewController.swift new file mode 100644 index 0000000..983e89c --- /dev/null +++ b/Bitcoin Private/View Controllers/SendViewController.swift @@ -0,0 +1,125 @@ +// +// SendViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-10. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class SendViewController: UIViewController { + + @IBOutlet var addressHolderView: UIView! + @IBOutlet var balanceLabel: UILabel! + @IBOutlet var bottomLayoutConstraint: NSLayoutConstraint! + @IBOutlet var holdingView: UIView! + @IBOutlet var sendTitleLabel: UILabel! + @IBOutlet var sendAddressTextField: UITextField! + + var safeAreaPadding: CGFloat = 20.0 + + @IBAction func addAmount() { + guard let receiver = sendAddressTextField.text, !receiver.isEmpty else { + return + } + + let sendAmountViewController = SendAmountViewController(reciever: receiver) + + navigationController?.pushViewController(sendAmountViewController, animated: true) + } + + @IBAction func scanQRCode() { + let scanViewController = ScanViewController() + scanViewController.delegate = self + let navigationController = AppNavigationController(rootViewController: scanViewController) + + present(navigationController, animated: true, completion: nil) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + init() { + super.init(nibName: String(describing: SendViewController.self), bundle: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + addKeyboardNotifications() + } + override func viewWillDisappear(_ animated: Bool) { + viewDidDisappear(animated) + + removeKeyboardNotifications() + } + + func setupView() { + navigationItem.title = "My Wallet" + navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) + + let image = UIImage(named:"close") + let leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self.dismissView)) + navigationItem.leftBarButtonItem = leftBarButtonItem + + balanceLabel.textColor = Colors.black + sendTitleLabel.textColor = Colors.darkGrayTransparent + sendAddressTextField.textColor = Colors.darkGray + addressHolderView.backgroundColor = Colors.lightBackground + holdingView.backgroundColor = Colors.lightBackground + view.backgroundColor = Colors.primaryDark + } + + func addKeyboardNotifications() { + NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) + } + + @objc func keyboardWillShow(notification: NSNotification) { + if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { + let statusBarHeight = UIApplication.shared.statusBarFrame.height - safeAreaPadding + bottomLayoutConstraint.constant = keyboardSize.size.height + statusBarHeight + + if let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? Double { + UIView.animate(withDuration: duration, animations: { + self.view.layoutIfNeeded() + }) + } + } + } + + @objc func keyboardWillHide(notification: NSNotification) { + bottomLayoutConstraint.constant = 0 + + if let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? Double { + UIView.animate(withDuration: duration, animations: { + self.view.layoutIfNeeded() + }) + } + } + + func removeKeyboardNotifications() { + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil) + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil) + } + + @objc func dismissView() { + view.endEditing(true) + + dismiss(animated: true, completion: nil) + } +} + +extension SendViewController: ScanViewControllerDelegate { + func setQR(value: String) { + sendAddressTextField.text = value + } +} diff --git a/Bitcoin Private/View Controllers/SendViewController.xib b/Bitcoin Private/View Controllers/SendViewController.xib new file mode 100644 index 0000000..4d22edd --- /dev/null +++ b/Bitcoin Private/View Controllers/SendViewController.xib @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/View Controllers/Wallet Creation and Restoration/MnemonicViewController.swift b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/MnemonicViewController.swift new file mode 100644 index 0000000..ef63d8c --- /dev/null +++ b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/MnemonicViewController.swift @@ -0,0 +1,94 @@ +// +// MnemonicViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class MnemonicViewController: UIViewController { + + @IBOutlet var holderView: UIView! + @IBOutlet var titleLabel: UILabel! + @IBOutlet var mnemonicHolderView: UIView! + @IBOutlet var activityIndicator: UIActivityIndicatorView! + + var mnemonic = "" + + @IBAction func confirmPhrase() { + let verificationViewController = VerificationViewController(type: .questions, mnemonic: mnemonic) + + navigationController?.pushViewController(verificationViewController, animated: true) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + init() { + super.init(nibName: String(describing: MnemonicViewController.self), bundle: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + generateMnemonic() + } + + func setupView() { + navigationItem.title = "Secret Phrase" + + navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) + + let image = UIImage(named:"close") + let leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self.dismissView)) + navigationItem.leftBarButtonItem = leftBarButtonItem + + holderView.backgroundColor = Colors.lightBackground + titleLabel.textColor = Colors.darkGray + view.backgroundColor = Colors.primaryDark + } + + @objc func dismissView() { + view.endEditing(true) + + dismiss(animated: true, completion: nil) + } + + func generateMnemonic() { + activityIndicator.stopAnimating() + + mnemonic = "bench hurt jump file august wise shallow faculty impulse spring exact slush thunder author capable act festival slice deposit sauce coconut afford frown better" + + let words = mnemonic.components(separatedBy: " ") + + var originX: CGFloat = 0.0 + var originY: CGFloat = 0.0 + + for (index, word) in words.enumerated() { + let pillView = PillView(index: String(index + 1), title: word, origin: .zero) + + if index == 0 { + mnemonicHolderView.addSubview(pillView) + + originX += pillView.frame.size.width + } else { + if originX + pillView.frame.size.width > mnemonicHolderView.frame.size.width - pillView.horizontalSpacing { + originY += pillView.verticalSpacing + originX = 0.0 + } else { + originX += pillView.horizontalSpacing + } + + pillView.frame.origin = CGPoint(x: originX, y: originY) + + mnemonicHolderView.addSubview(pillView) + + originX += pillView.frame.size.width + } + } + } +} diff --git a/Bitcoin Private/View Controllers/Wallet Creation and Restoration/MnemonicViewController.xib b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/MnemonicViewController.xib new file mode 100644 index 0000000..a521692 --- /dev/null +++ b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/MnemonicViewController.xib @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/View Controllers/Wallet Creation and Restoration/PinViewController.swift b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/PinViewController.swift new file mode 100644 index 0000000..0fb0537 --- /dev/null +++ b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/PinViewController.swift @@ -0,0 +1,141 @@ +// +// PinViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit +import Foundation + +class PinViewController: UIViewController { + + @IBOutlet var textField: UITextField! + @IBOutlet var nextButton: AppButton! + @IBOutlet var buttonHolderView: UIView! + @IBOutlet var pinViewHolder: UIView! + @IBOutlet var pinView1: PinView! + @IBOutlet var pinView2: PinView! + @IBOutlet var pinView3: PinView! + @IBOutlet var pinView4: PinView! + + var pinViews: [PinView]! + var previousPin: String! + var mnemonic = "" + + @IBAction func textFieldDidChange() { + guard let digits = textField.text, digits.count < 5 else { + if let text = textField.text { + let index4 = text.index(text.startIndex, offsetBy: 4) + + textField.text = String(text[.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/View Controllers/Wallet Creation and Restoration/VerificationViewController.swift b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/VerificationViewController.swift new file mode 100644 index 0000000..5696593 --- /dev/null +++ b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/VerificationViewController.swift @@ -0,0 +1,270 @@ +// +// RecoveryViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-11. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class VerificationViewController: UIViewController { + + @IBOutlet var collectionView: UICollectionView! + @IBOutlet var textView: UITextView! + @IBOutlet var textViewHeightConstraint: NSLayoutConstraint! + @IBOutlet var progressView: UIView! + @IBOutlet var progressViewWidthConstraint: NSLayoutConstraint! + @IBOutlet var quicktypeView: UIView! + @IBOutlet var questionHolderView: UIView! + @IBOutlet var questionTitleLabel: UILabel! + @IBOutlet var questionSubtitleLabel: UILabel! + @IBOutlet var questionViewHeightConstraint: NSLayoutConstraint! + + public enum VerificationType { + case recovery + case confirmation + case questions + } + + let defaultQuestionViewHeight: CGFloat = 88.0 + let defaultTextViewHeight: CGFloat = 150.0 + let questionTextViewHeight: CGFloat = 48.0 + let totalQuestionCount = 4 + var questionsAnswered = 0 + var progressWidth: CGFloat { + return UIScreen.main.bounds.size.width / CGFloat(totalQuestionCount) + } + + var type: VerificationType = .recovery + var suggestions: [String] = [] + var questionWords: [String] = [] + var currentWord: String = "" + var mnemonic: String = "" + + let wordList = ["bench", "hurt", "jump", "file", "august", "wise", "shallow", "faculty", "impulse", "spring", "exact", "slush", "thunder", "author", "capable", "act", "festival", "slice", "deposit", "sauce", "coconut", "afford", "frown", "better"] + + @IBAction func nextButtonSelected() { + switch type { + case .questions: + validateAnswer() + default: + // TODO: uncomment to add verification back + /* + guard var mnemonicString = textView.text, !mnemonicString.isEmpty else { + return + } + + let lastCharater = mnemonicString.last + if lastCharater == " " { + mnemonicString = String(mnemonicString.dropLast()) + } + setPin(mnemonic: mnemonicString) + */ + + //TODO remove this when verification above is added. + setPin(mnemonic: mnemonic) + } + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + init(type: VerificationType, mnemonic: String) { + super.init(nibName: String(describing: VerificationViewController.self), bundle: nil) + + self.type = type + self.mnemonic = mnemonic + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + textView.becomeFirstResponder() + } + + func setupView() { + let collectionViewNib = UINib(nibName: WordSuggestionCell.cellIdentifier, bundle: nil) + collectionView.register(collectionViewNib, forCellWithReuseIdentifier: WordSuggestionCell.cellIdentifier) + + switch type { + case .confirmation: + navigationItem.title = "Re-enter Your Phrase" + + questionViewHeightConstraint.constant = 0.0 + textViewHeightConstraint.constant = defaultTextViewHeight + case .questions: + questionViewHeightConstraint.constant = defaultQuestionViewHeight + textViewHeightConstraint.constant = questionTextViewHeight + + setQuestion(animated: false) + default: + navigationItem.title = "Enter Recovery Phrase" + + questionViewHeightConstraint.constant = 0.0 + textViewHeightConstraint.constant = defaultTextViewHeight + + let image = UIImage(named:"close") + let leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self.dismissView)) + navigationItem.leftBarButtonItem = leftBarButtonItem + } + + textView.textContainerInset = UIEdgeInsets(top: 16.0, left: 16.0, bottom: 16.0, right: 16.0); + textView.inputAccessoryView = quicktypeView + + progressView.backgroundColor = Colors.secondaryDark + textView.textColor = Colors.darkGray + questionHolderView.backgroundColor = Colors.lightBackground + questionTitleLabel.textColor = Colors.darkGray + questionSubtitleLabel.textColor = Colors.darkGray + view.backgroundColor = Colors.lightBackground + } + + @objc func dismissView() { + view.endEditing(true) + + dismiss(animated: true, completion: nil) + } + + func getWords(string: String) -> [String] { + let components = string.components(separatedBy: .whitespacesAndNewlines) + + return components.filter { !$0.isEmpty } + } + + func clearSuggestions(reload: Bool) { + suggestions.removeAll() + + if reload { + collectionView.reloadData() + } + } + + func getAutocompleteSuggestions(userText: String) -> [String] { + var possibleMatches: [String] = [] + for item in wordList { + let myString:NSString! = item as NSString + let substringRange :NSRange! = myString.range(of: userText) + + if (substringRange.location == 0) { + possibleMatches.append(item) + } + } + return possibleMatches.enumerated().flatMap{ $0.offset < 3 ? $0.element : nil } + } + + func validateAnswer() { + if textView.text == currentWord { + if questionsAnswered == 4 { + setPin(mnemonic: mnemonic) + } else { + textView.text = "" + setQuestion(animated: true) + } + } else { + textView.textColor = UIColor.red + textView.shake() + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { + self.textView.text = "" + self.textView.textColor = Colors.darkGray + } + } + } + + func setQuestion(animated: Bool) { + if questionWords.count == 0 { + questionWords = mnemonic.components(separatedBy: " ") + } + + let randomIndex = Int(arc4random_uniform(UInt32(questionWords.count))) + currentWord = questionWords[randomIndex] + + if let indexOfWord = mnemonic.components(separatedBy: " ").index(of: currentWord) { + questionTitleLabel.text = "What was the word \(String(describing: indexOfWord + 1))?" + questionWords.remove(at: randomIndex) + questionsAnswered += 1 + + setProgress(animated: animated) + } + } + + func setProgress(animated: Bool) { + progressViewWidthConstraint.constant += progressWidth + + navigationItem.title = "Question \(questionsAnswered) of \(totalQuestionCount)" + + if animated { + UIView.animate(withDuration: 0.3) { + self.view.layoutIfNeeded() + } + } + } + + func setPin(mnemonic: String) { + let pinViewController = PinViewController(pin: nil, mnemonic: mnemonic) + + navigationController?.pushViewController(pinViewController, animated: true) + } +} + +extension VerificationViewController: UITextViewDelegate { + func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { + clearSuggestions(reload: false) + + let subString = (textView.text! as NSString).replacingCharacters(in: range, with: text) + + if let lastWord = getWords(string: String(subString)).last { + suggestions.append(contentsOf: getAutocompleteSuggestions(userText: lastWord)) + } + + collectionView.reloadData() + + return true + } +} + +extension VerificationViewController: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return suggestions.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WordSuggestionCell.cellIdentifier, for: indexPath) as! WordSuggestionCell + cell.titleLabel.text = suggestions[indexPath.row] + return cell + } +} + +extension VerificationViewController: UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let suggestion = suggestions[indexPath.row] + var words = getWords(string: textView.text) + if words.count > 0 { + words.removeLast() + } + words.append(suggestion) + + textView.text = words.joined(separator: " ") + + if type != .questions { + textView.text.append(" ") + } + + clearSuggestions(reload: true) + } +} + +extension VerificationViewController: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return CGSize(width: UIScreen.main.bounds.size.width / 3, height: collectionView.frame.size.height) + } +} + diff --git a/Bitcoin Private/View Controllers/Wallet Creation and Restoration/VerificationViewController.xib b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/VerificationViewController.xib new file mode 100644 index 0000000..adf6c4a --- /dev/null +++ b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/VerificationViewController.xib @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/View Controllers/Wallet Creation and Restoration/WalletTitleViewController.swift b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/WalletTitleViewController.swift new file mode 100644 index 0000000..707ac0a --- /dev/null +++ b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/WalletTitleViewController.swift @@ -0,0 +1,54 @@ +// +// WalletTitleViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class WalletTitleViewController: UIViewController { + + @IBOutlet var textField: UITextField! + @IBOutlet var underlineView: UIView! + + @IBAction func saveTitle() { + dismissView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + init() { + super.init(nibName: String(describing: WalletTitleViewController.self), bundle: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + } + + func setupView() { + navigationItem.title = "New Wallet" + + let image = UIImage(named:"close") + let leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self.dismissView)) + navigationItem.leftBarButtonItem = leftBarButtonItem + + textField.textColor = Colors.primaryDark + textField.text = "My Wallet" + view.backgroundColor = Colors.lightBackground + + underlineView.backgroundColor = Colors.primaryDark + underlineView.alpha = Alphas.transparent + } + + @objc func dismissView() { + view.endEditing(true) + + dismiss(animated: true, completion: nil) + } +} diff --git a/Bitcoin Private/View Controllers/Wallet Creation and Restoration/WalletTitleViewController.xib b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/WalletTitleViewController.xib new file mode 100644 index 0000000..472b047 --- /dev/null +++ b/Bitcoin Private/View Controllers/Wallet Creation and Restoration/WalletTitleViewController.xib @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/View Controllers/WalletViewController.swift b/Bitcoin Private/View Controllers/WalletViewController.swift new file mode 100644 index 0000000..7151101 --- /dev/null +++ b/Bitcoin Private/View Controllers/WalletViewController.swift @@ -0,0 +1,130 @@ +// +// WalletViewController.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class WalletViewController: UIViewController { + + @IBOutlet var activityIndicator: UIActivityIndicatorView! + @IBOutlet var collectionView: UICollectionView! + @IBOutlet var pageControl: UIPageControl! + @IBOutlet var tableView: UITableView! + @IBOutlet var tableViewHeader: UIView! + @IBOutlet var tableViewHeaderLeftLabel: UILabel! + @IBOutlet var tableViewHeaderRightLabel: UILabel! + @IBOutlet var logoImageView: UIImageView! + + @IBAction func receiveFunds() { + let receiveViewController = ReceiveViewController(address: "b1RXUJgnuxtzHyJ5UTWerh4pNBWcVikESZe") + let navigationController = AppNavigationController(rootViewController: receiveViewController) + + present(navigationController, animated: true, completion: nil) + } + + @IBAction func sendFunds() { + let sendViewController = SendViewController() + let navigationController = AppNavigationController(rootViewController: sendViewController) + + present(navigationController, animated: true, completion: nil) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + init() { + super.init(nibName: String(describing: WalletViewController.self), bundle: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + navigationItem.setHidesBackButton(true, animated: false) + navigationController?.setNavigationBarHidden(false, animated: true) + } + + func setupView() { + let collectionViewNib = UINib(nibName: WalletCell.cellIdentifier, bundle: nil) + collectionView.register(collectionViewNib, forCellWithReuseIdentifier: WalletCell.cellIdentifier) + + let tableViewNib = UINib(nibName: TransactionHistoryCell.cellIdentifier, bundle: nil) + tableView.register(tableViewNib, forCellReuseIdentifier: TransactionHistoryCell.cellIdentifier) + + navigationItem.titleView = logoImageView + + tableViewHeaderLeftLabel.textColor = Colors.darkGrayTransparent + tableViewHeaderRightLabel.textColor = Colors.darkGrayTransparent + pageControl.currentPageIndicatorTintColor = Colors.primaryDark + pageControl.pageIndicatorTintColor = Colors.primaryDarkTransparent + tableView.backgroundColor = Colors.lightBackground + view.backgroundColor = Colors.primaryDark + } +} + +extension WalletViewController: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return 2 + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: WalletCell.cellIdentifier, for: indexPath) as! WalletCell + + return cell + } +} + +extension WalletViewController: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return CGSize(width: UIScreen.main.bounds.size.width, height: collectionView.frame.size.height) + } +} + +extension WalletViewController: UITableViewDataSource { + func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 10 + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + return tableViewHeader + } + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return tableViewHeader.frame.size.height + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: TransactionHistoryCell.cellIdentifier, for: indexPath) as! TransactionHistoryCell + + return cell + } +} + +extension WalletViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return TransactionHistoryCell.rowHeight + } +} + +extension WalletViewController: UIScrollViewDelegate { + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + if scrollView == collectionView { + pageControl.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width) + } + } +} + + diff --git a/Bitcoin Private/View Controllers/WalletViewController.xib b/Bitcoin Private/View Controllers/WalletViewController.xib new file mode 100644 index 0000000..ad6c9a4 --- /dev/null +++ b/Bitcoin Private/View Controllers/WalletViewController.xib @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/Views/AppButton.swift b/Bitcoin Private/Views/AppButton.swift new file mode 100644 index 0000000..984a79c --- /dev/null +++ b/Bitcoin Private/Views/AppButton.swift @@ -0,0 +1,36 @@ +// +// NextButton.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class AppButton: UIButton { + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupView() + } + + private func setupView() { + backgroundColor = Colors.primaryDark + setTitleColor(Colors.white, for: .normal) + } + + public func setEnabled() { + isEnabled = true + alpha = Alphas.opaque + } + + public func setDisabled() { + isEnabled = false + alpha = Alphas.transparent + } +} diff --git a/Bitcoin Private/Views/Cells/TransactionHistoryCell.swift b/Bitcoin Private/Views/Cells/TransactionHistoryCell.swift new file mode 100644 index 0000000..f06acfd --- /dev/null +++ b/Bitcoin Private/Views/Cells/TransactionHistoryCell.swift @@ -0,0 +1,27 @@ +// +// TransactionHistoryCell.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-10. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class TransactionHistoryCell: UITableViewCell { + @IBOutlet var activityLabel: UILabel! + @IBOutlet var amountLabel: UILabel! + @IBOutlet var dateLabel: UILabel! + + static let cellIdentifier = "TransactionHistoryCell" + static let rowHeight: CGFloat = 80.0 + + override func awakeFromNib() { + super.awakeFromNib() + + activityLabel.textColor = Colors.black + amountLabel.textColor = Colors.black + dateLabel.textColor = Colors.blackTransparent + } + +} diff --git a/Bitcoin Private/Views/Cells/TransactionHistoryCell.xib b/Bitcoin Private/Views/Cells/TransactionHistoryCell.xib new file mode 100644 index 0000000..225bf22 --- /dev/null +++ b/Bitcoin Private/Views/Cells/TransactionHistoryCell.xib @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/Views/Cells/WalletCell.swift b/Bitcoin Private/Views/Cells/WalletCell.swift new file mode 100644 index 0000000..ab648cb --- /dev/null +++ b/Bitcoin Private/Views/Cells/WalletCell.swift @@ -0,0 +1,29 @@ +// +// WalletCollectionViewCell.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-10. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class WalletCell: UICollectionViewCell { + + @IBOutlet var holdingView: UIView! + @IBOutlet var titleLabel: UILabel! + @IBOutlet var currencyLabel: UILabel! + @IBOutlet var amountLabel: UILabel! + @IBOutlet var convertedCurrencyLabel: UILabel! + + static let cellIdentifier = "WalletCell" + + override func awakeFromNib() { + super.awakeFromNib() + + titleLabel.textColor = Colors.darkGray + currencyLabel.textColor = Colors.primaryDark + amountLabel.textColor = Colors.darkGray + convertedCurrencyLabel.textColor = Colors.darkGrayTransparent + } +} diff --git a/Bitcoin Private/Views/Cells/WalletCell.xib b/Bitcoin Private/Views/Cells/WalletCell.xib new file mode 100644 index 0000000..d4f7586 --- /dev/null +++ b/Bitcoin Private/Views/Cells/WalletCell.xib @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/Views/Cells/WordSuggestionCell.swift b/Bitcoin Private/Views/Cells/WordSuggestionCell.swift new file mode 100644 index 0000000..cca4559 --- /dev/null +++ b/Bitcoin Private/Views/Cells/WordSuggestionCell.swift @@ -0,0 +1,29 @@ +// +// WordSuggestionCell.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-12. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class WordSuggestionCell: UICollectionViewCell { + + @IBOutlet var titleLabel: UILabel! + + static let cellIdentifier = "WordSuggestionCell" + + override func awakeFromNib() { + super.awakeFromNib() + + titleLabel.textColor = Colors.white + } + + override var isHighlighted: Bool { + didSet { + contentView.backgroundColor = isHighlighted ? Colors.lightGray : nil + titleLabel.textColor = isHighlighted ? Colors.darkGray: Colors.white + } + } +} diff --git a/Bitcoin Private/Views/Cells/WordSuggestionCell.xib b/Bitcoin Private/Views/Cells/WordSuggestionCell.xib new file mode 100644 index 0000000..0d89308 --- /dev/null +++ b/Bitcoin Private/Views/Cells/WordSuggestionCell.xib @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin Private/Views/PillView.swift b/Bitcoin Private/Views/PillView.swift new file mode 100644 index 0000000..59321ff --- /dev/null +++ b/Bitcoin Private/Views/PillView.swift @@ -0,0 +1,54 @@ +// +// PillView.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class PillView: UIView { + let viewHeight: CGFloat = 30.0 + let indexWidth: CGFloat = 13.0 + let indexPadding: CGFloat = 4.0 + let viewPadding: CGFloat = 10.0 + let verticalSpacing: CGFloat = 42.0 + let horizontalSpacing: CGFloat = 8.0 + + init(index: String, title: String, origin: CGPoint) { + super.init(frame: CGRect(origin: origin, size: CGSize(width: 0.0, height: viewHeight))) + + setupView(index: index, title: title) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setupView(index: String, title: String) { + let indexLabel = UILabel(frame: CGRect(x: viewPadding, y: 0.0, width: indexWidth, height: viewHeight)) + indexLabel.text = index + indexLabel.textColor = Colors.lightGray + indexLabel.font = UIFont.systemFont(ofSize: 10, weight: .medium) + indexLabel.textAlignment = .left + + addSubview(indexLabel) + + let titleLabel = UILabel(frame: CGRect(x: (viewPadding + indexWidth + indexPadding), y: 0.0, width: 0, height: viewHeight)) + titleLabel.text = title + titleLabel.textColor = Colors.darkGray + titleLabel.font = UIFont.systemFont(ofSize: 14, weight: .medium) + titleLabel.textAlignment = .left + let size = titleLabel.text?.size(withAttributes: [.font: titleLabel.font]) ?? .zero + titleLabel.frame.size.width = size.width + + addSubview(titleLabel) + + frame.size.width = size.width + (viewPadding * 2) + indexWidth + indexPadding + backgroundColor = Colors.white + layer.borderColor = Colors.lightGray.cgColor + layer.borderWidth = 1.0 + layer.cornerRadius = 16.0 + } +} diff --git a/Bitcoin Private/Views/PinView.swift b/Bitcoin Private/Views/PinView.swift new file mode 100644 index 0000000..268b2fb --- /dev/null +++ b/Bitcoin Private/Views/PinView.swift @@ -0,0 +1,51 @@ +// +// PinView.swift +// BlockEQ +// +// Created by Satraj Bambra on 2018-03-09. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import UIKit + +class PinView: UIView { + @IBOutlet weak var dotView: UIView! + @IBOutlet weak var underlineView: UIView! + @IBOutlet weak var view: UIView! + + fileprivate static let nibName = "PinView" + + init(frame: CGRect, title: String) { + super.init(frame: frame) + + setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + setupView() + } + + private func setupView() { + view = NibLoader(nibName: PinView.nibName).loadView(owner: self) + view.frame = CGRect(origin: .zero, size: frame.size) + view.autoresizingMask = UIViewAutoresizing.flexibleWidth + view.backgroundColor = Colors.lightBackground + + addSubview(view) + } + + public func setEmpty() { + dotView.isHidden = true + + underlineView.backgroundColor = Colors.primaryDarkTransparent + } + + public func setFilled() { + dotView.backgroundColor = Colors.primaryDark + dotView.isHidden = false + + underlineView.backgroundColor = Colors.primaryDark + } +} diff --git a/Bitcoin Private/Views/PinView.xib b/Bitcoin Private/Views/PinView.xib new file mode 100644 index 0000000..f605050 --- /dev/null +++ b/Bitcoin Private/Views/PinView.xib @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Bitcoin PrivateTests/Bitcoin_PrivateTests.swift b/Bitcoin PrivateTests/Bitcoin_PrivateTests.swift new file mode 100644 index 0000000..2f47caa --- /dev/null +++ b/Bitcoin PrivateTests/Bitcoin_PrivateTests.swift @@ -0,0 +1,36 @@ +// +// Bitcoin_PrivateTests.swift +// Bitcoin PrivateTests +// +// Created by Satraj Bambra on 2018-03-15. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import XCTest +@testable import Bitcoin_Private + +class Bitcoin_PrivateTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Bitcoin PrivateTests/Info.plist b/Bitcoin PrivateTests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/Bitcoin PrivateTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Bitcoin PrivateUITests/Bitcoin_PrivateUITests.swift b/Bitcoin PrivateUITests/Bitcoin_PrivateUITests.swift new file mode 100644 index 0000000..e438303 --- /dev/null +++ b/Bitcoin PrivateUITests/Bitcoin_PrivateUITests.swift @@ -0,0 +1,36 @@ +// +// Bitcoin_PrivateUITests.swift +// Bitcoin PrivateUITests +// +// Created by Satraj Bambra on 2018-03-15. +// Copyright © 2018 Satraj Bambra. All rights reserved. +// + +import XCTest + +class Bitcoin_PrivateUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Bitcoin PrivateUITests/Info.plist b/Bitcoin PrivateUITests/Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/Bitcoin PrivateUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..26f7d75 --- /dev/null +++ b/Podfile @@ -0,0 +1,20 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'Bitcoin Private' do + # Comment the next line if you're not using Swift and don't want to use dynamic frameworks + use_frameworks! + + # Pods for Bitcoin Private + + target 'Bitcoin PrivateTests' do + inherit! :search_paths + # Pods for testing + end + + target 'Bitcoin PrivateUITests' do + inherit! :search_paths + # Pods for testing + end + +end