├── .eslintrc
├── .github
└── FUNDING.yml
├── .gitignore
├── .idea
├── Hello-Goodbye-Extension.iml
├── misc.xml
├── modules.xml
├── vcs.xml
└── workspace.xml
├── .prettierignore
├── .prettierrc
├── .travis.yml
├── Chrome
├── background.js
├── icons
│ ├── HGB.png
│ ├── HGB@0,25x.png
│ └── HGB@0,5x.png
├── manifest.json
├── popup.css
├── popup.html
├── popup.js
└── water.min.css
├── HelloGoodbyeiOS
├── BlockerExtension
│ ├── ContentBlockerRequestHandler.swift
│ └── Info.plist
├── HelloGoodbyeiOS.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ ├── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcuserdata
│ │ │ └── bruceroettgers.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcuserdata
│ │ └── bruceroettgers.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
├── HelloGoodbyeiOS.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ └── xcuserdata
│ │ └── bruceroettgers.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
├── HelloGoodbyeiOS
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── 100.png
│ │ │ ├── 1024.png
│ │ │ ├── 114.png
│ │ │ ├── 120.png
│ │ │ ├── 144.png
│ │ │ ├── 152.png
│ │ │ ├── 167.png
│ │ │ ├── 180.png
│ │ │ ├── 20.png
│ │ │ ├── 29.png
│ │ │ ├── 40.png
│ │ │ ├── 50.png
│ │ │ ├── 57.png
│ │ │ ├── 58.png
│ │ │ ├── 60.png
│ │ │ ├── 72.png
│ │ │ ├── 76.png
│ │ │ ├── 80.png
│ │ │ ├── 87.png
│ │ │ └── Contents.json
│ │ ├── AppIconOLD.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── mac-icon-1024.png
│ │ │ ├── mac-icon-20.png
│ │ │ ├── mac-icon-20@2x.png
│ │ │ ├── mac-icon-20@3x.png
│ │ │ ├── mac-icon-29.png
│ │ │ ├── mac-icon-29@2x.png
│ │ │ ├── mac-icon-29@3x.png
│ │ │ ├── mac-icon-40.png
│ │ │ ├── mac-icon-40@2x.png
│ │ │ ├── mac-icon-40@3x.png
│ │ │ ├── mac-icon-60@2x.png
│ │ │ ├── mac-icon-60@3x.png
│ │ │ ├── mac-icon-76.png
│ │ │ ├── mac-icon-76@2x.png
│ │ │ └── mac-icon-83.5@2x.png
│ │ └── Contents.json
│ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── ViewController.swift
│ └── hellogoodbye.gif
├── Podfile
├── Podfile.lock
└── Pods
│ ├── FLAnimatedImage
│ ├── FLAnimatedImage
│ │ ├── FLAnimatedImage.h
│ │ ├── FLAnimatedImage.m
│ │ ├── FLAnimatedImageView.h
│ │ └── FLAnimatedImageView.m
│ ├── LICENSE
│ └── README.md
│ ├── Manifest.lock
│ ├── Pods.xcodeproj
│ ├── project.pbxproj
│ └── xcuserdata
│ │ ├── .xcuserdatad
│ │ └── xcschemes
│ │ │ ├── FLAnimatedImage.xcscheme
│ │ │ ├── Pods-BlockerExtension.xcscheme
│ │ │ ├── Pods-HelloGoodbyeiOS.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── bruceroettgers.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ └── Target Support Files
│ ├── FLAnimatedImage
│ ├── FLAnimatedImage-dummy.m
│ ├── FLAnimatedImage-prefix.pch
│ ├── FLAnimatedImage-umbrella.h
│ ├── FLAnimatedImage.modulemap
│ ├── FLAnimatedImage.xcconfig
│ └── Info.plist
│ ├── Pods-BlockerExtension
│ ├── Info.plist
│ ├── Pods-BlockerExtension-acknowledgements.markdown
│ ├── Pods-BlockerExtension-acknowledgements.plist
│ ├── Pods-BlockerExtension-dummy.m
│ ├── Pods-BlockerExtension-resources.sh
│ ├── Pods-BlockerExtension-umbrella.h
│ ├── Pods-BlockerExtension.debug.xcconfig
│ ├── Pods-BlockerExtension.modulemap
│ └── Pods-BlockerExtension.release.xcconfig
│ └── Pods-HelloGoodbyeiOS
│ ├── Info.plist
│ ├── Pods-HelloGoodbyeiOS-acknowledgements.markdown
│ ├── Pods-HelloGoodbyeiOS-acknowledgements.plist
│ ├── Pods-HelloGoodbyeiOS-dummy.m
│ ├── Pods-HelloGoodbyeiOS-frameworks.sh
│ ├── Pods-HelloGoodbyeiOS-resources.sh
│ ├── Pods-HelloGoodbyeiOS-umbrella.h
│ ├── Pods-HelloGoodbyeiOS.debug.xcconfig
│ ├── Pods-HelloGoodbyeiOS.modulemap
│ └── Pods-HelloGoodbyeiOS.release.xcconfig
├── LICENSE
├── README.md
├── Safari
├── BlockerExtension
│ ├── BlockerExtension.entitlements
│ ├── ContentBlockerRequestHandler.swift
│ ├── Info.plist
│ ├── backupList.json
│ └── blockerList.json
├── HelloGoodbye.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ ├── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcuserdata
│ │ │ └── bruceroettgers.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcuserdata
│ │ └── bruceroettgers.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
└── HelloGoodbye
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── 1024.png
│ │ ├── 128.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ ├── 512.png
│ │ ├── 64.png
│ │ └── Contents.json
│ └── Contents.json
│ ├── Base.lproj
│ └── Main.storyboard
│ ├── HelloGoodbye.entitlements
│ ├── Info.plist
│ └── ViewController.swift
├── app.zip
├── design-assets
├── Exports
│ ├── Github Preview.png
│ ├── Marquee Promo Tile.png
│ ├── comparisoniOS.png
│ ├── discuss-issue.png
│ ├── iosPromo.png
│ ├── iosXpromo.png
│ ├── ipadPromo.png
│ ├── mac-icon.png
│ ├── macOSpromo.png
│ ├── makerads.png
│ ├── medium-tile-promo.png
│ ├── promotional.jpg
│ ├── promotional.png
│ ├── small-tile-promo.jpg
│ └── small-tile-promo.png
├── Github Preview.psd
├── Logo
│ ├── HGB.png
│ ├── HGBWhite.png
│ ├── Mac Icon Set
│ │ └── Assets 3.xcassets
│ │ │ └── AppIcon.appiconset
│ │ │ ├── 1024.png
│ │ │ ├── 128.png
│ │ │ ├── 16.png
│ │ │ ├── 256.png
│ │ │ ├── 32.png
│ │ │ ├── 512.png
│ │ │ ├── 64.png
│ │ │ └── Contents.json
│ └── iOS Icon Set
│ │ └── AppIcon.appiconset
│ │ ├── 100.png
│ │ ├── 1024.png
│ │ ├── 114.png
│ │ ├── 120.png
│ │ ├── 144.png
│ │ ├── 152.png
│ │ ├── 167.png
│ │ ├── 180.png
│ │ ├── 20.png
│ │ ├── 29.png
│ │ ├── 40.png
│ │ ├── 50.png
│ │ ├── 57.png
│ │ ├── 58.png
│ │ ├── 60.png
│ │ ├── 72.png
│ │ ├── 76.png
│ │ ├── 80.png
│ │ ├── 87.png
│ │ └── Contents.json
├── Marquee Promo Tile.psd
├── comparisoniOS.psd
├── discuss-issue.psd
├── iosPromo.psd
├── iosXpromo.psd
├── ipadPromo.psd
├── macOS promo.psd
├── makerads.psd
├── medium-tile promo.psd
├── medium-tile-promo.psd
├── promotional.psd
└── small-tile-promo.psd
├── filterlist.txt
├── package-lock.json
├── package.json
├── pihole.txt
└── yarn.lock
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["eslint:recommended", "prettier"],
3 | "env": {
4 | "webextensions": true,
5 | "browser": true
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | liberapay: hellogoodbye
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.gitignore.io/api/macOS
3 | # Edit at https://www.gitignore.io/?templates=macOS
4 |
5 | ### macOS ###
6 | # General
7 | .DS_Store
8 | .AppleDouble
9 | .LSOverride
10 |
11 | # Icon must end with two \r
12 | Icon
13 |
14 | # Thumbnails
15 | ._*
16 |
17 | # Files that might appear in the root of a volume
18 | .DocumentRevisions-V100
19 | .fseventsd
20 | .Spotlight-V100
21 | .TemporaryItems
22 | .Trashes
23 | .VolumeIcon.icns
24 | .com.apple.timemachine.donotpresent
25 |
26 | # Directories potentially created on remote AFP share
27 | .AppleDB
28 | .AppleDesktop
29 | Network Trash Folder
30 | Temporary Items
31 | .apdisk
32 |
33 | # End of https://www.gitignore.io/api/macOS
34 |
35 | node_modules/
36 |
--------------------------------------------------------------------------------
/.idea/Hello-Goodbye-Extension.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
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 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | 1563955629848
42 |
43 |
44 | 1563955629848
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | *.min.css
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "trailingComma": "es5"
3 | }
4 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - node
4 | script: "yarn lint"
5 |
--------------------------------------------------------------------------------
/Chrome/background.js:
--------------------------------------------------------------------------------
1 | var isDisabled = false;
2 |
3 | // extension can be disabled temporarily
4 | chrome.storage.onChanged.addListener(function(changes) {
5 | for (var key in changes) {
6 | var storageChange = changes[key].newValue;
7 | if (key === "disabled") {
8 | isDisabled = storageChange;
9 | }
10 | }
11 | });
12 |
13 | // initialize disabled, onChanged only gets called when change, not at beginning
14 | chrome.storage.local.get("disabled", function(value) {
15 | isDisabled = !!value.disabled;
16 | });
17 |
18 | chrome.webRequest.onBeforeRequest.addListener(
19 | function(details) {
20 | // set badge text to indicate that a help widget is available
21 | chrome.browserAction.setBadgeText({ text: "HELP", tabId: details.tabId });
22 |
23 | if (isDisabled) {
24 | return { cancel: false }; // this should return from the function (details) level
25 | } else {
26 | return { cancel: true };
27 | }
28 | },
29 | {
30 | urls: [
31 | "*://widget.intercom.io/*",
32 | "*://connect.facebook.net/*/sdk/xfbml.customerchat.js",
33 | "*://assets.producthunt.com/assets/upwigloader.js",
34 | "*://js.driftt.com/*",
35 | "*://*.crisp.chat/*",
36 | "*://*.intergram.xyz/js/*",
37 | "*://widget.mfy.im/*",
38 | "*://connect.podium.com/*",
39 | "*://js.usemessages.com/*",
40 | "*://static.getchipbot.com/",
41 | "*://static.zdassets.com/ekr/snippet.js",
42 | "*://www.couchbase.com/webfiles/*/js/contact-popup-form.js",
43 | "*://assetscdn-wchat.freshchat.com/*",
44 | "*://wchat.freshchat.com/*",
45 | "*://wchat.eu.freshchat.com/*",
46 | "*://code.jivosite.com/script/widget/*",
47 | "*://code.tidio.co/*",
48 | "*://*.user.com/static/js/*",
49 | "*://secure.livechatinc.com/*",
50 | "*://*.justanswer.com/revizely/2/core/ja-com.js",
51 | "*://code.snapengage.com/*",
52 | "*://sdk.inbenta.io/chatbot/*",
53 | "*://pi2.movoto.com/1.7.654/javascripts/desktop/movoto.min.js",
54 | "*://*.zopim.com/*",
55 | "*://cdn.gubagoo.io/*",
56 | "*://leadconnect.ipmaxi.se/*",
57 | "*://static.small.chat/messenger.js",
58 | "*://smartsupp-widget-161959.c.cdn77.org/build/smartchat-2.3.20.min.js",
59 | "*://www.smartsuppchat.com/loader.js?",
60 | "*://plugins.help.com/*",
61 | "*://js.gs-chat.com/*",
62 | "*://widget.customerly.io/*",
63 | "*://beacon-v2.helpscout.net/",
64 | "*://assets.gorgias.io/chat/*",
65 | "*://static.quriobot.com/website/*",
66 | "*://commondatastorage.googleapis.com/code.snapengage.com/js/*",
67 | "*://embed.tawk.to/*",
68 | "*://*.contactatonce.com/*",
69 | "*://live-chat-cdn.socialsignin.net/*",
70 | "*://messenger.ngageics.com/*",
71 | "*://app.carnow.com/dealers/carnow_plugin.js?*",
72 | "*://chat8.live800.com/*",
73 | "*://tars-file-upload.s3.amazonaws.com/bulb/js/widget.js",
74 | "*://static.widget.trengo.eu/embed.js",
75 | "*://www.chronopost.fr/JavaHookServer/api/v1/webhook/chat/*",
76 | "*://www.snapengage.com/chatjs/*",
77 | "*://kf.ecqun.com/*",
78 | "*://js.qualified.com/qualified.js?*",
79 | "*://www.aexp-static.com/cdaas/one/statics/axp-shared-scripts/1.4.0/package/dist/vendors/qualtrics/FeedbackLinkModule.js?*",
80 | "*://widget.replain.cc/dist/*",
81 | "*://cdn.bitrix24.ru/*",
82 | "*://code-ya.jivosite.com/*",
83 | "*://static.zdassets.com/web_widget/*",
84 | "*://my.clickdesk.com/clickdesk-ui/browser/*",
85 | "*://*.videoask.com/embed/embed.js",
86 | "*://afcs.dellcdn.com/csb/contact-drawer/bundles/js/contact-drawer_v1.js",
87 | "*://static.ada.support/embed.js",
88 | "*://chat.outboundengine.com/c/readychat_website_min.js",
89 | "*://knrpc.olark.com/nrpc/*",
90 | "*://*.formilla.com/scripts/feedback.js",
91 | "*://site-chat.ru/cjs/*",
92 | "*://widget.feedot-lawyer.ru/js/*",
93 | "*://go.activengage.com/*",
94 | "*://whitesaas.com/api/*",
95 | "*://messenger.rightside.ru/*",
96 | "*://lcab.talk-me.ru/*",
97 | "*://cp.onicon.ru/*",
98 | "*://chat-assets.frontapp.com/*",
99 | "*://leadback.ru/js/leadback.js",
100 | "*://admin.verbox.ru/support/*",
101 | "*://lptag.liveperson.net/*",
102 | "*://ready-chat.appspot.com/*",
103 | "*://w.chatlio.com/*",
104 | "*://widget-new.helpcrunch.com/*",
105 | "*://clients.streamwood.ru/StreamWood/sw.js",
106 | "*://cs15.livetex.ru/js/client.js",
107 | "*://widget.consultsystems.ru/*",
108 | "*://chatclient.venew.io/*",
109 | "*://api.venyoo.ru/*",
110 | "*://d1fw6d83a3emwv.cloudfront.net/bot/prod/js/web-chan.js",
111 | "*://cdn.bitrix24.kz/*",
112 | "*://live.vnpgroup.net/js/*",
113 | "*://crm.digtlab.ru/upload/*",
114 | "*://me-talk.ru/support/*",
115 | "*://cdn-app.continual.ly/js/embed/continually-embed.latest.min.js",
116 | "*://corp.aquadom.info/upload/crm/site_button/loader_1_lue57s.js*",
117 | "*://lawbook.online/chat.js*",
118 | "*://static.parastorage.com/services/chat-widget/*",
119 | "*://service.giosg.com/*",
120 | "*://chatbox.cuuma.fi/*",
121 | "*://envybox.io/*",
122 | "*://widget.lawyer-feedot.ru/*",
123 | "*://www.flygoldfinch.com/assets/images/whatsapp.png",
124 | "*://ohotnik174.ru/bitrix/js/main/*",
125 | "*://app.uiscom.ru/*",
126 | "*://birdeye.com/embed/*",
127 | "*://sf-sotc.s3.amazonaws.com/dev/chatsdk/v1/SenseforthChatSDKLoader.js",
128 | "*://*.my.salesforce.com/embeddedservice/5.0/client/liveagent.esw.min.js",
129 | "*://guide.loyalhealth.com/*",
130 | "*://cdn-widget.callpage.io/*",
131 | "*://cdn.shopify.com/shopifycloud/shopify_chat/*",
132 | "*://*.nuance.com/media/launch/chatLoader*",
133 | "*://cdn.freshbots.ai/assets/share/js/freshbots*",
134 | "*://app.frase.io/js/*",
135 | "*://code.jivo.ru/widget/*",
136 | "*://www.carcodesms.com/widgets/*",
137 | "*://js.joonbot.com/init.js",
138 | "*://cdn.livechatinc.com/*",
139 | "*://static.arukereso.hu/widget/*",
140 | "*://*.inside-graph.com/*",
141 | "*://static.bots.sefbot.cz/website/js/widget*",
142 | "*://chatbot.sipgate.de/*",
143 | "*://quriobot.com/qb/widget/*",
144 | "*://vmss-eu.boldchat.com/*",
145 | "*://pageview.activengage.com/*",
146 | "*://cdn-bot.phenompeople.com/*",
147 | "*://cdn.envybox.io/*",
148 |
149 | // specific ones
150 | "*://dogovor-obrazets.ru/*/settings*",
151 |
152 | // someone from x just bought y widgets
153 | "*://static.notifia.io/widget.js",
154 | "*://cdn.useproof.com/proof.js?*",
155 | "*://cdn.provesrc.com/provesrc.js",
156 | "*://s3.amazonaws.com/provely-public/w/provely-2.0.js",
157 | "*://load.fomo.com/*",
158 | "*://pixel.convertize.io/*",
159 | "*://chat-assets.frontapp.com/*",
160 | "*://widget.instabot.io/jsapi/rokoInstabot.js",
161 | "*://code.evidence.io/*",
162 |
163 | // webpush
164 | "*://cdn.webpushr.com/*", // bot + notification banner blocked
165 | ],
166 | },
167 | ["blocking"]
168 | );
169 |
--------------------------------------------------------------------------------
/Chrome/icons/HGB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Chrome/icons/HGB.png
--------------------------------------------------------------------------------
/Chrome/icons/HGB@0,25x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Chrome/icons/HGB@0,25x.png
--------------------------------------------------------------------------------
/Chrome/icons/HGB@0,5x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Chrome/icons/HGB@0,5x.png
--------------------------------------------------------------------------------
/Chrome/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Hello, Goodbye",
3 | "version": "1.7.0",
4 | "description": "Hello, Goodbye blocks annoying chat widgets.",
5 | "icons": {
6 | "32": "icons/HGB@0,25x.png",
7 | "64": "icons/HGB@0,5x.png",
8 | "128": "icons/HGB.png"
9 | },
10 | "permissions": ["storage", "webRequest", "webRequestBlocking", "*://*/*"],
11 | "background": {
12 | "scripts": ["background.js"],
13 | "persistent": true
14 | },
15 | "browser_action": {
16 | "default_popup": "popup.html"
17 | },
18 | "browser_specific_settings": {
19 | "gecko": {
20 | "id": "{ddb52f85-5859-49b1-b54e-ee7709b1eb5d}"
21 | }
22 | },
23 | "manifest_version": 2
24 | }
25 |
--------------------------------------------------------------------------------
/Chrome/popup.css:
--------------------------------------------------------------------------------
1 | html {
2 | width: 225px;
3 | /*font-family: 'Roboto';*/
4 | font-size: 1.25rem;
5 | }
6 |
7 | h1 {
8 | font-size: 24px;
9 | }
10 |
11 | h2 {
12 | font-size: 20px;
13 | }
14 |
15 | h1, h2 {
16 | margin: 2px;
17 | }
18 |
19 | a {
20 | color: grey;
21 | }
22 |
23 | .toggle-btn {
24 | /* font-size: 14px;
25 | padding: 8px;
26 | width: 175px;
27 | color: white;
28 | border-radius: 8px;
29 | box-shadow: 1px 2px 2px black; */
30 | margin-top: 1.5rem;
31 | }
32 |
33 | #enable-btn {
34 | background-color: #e11d48;
35 | }
36 |
37 | #disable-btn {
38 | background-color: #16a34a;
39 | }
40 |
41 | .icon {
42 | width: 2rem;
43 | margin-right: 0.5rem;
44 | height: 2rem;
45 | }
46 |
47 | .centered {
48 | display: flex;
49 | align-items: center;
50 | }
51 |
52 | h3 {
53 | font-size: 16px;
54 | }
--------------------------------------------------------------------------------
/Chrome/popup.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Chrome/popup.js:
--------------------------------------------------------------------------------
1 | // check if extension is enabled or disabled
2 | chrome.storage.local.get("disabled", function(value) {
3 | if (value.disabled) {
4 | hideButton("disable-btn");
5 | } else {
6 | hideButton("enable-btn");
7 | }
8 |
9 | function hideButton(elementId) {
10 | document.getElementById(elementId).style.display = "none";
11 | }
12 |
13 | function showButton(elementId) {
14 | document.getElementById(elementId).style.display = "inline-block";
15 | }
16 |
17 | function toggleButtons() {
18 | chrome.storage.local.get("disabled", function(value) {
19 | if (value.disabled) {
20 | hideButton("disable-btn");
21 | showButton("enable-btn");
22 | } else {
23 | hideButton("enable-btn");
24 | showButton("disable-btn");
25 | }
26 | });
27 | chrome.tabs.reload();
28 | }
29 |
30 | function disableExtension() {
31 | chrome.storage.local.set({ disabled: true }, function() {
32 | toggleButtons();
33 | });
34 | }
35 | document
36 | .getElementById("disable-btn")
37 | .addEventListener("click", disableExtension);
38 |
39 | function enableExtension() {
40 | chrome.storage.local.set({ disabled: false }, function() {
41 | toggleButtons();
42 | });
43 | }
44 | document
45 | .getElementById("enable-btn")
46 | .addEventListener("click", enableExtension);
47 | });
48 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/BlockerExtension/ContentBlockerRequestHandler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentBlockerRequestHandler.swift
3 | // BlockerExtension
4 | //
5 | // Created by Bruce Roettgers on 14.04.19.
6 | // Copyright © 2019 Dirk Hulverscheidt. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import MobileCoreServices
11 |
12 | class ContentBlockerRequestHandler: NSObject, NSExtensionRequestHandling {
13 |
14 | func beginRequest(with context: NSExtensionContext) {
15 | let attachment = NSItemProvider(contentsOf: Bundle.main.url(forResource: "blockerList", withExtension: "json"))!
16 |
17 | let item = NSExtensionItem()
18 | item.attachments = [attachment]
19 |
20 | context.completeRequest(returningItems: [item], completionHandler: nil)
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/BlockerExtension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Hello, Goodbye
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | XPC!
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | NSExtension
24 |
25 | NSExtensionPointIdentifier
26 | com.apple.Safari.content-blocker
27 | NSExtensionPrincipalClass
28 | $(PRODUCT_MODULE_NAME).ContentBlockerRequestHandler
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS.xcodeproj/project.xcworkspace/xcuserdata/bruceroettgers.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS.xcodeproj/project.xcworkspace/xcuserdata/bruceroettgers.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS.xcodeproj/xcuserdata/bruceroettgers.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | BlockerExtension.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 | HelloGoodbyeiOS.xcscheme_^#shared#^_
13 |
14 | orderHint
15 | 1
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS.xcworkspace/xcuserdata/bruceroettgers.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS.xcworkspace/xcuserdata/bruceroettgers.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // HelloGoodbyeiOS
4 | //
5 | // Created by Bruce Roettgers on 14.04.19.
6 | // Copyright © 2019 Dirk Hulverscheidt. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 | return true
20 | }
21 |
22 | func applicationWillResignActive(_ application: UIApplication) {
23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
25 | }
26 |
27 | func applicationDidEnterBackground(_ application: UIApplication) {
28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
30 | }
31 |
32 | func applicationWillEnterForeground(_ application: UIApplication) {
33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | func applicationDidBecomeActive(_ application: UIApplication) {
37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
38 | }
39 |
40 | func applicationWillTerminate(_ application: UIApplication) {
41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
42 | }
43 |
44 |
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/100.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/1024.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/114.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/120.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/144.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/152.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/167.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/180.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/20.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/29.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/40.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/50.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/57.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/58.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/60.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/72.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/76.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/80.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/87.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "40.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "60.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "29.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "58.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "87.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "80.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "120.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "57x57",
47 | "idiom" : "iphone",
48 | "filename" : "57.png",
49 | "scale" : "1x"
50 | },
51 | {
52 | "size" : "57x57",
53 | "idiom" : "iphone",
54 | "filename" : "114.png",
55 | "scale" : "2x"
56 | },
57 | {
58 | "size" : "60x60",
59 | "idiom" : "iphone",
60 | "filename" : "120.png",
61 | "scale" : "2x"
62 | },
63 | {
64 | "size" : "60x60",
65 | "idiom" : "iphone",
66 | "filename" : "180.png",
67 | "scale" : "3x"
68 | },
69 | {
70 | "size" : "20x20",
71 | "idiom" : "ipad",
72 | "filename" : "20.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "20x20",
77 | "idiom" : "ipad",
78 | "filename" : "40.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "29x29",
83 | "idiom" : "ipad",
84 | "filename" : "29.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "29x29",
89 | "idiom" : "ipad",
90 | "filename" : "58.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "40x40",
95 | "idiom" : "ipad",
96 | "filename" : "40.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "40x40",
101 | "idiom" : "ipad",
102 | "filename" : "80.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "50x50",
107 | "idiom" : "ipad",
108 | "filename" : "50.png",
109 | "scale" : "1x"
110 | },
111 | {
112 | "size" : "50x50",
113 | "idiom" : "ipad",
114 | "filename" : "100.png",
115 | "scale" : "2x"
116 | },
117 | {
118 | "size" : "72x72",
119 | "idiom" : "ipad",
120 | "filename" : "72.png",
121 | "scale" : "1x"
122 | },
123 | {
124 | "size" : "72x72",
125 | "idiom" : "ipad",
126 | "filename" : "144.png",
127 | "scale" : "2x"
128 | },
129 | {
130 | "size" : "76x76",
131 | "idiom" : "ipad",
132 | "filename" : "76.png",
133 | "scale" : "1x"
134 | },
135 | {
136 | "size" : "76x76",
137 | "idiom" : "ipad",
138 | "filename" : "152.png",
139 | "scale" : "2x"
140 | },
141 | {
142 | "size" : "83.5x83.5",
143 | "idiom" : "ipad",
144 | "filename" : "167.png",
145 | "scale" : "2x"
146 | },
147 | {
148 | "size" : "1024x1024",
149 | "idiom" : "ios-marketing",
150 | "filename" : "1024.png",
151 | "scale" : "1x"
152 | }
153 | ],
154 | "info" : {
155 | "version" : 1,
156 | "author" : "xcode"
157 | }
158 | }
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom": "iphone",
6 | "filename" : "mac-icon-20@2x.png",
7 | "scale": "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom": "iphone",
12 | "filename" : "mac-icon-20@3x.png",
13 | "scale": "3x"
14 | },
15 | {
16 | "size" : "20x20",
17 | "idiom": "ipad",
18 | "filename" : "mac-icon-20.png",
19 | "scale": "1x"
20 | },
21 | {
22 | "size" : "20x20",
23 | "idiom": "ipad",
24 | "filename" : "mac-icon-20@2x.png",
25 | "scale": "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "mac-icon-29@2x.png",
31 | "scale" : "2x"
32 | },
33 | {
34 | "size" : "29x29",
35 | "idiom" : "iphone",
36 | "filename" : "mac-icon-29@3x.png",
37 | "scale" : "3x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "mac-icon-40@2x.png",
43 | "scale" : "2x"
44 | },
45 | {
46 | "size" : "40x40",
47 | "idiom" : "iphone",
48 | "filename" : "mac-icon-40@3x.png",
49 | "scale" : "3x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "mac-icon-60@2x.png",
55 | "scale" : "2x"
56 | },
57 | {
58 | "size" : "60x60",
59 | "idiom" : "iphone",
60 | "filename" : "mac-icon-60@3x.png",
61 | "scale" : "3x"
62 | },
63 | {
64 | "size" : "29x29",
65 | "idiom" : "ipad",
66 | "filename" : "mac-icon-29.png",
67 | "scale" : "1x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "mac-icon-29@2x.png",
73 | "scale" : "2x"
74 | },
75 | {
76 | "size" : "40x40",
77 | "idiom" : "ipad",
78 | "filename" : "mac-icon-40.png",
79 | "scale" : "1x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "mac-icon-40@2x.png",
85 | "scale" : "2x"
86 | },
87 | {
88 | "size" : "76x76",
89 | "idiom" : "ipad",
90 | "filename" : "mac-icon-76.png",
91 | "scale" : "1x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "mac-icon-76@2x.png",
97 | "scale" : "2x"
98 | },
99 | {
100 | "size" : "83.5x83.5",
101 | "idiom" : "ipad",
102 | "filename" : "mac-icon-83.5@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "1024x1024",
107 | "idiom" : "ios-marketing",
108 | "filename" : "mac-icon-1024.png",
109 | "scale" : "1x"
110 | }
111 | ],
112 | "info" : {
113 | "version" : 1,
114 | "author" : "xcode"
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-1024.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-20.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-20@2x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-20@3x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-29.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-29@2x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-29@3x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-40.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-40@2x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-40@3x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-60@2x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-60@3x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-76.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-76@2x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/AppIconOLD.appiconset/mac-icon-83.5@2x.png
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/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 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Base.lproj/Main.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 |
29 |
30 |
31 | Thank you for using this app, you're supporting an indie maker!
32 |
33 | If there's something wrong, or you just want to say hi, tweet at me @hellogoodbyeapp or write an email to hello@hellogoodby.app
34 |
35 | Using FLAnimatedImage available under the MIT license.
36 |
37 | Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Hello, Goodbye
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UISupportedInterfaceOrientations
34 |
35 | UIInterfaceOrientationPortrait
36 | UIInterfaceOrientationLandscapeLeft
37 | UIInterfaceOrientationLandscapeRight
38 |
39 | UISupportedInterfaceOrientations~ipad
40 |
41 | UIInterfaceOrientationPortrait
42 | UIInterfaceOrientationPortraitUpsideDown
43 | UIInterfaceOrientationLandscapeLeft
44 | UIInterfaceOrientationLandscapeRight
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // HelloGoodbyeiOS
4 | //
5 | // Created by Bruce Roettgers on 14.04.19.
6 | // Copyright © 2019 Dirk Hulverscheidt. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import FLAnimatedImage
11 |
12 | class ViewController: UIViewController {
13 |
14 | @IBOutlet weak var imageView: FLAnimatedImageView!
15 |
16 | override func viewDidLoad() {
17 | super.viewDidLoad()
18 | // Do any additional setup after loading the view.
19 |
20 | let path = Bundle.main.path(forResource: "hellogoodbye", ofType: "gif")
21 | let url = URL(fileURLWithPath: path!)
22 | let gifData = try! Data(contentsOf: url)
23 | let imageData = try! FLAnimatedImage(animatedGIFData: gifData)
24 | imageView.animatedImage = imageData
25 | }
26 |
27 |
28 | }
29 |
30 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/HelloGoodbyeiOS/hellogoodbye.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/HelloGoodbyeiOS/HelloGoodbyeiOS/hellogoodbye.gif
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'BlockerExtension' do
5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for BlockerExtension
9 |
10 | end
11 |
12 | target 'HelloGoodbyeiOS' do
13 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
14 | use_frameworks!
15 |
16 | # Pods for HelloGoodbyeiOS
17 | pod 'FLAnimatedImage', '~> 1.0'
18 |
19 | end
20 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - FLAnimatedImage (1.0.12)
3 |
4 | DEPENDENCIES:
5 | - FLAnimatedImage (~> 1.0)
6 |
7 | SPEC REPOS:
8 | https://github.com/cocoapods/specs.git:
9 | - FLAnimatedImage
10 |
11 | SPEC CHECKSUMS:
12 | FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
13 |
14 | PODFILE CHECKSUM: 2c6c271e7aac4c59b512521ef1971995fb6ea117
15 |
16 | COCOAPODS: 1.5.2
17 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h:
--------------------------------------------------------------------------------
1 | //
2 | // FLAnimatedImage.h
3 | // Flipboard
4 | //
5 | // Created by Raphael Schaad on 7/8/13.
6 | // Copyright (c) 2013-2015 Flipboard. All rights reserved.
7 | //
8 |
9 |
10 | #import
11 |
12 | // Allow user classes conveniently just importing one header.
13 | #import "FLAnimatedImageView.h"
14 |
15 |
16 | #ifndef NS_DESIGNATED_INITIALIZER
17 | #if __has_attribute(objc_designated_initializer)
18 | #define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer))
19 | #else
20 | #define NS_DESIGNATED_INITIALIZER
21 | #endif
22 | #endif
23 |
24 | extern const NSTimeInterval kFLAnimatedImageDelayTimeIntervalMinimum;
25 |
26 | //
27 | // An `FLAnimatedImage`'s job is to deliver frames in a highly performant way and works in conjunction with `FLAnimatedImageView`.
28 | // It subclasses `NSObject` and not `UIImage` because it's only an "image" in the sense that a sea lion is a lion.
29 | // It tries to intelligently choose the frame cache size depending on the image and memory situation with the goal to lower CPU usage for smaller ones, lower memory usage for larger ones and always deliver frames for high performant play-back.
30 | // Note: `posterImage`, `size`, `loopCount`, `delayTimes` and `frameCount` don't change after successful initialization.
31 | //
32 | @interface FLAnimatedImage : NSObject
33 |
34 | @property (nonatomic, strong, readonly) UIImage *posterImage; // Guaranteed to be loaded; usually equivalent to `-imageLazilyCachedAtIndex:0`
35 | @property (nonatomic, assign, readonly) CGSize size; // The `.posterImage`'s `.size`
36 |
37 | @property (nonatomic, assign, readonly) NSUInteger loopCount; // 0 means repeating the animation indefinitely
38 | @property (nonatomic, strong, readonly) NSDictionary *delayTimesForIndexes; // Of type `NSTimeInterval` boxed in `NSNumber`s
39 | @property (nonatomic, assign, readonly) NSUInteger frameCount; // Number of valid frames; equal to `[.delayTimes count]`
40 |
41 | @property (nonatomic, assign, readonly) NSUInteger frameCacheSizeCurrent; // Current size of intelligently chosen buffer window; can range in the interval [1..frameCount]
42 | @property (nonatomic, assign) NSUInteger frameCacheSizeMax; // Allow to cap the cache size; 0 means no specific limit (default)
43 |
44 | // Intended to be called from main thread synchronously; will return immediately.
45 | // If the result isn't cached, will return `nil`; the caller should then pause playback, not increment frame counter and keep polling.
46 | // After an initial loading time, depending on `frameCacheSize`, frames should be available immediately from the cache.
47 | - (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index;
48 |
49 | // Pass either a `UIImage` or an `FLAnimatedImage` and get back its size
50 | + (CGSize)sizeForImage:(id)image;
51 |
52 | // On success, the initializers return an `FLAnimatedImage` with all fields initialized, on failure they return `nil` and an error will be logged.
53 | - (instancetype)initWithAnimatedGIFData:(NSData *)data;
54 | // Pass 0 for optimalFrameCacheSize to get the default, predrawing is enabled by default.
55 | - (instancetype)initWithAnimatedGIFData:(NSData *)data optimalFrameCacheSize:(NSUInteger)optimalFrameCacheSize predrawingEnabled:(BOOL)isPredrawingEnabled NS_DESIGNATED_INITIALIZER;
56 | + (instancetype)animatedImageWithGIFData:(NSData *)data;
57 |
58 | @property (nonatomic, strong, readonly) NSData *data; // The data the receiver was initialized with; read-only
59 |
60 | @end
61 |
62 | typedef NS_ENUM(NSUInteger, FLLogLevel) {
63 | FLLogLevelNone = 0,
64 | FLLogLevelError,
65 | FLLogLevelWarn,
66 | FLLogLevelInfo,
67 | FLLogLevelDebug,
68 | FLLogLevelVerbose
69 | };
70 |
71 | @interface FLAnimatedImage (Logging)
72 |
73 | + (void)setLogBlock:(void (^)(NSString *logString, FLLogLevel logLevel))logBlock logLevel:(FLLogLevel)logLevel;
74 | + (void)logStringFromBlock:(NSString *(^)(void))stringBlock withLevel:(FLLogLevel)level;
75 |
76 | @end
77 |
78 | #define FLLog(logLevel, format, ...) [FLAnimatedImage logStringFromBlock:^NSString *{ return [NSString stringWithFormat:(format), ## __VA_ARGS__]; } withLevel:(logLevel)]
79 |
80 | @interface FLWeakProxy : NSProxy
81 |
82 | + (instancetype)weakProxyForObject:(id)targetObject;
83 |
84 | @end
85 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h:
--------------------------------------------------------------------------------
1 | //
2 | // FLAnimatedImageView.h
3 | // Flipboard
4 | //
5 | // Created by Raphael Schaad on 7/8/13.
6 | // Copyright (c) 2013-2015 Flipboard. All rights reserved.
7 | //
8 |
9 |
10 | #import
11 |
12 | @class FLAnimatedImage;
13 | @protocol FLAnimatedImageViewDebugDelegate;
14 |
15 |
16 | //
17 | // An `FLAnimatedImageView` can take an `FLAnimatedImage` and plays it automatically when in view hierarchy and stops when removed.
18 | // The animation can also be controlled with the `UIImageView` methods `-start/stop/isAnimating`.
19 | // It is a fully compatible `UIImageView` subclass and can be used as a drop-in component to work with existing code paths expecting to display a `UIImage`.
20 | // Under the hood it uses a `CADisplayLink` for playback, which can be inspected with `currentFrame` & `currentFrameIndex`.
21 | //
22 | @interface FLAnimatedImageView : UIImageView
23 |
24 | // Setting `[UIImageView.image]` to a non-`nil` value clears out existing `animatedImage`.
25 | // And vice versa, setting `animatedImage` will initially populate the `[UIImageView.image]` to its `posterImage` and then start animating and hold `currentFrame`.
26 | @property (nonatomic, strong) FLAnimatedImage *animatedImage;
27 | @property (nonatomic, copy) void(^loopCompletionBlock)(NSUInteger loopCountRemaining);
28 |
29 | @property (nonatomic, strong, readonly) UIImage *currentFrame;
30 | @property (nonatomic, assign, readonly) NSUInteger currentFrameIndex;
31 |
32 | // The animation runloop mode. Enables playback during scrolling by allowing timer events (i.e. animation) with NSRunLoopCommonModes.
33 | // To keep scrolling smooth on single-core devices such as iPhone 3GS/4 and iPod Touch 4th gen, the default run loop mode is NSDefaultRunLoopMode. Otherwise, the default is NSDefaultRunLoopMode.
34 | @property (nonatomic, copy) NSString *runLoopMode;
35 |
36 | @end
37 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m:
--------------------------------------------------------------------------------
1 | //
2 | // FLAnimatedImageView.h
3 | // Flipboard
4 | //
5 | // Created by Raphael Schaad on 7/8/13.
6 | // Copyright (c) 2013-2015 Flipboard. All rights reserved.
7 | //
8 |
9 |
10 | #import "FLAnimatedImageView.h"
11 | #import "FLAnimatedImage.h"
12 | #import
13 |
14 |
15 | #if defined(DEBUG) && DEBUG
16 | @protocol FLAnimatedImageViewDebugDelegate
17 | @optional
18 | - (void)debug_animatedImageView:(FLAnimatedImageView *)animatedImageView waitingForFrame:(NSUInteger)index duration:(NSTimeInterval)duration;
19 | @end
20 | #endif
21 |
22 |
23 | @interface FLAnimatedImageView ()
24 |
25 | // Override of public `readonly` properties as private `readwrite`
26 | @property (nonatomic, strong, readwrite) UIImage *currentFrame;
27 | @property (nonatomic, assign, readwrite) NSUInteger currentFrameIndex;
28 |
29 | @property (nonatomic, assign) NSUInteger loopCountdown;
30 | @property (nonatomic, assign) NSTimeInterval accumulator;
31 | @property (nonatomic, strong) CADisplayLink *displayLink;
32 |
33 | @property (nonatomic, assign) BOOL shouldAnimate; // Before checking this value, call `-updateShouldAnimate` whenever the animated image or visibility (window, superview, hidden, alpha) has changed.
34 | @property (nonatomic, assign) BOOL needsDisplayWhenImageBecomesAvailable;
35 |
36 | #if defined(DEBUG) && DEBUG
37 | @property (nonatomic, weak) id debug_delegate;
38 | #endif
39 |
40 | @end
41 |
42 |
43 | @implementation FLAnimatedImageView
44 | @synthesize runLoopMode = _runLoopMode;
45 |
46 | #pragma mark - Initializers
47 |
48 | // -initWithImage: isn't documented as a designated initializer of UIImageView, but it actually seems to be.
49 | // Using -initWithImage: doesn't call any of the other designated initializers.
50 | - (instancetype)initWithImage:(UIImage *)image
51 | {
52 | self = [super initWithImage:image];
53 | if (self) {
54 | [self commonInit];
55 | }
56 | return self;
57 | }
58 |
59 | // -initWithImage:highlightedImage: also isn't documented as a designated initializer of UIImageView, but it doesn't call any other designated initializers.
60 | - (instancetype)initWithImage:(UIImage *)image highlightedImage:(UIImage *)highlightedImage
61 | {
62 | self = [super initWithImage:image highlightedImage:highlightedImage];
63 | if (self) {
64 | [self commonInit];
65 | }
66 | return self;
67 | }
68 |
69 | - (instancetype)initWithFrame:(CGRect)frame
70 | {
71 | self = [super initWithFrame:frame];
72 | if (self) {
73 | [self commonInit];
74 | }
75 | return self;
76 | }
77 |
78 | - (instancetype)initWithCoder:(NSCoder *)aDecoder
79 | {
80 | self = [super initWithCoder:aDecoder];
81 | if (self) {
82 | [self commonInit];
83 | }
84 | return self;
85 | }
86 |
87 | - (void)commonInit
88 | {
89 | self.runLoopMode = [[self class] defaultRunLoopMode];
90 | }
91 |
92 |
93 | #pragma mark - Accessors
94 | #pragma mark Public
95 |
96 | - (void)setAnimatedImage:(FLAnimatedImage *)animatedImage
97 | {
98 | if (![_animatedImage isEqual:animatedImage]) {
99 | if (animatedImage) {
100 | // Clear out the image.
101 | super.image = nil;
102 | // Ensure disabled highlighting; it's not supported (see `-setHighlighted:`).
103 | super.highlighted = NO;
104 | // UIImageView seems to bypass some accessors when calculating its intrinsic content size, so this ensures its intrinsic content size comes from the animated image.
105 | [self invalidateIntrinsicContentSize];
106 | } else {
107 | // Stop animating before the animated image gets cleared out.
108 | [self stopAnimating];
109 | }
110 |
111 | _animatedImage = animatedImage;
112 |
113 | self.currentFrame = animatedImage.posterImage;
114 | self.currentFrameIndex = 0;
115 | if (animatedImage.loopCount > 0) {
116 | self.loopCountdown = animatedImage.loopCount;
117 | } else {
118 | self.loopCountdown = NSUIntegerMax;
119 | }
120 | self.accumulator = 0.0;
121 |
122 | // Start animating after the new animated image has been set.
123 | [self updateShouldAnimate];
124 | if (self.shouldAnimate) {
125 | [self startAnimating];
126 | }
127 |
128 | [self.layer setNeedsDisplay];
129 | }
130 | }
131 |
132 |
133 | #pragma mark - Life Cycle
134 |
135 | - (void)dealloc
136 | {
137 | // Removes the display link from all run loop modes.
138 | [_displayLink invalidate];
139 | }
140 |
141 |
142 | #pragma mark - UIView Method Overrides
143 | #pragma mark Observing View-Related Changes
144 |
145 | - (void)didMoveToSuperview
146 | {
147 | [super didMoveToSuperview];
148 |
149 | [self updateShouldAnimate];
150 | if (self.shouldAnimate) {
151 | [self startAnimating];
152 | } else {
153 | [self stopAnimating];
154 | }
155 | }
156 |
157 |
158 | - (void)didMoveToWindow
159 | {
160 | [super didMoveToWindow];
161 |
162 | [self updateShouldAnimate];
163 | if (self.shouldAnimate) {
164 | [self startAnimating];
165 | } else {
166 | [self stopAnimating];
167 | }
168 | }
169 |
170 | - (void)setAlpha:(CGFloat)alpha
171 | {
172 | [super setAlpha:alpha];
173 |
174 | [self updateShouldAnimate];
175 | if (self.shouldAnimate) {
176 | [self startAnimating];
177 | } else {
178 | [self stopAnimating];
179 | }
180 | }
181 |
182 | - (void)setHidden:(BOOL)hidden
183 | {
184 | [super setHidden:hidden];
185 |
186 | [self updateShouldAnimate];
187 | if (self.shouldAnimate) {
188 | [self startAnimating];
189 | } else {
190 | [self stopAnimating];
191 | }
192 | }
193 |
194 |
195 | #pragma mark Auto Layout
196 |
197 | - (CGSize)intrinsicContentSize
198 | {
199 | // Default to let UIImageView handle the sizing of its image, and anything else it might consider.
200 | CGSize intrinsicContentSize = [super intrinsicContentSize];
201 |
202 | // If we have have an animated image, use its image size.
203 | // UIImageView's intrinsic content size seems to be the size of its image. The obvious approach, simply calling `-invalidateIntrinsicContentSize` when setting an animated image, results in UIImageView steadfastly returning `{UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric}` for its intrinsicContentSize.
204 | // (Perhaps UIImageView bypasses its `-image` getter in its implementation of `-intrinsicContentSize`, as `-image` is not called after calling `-invalidateIntrinsicContentSize`.)
205 | if (self.animatedImage) {
206 | intrinsicContentSize = self.image.size;
207 | }
208 |
209 | return intrinsicContentSize;
210 | }
211 |
212 |
213 | #pragma mark - UIImageView Method Overrides
214 | #pragma mark Image Data
215 |
216 | - (UIImage *)image
217 | {
218 | UIImage *image = nil;
219 | if (self.animatedImage) {
220 | // Initially set to the poster image.
221 | image = self.currentFrame;
222 | } else {
223 | image = super.image;
224 | }
225 | return image;
226 | }
227 |
228 |
229 | - (void)setImage:(UIImage *)image
230 | {
231 | if (image) {
232 | // Clear out the animated image and implicitly pause animation playback.
233 | self.animatedImage = nil;
234 | }
235 |
236 | super.image = image;
237 | }
238 |
239 |
240 | #pragma mark Animating Images
241 |
242 | - (NSTimeInterval)frameDelayGreatestCommonDivisor
243 | {
244 | // Presision is set to half of the `kFLAnimatedImageDelayTimeIntervalMinimum` in order to minimize frame dropping.
245 | const NSTimeInterval kGreatestCommonDivisorPrecision = 2.0 / kFLAnimatedImageDelayTimeIntervalMinimum;
246 |
247 | NSArray *delays = self.animatedImage.delayTimesForIndexes.allValues;
248 |
249 | // Scales the frame delays by `kGreatestCommonDivisorPrecision`
250 | // then converts it to an UInteger for in order to calculate the GCD.
251 | NSUInteger scaledGCD = lrint([delays.firstObject floatValue] * kGreatestCommonDivisorPrecision);
252 | for (NSNumber *value in delays) {
253 | scaledGCD = gcd(lrint([value floatValue] * kGreatestCommonDivisorPrecision), scaledGCD);
254 | }
255 |
256 | // Reverse to scale to get the value back into seconds.
257 | return scaledGCD / kGreatestCommonDivisorPrecision;
258 | }
259 |
260 |
261 | static NSUInteger gcd(NSUInteger a, NSUInteger b)
262 | {
263 | // http://en.wikipedia.org/wiki/Greatest_common_divisor
264 | if (a < b) {
265 | return gcd(b, a);
266 | } else if (a == b) {
267 | return b;
268 | }
269 |
270 | while (true) {
271 | NSUInteger remainder = a % b;
272 | if (remainder == 0) {
273 | return b;
274 | }
275 | a = b;
276 | b = remainder;
277 | }
278 | }
279 |
280 |
281 | - (void)startAnimating
282 | {
283 | if (self.animatedImage) {
284 | // Lazily create the display link.
285 | if (!self.displayLink) {
286 | // It is important to note the use of a weak proxy here to avoid a retain cycle. `-displayLinkWithTarget:selector:`
287 | // will retain its target until it is invalidated. We use a weak proxy so that the image view will get deallocated
288 | // independent of the display link's lifetime. Upon image view deallocation, we invalidate the display
289 | // link which will lead to the deallocation of both the display link and the weak proxy.
290 | FLWeakProxy *weakProxy = [FLWeakProxy weakProxyForObject:self];
291 | self.displayLink = [CADisplayLink displayLinkWithTarget:weakProxy selector:@selector(displayDidRefresh:)];
292 |
293 | [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:self.runLoopMode];
294 | }
295 |
296 | // Note: The display link's `.frameInterval` value of 1 (default) means getting callbacks at the refresh rate of the display (~60Hz).
297 | // Setting it to 2 divides the frame rate by 2 and hence calls back at every other display refresh.
298 | const NSTimeInterval kDisplayRefreshRate = 60.0; // 60Hz
299 | self.displayLink.frameInterval = MAX([self frameDelayGreatestCommonDivisor] * kDisplayRefreshRate, 1);
300 |
301 | self.displayLink.paused = NO;
302 | } else {
303 | [super startAnimating];
304 | }
305 | }
306 |
307 | - (void)setRunLoopMode:(NSString *)runLoopMode
308 | {
309 | if (![@[NSDefaultRunLoopMode, NSRunLoopCommonModes] containsObject:runLoopMode]) {
310 | NSAssert(NO, @"Invalid run loop mode: %@", runLoopMode);
311 | _runLoopMode = [[self class] defaultRunLoopMode];
312 | } else {
313 | _runLoopMode = runLoopMode;
314 | }
315 | }
316 |
317 | - (void)stopAnimating
318 | {
319 | if (self.animatedImage) {
320 | self.displayLink.paused = YES;
321 | } else {
322 | [super stopAnimating];
323 | }
324 | }
325 |
326 |
327 | - (BOOL)isAnimating
328 | {
329 | BOOL isAnimating = NO;
330 | if (self.animatedImage) {
331 | isAnimating = self.displayLink && !self.displayLink.isPaused;
332 | } else {
333 | isAnimating = [super isAnimating];
334 | }
335 | return isAnimating;
336 | }
337 |
338 |
339 | #pragma mark Highlighted Image Unsupport
340 |
341 | - (void)setHighlighted:(BOOL)highlighted
342 | {
343 | // Highlighted image is unsupported for animated images, but implementing it breaks the image view when embedded in a UICollectionViewCell.
344 | if (!self.animatedImage) {
345 | [super setHighlighted:highlighted];
346 | }
347 | }
348 |
349 |
350 | #pragma mark - Private Methods
351 | #pragma mark Animation
352 |
353 | // Don't repeatedly check our window & superview in `-displayDidRefresh:` for performance reasons.
354 | // Just update our cached value whenever the animated image or visibility (window, superview, hidden, alpha) is changed.
355 | - (void)updateShouldAnimate
356 | {
357 | BOOL isVisible = self.window && self.superview && ![self isHidden] && self.alpha > 0.0;
358 | self.shouldAnimate = self.animatedImage && isVisible;
359 | }
360 |
361 |
362 | - (void)displayDidRefresh:(CADisplayLink *)displayLink
363 | {
364 | // If for some reason a wild call makes it through when we shouldn't be animating, bail.
365 | // Early return!
366 | if (!self.shouldAnimate) {
367 | FLLog(FLLogLevelWarn, @"Trying to animate image when we shouldn't: %@", self);
368 | return;
369 | }
370 |
371 | NSNumber *delayTimeNumber = [self.animatedImage.delayTimesForIndexes objectForKey:@(self.currentFrameIndex)];
372 | // If we don't have a frame delay (e.g. corrupt frame), don't update the view but skip the playhead to the next frame (in else-block).
373 | if (delayTimeNumber) {
374 | NSTimeInterval delayTime = [delayTimeNumber floatValue];
375 | // If we have a nil image (e.g. waiting for frame), don't update the view nor playhead.
376 | UIImage *image = [self.animatedImage imageLazilyCachedAtIndex:self.currentFrameIndex];
377 | if (image) {
378 | FLLog(FLLogLevelVerbose, @"Showing frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage);
379 | self.currentFrame = image;
380 | if (self.needsDisplayWhenImageBecomesAvailable) {
381 | [self.layer setNeedsDisplay];
382 | self.needsDisplayWhenImageBecomesAvailable = NO;
383 | }
384 |
385 | self.accumulator += displayLink.duration * displayLink.frameInterval;
386 |
387 | // While-loop first inspired by & good Karma to: https://github.com/ondalabs/OLImageView/blob/master/OLImageView.m
388 | while (self.accumulator >= delayTime) {
389 | self.accumulator -= delayTime;
390 | self.currentFrameIndex++;
391 | if (self.currentFrameIndex >= self.animatedImage.frameCount) {
392 | // If we've looped the number of times that this animated image describes, stop looping.
393 | self.loopCountdown--;
394 | if (self.loopCompletionBlock) {
395 | self.loopCompletionBlock(self.loopCountdown);
396 | }
397 |
398 | if (self.loopCountdown == 0) {
399 | [self stopAnimating];
400 | return;
401 | }
402 | self.currentFrameIndex = 0;
403 | }
404 | // Calling `-setNeedsDisplay` will just paint the current frame, not the new frame that we may have moved to.
405 | // Instead, set `needsDisplayWhenImageBecomesAvailable` to `YES` -- this will paint the new image once loaded.
406 | self.needsDisplayWhenImageBecomesAvailable = YES;
407 | }
408 | } else {
409 | FLLog(FLLogLevelDebug, @"Waiting for frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage);
410 | #if defined(DEBUG) && DEBUG
411 | if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImageView:waitingForFrame:duration:)]) {
412 | [self.debug_delegate debug_animatedImageView:self waitingForFrame:self.currentFrameIndex duration:(NSTimeInterval)displayLink.duration * displayLink.frameInterval];
413 | }
414 | #endif
415 | }
416 | } else {
417 | self.currentFrameIndex++;
418 | }
419 | }
420 |
421 | + (NSString *)defaultRunLoopMode
422 | {
423 | // Key off `activeProcessorCount` (as opposed to `processorCount`) since the system could shut down cores in certain situations.
424 | return [NSProcessInfo processInfo].activeProcessorCount > 1 ? NSRunLoopCommonModes : NSDefaultRunLoopMode;
425 | }
426 |
427 |
428 | #pragma mark - CALayerDelegate (Informal)
429 | #pragma mark Providing the Layer's Content
430 |
431 | - (void)displayLayer:(CALayer *)layer
432 | {
433 | layer.contents = (__bridge id)self.image.CGImage;
434 | }
435 |
436 |
437 | @end
438 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/FLAnimatedImage/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014-2016 Flipboard
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 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/FLAnimatedImage/README.md:
--------------------------------------------------------------------------------
1 | FLAnimatedImage is a performant animated GIF engine for iOS:
2 |
3 | - Plays multiple GIFs simultaneously with a playback speed comparable to desktop browsers
4 | - Honors variable frame delays
5 | - Behaves gracefully under memory pressure
6 | - Eliminates delays or blocking during the first playback loop
7 | - Interprets the frame delays of fast GIFs the same way modern browsers do
8 |
9 | It's a well-tested [component that powers all GIFs in Flipboard](http://engineering.flipboard.com/2014/05/animated-gif/). To understand its behavior it comes with an interactive demo:
10 |
11 | 
12 |
13 | ## Who is this for?
14 |
15 | - Apps that don't support animated GIFs yet
16 | - Apps that already support animated GIFs but want a higher performance solution
17 | - People who want to tinker with the code ([the corresponding blog post](http://engineering.flipboard.com/2014/05/animated-gif/) is a great place to start; also see the *To Do* section below)
18 |
19 | ## Installation & Usage
20 |
21 | FLAnimatedImage is a well encapsulated drop-in component. Simply replace your `UIImageView` instances with instances of `FLAnimatedImageView` to get animated GIF support. There is no central cache or state to manage.
22 |
23 | If using CocoaPods, the quickest way to try it out is to type this on the command line:
24 |
25 | ```shell
26 | $ pod try FLAnimatedImage
27 | ```
28 |
29 | To add it to your app, copy the two classes `FLAnimatedImage.h/.m` and `FLAnimatedImageView.h/.m` into your Xcode project or add via [CocoaPods](http://cocoapods.org) by adding this to your Podfile:
30 |
31 | ```ruby
32 | pod 'FLAnimatedImage', '~> 1.0'
33 | ```
34 |
35 | If using [Carthage](https://github.com/Carthage/Carthage), add following line into your `Cartfile`
36 |
37 | ```
38 | github "Flipboard/FLAnimatedImage"
39 | ```
40 |
41 | In your code, `#import "FLAnimatedImage.h"`, create an image from an animated GIF, and setup the image view to display it:
42 |
43 | ```objective-c
44 | FLAnimatedImage *image = [FLAnimatedImage animatedImageWithGIFData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif"]]];
45 | FLAnimatedImageView *imageView = [[FLAnimatedImageView alloc] init];
46 | imageView.animatedImage = image;
47 | imageView.frame = CGRectMake(0.0, 0.0, 100.0, 100.0);
48 | [self.view addSubview:imageView];
49 | ```
50 |
51 | It's flexible to integrate in your custom image loading stack and backwards compatible to iOS 6.
52 |
53 | It uses ARC and the Apple frameworks `QuartzCore`, `ImageIO`, `MobileCoreServices`, and `CoreGraphics`.
54 |
55 | It is capable of fine-grained logging. A block can be set on `FLAnimatedImage` that's invoked when logging occurs with various log levels via the `+setLogBlock:logLevel:` method. For example:
56 |
57 | ```objective-c
58 | // Set up FLAnimatedImage logging.
59 | [FLAnimatedImage setLogBlock:^(NSString *logString, FLLogLevel logLevel) {
60 | // Using NSLog
61 | NSLog(@"%@", logString);
62 |
63 | // ...or CocoaLumberjackLogger only logging warnings and errors
64 | if (logLevel == FLLogLevelError) {
65 | DDLogError(@"%@", logString);
66 | } else if (logLevel == FLLogLevelWarn) {
67 | DDLogWarn(@"%@", logString);
68 | }
69 | } logLevel:FLLogLevelWarn];
70 | ```
71 |
72 | Since FLAnimatedImage is licensed under MIT, it's compatible with the terms of using it for any app on the App Store.
73 |
74 | ## To Do
75 | - Support other animated image formats such as APNG or WebP (WebP support implemented [here](https://github.com/Flipboard/FLAnimatedImage/pull/86))
76 | - Integration into network libraries and image caches
77 | - Investigate whether `FLAnimatedImage` should become a `UIImage` subclass
78 | - Smarter buffering
79 | - Bring demo app to iPhone
80 |
81 | This has successfully shipped to many people as is, but please do come with your questions, issues and pull requests!
82 |
83 | ## Select apps using FLAnimatedImage
84 | - [Dropbox](https://www.dropbox.com)
85 | - [Medium](https://medium.com)
86 | - [Facebook](https://facebook.com)
87 | - [Pinterest](https://pinterest.com)
88 | - [LiveBooth](http://www.liveboothapp.com)
89 | - [Design Shots](https://itunes.apple.com/app/id792517951)
90 | - [lWlVl Festival](http://lwlvl.com)
91 | - [Close-up](http://closeu.pe)
92 | - [Zip Code Finder](https://itunes.apple.com/app/id893031254)
93 | - [getGIF](https://itunes.apple.com/app/id964784701)
94 | - [Giffage](http://giffage.com)
95 | - [Flipboard](https://flipboard.com)
96 | - [Gifalicious](https://itunes.apple.com/us/app/gifalicious-see-your-gifs/id965346708?mt=8)
97 | - [Slack](https://slack.com/)
98 | - [Telegram](https://telegram.org/)
99 | - [HashPhotos](https://itunes.apple.com/app/id685784609)
100 | - [Ello](https://ello.co/)
101 | - [Dumpert](http://dumpert.nl)
102 |
103 | If you're using FLAnimatedImage in your app please open a PR to add it to this list!
104 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - FLAnimatedImage (1.0.12)
3 |
4 | DEPENDENCIES:
5 | - FLAnimatedImage (~> 1.0)
6 |
7 | SPEC REPOS:
8 | https://github.com/cocoapods/specs.git:
9 | - FLAnimatedImage
10 |
11 | SPEC CHECKSUMS:
12 | FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
13 |
14 | PODFILE CHECKSUM: 2c6c271e7aac4c59b512521ef1971995fb6ea117
15 |
16 | COCOAPODS: 1.5.2
17 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Pods.xcodeproj/xcuserdata/.xcuserdatad/xcschemes/FLAnimatedImage.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Pods.xcodeproj/xcuserdata/.xcuserdatad/xcschemes/Pods-BlockerExtension.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Pods.xcodeproj/xcuserdata/.xcuserdatad/xcschemes/Pods-HelloGoodbyeiOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Pods.xcodeproj/xcuserdata/.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | FLAnimatedImage.xcscheme
8 |
9 | isShown
10 |
11 |
12 | Pods-BlockerExtension.xcscheme
13 |
14 | isShown
15 |
16 |
17 | Pods-HelloGoodbyeiOS.xcscheme
18 |
19 | isShown
20 |
21 |
22 |
23 | SuppressBuildableAutocreation
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Pods.xcodeproj/xcuserdata/bruceroettgers.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | FLAnimatedImage.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 2
11 |
12 | Pods-BlockerExtension.xcscheme_^#shared#^_
13 |
14 | orderHint
15 | 3
16 |
17 | Pods-HelloGoodbyeiOS.xcscheme_^#shared#^_
18 |
19 | orderHint
20 | 4
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_FLAnimatedImage : NSObject
3 | @end
4 | @implementation PodsDummy_FLAnimatedImage
5 | @end
6 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 | #import "FLAnimatedImage.h"
14 | #import "FLAnimatedImageView.h"
15 |
16 | FOUNDATION_EXPORT double FLAnimatedImageVersionNumber;
17 | FOUNDATION_EXPORT const unsigned char FLAnimatedImageVersionString[];
18 |
19 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.modulemap:
--------------------------------------------------------------------------------
1 | framework module FLAnimatedImage {
2 | umbrella header "FLAnimatedImage-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig:
--------------------------------------------------------------------------------
1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage
2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
3 | OTHER_LDFLAGS = -framework "CoreGraphics" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore"
4 | PODS_BUILD_DIR = ${BUILD_DIR}
5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
6 | PODS_ROOT = ${SRCROOT}
7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/FLAnimatedImage
8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
9 | SKIP_INSTALL = YES
10 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/FLAnimatedImage/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.12
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-BlockerExtension/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 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-BlockerExtension/Pods-BlockerExtension-acknowledgements.markdown:
--------------------------------------------------------------------------------
1 | # Acknowledgements
2 | This application makes use of the following third party libraries:
3 | Generated by CocoaPods - https://cocoapods.org
4 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-BlockerExtension/Pods-BlockerExtension-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 | Generated by CocoaPods - https://cocoapods.org
18 | Title
19 |
20 | Type
21 | PSGroupSpecifier
22 |
23 |
24 | StringsTable
25 | Acknowledgements
26 | Title
27 | Acknowledgements
28 |
29 |
30 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-BlockerExtension/Pods-BlockerExtension-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_BlockerExtension : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_BlockerExtension
5 | @end
6 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-BlockerExtension/Pods-BlockerExtension-resources.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 | set -u
4 | set -o pipefail
5 |
6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then
7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy
8 | # resources to, so exit 0 (signalling the script phase was successful).
9 | exit 0
10 | fi
11 |
12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
13 |
14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
15 | > "$RESOURCES_TO_COPY"
16 |
17 | XCASSET_FILES=()
18 |
19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
22 |
23 | case "${TARGETED_DEVICE_FAMILY:-}" in
24 | 1,2)
25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
26 | ;;
27 | 1)
28 | TARGET_DEVICE_ARGS="--target-device iphone"
29 | ;;
30 | 2)
31 | TARGET_DEVICE_ARGS="--target-device ipad"
32 | ;;
33 | 3)
34 | TARGET_DEVICE_ARGS="--target-device tv"
35 | ;;
36 | 4)
37 | TARGET_DEVICE_ARGS="--target-device watch"
38 | ;;
39 | *)
40 | TARGET_DEVICE_ARGS="--target-device mac"
41 | ;;
42 | esac
43 |
44 | install_resource()
45 | {
46 | if [[ "$1" = /* ]] ; then
47 | RESOURCE_PATH="$1"
48 | else
49 | RESOURCE_PATH="${PODS_ROOT}/$1"
50 | fi
51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then
52 | cat << EOM
53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
54 | EOM
55 | exit 1
56 | fi
57 | case $RESOURCE_PATH in
58 | *.storyboard)
59 | 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}" || true
60 | 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}
61 | ;;
62 | *.xib)
63 | 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}" || true
64 | 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}
65 | ;;
66 | *.framework)
67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
71 | ;;
72 | *.xcdatamodel)
73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true
74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
75 | ;;
76 | *.xcdatamodeld)
77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true
78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
79 | ;;
80 | *.xcmappingmodel)
81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true
82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
83 | ;;
84 | *.xcassets)
85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
87 | ;;
88 | *)
89 | echo "$RESOURCE_PATH" || true
90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
91 | ;;
92 | esac
93 | }
94 |
95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
100 | fi
101 | rm -f "$RESOURCES_TO_COPY"
102 |
103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ]
104 | then
105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets).
106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
107 | while read line; do
108 | if [[ $line != "${PODS_ROOT}*" ]]; then
109 | XCASSET_FILES+=("$line")
110 | fi
111 | done <<<"$OTHER_XCASSETS"
112 |
113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then
114 | 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}"
115 | else
116 | 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}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist"
117 | fi
118 | fi
119 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-BlockerExtension/Pods-BlockerExtension-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_BlockerExtensionVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_BlockerExtensionVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-BlockerExtension/Pods-BlockerExtension.debug.xcconfig:
--------------------------------------------------------------------------------
1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks'
3 | PODS_BUILD_DIR = ${BUILD_DIR}
4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
6 | PODS_ROOT = ${SRCROOT}/Pods
7 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-BlockerExtension/Pods-BlockerExtension.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_BlockerExtension {
2 | umbrella header "Pods-BlockerExtension-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-BlockerExtension/Pods-BlockerExtension.release.xcconfig:
--------------------------------------------------------------------------------
1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks'
3 | PODS_BUILD_DIR = ${BUILD_DIR}
4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
6 | PODS_ROOT = ${SRCROOT}/Pods
7 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/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 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/Pods-HelloGoodbyeiOS-acknowledgements.markdown:
--------------------------------------------------------------------------------
1 | # Acknowledgements
2 | This application makes use of the following third party libraries:
3 |
4 | ## FLAnimatedImage
5 |
6 | The MIT License (MIT)
7 |
8 | Copyright (c) 2014-2016 Flipboard
9 |
10 | Permission is hereby granted, free of charge, to any person obtaining a copy
11 | of this software and associated documentation files (the "Software"), to deal
12 | in the Software without restriction, including without limitation the rights
13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 | copies of the Software, and to permit persons to whom the Software is
15 | furnished to do so, subject to the following conditions:
16 |
17 | The above copyright notice and this permission notice shall be included in all
18 | copies or substantial portions of the Software.
19 |
20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 | SOFTWARE.
27 |
28 | Generated by CocoaPods - https://cocoapods.org
29 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/Pods-HelloGoodbyeiOS-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 | The MIT License (MIT)
18 |
19 | Copyright (c) 2014-2016 Flipboard
20 |
21 | Permission is hereby granted, free of charge, to any person obtaining a copy
22 | of this software and associated documentation files (the "Software"), to deal
23 | in the Software without restriction, including without limitation the rights
24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
25 | copies of the Software, and to permit persons to whom the Software is
26 | furnished to do so, subject to the following conditions:
27 |
28 | The above copyright notice and this permission notice shall be included in all
29 | copies or substantial portions of the Software.
30 |
31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
37 | SOFTWARE.
38 |
39 | License
40 | MIT
41 | Title
42 | FLAnimatedImage
43 | Type
44 | PSGroupSpecifier
45 |
46 |
47 | FooterText
48 | Generated by CocoaPods - https://cocoapods.org
49 | Title
50 |
51 | Type
52 | PSGroupSpecifier
53 |
54 |
55 | StringsTable
56 | Acknowledgements
57 | Title
58 | Acknowledgements
59 |
60 |
61 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/Pods-HelloGoodbyeiOS-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_HelloGoodbyeiOS : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_HelloGoodbyeiOS
5 | @end
6 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/Pods-HelloGoodbyeiOS-frameworks.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 | set -u
4 | set -o pipefail
5 |
6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
8 | # frameworks to, so exit 0 (signalling the script phase was successful).
9 | exit 0
10 | fi
11 |
12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
14 |
15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
17 |
18 | # Used as a return value for each invocation of `strip_invalid_archs` function.
19 | STRIP_BINARY_RETVAL=0
20 |
21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
24 |
25 | # Copies and strips a vendored framework
26 | install_framework()
27 | {
28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
29 | local source="${BUILT_PRODUCTS_DIR}/$1"
30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
32 | elif [ -r "$1" ]; then
33 | local source="$1"
34 | fi
35 |
36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
37 |
38 | if [ -L "${source}" ]; then
39 | echo "Symlinked..."
40 | source="$(readlink "${source}")"
41 | fi
42 |
43 | # Use filter instead of exclude so missing patterns don't throw errors.
44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
46 |
47 | local basename
48 | basename="$(basename -s .framework "$1")"
49 | binary="${destination}/${basename}.framework/${basename}"
50 | if ! [ -r "$binary" ]; then
51 | binary="${destination}/${basename}"
52 | fi
53 |
54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
56 | strip_invalid_archs "$binary"
57 | fi
58 |
59 | # Resign the code if required by the build settings to avoid unstable apps
60 | code_sign_if_enabled "${destination}/$(basename "$1")"
61 |
62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
64 | local swift_runtime_libs
65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]})
66 | for lib in $swift_runtime_libs; do
67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
69 | code_sign_if_enabled "${destination}/${lib}"
70 | done
71 | fi
72 | }
73 |
74 | # Copies and strips a vendored dSYM
75 | install_dsym() {
76 | local source="$1"
77 | if [ -r "$source" ]; then
78 | # Copy the dSYM into a the targets temp dir.
79 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
80 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
81 |
82 | local basename
83 | basename="$(basename -s .framework.dSYM "$source")"
84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}"
85 |
86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then
88 | strip_invalid_archs "$binary"
89 | fi
90 |
91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then
92 | # Move the stripped file into its final destination.
93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
95 | else
96 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM"
98 | fi
99 | fi
100 | }
101 |
102 | # Signs a framework with the provided identity
103 | code_sign_if_enabled() {
104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
105 | # Use the current code_sign_identitiy
106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
108 |
109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
110 | code_sign_cmd="$code_sign_cmd &"
111 | fi
112 | echo "$code_sign_cmd"
113 | eval "$code_sign_cmd"
114 | fi
115 | }
116 |
117 | # Strip invalid architectures
118 | strip_invalid_archs() {
119 | binary="$1"
120 | # Get architectures for current target binary
121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
122 | # Intersect them with the architectures we are building for
123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
124 | # If there are no archs supported by this binary then warn the user
125 | if [[ -z "$intersected_archs" ]]; then
126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
127 | STRIP_BINARY_RETVAL=0
128 | return
129 | fi
130 | stripped=""
131 | for arch in $binary_archs; do
132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then
133 | # Strip non-valid architectures in-place
134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1
135 | stripped="$stripped $arch"
136 | fi
137 | done
138 | if [[ "$stripped" ]]; then
139 | echo "Stripped $binary of architectures:$stripped"
140 | fi
141 | STRIP_BINARY_RETVAL=1
142 | }
143 |
144 |
145 | if [[ "$CONFIGURATION" == "Debug" ]]; then
146 | install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework"
147 | fi
148 | if [[ "$CONFIGURATION" == "Release" ]]; then
149 | install_framework "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework"
150 | fi
151 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
152 | wait
153 | fi
154 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/Pods-HelloGoodbyeiOS-resources.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 | set -u
4 | set -o pipefail
5 |
6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then
7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy
8 | # resources to, so exit 0 (signalling the script phase was successful).
9 | exit 0
10 | fi
11 |
12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
13 |
14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
15 | > "$RESOURCES_TO_COPY"
16 |
17 | XCASSET_FILES=()
18 |
19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
22 |
23 | case "${TARGETED_DEVICE_FAMILY:-}" in
24 | 1,2)
25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
26 | ;;
27 | 1)
28 | TARGET_DEVICE_ARGS="--target-device iphone"
29 | ;;
30 | 2)
31 | TARGET_DEVICE_ARGS="--target-device ipad"
32 | ;;
33 | 3)
34 | TARGET_DEVICE_ARGS="--target-device tv"
35 | ;;
36 | 4)
37 | TARGET_DEVICE_ARGS="--target-device watch"
38 | ;;
39 | *)
40 | TARGET_DEVICE_ARGS="--target-device mac"
41 | ;;
42 | esac
43 |
44 | install_resource()
45 | {
46 | if [[ "$1" = /* ]] ; then
47 | RESOURCE_PATH="$1"
48 | else
49 | RESOURCE_PATH="${PODS_ROOT}/$1"
50 | fi
51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then
52 | cat << EOM
53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
54 | EOM
55 | exit 1
56 | fi
57 | case $RESOURCE_PATH in
58 | *.storyboard)
59 | 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}" || true
60 | 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}
61 | ;;
62 | *.xib)
63 | 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}" || true
64 | 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}
65 | ;;
66 | *.framework)
67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true
70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
71 | ;;
72 | *.xcdatamodel)
73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true
74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
75 | ;;
76 | *.xcdatamodeld)
77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true
78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
79 | ;;
80 | *.xcmappingmodel)
81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true
82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
83 | ;;
84 | *.xcassets)
85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
87 | ;;
88 | *)
89 | echo "$RESOURCE_PATH" || true
90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
91 | ;;
92 | esac
93 | }
94 |
95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
100 | fi
101 | rm -f "$RESOURCES_TO_COPY"
102 |
103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ]
104 | then
105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets).
106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
107 | while read line; do
108 | if [[ $line != "${PODS_ROOT}*" ]]; then
109 | XCASSET_FILES+=("$line")
110 | fi
111 | done <<<"$OTHER_XCASSETS"
112 |
113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then
114 | 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}"
115 | else
116 | 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}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist"
117 | fi
118 | fi
119 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/Pods-HelloGoodbyeiOS-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_HelloGoodbyeiOSVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_HelloGoodbyeiOSVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/Pods-HelloGoodbyeiOS.debug.xcconfig:
--------------------------------------------------------------------------------
1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage"
2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers"
5 | OTHER_LDFLAGS = $(inherited) -framework "FLAnimatedImage"
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
9 | PODS_ROOT = ${SRCROOT}/Pods
10 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/Pods-HelloGoodbyeiOS.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_HelloGoodbyeiOS {
2 | umbrella header "Pods-HelloGoodbyeiOS-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/HelloGoodbyeiOS/Pods/Target Support Files/Pods-HelloGoodbyeiOS/Pods-HelloGoodbyeiOS.release.xcconfig:
--------------------------------------------------------------------------------
1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage"
2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage/FLAnimatedImage.framework/Headers"
5 | OTHER_LDFLAGS = $(inherited) -framework "FLAnimatedImage"
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
9 | PODS_ROOT = ${SRCROOT}/Pods
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Discontinued
2 | Hello, Goodbye is no longer maintained. If you're interested in maintaining this project message me at bruce+hg (at) roettgers (dot) co
3 |
4 | # Hello, Goodbye
5 |
6 | A browser extension that blocks annoying chat widgets ([example: intercom](https://intercom.com)). Available for Chrome, Firefox and Safari and as a blocklist to integrate into existing blockers.
7 |
8 | [Download](https://hellogoodbye.app/?ref=github.com)
9 |
10 | ## Support
11 |
12 | Do you like this project?
13 |
14 | You can choose to donate on [Buy me a coffee](https://www.buymeacoffee.com/bruceroet)
15 |
16 | ## Contributing
17 |
18 | Thank you for contributing to the extension.
19 |
20 | **If you just want to add a quick fix:** Edit the file and start a pull request.
21 |
22 | **If you found a bug or would like to suggest a new feature:** Please check if there is an existing open issue, concerning yours and open a new one if there isn't.
23 |
24 | **If you would like to just help out or work on an existing issue:** Please navigate to the issues tab and comment on an existing open issue, that you would like to work on that.
25 |
26 | Please wait for me to approve your issue or request, before beginning work.
27 | Fork the repository and follow the installation instructions below on how to get the extension running on your machine.
28 | When you're done open a pull request to the dev branch.
29 |
30 | ## Installation
31 |
32 | If you just want to install the extension, please [download it here](https://hellogoodbye.app/?ref=github.com). If you want to contribute to the extension, please follow these instructions.
33 |
34 | 1. Clone this repository
35 | 2. `npm install` (this is to automatically apply code formatting before you commit)
36 |
37 | ### On Chrome
38 |
39 | 2. Open `chrome://extensions` in Chrome.
40 | 3. Activate "Developer Mode"
41 | 4. Choose "Load Unpacked"
42 | 5. Choose the Chrome Folder
43 |
44 | Keep this website open. You will need to press the reload button after changes.
45 |
46 | ### On Firefox
47 |
48 | 2. zip the contents of the "Chrome" folder. Not the folder itself
49 | 3. Navigate to `about:debugging#/runtime/this-firefox` in Firefox
50 | 4. Choose "Load Temporary Add-On"
51 | 5. Select the zip file you just created.
52 |
53 | You will need to re-zip the contents of the "Chrome" folder, after you made changes. If you replace the old zip file with the new one, you will be able to simply press "reload" to see changes in Firefox.
54 |
55 | ## Supporters
56 |
57 | Thank you to everyone supporting me by contributing to this repository or buying me a chai tea on [Buy me a coffee](https://buymeacoff.ee/bruceroet):
58 |
59 | - @CohanRobinson
60 | - Buy me a coffee Crew
61 | - @josephmxm
62 | - Stéphane
63 | - Sunny Singh
64 | - Tucker
65 | - @troyd
66 | - Evan
67 | - Fajar Siddiq
68 |
69 | ## Author
70 |
71 | [Bruce Roettgers](mailto:hi@bruceroettgers.me)
72 |
--------------------------------------------------------------------------------
/Safari/BlockerExtension/BlockerExtension.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Safari/BlockerExtension/ContentBlockerRequestHandler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentBlockerRequestHandler.swift
3 | // BlockerExtension
4 | //
5 | // Created by Bruce Roettgers on 07.04.19.
6 | // Copyright © 2019 Dirk Hulverscheidt. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ContentBlockerRequestHandler: NSObject, NSExtensionRequestHandling {
12 |
13 | func beginRequest(with context: NSExtensionContext) {
14 | let attachment = NSItemProvider(contentsOf: Bundle.main.url(forResource: "blockerList", withExtension: "json"))!
15 |
16 | let item = NSExtensionItem()
17 | item.attachments = [attachment]
18 |
19 | context.completeRequest(returningItems: [item], completionHandler: nil)
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/Safari/BlockerExtension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Hello, Goodbye
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | XPC!
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 6
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSExtension
26 |
27 | NSExtensionPointIdentifier
28 | com.apple.Safari.content-blocker
29 | NSExtensionPrincipalClass
30 | $(PRODUCT_MODULE_NAME).ContentBlockerRequestHandler
31 |
32 | NSHumanReadableCopyright
33 | Copyright © 2019 Dirk Hulverscheidt. All rights reserved.
34 | NSHumanReadableDescription
35 | This extension blocks annoying chat widgets.
36 |
37 |
38 |
--------------------------------------------------------------------------------
/Safari/BlockerExtension/backupList.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "action": {
4 | "type": "block"
5 | },
6 | "trigger": {
7 | "url-filter": "^[^:]+://+([^:/]+\.)?widget\.intercom\.io[:/]"
8 | }
9 | },
10 | {
11 | "action": {
12 | "type": "block"
13 | },
14 | "trigger": {
15 | "url-filter": "connect\.facebook\.net/en_US/sdk/xfbml\.customerchat\.js",
16 | "resource-type": ["script"]
17 | }
18 | },
19 | {
20 | "action": {
21 | "type": "block"
22 | },
23 | "trigger": {
24 | "url-filter": "assets\.producthunt\.com/assets/upwigloader\.js",
25 | "resource-type": ["script"]
26 | }
27 | },
28 | {
29 | "action": {
30 | "type": "block"
31 | },
32 | "trigger": {
33 | "url-filter": "js\.driftt\.com/include/.",
34 | "resource-type": ["script"]
35 | }
36 | },
37 | {
38 | "action": {
39 | "type": "block"
40 | },
41 | "trigger": {
42 | "url-filter": "^(http|https)://.\.crisp\.chat/.",
43 | "resource-type": ["script"]
44 | }
45 | },
46 | {
47 | "action": {
48 | "type": "block"
49 | },
50 | "trigger": {
51 | "url-filter": ".\.intergram\.xyz/js/.",
52 | "resource-type": ["script"]
53 | }
54 | },
55 | {
56 | "action": {
57 | "type": "block"
58 | },
59 | "trigger": {
60 | "url-filter": "widget\.mfy\.im/.",
61 | "resource-type": ["script"]
62 | }
63 | },
64 | {
65 | "action": {
66 | "type": "block"
67 | },
68 | "trigger": {
69 | "url-filter": "connect\.podium\.com/.",
70 | "resource-type": ["script"]
71 | }
72 | },
73 | {
74 | "action": {
75 | "type": "block"
76 | },
77 | "trigger": {
78 | "url-filter": "js\.usemessages\.com/.",
79 | "resource-type": ["script"]
80 | }
81 | },
82 | {
83 | "action": {
84 | "type": "block"
85 | },
86 | "trigger": {
87 | "url-filter": "static\.getchipbot\.com/.",
88 | "resource-type": ["script"]
89 | }
90 | },
91 | {
92 | "action": {
93 | "type": "block"
94 | },
95 | "trigger": {
96 | "url-filter": "static\.zdassets\.com/ekr/.",
97 | "resource-type": ["script"]
98 | }
99 | },
100 | {
101 | "action": {
102 | "type": "block"
103 | },
104 | "trigger": {
105 | "url-filter": "www\.couchbase\.com/webfiles/1552355627964/js/contact-popup-form\.js",
106 | "resource-type": ["script"]
107 | }
108 | },
109 | {
110 | "action": {
111 | "type": "block"
112 | },
113 | "trigger": {
114 | "url-filter": "assetscdn-wchat\.freshchat\.com/.",
115 | "resource-type": ["script"]
116 | }
117 | },
118 | {
119 | "action": {
120 | "type": "block"
121 | },
122 | "trigger": {
123 | "url-filter": "wchat\.freshchat\.com/.",
124 | "resource-type": ["script"]
125 | }
126 | },
127 | {
128 | "action": {
129 | "type": "block"
130 | },
131 | "trigger": {
132 | "url-filter": "code\.jivosite\.com/script/widget/.",
133 | "resource-type": ["script"]
134 | }
135 | },
136 | {
137 | "action": {
138 | "type": "block"
139 | },
140 | "trigger": {
141 | "url-filter": "code\.tidio\.co/.",
142 | "resource-type": ["script"]
143 | }
144 | },
145 | {
146 | "action": {
147 | "type": "block"
148 | },
149 | "trigger": {
150 | "url-filter": ".\.user\.com/static/js/.",
151 | "resource-type": ["script"]
152 | }
153 | },
154 | {
155 | "action": {
156 | "type": "block"
157 | "url-filter": ".*"
158 | },
159 | "trigger": {
160 | "url-filter": "secure\.livechatinc\.com/.",
161 | "resource-type": ["script"]
162 | }
163 | },
164 | {
165 | "action": {
166 | "type": "block"
167 | },
168 | "trigger": {
169 | "url-filter": "justanswer\.com/revizely/2/core/ja-com\.js",
170 | "resource-type": ["script"]
171 | }
172 | },
173 | {
174 | "action": {
175 | "type": "block"
176 | },
177 | "trigger": {
178 | "url-filter": "code\.snapengage\.com/.",
179 | "resource-type": ["script"]
180 | }
181 | },
182 | {
183 | "action": {
184 | "type": "block"
185 | },
186 | "trigger": {
187 | "url-filter": "sdk\.inbenta\.io/chatbot/.",
188 | "resource-type": ["script"]
189 | }
190 | },
191 | {
192 | "action": {
193 | "type": "block"
194 | },
195 | "trigger": {
196 | "url-filter": "pi2\.movoto\.com/1\.7\.654/javascripts/desktop/movoto\.min\.js",
197 | "resource-type": ["script"]
198 | }
199 | },
200 | {
201 | "action": {
202 | "type": "block"
203 | },
204 | "trigger": {
205 | "url-filter": ".\.zopim\.com/.",
206 | "resource-type": ["script"]
207 | }
208 | },
209 | }
210 | ]
211 |
--------------------------------------------------------------------------------
/Safari/BlockerExtension/blockerList.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "trigger": {
4 | "url-filter": "widget.intercom.io",
5 | "resource-type": ["script"]
6 | },
7 | "action": {
8 | "type": "block"
9 | }
10 | },
11 | {
12 | "trigger": {
13 | "url-filter": "js.driftt.com",
14 | "resource-type": ["script"]
15 | },
16 | "action": {
17 | "type": "block"
18 | }
19 | },
20 | {
21 | "trigger": {
22 | "url-filter": "crisp.chat",
23 | "resource-type": ["script"]
24 | },
25 | "action": {
26 | "type": "block"
27 | }
28 | },
29 | {
30 | "trigger": {
31 | "url-filter": "intergram.xyz",
32 | "resource-type": ["script"]
33 | },
34 | "action": {
35 | "type": "block"
36 | }
37 | },
38 | {
39 | "trigger": {
40 | "url-filter": "widget.mfy.im",
41 | "resource-type": ["script"]
42 | },
43 | "action": {
44 | "type": "block"
45 | }
46 | },
47 | {
48 | "trigger": {
49 | "url-filter": "static.getchipbot.com",
50 | "resource-type": ["script"]
51 | },
52 | "action": {
53 | "type": "block"
54 | }
55 | },
56 | {
57 | "trigger": {
58 | "url-filter": "static.zdassets.com/ekr/snippet.js",
59 | "resource-type": ["script"]
60 | },
61 | "action": {
62 | "type": "block"
63 | }
64 | },
65 | {
66 | "trigger": {
67 | "url-filter": "assetscdn-wchat.freshchat.com",
68 | "resource-type": ["script"]
69 | },
70 | "action": {
71 | "type": "block"
72 | }
73 | },
74 | {
75 | "trigger": {
76 | "url-filter": "wchat.freshchat.com",
77 | "resource-type": ["script"]
78 | },
79 | "action": {
80 | "type": "block"
81 | }
82 | },
83 | {
84 | "trigger": {
85 | "url-filter": "code.jivosite.com/script/widget/",
86 | "resource-type": ["script"]
87 | },
88 | "action": {
89 | "type": "block"
90 | }
91 | },
92 | {
93 | "trigger": {
94 | "url-filter": "code.tidio.co",
95 | "resource-type": ["script"]
96 | },
97 | "action": {
98 | "type": "block"
99 | }
100 | },
101 | {
102 | "trigger": {
103 | "url-filter": "user.com/static/js/",
104 | "resource-type": ["script"]
105 | },
106 | "action": {
107 | "type": "block"
108 | }
109 | },
110 | {
111 | "trigger": {
112 | "url-filter": "secure.livechatinc.com",
113 | "resource-type": ["script"]
114 | },
115 | "action": {
116 | "type": "block"
117 | }
118 | },
119 | {
120 | "trigger": {
121 | "url-filter": "sdk.inbenta.io/chatbot",
122 | "resource-type": ["script"]
123 | },
124 | "action": {
125 | "type": "block"
126 | }
127 | },
128 | {
129 | "trigger": {
130 | "url-filter": "code.snapengage.com",
131 | "resource-type": ["script"]
132 | },
133 | "action": {
134 | "type": "block"
135 | }
136 | },
137 | {
138 | "trigger": {
139 | "url-filter": "pi2.movoto.com",
140 | "resource-type": ["script"]
141 | },
142 | "action": {
143 | "type": "block"
144 | }
145 | },
146 | {
147 | "trigger": {
148 | "url-filter": "zopim.com",
149 | "resource-type": ["script"]
150 | },
151 | "action": {
152 | "type": "block"
153 | }
154 | },
155 | {
156 | "trigger": {
157 | "url-filter": "cdn.gubagoo.io",
158 | "resource-type": ["script"]
159 | },
160 | "action": {
161 | "type": "block"
162 | }
163 | },
164 | {
165 | "trigger": {
166 | "url-filter": "leadconnect.ipmaxi.se",
167 | "resource-type": ["script"]
168 | },
169 | "action": {
170 | "type": "block"
171 | }
172 | },
173 | {
174 | "trigger": {
175 | "url-filter": "static.small.chat/messenger.js",
176 | "resource-type": ["script"]
177 | },
178 | "action": {
179 | "type": "block"
180 | }
181 | },
182 | {
183 | "trigger": {
184 | "url-filter": "smartsupp-widget-161959.c.cdn77.org/build/smartchat-2.3.20.min.js",
185 | "resource-type": ["script"]
186 | },
187 | "action": {
188 | "type": "block"
189 | }
190 | },
191 | {
192 | "trigger": {
193 | "url-filter": "plugins.help.com",
194 | "resource-type": ["script"]
195 | },
196 | "action": {
197 | "type": "block"
198 | }
199 | },
200 | {
201 | "trigger": {
202 | "url-filter": "js.gs-chat.com",
203 | "resource-type": ["script"]
204 | },
205 | "action": {
206 | "type": "block"
207 | }
208 | },
209 | {
210 | "trigger": {
211 | "url-filter": "widget.customerly.io",
212 | "resource-type": ["script"]
213 | },
214 | "action": {
215 | "type": "block"
216 | }
217 | },
218 | {
219 | "trigger": {
220 | "url-filter": "consent-manager.metomic.io/embed.js",
221 | "resource-type": ["script"]
222 | },
223 | "action": {
224 | "type": "block"
225 | }
226 | },
227 | {
228 | "trigger": {
229 | "url-filter": ".PrivacyPolicies.com/cookie-consent",
230 | "resource-type": ["script"]
231 | },
232 | "action": {
233 | "type": "block"
234 | }
235 | },
236 | {
237 | "trigger": {
238 | "url-filter": "cdn.jsdelivr.net/npm/cookie-bar/",
239 | "resource-type": ["script"]
240 | },
241 | "action": {
242 | "type": "block"
243 | }
244 | },
245 | {
246 | "trigger": {
247 | "url-filter": "cdn.ziffstatic.com/jst/./zdconsent.js",
248 | "resource-type": ["script"]
249 | },
250 | "action": {
251 | "type": "block"
252 | }
253 | },
254 | {
255 | "trigger": {
256 | "url-filter": "cdn.jsdelivr.net/npm/cookieconsent@3/",
257 | "resource-type": ["script"]
258 | },
259 | "action": {
260 | "type": "block"
261 | }
262 | },
263 | {
264 | "trigger": {
265 | "url-filter": "/js/xf/notice.min.js?.",
266 | "resource-type": ["script"]
267 | },
268 | "action": {
269 | "type": "block"
270 | }
271 | },
272 | {
273 | "trigger": {
274 | "url-filter": "./wp/wp-content/themes/v3ct/lib/cookies.min.js",
275 | "resource-type": ["script"]
276 | },
277 | "action": {
278 | "type": "block"
279 | }
280 | },
281 | {
282 | "trigger": {
283 | "url-filter": "./wp/wp-content/plugins/woocommerce/assets/js/js-cookie/js.cookie.min.js?.
284 | ",
285 | "resource-type": ["script"]
286 | },
287 | "action": {
288 | "type": "block"
289 | }
290 | },
291 | {
292 | "trigger": {
293 | "url-filter": "consent.truste.com",
294 | "resource-type": ["script"]
295 | },
296 | "action": {
297 | "type": "block"
298 | }
299 | },
300 | {
301 | "trigger": {
302 | "url-filter": ".quantserve.com/.",
303 | "resource-type": ["script"]
304 | },
305 | "action": {
306 | "type": "block"
307 | }
308 | },
309 | {
310 | "trigger": {
311 | "url-filter": ".consensu.org/",
312 | "resource-type": ["script"]
313 | },
314 | "action": {
315 | "type": "block"
316 | }
317 | },
318 | {
319 | "trigger": {
320 | "url-filter": "cdn.componentator.com/spa.min",
321 | "resource-type": ["script"]
322 | },
323 | "action": {
324 | "type": "block"
325 | }
326 | },
327 | ]
328 |
--------------------------------------------------------------------------------
/Safari/HelloGoodbye.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Safari/HelloGoodbye.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Safari/HelloGoodbye.xcodeproj/project.xcworkspace/xcuserdata/bruceroettgers.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Safari/HelloGoodbye.xcodeproj/project.xcworkspace/xcuserdata/bruceroettgers.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Safari/HelloGoodbye.xcodeproj/xcuserdata/bruceroettgers.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | BlockerExtension.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 1
11 |
12 | HelloGoodbye Extension.xcscheme_^#shared#^_
13 |
14 | orderHint
15 | 1
16 |
17 | HelloGoodbye.xcscheme_^#shared#^_
18 |
19 | orderHint
20 | 0
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // HelloGoodbye
4 | //
5 | // Created by Bruce Roettgers on 07.04.19.
6 | // Copyright © 2019 Dirk Hulverscheidt. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | @NSApplicationMain
12 | class AppDelegate: NSObject, NSApplicationDelegate {
13 |
14 | func applicationDidFinishLaunching(_ aNotification: Notification) {
15 | // Insert code here to initialize your application
16 |
17 | }
18 |
19 | func applicationWillTerminate(_ aNotification: Notification) {
20 | // Insert code here to tear down your application
21 | }
22 |
23 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
24 | // more reference: https://stackoverflow.com/a/2926356/8126260
25 | return true
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/1024.png
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/128.png
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/16.png
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/256.png
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/32.png
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/512.png
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/64.png
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "1024x1024",
5 | "idiom" : "ios-marketing",
6 | "filename" : "1024.png",
7 | "scale" : "1x"
8 | },
9 | {
10 | "size" : "16x16",
11 | "idiom" : "mac",
12 | "filename" : "16.png",
13 | "scale" : "1x"
14 | },
15 | {
16 | "size" : "16x16",
17 | "idiom" : "mac",
18 | "filename" : "32.png",
19 | "scale" : "2x"
20 | },
21 | {
22 | "size" : "32x32",
23 | "idiom" : "mac",
24 | "filename" : "32.png",
25 | "scale" : "1x"
26 | },
27 | {
28 | "size" : "32x32",
29 | "idiom" : "mac",
30 | "filename" : "64.png",
31 | "scale" : "2x"
32 | },
33 | {
34 | "size" : "128x128",
35 | "idiom" : "mac",
36 | "filename" : "128.png",
37 | "scale" : "1x"
38 | },
39 | {
40 | "size" : "128x128",
41 | "idiom" : "mac",
42 | "filename" : "256.png",
43 | "scale" : "2x"
44 | },
45 | {
46 | "size" : "256x256",
47 | "idiom" : "mac",
48 | "filename" : "256.png",
49 | "scale" : "1x"
50 | },
51 | {
52 | "size" : "256x256",
53 | "idiom" : "mac",
54 | "filename" : "512.png",
55 | "scale" : "2x"
56 | },
57 | {
58 | "size" : "512x512",
59 | "idiom" : "mac",
60 | "filename" : "512.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "512x512",
65 | "idiom" : "mac",
66 | "filename" : "1024.png",
67 | "scale" : "2x"
68 | }
69 | ],
70 | "info" : {
71 | "version" : 1,
72 | "author" : "xcode"
73 | }
74 | }
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/HelloGoodbye.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 6
23 | LSApplicationCategoryType
24 | public.app-category.productivity
25 | LSMinimumSystemVersion
26 | $(MACOSX_DEPLOYMENT_TARGET)
27 | NSHumanReadableCopyright
28 | Copyright © 2019 Dirk Hulverscheidt. All rights reserved.
29 | NSMainStoryboardFile
30 | Main
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/Safari/HelloGoodbye/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // HelloGoodbye
4 | //
5 | // Created by Bruce Roettgers on 07.04.19.
6 | // Copyright © 2019 Dirk Hulverscheidt. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 | import SafariServices.SFSafariApplication
11 |
12 | class ViewController: NSViewController {
13 |
14 | @IBOutlet var appNameLabel: NSTextField!
15 |
16 | override func viewDidLoad() {
17 | super.viewDidLoad()
18 | self.appNameLabel.stringValue = "HelloGoodbye";
19 | }
20 |
21 | @IBAction func openSafariExtensionPreferences(_ sender: AnyObject?) {
22 | SFSafariApplication.showPreferencesForExtension(withIdentifier: "hulverscheidtdirk.HelloGoodbye.BlockerExtension") { error in
23 | if let _ = error {
24 | // Insert code to inform the user that something went wrong.
25 |
26 | }
27 | }
28 | }
29 |
30 | @IBAction func openDonationPage(_ sender: Any) {
31 | let url = URL(string: "https://buymeacoff.ee/bruceroet")!
32 | NSWorkspace.shared.open(url)
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/app.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/app.zip
--------------------------------------------------------------------------------
/design-assets/Exports/Github Preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/Github Preview.png
--------------------------------------------------------------------------------
/design-assets/Exports/Marquee Promo Tile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/Marquee Promo Tile.png
--------------------------------------------------------------------------------
/design-assets/Exports/comparisoniOS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/comparisoniOS.png
--------------------------------------------------------------------------------
/design-assets/Exports/discuss-issue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/discuss-issue.png
--------------------------------------------------------------------------------
/design-assets/Exports/iosPromo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/iosPromo.png
--------------------------------------------------------------------------------
/design-assets/Exports/iosXpromo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/iosXpromo.png
--------------------------------------------------------------------------------
/design-assets/Exports/ipadPromo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/ipadPromo.png
--------------------------------------------------------------------------------
/design-assets/Exports/mac-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/mac-icon.png
--------------------------------------------------------------------------------
/design-assets/Exports/macOSpromo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/macOSpromo.png
--------------------------------------------------------------------------------
/design-assets/Exports/makerads.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/makerads.png
--------------------------------------------------------------------------------
/design-assets/Exports/medium-tile-promo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/medium-tile-promo.png
--------------------------------------------------------------------------------
/design-assets/Exports/promotional.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/promotional.jpg
--------------------------------------------------------------------------------
/design-assets/Exports/promotional.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/promotional.png
--------------------------------------------------------------------------------
/design-assets/Exports/small-tile-promo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/small-tile-promo.jpg
--------------------------------------------------------------------------------
/design-assets/Exports/small-tile-promo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Exports/small-tile-promo.png
--------------------------------------------------------------------------------
/design-assets/Github Preview.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Github Preview.psd
--------------------------------------------------------------------------------
/design-assets/Logo/HGB.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/HGB.png
--------------------------------------------------------------------------------
/design-assets/Logo/HGBWhite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/HGBWhite.png
--------------------------------------------------------------------------------
/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/1024.png
--------------------------------------------------------------------------------
/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/128.png
--------------------------------------------------------------------------------
/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/16.png
--------------------------------------------------------------------------------
/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/256.png
--------------------------------------------------------------------------------
/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/32.png
--------------------------------------------------------------------------------
/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/512.png
--------------------------------------------------------------------------------
/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/64.png
--------------------------------------------------------------------------------
/design-assets/Logo/Mac Icon Set/Assets 3.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {"images":[{"size":"1024x1024","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ios-marketing","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]}
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/100.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/1024.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/114.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/120.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/144.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/152.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/167.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/180.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/20.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/29.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/40.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/50.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/57.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/58.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/60.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/72.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/76.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/80.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/87.png
--------------------------------------------------------------------------------
/design-assets/Logo/iOS Icon Set/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"}]}
--------------------------------------------------------------------------------
/design-assets/Marquee Promo Tile.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/Marquee Promo Tile.psd
--------------------------------------------------------------------------------
/design-assets/comparisoniOS.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/comparisoniOS.psd
--------------------------------------------------------------------------------
/design-assets/discuss-issue.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/discuss-issue.psd
--------------------------------------------------------------------------------
/design-assets/iosPromo.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/iosPromo.psd
--------------------------------------------------------------------------------
/design-assets/iosXpromo.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/iosXpromo.psd
--------------------------------------------------------------------------------
/design-assets/ipadPromo.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/ipadPromo.psd
--------------------------------------------------------------------------------
/design-assets/macOS promo.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/macOS promo.psd
--------------------------------------------------------------------------------
/design-assets/makerads.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/makerads.psd
--------------------------------------------------------------------------------
/design-assets/medium-tile promo.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/medium-tile promo.psd
--------------------------------------------------------------------------------
/design-assets/medium-tile-promo.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/medium-tile-promo.psd
--------------------------------------------------------------------------------
/design-assets/promotional.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/promotional.psd
--------------------------------------------------------------------------------
/design-assets/small-tile-promo.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bcye/Hello-Goodbye/d74c553a015e9ccb256320d79afe6c6c5bba211e/design-assets/small-tile-promo.psd
--------------------------------------------------------------------------------
/filterlist.txt:
--------------------------------------------------------------------------------
1 | [Adblock Plus 2.0]
2 | ! Title: Hello, Goodbye!
3 | ! Expires: 5 days
4 | ! Homepage: https://hellogoodbye.app/
5 | ! Description: Hello, Goodbye blocks chat and sales widgets in your browser.
6 |
7 | ! =================
8 | ! Stop Chat Widgets
9 | ! =================
10 |
11 | ||widget.intercom.io/*
12 | ||connect.facebook.net/en_US/sdk/xfbml.customerchat.js
13 | ||assets.producthunt.com/assets/upwigloader.js
14 | ||js.driftt.com/*
15 | ||*.crisp.chat/*
16 | ||*.intergram.xyz/js/*
17 | ||widget.mfy.im/*
18 | ||connect.podium.com/*
19 | ||js.usemessages.com/*
20 | ||static.getchipbot.com/*
21 | ||static.zdassets.com/ekr/snippet.js^
22 | ||www.couchbase.com/webfiles/1552355627964/js/contact-popup-form.js
23 | ||assetscdn-wchat.freshchat.com/*
24 | ||wchat.freshchat.com/*
25 | ||wchat.eu.freshchat.com/*
26 | ||code.jivosite.com/script/widget/*
27 | ||code.tidio.co/*
28 | ||*.user.com/static/js/*
29 | ||secure.livechatinc.com/*
30 | ||justanswer.com/revizely/2/core/ja-com.js
31 | ||code.snapengage.com/*
32 | ||sdk.inbenta.io/chatbot/*
33 | ||pi2.movoto.com/1.7.654/javascripts/desktop/movoto.min.js
34 | ||*.zopim.com/*
35 | ||cdn.gubagoo.io/*
36 | ||leadconnect.ipmaxi.se/*
37 | ||static.small.chat/messenger.js
38 | ||smartsupp-widget-161959.c.cdn77.org/build/smartchat-2.3.20.min.js
39 | ||www.smartsuppchat.com/loader.js?
40 | ||plugins.help.com/*
41 | ||js.gs-chat.com/*"
42 | ||widget.customerly.io/*
43 | ||beacon-v2.helpscout.net
44 | ||assets.gorgias.io/chat/*
45 | ||static.notifia.io/widget.js
46 | ||cdn.useproof.com/proof.js?*
47 | ||cdn.provesrc.com/provesrc.js
48 | ||s3.amazonaws.com/provely-public/w/provely-2.0.js
49 | ||load.fomo.com/*
50 | ||pixel.convertize.io/*
51 | ||static.quriobot.com/static/*
52 | ||commondatastorage.googleapis.com/code.snapengage.com/js/*
53 | ||embed.tawk.to/*
54 | ||*.contactatonce.com/*
55 | ||live-chat-cdn.socialsignin.net/*
56 | ||messenger.ngageics.com/*
57 | ||app.carnow.com/dealers/carnow_plugin.js?*
58 | ||chat8.live800.com/*
59 | ||tars-file-upload.s3.amazonaws.com/bulb/js/widget.js
60 | ||static.widget.trengo.eu/embed.js
61 | ||www.chronopost.fr/JavaHookServer/api/v1/webhook/chat/*
62 | ||www.snapengage.com/chatjs/*
63 | ||kf.ecqun.com/*
64 | ||js.qualified.com/qualified.js?*
65 | ||www.aexp-static.com/cdaas/one/statics/axp-shared-scripts/1.4.0/package/dist/vendors/qualtrics/FeedbackLinkModule.js?*
66 | ||widget.replain.cc/dist/*
67 | ||cdn.bitrix24.ru/*
68 | ||code-ya.jivosite.com/*
69 | ||static.zdassets.com/web_widget/*
70 | ||my.clickdesk.com/clickdesk-ui/browser/*
71 | ||*.videoask.com/embed/embed.js
72 | ||afcs.dellcdn.com/csb/contact-drawer/bundles/js/contact-drawer_v1.js
73 | ||static.ada.support/embed.js
74 | ||chat.outboundengine.com/c/readychat_website_min.js
75 | ||knrpc.olark.com/nrpc/c
76 | ||*.formilla.com/scripts/feedback.js
77 | ||chat-assets.frontapp.com/*
78 | ||widget.instabot.io/jsapi/rokoInstabot.js
79 | ||site-chat.ru/cjs/*
80 | ||widget.feedot-lawyer.ru/js/*
81 | ||go.activengage.com
82 | ||whitesaas.com/api/*
83 | ||messenger.rightside.ru:8080/js/*
84 | ||lcab.talk-me.ru
85 | ||cp.onicon.ru
86 | ||chat-assets.frontapp.com
87 | ||leadback.ru/js/leadback.js
88 | ||admin.verbox.ru/support/*
89 | ||lptag.liveperson.net
90 | ||ready-chat.appspot.com
91 | ||w.chatlio.com
92 | ||widget-new.helpcrunch.com
93 | ||clients.streamwood.ru/StreamWood/sw.js
94 | ||cs15.livetex.ru/js/client.js
95 | ||widget.consultsystems.ru/*
96 | ||chatclient.venew.io/*
97 | ||api.venyoo.ru/*
98 | ||widget.consultsystems.ru
99 | ||d1fw6d83a3emwv.cloudfront.net/bot/prod/js/web-chan.js
100 | ||cdn.bitrix24.kz
101 | ||live.vnpgroup.net/js/*
102 | ||crm.digtlab.ru/upload/*
103 | ||me-talk.ru/support/*
104 | ||cdn-app.continual.ly/js/embed/continually-embed.latest.min.js
105 | ||corp.aquadom.info/upload/crm/site_button/loader_1_lue57s.js*
106 | ||lawbook.online/chat.js*
107 | ||static.parastorage.com/services/chat-widget/*
108 | ||service.giosg.com
109 | ||chatbox.cuuma.fi
110 | ||envybox.io/*
111 | ||widget.lawyer-feedot.ru/*
112 | ||www.flygoldfinch.com/assets/images/whatsapp.png
113 | ||ohotnik174.ru/bitrix/js/main/*
114 | ||birdeye.com/embed/*
115 | ||sf-sotc.s3.amazonaws.com/dev/chatsdk/v1/SenseforthChatSDKLoader.js
116 | ||*.my.salesforce.com/embeddedservice/5.0/client/liveagent.esw.min.js
117 | guide.loyalhealth.com
118 | cdn-widget.callpage.io
119 | ||code.evidence.io/*
120 | ||cdn.shopify.com/shopifycloud/shopify_chat/*
121 | ||*.nuance.com/media/launch/chatLoader*
122 | ||cdn.freshbots.ai/assets/share/js/freshbots*
123 | ||app.frase.io/js/*
124 | ||code.jivo.ru/widget/*
125 | ||www.carcodesms.com/widgets/*
126 | ||js.joonbot.com/init.js
127 | ||cdn.livechatinc.com/*
128 | ||static.arukereso.hu/widget/*
129 | ||*.inside-graph.com/*
130 | ||static.bots.sefbot.cz/website/js/widget*
131 | ||chatbot.sipgate.de/*
132 | ||quriobot.com/qb/widget/*
133 | ||vmss-eu.boldchat.com/*
134 | ||pageview.activengage.com/*
135 | ||cdn-bot.phenompeople.com/*
136 | ||cdn.webpushr.com/*
137 | ||cdn.envybox.io/*
138 | ||dogovor-obrazets.ru/5dbb57548e2b7716ac2561488bac0fa9/7548e/settings.js
139 | ||config.gorgias.chat/*
140 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hello-goodbye",
3 | "version": "1.0.0",
4 | "description": "A browser extension that blocks annoying chat widgets.",
5 | "scripts": {
6 | "lint": "./node_modules/.bin/eslint Chrome"
7 | },
8 | "repository": {
9 | "type": "git",
10 | "url": "https://github.com/bcye/Hello-Goodbye.git"
11 | },
12 | "keywords": [],
13 | "author": "Bruce Roettgers",
14 | "license": "GPL-3.0",
15 | "bugs": {
16 | "url": "https://github.com/bcye/Hello-Goodbye/issues"
17 | },
18 | "homepage": "https://github.com/bcye/Hello-Goodbye#readme",
19 | "husky": {
20 | "hooks": {
21 | "pre-commit": "precise-commits"
22 | }
23 | },
24 | "devDependencies": {
25 | "eslint": "^6.6.0",
26 | "eslint-config-prettier": "^6.5.0",
27 | "husky": "^3.0.9",
28 | "precise-commits": "^1.0.2",
29 | "prettier": "1.18.2",
30 | "@types/chrome": "^0.0.113"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/pihole.txt:
--------------------------------------------------------------------------------
1 | # Pi-Hole Block List for Hello, Goodbye
2 | # Blocks annoying chat widgets
3 | # Written in HOSTS format
4 | # contact hello@hellogoodbye.app about issues or missing domains
5 |
6 | widget.intercom.io
7 | js.driftt.com
8 | client.crisp.chat
9 | widget.mfy.im
10 | connect.podium.com
11 | js.usemessages.com
12 | static.getchipbot.com
13 | wchat.freshchat.com
14 | code.jivosite.com
15 | code.tidio.co
16 | secure.livechatinc.com
17 | justanswer.com
18 | code.snapengage.com
19 | sdk.inbenta.io
20 | pi2.movoto.com
21 | cdn.gubagoo.io
22 | leadconnect.ipmaxi.se
23 | static.small.chat
24 | smartsupp-widget-161959.c.cdn77.org
25 | plugins.help.com
26 | js.gs-chat.com
27 | widget.customerly.io
28 | beacon-v2.helpscout.net
29 | assets.gorgias.io
30 | static.notifia.io
31 | cdn.useproof.com
32 | cdn.provesrc.com
33 | load.fomo.com
34 | pixel.convertize.io
35 | static.quriobot.com
36 | embed.tawk.to
37 | live-chat-cdn.socialsignin.net
38 | messenger.ngageics.com
39 | app.carnow.com
40 | chat8.live800.com
41 | tars-file-upload.s3.amazonaws.com
42 | kf.ecqun.com
43 | smartsuppchat.com
44 | js.qualified.com
45 | widget.replain.cc
46 | cdn.bitrix24.ru
47 | static.zdassets.com
48 | code-ya.jivosite.com
49 | my.clickdesk.com
50 | videoask.com
51 | chat.outboundengine.com
52 | knrpc.olark.com
53 | chat-assets.frontapp.com
54 | widget.instabot.io
55 | site-chat.ru
56 | widget.feedot-lawyer.ru
57 | go.activengage.com
58 | whitesaas.com
59 | messenger.rightside.ru
60 | lcab.talk-me.ru
61 | cp.onicon.ru
62 | chat-assets.frontapp.com
63 | leadback.ru
64 | admin.verbox.ru
65 | lptag.liveperson.net
66 | ready-chat.appspot.com
67 | w.chatlio.com
68 | widget-new.helpcrunch.com
69 | clients.streamwood.ru
70 | cs15.livetex.ru
71 | widget.consultsystems.ru
72 | chatclient.venew.io
73 | api.venyoo.ru
74 | d1fw6d83a3emwv.cloudfront.net
75 | cdn.bitrix24.kz
76 | live.vnpgroup.net
77 | crm.digtlab.ru
78 | me-talk.ru
79 | cdn-app.continual.ly
80 | service.giosg.com
81 | chatbox.cuuma.fi
82 | widget.lawyer-feedot.ru
83 | guide.loyalhealth.com
84 | cdn-widget.callpage.io
85 | code.evidence.io
86 | cdn.freshbots.ai
87 | code.jivo.ru
88 | carcodesms.com
89 | js.joonbot.com
90 | cdn.livechatinc.com
91 | static.arukereso.hu
92 | inside-graph.com
93 | static.bots.sefbot.cz
94 | chatbot.sipgate.de
95 | quriobot.com
96 | vmss-eu.boldchat.com
97 | pageview.activengage.com
98 | cdn-bot.phenompeople.com
99 | cdn.webpushr.com
100 | cdn.envybox.io
--------------------------------------------------------------------------------