├── .gitignore ├── .xcode-version ├── Dangerfile ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── Podfile ├── Podfile.lock ├── Pods ├── Crashlytics │ ├── Crashlytics.framework │ │ ├── README │ │ └── submit │ ├── iOS │ │ └── Crashlytics.framework │ │ │ ├── Crashlytics │ │ │ ├── Headers │ │ │ ├── ANSCompatibility.h │ │ │ ├── Answers.h │ │ │ ├── CLSAttributes.h │ │ │ ├── CLSLogging.h │ │ │ ├── CLSReport.h │ │ │ ├── CLSStackFrame.h │ │ │ └── Crashlytics.h │ │ │ ├── Info.plist │ │ │ ├── Modules │ │ │ └── module.modulemap │ │ │ ├── run │ │ │ ├── submit │ │ │ └── uploadDSYM │ └── submit ├── EmojiKit │ ├── AllEmoji.json │ ├── EmojiKit │ │ ├── DictionarySerialization.swift │ │ ├── Emoji.swift │ │ └── EmojiFetcher.swift │ ├── LICENSE │ └── README.md ├── Fabric │ ├── Fabric.framework │ │ ├── README │ │ └── run │ ├── README.md │ ├── iOS │ │ └── Fabric.framework │ │ │ ├── Fabric │ │ │ ├── Headers │ │ │ ├── FABAttributes.h │ │ │ └── Fabric.h │ │ │ ├── Info.plist │ │ │ ├── Modules │ │ │ └── module.modulemap │ │ │ ├── run │ │ │ └── uploadDSYM │ ├── run │ └── uploadDSYM ├── Manifest.lock ├── PKHUD │ ├── LICENSE │ ├── PKHUD │ │ ├── FrameView.swift │ │ ├── Images.xcassets │ │ │ ├── checkmark.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── checkmark.pdf │ │ │ ├── cross.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── cross.pdf │ │ │ └── progress.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── progress.pdf │ │ ├── PKHUD.h │ │ ├── PKHUD.swift │ │ ├── PKHUDAnimating.swift │ │ ├── PKHUDAssets.swift │ │ ├── PKHUDErrorView.swift │ │ ├── PKHUDImageView.swift │ │ ├── PKHUDProgressView.swift │ │ ├── PKHUDSquareBaseView.swift │ │ ├── PKHUDStatusView.swift │ │ ├── PKHUDSubtitleView.swift │ │ ├── PKHUDSuccessView.swift │ │ ├── PKHUDSystemActivityIndicatorView.swift │ │ ├── PKHUDTextView.swift │ │ ├── PKHUDTitleView.swift │ │ ├── PKHUDWideBaseView.swift │ │ ├── Window.swift │ │ └── WindowRootViewController.swift │ └── README.md ├── Pods.xcodeproj │ └── project.pbxproj └── Target Support Files │ ├── EmojiKit │ ├── EmojiKit-dummy.m │ ├── EmojiKit-prefix.pch │ ├── EmojiKit-umbrella.h │ ├── EmojiKit.modulemap │ ├── EmojiKit.xcconfig │ └── Info.plist │ ├── PKHUD │ ├── Info.plist │ ├── PKHUD-dummy.m │ ├── PKHUD-prefix.pch │ ├── PKHUD-umbrella.h │ ├── PKHUD.modulemap │ └── PKHUD.xcconfig │ └── Pods-Themoji │ ├── Info.plist │ ├── Pods-Themoji-acknowledgements.markdown │ ├── Pods-Themoji-acknowledgements.plist │ ├── Pods-Themoji-dummy.m │ ├── Pods-Themoji-frameworks.sh │ ├── Pods-Themoji-resources.sh │ ├── Pods-Themoji-umbrella.h │ ├── Pods-Themoji.debug.xcconfig │ ├── Pods-Themoji.modulemap │ └── Pods-Themoji.release.xcconfig ├── README.md ├── Rakefile ├── Themoji.png ├── Themoji.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcshareddata │ └── xcschemes │ ├── Themoji.xcscheme │ └── ThemojiUITests.xcscheme ├── Themoji.xcworkspace └── contents.xcworkspacedata ├── Themoji ├── AppDelegate.swift ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── AppIcon24x24@2x.png │ │ ├── AppIcon27.5x27.5@2x.png │ │ ├── AppIcon40x40@2x.png │ │ ├── AppIcon44x44@2x.png │ │ ├── AppIcon86x86@2x.png │ │ ├── AppIcon98x98@2x.png │ │ ├── Contents.json │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-72.png │ │ ├── Icon-72@2x.png │ │ ├── Icon-76.png │ │ ├── Icon-76@2x.png │ │ ├── Icon-Small-40.png │ │ ├── Icon-Small-50.png │ │ ├── Icon-Small-50@2x.png │ │ ├── Icon-Small.png │ │ ├── Icon-Small@2x.png │ │ ├── Icon.png │ │ ├── Icon@2x.png │ │ └── IconIpad.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Category.swift ├── CategoryButton.swift ├── CategoryButton.xib ├── FontRendering.h ├── FontRendering.m ├── Info.plist ├── Themoji-Bridging-Header.h └── ViewController.swift ├── ThemojiUITests ├── Info.plist ├── SnapshotHelper.swift └── ThemojiUITests.swift ├── circle.yml ├── fastlane-plugin-emoji_fetcher ├── .gitignore ├── .rspec ├── Gemfile ├── LICENSE ├── README.md ├── Rakefile ├── fastlane-plugin-emoji_fetcher.gemspec └── lib │ └── fastlane │ └── plugin │ ├── emoji_fetcher.rb │ └── emoji_fetcher │ ├── actions │ └── emoji_fetcher_action.rb │ └── version.rb └── fastlane ├── Appfile ├── Deliverfile ├── Fastfile ├── Matchfile ├── Pluginfile ├── README.md ├── Snapfile └── metadata ├── Themoji.png ├── copyright.txt ├── en-US ├── description.txt ├── keywords.txt ├── marketing_url.txt ├── name.txt ├── privacy_url.txt ├── release_notes.txt └── support_url.txt ├── primary_category.txt ├── primary_first_sub_category.txt ├── primary_second_sub_category.txt ├── secondary_category.txt ├── secondary_first_sub_category.txt └── secondary_second_sub_category.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | 20 | # CocoaPods 21 | # 22 | # We recommend against adding the Pods directory to your .gitignore. However 23 | # you should judge for yourself, the pros and cons are mentioned at: 24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 25 | # 26 | # Pods/ 27 | 28 | # Carthage 29 | # 30 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 31 | # Carthage/Checkouts 32 | 33 | Carthage/Build 34 | fastlane/report.xml 35 | fastlane/screenshots 36 | Preview.html 37 | Themoji/Apple Color Emoji.ttf 38 | Themoji/Apple Color Emoji.ttc 39 | Themoji.app.dSYM.zip 40 | .keys 41 | Themoji.app.dSYM 42 | -------------------------------------------------------------------------------- /.xcode-version: -------------------------------------------------------------------------------- 1 | 9.2 2 | -------------------------------------------------------------------------------- /Dangerfile: -------------------------------------------------------------------------------- 1 | puts `fastlane test` 2 | Dir[File.join(ENV["CIRCLE_TEST_REPORTS"], "**/*.xml")].each do |path| 3 | puts "Parsing JUnit file at path '#{path}'" 4 | junit.parse(path) 5 | junit.report 6 | end 7 | 8 | 9 | puts "Running fastlane to generate and upload an ipa file..." 10 | options = { 11 | xcodebuild: { 12 | scheme: "Themoji" 13 | } 14 | } 15 | 16 | require 'fastlane' 17 | result = Fastlane::OneOff.run(action: "build_and_upload_to_appetize", 18 | parameters: options) 19 | 20 | device_grid.run( 21 | public_key: result, 22 | languages: ["en", "de"], 23 | devices: ["iphone5s", "iphone6splus", "ipadair"] 24 | ) 25 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "cocoapods" 4 | gem "bundler" 5 | gem "fastlane" 6 | 7 | gem "danger", git: "https://github.com/danger/danger" 8 | gem "danger-device_grid" 9 | gem "danger-junit", git: "https://github.com/orta/danger-junit" 10 | gem "pry" 11 | 12 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') 13 | eval(File.read(plugins_path), binding) if File.exist?(plugins_path) 14 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GIT 2 | remote: https://github.com/danger/danger 3 | revision: 10ff377ce5a6dfcb5eb17e9188b01757e4e69d0a 4 | specs: 5 | danger (5.5.6) 6 | claide (~> 1.0) 7 | claide-plugins (>= 0.9.2) 8 | colored2 (~> 3.1) 9 | cork (~> 0.1) 10 | faraday (~> 0.9) 11 | faraday-http-cache (~> 1.0) 12 | git (~> 1) 13 | kramdown (~> 1.5) 14 | no_proxy_fix 15 | octokit (~> 4.7) 16 | terminal-table (~> 1) 17 | 18 | GIT 19 | remote: https://github.com/krausefx/trainer 20 | revision: 56432db48e8f110181b393b33490a3d4763982ec 21 | specs: 22 | fastlane-plugin-trainer (0.4.0) 23 | trainer (>= 0.7.0) 24 | trainer (0.7.0) 25 | plist (>= 3.1.0, < 4.0.0) 26 | 27 | GIT 28 | remote: https://github.com/orta/danger-junit 29 | revision: ec0b2ac254728a0b0fe44644186ce9a19e4ad342 30 | specs: 31 | danger-junit (0.7.4) 32 | danger (> 2.0) 33 | ox (~> 2.0) 34 | 35 | PATH 36 | remote: fastlane-plugin-emoji_fetcher 37 | specs: 38 | fastlane-plugin-emoji_fetcher (0.2.0) 39 | 40 | GEM 41 | remote: https://rubygems.org/ 42 | specs: 43 | CFPropertyList (2.3.6) 44 | activesupport (4.2.10) 45 | i18n (~> 0.7) 46 | minitest (~> 5.1) 47 | thread_safe (~> 0.3, >= 0.3.4) 48 | tzinfo (~> 1.1) 49 | addressable (2.5.2) 50 | public_suffix (>= 2.0.2, < 4.0) 51 | babosa (1.0.2) 52 | claide (1.0.2) 53 | claide-plugins (0.9.2) 54 | cork 55 | nap 56 | open4 (~> 1.3) 57 | cocoapods (1.3.1) 58 | activesupport (>= 4.0.2, < 5) 59 | claide (>= 1.0.2, < 2.0) 60 | cocoapods-core (= 1.3.1) 61 | cocoapods-deintegrate (>= 1.0.1, < 2.0) 62 | cocoapods-downloader (>= 1.1.3, < 2.0) 63 | cocoapods-plugins (>= 1.0.0, < 2.0) 64 | cocoapods-search (>= 1.0.0, < 2.0) 65 | cocoapods-stats (>= 1.0.0, < 2.0) 66 | cocoapods-trunk (>= 1.2.0, < 2.0) 67 | cocoapods-try (>= 1.1.0, < 2.0) 68 | colored2 (~> 3.1) 69 | escape (~> 0.0.4) 70 | fourflusher (~> 2.0.1) 71 | gh_inspector (~> 1.0) 72 | molinillo (~> 0.5.7) 73 | nap (~> 1.0) 74 | ruby-macho (~> 1.1) 75 | xcodeproj (>= 1.5.1, < 2.0) 76 | cocoapods-core (1.3.1) 77 | activesupport (>= 4.0.2, < 6) 78 | fuzzy_match (~> 2.0.4) 79 | nap (~> 1.0) 80 | cocoapods-deintegrate (1.0.1) 81 | cocoapods-downloader (1.1.3) 82 | cocoapods-plugins (1.0.0) 83 | nap 84 | cocoapods-search (1.0.0) 85 | cocoapods-stats (1.0.0) 86 | cocoapods-trunk (1.3.0) 87 | nap (>= 0.8, < 2.0) 88 | netrc (~> 0.11) 89 | cocoapods-try (1.1.0) 90 | coderay (1.1.2) 91 | colored (1.2) 92 | colored2 (3.1.2) 93 | commander-fastlane (4.4.5) 94 | highline (~> 1.7.2) 95 | concurrent-ruby (1.0.5) 96 | cork (0.3.0) 97 | colored2 (~> 3.1) 98 | danger-device_grid (0.2.0) 99 | fastlane (>= 2.0.0, < 3.0.0) 100 | declarative (0.0.10) 101 | declarative-option (0.1.0) 102 | domain_name (0.5.20170404) 103 | unf (>= 0.0.5, < 1.0.0) 104 | dotenv (2.2.1) 105 | escape (0.0.4) 106 | excon (0.60.0) 107 | faraday (0.13.1) 108 | multipart-post (>= 1.2, < 3) 109 | faraday-cookie_jar (0.0.6) 110 | faraday (>= 0.7.4) 111 | http-cookie (~> 1.0.0) 112 | faraday-http-cache (1.3.1) 113 | faraday (~> 0.8) 114 | faraday_middleware (0.12.2) 115 | faraday (>= 0.7.4, < 1.0) 116 | fastimage (2.1.1) 117 | fastlane (2.76.1) 118 | CFPropertyList (>= 2.3, < 3.0.0) 119 | addressable (>= 2.3, < 3.0.0) 120 | babosa (>= 1.0.2, < 2.0.0) 121 | bundler (>= 1.12.0, < 2.0.0) 122 | colored 123 | commander-fastlane (>= 4.4.5, < 5.0.0) 124 | dotenv (>= 2.1.1, < 3.0.0) 125 | excon (>= 0.45.0, < 1.0.0) 126 | faraday (~> 0.9) 127 | faraday-cookie_jar (~> 0.0.6) 128 | faraday_middleware (~> 0.9) 129 | fastimage (>= 2.1.0, < 3.0.0) 130 | gh_inspector (>= 1.0.1, < 2.0.0) 131 | google-api-client (>= 0.13.1, < 0.14.0) 132 | highline (>= 1.7.2, < 2.0.0) 133 | json (< 3.0.0) 134 | mini_magick (~> 4.5.1) 135 | multi_json 136 | multi_xml (~> 0.5) 137 | multipart-post (~> 2.0.0) 138 | plist (>= 3.1.0, < 4.0.0) 139 | public_suffix (~> 2.0.0) 140 | rubyzip (>= 1.1.0, < 2.0.0) 141 | security (= 0.1.3) 142 | slack-notifier (>= 2.0.0, < 3.0.0) 143 | terminal-notifier (>= 1.6.2, < 2.0.0) 144 | terminal-table (>= 1.4.5, < 2.0.0) 145 | tty-screen (>= 0.6.3, < 1.0.0) 146 | tty-spinner (>= 0.8.0, < 1.0.0) 147 | word_wrap (~> 1.0.0) 148 | xcodeproj (>= 1.5.2, < 2.0.0) 149 | xcpretty (>= 0.2.4, < 1.0.0) 150 | xcpretty-travis-formatter (>= 0.0.3) 151 | fourflusher (2.0.1) 152 | fuzzy_match (2.0.4) 153 | gh_inspector (1.0.3) 154 | git (1.3.0) 155 | google-api-client (0.13.6) 156 | addressable (~> 2.5, >= 2.5.1) 157 | googleauth (~> 0.5) 158 | httpclient (>= 2.8.1, < 3.0) 159 | mime-types (~> 3.0) 160 | representable (~> 3.0) 161 | retriable (>= 2.0, < 4.0) 162 | googleauth (0.6.2) 163 | faraday (~> 0.12) 164 | jwt (>= 1.4, < 3.0) 165 | logging (~> 2.0) 166 | memoist (~> 0.12) 167 | multi_json (~> 1.11) 168 | os (~> 0.9) 169 | signet (~> 0.7) 170 | highline (1.7.10) 171 | http-cookie (1.0.3) 172 | domain_name (~> 0.5) 173 | httpclient (2.8.3) 174 | i18n (0.9.1) 175 | concurrent-ruby (~> 1.0) 176 | json (2.1.0) 177 | jwt (2.1.0) 178 | kramdown (1.16.2) 179 | little-plugger (1.1.4) 180 | logging (2.2.2) 181 | little-plugger (~> 1.1) 182 | multi_json (~> 1.10) 183 | memoist (0.16.0) 184 | method_source (0.9.0) 185 | mime-types (3.1) 186 | mime-types-data (~> 3.2015) 187 | mime-types-data (3.2016.0521) 188 | mini_magick (4.5.1) 189 | minitest (5.11.1) 190 | molinillo (0.5.7) 191 | multi_json (1.13.1) 192 | multi_xml (0.6.0) 193 | multipart-post (2.0.0) 194 | nanaimo (0.2.3) 195 | nap (1.1.0) 196 | netrc (0.11.0) 197 | no_proxy_fix (0.1.2) 198 | octokit (4.8.0) 199 | sawyer (~> 0.8.0, >= 0.5.3) 200 | open4 (1.3.4) 201 | os (0.9.6) 202 | ox (2.8.2) 203 | plist (3.4.0) 204 | pry (0.11.3) 205 | coderay (~> 1.1.0) 206 | method_source (~> 0.9.0) 207 | public_suffix (2.0.5) 208 | representable (3.0.4) 209 | declarative (< 0.1.0) 210 | declarative-option (< 0.2.0) 211 | uber (< 0.2.0) 212 | retriable (3.1.1) 213 | rouge (2.0.7) 214 | ruby-macho (1.1.0) 215 | rubyzip (1.2.1) 216 | sawyer (0.8.1) 217 | addressable (>= 2.3.5, < 2.6) 218 | faraday (~> 0.8, < 1.0) 219 | security (0.1.3) 220 | signet (0.8.1) 221 | addressable (~> 2.3) 222 | faraday (~> 0.9) 223 | jwt (>= 1.5, < 3.0) 224 | multi_json (~> 1.10) 225 | slack-notifier (2.3.2) 226 | terminal-notifier (1.8.0) 227 | terminal-table (1.8.0) 228 | unicode-display_width (~> 1.1, >= 1.1.1) 229 | thread_safe (0.3.6) 230 | tty-cursor (0.5.0) 231 | tty-screen (0.6.4) 232 | tty-spinner (0.8.0) 233 | tty-cursor (>= 0.5.0) 234 | tzinfo (1.2.4) 235 | thread_safe (~> 0.1) 236 | uber (0.1.0) 237 | unf (0.1.4) 238 | unf_ext 239 | unf_ext (0.0.7.4) 240 | unicode-display_width (1.3.0) 241 | word_wrap (1.0.0) 242 | xcodeproj (1.5.4) 243 | CFPropertyList (~> 2.3.3) 244 | claide (>= 1.0.2, < 2.0) 245 | colored2 (~> 3.1) 246 | nanaimo (~> 0.2.3) 247 | xcpretty (0.2.8) 248 | rouge (~> 2.0.7) 249 | xcpretty-travis-formatter (1.0.0) 250 | xcpretty (~> 0.2, >= 0.0.7) 251 | 252 | PLATFORMS 253 | ruby 254 | 255 | DEPENDENCIES 256 | bundler 257 | cocoapods 258 | danger! 259 | danger-device_grid 260 | danger-junit! 261 | fastlane 262 | fastlane-plugin-emoji_fetcher! 263 | fastlane-plugin-trainer! 264 | pry 265 | 266 | BUNDLED WITH 267 | 1.14.6 268 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Felix Krause 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '8.0' 3 | # Uncomment this line if you're using Swift 4 | use_frameworks! 5 | 6 | target 'Themoji' do 7 | pod "EmojiKit" 8 | pod "PKHUD" 9 | pod "Fabric" 10 | pod "Crashlytics" 11 | end 12 | 13 | # Stolen from https://github.com/CocoaPods/CocoaPods/issues/4011#issuecomment-152688417 14 | # Otherwise Xcode tries to sign the framework files 15 | post_install do |installer| 16 | installer.pods_project.targets.each do |target| 17 | target.build_configurations.each do |config| 18 | config.build_settings['EXPANDED_CODE_SIGN_IDENTITY'] = "" 19 | config.build_settings['CODE_SIGNING_REQUIRED'] = "NO" 20 | config.build_settings['CODE_SIGNING_ALLOWED'] = "NO" 21 | config.build_settings['SWIFT_VERSION'] = '2.3' 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Crashlytics (3.6.0): 3 | - Fabric (~> 1.6.3) 4 | - EmojiKit (0.0.1) 5 | - Fabric (1.6.5) 6 | - PKHUD (2.2.5) 7 | 8 | DEPENDENCIES: 9 | - Crashlytics 10 | - EmojiKit 11 | - Fabric 12 | - PKHUD 13 | 14 | SPEC CHECKSUMS: 15 | Crashlytics: e4e8d02914f2608fbc7bf42b1a7af838b0db67a2 16 | EmojiKit: 5e544c85753b1027f7335a75168e5bfade705f06 17 | Fabric: 338ffd3c2afcab120638907b4251189de9ad17b3 18 | PKHUD: 15d9db01fb008bb9247c6d785c585f587955b113 19 | 20 | PODFILE CHECKSUM: af2beb6891702710ba77f83f1c98e8bad9985689 21 | 22 | COCOAPODS: 1.0.1 23 | -------------------------------------------------------------------------------- /Pods/Crashlytics/Crashlytics.framework/README: -------------------------------------------------------------------------------- 1 | We've now combined all our supported platforms into a single podspec. As a result, we moved our submit script to a new location for Cocoapods projects: ${PODS_ROOT}/Crashlytics/submit. To avoid breaking functionality that references the old location of the submit, we've placed this dummy script that calls to the correct location, while providing a helpful warning if it is invoked. This bridge for backwards compatibility will be removed in a future release, so please heed the warning! 2 | -------------------------------------------------------------------------------- /Pods/Crashlytics/Crashlytics.framework/submit: -------------------------------------------------------------------------------- 1 | if [[ -z $PODS_ROOT ]]; then 2 | echo "error: The submit binary delivered by cocoapods is in a new location, under '$"{"PODS_ROOT"}"/Crashlytics/submit'. This script was put in place for backwards compatibility, but it relies on PODS_ROOT, which does not have a value in your current setup. Please update the path to the submit binary to fix this issue." 3 | else 4 | echo "warning: The submit script is now located at '$"{"PODS_ROOT"}"/Crashlytics/submit'. To remove this warning, update your path to point to this new location." 5 | sh ${PODS_ROOT}/Crashlytics/submit "$@" 6 | fi 7 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Headers/ANSCompatibility.h: -------------------------------------------------------------------------------- 1 | // 2 | // ANSCompatibility.h 3 | // AnswersKit 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #pragma once 9 | 10 | #if !__has_feature(nullability) 11 | #define nonnull 12 | #define nullable 13 | #define _Nullable 14 | #define _Nonnull 15 | #endif 16 | 17 | #ifndef NS_ASSUME_NONNULL_BEGIN 18 | #define NS_ASSUME_NONNULL_BEGIN 19 | #endif 20 | 21 | #ifndef NS_ASSUME_NONNULL_END 22 | #define NS_ASSUME_NONNULL_END 23 | #endif 24 | 25 | #if __has_feature(objc_generics) 26 | #define ANS_GENERIC_NSARRAY(type) NSArray 27 | #define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 28 | #else 29 | #define ANS_GENERIC_NSARRAY(type) NSArray 30 | #define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 31 | #endif 32 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Headers/Answers.h: -------------------------------------------------------------------------------- 1 | // 2 | // Answers.h 3 | // Crashlytics 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #import 9 | #import "ANSCompatibility.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | /** 14 | * This class exposes the Answers Events API, allowing you to track key 15 | * user user actions and metrics in your app. 16 | */ 17 | @interface Answers : NSObject 18 | 19 | /** 20 | * Log a Sign Up event to see users signing up for your app in real-time, understand how 21 | * many users are signing up with different methods and their success rate signing up. 22 | * 23 | * @param signUpMethodOrNil The method by which a user logged in, e.g. Twitter or Digits. 24 | * @param signUpSucceededOrNil The ultimate success or failure of the login 25 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 26 | */ 27 | + (void)logSignUpWithMethod:(nullable NSString *)signUpMethodOrNil 28 | success:(nullable NSNumber *)signUpSucceededOrNil 29 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 30 | 31 | /** 32 | * Log an Log In event to see users logging into your app in real-time, understand how many 33 | * users are logging in with different methods and their success rate logging into your app. 34 | * 35 | * @param loginMethodOrNil The method by which a user logged in, e.g. email, Twitter or Digits. 36 | * @param loginSucceededOrNil The ultimate success or failure of the login 37 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 38 | */ 39 | + (void)logLoginWithMethod:(nullable NSString *)loginMethodOrNil 40 | success:(nullable NSNumber *)loginSucceededOrNil 41 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 42 | 43 | /** 44 | * Log a Share event to see users sharing from your app in real-time, letting you 45 | * understand what content they're sharing from the type or genre down to the specific id. 46 | * 47 | * @param shareMethodOrNil The method by which a user shared, e.g. email, Twitter, SMS. 48 | * @param contentNameOrNil The human readable name for this piece of content. 49 | * @param contentTypeOrNil The type of content shared. 50 | * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item. 51 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 52 | */ 53 | + (void)logShareWithMethod:(nullable NSString *)shareMethodOrNil 54 | contentName:(nullable NSString *)contentNameOrNil 55 | contentType:(nullable NSString *)contentTypeOrNil 56 | contentId:(nullable NSString *)contentIdOrNil 57 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 58 | 59 | /** 60 | * Log an Invite Event to track how users are inviting other users into 61 | * your application. 62 | * 63 | * @param inviteMethodOrNil The method of invitation, e.g. GameCenter, Twitter, email. 64 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 65 | */ 66 | + (void)logInviteWithMethod:(nullable NSString *)inviteMethodOrNil 67 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 68 | 69 | /** 70 | * Log a Purchase event to see your revenue in real-time, understand how many users are making purchases, see which 71 | * items are most popular, and track plenty of other important purchase-related metrics. 72 | * 73 | * @param itemPriceOrNil The purchased item's price. 74 | * @param currencyOrNil The ISO4217 currency code. Example: USD 75 | * @param purchaseSucceededOrNil Was the purchase succesful or unsuccesful 76 | * @param itemNameOrNil The human-readable form of the item's name. Example: 77 | * @param itemTypeOrNil The type, or genre of the item. Example: Song 78 | * @param itemIdOrNil The machine-readable, unique item identifier Example: SKU 79 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase. 80 | */ 81 | + (void)logPurchaseWithPrice:(nullable NSDecimalNumber *)itemPriceOrNil 82 | currency:(nullable NSString *)currencyOrNil 83 | success:(nullable NSNumber *)purchaseSucceededOrNil 84 | itemName:(nullable NSString *)itemNameOrNil 85 | itemType:(nullable NSString *)itemTypeOrNil 86 | itemId:(nullable NSString *)itemIdOrNil 87 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 88 | 89 | /** 90 | * Log a Level Start Event to track where users are in your game. 91 | * 92 | * @param levelNameOrNil The level name 93 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this level start event. 94 | */ 95 | + (void)logLevelStart:(nullable NSString *)levelNameOrNil 96 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 97 | 98 | /** 99 | * Log a Level End event to track how users are completing levels in your game. 100 | * 101 | * @param levelNameOrNil The name of the level completed, E.G. "1" or "Training" 102 | * @param scoreOrNil The score the user completed the level with. 103 | * @param levelCompletedSuccesfullyOrNil A boolean representing whether or not the level was completed succesfully. 104 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 105 | */ 106 | + (void)logLevelEnd:(nullable NSString *)levelNameOrNil 107 | score:(nullable NSNumber *)scoreOrNil 108 | success:(nullable NSNumber *)levelCompletedSuccesfullyOrNil 109 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 110 | 111 | /** 112 | * Log an Add to Cart event to see users adding items to a shopping cart in real-time, understand how 113 | * many users start the purchase flow, see which items are most popular, and track plenty of other important 114 | * purchase-related metrics. 115 | * 116 | * @param itemPriceOrNil The purchased item's price. 117 | * @param currencyOrNil The ISO4217 currency code. Example: USD 118 | * @param itemNameOrNil The human-readable form of the item's name. Example: 119 | * @param itemTypeOrNil The type, or genre of the item. Example: Song 120 | * @param itemIdOrNil The machine-readable, unique item identifier Example: SKU 121 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 122 | */ 123 | + (void)logAddToCartWithPrice:(nullable NSDecimalNumber *)itemPriceOrNil 124 | currency:(nullable NSString *)currencyOrNil 125 | itemName:(nullable NSString *)itemNameOrNil 126 | itemType:(nullable NSString *)itemTypeOrNil 127 | itemId:(nullable NSString *)itemIdOrNil 128 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 129 | 130 | /** 131 | * Log a Start Checkout event to see users moving through the purchase funnel in real-time, understand how many 132 | * users are doing this and how much they're spending per checkout, and see how it related to other important 133 | * purchase-related metrics. 134 | * 135 | * @param totalPriceOrNil The total price of the cart. 136 | * @param currencyOrNil The ISO4217 currency code. Example: USD 137 | * @param itemCountOrNil The number of items in the cart. 138 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 139 | */ 140 | + (void)logStartCheckoutWithPrice:(nullable NSDecimalNumber *)totalPriceOrNil 141 | currency:(nullable NSString *)currencyOrNil 142 | itemCount:(nullable NSNumber *)itemCountOrNil 143 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 144 | 145 | /** 146 | * Log a Rating event to see users rating content within your app in real-time and understand what 147 | * content is most engaging, from the type or genre down to the specific id. 148 | * 149 | * @param ratingOrNil The integer rating given by the user. 150 | * @param contentNameOrNil The human readable name for this piece of content. 151 | * @param contentTypeOrNil The type of content shared. 152 | * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item. 153 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 154 | */ 155 | + (void)logRating:(nullable NSNumber *)ratingOrNil 156 | contentName:(nullable NSString *)contentNameOrNil 157 | contentType:(nullable NSString *)contentTypeOrNil 158 | contentId:(nullable NSString *)contentIdOrNil 159 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 160 | 161 | /** 162 | * Log a Content View event to see users viewing content within your app in real-time and 163 | * understand what content is most engaging, from the type or genre down to the specific id. 164 | * 165 | * @param contentNameOrNil The human readable name for this piece of content. 166 | * @param contentTypeOrNil The type of content shared. 167 | * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item. 168 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 169 | */ 170 | + (void)logContentViewWithName:(nullable NSString *)contentNameOrNil 171 | contentType:(nullable NSString *)contentTypeOrNil 172 | contentId:(nullable NSString *)contentIdOrNil 173 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 174 | 175 | /** 176 | * Log a Search event allows you to see users searching within your app in real-time and understand 177 | * exactly what they're searching for. 178 | * 179 | * @param queryOrNil The user's query. 180 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. 181 | */ 182 | + (void)logSearchWithQuery:(nullable NSString *)queryOrNil 183 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 184 | 185 | /** 186 | * Log a Custom Event to see user actions that are uniquely important for your app in real-time, to see how often 187 | * they're performing these actions with breakdowns by different categories you add. Use a human-readable name for 188 | * the name of the event, since this is how the event will appear in Answers. 189 | * 190 | * @param eventName The human-readable name for the event. 191 | * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. Attribute keys 192 | * must be NSString and and values must be NSNumber or NSString. 193 | * @discussion How we treat NSNumbers: 194 | * We will provide information about the distribution of values over time. 195 | * 196 | * How we treat NSStrings: 197 | * NSStrings are used as categorical data, allowing comparison across different category values. 198 | * Strings are limited to a maximum length of 100 characters, attributes over this length will be 199 | * truncated. 200 | * 201 | * When tracking the Tweet views to better understand user engagement, sending the tweet's length 202 | * and the type of media present in the tweet allows you to track how tweet length and the type of media influence 203 | * engagement. 204 | */ 205 | + (void)logCustomEventWithName:(NSString *)eventName 206 | customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; 207 | 208 | @end 209 | 210 | NS_ASSUME_NONNULL_END 211 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSAttributes.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSAttributes.h 3 | // Crashlytics 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #pragma once 9 | 10 | #define CLS_DEPRECATED(x) __attribute__ ((deprecated(x))) 11 | 12 | #if !__has_feature(nullability) 13 | #define nonnull 14 | #define nullable 15 | #define _Nullable 16 | #define _Nonnull 17 | #endif 18 | 19 | #ifndef NS_ASSUME_NONNULL_BEGIN 20 | #define NS_ASSUME_NONNULL_BEGIN 21 | #endif 22 | 23 | #ifndef NS_ASSUME_NONNULL_END 24 | #define NS_ASSUME_NONNULL_END 25 | #endif 26 | 27 | #if __has_feature(objc_generics) 28 | #define CLS_GENERIC_NSARRAY(type) NSArray 29 | #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 30 | #else 31 | #define CLS_GENERIC_NSARRAY(type) NSArray 32 | #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 33 | #endif 34 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSLogging.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSLogging.h 3 | // Crashlytics 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | #ifdef __OBJC__ 8 | #import "CLSAttributes.h" 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | #endif 13 | 14 | 15 | 16 | /** 17 | * 18 | * The CLS_LOG macro provides as easy way to gather more information in your log messages that are 19 | * sent with your crash data. CLS_LOG prepends your custom log message with the function name and 20 | * line number where the macro was used. If your app was built with the DEBUG preprocessor macro 21 | * defined CLS_LOG uses the CLSNSLog function which forwards your log message to NSLog and CLSLog. 22 | * If the DEBUG preprocessor macro is not defined CLS_LOG uses CLSLog only. 23 | * 24 | * Example output: 25 | * -[AppDelegate login:] line 134 $ login start 26 | * 27 | * If you would like to change this macro, create a new header file, unset our define and then define 28 | * your own version. Make sure this new header file is imported after the Crashlytics header file. 29 | * 30 | * #undef CLS_LOG 31 | * #define CLS_LOG(__FORMAT__, ...) CLSNSLog... 32 | * 33 | **/ 34 | #ifdef __OBJC__ 35 | #ifdef DEBUG 36 | #define CLS_LOG(__FORMAT__, ...) CLSNSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 37 | #else 38 | #define CLS_LOG(__FORMAT__, ...) CLSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 39 | #endif 40 | #endif 41 | 42 | /** 43 | * 44 | * Add logging that will be sent with your crash data. This logging will not show up in the system.log 45 | * and will only be visible in your Crashlytics dashboard. 46 | * 47 | **/ 48 | 49 | #ifdef __OBJC__ 50 | OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); 51 | OBJC_EXTERN void CLSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0); 52 | 53 | /** 54 | * 55 | * Add logging that will be sent with your crash data. This logging will show up in the system.log 56 | * and your Crashlytics dashboard. It is not recommended for Release builds. 57 | * 58 | **/ 59 | OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); 60 | OBJC_EXTERN void CLSNSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0); 61 | 62 | 63 | NS_ASSUME_NONNULL_END 64 | #endif 65 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSReport.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSReport.h 3 | // Crashlytics 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #import 9 | #import "CLSAttributes.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | /** 14 | * The CLSCrashReport protocol is deprecated. See the CLSReport class and the CrashyticsDelegate changes for details. 15 | **/ 16 | @protocol CLSCrashReport 17 | 18 | @property (nonatomic, copy, readonly) NSString *identifier; 19 | @property (nonatomic, copy, readonly) NSDictionary *customKeys; 20 | @property (nonatomic, copy, readonly) NSString *bundleVersion; 21 | @property (nonatomic, copy, readonly) NSString *bundleShortVersionString; 22 | @property (nonatomic, copy, readonly) NSDate *crashedOnDate; 23 | @property (nonatomic, copy, readonly) NSString *OSVersion; 24 | @property (nonatomic, copy, readonly) NSString *OSBuildVersion; 25 | 26 | @end 27 | 28 | /** 29 | * The CLSReport exposes an interface to the phsyical report that Crashlytics has created. You can 30 | * use this class to get information about the event, and can also set some values after the 31 | * event has occured. 32 | **/ 33 | @interface CLSReport : NSObject 34 | 35 | - (instancetype)init NS_UNAVAILABLE; 36 | + (instancetype)new NS_UNAVAILABLE; 37 | 38 | /** 39 | * Returns the session identifier for the report. 40 | **/ 41 | @property (nonatomic, copy, readonly) NSString *identifier; 42 | 43 | /** 44 | * Returns the custom key value data for the report. 45 | **/ 46 | @property (nonatomic, copy, readonly) NSDictionary *customKeys; 47 | 48 | /** 49 | * Returns the CFBundleVersion of the application that generated the report. 50 | **/ 51 | @property (nonatomic, copy, readonly) NSString *bundleVersion; 52 | 53 | /** 54 | * Returns the CFBundleShortVersionString of the application that generated the report. 55 | **/ 56 | @property (nonatomic, copy, readonly) NSString *bundleShortVersionString; 57 | 58 | /** 59 | * Returns the date that the report was created. 60 | **/ 61 | @property (nonatomic, copy, readonly) NSDate *dateCreated; 62 | 63 | /** 64 | * Returns the os version that the application crashed on. 65 | **/ 66 | @property (nonatomic, copy, readonly) NSString *OSVersion; 67 | 68 | /** 69 | * Returns the os build version that the application crashed on. 70 | **/ 71 | @property (nonatomic, copy, readonly) NSString *OSBuildVersion; 72 | 73 | /** 74 | * Returns YES if the report contains any crash information, otherwise returns NO. 75 | **/ 76 | @property (nonatomic, assign, readonly) BOOL isCrash; 77 | 78 | /** 79 | * You can use this method to set, after the event, additional custom keys. The rules 80 | * and semantics for this method are the same as those documented in Crashlytics.h. Be aware 81 | * that the maximum size and count of custom keys is still enforced, and you can overwrite keys 82 | * and/or cause excess keys to be deleted by using this method. 83 | **/ 84 | - (void)setObjectValue:(nullable id)value forKey:(NSString *)key; 85 | 86 | /** 87 | * Record an application-specific user identifier. See Crashlytics.h for details. 88 | **/ 89 | @property (nonatomic, copy, nullable) NSString * userIdentifier; 90 | 91 | /** 92 | * Record a user name. See Crashlytics.h for details. 93 | **/ 94 | @property (nonatomic, copy, nullable) NSString * userName; 95 | 96 | /** 97 | * Record a user email. See Crashlytics.h for details. 98 | **/ 99 | @property (nonatomic, copy, nullable) NSString * userEmail; 100 | 101 | @end 102 | 103 | NS_ASSUME_NONNULL_END 104 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSStackFrame.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSStackFrame.h 3 | // Crashlytics 4 | // 5 | // Copyright 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #import 9 | #import "CLSAttributes.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | /** 14 | * 15 | * This class is used in conjunction with -[Crashlytics recordCustomExceptionName:reason:frameArray:] to 16 | * record information about non-ObjC/C++ exceptions. All information included here will be displayed 17 | * in the Crashlytics UI, and can influence crash grouping. Be particularly careful with the use of the 18 | * address property. If set, Crashlytics will attempt symbolication and could overwrite other properities 19 | * in the process. 20 | * 21 | **/ 22 | @interface CLSStackFrame : NSObject 23 | 24 | + (instancetype)stackFrame; 25 | + (instancetype)stackFrameWithAddress:(NSUInteger)address; 26 | + (instancetype)stackFrameWithSymbol:(NSString *)symbol; 27 | 28 | @property (nonatomic, copy, nullable) NSString *symbol; 29 | @property (nonatomic, copy, nullable) NSString *library; 30 | @property (nonatomic, copy, nullable) NSString *fileName; 31 | @property (nonatomic, assign) uint32_t lineNumber; 32 | @property (nonatomic, assign) uint64_t offset; 33 | @property (nonatomic, assign) uint64_t address; 34 | 35 | @end 36 | 37 | NS_ASSUME_NONNULL_END 38 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Headers/Crashlytics.h: -------------------------------------------------------------------------------- 1 | // 2 | // Crashlytics.h 3 | // Crashlytics 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | #import "CLSAttributes.h" 11 | #import "CLSLogging.h" 12 | #import "CLSReport.h" 13 | #import "CLSStackFrame.h" 14 | #import "Answers.h" 15 | 16 | NS_ASSUME_NONNULL_BEGIN 17 | 18 | @protocol CrashlyticsDelegate; 19 | 20 | /** 21 | * Crashlytics. Handles configuration and initialization of Crashlytics. 22 | */ 23 | @interface Crashlytics : NSObject 24 | 25 | @property (nonatomic, readonly, copy) NSString *APIKey; 26 | @property (nonatomic, readonly, copy) NSString *version; 27 | @property (nonatomic, assign) BOOL debugMode; 28 | 29 | /** 30 | * 31 | * The delegate can be used to influence decisions on reporting and behavior, as well as reacting 32 | * to previous crashes. 33 | * 34 | * Make certain that the delegate is setup before starting Crashlytics with startWithAPIKey:... or 35 | * via +[Fabric with:...]. Failure to do will result in missing any delegate callbacks that occur 36 | * synchronously during start. 37 | * 38 | **/ 39 | @property (nonatomic, assign, nullable) id delegate; 40 | 41 | /** 42 | * The recommended way to install Crashlytics into your application is to place a call to +startWithAPIKey: 43 | * in your -application:didFinishLaunchingWithOptions: or -applicationDidFinishLaunching: 44 | * method. 45 | * 46 | * Note: Starting with 3.0, the submission process has been significantly improved. The delay parameter 47 | * is no longer required to throttle submissions on launch, performance will be great without it. 48 | * 49 | * @param apiKey The Crashlytics API Key for this app 50 | * 51 | * @return The singleton Crashlytics instance 52 | */ 53 | + (Crashlytics *)startWithAPIKey:(NSString *)apiKey; 54 | + (Crashlytics *)startWithAPIKey:(NSString *)apiKey afterDelay:(NSTimeInterval)delay CLS_DEPRECATED("Crashlytics no longer needs or uses the delay parameter. Please use +startWithAPIKey: instead."); 55 | 56 | /** 57 | * If you need the functionality provided by the CrashlyticsDelegate protocol, you can use 58 | * these convenience methods to activate the framework and set the delegate in one call. 59 | * 60 | * @param apiKey The Crashlytics API Key for this app 61 | * @param delegate A delegate object which conforms to CrashlyticsDelegate. 62 | * 63 | * @return The singleton Crashlytics instance 64 | */ 65 | + (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(nullable id)delegate; 66 | + (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(nullable id)delegate afterDelay:(NSTimeInterval)delay CLS_DEPRECATED("Crashlytics no longer needs or uses the delay parameter. Please use +startWithAPIKey:delegate: instead."); 67 | 68 | /** 69 | * Access the singleton Crashlytics instance. 70 | * 71 | * @return The singleton Crashlytics instance 72 | */ 73 | + (Crashlytics *)sharedInstance; 74 | 75 | /** 76 | * The easiest way to cause a crash - great for testing! 77 | */ 78 | - (void)crash; 79 | 80 | /** 81 | * The easiest way to cause a crash with an exception - great for testing. 82 | */ 83 | - (void)throwException; 84 | 85 | /** 86 | * Specify a user identifier which will be visible in the Crashlytics UI. 87 | * 88 | * Many of our customers have requested the ability to tie crashes to specific end-users of their 89 | * application in order to facilitate responses to support requests or permit the ability to reach 90 | * out for more information. We allow you to specify up to three separate values for display within 91 | * the Crashlytics UI - but please be mindful of your end-user's privacy. 92 | * 93 | * We recommend specifying a user identifier - an arbitrary string that ties an end-user to a record 94 | * in your system. This could be a database id, hash, or other value that is meaningless to a 95 | * third-party observer but can be indexed and queried by you. 96 | * 97 | * Optionally, you may also specify the end-user's name or username, as well as email address if you 98 | * do not have a system that works well with obscured identifiers. 99 | * 100 | * Pursuant to our EULA, this data is transferred securely throughout our system and we will not 101 | * disseminate end-user data unless required to by law. That said, if you choose to provide end-user 102 | * contact information, we strongly recommend that you disclose this in your application's privacy 103 | * policy. Data privacy is of our utmost concern. 104 | * 105 | * @param identifier An arbitrary user identifier string which ties an end-user to a record in your system. 106 | */ 107 | - (void)setUserIdentifier:(nullable NSString *)identifier; 108 | 109 | /** 110 | * Specify a user name which will be visible in the Crashlytics UI. 111 | * Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs. 112 | * @see setUserIdentifier: 113 | * 114 | * @param name An end user's name. 115 | */ 116 | - (void)setUserName:(nullable NSString *)name; 117 | 118 | /** 119 | * Specify a user email which will be visible in the Crashlytics UI. 120 | * Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs. 121 | * 122 | * @see setUserIdentifier: 123 | * 124 | * @param email An end user's email address. 125 | */ 126 | - (void)setUserEmail:(nullable NSString *)email; 127 | 128 | + (void)setUserIdentifier:(nullable NSString *)identifier CLS_DEPRECATED("Please access this method via +sharedInstance"); 129 | + (void)setUserName:(nullable NSString *)name CLS_DEPRECATED("Please access this method via +sharedInstance"); 130 | + (void)setUserEmail:(nullable NSString *)email CLS_DEPRECATED("Please access this method via +sharedInstance"); 131 | 132 | /** 133 | * Set a value for a for a key to be associated with your crash data which will be visible in the Crashlytics UI. 134 | * When setting an object value, the object is converted to a string. This is typically done by calling 135 | * -[NSObject description]. 136 | * 137 | * @param value The object to be associated with the key 138 | * @param key The key with which to associate the value 139 | */ 140 | - (void)setObjectValue:(nullable id)value forKey:(NSString *)key; 141 | 142 | /** 143 | * Set an int value for a key to be associated with your crash data which will be visible in the Crashlytics UI. 144 | * 145 | * @param value The integer value to be set 146 | * @param key The key with which to associate the value 147 | */ 148 | - (void)setIntValue:(int)value forKey:(NSString *)key; 149 | 150 | /** 151 | * Set an BOOL value for a key to be associated with your crash data which will be visible in the Crashlytics UI. 152 | * 153 | * @param value The BOOL value to be set 154 | * @param key The key with which to associate the value 155 | */ 156 | - (void)setBoolValue:(BOOL)value forKey:(NSString *)key; 157 | 158 | /** 159 | * Set an float value for a key to be associated with your crash data which will be visible in the Crashlytics UI. 160 | * 161 | * @param value The float value to be set 162 | * @param key The key with which to associate the value 163 | */ 164 | - (void)setFloatValue:(float)value forKey:(NSString *)key; 165 | 166 | + (void)setObjectValue:(nullable id)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); 167 | + (void)setIntValue:(int)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); 168 | + (void)setBoolValue:(BOOL)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); 169 | + (void)setFloatValue:(float)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); 170 | 171 | /** 172 | * This method can be used to record a single exception structure in a report. This is particularly useful 173 | * when your code interacts with non-native languages like Lua, C#, or Javascript. This call can be 174 | * expensive and should only be used shortly before process termination. This API is not intended be to used 175 | * to log NSException objects. All safely-reportable NSExceptions are automatically captured by 176 | * Crashlytics. 177 | * 178 | * @param name The name of the custom exception 179 | * @param reason The reason this exception occured 180 | * @param frameArray An array of CLSStackFrame objects 181 | */ 182 | - (void)recordCustomExceptionName:(NSString *)name reason:(nullable NSString *)reason frameArray:(CLS_GENERIC_NSARRAY(CLSStackFrame *) *)frameArray; 183 | 184 | /** 185 | * 186 | * This allows you to record a non-fatal event, described by an NSError object. These events will be grouped and 187 | * displayed similarly to crashes. Keep in mind that this method can be expensive. Also, the total number of 188 | * NSErrors that can be recorded during your app's life-cycle is limited by a fixed-size circular buffer. If the 189 | * buffer is overrun, the oldest data is dropped. Errors are relayed to Crashlytics on a subsequent launch 190 | * of your application. 191 | * 192 | * You can also use the -recordError:withAdditionalUserInfo: to include additional context not represented 193 | * by the NSError instance itself. 194 | * 195 | **/ 196 | - (void)recordError:(NSError *)error; 197 | - (void)recordError:(NSError *)error withAdditionalUserInfo:(nullable CLS_GENERIC_NSDICTIONARY(NSString *, id) *)userInfo; 198 | 199 | - (void)logEvent:(NSString *)eventName CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); 200 | - (void)logEvent:(NSString *)eventName attributes:(nullable NSDictionary *) attributes CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); 201 | + (void)logEvent:(NSString *)eventName CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); 202 | + (void)logEvent:(NSString *)eventName attributes:(nullable NSDictionary *) attributes CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); 203 | 204 | @end 205 | 206 | /** 207 | * 208 | * The CrashlyticsDelegate protocol provides a mechanism for your application to take 209 | * action on events that occur in the Crashlytics crash reporting system. You can make 210 | * use of these calls by assigning an object to the Crashlytics' delegate property directly, 211 | * or through the convenience +startWithAPIKey:delegate: method. 212 | * 213 | */ 214 | @protocol CrashlyticsDelegate 215 | @optional 216 | 217 | 218 | - (void)crashlyticsDidDetectCrashDuringPreviousExecution:(Crashlytics *)crashlytics CLS_DEPRECATED("Please refer to -crashlyticsDidDetectReportForLastExecution:"); 219 | - (void)crashlytics:(Crashlytics *)crashlytics didDetectCrashDuringPreviousExecution:(id )crash CLS_DEPRECATED("Please refer to -crashlyticsDidDetectReportForLastExecution:"); 220 | 221 | /** 222 | * 223 | * Called when a Crashlytics instance has determined that the last execution of the 224 | * application ended in a crash. This is called synchronously on Crashlytics 225 | * initialization. Your delegate must invoke the completionHandler, but does not need to do so 226 | * synchronously, or even on the main thread. Invoking completionHandler with NO will cause the 227 | * detected report to be deleted and not submitted to Crashlytics. This is useful for 228 | * implementing permission prompts, or other more-complex forms of logic around submitting crashes. 229 | * 230 | * @warning Failure to invoke the completionHandler will prevent submissions from being reported. Watch out. 231 | * 232 | * @warning Just implementing this delegate method will disable all forms of synchronous report submission. This can 233 | * impact the reliability of reporting crashes very early in application launch. 234 | * 235 | * @param report The CLSReport object representing the last detected crash 236 | * @param completionHandler The completion handler to call when your logic has completed. 237 | * 238 | */ 239 | - (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler; 240 | 241 | /** 242 | * If your app is running on an OS that supports it (OS X 10.9+, iOS 7.0+), Crashlytics will submit 243 | * most reports using out-of-process background networking operations. This results in a significant 244 | * improvement in reliability of reporting, as well as power and performance wins for your users. 245 | * If you don't want this functionality, you can disable by returning NO from this method. 246 | * 247 | * @warning Background submission is not supported for extensions on iOS or OS X. 248 | * 249 | * @param crashlytics The Crashlytics singleton instance 250 | * 251 | * @return Return NO if you don't want out-of-process background network operations. 252 | * 253 | */ 254 | - (BOOL)crashlyticsCanUseBackgroundSessions:(Crashlytics *)crashlytics; 255 | 256 | @end 257 | 258 | /** 259 | * `CrashlyticsKit` can be used as a parameter to `[Fabric with:@[CrashlyticsKit]];` in Objective-C. In Swift, use Crashlytics.sharedInstance() 260 | */ 261 | #define CrashlyticsKit [Crashlytics sharedInstance] 262 | 263 | NS_ASSUME_NONNULL_END 264 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 14F1021 7 | CFBundleDevelopmentRegion 8 | English 9 | CFBundleExecutable 10 | Crashlytics 11 | CFBundleIdentifier 12 | com.twitter.crashlytics.ios 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Crashlytics 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 3.6.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | iPhoneOS 26 | 27 | CFBundleVersion 28 | 99 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 13B137 33 | DTPlatformName 34 | iphoneos 35 | DTPlatformVersion 36 | 9.1 37 | DTSDKBuild 38 | 13B137 39 | DTSDKName 40 | iphoneos9.1 41 | DTXcode 42 | 0710 43 | DTXcodeBuild 44 | 7B91b 45 | MinimumOSVersion 46 | 6.0 47 | NSHumanReadableCopyright 48 | Copyright © 2015 Crashlytics, Inc. All rights reserved. 49 | UIDeviceFamily 50 | 51 | 1 52 | 2 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Crashlytics { 2 | header "Crashlytics.h" 3 | header "Answers.h" 4 | header "ANSCompatibility.h" 5 | header "CLSLogging.h" 6 | header "CLSReport.h" 7 | header "CLSStackFrame.h" 8 | header "CLSAttributes.h" 9 | 10 | export * 11 | 12 | link "z" 13 | link "c++" 14 | } 15 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # run 4 | # 5 | # Copyright (c) 2015 Crashlytics. All rights reserved. 6 | 7 | # Figure out where we're being called from 8 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 9 | 10 | # Quote path in case of spaces or special chars 11 | DIR="\"${DIR}" 12 | 13 | PATH_SEP="/" 14 | VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" 15 | UPLOAD_COMMAND="uploadDSYM\" $@ run-script" 16 | 17 | # Ensure params are as expected, run in sync mode to validate 18 | eval $DIR$PATH_SEP$VALIDATE_COMMAND 19 | return_code=$? 20 | 21 | if [[ $return_code != 0 ]]; then 22 | exit $return_code 23 | fi 24 | 25 | # Verification passed, upload dSYM in background to prevent Xcode from waiting 26 | # Note: Validation is performed again before upload. 27 | # Output can still be found in Console.app 28 | eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & 29 | -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/submit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/Crashlytics/iOS/Crashlytics.framework/submit -------------------------------------------------------------------------------- /Pods/Crashlytics/iOS/Crashlytics.framework/uploadDSYM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/Crashlytics/iOS/Crashlytics.framework/uploadDSYM -------------------------------------------------------------------------------- /Pods/Crashlytics/submit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/Crashlytics/submit -------------------------------------------------------------------------------- /Pods/EmojiKit/EmojiKit/DictionarySerialization.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DictionarySerialization.swift 3 | // EmojiKit 4 | // 5 | // Created by Dasmer Singh on 12/22/15. 6 | // Copyright © 2015 Dastronics Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public typealias JSONDictionary = [String: AnyObject] 12 | 13 | public protocol DictionaryDeserializable { 14 | init?(dictionary: JSONDictionary) 15 | } 16 | 17 | public protocol DictionarySerializable { 18 | var dictionary: JSONDictionary { get } 19 | } 20 | -------------------------------------------------------------------------------- /Pods/EmojiKit/EmojiKit/Emoji.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Emoji.swift 3 | // EmojiKit 4 | // 5 | // Created by Dasmer Singh on 12/20/15. 6 | // Copyright © 2015 Dastronics Inc. All rights reserved. 7 | // 8 | 9 | public struct Emoji: Equatable { 10 | 11 | public let name: String 12 | public let character: String 13 | internal let aliases: [String] 14 | internal let groups: [String] 15 | 16 | public var ID: String { 17 | // There will never be more that 1 emoji struct for a given character, 18 | // so we can use the character itself to represent the unique ID 19 | return character 20 | } 21 | } 22 | 23 | extension Emoji: DictionaryDeserializable, DictionarySerializable { 24 | 25 | public init?(dictionary: JSONDictionary) { 26 | guard let name = dictionary["name"] as? String, 27 | let character = dictionary["character"] as? String, 28 | let aliases = dictionary["aliases"] as? [String], 29 | let groups = dictionary["groups"] as? [String] else { return nil } 30 | 31 | self.name = name 32 | self.character = character 33 | self.aliases = aliases 34 | self.groups = groups 35 | } 36 | 37 | public var dictionary: JSONDictionary { 38 | return [ 39 | "name": name as AnyObject, 40 | "character": character as AnyObject, 41 | "aliases": aliases as AnyObject, 42 | "groups": groups as AnyObject 43 | ] 44 | } 45 | } 46 | 47 | 48 | extension Emoji: Hashable { 49 | 50 | public var hashValue: Int { 51 | return ID.hashValue 52 | } 53 | } 54 | 55 | 56 | public func ==(lhs: Emoji, rhs: Emoji) -> Bool { 57 | return lhs.ID == rhs.ID 58 | } 59 | -------------------------------------------------------------------------------- /Pods/EmojiKit/EmojiKit/EmojiFetcher.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Fetcher.swift 3 | // EmojiKit 4 | // 5 | // Created by Dasmer Singh on 12/20/15. 6 | // Copyright © 2015 Dastronics Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct EmojiFetcher { 12 | 13 | // MARK: - Properties 14 | 15 | fileprivate let backgroundQueue: OperationQueue = { 16 | let queue = OperationQueue() 17 | queue.qualityOfService = .userInitiated 18 | return queue 19 | }() 20 | 21 | 22 | // MARK: - Initializers 23 | 24 | public init() {} 25 | 26 | // MARK: - Functions 27 | 28 | public func query(_ searchString: String, completion: @escaping (([Emoji]) -> Void)) { 29 | cancelFetches() 30 | 31 | let operation = EmojiFetchOperation(searchString: searchString) 32 | 33 | operation.completionBlock = { 34 | 35 | if operation.isCancelled { 36 | return; 37 | } 38 | 39 | DispatchQueue.main.async { 40 | completion(operation.results) 41 | } 42 | } 43 | 44 | backgroundQueue.addOperation(operation) 45 | } 46 | 47 | public func cancelFetches() { 48 | backgroundQueue.cancelAllOperations() 49 | } 50 | 51 | } 52 | 53 | private final class EmojiFetchOperation: Operation { 54 | 55 | static let allEmoji: [Emoji] = { 56 | guard let path = Bundle(for: EmojiFetchOperation.self).path(forResource: "AllEmoji", ofType: "json"), 57 | let data = try? Data(contentsOf: URL(fileURLWithPath: path)), 58 | let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []), 59 | let jsonDictionaries = jsonObject as? [JSONDictionary] else { return [] } 60 | 61 | return jsonDictionaries.flatMap { Emoji(dictionary: $0) } 62 | }() 63 | 64 | 65 | // MARK: - Properties 66 | 67 | let searchString: String 68 | var results: [Emoji] = [] 69 | 70 | 71 | // MARK: - Initializers 72 | 73 | init(searchString: String) { 74 | self.searchString = searchString 75 | } 76 | 77 | 78 | // MARK: - NSOperation 79 | 80 | override func main() { 81 | let lowercaseSearchString = self.searchString.lowercased() 82 | let allEmoji = type(of: self).allEmoji 83 | guard !isCancelled else { return } 84 | 85 | var results = [Emoji]() 86 | 87 | // Matches of the full names of the emoji 88 | results += allEmoji.filter { $0.name.hasPrefix(lowercaseSearchString) } 89 | guard !isCancelled else { return } 90 | 91 | // Matches of individual words in the name 92 | results += allEmoji.filter { emoji in 93 | guard results.index(of: emoji) == nil else { return false } 94 | 95 | var validResult = false 96 | 97 | let emojiNameWords = emoji.name.characters.split{$0 == " "}.map(String.init) 98 | 99 | for emojiNameWord in emojiNameWords { 100 | if emojiNameWord.hasPrefix(lowercaseSearchString) { 101 | validResult = true 102 | break 103 | } 104 | } 105 | return validResult 106 | } 107 | guard !isCancelled else { return } 108 | 109 | // Alias matches 110 | results += allEmoji.filter { emoji in 111 | guard results.index(of: emoji) == nil else { return false } 112 | 113 | var validResult = false 114 | 115 | for alias in emoji.aliases { 116 | if alias.hasPrefix(lowercaseSearchString) { 117 | validResult = true 118 | break 119 | } 120 | } 121 | 122 | return validResult 123 | } 124 | guard !isCancelled else { return } 125 | 126 | // Group matches 127 | results += allEmoji.filter { emoji in 128 | guard results.index(of: emoji) == nil else { return false } 129 | 130 | var validResult = false 131 | 132 | for group in emoji.groups { 133 | if lowercaseSearchString.hasPrefix(group) { 134 | validResult = true 135 | break 136 | } 137 | } 138 | 139 | return validResult 140 | } 141 | guard !isCancelled else { return } 142 | 143 | self.results = results 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /Pods/EmojiKit/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Dasmer Singh 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Pods/EmojiKit/README.md: -------------------------------------------------------------------------------- 1 | # EmojiKit 2 | EmojiKit is a simple emoji-querying framework in Swift. It is used in [Paste](https://github.com/dasmer/Paste), an Emoji Search app in the [App Store](https://itunes.apple.com/us/app/paste-emoji-search/id1070640289). 3 | 4 | Installation 5 | ------------ 6 | If you’re using [Carthage](http://github.com/Carthage/Carthage), add EmojiKit to your `Cartfile`: 7 | ``` 8 | github "dasmer/EmojiKit" 9 | ``` 10 | 11 | Otherwise, if you're using [Cocoapods](http://cocoapods.org), add EmojiKit to your `Podfile`: 12 | ``` 13 | pod 'EmojiKit', '~> 1.0' 14 | ``` 15 | 16 | Usage 17 | ----- 18 | ##### 1. Create an EmojiFetcher instance variable. 19 | ``` 20 | let fetcher = EmojiFetcher() 21 | ``` 22 | ##### 2. Use EmojiFetcher's `query` function to get an array of `Emoji` structs that match the given search string. 23 | ``` 24 | fetcher.query("food") { emojiResults in 25 | // Use emojiResults 26 | } 27 | ``` 28 | 29 | Contributing 30 | ------------ 31 | 32 | The best way to contribute is by submitting a pull request. You can also submit a [new Github issue](https://github.com/dasmer/EmojiKit/issues/new) if you find bugs or have questions. :octocat: 33 | 34 | Please make sure to follow the general coding style and add test coverage for new features! 35 | -------------------------------------------------------------------------------- /Pods/Fabric/Fabric.framework/README: -------------------------------------------------------------------------------- 1 | We've now combined all our supported platforms into a single podspec. As a result, we moved our run script to a new location for Cocoapods projects: ${PODS_ROOT}/Fabric/run. To avoid breaking builds that reference the old location of the run script, we've placed this dummy script that calls to the correct location, while providing a helpful warning in Xcode if it is invoked. This bridge for backwards compatibility will be removed in a future release, so please heed the warning! 2 | -------------------------------------------------------------------------------- /Pods/Fabric/Fabric.framework/run: -------------------------------------------------------------------------------- 1 | if [[ -z $PODS_ROOT ]]; then 2 | echo "error: The run binary delivered by cocoapods is in a new location, under '$"{"PODS_ROOT"}"/Fabric/run'. This script was put in place for backwards compatibility, but it relies on PODS_ROOT, which does not have a value in your current setup. Please update the path to the run binary to fix this issue." 3 | else 4 | echo "warning: The run script is now located at '$"{"PODS_ROOT"}"/Fabric/run'. To remove this warning, update your Run Script Build Phase to point to this new location." 5 | sh "${PODS_ROOT}/Fabric/run" "$@" 6 | fi 7 | -------------------------------------------------------------------------------- /Pods/Fabric/README.md: -------------------------------------------------------------------------------- 1 | ![Fabric Header](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-fabric-header.png) 2 | 3 | # Fabric 4 | 5 | ## Overview 6 | 7 | [Fabric](https://www.fabric.io) provides developers with the tools they need to build the best apps. Developed and maintained by Twitter and the team that built Crashlytics, Fabric provides an easy way to manage all your SDKs so that you’ll never have to worry about tedious configurations or juggling different accounts. We let you get right into coding and building the next big app. 8 | 9 | For a full list of SDK provided through Fabric visit https://fabric.io/kits 10 | 11 | ## Setup 12 | 13 | The Fabric Pod is a dependency for all Fabric SDKs and is included when installing any Fabric related Pods. General setup instructions are shown below; however, these vary depending on the selected SDK. 14 | 15 | 1. Visit https://fabric.io/sign_up to create your Fabric account and to download Fabric.app 16 | 17 | 1. Open Fabric.app, login and select an SDK to install. 18 | 19 | ![Fabric Plugin](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-fabric-plugin.png) 20 | 21 | 1. The Fabric app automatically detects when a project uses CocoaPods and gives you the option to install via the Podfile or Xcode. 22 | 23 | ![Fabric Installation Options](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-pod-installation-option.png) 24 | 25 | 1. Select the Podfile option and follow the installation instructions to update your Podfile. Note: the example below is for the Crashlytics SDK. The instructions will vary based on the selected SDK. 26 | 27 | ![Fabric Podfile Instructions](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-podfile-instructions.png) 28 | 29 | 1. Add a Run Script Build Phase and build your app. 30 | 31 | ![Fabric Run Script Build Phase](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-rsbp.png) 32 | 33 | 1. Initialize the SDK by inserting code outlined in the Fabric.app. 34 | 35 | 1. Run your app to finish the installation. 36 | 37 | ## Resources 38 | 39 | * [Documentation](https://docs.fabric.io/) 40 | * [Forums](https://twittercommunity.com/c/fabric) 41 | * [Website](https://www.fabric.io) 42 | * Follow us on Twitter: [@fabric](https://twitter.com/fabric) 43 | * Follow us on Periscope: [Fabric](https://periscope.tv/fabric) and [TwitterDev](https://periscope.tv/twitterdev) 44 | -------------------------------------------------------------------------------- /Pods/Fabric/iOS/Fabric.framework/Fabric: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/Fabric/iOS/Fabric.framework/Fabric -------------------------------------------------------------------------------- /Pods/Fabric/iOS/Fabric.framework/Headers/FABAttributes.h: -------------------------------------------------------------------------------- 1 | // 2 | // FABAttributes.h 3 | // Fabric 4 | // 5 | // Copyright (C) 2015 Twitter, Inc. 6 | // 7 | // Licensed under the Apache License, Version 2.0 (the "License"); 8 | // you may not use this file except in compliance with the License. 9 | // You may obtain a copy of the License at 10 | // 11 | // http://www.apache.org/licenses/LICENSE-2.0 12 | // 13 | // Unless required by applicable law or agreed to in writing, software 14 | // distributed under the License is distributed on an "AS IS" BASIS, 15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | // See the License for the specific language governing permissions and 17 | // limitations under the License. 18 | // 19 | 20 | #pragma once 21 | 22 | #define FAB_UNAVAILABLE(x) __attribute__((unavailable(x))) 23 | 24 | #if __has_feature(nullability) 25 | #define fab_nullable nullable 26 | #define fab_nonnull nonnull 27 | #define fab_null_unspecified null_unspecified 28 | #define fab_null_resettable null_resettable 29 | #define __fab_nullable __nullable 30 | #define __fab_nonnull __nonnull 31 | #define __fab_null_unspecified __null_unspecified 32 | #else 33 | #define fab_nullable 34 | #define fab_nonnull 35 | #define fab_null_unspecified 36 | #define fab_null_resettable 37 | #define __fab_nullable 38 | #define __fab_nonnull 39 | #define __fab_null_unspecified 40 | #endif 41 | 42 | #ifndef NS_ASSUME_NONNULL_BEGIN 43 | #define NS_ASSUME_NONNULL_BEGIN 44 | #endif 45 | 46 | #ifndef NS_ASSUME_NONNULL_END 47 | #define NS_ASSUME_NONNULL_END 48 | #endif 49 | 50 | 51 | /** 52 | * The following macros are defined here to provide 53 | * backwards compatability. If you are still using 54 | * them you should migrate to the new versions that 55 | * are defined above. 56 | */ 57 | #define FAB_NONNULL __fab_nonnull 58 | #define FAB_NULLABLE __fab_nullable 59 | #define FAB_START_NONNULL NS_ASSUME_NONNULL_BEGIN 60 | #define FAB_END_NONNULL NS_ASSUME_NONNULL_END 61 | -------------------------------------------------------------------------------- /Pods/Fabric/iOS/Fabric.framework/Headers/Fabric.h: -------------------------------------------------------------------------------- 1 | // 2 | // Fabric.h 3 | // Fabric 4 | // 5 | // Copyright (C) 2015 Twitter, Inc. 6 | // 7 | // Licensed under the Apache License, Version 2.0 (the "License"); 8 | // you may not use this file except in compliance with the License. 9 | // You may obtain a copy of the License at 10 | // 11 | // http://www.apache.org/licenses/LICENSE-2.0 12 | // 13 | // Unless required by applicable law or agreed to in writing, software 14 | // distributed under the License is distributed on an "AS IS" BASIS, 15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | // See the License for the specific language governing permissions and 17 | // limitations under the License. 18 | // 19 | 20 | #import 21 | #import "FABAttributes.h" 22 | 23 | NS_ASSUME_NONNULL_BEGIN 24 | 25 | #if TARGET_OS_IPHONE 26 | #if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 27 | #error "Fabric's minimum iOS version is 6.0" 28 | #endif 29 | #else 30 | #if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070 31 | #error "Fabric's minimum OS X version is 10.7" 32 | #endif 33 | #endif 34 | 35 | /** 36 | * Fabric Base. Coordinates configuration and starts all provided kits. 37 | */ 38 | @interface Fabric : NSObject 39 | 40 | /** 41 | * Initialize Fabric and all provided kits. Call this method within your App Delegate's `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use. 42 | * 43 | * For example, in Objective-C: 44 | * 45 | * `[Fabric with:@[[Crashlytics class], [Twitter class], [Digits class], [MoPub class]]];` 46 | * 47 | * Swift: 48 | * 49 | * `Fabric.with([Crashlytics.self(), Twitter.self(), Digits.self(), MoPub.self()])` 50 | * 51 | * Only the first call to this method is honored. Subsequent calls are no-ops. 52 | * 53 | * @param kitClasses An array of kit Class objects 54 | * 55 | * @return Returns the shared Fabric instance. In most cases this can be ignored. 56 | */ 57 | + (instancetype)with:(NSArray *)kitClasses; 58 | 59 | /** 60 | * Returns the Fabric singleton object. 61 | */ 62 | + (instancetype)sharedSDK; 63 | 64 | /** 65 | * This BOOL enables or disables debug logging, such as kit version information. The default value is NO. 66 | */ 67 | @property (nonatomic, assign) BOOL debug; 68 | 69 | /** 70 | * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. 71 | */ 72 | - (id)init FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); 73 | 74 | @end 75 | 76 | NS_ASSUME_NONNULL_END 77 | 78 | -------------------------------------------------------------------------------- /Pods/Fabric/iOS/Fabric.framework/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 14F1021 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Fabric 11 | CFBundleIdentifier 12 | io.fabric.sdk.ios 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Fabric 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.6.5 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | iPhoneOS 26 | 27 | CFBundleVersion 28 | 46 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 13B137 33 | DTPlatformName 34 | iphoneos 35 | DTPlatformVersion 36 | 9.1 37 | DTSDKBuild 38 | 13B137 39 | DTSDKName 40 | iphoneos9.1 41 | DTXcode 42 | 0710 43 | DTXcodeBuild 44 | 7B91b 45 | MinimumOSVersion 46 | 6.0 47 | NSHumanReadableCopyright 48 | Copyright © 2015 Twitter. All rights reserved. 49 | UIDeviceFamily 50 | 51 | 1 52 | 2 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /Pods/Fabric/iOS/Fabric.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Fabric { 2 | umbrella header "Fabric.h" 3 | 4 | export * 5 | module * { export * } 6 | } -------------------------------------------------------------------------------- /Pods/Fabric/iOS/Fabric.framework/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # run 4 | # 5 | # Copyright (c) 2015 Crashlytics. All rights reserved. 6 | 7 | # Figure out where we're being called from 8 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 9 | 10 | # Quote path in case of spaces or special chars 11 | DIR="\"${DIR}" 12 | 13 | PATH_SEP="/" 14 | VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" 15 | UPLOAD_COMMAND="uploadDSYM\" $@ run-script" 16 | 17 | # Ensure params are as expected, run in sync mode to validate 18 | eval $DIR$PATH_SEP$VALIDATE_COMMAND 19 | return_code=$? 20 | 21 | if [[ $return_code != 0 ]]; then 22 | exit $return_code 23 | fi 24 | 25 | # Verification passed, upload dSYM in background to prevent Xcode from waiting 26 | # Note: Validation is performed again before upload. 27 | # Output can still be found in Console.app 28 | eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & 29 | -------------------------------------------------------------------------------- /Pods/Fabric/iOS/Fabric.framework/uploadDSYM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/Fabric/iOS/Fabric.framework/uploadDSYM -------------------------------------------------------------------------------- /Pods/Fabric/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # run 4 | # 5 | # Copyright (c) 2015 Crashlytics. All rights reserved. 6 | 7 | # Figure out where we're being called from 8 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 9 | 10 | # Quote path in case of spaces or special chars 11 | DIR="\"${DIR}" 12 | 13 | PATH_SEP="/" 14 | VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" 15 | UPLOAD_COMMAND="uploadDSYM\" $@ run-script" 16 | 17 | # Ensure params are as expected, run in sync mode to validate 18 | eval $DIR$PATH_SEP$VALIDATE_COMMAND 19 | return_code=$? 20 | 21 | if [[ $return_code != 0 ]]; then 22 | exit $return_code 23 | fi 24 | 25 | # Verification passed, upload dSYM in background to prevent Xcode from waiting 26 | # Note: Validation is performed again before upload. 27 | # Output can still be found in Console.app 28 | eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & 29 | -------------------------------------------------------------------------------- /Pods/Fabric/uploadDSYM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/Fabric/uploadDSYM -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Crashlytics (3.6.0): 3 | - Fabric (~> 1.6.3) 4 | - EmojiKit (0.0.1) 5 | - Fabric (1.6.5) 6 | - PKHUD (2.2.5) 7 | 8 | DEPENDENCIES: 9 | - Crashlytics 10 | - EmojiKit 11 | - Fabric 12 | - PKHUD 13 | 14 | SPEC CHECKSUMS: 15 | Crashlytics: e4e8d02914f2608fbc7bf42b1a7af838b0db67a2 16 | EmojiKit: 5e544c85753b1027f7335a75168e5bfade705f06 17 | Fabric: 338ffd3c2afcab120638907b4251189de9ad17b3 18 | PKHUD: 15d9db01fb008bb9247c6d785c585f587955b113 19 | 20 | PODFILE CHECKSUM: af2beb6891702710ba77f83f1c98e8bad9985689 21 | 22 | COCOAPODS: 1.0.1 23 | -------------------------------------------------------------------------------- /Pods/PKHUD/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Philip Kluz (Philip.Kluz@gmail.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/FrameView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HUDView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/16/14. 6 | // Copyright (c) 2014 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// Provides the general look and feel of the PKHUD, into which the eventual content is inserted. 12 | internal class FrameView: UIVisualEffectView { 13 | 14 | internal init() { 15 | super.init(effect: UIBlurEffect(style: .light)) 16 | commonInit() 17 | } 18 | 19 | required init?(coder aDecoder: NSCoder) { 20 | super.init(coder: aDecoder) 21 | commonInit() 22 | } 23 | 24 | fileprivate func commonInit() { 25 | backgroundColor = UIColor(white: 0.8, alpha: 0.36) 26 | layer.cornerRadius = 9.0 27 | layer.masksToBounds = true 28 | 29 | contentView.addSubview(self.content) 30 | 31 | let offset = 20.0 32 | 33 | let motionEffectsX = UIInterpolatingMotionEffect(keyPath: "center.x", type: .tiltAlongHorizontalAxis) 34 | motionEffectsX.maximumRelativeValue = offset 35 | motionEffectsX.minimumRelativeValue = -offset 36 | 37 | let motionEffectsY = UIInterpolatingMotionEffect(keyPath: "center.y", type: .tiltAlongVerticalAxis) 38 | motionEffectsY.maximumRelativeValue = offset 39 | motionEffectsY.minimumRelativeValue = -offset 40 | 41 | let group = UIMotionEffectGroup() 42 | group.motionEffects = [motionEffectsX, motionEffectsY] 43 | 44 | addMotionEffect(group) 45 | } 46 | 47 | fileprivate var _content = UIView() 48 | internal var content: UIView { 49 | get { 50 | return _content 51 | } 52 | set { 53 | _content.removeFromSuperview() 54 | _content = newValue 55 | _content.alpha = 0.85 56 | _content.clipsToBounds = true 57 | _content.contentMode = .center 58 | frame.size = _content.bounds.size 59 | addSubview(_content) 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/Images.xcassets/checkmark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "checkmark.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/Images.xcassets/checkmark.imageset/checkmark.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/PKHUD/PKHUD/Images.xcassets/checkmark.imageset/checkmark.pdf -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/Images.xcassets/cross.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cross.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/Images.xcassets/cross.imageset/cross.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/PKHUD/PKHUD/Images.xcassets/cross.imageset/cross.pdf -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/Images.xcassets/progress.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "progress.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/Images.xcassets/progress.imageset/progress.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Pods/PKHUD/PKHUD/Images.xcassets/progress.imageset/progress.pdf -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUD.h: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUD.h 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/17/14. 6 | // Copyright (c) 2014 NSExceptional. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | //! Project version number for PKHUD. 12 | FOUNDATION_EXPORT double PKHUDVersionNumber; 13 | 14 | //! Project version string for PKHUD. 15 | FOUNDATION_EXPORT const unsigned char PKHUDVersionString[]; 16 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUD.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HUD.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/13/14. 6 | // Copyright (c) 2014 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// The PKHUD object controls showing and hiding of the HUD, as well as its contents and touch response behavior. 12 | open class PKHUD: NSObject { 13 | 14 | fileprivate struct Constants { 15 | static let sharedHUD = PKHUD() 16 | } 17 | 18 | fileprivate let window = Window() 19 | 20 | open class var sharedHUD: PKHUD { 21 | return Constants.sharedHUD 22 | } 23 | 24 | public override init () { 25 | super.init() 26 | NotificationCenter.default.addObserver(self, 27 | selector: #selector(PKHUD.willEnterForeground), 28 | name: NSNotification.Name.UIApplicationWillEnterForeground, 29 | object: nil) 30 | userInteractionOnUnderlyingViewsEnabled = false 31 | window.frameView.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin] 32 | } 33 | 34 | internal func willEnterForeground() { 35 | self.startAnimatingContentView() 36 | } 37 | 38 | open var dimsBackground = true 39 | open var userInteractionOnUnderlyingViewsEnabled: Bool { 40 | get { 41 | return !window.isUserInteractionEnabled 42 | } 43 | set { 44 | window.isUserInteractionEnabled = !newValue 45 | } 46 | } 47 | 48 | open var isVisible: Bool { 49 | return !window.isHidden 50 | } 51 | 52 | open var contentView: UIView { 53 | get { 54 | return window.frameView.content 55 | } 56 | set { 57 | window.frameView.content = newValue 58 | startAnimatingContentView() 59 | } 60 | } 61 | 62 | open func show() { 63 | window.showFrameView() 64 | if dimsBackground { 65 | window.showBackground(animated: true) 66 | } 67 | 68 | startAnimatingContentView() 69 | } 70 | 71 | open func hide(animated anim: Bool = true) { 72 | window.hideFrameView(animated: anim) 73 | if dimsBackground { 74 | window.hideBackground(animated: true) 75 | } 76 | 77 | stopAnimatingContentView() 78 | } 79 | 80 | fileprivate var hideTimer: Timer? 81 | open func hide(afterDelay delay: TimeInterval) { 82 | hideTimer?.invalidate() 83 | hideTimer = Timer.scheduledTimer(timeInterval: delay, target: self, selector: #selector(PKHUD.hideAnimated), userInfo: nil, repeats: false) 84 | } 85 | 86 | internal func startAnimatingContentView() { 87 | if isVisible && contentView.conforms(to: PKHUDAnimating.self) { 88 | let animatingContentView = contentView as! PKHUDAnimating 89 | animatingContentView.startAnimation() 90 | } 91 | } 92 | 93 | internal func stopAnimatingContentView() { 94 | if contentView.conforms(to: PKHUDAnimating.self) { 95 | let animatingContentView = contentView as! PKHUDAnimating 96 | animatingContentView.stopAnimation?() 97 | } 98 | } 99 | 100 | internal func hideAnimated() -> Void { 101 | hide(animated: true) 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDAnimating.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDAnimatingContentView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 9/27/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @objc protocol PKHUDAnimating { 12 | 13 | func startAnimation() 14 | @objc optional func stopAnimation() 15 | } 16 | 17 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDAssets.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUD.Assets.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/18/14. 6 | // Copyright (c) 2014 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDAssets provides a set of default images, that can be supplied to the PKHUD's content views. 12 | open class PKHUDAssets: NSObject { 13 | 14 | open class var crossImage: UIImage { return PKHUDAssets.bundledImage(named: "cross") } 15 | open class var checkmarkImage: UIImage { return PKHUDAssets.bundledImage(named: "checkmark") } 16 | open class var progressImage: UIImage { return PKHUDAssets.bundledImage(named: "progress") } 17 | 18 | internal class func bundledImage(named name: String) -> UIImage { 19 | let bundle = Bundle(for: PKHUDAssets.self) 20 | let image = UIImage(named: name, in:bundle, compatibleWith:nil) 21 | if let image = image { 22 | return image 23 | } 24 | 25 | return UIImage() 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDErrorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDErrorAnimation.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 9/27/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDErrorView provides an animated error (cross) view. 12 | open class PKHUDErrorView: PKHUDSquareBaseView, PKHUDAnimating { 13 | 14 | var dashOneLayer = PKHUDErrorView.generateDashLayer() 15 | var dashTwoLayer = PKHUDErrorView.generateDashLayer() 16 | 17 | class func generateDashLayer() -> CAShapeLayer { 18 | let dash = CAShapeLayer() 19 | dash.frame = CGRect(x: 0.0, y: 0.0, width: 88.0, height: 88.0) 20 | dash.path = { 21 | let path = UIBezierPath() 22 | path.move(to: CGPoint(x: 0.0, y: 44.0)) 23 | path.addLine(to: CGPoint(x: 88.0, y: 44.0)) 24 | return path.cgPath 25 | }() 26 | dash.lineCap = kCALineCapRound 27 | dash.lineJoin = kCALineJoinRound 28 | dash.fillColor = nil 29 | dash.strokeColor = UIColor(red: 0.15, green: 0.15, blue: 0.15, alpha: 1.0).cgColor 30 | dash.lineWidth = 6 31 | dash.fillMode = kCAFillModeForwards; 32 | return dash 33 | } 34 | 35 | public override init() { 36 | super.init() 37 | layer.addSublayer(dashOneLayer) 38 | layer.addSublayer(dashTwoLayer) 39 | dashOneLayer.position = layer.position 40 | dashTwoLayer.position = layer.position 41 | } 42 | 43 | public required init?(coder aDecoder: NSCoder) 44 | { 45 | super.init(coder: aDecoder) 46 | layer.addSublayer(dashOneLayer) 47 | layer.addSublayer(dashTwoLayer) 48 | dashOneLayer.position = layer.position 49 | dashTwoLayer.position = layer.position 50 | } 51 | 52 | func rotationAnimation(_ angle: CGFloat) -> CABasicAnimation { 53 | 54 | var animation : CABasicAnimation; 55 | if #available(iOS 9.0, *) { 56 | let springAnimation = CASpringAnimation(keyPath:"transform.rotation.z") 57 | springAnimation.damping = 1.5 58 | springAnimation.mass = 0.22 59 | springAnimation.initialVelocity = 0.5 60 | animation = springAnimation; 61 | } else { 62 | animation = CABasicAnimation(keyPath:"transform.rotation.z") 63 | } 64 | 65 | animation.fromValue = 0.0 66 | animation.toValue = angle * CGFloat(M_PI / 180.0) 67 | animation.duration = 1.0 68 | animation.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseInEaseOut) 69 | return animation 70 | } 71 | 72 | func startAnimation() { 73 | let dashOneAnimation = rotationAnimation(-45.0) 74 | let dashTwoAnimation = rotationAnimation(45.0) 75 | 76 | dashOneLayer.transform = CATransform3DMakeRotation(-45 * CGFloat(M_PI/180), 0.0, 0.0, 1.0) 77 | dashTwoLayer.transform = CATransform3DMakeRotation(45 * CGFloat(M_PI/180), 0.0, 0.0, 1.0) 78 | 79 | dashOneLayer.add(dashOneAnimation, forKey: "dashOneAnimation") 80 | dashTwoLayer.add(dashTwoAnimation, forKey: "dashTwoAnimation") 81 | } 82 | 83 | func stopAnimation() { 84 | dashOneLayer.removeAnimation(forKey: "dashOneAnimation") 85 | dashTwoLayer.removeAnimation(forKey: "dashTwoAnimation") 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDImageView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDImageView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/12/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDImageView provides a square view, which you can use to display a single image. 12 | open class PKHUDImageView: PKHUDSquareBaseView { 13 | 14 | public init(image: UIImage?) { 15 | super.init() 16 | commonInit(image: image) 17 | } 18 | 19 | public required init?(coder aDecoder: NSCoder) { 20 | super.init(coder: aDecoder) 21 | commonInit(image: nil) 22 | } 23 | 24 | func commonInit(image: UIImage?) { 25 | imageView.image = image 26 | addSubview(imageView) 27 | } 28 | 29 | open override func layoutSubviews() { 30 | super.layoutSubviews() 31 | imageView.frame = bounds 32 | } 33 | 34 | open let imageView: UIImageView = { 35 | let imageView = UIImageView() 36 | imageView.alpha = 0.85 37 | imageView.clipsToBounds = true 38 | imageView.contentMode = .center 39 | return imageView 40 | }() 41 | } 42 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDProgressView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDProgressVIew.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/12/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import QuartzCore 11 | 12 | /// PKHUDProgressView provides an indeterminate progress view. 13 | open class PKHUDProgressView: PKHUDImageView, PKHUDAnimating { 14 | 15 | public init() { 16 | super.init(image: PKHUDAssets.progressImage) 17 | } 18 | 19 | public required init?(coder aDecoder: NSCoder) { 20 | super.init(coder: aDecoder) 21 | } 22 | 23 | override func commonInit(image: UIImage?) { 24 | super.commonInit(image: image) 25 | 26 | let progressImage = PKHUDAssets.progressImage 27 | imageView.image = progressImage 28 | imageView.alpha = 0.9 29 | } 30 | 31 | let progressAnimation: CAKeyframeAnimation = { 32 | let animation = CAKeyframeAnimation(keyPath: "transform.rotation.z") 33 | animation.values = [ 34 | NSNumber(value: 0.0 as Float), 35 | NSNumber(value: 1.0 * Float(M_PI) / 6.0 as Float), 36 | NSNumber(value: 2.0 * Float(M_PI) / 6.0 as Float), 37 | NSNumber(value: 3.0 * Float(M_PI) / 6.0 as Float), 38 | NSNumber(value: 4.0 * Float(M_PI) / 6.0 as Float), 39 | NSNumber(value: 5.0 * Float(M_PI) / 6.0 as Float), 40 | NSNumber(value: 6.0 * Float(M_PI) / 6.0 as Float), 41 | NSNumber(value: 7.0 * Float(M_PI) / 6.0 as Float), 42 | NSNumber(value: 8.0 * Float(M_PI) / 6.0 as Float), 43 | NSNumber(value: 9.0 * Float(M_PI) / 6.0 as Float), 44 | NSNumber(value: 10.0 * Float(M_PI) / 6.0 as Float), 45 | NSNumber(value: 11.0 * Float(M_PI) / 6.0 as Float), 46 | NSNumber(value: 2.0 * Float(M_PI) as Float) 47 | ] 48 | animation.keyTimes = [ 49 | NSNumber(value: 0.0 as Float), 50 | NSNumber(value: 1.0 / 12.0 as Float), 51 | NSNumber(value: 2.0 / 12.0 as Float), 52 | NSNumber(value: 3.0 / 12.0 as Float), 53 | NSNumber(value: 4.0 / 12.0 as Float), 54 | NSNumber(value: 5.0 / 12.0 as Float), 55 | NSNumber(value: 0.5 as Float), 56 | NSNumber(value: 7.0 / 12.0 as Float), 57 | NSNumber(value: 8.0 / 12.0 as Float), 58 | NSNumber(value: 9.0 / 12.0 as Float), 59 | NSNumber(value: 10.0 / 12.0 as Float), 60 | NSNumber(value: 11.0 / 12.0 as Float), 61 | NSNumber(value: 1.0 as Float) 62 | ] 63 | animation.duration = 1.2 64 | animation.calculationMode = "discrete" 65 | animation.repeatCount = Float(INT_MAX) 66 | return animation 67 | }() 68 | 69 | func startAnimation() { 70 | imageView.layer.add(progressAnimation, forKey: "progressAnimation") 71 | } 72 | 73 | func stopAnimation() { 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDSquareBaseView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDSquareBaseView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/12/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDSquareBaseView provides a square view, which you can subclass and add additional views to. 12 | open class PKHUDSquareBaseView: UIView { 13 | 14 | static let defaultSquareBaseViewFrame = CGRect(origin: CGPoint.zero, size: CGSize(width: 156.0, height: 156.0)) 15 | 16 | public init() { 17 | super.init(frame: PKHUDSquareBaseView.defaultSquareBaseViewFrame) 18 | } 19 | 20 | public override init(frame: CGRect) { 21 | super.init(frame: frame) 22 | } 23 | 24 | public required init?(coder aDecoder: NSCoder) { 25 | super.init(coder: aDecoder) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDStatusView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDStatusVIew.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/12/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDStatusView provides a square view, which you can use to display a picture, a title and a subtitle. This type of view replicates the Apple HUD one to one. 12 | public final class PKHUDStatusView: PKHUDImageView { 13 | 14 | public init(title: String?, subtitle: String?, image: UIImage?) { 15 | super.init(image: image) 16 | commonInit(title: title, subtitle: subtitle) 17 | } 18 | 19 | public required init?(coder aDecoder: NSCoder) { 20 | super.init(coder: aDecoder) 21 | commonInit(title: "", subtitle: "") 22 | } 23 | 24 | fileprivate func commonInit(title: String?, subtitle: String?) { 25 | titleLabel.text = title 26 | subtitleLabel.text = subtitle 27 | 28 | addSubview(titleLabel) 29 | addSubview(subtitleLabel) 30 | } 31 | 32 | public override func layoutSubviews() { 33 | super.layoutSubviews() 34 | 35 | let viewWidth = bounds.size.width 36 | let viewHeight = bounds.size.height 37 | 38 | let halfHeight = CGFloat(ceilf(CFloat(viewHeight / 2.0))) 39 | let quarterHeight = CGFloat(ceilf(CFloat(viewHeight / 4.0))) 40 | let threeQuarterHeight = CGFloat(ceilf(CFloat(viewHeight / 4.0 * 3.0))) 41 | 42 | titleLabel.frame = CGRect(origin: CGPoint.zero, size: CGSize(width: viewWidth, height: quarterHeight)) 43 | imageView.frame = CGRect(origin: CGPoint(x:0.0, y:quarterHeight), size: CGSize(width: viewWidth, height: halfHeight)) 44 | subtitleLabel.frame = CGRect(origin: CGPoint(x:0.0, y:threeQuarterHeight), size: CGSize(width: viewWidth, height: quarterHeight)) 45 | } 46 | 47 | public let titleLabel: UILabel = { 48 | let label = UILabel() 49 | label.textAlignment = .center 50 | label.font = UIFont.boldSystemFont(ofSize: 17.0) 51 | label.textColor = UIColor.black.withAlphaComponent(0.85) 52 | return label 53 | }() 54 | 55 | public let subtitleLabel: UILabel = { 56 | let label = UILabel() 57 | label.textAlignment = .center 58 | label.font = UIFont.systemFont(ofSize: 14.0) 59 | label.textColor = UIColor.black.withAlphaComponent(0.7) 60 | label.adjustsFontSizeToFitWidth = true 61 | label.numberOfLines = 2 62 | return label 63 | }() 64 | } 65 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDSubtitleView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDSubtitleView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/12/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDSubtitleView provides a square view, which you can use to display a picture and a subtitle (beneath the image). 12 | public final class PKHUDSubtitleView: PKHUDImageView { 13 | 14 | public init(subtitle: String?, image: UIImage?) { 15 | super.init(image: image) 16 | commonInit(subtitle: subtitle) 17 | } 18 | 19 | public required init?(coder aDecoder: NSCoder) { 20 | super.init(coder: aDecoder) 21 | commonInit(subtitle: ""); 22 | } 23 | 24 | func commonInit(subtitle: String?) { 25 | subtitleLabel.text = subtitle 26 | addSubview(subtitleLabel) 27 | } 28 | 29 | public override func layoutSubviews() { 30 | super.layoutSubviews() 31 | 32 | let viewWidth = bounds.size.width 33 | let viewHeight = bounds.size.height 34 | 35 | let quarterHeight = CGFloat(ceilf(CFloat(viewHeight / 4.0))) 36 | let threeQuarterHeight = CGFloat(ceilf(CFloat(viewHeight / 4.0 * 3.0))) 37 | 38 | let opticalOffset: CGFloat = 10.0 39 | 40 | imageView.frame = CGRect(origin: CGPoint(x: 0.0, y: opticalOffset), size: CGSize(width: viewWidth, height: threeQuarterHeight - opticalOffset)) 41 | subtitleLabel.frame = CGRect(origin: CGPoint(x:0.0, y:threeQuarterHeight - opticalOffset), size: CGSize(width: viewWidth, height: quarterHeight)) 42 | } 43 | 44 | public let subtitleLabel: UILabel = { 45 | let label = UILabel() 46 | label.textAlignment = .center 47 | label.font = UIFont.boldSystemFont(ofSize: 17.0) 48 | label.textColor = UIColor.black.withAlphaComponent(0.85) 49 | label.adjustsFontSizeToFitWidth = true 50 | label.numberOfLines = 2 51 | return label 52 | }() 53 | } 54 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDSuccessView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDCheckmarkView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 9/27/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDCheckmarkView provides an animated success (checkmark) view. 12 | open class PKHUDSuccessView: PKHUDSquareBaseView, PKHUDAnimating { 13 | 14 | var checkmarkShapeLayer: CAShapeLayer = { 15 | let checkmarkPath = UIBezierPath() 16 | checkmarkPath.move(to: CGPoint(x: 4.0, y: 27.0)) 17 | checkmarkPath.addLine(to: CGPoint(x: 34.0, y: 56.0)) 18 | checkmarkPath.addLine(to: CGPoint(x: 88.0, y: 0.0)) 19 | 20 | let layer = CAShapeLayer() 21 | layer.frame = CGRect(x: 3.0, y: 3.0, width: 88.0, height: 56.0) 22 | layer.path = checkmarkPath.cgPath 23 | layer.fillMode = kCAFillModeForwards 24 | layer.lineCap = kCALineCapRound 25 | layer.lineJoin = kCALineJoinRound 26 | layer.fillColor = nil 27 | layer.strokeColor = UIColor(red: 0.15, green: 0.15, blue: 0.15, alpha: 1.0).cgColor 28 | layer.lineWidth = 6.0 29 | 30 | return layer 31 | }() 32 | 33 | public required override init() { 34 | super.init() 35 | layer.addSublayer(checkmarkShapeLayer) 36 | checkmarkShapeLayer.position = layer.position 37 | } 38 | 39 | public required init?(coder aDecoder: NSCoder) { 40 | super.init(coder: aDecoder) 41 | layer.addSublayer(checkmarkShapeLayer) 42 | checkmarkShapeLayer.position = layer.position 43 | } 44 | 45 | open func startAnimation() { 46 | let checkmarkStrokeAnimation = CAKeyframeAnimation(keyPath:"strokeEnd") 47 | checkmarkStrokeAnimation.values = [0, 1] 48 | checkmarkStrokeAnimation.keyTimes = [0, 1] 49 | checkmarkStrokeAnimation.duration = 0.35 50 | 51 | checkmarkShapeLayer.add(checkmarkStrokeAnimation, forKey:"checkmarkStrokeAnim") 52 | } 53 | 54 | open func stopAnimation() { 55 | checkmarkShapeLayer.removeAnimation(forKey: "checkmarkStrokeAnimation") 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDSystemActivityIndicatorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDSystemActivityIndicatorView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/12/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDSystemActivityIndicatorView provides the system UIActivityIndicatorView as an alternative. 12 | public final class PKHUDSystemActivityIndicatorView: PKHUDSquareBaseView, PKHUDAnimating { 13 | 14 | public override init() { 15 | super.init(frame: PKHUDSquareBaseView.defaultSquareBaseViewFrame) 16 | commonInit() 17 | } 18 | 19 | public override init(frame: CGRect) { 20 | super.init(frame: frame) 21 | commonInit() 22 | } 23 | 24 | public required init?(coder aDecoder: NSCoder) { 25 | super.init(coder: aDecoder) 26 | commonInit() 27 | } 28 | 29 | func commonInit () { 30 | backgroundColor = UIColor.clear 31 | alpha = 0.8 32 | 33 | self.addSubview(activityIndicatorView) 34 | } 35 | 36 | public override func layoutSubviews() { 37 | super.layoutSubviews() 38 | activityIndicatorView.center = self.center 39 | } 40 | 41 | let activityIndicatorView: UIActivityIndicatorView = { 42 | let activity = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) 43 | activity.color = UIColor.black 44 | return activity 45 | }() 46 | 47 | func startAnimation() { 48 | activityIndicatorView.startAnimating() 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDTextView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDTextView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/12/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDTextView provides a wide, three line text view, which you can use to display information. 12 | open class PKHUDTextView: PKHUDWideBaseView { 13 | 14 | public init(text: String?) { 15 | super.init() 16 | commonInit(text) 17 | } 18 | 19 | public required init?(coder aDecoder: NSCoder) { 20 | super.init(coder: aDecoder) 21 | commonInit("") 22 | } 23 | 24 | func commonInit(_ text: String?) { 25 | titleLabel.text = text 26 | addSubview(titleLabel) 27 | } 28 | 29 | open override func layoutSubviews() { 30 | super.layoutSubviews() 31 | 32 | let padding: CGFloat = 10.0 33 | titleLabel.frame = bounds.insetBy(dx: padding, dy: padding) 34 | } 35 | 36 | open let titleLabel: UILabel = { 37 | let label = UILabel() 38 | label.textAlignment = .center 39 | label.font = UIFont.boldSystemFont(ofSize: 17.0) 40 | label.textColor = UIColor.black.withAlphaComponent(0.85) 41 | label.adjustsFontSizeToFitWidth = true 42 | label.numberOfLines = 3 43 | return label 44 | }() 45 | } 46 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDTitleView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDTitleView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/12/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDTitleView provides a square view, which you can use to display a picture and a title (above the image). 12 | public final class PKHUDTitleView: PKHUDImageView { 13 | 14 | public init(title: String?, image: UIImage?) { 15 | super.init(image: image) 16 | commonInit(title: title) 17 | } 18 | 19 | public required init?(coder aDecoder: NSCoder) { 20 | super.init(coder: aDecoder) 21 | commonInit(title: ""); 22 | } 23 | 24 | func commonInit(title: String?) { 25 | titleLabel.text = title 26 | addSubview(titleLabel) 27 | } 28 | 29 | public override func layoutSubviews() { 30 | super.layoutSubviews() 31 | 32 | let viewWidth = bounds.size.width 33 | let viewHeight = bounds.size.height 34 | 35 | let quarterHeight = CGFloat(ceilf(CFloat(viewHeight / 4.0))) 36 | let threeQuarterHeight = CGFloat(ceilf(CFloat(viewHeight / 4.0 * 3.0))) 37 | 38 | let opticalOffset: CGFloat = 10.0 39 | 40 | titleLabel.frame = CGRect(origin: CGPoint(x:0.0, y:opticalOffset), size: CGSize(width: viewWidth, height: quarterHeight)) 41 | imageView.frame = CGRect(origin: CGPoint(x:0.0, y:quarterHeight - opticalOffset), size: CGSize(width: viewWidth, height: threeQuarterHeight)) 42 | } 43 | 44 | public let titleLabel: UILabel = { 45 | let label = UILabel() 46 | label.textAlignment = .center 47 | label.font = UIFont.boldSystemFont(ofSize: 17.0) 48 | label.textColor = UIColor.black.withAlphaComponent(0.85) 49 | return label 50 | }() 51 | } 52 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/PKHUDWideBaseView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUDWideBaseView.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/12/15. 6 | // Copyright (c) 2015 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// PKHUDWideBaseView provides a wide base view, which you can subclass and add additional views to. 12 | open class PKHUDWideBaseView: UIView { 13 | 14 | static let defaultWideBaseViewFrame = CGRect(origin: CGPoint.zero, size: CGSize(width: 265.0, height: 90.0)) 15 | 16 | public init() { 17 | super.init(frame: PKHUDWideBaseView.defaultWideBaseViewFrame) 18 | } 19 | 20 | public override init(frame: CGRect) { 21 | super.init(frame: frame) 22 | } 23 | 24 | public required init?(coder aDecoder: NSCoder) { 25 | super.init(coder: aDecoder) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/Window.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HUDWindow.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/16/14. 6 | // Copyright (c) 2014 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// The window used to display the PKHUD within. Placed atop the applications main window. 12 | internal class Window: UIWindow { 13 | 14 | internal let frameView: FrameView 15 | internal init(frameView: FrameView = FrameView()) { 16 | self.frameView = frameView 17 | super.init(frame: UIApplication.shared.delegate!.window!!.bounds) 18 | commonInit() 19 | } 20 | 21 | required init?(coder aDecoder: NSCoder) { 22 | frameView = FrameView() 23 | super.init(coder: aDecoder) 24 | commonInit() 25 | } 26 | 27 | fileprivate func commonInit() { 28 | rootViewController = WindowRootViewController() 29 | windowLevel = UIWindowLevelNormal + 1.0 30 | backgroundColor = UIColor.clear 31 | 32 | addSubview(backgroundView) 33 | addSubview(frameView) 34 | } 35 | 36 | internal override func layoutSubviews() { 37 | super.layoutSubviews() 38 | 39 | frameView.center = center 40 | backgroundView.frame = bounds 41 | } 42 | 43 | internal func showFrameView() { 44 | layer.removeAllAnimations() 45 | makeKeyAndVisible() 46 | frameView.center = center 47 | frameView.alpha = 1.0 48 | isHidden = false 49 | } 50 | 51 | fileprivate var willHide = false 52 | 53 | internal func hideFrameView(animated anim: Bool) { 54 | let completion: (_ finished: Bool) -> (Void) = { finished in 55 | if finished { 56 | self.isHidden = true 57 | self.resignKey() 58 | } 59 | 60 | self.willHide = false 61 | } 62 | 63 | if isHidden { 64 | return 65 | } 66 | 67 | willHide = true 68 | 69 | if anim { 70 | UIView.animate(withDuration: 0.8, animations: { self.frameView.alpha = 0.0 }, completion: completion) 71 | } else { 72 | completion(true) 73 | } 74 | } 75 | 76 | fileprivate let backgroundView: UIView = { 77 | let view = UIView() 78 | view.backgroundColor = UIColor(white:0.0, alpha:0.25) 79 | view.alpha = 0.0; 80 | return view; 81 | }() 82 | 83 | internal func showBackground(animated anim: Bool) { 84 | if anim { 85 | UIView.animate(withDuration: 0.175, animations: { 86 | self.backgroundView.alpha = 1.0 87 | }) 88 | } else { 89 | backgroundView.alpha = 1.0; 90 | } 91 | } 92 | 93 | internal func hideBackground(animated anim: Bool) { 94 | if anim { 95 | UIView.animate(withDuration: 0.65, animations: { 96 | self.backgroundView.alpha = 0.0 97 | }) 98 | } else { 99 | backgroundView.alpha = 0.0; 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /Pods/PKHUD/PKHUD/WindowRootViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PKHUD.WindowRootViewController.swift 3 | // PKHUD 4 | // 5 | // Created by Philip Kluz on 6/18/14. 6 | // Copyright (c) 2014 NSExceptional. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// Serves as a configuration relay controller, tapping into the main window's rootViewController settings. 12 | internal class WindowRootViewController: UIViewController { 13 | 14 | internal override var supportedInterfaceOrientations : UIInterfaceOrientationMask { 15 | if let rootViewController = UIApplication.shared.delegate?.window??.rootViewController { 16 | return rootViewController.supportedInterfaceOrientations 17 | } else { 18 | return UIInterfaceOrientationMask.portrait 19 | } 20 | } 21 | 22 | internal override var preferredStatusBarStyle : UIStatusBarStyle { 23 | if let rootViewController = UIApplication.shared.delegate?.window??.rootViewController { 24 | return rootViewController.preferredStatusBarStyle 25 | } else { 26 | return .default 27 | } 28 | } 29 | 30 | internal override var prefersStatusBarHidden : Bool { 31 | if let rootViewController = UIApplication.shared.delegate?.window??.rootViewController { 32 | return rootViewController.prefersStatusBarHidden 33 | } else { 34 | return false 35 | } 36 | } 37 | 38 | internal override var preferredStatusBarUpdateAnimation : UIStatusBarAnimation { 39 | if let rootViewController = UIApplication.shared.delegate?.window??.rootViewController { 40 | return rootViewController.preferredStatusBarUpdateAnimation 41 | } else { 42 | return .none 43 | } 44 | } 45 | 46 | internal override var shouldAutorotate : Bool { 47 | if let rootViewController = UIApplication.shared.delegate?.window??.rootViewController { 48 | return rootViewController.shouldAutorotate 49 | } else { 50 | return false 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Pods/PKHUD/README.md: -------------------------------------------------------------------------------- 1 | ![PKHUD - Swift and easy](https://raw.githubusercontent.com/pkluz/PKHUD/master/README_hero.png) 2 |
3 |
4 |
5 | A **Swift** based reimplementation of the Apple HUD (Volume, Ringer, Rotation,…) **for iOS 8**. 6 |
7 |
8 | ## Features 9 | - Official iOS 8 blur effect via **UIVisualEffectsView**. 10 | - Proper **rotation support**. 11 | - Size / **Device agnostic**. 12 | - Works on top of presented view controllers, alerts,... 13 | - Comes with several *free* resources - Checkmark, Cross, Progress Indicator,… 14 | - …as well as animated ones. 15 | - Builds as an **iOS 8 framework**. 16 | 17 | ![PKHUD.gif](https://cloud.githubusercontent.com/assets/1275218/10124182/09f4c406-654f-11e5-9cab-0f2e6f470887.gif) 18 | 19 | ## How To 20 | First you need to add the framework to your project. The recommended way is to use CocoaPods. 21 | ```ruby 22 | pod "PKHUD" 23 | ``` 24 | 25 | After adding the framework to your project, you need to import the module 26 | ```swift 27 | import PKHUD 28 | ``` 29 | 30 | Now, you can proceed to show an arbitrary HUD (and hide it soon after) like this: 31 | ```swift 32 | PKHUD.sharedHUD.contentView = PKHUDSuccessView() 33 | PKHUD.sharedHUD.show() 34 | PKHUD.sharedHUD.hide(afterDelay: 2.0); 35 | ``` 36 | 37 | You can also hot-swap content views - this can prove useful if you want to display a progress HUD first and transform it into a success or error HUD after an asynchronous operation has finished. 38 | ```swift 39 | PKHUD.sharedHUD.contentView = PKHUDProgressView() 40 | PKHUD.sharedHUD.show() 41 | 42 | let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(2.0 * Double(NSEC_PER_SEC))) 43 | dispatch_after(delayTime, dispatch_get_main_queue()) { 44 | PKHUD.sharedHUD.contentView = PKHUDSuccessView() 45 | PKHUD.sharedHUD.hide(afterDelay: 2.0) 46 | } 47 | ``` 48 | 49 | Please note that there are _multiple_ types of content views that ship with PKHUD. You can find them as separate files in the project folder as well as in the `ContentViews` group in Xcode. 50 | 51 | ## Customization 52 | 53 | There are two properties at your disposal to customize general behavior. 54 | 55 | - `PKHUD.sharedHUD.dimsBackground: Bool` defines whether the background is slightly dimmed when the HUD is shown. 56 | 57 | - `PKHUD.sharedHUD.userInteractionOnUnderlyingViewsEnabled: Bool` defines whether the underlying views respond to touches while the HUD is shown. 58 | 59 | Additionally you are free to create you own custom content views. They can descend from any `UIView` type or the predefined base classes `PKHUDSquareBaseView` and `PKHUDWideBaseView`. 60 | 61 | **Note**: It's neither possible to customize the general look and feel, nor do I plan to add that feature. You are free to provide any content views you wish but the blurring, corner radius and shading will remain the same. 62 | 63 | ## License 64 | 65 | The MIT License (MIT) 66 | 67 | Copyright (c) 2015 Philip Kluz (Philip.Kluz@gmail.com) 68 | 69 | Permission is hereby granted, free of charge, to any person obtaining a copy 70 | of this software and associated documentation files (the "Software"), to deal 71 | in the Software without restriction, including without limitation the rights 72 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 73 | copies of the Software, and to permit persons to whom the Software is 74 | furnished to do so, subject to the following conditions: 75 | 76 | The above copyright notice and this permission notice shall be included in all 77 | copies or substantial portions of the Software. 78 | 79 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 80 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 81 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 82 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 83 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 84 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 85 | SOFTWARE. 86 | -------------------------------------------------------------------------------- /Pods/Target Support Files/EmojiKit/EmojiKit-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_EmojiKit : NSObject 3 | @end 4 | @implementation PodsDummy_EmojiKit 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/EmojiKit/EmojiKit-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/EmojiKit/EmojiKit-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double EmojiKitVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char EmojiKitVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/EmojiKit/EmojiKit.modulemap: -------------------------------------------------------------------------------- 1 | framework module EmojiKit { 2 | umbrella header "EmojiKit-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/EmojiKit/EmojiKit.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/EmojiKit 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/Fabric" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/EmojiKit/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.0.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PKHUD/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.2.5 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PKHUD/PKHUD-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_PKHUD : NSObject 3 | @end 4 | @implementation PodsDummy_PKHUD 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PKHUD/PKHUD-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PKHUD/PKHUD-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "PKHUD.h" 4 | 5 | FOUNDATION_EXPORT double PKHUDVersionNumber; 6 | FOUNDATION_EXPORT const unsigned char PKHUDVersionString[]; 7 | 8 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PKHUD/PKHUD.modulemap: -------------------------------------------------------------------------------- 1 | framework module PKHUD { 2 | umbrella header "PKHUD-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PKHUD/PKHUD.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/PKHUD 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/Fabric" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Pods-Themoji-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## Crashlytics 5 | 6 | Fabric: Copyright 2015 Twitter, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. Crashlytics Kit: Copyright 2015 Crashlytics, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Crashlytics Terms of Service located at http://try.crashlytics.com/terms/terms-of-service.pdf and the Crashlytics Privacy Policy located at http://try.crashlytics.com/terms/privacy-policy.pdf. OSS: http://get.fabric.io/terms/opensource.txt 7 | 8 | ## EmojiKit 9 | 10 | The MIT License (MIT) 11 | 12 | Copyright (c) 2015 Dasmer Singh 13 | 14 | Permission is hereby granted, free of charge, to any person obtaining a copy 15 | of this software and associated documentation files (the "Software"), to deal 16 | in the Software without restriction, including without limitation the rights 17 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 18 | copies of the Software, and to permit persons to whom the Software is 19 | furnished to do so, subject to the following conditions: 20 | 21 | The above copyright notice and this permission notice shall be included in all 22 | copies or substantial portions of the Software. 23 | 24 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 25 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 27 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 28 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 29 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 | SOFTWARE. 31 | 32 | 33 | 34 | ## Fabric 35 | 36 | Fabric: Copyright 2015 Twitter, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. OSS: http://get.fabric.io/terms/opensource.txt 37 | 38 | ## PKHUD 39 | 40 | The MIT License (MIT) 41 | 42 | Copyright (c) 2014 Philip Kluz (Philip.Kluz@gmail.com) 43 | 44 | Permission is hereby granted, free of charge, to any person obtaining a copy 45 | of this software and associated documentation files (the "Software"), to deal 46 | in the Software without restriction, including without limitation the rights 47 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 48 | copies of the Software, and to permit persons to whom the Software is 49 | furnished to do so, subject to the following conditions: 50 | 51 | The above copyright notice and this permission notice shall be included in all 52 | copies or substantial portions of the Software. 53 | 54 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 55 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 56 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 57 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 58 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 59 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 60 | SOFTWARE. 61 | Generated by CocoaPods - https://cocoapods.org 62 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Pods-Themoji-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Fabric: Copyright 2015 Twitter, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. Crashlytics Kit: Copyright 2015 Crashlytics, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Crashlytics Terms of Service located at http://try.crashlytics.com/terms/terms-of-service.pdf and the Crashlytics Privacy Policy located at http://try.crashlytics.com/terms/privacy-policy.pdf. OSS: http://get.fabric.io/terms/opensource.txt 18 | Title 19 | Crashlytics 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | FooterText 25 | The MIT License (MIT) 26 | 27 | Copyright (c) 2015 Dasmer Singh 28 | 29 | Permission is hereby granted, free of charge, to any person obtaining a copy 30 | of this software and associated documentation files (the "Software"), to deal 31 | in the Software without restriction, including without limitation the rights 32 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 33 | copies of the Software, and to permit persons to whom the Software is 34 | furnished to do so, subject to the following conditions: 35 | 36 | The above copyright notice and this permission notice shall be included in all 37 | copies or substantial portions of the Software. 38 | 39 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 40 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 41 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 42 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 43 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 44 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 45 | SOFTWARE. 46 | 47 | 48 | Title 49 | EmojiKit 50 | Type 51 | PSGroupSpecifier 52 | 53 | 54 | FooterText 55 | Fabric: Copyright 2015 Twitter, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. OSS: http://get.fabric.io/terms/opensource.txt 56 | Title 57 | Fabric 58 | Type 59 | PSGroupSpecifier 60 | 61 | 62 | FooterText 63 | The MIT License (MIT) 64 | 65 | Copyright (c) 2014 Philip Kluz (Philip.Kluz@gmail.com) 66 | 67 | Permission is hereby granted, free of charge, to any person obtaining a copy 68 | of this software and associated documentation files (the "Software"), to deal 69 | in the Software without restriction, including without limitation the rights 70 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 71 | copies of the Software, and to permit persons to whom the Software is 72 | furnished to do so, subject to the following conditions: 73 | 74 | The above copyright notice and this permission notice shall be included in all 75 | copies or substantial portions of the Software. 76 | 77 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 78 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 79 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 80 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 81 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 82 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 83 | SOFTWARE. 84 | Title 85 | PKHUD 86 | Type 87 | PSGroupSpecifier 88 | 89 | 90 | FooterText 91 | Generated by CocoaPods - https://cocoapods.org 92 | Title 93 | 94 | Type 95 | PSGroupSpecifier 96 | 97 | 98 | StringsTable 99 | Acknowledgements 100 | Title 101 | Acknowledgements 102 | 103 | 104 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Pods-Themoji-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Themoji : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Themoji 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Pods-Themoji-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" 63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" 64 | fi 65 | } 66 | 67 | # Strip invalid architectures 68 | strip_invalid_archs() { 69 | binary="$1" 70 | # Get architectures for current file 71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 72 | stripped="" 73 | for arch in $archs; do 74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 75 | # Strip non-valid architectures in-place 76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 77 | stripped="$stripped $arch" 78 | fi 79 | done 80 | if [[ "$stripped" ]]; then 81 | echo "Stripped $binary of architectures:$stripped" 82 | fi 83 | } 84 | 85 | 86 | if [[ "$CONFIGURATION" == "Debug" ]]; then 87 | install_framework "$BUILT_PRODUCTS_DIR/EmojiKit/EmojiKit.framework" 88 | install_framework "$BUILT_PRODUCTS_DIR/PKHUD/PKHUD.framework" 89 | fi 90 | if [[ "$CONFIGURATION" == "Release" ]]; then 91 | install_framework "$BUILT_PRODUCTS_DIR/EmojiKit/EmojiKit.framework" 92 | install_framework "$BUILT_PRODUCTS_DIR/PKHUD/PKHUD.framework" 93 | fi 94 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Pods-Themoji-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | case "${TARGETED_DEVICE_FAMILY}" in 12 | 1,2) 13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 14 | ;; 15 | 1) 16 | TARGET_DEVICE_ARGS="--target-device iphone" 17 | ;; 18 | 2) 19 | TARGET_DEVICE_ARGS="--target-device ipad" 20 | ;; 21 | *) 22 | TARGET_DEVICE_ARGS="--target-device mac" 23 | ;; 24 | esac 25 | 26 | realpath() { 27 | DIRECTORY="$(cd "${1%/*}" && pwd)" 28 | FILENAME="${1##*/}" 29 | echo "$DIRECTORY/$FILENAME" 30 | } 31 | 32 | install_resource() 33 | { 34 | if [[ "$1" = /* ]] ; then 35 | RESOURCE_PATH="$1" 36 | else 37 | RESOURCE_PATH="${PODS_ROOT}/$1" 38 | fi 39 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 40 | cat << EOM 41 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 42 | EOM 43 | exit 1 44 | fi 45 | case $RESOURCE_PATH in 46 | *.storyboard) 47 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 48 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 49 | ;; 50 | *.xib) 51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.framework) 55 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 57 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 58 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 59 | ;; 60 | *.xcdatamodel) 61 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 62 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 63 | ;; 64 | *.xcdatamodeld) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 67 | ;; 68 | *.xcmappingmodel) 69 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 70 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 71 | ;; 72 | *.xcassets) 73 | ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") 74 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 75 | ;; 76 | *) 77 | echo "$RESOURCE_PATH" 78 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 79 | ;; 80 | esac 81 | } 82 | 83 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 86 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 87 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | fi 89 | rm -f "$RESOURCES_TO_COPY" 90 | 91 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 92 | then 93 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 94 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 95 | while read line; do 96 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 97 | XCASSET_FILES+=("$line") 98 | fi 99 | done <<<"$OTHER_XCASSETS" 100 | 101 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 102 | fi 103 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Pods-Themoji-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_ThemojiVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_ThemojiVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Pods-Themoji.debug.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/EmojiKit" "$PODS_CONFIGURATION_BUILD_DIR/PKHUD" "${PODS_ROOT}/Crashlytics/iOS" "${PODS_ROOT}/Fabric/iOS" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/Fabric" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/EmojiKit/EmojiKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PKHUD/PKHUD.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Crashlytics" -isystem "${PODS_ROOT}/Headers/Public/Fabric" 7 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Crashlytics" -framework "EmojiKit" -framework "Fabric" -framework "PKHUD" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" 8 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 9 | PODS_BUILD_DIR = $BUILD_DIR 10 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Pods-Themoji.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Themoji { 2 | umbrella header "Pods-Themoji-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Themoji/Pods-Themoji.release.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/EmojiKit" "$PODS_CONFIGURATION_BUILD_DIR/PKHUD" "${PODS_ROOT}/Crashlytics/iOS" "${PODS_ROOT}/Fabric/iOS" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/Fabric" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/EmojiKit/EmojiKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/PKHUD/PKHUD.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Crashlytics" -isystem "${PODS_ROOT}/Headers/Public/Fabric" 7 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Crashlytics" -framework "EmojiKit" -framework "Fabric" -framework "PKHUD" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" 8 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 9 | PODS_BUILD_DIR = $BUILD_DIR 10 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ios 2 | 3 | To compile the project you first have to run 4 | 5 | ``` 6 | bundle install 7 | rake 8 | ``` 9 | 10 | to fetch the latest Emojis from your local machine 11 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | 2 | task :fetch_emojis do 3 | sh "bundle exec fastlane run emoji_fetcher path:'./TheMoji'" 4 | end 5 | 6 | task :default => [:fetch_emojis] 7 | -------------------------------------------------------------------------------- /Themoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji.png -------------------------------------------------------------------------------- /Themoji.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Themoji.xcodeproj/xcshareddata/xcschemes/Themoji.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Themoji.xcodeproj/xcshareddata/xcschemes/ThemojiUITests.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 14 | 15 | 17 | 23 | 24 | 25 | 26 | 27 | 33 | 34 | 35 | 36 | 37 | 38 | 48 | 50 | 56 | 57 | 58 | 59 | 60 | 61 | 67 | 68 | 74 | 75 | 76 | 77 | 79 | 80 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /Themoji.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Themoji/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // EmojiCommunicationsInc 4 | // 5 | // Created by Felix Krause on 05/01/16. 6 | // Copyright © 2016 Felix Krause. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Fabric 11 | import Crashlytics 12 | 13 | 14 | @UIApplicationMain 15 | class AppDelegate: UIResponder, UIApplicationDelegate { 16 | 17 | var window: UIWindow? 18 | 19 | 20 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 21 | UIApplication.shared.applicationSupportsShakeToEdit = false 22 | 23 | Fabric.with([Crashlytics.self]) 24 | 25 | return true 26 | } 27 | 28 | func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool { 29 | let url = url.standardized 30 | let emoji = url.absoluteString.components(separatedBy: "/").last 31 | 32 | NotificationCenter.default.post(name: Notification.Name(rawValue: "ShowEmoji"), object: emoji) 33 | 34 | return true 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon24x24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon24x24@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon27.5x27.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon27.5x27.5@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon44x44@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon44x44@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon86x86@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon86x86@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon98x98@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/AppIcon98x98@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "3x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "3x" 27 | }, 28 | { 29 | "size" : "57x57", 30 | "idiom" : "iphone", 31 | "filename" : "Icon.png", 32 | "scale" : "1x" 33 | }, 34 | { 35 | "size" : "57x57", 36 | "idiom" : "iphone", 37 | "filename" : "Icon@2x.png", 38 | "scale" : "2x" 39 | }, 40 | { 41 | "size" : "60x60", 42 | "idiom" : "iphone", 43 | "filename" : "Icon-60@2x.png", 44 | "scale" : "2x" 45 | }, 46 | { 47 | "idiom" : "iphone", 48 | "size" : "60x60", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "29x29", 53 | "idiom" : "ipad", 54 | "filename" : "Icon-Small.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "idiom" : "ipad", 59 | "size" : "29x29", 60 | "scale" : "2x" 61 | }, 62 | { 63 | "size" : "40x40", 64 | "idiom" : "ipad", 65 | "filename" : "Icon-Small-40.png", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "size" : "40x40", 70 | "idiom" : "ipad", 71 | "filename" : "AppIcon40x40@2x.png", 72 | "scale" : "2x" 73 | }, 74 | { 75 | "size" : "50x50", 76 | "idiom" : "ipad", 77 | "filename" : "Icon-Small-50.png", 78 | "scale" : "1x" 79 | }, 80 | { 81 | "size" : "50x50", 82 | "idiom" : "ipad", 83 | "filename" : "Icon-Small-50@2x.png", 84 | "scale" : "2x" 85 | }, 86 | { 87 | "size" : "72x72", 88 | "idiom" : "ipad", 89 | "filename" : "Icon-72.png", 90 | "scale" : "1x" 91 | }, 92 | { 93 | "size" : "72x72", 94 | "idiom" : "ipad", 95 | "filename" : "Icon-72@2x.png", 96 | "scale" : "2x" 97 | }, 98 | { 99 | "size" : "76x76", 100 | "idiom" : "ipad", 101 | "filename" : "Icon-76.png", 102 | "scale" : "1x" 103 | }, 104 | { 105 | "size" : "76x76", 106 | "idiom" : "ipad", 107 | "filename" : "Icon-76@2x.png", 108 | "scale" : "2x" 109 | }, 110 | { 111 | "size" : "83.5x83.5", 112 | "idiom" : "ipad", 113 | "filename" : "IconIpad.png", 114 | "scale" : "2x" 115 | }, 116 | { 117 | "idiom" : "car", 118 | "size" : "60x60", 119 | "scale" : "2x" 120 | }, 121 | { 122 | "size" : "60x60", 123 | "idiom" : "car", 124 | "filename" : "Icon-60@3x.png", 125 | "scale" : "3x" 126 | }, 127 | { 128 | "size" : "24x24", 129 | "idiom" : "watch", 130 | "filename" : "AppIcon24x24@2x.png", 131 | "scale" : "2x", 132 | "role" : "notificationCenter", 133 | "subtype" : "38mm" 134 | }, 135 | { 136 | "size" : "27.5x27.5", 137 | "idiom" : "watch", 138 | "filename" : "AppIcon27.5x27.5@2x.png", 139 | "scale" : "2x", 140 | "role" : "notificationCenter", 141 | "subtype" : "42mm" 142 | }, 143 | { 144 | "size" : "29x29", 145 | "idiom" : "watch", 146 | "filename" : "Icon-Small@2x.png", 147 | "role" : "companionSettings", 148 | "scale" : "2x" 149 | }, 150 | { 151 | "size" : "29x29", 152 | "idiom" : "watch", 153 | "role" : "companionSettings", 154 | "scale" : "3x" 155 | }, 156 | { 157 | "size" : "40x40", 158 | "idiom" : "watch", 159 | "scale" : "2x", 160 | "role" : "appLauncher", 161 | "subtype" : "38mm" 162 | }, 163 | { 164 | "size" : "44x44", 165 | "idiom" : "watch", 166 | "filename" : "AppIcon44x44@2x.png", 167 | "scale" : "2x", 168 | "role" : "longLook", 169 | "subtype" : "42mm" 170 | }, 171 | { 172 | "size" : "86x86", 173 | "idiom" : "watch", 174 | "filename" : "AppIcon86x86@2x.png", 175 | "scale" : "2x", 176 | "role" : "quickLook", 177 | "subtype" : "38mm" 178 | }, 179 | { 180 | "size" : "98x98", 181 | "idiom" : "watch", 182 | "filename" : "AppIcon98x98@2x.png", 183 | "scale" : "2x", 184 | "role" : "quickLook", 185 | "subtype" : "42mm" 186 | } 187 | ], 188 | "info" : { 189 | "version" : 1, 190 | "author" : "xcode" 191 | } 192 | } -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-72.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-72@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small-50.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/Icon@2x.png -------------------------------------------------------------------------------- /Themoji/Assets.xcassets/AppIcon.appiconset/IconIpad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/Themoji/Assets.xcassets/AppIcon.appiconset/IconIpad.png -------------------------------------------------------------------------------- /Themoji/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Themoji/Category.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Categories.swift 3 | // Themoji 4 | // 5 | // Created by Felix Krause on 14/01/16. 6 | // Copyright © 2016 Felix Krause. All rights reserved. 7 | // 8 | 9 | // One category 10 | class Category { 11 | var key: String = "" 12 | var value: String = "" 13 | 14 | init(key: String, value: String) { 15 | self.key = key 16 | self.value = value 17 | } 18 | 19 | class func getAll() -> Array { 20 | return [ 21 | Category(key: "🍔🍕🍺🍟🌮🍫", value: "🍔🍕🌭🍟🌮🍫🍽🍺"), 22 | Category(key: "🚑🚂🎡🏥🏝✈️", value: "🚑🚂🎡🏥🏝✈️"), 23 | Category(key: "✂️✏️📩💵📷🔌", value: "✂️✏️📩💵📷🔌"), 24 | Category(key: "😂😚😎😱😴😈", value: "😂😚😎😱😴😈") 25 | ] 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Themoji/CategoryButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CategoryButton.swift 3 | // Themoji 4 | // 5 | // Created by Felix Krause on 14/01/16. 6 | // Copyright © 2016 Felix Krause. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CategoryButton: UICollectionViewCell { 12 | @IBOutlet weak var titleLabel: UILabel! 13 | 14 | override func awakeFromNib() { 15 | self.layer.cornerRadius = 9.0 16 | self.layer.borderColor = UIColor.lightGray.cgColor 17 | self.layer.borderWidth = 1.0 18 | self.titleLabel.font = FontRendering.highResolutionEmojiUIFontSize(self.titleLabel.font.pointSize) 19 | } 20 | 21 | func setText(_ str: String) { 22 | let attributedString = NSMutableAttributedString(string: str) 23 | attributedString.addAttribute(NSKernAttributeName, value: CGFloat(10.0), range: NSRange(location: 0, length: attributedString.length)) 24 | 25 | self.titleLabel.attributedText = attributedString 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Themoji/CategoryButton.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Themoji/FontRendering.h: -------------------------------------------------------------------------------- 1 | // 2 | // FontTest.h 3 | // Themoji 4 | // 5 | // Created by Felix Krause on 07/02/16. 6 | // Copyright © 2016 Felix Krause. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface FontRendering : NSObject 13 | 14 | + (CTFontRef)highResolutionEmojiFontSize:(CGFloat)size; 15 | + (UIFont *)highResolutionEmojiUIFontSize:(CGFloat)size; 16 | + (UIImage *)render:(NSString *)emojiString size:(CGFloat)size; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Themoji/FontRendering.m: -------------------------------------------------------------------------------- 1 | // 2 | // FontTest.m 3 | // Themoji 4 | // 5 | // Created by Felix Krause on 07/02/16. 6 | // Copyright © 2016 Felix Krause. All rights reserved. 7 | // 8 | 9 | #import "FontRendering.h" 10 | 11 | @implementation FontRendering 12 | 13 | + (CFDataRef)rawFile { 14 | static NSData *cachedData = nil; 15 | if (cachedData) { 16 | return (__bridge CFDataRef)cachedData; 17 | } 18 | NSURL *url = [[NSBundle mainBundle] URLForResource:@"Apple Color Emoji" withExtension:@"ttf"]; 19 | cachedData = [NSData dataWithContentsOfURL:url]; 20 | return (__bridge CFDataRef)cachedData; 21 | } 22 | 23 | + (CTFontRef)highResolutionEmojiFontSize:(CGFloat)size 24 | { 25 | CGFontRef cgfont = CGFontCreateWithDataProvider(CGDataProviderCreateWithCFData([self rawFile])); 26 | return CTFontCreateWithGraphicsFont(cgfont, size, nil, nil);// 256 27 | } 28 | 29 | + (UIFont *)highResolutionEmojiUIFontSize:(CGFloat)size 30 | { 31 | return (UIFont *)[self highResolutionEmojiFontSize:size]; 32 | } 33 | 34 | + (UIImage *)render:(NSString *)emojiString size:(CGFloat)size 35 | { 36 | // size should be maximum of 256.0f 37 | 38 | CTFontRef ctFont = [self highResolutionEmojiFontSize:size]; 39 | 40 | UniChar *characters = malloc(sizeof(UniChar) * [emojiString length]); 41 | [emojiString getCharacters:characters range:NSMakeRange(0, [emojiString length])]; 42 | 43 | CGGlyph *glyphs = malloc(sizeof(CGGlyph) * [emojiString length]); 44 | CTFontGetGlyphsForCharacters(ctFont, characters, glyphs, [emojiString length]); 45 | 46 | CGRect bounds = CTFontGetBoundingRectsForGlyphs(ctFont, kCTFontOrientationHorizontal, glyphs, NULL, 1); 47 | CGPoint point = CGPointApplyAffineTransform(bounds.origin, CGAffineTransformMakeScale(-1, -1)); 48 | 49 | UIGraphicsBeginImageContextWithOptions(CGSizeMake(size, size), NO, 0.0f); 50 | CGContextRef context = UIGraphicsGetCurrentContext(); 51 | 52 | CGRect bitmapBounds = (CGRect){ CGPointZero, CGSizeMake(size, size) }; 53 | CGContextConcatCTM(context, CGAffineTransformMake(1, 0, 0, -1, 0, CGRectGetHeight(bitmapBounds))); 54 | CTFontDrawGlyphs(ctFont, glyphs, &point, 1, context); 55 | 56 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 57 | 58 | UIGraphicsEndImageContext(); 59 | 60 | return image; 61 | } 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /Themoji/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleURLTypes 22 | 23 | 24 | CFBundleTypeRole 25 | Viewer 26 | CFBundleURLName 27 | me.themoji.app.release 28 | CFBundleURLSchemes 29 | 30 | me.themoji.app.release 31 | 32 | 33 | 34 | CFBundleVersion 35 | 17 36 | Fabric 37 | 38 | APIKey 39 | 016f6bbbcafe8bbce36c7278ed0eb6bb2edef5e1 40 | Kits 41 | 42 | 43 | KitInfo 44 | 45 | KitName 46 | Crashlytics 47 | 48 | 49 | 50 | LSRequiresIPhoneOS 51 | 52 | UILaunchStoryboardName 53 | LaunchScreen 54 | UIMainStoryboardFile 55 | Main 56 | UIRequiredDeviceCapabilities 57 | 58 | armv7 59 | 60 | UIRequiresFullScreen 61 | 62 | UISupportedInterfaceOrientations 63 | 64 | UIInterfaceOrientationPortrait 65 | 66 | UISupportedInterfaceOrientations~ipad 67 | 68 | UIInterfaceOrientationPortrait 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /Themoji/Themoji-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "FontRendering.h" 6 | -------------------------------------------------------------------------------- /Themoji/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // EmojiCommunicationsInc 4 | // 5 | // Created by Felix Krause on 05/01/16. 6 | // Copyright © 2016 Felix Krause. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import EmojiKit 11 | import PKHUD 12 | 13 | class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UICollectionViewDataSource, UICollectionViewDelegate, UITextFieldDelegate { 14 | 15 | @IBOutlet weak var categoriesCollectionView: UICollectionView! 16 | @IBOutlet weak var emojiLabel: UILabel! 17 | @IBOutlet weak var textInput: UITextField! 18 | @IBOutlet weak var autocompletionTableView: UITableView! 19 | @IBOutlet weak var bottomConstraint: NSLayoutConstraint! 20 | @IBOutlet weak var searchButton: UIButton! 21 | @IBOutlet weak var historyButton: UIButton! 22 | 23 | @IBOutlet weak var emojiHeightConstraint: NSLayoutConstraint! 24 | @IBOutlet weak var autocompletionItemsHeight: NSLayoutConstraint! 25 | var autocompletionItemsEmoji: Array = [] 26 | var autocompletionItemsName: Array = [] 27 | var isCategoryOpen = false 28 | var isFullScreen = false 29 | 30 | let defaultAutoCompletionHeight: CGFloat = 94 31 | let increasedAutoCompletionHeight: CGFloat = 250 32 | var emojiLabelHeight: CGFloat = 0.0 // this is NOT the font size 33 | 34 | let emojiHistoryKey = "emojiHistory" 35 | 36 | var emojiFetcher: EmojiFetcher = EmojiFetcher() 37 | 38 | override func viewDidLoad() { 39 | super.viewDidLoad() 40 | 41 | NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 42 | NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 43 | 44 | let nibName = UINib(nibName: "CategoryButton", bundle:nil) 45 | self.categoriesCollectionView.register(nibName, forCellWithReuseIdentifier: "Yo") 46 | 47 | self.emojiLabel.font = FontRendering.highResolutionEmojiUIFontSize(384) 48 | if let lastEmoji = history().first { 49 | self.setEmoji(lastEmoji) 50 | } 51 | 52 | NotificationCenter.default.addObserver(self, selector: #selector(ViewController.didTriggerEmoji(_:)), name: NSNotification.Name(rawValue: "ShowEmoji"), object: nil) 53 | } 54 | 55 | func didTriggerEmoji(_ noti: Notification) { 56 | let searchString = (noti.object as! String).lowercased() 57 | 58 | emojiFetcher.cancelFetches() 59 | emojiFetcher.query(searchString) { emojiResults in 60 | let emoji = emojiResults.last 61 | self.setEmoji((emoji?.character)!) 62 | } 63 | } 64 | 65 | func setEmoji(_ emoji: String) { 66 | self.emojiLabel.text = emoji 67 | } 68 | 69 | override func viewWillAppear(_ animated: Bool) { 70 | super.viewWillAppear(animated) 71 | 72 | emojiLabelHeight = self.view.bounds.height / 2.0 73 | self.emojiHeightConstraint.constant = emojiLabelHeight 74 | } 75 | 76 | func keyboardWillShow(_ notification: Notification) { 77 | if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 78 | let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0) 79 | self.bottomConstraint.constant = contentInsets.bottom + 5.0 80 | self.categoriesCollectionView.isHidden = true 81 | UIView.animate(withDuration: 0.25, animations: { 82 | self.view.layoutIfNeeded() 83 | }) 84 | } 85 | } 86 | 87 | func keyboardWillHide(_ notification: Notification) { 88 | self.bottomConstraint.constant = 5.0 89 | UIView.animate(withDuration: 0.25, animations: { 90 | self.view.layoutIfNeeded() 91 | }) 92 | } 93 | 94 | @IBAction func didDoubleTapEmoji(_ sender: AnyObject) { 95 | if (isFullScreen) { 96 | didTapEmoji(self) // reset 97 | return 98 | } 99 | // full screen mode 100 | self.autocompletionTableView.isHidden = true 101 | self.autocompletionItemsHeight.constant = defaultAutoCompletionHeight 102 | resetTextField(true) 103 | self.historyButton.isHidden = true 104 | self.searchButton.isHidden = true // has to be after resetTextField 105 | 106 | self.emojiHeightConstraint.constant = self.view.bounds.height 107 | UIView.animate(withDuration: 0.25, animations: { () -> Void in 108 | self.categoriesCollectionView.alpha = 0.0 109 | self.textInput.alpha = 0.0 110 | self.view.layoutIfNeeded() 111 | }, completion: { (something) -> Void in 112 | self.categoriesCollectionView.isHidden = true 113 | self.textInput.isHidden = true 114 | }) 115 | 116 | isFullScreen = true 117 | } 118 | 119 | 120 | func history() -> [String] { 121 | if let recent = UserDefaults.standard.array(forKey: emojiHistoryKey) as? [String] { 122 | return recent 123 | } 124 | else { 125 | return [] 126 | } 127 | } 128 | 129 | @IBAction func didTapHistory(_ sender: AnyObject) { 130 | prefillAutoCompletion(history().joined(separator: "")) 131 | } 132 | 133 | @IBAction func didTapSearch(_ sender: AnyObject) { 134 | self.textInput.isHidden = false 135 | self.searchButton.isHidden = true 136 | self.historyButton.isHidden = true 137 | self.textInput.becomeFirstResponder() 138 | } 139 | 140 | @IBAction func didLongPressEmoji(_ sender: AnyObject) { 141 | // Copy to clipboard 142 | UIPasteboard.general.string = self.emojiLabel.text! 143 | 144 | if !PKHUD.sharedHUD.isVisible { 145 | PKHUD.sharedHUD.contentView = PKHUDTextView(text: "Copied to clipboard") 146 | PKHUD.sharedHUD.show() 147 | PKHUD.sharedHUD.hide(afterDelay: 1.0) 148 | } 149 | } 150 | 151 | @IBAction func didTapEmoji(_ sender: AnyObject) { 152 | if isFullScreen { 153 | self.emojiHeightConstraint.constant = emojiLabelHeight 154 | self.categoriesCollectionView.isHidden = false 155 | self.searchButton.isHidden = false 156 | self.historyButton.isHidden = false 157 | 158 | UIView.animate(withDuration: 0.25, animations: { () -> Void in 159 | self.categoriesCollectionView.alpha = 1.0 160 | self.textInput.alpha = 1.0 161 | self.view.layoutIfNeeded() 162 | }) 163 | isFullScreen = false 164 | } 165 | else { 166 | // dismiss keyboard and so on 167 | self.resetTextField(true) 168 | self.autocompletionTableView.isHidden = true 169 | resetState() 170 | } 171 | } 172 | 173 | @IBAction func valueDidChange(_ sender: AnyObject) { 174 | if (self.textInput.text! != "") { 175 | let input = self.textInput.text!.characters.last! 176 | if emojiToText(input) != nil 177 | { 178 | setCurrentEmoji("\(input)") 179 | resetTextField(false) 180 | } 181 | else 182 | { 183 | let searchString = self.textInput.text!.lowercased() // all chars since the last match 184 | 185 | emojiFetcher.cancelFetches() 186 | emojiFetcher.query(searchString) { emojiResults in 187 | self.autocompletionItemsName = [] 188 | self.autocompletionItemsEmoji = [] 189 | for (emoji) in emojiResults { 190 | self.autocompletionItemsEmoji.append(emoji.character) 191 | self.autocompletionItemsName.append(emoji.name) 192 | } 193 | self.autocompletionTableView.reloadData() 194 | self.autocompletionTableView.isHidden = (emojiResults.count == 0) 195 | self.autocompletionTableView.flashScrollIndicators() 196 | } 197 | } 198 | } 199 | } 200 | 201 | // Modifying the UI 202 | 203 | func resetTextField(_ dismissKeyboard: Bool) { 204 | self.textInput.text = "" 205 | if dismissKeyboard { 206 | dismissSearch() 207 | } 208 | } 209 | 210 | func prefillAutoCompletion(_ emojis: String) { 211 | self.autocompletionItemsEmoji = [] 212 | self.autocompletionItemsName = [] 213 | 214 | for (emoji) in emojis.characters { 215 | self.autocompletionItemsEmoji.append("\(emoji)") 216 | let str = emojiToText(emoji) 217 | self.autocompletionItemsName.append(str!) 218 | } 219 | self.autocompletionTableView.reloadData() 220 | self.autocompletionItemsHeight.constant = increasedAutoCompletionHeight 221 | self.isCategoryOpen = true 222 | self.searchButton.isHidden = true 223 | self.historyButton.isHidden = true 224 | UIView.animate(withDuration: 0.25, animations: { 225 | self.autocompletionTableView.isHidden = false 226 | self.categoriesCollectionView.isHidden = true 227 | }) 228 | } 229 | 230 | func dismissSearch() { 231 | self.textInput.resignFirstResponder() 232 | self.searchButton.isHidden = false 233 | self.historyButton.isHidden = false 234 | self.textInput.isHidden = true 235 | } 236 | 237 | func setCurrentEmoji(_ e: String) { 238 | self.textInput.isHidden = true 239 | self.emojiLabel.text = e 240 | 241 | if var recent = UserDefaults.standard.object(forKey: emojiHistoryKey) { 242 | recent = (recent as AnyObject).mutableCopy() 243 | (recent as AnyObject).remove(e) 244 | (recent as AnyObject).insert(e, at: 0) 245 | UserDefaults.standard.set(recent, forKey: emojiHistoryKey) 246 | } 247 | else { 248 | UserDefaults.standard.set([e], forKey: emojiHistoryKey) 249 | } 250 | } 251 | 252 | func resetState() { 253 | self.autocompletionTableView.isHidden = true 254 | self.autocompletionItemsHeight.constant = defaultAutoCompletionHeight 255 | self.isCategoryOpen = false 256 | self.categoriesCollectionView.isHidden = false 257 | self.searchButton.isHidden = false 258 | self.historyButton.isHidden = false 259 | } 260 | 261 | func emojiToText(_ c: Character) -> String? { 262 | // From http://nshipster.com/cfstringtransform/ 263 | 264 | let cfstr = NSMutableString(string: String(c)) as CFMutableString 265 | var range = CFRangeMake(0, CFStringGetLength(cfstr)) 266 | CFStringTransform(cfstr, &range, kCFStringTransformToUnicodeName, Bool(0)) 267 | let str = cfstr as String 268 | if (str.contains("{") && str.contains("}")) { 269 | return str.replacingOccurrences(of: "\\N{", with: "").replacingOccurrences(of: "}", with: "").capitalized 270 | } 271 | else { 272 | return nil // stupid text, no need for dat 273 | } 274 | } 275 | 276 | // UITableView 277 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 278 | return self.autocompletionItemsEmoji.count 279 | } 280 | 281 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 282 | let cell = UITableViewCell(style: .value1, reuseIdentifier: "Yoo") 283 | // let str = "\(self.autocompletionItemsEmoji[indexPath.row]) \(self.autocompletionItemsName[indexPath.row].capitalizedString)" 284 | cell.textLabel?.text = self.autocompletionItemsEmoji[indexPath.row] 285 | cell.textLabel?.font = FontRendering.highResolutionEmojiUIFontSize((cell.textLabel?.font.pointSize)!); 286 | cell.detailTextLabel?.text = self.autocompletionItemsName[indexPath.row].capitalized 287 | 288 | return cell 289 | } 290 | 291 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 292 | setCurrentEmoji(self.autocompletionItemsEmoji[indexPath.row]) 293 | tableView.deselectRow(at: indexPath, animated: true) 294 | 295 | if self.isCategoryOpen { 296 | // We have to close this 297 | resetState() 298 | } 299 | } 300 | 301 | func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 302 | let line = UIView() 303 | line.backgroundColor = UIColor.lightGray 304 | return line 305 | } 306 | 307 | func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 308 | return 0.5 309 | } 310 | 311 | // UICollectionView 312 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 313 | return Category.getAll().count 314 | } 315 | 316 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 317 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Yo", for: indexPath) as! CategoryButton 318 | cell.setText(Category.getAll()[indexPath.row].key) 319 | return cell 320 | } 321 | 322 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 323 | collectionView.deselectItem(at: indexPath, animated: true) 324 | 325 | let results = Category.getAll()[indexPath.row].value 326 | prefillAutoCompletion(results) 327 | } 328 | 329 | 330 | // UITextField Delegate 331 | func textFieldShouldReturn(_ textField: UITextField) -> Bool { 332 | self.dismissSearch() 333 | resetState() 334 | resetTextField(true) 335 | return true 336 | } 337 | } 338 | 339 | -------------------------------------------------------------------------------- /ThemojiUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 17 23 | 24 | 25 | -------------------------------------------------------------------------------- /ThemojiUITests/SnapshotHelper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SnapshotHelper.swift 3 | // Example 4 | // 5 | // Created by Felix Krause on 10/8/15. 6 | // Copyright © 2015 Felix Krause. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import XCTest 11 | 12 | var deviceLanguage = "" 13 | var locale = "" 14 | 15 | @available(*, deprecated, message: "use setupSnapshot: instead") 16 | func setLanguage(_ app: XCUIApplication) { 17 | setupSnapshot(app) 18 | } 19 | 20 | func setupSnapshot(_ app: XCUIApplication) { 21 | Snapshot.setupSnapshot(app) 22 | } 23 | 24 | func snapshot(_ name: String, waitForLoadingIndicator: Bool = true) { 25 | Snapshot.snapshot(name, waitForLoadingIndicator: waitForLoadingIndicator) 26 | } 27 | 28 | class Snapshot: NSObject { 29 | 30 | class func setupSnapshot(_ app: XCUIApplication) { 31 | setLanguage(app) 32 | setLocale(app) 33 | setLaunchArguments(app) 34 | } 35 | 36 | class func setLanguage(_ app: XCUIApplication) { 37 | guard let prefix = pathPrefix() else { 38 | return 39 | } 40 | 41 | let path = prefix.appendingPathComponent("language.txt") 42 | 43 | do { 44 | let trimCharacterSet = CharacterSet.whitespacesAndNewlines 45 | deviceLanguage = try NSString(contentsOfFile: path, encoding: String.Encoding.utf8.rawValue).trimmingCharacters(in: trimCharacterSet) as String 46 | app.launchArguments += ["-AppleLanguages", "(\(deviceLanguage))"] 47 | } catch { 48 | print("Couldn't detect/set language...") 49 | } 50 | } 51 | 52 | class func setLocale(_ app: XCUIApplication) { 53 | guard let prefix = pathPrefix() else { 54 | return 55 | } 56 | 57 | let path = prefix.appendingPathComponent("locale.txt") 58 | 59 | do { 60 | let trimCharacterSet = CharacterSet.whitespacesAndNewlines 61 | locale = try NSString(contentsOfFile: path, encoding: String.Encoding.utf8.rawValue).trimmingCharacters(in: trimCharacterSet) as String 62 | } catch { 63 | print("Couldn't detect/set locale...") 64 | } 65 | if locale.isEmpty { 66 | locale = Locale(identifier: deviceLanguage).identifier 67 | } 68 | app.launchArguments += ["-AppleLocale", "\"\(locale)\""] 69 | } 70 | 71 | class func setLaunchArguments(_ app: XCUIApplication) { 72 | guard let prefix = pathPrefix() else { 73 | return 74 | } 75 | 76 | let path = prefix.appendingPathComponent("snapshot-launch_arguments.txt") 77 | app.launchArguments += ["-FASTLANE_SNAPSHOT", "YES", "-ui_testing"] 78 | 79 | do { 80 | let launchArguments = try NSString(contentsOfFile: path, encoding: String.Encoding.utf8.rawValue) as String 81 | let regex = try NSRegularExpression(pattern: "(\\\".+?\\\"|\\S+)", options: []) 82 | let matches = regex.matches(in: launchArguments, options: [], range: NSRange(location:0, length:launchArguments.characters.count)) 83 | let results = matches.map { result -> String in 84 | (launchArguments as NSString).substring(with: result.range) 85 | } 86 | app.launchArguments += results 87 | } catch { 88 | print("Couldn't detect/set launch_arguments...") 89 | } 90 | } 91 | 92 | class func snapshot(_ name: String, waitForLoadingIndicator: Bool = true) { 93 | if waitForLoadingIndicator { 94 | waitForLoadingIndicatorToDisappear() 95 | } 96 | 97 | print("snapshot: \(name)") // more information about this, check out https://github.com/fastlane/snapshot 98 | 99 | sleep(1) // Waiting for the animation to be finished (kind of) 100 | XCUIDevice.shared().orientation = .unknown 101 | } 102 | 103 | class func waitForLoadingIndicatorToDisappear() { 104 | let query = XCUIApplication().statusBars.children(matching: .other).element(boundBy: 1).children(matching: .other) 105 | 106 | while (0.. NSString? { 113 | if let path = ProcessInfo().environment["SIMULATOR_HOST_HOME"] as NSString? { 114 | return path.appendingPathComponent("Library/Caches/tools.fastlane") as NSString 115 | } 116 | print("Couldn't find Snapshot configuration files at ~/Library/Caches/tools.fastlane") 117 | return nil 118 | } 119 | } 120 | 121 | extension XCUIElement { 122 | var isLoadingIndicator: Bool { 123 | return self.frame.size == CGSize(width: 10, height: 20) 124 | } 125 | } 126 | 127 | // Please don't remove the lines below 128 | // They are used to detect outdated configuration files 129 | // SnapshotHelperVersion [1.2] 130 | -------------------------------------------------------------------------------- /ThemojiUITests/ThemojiUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ThemojiUITests.swift 3 | // ThemojiUITests 4 | // 5 | // Created by Felix Krause on 17/01/16. 6 | // Copyright © 2016 Felix Krause. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class ThemojiUITests: XCTestCase { 12 | 13 | override func setUp() { 14 | super.setUp() 15 | 16 | continueAfterFailure = false 17 | 18 | let app = XCUIApplication() 19 | setupSnapshot(app) 20 | app.launch() 21 | } 22 | 23 | func testWhenInTheUKItHasToRain() { 24 | XCTAssert(1 == 1) 25 | } 26 | 27 | func testExample() { 28 | let app = XCUIApplication() 29 | snapshot("01Landing") 30 | 31 | app.collectionViews.staticTexts.element(boundBy: 0).tap() 32 | snapshot("02Category") 33 | app.tables.staticTexts.element(boundBy: 0).tap() 34 | 35 | 36 | app.buttons["Search"].tap() 37 | app.textFields["Search Emoji"].typeText("air") 38 | snapshot("03Search") 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | machine: 2 | xcode: 3 | version: "7.3" 4 | dependencies: 5 | override: 6 | - bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3 --without development 7 | - rake 8 | cache_directories: 9 | - vendor/bundle 10 | test: 11 | override: 12 | - bundle exec danger 13 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | Gemfile.lock 3 | 4 | ## Documentation cache and generated files: 5 | /.yardoc/ 6 | /_yardoc/ 7 | /doc/ 8 | /rdoc/ 9 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | --color 3 | --format d 4 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gemspec 4 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Felix Krause 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/README.md: -------------------------------------------------------------------------------- 1 | # fastlane-plugin-emoji_fetcher `fastlane` Plugin 2 | 3 | [![Gem](assets/plugin-badge.svg)](https://rubygems.org/gems/emoji_fetcher) 4 | 5 | ## Getting Started 6 | 7 | This project is a [fastlane](https://github.com/fastlane/fastlane) plugin. To get started with fastlane-plugin-emoji_fetcher, add it to your project by running: 8 | 9 | ```bash 10 | fastlane add_plugin emoji_fetcher 11 | ``` 12 | 13 | ## About emoji_fetcher 14 | 15 | Fetch the emoji font file and copy it to a local directory 16 | 17 | ## Issues and Feedback 18 | 19 | For any other issues and feedback about this plugin, please submit it to this repository. 20 | 21 | ## Troubleshooting 22 | 23 | For some , check out the [Plugins Troubleshooting](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/PluginsTroubleshooting.md) doc in the main `fastlane` repo. 24 | 25 | ## Using `fastlane` Plugins 26 | 27 | For more information about how the `fastlane` plugin system works, check out the [Plugins documentation](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Plugins.md) in the main `fastlane` repo. 28 | 29 | ## About `fastlane` 30 | 31 | `fastlane` automates building, testing, and releasing your app for beta and app store distributions. To learn more about `fastlane`, check out [fastlane.tools](https://fastlane.tools). 32 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler/gem_tasks' 2 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/fastlane-plugin-emoji_fetcher.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path("../lib", __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require 'fastlane/plugin/emoji_fetcher/version' 5 | 6 | Gem::Specification.new do |spec| 7 | spec.name = 'fastlane-plugin-emoji_fetcher' 8 | spec.version = Fastlane::EmojiFetcher::VERSION 9 | spec.author = %q{Felix Krause} 10 | spec.email = %q{emoji@krausefx.com} 11 | 12 | spec.summary = %q{Fetch the emoji font file and copy it to a local directory} 13 | spec.homepage = "https://github.com/Themoji/ios/tree/master/fastlane-plugin-emoji_fetcher" 14 | spec.license = "MIT" 15 | 16 | spec.files = Dir["lib/**/*"] + %w(README.md LICENSE) 17 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 18 | spec.require_paths = ['lib'] 19 | 20 | # spec.add_dependency 'your-dependency', '~> 1.0.0' 21 | 22 | spec.add_development_dependency 'pry' 23 | spec.add_development_dependency 'bundler' 24 | spec.add_development_dependency 'rspec' 25 | spec.add_development_dependency 'fastlane', '>= 1.91.0' 26 | end 27 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/lib/fastlane/plugin/emoji_fetcher.rb: -------------------------------------------------------------------------------- 1 | require 'fastlane/plugin/emoji_fetcher/version' 2 | 3 | module Fastlane 4 | module EmojiFetcher 5 | # Return all .rb files inside the "actions" and "helper" directory 6 | def self.all_classes 7 | Dir[File.expand_path('**/{actions,helper}/*.rb', File.dirname(__FILE__))] 8 | end 9 | end 10 | end 11 | 12 | # By default we want to import all available actions and helpers 13 | # A plugin can contain any number of actions and plugins 14 | Fastlane::EmojiFetcher.all_classes.each do |current| 15 | require current 16 | end 17 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/lib/fastlane/plugin/emoji_fetcher/actions/emoji_fetcher_action.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module Actions 3 | class EmojiFetcherAction < Action 4 | def self.run(params) 5 | require 'fileutils' 6 | 7 | paths = ["/System/Library/Fonts/Apple Color Emoji.ttc", "/System/Library/Fonts/Apple Color Emoji.ttf"] 8 | paths = paths.delete_if { |a| !File.exist?(a) } 9 | UI.user_error!("Could not find Emoji font.") if paths.count == 0 10 | FileUtils.cp(paths.first, params[:path]) 11 | UI.success("Successfully fetched Emoji font") 12 | end 13 | 14 | def self.description 15 | "Fetch the emoji font file and copy it into a local directory" 16 | end 17 | 18 | def self.authors 19 | ["Felix Krause"] 20 | end 21 | 22 | def self.available_options 23 | [ 24 | FastlaneCore::ConfigItem.new(key: :path, 25 | env_name: "EMOJI_FETCHER_PATH", 26 | description: "Path to which the emoji file should be copied to", 27 | optional: false, 28 | type: String) 29 | ] 30 | end 31 | 32 | def self.is_supported?(platform) 33 | true 34 | end 35 | end 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /fastlane-plugin-emoji_fetcher/lib/fastlane/plugin/emoji_fetcher/version.rb: -------------------------------------------------------------------------------- 1 | module Fastlane 2 | module EmojiFetcher 3 | VERSION = "0.2.0" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /fastlane/Appfile: -------------------------------------------------------------------------------- 1 | apple_id "apple@krausefx.com" 2 | app_identifier "me.themoji.app.beta" 3 | 4 | team_id "N8X438SEU2" 5 | 6 | for_lane :appstore do 7 | app_identifier "me.themoji.app.release" 8 | end 9 | -------------------------------------------------------------------------------- /fastlane/Deliverfile: -------------------------------------------------------------------------------- 1 | app_icon "fastlane/metadata/Themoji.png" 2 | price_tier 0 3 | automatic_release true 4 | -------------------------------------------------------------------------------- /fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | fastlane_version "1.50.0" 2 | 3 | default_platform :ios 4 | 5 | platform :ios do 6 | desc "Set up a new Mac" 7 | desc "To run this in readonly mode without user credentials use" 8 | desc "fastlane bootstrap readonly:true" 9 | lane :bootstrap do |options| 10 | unless options[:readonly] 11 | register_devices(devices: { 12 | "Felix Krause's iPhone 6s" => "116307ad03065412b3084f4dc8498922e0214e73" 13 | }) 14 | end 15 | 16 | match(type: "development", 17 | readonly: options[:readonly], 18 | force_for_new_devices: !options[:readonly]) 19 | match(type: "adhoc", 20 | readonly: options[:readonly], 21 | force_for_new_devices: !options[:readonly]) 22 | match(type: "appstore", 23 | app_identifier: "me.themoji.app.release", 24 | readonly: options[:readonly], 25 | force_for_new_devices: !options[:readonly]) 26 | end 27 | 28 | desc "Runs all the tests" 29 | lane :test do 30 | scan(scheme: "ThemojiUITests", 31 | output_types: "", 32 | fail_build: false) 33 | 34 | trainer(output_directory: ENV["CIRCLE_TEST_REPORTS"]) 35 | end 36 | 37 | desc "Submit a new Beta Build to Apple TestFlight" 38 | desc "This will also make sure the profile is up to date" 39 | lane :beta do 40 | increment_build_number( 41 | build_number: latest_testflight_build_number + 1, 42 | xcodeproj: "Themoji.xcodeproj" 43 | ) 44 | build_app(env: "appstore") 45 | pilot 46 | end 47 | 48 | lane :appstore do 49 | match(type: "appstore", force: true) 50 | ensure_git_status_clean 51 | snapshot 52 | build_app(env: "appstore") 53 | deliver(force: true) 54 | notification(title: "Successfully uploaded metadata and build to iTunes Connect", message: "🎉") 55 | end 56 | 57 | private_lane :build_app do |options| 58 | match(type: options[:env], readonly: true) 59 | gym(scheme: "Themoji") 60 | end 61 | end 62 | -------------------------------------------------------------------------------- /fastlane/Matchfile: -------------------------------------------------------------------------------- 1 | git_url "https://github.com/krausefx/certs" 2 | -------------------------------------------------------------------------------- /fastlane/Pluginfile: -------------------------------------------------------------------------------- 1 | # Autogenerated by fastlane 2 | 3 | gem 'fastlane-plugin-emoji_fetcher', path: './fastlane-plugin-emoji_fetcher' 4 | gem 'fastlane-plugin-trainer', git: "https://github.com/krausefx/trainer" 5 | -------------------------------------------------------------------------------- /fastlane/README.md: -------------------------------------------------------------------------------- 1 | fastlane documentation 2 | ================ 3 | # Installation 4 | 5 | Make sure you have the latest version of the Xcode command line tools installed: 6 | 7 | ``` 8 | xcode-select --install 9 | ``` 10 | 11 | ## Choose your installation method: 12 | 13 | 14 | 15 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
Homebrew 16 | Installer Script 17 | Rubygems 18 |
macOSmacOSmacOS or Linux with Ruby 2.0.0 or above
brew cask install fastlaneDownload the zip file. Then double click on the install script (or run it in a terminal window).sudo gem install fastlane -NV
30 | # Available Actions 31 | ## iOS 32 | ### ios bootstrap 33 | ``` 34 | fastlane ios bootstrap 35 | ``` 36 | Set up a new Mac 37 | 38 | To run this in readonly mode without user credentials use 39 | 40 | fastlane bootstrap readonly:true 41 | ### ios test 42 | ``` 43 | fastlane ios test 44 | ``` 45 | Runs all the tests 46 | ### ios beta 47 | ``` 48 | fastlane ios beta 49 | ``` 50 | Submit a new Beta Build to Apple TestFlight 51 | 52 | This will also make sure the profile is up to date 53 | ### ios appstore 54 | ``` 55 | fastlane ios appstore 56 | ``` 57 | 58 | 59 | ---- 60 | 61 | This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. 62 | More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). 63 | The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). 64 | -------------------------------------------------------------------------------- /fastlane/Snapfile: -------------------------------------------------------------------------------- 1 | languages([ 2 | "en-US" 3 | ]) 4 | 5 | clear_previous_screenshots true # remove the '#' to clear all previously generated screenshots before creating new ones 6 | -------------------------------------------------------------------------------- /fastlane/metadata/Themoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/fastlane/metadata/Themoji.png -------------------------------------------------------------------------------- /fastlane/metadata/copyright.txt: -------------------------------------------------------------------------------- 1 | 2016 Felix Krause -------------------------------------------------------------------------------- /fastlane/metadata/en-US/description.txt: -------------------------------------------------------------------------------- 1 | > We were in Thailand in a local restaurant, they couldn't speak English, so we pointed at the English/Thai title on the menu. We got our food without rice, but didn't have anything to point to - we thought about how we can communicate that. This is when it hit us: We didn't have an internet connection to just google for rice. But what do we all have locally? Emojis :arrow_right: :rice: 2 | 3 | - Order another beer: :beer: (or any other food and drink) 4 | - Ask for the way to 5 | - Train Station :steam_locomotive: 6 | - Airport :airplane: 7 | - Hospital :hospital: 8 | - Attractions in the city :ferris_wheel: 9 | - Ask for :scissors: or a :pencil2: 10 | - Get some batteries :battery: 11 | 12 | With Themoji, your app basically becomes an emoji! 13 | 14 | - on the beach with :sunglasses: 15 | - sleepy on the airplane :sleeping: 16 | - eating burgers :hamburger: 17 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/keywords.txt: -------------------------------------------------------------------------------- 1 | emoji,fun,lol,real,life,graphic,choose -------------------------------------------------------------------------------- /fastlane/metadata/en-US/marketing_url.txt: -------------------------------------------------------------------------------- 1 | https://themoji.me/ -------------------------------------------------------------------------------- /fastlane/metadata/en-US/name.txt: -------------------------------------------------------------------------------- 1 | Themoji - Express yourself with emojis -------------------------------------------------------------------------------- /fastlane/metadata/en-US/privacy_url.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/fastlane/metadata/en-US/privacy_url.txt -------------------------------------------------------------------------------- /fastlane/metadata/en-US/release_notes.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/fastlane/metadata/en-US/release_notes.txt -------------------------------------------------------------------------------- /fastlane/metadata/en-US/support_url.txt: -------------------------------------------------------------------------------- 1 | https://themoji.me/ -------------------------------------------------------------------------------- /fastlane/metadata/primary_category.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/fastlane/metadata/primary_category.txt -------------------------------------------------------------------------------- /fastlane/metadata/primary_first_sub_category.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/fastlane/metadata/primary_first_sub_category.txt -------------------------------------------------------------------------------- /fastlane/metadata/primary_second_sub_category.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/fastlane/metadata/primary_second_sub_category.txt -------------------------------------------------------------------------------- /fastlane/metadata/secondary_category.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/fastlane/metadata/secondary_category.txt -------------------------------------------------------------------------------- /fastlane/metadata/secondary_first_sub_category.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/fastlane/metadata/secondary_first_sub_category.txt -------------------------------------------------------------------------------- /fastlane/metadata/secondary_second_sub_category.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Themoji/ios/7e5a113716ad9e0c345da5c3bcfc4a6250d52db8/fastlane/metadata/secondary_second_sub_category.txt --------------------------------------------------------------------------------