├── LICENSE
├── PiPifier iOS
├── Graphic Ressources
│ ├── ActionIcon Template.sketch
│ ├── Icon Template.sketch
│ ├── Icon
│ │ ├── AppIcon.appiconset
│ │ │ ├── Icon-167.png
│ │ │ ├── Icon-60@2x.png
│ │ │ ├── Icon-60@3x.png
│ │ │ ├── Icon-76.png
│ │ │ ├── Icon-76@2x.png
│ │ │ ├── Icon-Small-20.png
│ │ │ ├── Icon-Small-40.png
│ │ │ ├── Icon-Small-40@2x.png
│ │ │ ├── Icon-Small-40@3x.png
│ │ │ ├── Icon-Small-60.png
│ │ │ ├── Icon-Small.png
│ │ │ ├── Icon-Small@2x.png
│ │ │ └── Icon-Small@3x.png
│ │ ├── Artwork
│ │ │ ├── iTunesArtwork.png
│ │ │ └── iTunesArtwork@2x.png
│ │ ├── Rounded
│ │ │ ├── AppIcon
│ │ │ │ ├── Icon-167.png
│ │ │ │ ├── Icon-60@2x.png
│ │ │ │ ├── Icon-60@3x.png
│ │ │ │ ├── Icon-76.png
│ │ │ │ ├── Icon-76@2x.png
│ │ │ │ ├── Icon-Small-40@2x.png
│ │ │ │ ├── Icon-Small-40@3x.png
│ │ │ │ ├── Icon-Small.png
│ │ │ │ ├── Icon-Small@2x.png
│ │ │ │ └── Icon-Small@3x.png
│ │ │ └── Artwork
│ │ │ │ ├── iTunesArtwork.png
│ │ │ │ └── iTunesArtwork@2x.png
│ │ └── newIcon
│ │ │ ├── AppIcon.appiconset
│ │ │ ├── Icon-167.png
│ │ │ ├── Icon-20@1x.png
│ │ │ ├── Icon-20@2x.png
│ │ │ ├── Icon-20@3x.png
│ │ │ ├── Icon-60@2x.png
│ │ │ ├── Icon-60@3x.png
│ │ │ ├── Icon-76.png
│ │ │ ├── Icon-76@2x.png
│ │ │ ├── Icon-Small-40@2x.png
│ │ │ ├── Icon-Small-40@3x.png
│ │ │ ├── Icon-Small.png
│ │ │ ├── Icon-Small@2x.png
│ │ │ └── Icon-Small@3x.png
│ │ │ ├── Artwork
│ │ │ ├── iTunesArtwork.png
│ │ │ └── iTunesArtwork@2x.png
│ │ │ ├── Preview
│ │ │ ├── App Store.png
│ │ │ └── Homescreen.png
│ │ │ └── Rounded
│ │ │ ├── AppIcon
│ │ │ ├── Icon-167.png
│ │ │ ├── Icon-60@2x.png
│ │ │ ├── Icon-60@3x.png
│ │ │ ├── Icon-76.png
│ │ │ ├── Icon-76@2x.png
│ │ │ ├── Icon-Small-40@2x.png
│ │ │ ├── Icon-Small-40@3x.png
│ │ │ ├── Icon-Small.png
│ │ │ ├── Icon-Small@2x.png
│ │ │ └── Icon-Small@3x.png
│ │ │ └── Artwork
│ │ │ ├── iTunesArtwork.png
│ │ │ └── iTunesArtwork@2x.png
│ ├── RunPipifierWebExt.png
│ ├── Template Icon
│ │ ├── AppIcon.appiconset
│ │ │ ├── Icon-167.png
│ │ │ ├── Icon-60.png
│ │ │ ├── Icon-60@2x.png
│ │ │ ├── Icon-60@3x.png
│ │ │ ├── Icon-76.png
│ │ │ ├── Icon-76@2x.png
│ │ │ ├── Icon-Small-40.png
│ │ │ ├── Icon-Small-400,5x.png
│ │ │ ├── Icon-Small-40@2x.png
│ │ │ ├── Icon-Small-40@3x.png
│ │ │ ├── Icon-Small.png
│ │ │ ├── Icon-Small@2x.png
│ │ │ └── Icon-Small@3x.png
│ │ └── newTemplate
│ │ │ ├── AppIcon.appiconset
│ │ │ ├── Icon-167.png
│ │ │ ├── Icon-20@1x.png
│ │ │ ├── Icon-20@2x.png
│ │ │ ├── Icon-20@3x.png
│ │ │ ├── Icon-60.png
│ │ │ ├── Icon-60@2x.png
│ │ │ ├── Icon-60@3x.png
│ │ │ ├── Icon-76.png
│ │ │ ├── Icon-76@2x.png
│ │ │ ├── Icon-Small-40.png
│ │ │ ├── Icon-Small-400,5x.png
│ │ │ ├── Icon-Small-40@2x.png
│ │ │ ├── Icon-Small-40@3x.png
│ │ │ ├── Icon-Small.png
│ │ │ ├── Icon-Small@2x.png
│ │ │ └── Icon-Small@3x.png
│ │ │ ├── Artwork
│ │ │ ├── WebExtensionIcon-16w.png
│ │ │ ├── WebExtensionIcon-19w.png
│ │ │ ├── WebExtensionIcon-32w.png
│ │ │ ├── WebExtensionIcon-38w.png
│ │ │ ├── iTunesArtwork.png
│ │ │ └── iTunesArtwork@2x.png
│ │ │ └── Rounded
│ │ │ └── Artwork
│ │ │ ├── IconWebApp-128w.png
│ │ │ ├── IconWebApp-256w.png
│ │ │ ├── IconWebApp-48w.png
│ │ │ ├── IconWebApp-512w.png
│ │ │ └── IconWebApp-96w.png
│ ├── UI Assets.sketch
│ ├── activateWebExt.png
│ ├── addMore.png
│ ├── manageExt.png
│ ├── runPiPifier.png
│ ├── shareSheet.png
│ └── shareSheetEnabled.png
├── PiPifier iOS.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ ├── xcshareddata
│ │ └── xcschemes
│ │ │ └── PiPifier-WebExtension.xcscheme
│ └── xcuserdata
│ │ └── arno.xcuserdatad
│ │ └── xcschemes
│ │ ├── PiPifier iOS.xcscheme
│ │ ├── PiPifier.xcscheme
│ │ └── xcschememanagement.plist
├── PiPifier iOS
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-167.png
│ │ │ ├── Icon-20@1x.png
│ │ │ ├── Icon-20@2x-1.png
│ │ │ ├── Icon-20@2x-2.png
│ │ │ ├── Icon-20@2x.png
│ │ │ ├── Icon-20@3x.png
│ │ │ ├── Icon-60@2x.png
│ │ │ ├── Icon-60@3x.png
│ │ │ ├── Icon-76.png
│ │ │ ├── Icon-76@2x.png
│ │ │ ├── Icon-Small-40@2x-1.png
│ │ │ ├── Icon-Small-40@2x.png
│ │ │ ├── Icon-Small-40@3x.png
│ │ │ ├── Icon-Small.png
│ │ │ ├── Icon-Small@2x-1.png
│ │ │ ├── Icon-Small@2x.png
│ │ │ ├── Icon-Small@3x.png
│ │ │ └── iTunesArtwork@2x.png
│ │ ├── Contents.json
│ │ ├── RunPipifierWebExt.imageset
│ │ │ ├── Contents.json
│ │ │ └── RunPipifierWebExt.png
│ │ ├── activateWebExt.imageset
│ │ │ ├── Contents.json
│ │ │ └── activateWebExt.png
│ │ ├── addMore.imageset
│ │ │ ├── Contents.json
│ │ │ └── addMore.png
│ │ ├── editActions.imageset
│ │ │ ├── Bildschirmfoto 2020-06-25 um 15.02.42.png
│ │ │ └── Contents.json
│ │ ├── executePiPifier.imageset
│ │ │ ├── Bildschirmfoto 2020-06-27 um 01.49.00.png
│ │ │ └── Contents.json
│ │ ├── extensionMenuButton.imageset
│ │ │ ├── Contents.json
│ │ │ └── extensionMenuButton.png
│ │ ├── manageExt.imageset
│ │ │ ├── Contents.json
│ │ │ └── manageExt.png
│ │ ├── runPiPifier.imageset
│ │ │ ├── Contents.json
│ │ │ └── runPiPifier.png
│ │ ├── runPiPifierNew.imageset
│ │ │ ├── Bildschirmfoto 2020-06-25 um 14.59.41.png
│ │ │ └── Contents.json
│ │ ├── shareSheet.imageset
│ │ │ ├── Contents.json
│ │ │ └── shareSheet.png
│ │ ├── shareSheetEnabled.imageset
│ │ │ ├── Contents.json
│ │ │ └── shareSheetEnabled.png
│ │ └── websiteToolMenu.imageset
│ │ │ ├── Contents.json
│ │ │ └── webtoolsButton.png
│ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── MainHostingVC.swift
│ ├── MainUICoordinator.swift
│ ├── MainViewSwiftUI 2.swift
│ ├── MainViewSwiftUI.swift
│ ├── RoundRectButton.swift
│ ├── Screens
│ │ ├── 1.jpg
│ │ ├── 2.jpg
│ │ ├── 3.jpg
│ │ └── PiPifier iOS Screens.zip
│ ├── SwiftUI Representables
│ │ └── MailView.swift
│ └── ViewController.swift
├── PiPifier-WebExtension
│ ├── Info.plist
│ ├── Resources
│ │ ├── _locales
│ │ │ └── en
│ │ │ │ └── messages.json
│ │ ├── background.js
│ │ ├── content.js
│ │ ├── images
│ │ │ ├── IconWebApp-128w.png
│ │ │ ├── IconWebApp-256w.png
│ │ │ ├── IconWebApp-48w.png
│ │ │ ├── IconWebApp-512w.png
│ │ │ ├── IconWebApp-96w.png
│ │ │ ├── WebExtIcon-16w.png
│ │ │ ├── WebExtIcon-19w.png
│ │ │ ├── WebExtIcon-32w.png
│ │ │ ├── WebExtIcon-38w.png
│ │ │ ├── WebExtensionIcon-16w.png
│ │ │ ├── WebExtensionIcon-19w.png
│ │ │ ├── WebExtensionIcon-32w.png
│ │ │ └── WebExtensionIcon-38w.png
│ │ ├── manifest.json
│ │ ├── popup.css
│ │ ├── popup.html
│ │ └── popup.js
│ └── SafariWebExtensionHandler.swift
├── PiPifier
│ ├── ActionRequestHandler.swift
│ ├── Info.plist
│ ├── PiPifierExtensionJavaScript.js
│ └── TemplateAppIcon.xcassets
│ │ ├── AppIcon.appiconset
│ │ └── Contents.json
│ │ └── Contents.json
└── Test
│ ├── Info.plist
│ └── ThumbnailProvider.swift
├── PiPifier.xcworkspace
├── contents.xcworkspacedata
├── xcshareddata
│ └── IDEWorkspaceChecks.plist
└── xcuserdata
│ └── arno.xcuserdatad
│ └── xcdebugger
│ └── Breakpoints_v2.xcbkptlist
├── README.md
└── macOS
├── App Icon - Apple macOS Big Sur.sketch
├── Icon
├── macOS10
│ ├── icon-10241024w.png
│ ├── icon-1024128w.png
│ ├── icon-102416w.png
│ ├── icon-1024256w.png
│ ├── icon-102432w.png
│ ├── icon-1024512w.png
│ └── icon-102464w.png
└── macOS11
│ ├── Icon Template Mac 512pt.png
│ ├── Mac App 128pt.png
│ ├── Mac App 128pt@2x.png
│ ├── Mac App 16pt.png
│ ├── Mac App 16pt@2x.png
│ ├── Mac App 256pt.png
│ ├── Mac App 256pt@2x.png
│ ├── Mac App 32pt.png
│ ├── Mac App 32pt@2x.png
│ ├── Mac App 512pt.png
│ ├── Mac App 512pt@2x.png
│ ├── PiP_Toolbar_Icon_new.pdf
│ ├── icon-1024.png
│ ├── icon-128.png
│ ├── icon-16.png
│ ├── icon-256.png
│ ├── icon-32.png
│ ├── icon-512.png
│ └── icon-64.png
├── Images
├── Banner.png
├── demo.gif
└── pipifier_ios_usage.gif
├── PiP_Toolbar_Icon.pdf
├── PiP_Toolbar_Icon.svg
├── PiP_Toolbar_Icon_new.pdf
├── PiP_Toolbar_Icon_new.svg
├── PiP_Toolbar_Icon_new_big_sur.pdf
├── PiP_Toolbar_Icon_white.pdf
├── PiP_Toolbar_Icon_white.svg
├── PiP_Toolbar_Icon_white_new.pdf
├── PiP_Toolbar_Icon_white_new.svg
├── PiPifier macOS 11.sketch
├── PiPifier macOS.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── xcuserdata
│ └── arno.xcuserdatad
│ ├── xcdebugger
│ └── Breakpoints_v2.xcbkptlist
│ └── xcschemes
│ ├── PiPifier-Safari-Extension.xcscheme
│ ├── PiPifier.xcscheme
│ └── xcschememanagement.plist
├── PiPifier-Safari-Extension
├── Info.plist
├── PiP_Toolbar_Icon.pdf
├── PiP_Toolbar_Icon.svg
├── PiP_Toolbar_Icon_white.svg
├── PiPifier_Safari_Extension.entitlements
├── SafariExtensionHandler.swift
├── StateManager.swift
└── script.js
├── PiPifier
├── AppDelegate.swift
├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── icon-1024.png
│ │ ├── icon-128.png
│ │ ├── icon-16.png
│ │ ├── icon-256.png
│ │ ├── icon-257.png
│ │ ├── icon-32.png
│ │ ├── icon-33.png
│ │ ├── icon-512.png
│ │ ├── icon-513.png
│ │ └── icon-64.png
│ └── Contents.json
├── Base.lproj
│ └── Main.storyboard
├── Info.plist
├── PiPifier.entitlements
├── SettingsManager.swift
└── ViewController.swift
├── PiPifier_Artwork.zip
├── Pipifier_UI_Ressources.sketch
└── README.md
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Arno Appenzeller
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 |
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/ActionIcon Template.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/ActionIcon Template.sketch
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon Template.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon Template.sketch
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-167.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-60@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-60@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-76.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-76@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-20.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-40.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small-60.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/AppIcon.appiconset/Icon-Small@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Artwork/iTunesArtwork.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Artwork/iTunesArtwork.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Artwork/iTunesArtwork@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Artwork/iTunesArtwork@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-167.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-60@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-60@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-76.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-76@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/AppIcon/Icon-Small@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/Artwork/iTunesArtwork.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/Artwork/iTunesArtwork.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/Rounded/Artwork/iTunesArtwork@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/Rounded/Artwork/iTunesArtwork@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-167.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-20@1x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-20@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-20@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-60@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-60@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-76.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-76@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/AppIcon.appiconset/Icon-Small@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Artwork/iTunesArtwork.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Artwork/iTunesArtwork.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Artwork/iTunesArtwork@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Artwork/iTunesArtwork@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Preview/App Store.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Preview/App Store.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Preview/Homescreen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Preview/Homescreen.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-167.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-60@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-60@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-76.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-76@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/AppIcon/Icon-Small@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/Artwork/iTunesArtwork.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/Artwork/iTunesArtwork.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/Artwork/iTunesArtwork@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Icon/newIcon/Rounded/Artwork/iTunesArtwork@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/RunPipifierWebExt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/RunPipifierWebExt.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-167.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-60.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-60@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-60@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-76.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-76@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small-40.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small-400,5x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small-400,5x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/AppIcon.appiconset/Icon-Small@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-167.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-20@1x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-20@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-20@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-60.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-60@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-60@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-76.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-76@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small-40.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small-400,5x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small-400,5x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/AppIcon.appiconset/Icon-Small@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/WebExtensionIcon-16w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/WebExtensionIcon-16w.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/WebExtensionIcon-19w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/WebExtensionIcon-19w.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/WebExtensionIcon-32w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/WebExtensionIcon-32w.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/WebExtensionIcon-38w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/WebExtensionIcon-38w.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/iTunesArtwork.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/iTunesArtwork.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/iTunesArtwork@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Artwork/iTunesArtwork@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-128w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-128w.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-256w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-256w.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-48w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-48w.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-512w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-512w.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-96w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/Template Icon/newTemplate/Rounded/Artwork/IconWebApp-96w.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/UI Assets.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/UI Assets.sketch
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/activateWebExt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/activateWebExt.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/addMore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/addMore.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/manageExt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/manageExt.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/runPiPifier.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/runPiPifier.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/shareSheet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/shareSheet.png
--------------------------------------------------------------------------------
/PiPifier iOS/Graphic Ressources/shareSheetEnabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/Graphic Ressources/shareSheetEnabled.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS.xcodeproj/xcshareddata/xcschemes/PiPifier-WebExtension.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
6 |
9 |
10 |
16 |
22 |
23 |
24 |
30 |
36 |
37 |
38 |
39 |
40 |
45 |
46 |
47 |
48 |
60 |
62 |
68 |
69 |
70 |
71 |
78 |
80 |
86 |
87 |
88 |
89 |
91 |
92 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS.xcodeproj/xcuserdata/arno.xcuserdatad/xcschemes/PiPifier iOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
60 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS.xcodeproj/xcuserdata/arno.xcuserdatad/xcschemes/PiPifier.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
6 |
9 |
10 |
16 |
22 |
23 |
24 |
30 |
36 |
37 |
38 |
39 |
40 |
45 |
46 |
47 |
48 |
60 |
62 |
68 |
69 |
70 |
71 |
78 |
80 |
86 |
87 |
88 |
89 |
91 |
92 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS.xcodeproj/xcuserdata/arno.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | PiPifier iOS.xcscheme
8 |
9 | orderHint
10 | 2
11 |
12 | PiPifier-WebExtension.xcscheme_^#shared#^_
13 |
14 | orderHint
15 | 4
16 |
17 | PiPifier.xcscheme
18 |
19 | orderHint
20 | 3
21 |
22 | Test.xcscheme
23 |
24 | orderHint
25 | 4
26 |
27 |
28 | SuppressBuildableAutocreation
29 |
30 | 1177FEEF1EC254370061D175
31 |
32 | primary
33 |
34 |
35 | 1177FF081EC256860061D175
36 |
37 | primary
38 |
39 |
40 | 11FA076626C72A25006235D4
41 |
42 | primary
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // PiPifier iOS
4 | //
5 | // Created by Arno Appenzeller on 09.05.17.
6 | // Copyright © 2017 APPenzeller. 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 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "Icon-20@2x.png",
5 | "idiom" : "iphone",
6 | "scale" : "2x",
7 | "size" : "20x20"
8 | },
9 | {
10 | "filename" : "Icon-20@3x.png",
11 | "idiom" : "iphone",
12 | "scale" : "3x",
13 | "size" : "20x20"
14 | },
15 | {
16 | "filename" : "Icon-Small@2x.png",
17 | "idiom" : "iphone",
18 | "scale" : "2x",
19 | "size" : "29x29"
20 | },
21 | {
22 | "filename" : "Icon-Small@3x.png",
23 | "idiom" : "iphone",
24 | "scale" : "3x",
25 | "size" : "29x29"
26 | },
27 | {
28 | "filename" : "Icon-Small-40@2x.png",
29 | "idiom" : "iphone",
30 | "scale" : "2x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "filename" : "Icon-Small-40@3x.png",
35 | "idiom" : "iphone",
36 | "scale" : "3x",
37 | "size" : "40x40"
38 | },
39 | {
40 | "filename" : "Icon-60@2x.png",
41 | "idiom" : "iphone",
42 | "scale" : "2x",
43 | "size" : "60x60"
44 | },
45 | {
46 | "filename" : "Icon-60@3x.png",
47 | "idiom" : "iphone",
48 | "scale" : "3x",
49 | "size" : "60x60"
50 | },
51 | {
52 | "filename" : "Icon-20@1x.png",
53 | "idiom" : "ipad",
54 | "scale" : "1x",
55 | "size" : "20x20"
56 | },
57 | {
58 | "filename" : "Icon-20@2x-1.png",
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "20x20"
62 | },
63 | {
64 | "filename" : "Icon-Small.png",
65 | "idiom" : "ipad",
66 | "scale" : "1x",
67 | "size" : "29x29"
68 | },
69 | {
70 | "filename" : "Icon-Small@2x-1.png",
71 | "idiom" : "ipad",
72 | "scale" : "2x",
73 | "size" : "29x29"
74 | },
75 | {
76 | "filename" : "Icon-20@2x-2.png",
77 | "idiom" : "ipad",
78 | "scale" : "1x",
79 | "size" : "40x40"
80 | },
81 | {
82 | "filename" : "Icon-Small-40@2x-1.png",
83 | "idiom" : "ipad",
84 | "scale" : "2x",
85 | "size" : "40x40"
86 | },
87 | {
88 | "filename" : "Icon-76.png",
89 | "idiom" : "ipad",
90 | "scale" : "1x",
91 | "size" : "76x76"
92 | },
93 | {
94 | "filename" : "Icon-76@2x.png",
95 | "idiom" : "ipad",
96 | "scale" : "2x",
97 | "size" : "76x76"
98 | },
99 | {
100 | "filename" : "Icon-167.png",
101 | "idiom" : "ipad",
102 | "scale" : "2x",
103 | "size" : "83.5x83.5"
104 | },
105 | {
106 | "filename" : "iTunesArtwork@2x.png",
107 | "idiom" : "ios-marketing",
108 | "scale" : "1x",
109 | "size" : "1024x1024"
110 | }
111 | ],
112 | "info" : {
113 | "author" : "xcode",
114 | "version" : 1
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-167.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@1x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@2x-1.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@2x-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@2x-2.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-20@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-76.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/RunPipifierWebExt.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "RunPipifierWebExt.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/RunPipifierWebExt.imageset/RunPipifierWebExt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/RunPipifierWebExt.imageset/RunPipifierWebExt.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/activateWebExt.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "activateWebExt.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/activateWebExt.imageset/activateWebExt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/activateWebExt.imageset/activateWebExt.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/addMore.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "addMore.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/addMore.imageset/addMore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/addMore.imageset/addMore.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/editActions.imageset/Bildschirmfoto 2020-06-25 um 15.02.42.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/editActions.imageset/Bildschirmfoto 2020-06-25 um 15.02.42.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/editActions.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "Bildschirmfoto 2020-06-25 um 15.02.42.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/executePiPifier.imageset/Bildschirmfoto 2020-06-27 um 01.49.00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/executePiPifier.imageset/Bildschirmfoto 2020-06-27 um 01.49.00.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/executePiPifier.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "Bildschirmfoto 2020-06-27 um 01.49.00.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/extensionMenuButton.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "extensionMenuButton.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/extensionMenuButton.imageset/extensionMenuButton.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/extensionMenuButton.imageset/extensionMenuButton.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/manageExt.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "manageExt.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/manageExt.imageset/manageExt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/manageExt.imageset/manageExt.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/runPiPifier.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "runPiPifier.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/runPiPifier.imageset/runPiPifier.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/runPiPifier.imageset/runPiPifier.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/runPiPifierNew.imageset/Bildschirmfoto 2020-06-25 um 14.59.41.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/runPiPifierNew.imageset/Bildschirmfoto 2020-06-25 um 14.59.41.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/runPiPifierNew.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "Bildschirmfoto 2020-06-25 um 14.59.41.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/shareSheet.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "shareSheet.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/shareSheet.imageset/shareSheet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/shareSheet.imageset/shareSheet.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/shareSheetEnabled.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "shareSheetEnabled.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/shareSheetEnabled.imageset/shareSheetEnabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/shareSheetEnabled.imageset/shareSheetEnabled.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/websiteToolMenu.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "webtoolsButton.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Assets.xcassets/websiteToolMenu.imageset/webtoolsButton.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Assets.xcassets/websiteToolMenu.imageset/webtoolsButton.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/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 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | PiPifier
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 | $(MARKETING_VERSION)
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UIRequiresFullScreen
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/MainHostingVC.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainHostingVC.swift
3 | // PiPifier iOS
4 | //
5 | // Created by Arno Appenzeller on 25.06.20.
6 | // Copyright © 2020 APPenzeller. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftUI
11 |
12 | class MainHostingVC: UIHostingController {
13 | required init?(coder: NSCoder) {
14 | super.init(coder: coder,rootView: MainViewSwiftUI());
15 | }
16 |
17 | override func viewDidLoad() {
18 | super.viewDidLoad()
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/MainUICoordinator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainUICoordinator.swift
3 | // PiPifier iOS
4 | //
5 | // Created by Arno Appenzeller on 26.06.20.
6 | // Copyright © 2020 APPenzeller. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import SwiftUI
11 | import StoreKit
12 |
13 | struct ButtonState{
14 | var smallCupText = "Small cup of tea ☕️"
15 | var largeCupText = "Large cup of tea ☕️"
16 | var isLoading = true
17 | var showButtonAlert = false
18 | }
19 |
20 |
21 |
22 | class MainUICoordinator:NSObject,ObservableObject,SKProductsRequestDelegate, SKPaymentTransactionObserver{
23 |
24 | @Published var buttonState = ButtonState()
25 |
26 | override init() {
27 | super.init()
28 | print("custom init")
29 | SKPaymentQueue.default().add(self)
30 | }
31 |
32 |
33 | var productIDs: Array = ["PiPifier_iOS_Tea_Large","PiPifier_iOS_Tea"]
34 |
35 | var productsArray: Array = []
36 |
37 | var transactionInProgress = false
38 |
39 | func buySmallTea() {
40 | buyTeaProduct(index: 0)
41 | }
42 |
43 | func buyLargeTea() {
44 | buyTeaProduct(index: 1)
45 | }
46 |
47 | func buyTeaProduct(index:Int){
48 | buttonState.isLoading = false
49 | if transactionInProgress {
50 | return
51 | }
52 |
53 | let payment = SKPayment(product: self.productsArray[index] as SKProduct)
54 | SKPaymentQueue.default().add(payment)
55 | self.transactionInProgress = true
56 | }
57 |
58 | func buyButtonLoadingState(){
59 | buttonState.smallCupText = "Loading..."
60 | buttonState.largeCupText = "Loading..."
61 | buttonState.isLoading = true
62 | }
63 |
64 | func buyButtonFailureState(){
65 | buttonState.smallCupText = "Error Loading IAP 😫"
66 | buttonState.largeCupText = "Error Loading IAP 😫"
67 | buttonState.isLoading = true
68 | }
69 |
70 | func enableBuyButtonsWithPrice(prices:[NSDecimalNumber],currencySymbol:String){
71 | buttonState.smallCupText = "Small Cup of ☕️ (\(prices[0]) \(currencySymbol)) "
72 | buttonState.largeCupText = "Large Cup of ☕️ (\(prices[1]) \(currencySymbol)) "
73 | buttonState.isLoading = false
74 | }
75 |
76 |
77 | //MARK: In App Purchase
78 | func requestProductInfo() {
79 | if SKPaymentQueue.canMakePayments() {
80 | let productIdentifiers = NSSet(array: productIDs)
81 | let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set)
82 |
83 | productRequest.delegate = self
84 | productRequest.start()
85 | }
86 | else {
87 | NSLog("Cannot perform In App Purchases.")
88 | buyButtonFailureState()
89 | }
90 | }
91 |
92 |
93 | // MARK: SKProductsRequestDelegate method implementation
94 | func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
95 | if response.products.count != 0 {
96 | for product in response.products {
97 | productsArray.append(product )
98 | }
99 |
100 |
101 | let productPrices = [productsArray[0].price,productsArray[1].price]
102 | DispatchQueue.main.async{
103 | self.enableBuyButtonsWithPrice(prices: productPrices, currencySymbol:self.productsArray[0].priceLocale.currencySymbol!)
104 | }
105 | }
106 |
107 | else {
108 | NSLog("There are no products.")
109 | DispatchQueue.main.async{
110 | self.buyButtonFailureState()
111 | }
112 | }
113 | if response.invalidProductIdentifiers.count != 0 {
114 | NSLog(response.invalidProductIdentifiers.description)
115 | }
116 | }
117 |
118 |
119 | // MARK: SKPaymentTransactionObserver method implementation
120 | func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
121 | for transaction in transactions {
122 | switch transaction.transactionState {
123 | case SKPaymentTransactionState.purchased:
124 | NSLog("Transaction completed successfully.")
125 | SKPaymentQueue.default().finishTransaction(transaction)
126 | transactionInProgress = false
127 |
128 | self.buttonState.showButtonAlert = true
129 | self.buttonState.isLoading = false
130 |
131 |
132 |
133 | case SKPaymentTransactionState.failed:
134 | NSLog("Transaction Failed");
135 | SKPaymentQueue.default().finishTransaction(transaction)
136 | transactionInProgress = false
137 |
138 | DispatchQueue.main.async{
139 | self.buttonState.isLoading = false
140 | }
141 |
142 |
143 | default:
144 | NSLog("\(transaction.transactionState.rawValue)")
145 | }
146 | }
147 | }
148 |
149 | }
150 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/MainViewSwiftUI 2.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainViewSwiftUI.swift
3 | // PiPifier iOS
4 | //
5 | // Created by Arno Appenzeller on 25.06.20.
6 | // Copyright © 2020 APPenzeller. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 | import MessageUI
11 |
12 |
13 |
14 | func createButton(action:@escaping (()->()),text:String,isDisabled:Bool,isAlertPresenting:Binding, alert:Alert) -> some View{
15 | return Button(action: action) {Text(text)}
16 | .padding(.vertical, 3.0)
17 | .padding(.horizontal, 20.0)
18 | .frame(width:270)
19 | .background(isDisabled ? Color.gray : Color.blue)
20 | .foregroundColor(.white)
21 | .cornerRadius(12)
22 | .disabled(isDisabled)
23 | .alert(isPresented: isAlertPresenting) {
24 | alert
25 | }
26 | }
27 |
28 | struct MainViewSwiftUI: View {
29 | @State var result: Result? = nil
30 | @State var isShowingMailView = false
31 | @State var showButtonAlert = false
32 |
33 | var body: some View {
34 | ScrollView(.vertical){
35 | HStack(alignment: .center){
36 | VStack{
37 | VStack(spacing:10) {
38 | Text("Welcome to PiPifier")
39 | .font(.largeTitle)
40 | .fontWeight(.heavy)
41 | VStack(spacing:10) {
42 | Text("Installation:")
43 | .font(.title)
44 | .fontWeight(.heavy)
45 | Text("1. Open Safari")
46 | .fontWeight(.semibold)
47 | Text("2. Open the Share menu:")
48 | .fontWeight(.semibold)
49 | Image("shareSheet")
50 | .resizable()
51 | .aspectRatio(contentMode: .fit)
52 | .padding(.all, 1.0)
53 | .frame(width: 200, height: 35, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
54 | Text("3. Choose Edit Actions...")
55 | .fontWeight(.semibold)
56 | Image("editActions")
57 | .resizable()
58 | .aspectRatio(contentMode: .fit)
59 | .padding(.all, 1.0)
60 | .frame(width: 200, height: 35, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
61 | Text("4. Enable PiPifier")
62 | .fontWeight(.semibold)
63 | Image("runPiPifierNew")
64 | .resizable()
65 | .aspectRatio(contentMode: .fit)
66 | .padding(.all, 1.0)
67 | .frame(width: 200, height: 35, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
68 | Text("5. Run PiPifier on a website with a video:")
69 | .fontWeight(.semibold)
70 | Image("executePiPifier")
71 | .resizable()
72 | .aspectRatio(contentMode: .fit)
73 | .padding(.all, 1.0)
74 | .frame(width: 200, height: 35, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
75 | }
76 | }
77 | VStack(spacing:10) {
78 | Text("About:")
79 | .font(.title)
80 | .fontWeight(.heavy)
81 | Text("Pipifier is developed in the open and can be found on Github.")
82 | .fontWeight(.semibold)
83 | .multilineTextAlignment(.center)
84 | .padding()
85 | if UIDevice.current.userInterfaceIdiom == .pad {
86 | HStack(spacing:10) {
87 | if MFMailComposeViewController.canSendMail() {
88 | createButton(action: {self.isShowingMailView.toggle()}, text: "Send Email", isDisabled: false, isAlertPresenting: $showButtonAlert,alert: Alert(title: Text(NSLocalizedString("Thanks!", comment: "thanks")), message: Text(NSLocalizedString("Hey it's Arno.\n I want to say a big thank you! With your tip you support me developping more cool stuff for iOS and macOS.\n Thank you for making this possible ❤️", comment: "personal notice")), dismissButton: .default(Text("OK"))))
89 | }
90 | }
91 | }
92 | else{
93 | VStack(spacing:10) {
94 | if MFMailComposeViewController.canSendMail() {
95 | createButton(action: {self.isShowingMailView.toggle()}, text: "Send Email", isDisabled: false, isAlertPresenting: $showButtonAlert,alert: Alert(title: Text(NSLocalizedString("Thanks!", comment: "thanks")), message: Text(NSLocalizedString("Hey it's Arno.\n I want to say a big thank you! With your tip you support me developping more cool stuff for iOS and macOS.\n Thank you for making this possible ❤️", comment: "personal notice")), dismissButton: .default(Text("OK"))))
96 | }
97 |
98 | }
99 | }
100 | }
101 | }
102 | }
103 | }
104 | .sheet(isPresented: $isShowingMailView) {
105 | MailView(isShowing: self.$isShowingMailView, result: self.$result)
106 | }
107 | }
108 | }
109 |
110 | struct MainViewSwiftUI_Previews: PreviewProvider {
111 | static var previews: some View {
112 | Group {
113 | MainViewSwiftUI()
114 | .previewDevice(PreviewDevice(rawValue: "iPhone 11 Pro"))
115 | .previewDisplayName("iPhone 11 Pro")
116 |
117 | MainViewSwiftUI()
118 | .preferredColorScheme(.dark)
119 | .previewDevice(PreviewDevice(rawValue: "iPhone 11 Pro"))
120 | .previewDisplayName("iPhone 11 Pro Dark")
121 |
122 | MainViewSwiftUI()
123 | .previewDevice("iPhone SE (2nd generation)")
124 | .previewDisplayName("iPhone SE")
125 |
126 |
127 | MainViewSwiftUI()
128 | .previewDevice("iPad Pro (11-inch) (2nd generation)")
129 | .previewDisplayName("iPad Pro (11-inch)")
130 | }
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/MainViewSwiftUI.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainViewSwiftUI.swift
3 | // PiPifier iOS
4 | //
5 | // Created by Arno Appenzeller on 25.06.20.
6 | // Copyright © 2020 APPenzeller. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 | import MessageUI
11 |
12 |
13 | func createButton(action:@escaping (()->()),text:String,isDisabled:Bool,isAlertPresenting:Binding, alert:Alert) -> some View{
14 | return Button(action: action) {Text(text)}
15 | .padding(.vertical, 3.0)
16 | .padding(.horizontal, 20.0)
17 | .frame(width:270)
18 | .background(isDisabled ? Color.gray : Color.blue)
19 | .foregroundColor(.white)
20 | .cornerRadius(12)
21 | .disabled(isDisabled)
22 | .alert(isPresented: isAlertPresenting) {
23 | alert
24 | }
25 | }
26 |
27 | struct MainViewSwiftUI: View {
28 | @State var result: Result? = nil
29 | @State var isShowingMailView = false
30 | @State var showButtonAlert = false
31 |
32 |
33 | var body: some View {
34 | ScrollView(.vertical){
35 | HStack(alignment: .center){
36 | VStack{
37 | VStack(spacing:10) {
38 | Text("Welcome to PiPifier")
39 | .font(.largeTitle)
40 | .fontWeight(.heavy)
41 | VStack(spacing:10) {
42 | Text("Installation:")
43 | .font(.title)
44 | .fontWeight(.heavy)
45 | Text("1. Open Safari")
46 | .fontWeight(.semibold)
47 | if UIDevice.current.userInterfaceIdiom == .pad {
48 | Text("2. Open the Extension Menu:")
49 | .fontWeight(.semibold)
50 | Image("extensionMenuButton")
51 | .resizable()
52 | .aspectRatio(contentMode: .fit)
53 | .padding(.all, 1.0)
54 | .frame(width: 200, height: 35, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
55 | }
56 | else{
57 | Text("2. Open the Website Tools Menu:")
58 | .fontWeight(.semibold)
59 | Image("websiteToolMenu")
60 | .resizable()
61 | .aspectRatio(contentMode: .fit)
62 | .padding(.all, 1.0)
63 | .frame(width: 200, height: 35, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
64 | }
65 | Text("3. Choose Manage Extensions")
66 | .fontWeight(.semibold)
67 | Image("manageExt")
68 | .resizable()
69 | .aspectRatio(contentMode: .fit)
70 | .padding(.all, 1.0)
71 | .frame(width: 200, height: 35, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
72 | Text("4. Enable PiPifier")
73 | .fontWeight(.semibold)
74 | Image("activateWebExt")
75 | .resizable()
76 | .aspectRatio(contentMode: .fit)
77 | .padding(.all, 1.0)
78 | .frame(width: 200, height: 35, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
79 | Text("5. Run PiPifier on a website with a Video:")
80 | .fontWeight(.semibold)
81 | Image("RunPipifierWebExt")
82 | .resizable()
83 | .aspectRatio(contentMode: .fit)
84 | .padding(.all, 1.0)
85 | .frame(width: 200, height: 35, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
86 | }
87 | }
88 | }
89 | }
90 | }
91 | }
92 | }
93 |
94 | struct MainViewSwiftUI_Previews: PreviewProvider {
95 | static var previews: some View {
96 | Group {
97 | MainViewSwiftUI()
98 | .previewDevice(PreviewDevice(rawValue: "iPhone 11 Pro"))
99 | .previewDisplayName("iPhone 11 Pro")
100 |
101 | MainViewSwiftUI()
102 | .preferredColorScheme(.dark)
103 | .previewDevice(PreviewDevice(rawValue: "iPhone 11 Pro"))
104 | .previewDisplayName("iPhone 11 Pro Dark")
105 |
106 | MainViewSwiftUI()
107 | .previewDevice("iPhone SE (2nd generation)")
108 | .previewDisplayName("iPhone SE")
109 |
110 |
111 | MainViewSwiftUI()
112 | .previewDevice("iPad Pro (11-inch) (2nd generation)")
113 | .previewDisplayName("iPad Pro (11-inch)")
114 | }
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/RoundRectButton.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RoundRectButton.swift
3 | // PiPifier iOS
4 | //
5 | // Created by Arno Appenzeller on 18.05.17.
6 | // Copyright © 2017 APPenzeller. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @IBDesignable
12 | class RoundRectButton: UIButton {
13 |
14 | @IBInspectable
15 | public var cornerRadius: CGFloat = 2.0 {
16 | didSet {
17 | self.layer.cornerRadius = self.cornerRadius
18 | }
19 | }
20 |
21 | @IBInspectable
22 | public var borderWidth: CGFloat = 1.0 {
23 | didSet{
24 | self.layer.borderWidth = self.borderWidth
25 | }
26 | }
27 |
28 | @IBInspectable
29 | public var borderColor: UIColor = UIColor.blue {
30 | didSet{
31 | self.layer.borderColor = self.borderColor.cgColor
32 | }
33 | }
34 | /*
35 | // Only override draw() if you perform custom drawing.
36 | // An empty implementation adversely affects performance during animation.
37 | override func draw(_ rect: CGRect) {
38 | // Drawing code
39 | }
40 | */
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Screens/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Screens/1.jpg
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Screens/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Screens/2.jpg
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Screens/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Screens/3.jpg
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/Screens/PiPifier iOS Screens.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier iOS/Screens/PiPifier iOS Screens.zip
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/SwiftUI Representables/MailView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MailView.swift
3 | // PiPifier iOS
4 | //
5 | // Created by Arno on 27.06.20.
6 | // Copyright © 2020 APPenzeller. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 | import MessageUI
11 |
12 | struct MailView: UIViewControllerRepresentable {
13 |
14 | @Binding var isShowing: Bool
15 | @Binding var result: Result?
16 |
17 | class Coordinator: NSObject, MFMailComposeViewControllerDelegate {
18 |
19 | @Binding var isShowing: Bool
20 | @Binding var result: Result?
21 |
22 | init(isShowing: Binding,
23 | result: Binding?>) {
24 | _isShowing = isShowing
25 | _result = result
26 | }
27 |
28 | func mailComposeController(_ controller: MFMailComposeViewController,
29 | didFinishWith result: MFMailComposeResult,
30 | error: Error?) {
31 | defer {
32 | isShowing = false
33 | }
34 | guard error == nil else {
35 | self.result = .failure(error!)
36 | return
37 | }
38 | self.result = .success(result)
39 | }
40 | }
41 |
42 | func makeCoordinator() -> Coordinator {
43 | return Coordinator(isShowing: $isShowing,
44 | result: $result)
45 | }
46 |
47 | func makeUIViewController(context: UIViewControllerRepresentableContext) -> MFMailComposeViewController {
48 | let vc = MFMailComposeViewController()
49 | vc.setToRecipients(["support@app-enzeller.com"])
50 | vc.setSubject(NSLocalizedString("PiPifier iOS Feedback",comment: "pipifierFeedBackMailHeader"))
51 | vc.setMessageBody(NSLocalizedString("Hi, \n I have some feedback for PiPifier.",comment: "pipifierFeedBackMailContetn"), isHTML: false)
52 | vc.mailComposeDelegate = context.coordinator
53 | return vc
54 | }
55 |
56 | func updateUIViewController(_ uiViewController: MFMailComposeViewController,
57 | context: UIViewControllerRepresentableContext) {
58 |
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier iOS/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // PiPifier iOS
4 | //
5 | // Created by Arno Appenzeller on 09.05.17.
6 | // Copyright © 2017 APPenzeller. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import MessageUI
11 | import StoreKit
12 |
13 | class ViewController: UIViewController,MFMailComposeViewControllerDelegate,SKProductsRequestDelegate, SKPaymentTransactionObserver {
14 |
15 | var productIDs: Array = ["PiPifier_iOS_Tea_Large","PiPifier_iOS_Tea"]
16 |
17 | var productsArray: Array = []
18 |
19 | var transactionInProgress = false
20 |
21 | @IBOutlet weak var smallCupButton: UIButton!
22 | @IBOutlet weak var largeCupButton: UIButton!
23 |
24 | override func viewDidLoad() {
25 | super.viewDidLoad()
26 | // Do any additional setup after loading the view, typically from a nib.
27 | //enableBuyButtonsWithPrice(prices: [0.99,1.99], currencySymbol: "$")
28 | buyButtonLoadingState()
29 | requestProductInfo()
30 |
31 | }
32 |
33 |
34 | override func didReceiveMemoryWarning() {
35 | super.didReceiveMemoryWarning()
36 | // Dispose of any resources that can be recreated.
37 | }
38 |
39 |
40 | //----------------------------------------------------------------------------
41 | //MARK: - Mail Methods
42 |
43 | @IBAction func sendMail(_ sender: UIButton) {
44 | if (MFMailComposeViewController.canSendMail()) {
45 | let mailComposer = MFMailComposeViewController()
46 | mailComposer.mailComposeDelegate = self
47 | mailComposer.setToRecipients(["support@app-enzeller.com"])
48 | mailComposer.setSubject(NSLocalizedString("PiPifier iOS Feedback",comment: "pipifierFeedBackMailHeader"))
49 | mailComposer.setMessageBody(NSLocalizedString("Hi, \n I have some feedback for PiPifier.",comment: "pipifierFeedBackMailContetn"), isHTML: false)
50 |
51 | self.present(mailComposer, animated: true, completion: nil)
52 | }
53 | else{
54 | let alert = UIAlertController(title: NSLocalizedString("Warning", comment: "warning"), message: NSLocalizedString("It looks like your device is not able to send a mail. Please check your settings and try again", comment: "mailError"), preferredStyle: .alert)
55 | let ok = UIAlertAction(title: "Ok", style: .default, handler: nil)
56 | alert.addAction(ok)
57 | self.present(alert, animated: true, completion: nil)
58 | }
59 | }
60 |
61 | func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
62 | self.dismiss(animated: true, completion: nil)
63 | }
64 |
65 | //----------------------------------------------------------------------------
66 | //MARK: - In-App Purchase methods
67 |
68 | @IBAction func buySmallTea(_ sender: UIButton) {
69 | buyTeaProduct(index: 0)
70 | }
71 |
72 | @IBAction func buyLargeTea(_ sender: UIButton) {
73 | buyTeaProduct(index: 1)
74 | }
75 |
76 | func buyTeaProduct(index:Int){
77 | buyButtonDisabled()
78 | if transactionInProgress {
79 | return
80 | }
81 |
82 | let payment = SKPayment(product: self.productsArray[index] as SKProduct)
83 | SKPaymentQueue.default().add(payment)
84 | self.transactionInProgress = true
85 | }
86 |
87 | func buyButtonLoadingState(){
88 | smallCupButton.setTitle("Loading...", for: .disabled)
89 | largeCupButton.setTitle("Loading...", for: .disabled)
90 | buyButtonDisabled()
91 | }
92 |
93 | func buyButtonFailureState(){
94 | smallCupButton.setTitle("Error Loading IAP 😫", for: .disabled)
95 | largeCupButton.setTitle("Error Loading IAP 😫", for: .disabled)
96 | buyButtonDisabled()
97 | }
98 |
99 | func enableBuyButtonsWithPrice(prices:[NSDecimalNumber],currencySymbol:String){
100 | smallCupButton.setTitle("Small Cup of ☕️ (\(prices[0]) \(currencySymbol)) ", for: .normal)
101 | largeCupButton.setTitle("Large Cup of ☕️ (\(prices[1]) \(currencySymbol)) ", for: .normal)
102 | buyButtonEnabled()
103 | }
104 |
105 | func buyButtonDisabled(){
106 | smallCupButton.isEnabled = false
107 | largeCupButton.isEnabled = false
108 | (smallCupButton as! RoundRectButton).borderColor = UIColor.lightGray
109 | (largeCupButton as! RoundRectButton).borderColor = UIColor.lightGray
110 | }
111 |
112 | func buyButtonEnabled(){
113 | smallCupButton.isEnabled = true
114 | largeCupButton.isEnabled = true
115 | (smallCupButton as! RoundRectButton).borderColor = smallCupButton.tintColor
116 | (largeCupButton as! RoundRectButton).borderColor = largeCupButton.tintColor
117 | }
118 |
119 | func requestProductInfo() {
120 | if SKPaymentQueue.canMakePayments() {
121 | let productIdentifiers = NSSet(array: productIDs)
122 | let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set)
123 |
124 | productRequest.delegate = self
125 | productRequest.start()
126 | }
127 | else {
128 | NSLog("Cannot perform In App Purchases.")
129 | buyButtonFailureState()
130 | }
131 | }
132 |
133 |
134 | // MARK: SKProductsRequestDelegate method implementation
135 | func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
136 | if response.products.count != 0 {
137 | for product in response.products {
138 | productsArray.append(product )
139 | }
140 |
141 |
142 | let productPrices = [productsArray[0].price,productsArray[1].price]
143 | DispatchQueue.main.async{
144 | self.enableBuyButtonsWithPrice(prices: productPrices, currencySymbol:self.productsArray[0].priceLocale.currencySymbol!)
145 | }
146 | }
147 |
148 | else {
149 | NSLog("There are no products.")
150 | DispatchQueue.main.async{
151 | self.buyButtonFailureState()
152 | }
153 | }
154 | if response.invalidProductIdentifiers.count != 0 {
155 | NSLog(response.invalidProductIdentifiers.description)
156 | }
157 | }
158 |
159 |
160 | // MARK: SKPaymentTransactionObserver method implementation
161 | func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
162 | for transaction in transactions {
163 | switch transaction.transactionState {
164 | case SKPaymentTransactionState.purchased:
165 | NSLog("Transaction completed successfully.")
166 | SKPaymentQueue.default().finishTransaction(transaction)
167 | transactionInProgress = false
168 |
169 |
170 | DispatchQueue.main.async{
171 | let alert = UIAlertController(title: NSLocalizedString("Thanks!", comment: "thanks"), message: NSLocalizedString("Hey it's Arno.\n I want to say a big thank you! With your tip you support me developping more cool stuff for iOS and macOS.\n Thank you for making this possible ❤️", comment: "personal notice"), preferredStyle: .alert)
172 | let ok = UIAlertAction(title: "Ok", style: .default, handler: nil)
173 | alert.addAction(ok)
174 | self.present(alert, animated: true, completion: nil)
175 | self.buyButtonEnabled()
176 | }
177 |
178 |
179 |
180 | case SKPaymentTransactionState.failed:
181 | NSLog("Transaction Failed");
182 | SKPaymentQueue.default().finishTransaction(transaction)
183 | transactionInProgress = false
184 |
185 | DispatchQueue.main.async{
186 | self.buyButtonEnabled()
187 | }
188 |
189 |
190 | default:
191 | NSLog("\(transaction.transactionState.rawValue)")
192 | }
193 | }
194 | }
195 |
196 |
197 |
198 | }
199 |
200 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSExtension
6 |
7 | NSExtensionPointIdentifier
8 | com.apple.Safari.web-extension
9 | NSExtensionPrincipalClass
10 | $(PRODUCT_MODULE_NAME).SafariWebExtensionHandler
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/_locales/en/messages.json:
--------------------------------------------------------------------------------
1 | {
2 | "extension_name": {
3 | "message": "PiPifier-WebExtension",
4 | "description": "The display name for the extension."
5 | },
6 | "extension_description": {
7 | "message": "This is PiPifier-WebExtension. You should tell us what your extension does here.",
8 | "description": "Description of what the extension does."
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/background.js:
--------------------------------------------------------------------------------
1 | browser.browserAction.onClicked.addListener(
2 | function(){
3 | browser.tabs.executeScript({file:"content.js"});
4 | }
5 | );
6 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/content.js:
--------------------------------------------------------------------------------
1 | function runPiPifier(){
2 |
3 | var videoCount = document.getElementsByTagName('video').length;
4 | //check iFrames
5 | if (videoCount == 0) {
6 | var embeddedYT = document.getElementsByClassName('youtube-player');
7 | if (embeddedYT.length > 0) {
8 | videoCount = embeddedYT[0].getElementsByTagName('video').length;
9 | }
10 | }
11 |
12 | var errorMessage = "No compatible video found.\n\nPlease note that if the video is an embedded video (like Youtube player on another site) this will only work on the main page"
13 | if (videoCount > 0) {
14 | var video;
15 | if (document.getElementsByTagName('video').length > 0){
16 | video = document.getElementsByTagName('video')[0];
17 | }
18 | //check iframe
19 | else{
20 | video = document.getElementsByClassName('youtube-player')[0].getElementsByTagName('video')[0];
21 | }
22 | video.webkitSetPresentationMode('picture-in-picture');
23 |
24 | } else {
25 | // If nothing's been returned to us, we'll set the background to
26 | // blue.
27 | alert("Pipifier Message: " + errorMessage);
28 | }
29 | }
30 |
31 | runPiPifier();
32 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-128w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-128w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-256w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-256w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-48w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-48w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-512w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-512w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-96w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/IconWebApp-96w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtIcon-16w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtIcon-16w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtIcon-19w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtIcon-19w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtIcon-32w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtIcon-32w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtIcon-38w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtIcon-38w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtensionIcon-16w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtensionIcon-16w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtensionIcon-19w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtensionIcon-19w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtensionIcon-32w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtensionIcon-32w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtensionIcon-38w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/PiPifier iOS/PiPifier-WebExtension/Resources/images/WebExtensionIcon-38w.png
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "manifest_version": 2,
3 | "default_locale": "en",
4 |
5 | "name": "PiPifier",
6 | "description": "__MSG_extension_description__",
7 | "version": "1.0",
8 |
9 | "icons": {
10 | "48": "images/IconWebApp-48w.png",
11 | "96": "images/IconWebApp-96w.png",
12 | "128": "images/IconWebApp-128w.png",
13 | "256": "images/IconWebApp-256w.png",
14 | "512": "images/IconWebApp-512w.png"
15 | },
16 |
17 | "background": {
18 | "scripts": [ "background.js" ],
19 | "persistent": false
20 | },
21 |
22 |
23 | "browser_action": {
24 | "default_icon": {
25 | "16": "images/WebExtIcon-16w.png",
26 | "19": "images/WebExtIcon-19w.png",
27 | "32": "images/WebExtIcon-32w.png",
28 | "38": "images/WebExtIcon-38w.png"
29 | }
30 | },
31 |
32 | "permissions": ["activeTab"]
33 | }
34 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/popup.css:
--------------------------------------------------------------------------------
1 | :root {
2 | color-scheme: light dark;
3 | }
4 |
5 | body {
6 | width: 100px;
7 | padding: 10px;
8 |
9 | font-family: system-ui;
10 | text-align: center;
11 | }
12 |
13 | @media (prefers-color-scheme: dark) {
14 | /* Dark Mode styles go here. */
15 | }
16 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/popup.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | Hello World!
10 |
11 |
12 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/Resources/popup.js:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier-WebExtension/SafariWebExtensionHandler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SafariWebExtensionHandler.swift
3 | // PiPifier-WebExtension
4 | //
5 | // Created by Arno on 14.08.21.
6 | // Copyright © 2021 APPenzeller. All rights reserved.
7 | //
8 |
9 | import SafariServices
10 | import os.log
11 |
12 | class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {
13 |
14 | func beginRequest(with context: NSExtensionContext) {
15 | let item = context.inputItems[0] as! NSExtensionItem
16 | let message = item.userInfo?[SFExtensionMessageKey]
17 | os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", message as! CVarArg)
18 |
19 | let response = NSExtensionItem()
20 | response.userInfo = [ SFExtensionMessageKey: [ "Response to": message ] ]
21 |
22 | context.completeRequest(returningItems: [response], completionHandler: nil)
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier/ActionRequestHandler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ActionRequestHandler.swift
3 | // PiPifier
4 | //
5 | // Created by Arno Appenzeller on 09.05.17.
6 | // Copyright © 2017 APPenzeller. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import MobileCoreServices
11 |
12 | class ActionRequestHandler: NSObject, NSExtensionRequestHandling {
13 |
14 | var extensionContext: NSExtensionContext?
15 |
16 | func beginRequest(with context: NSExtensionContext) {
17 | // Do not call super in an Action extension with no user interface
18 | self.extensionContext = context
19 |
20 | var found = false
21 |
22 |
23 | // Find the item containing the results from the JavaScript preprocessing.
24 | outer:
25 | for item in context.inputItems as! [NSExtensionItem] {
26 | if let attachments = item.attachments {
27 | for itemProvider in attachments {
28 | if itemProvider.hasItemConformingToTypeIdentifier(String(kUTTypePropertyList)) {
29 | itemProvider.loadItem(forTypeIdentifier: String(kUTTypePropertyList), options: nil, completionHandler: { (item, error) in
30 | let dictionary = item as! [String: Any]
31 | OperationQueue.main.addOperation {
32 | self.itemLoadCompletedWithPreprocessingResults(dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as! [String: Any]? ?? [:])
33 | }
34 | })
35 | found = true
36 | break outer
37 | }
38 | }
39 | }
40 | }
41 |
42 | if !found {
43 | self.doneWithVideoFound(videoFound: false)
44 | }
45 | }
46 |
47 | func itemLoadCompletedWithPreprocessingResults(_ javaScriptPreprocessingResults: [String: Any]) {
48 | // Here, do something, potentially asynchronously, with the preprocessing
49 | // results.
50 |
51 | // In this very simple example, the JavaScript will have passed us the
52 | // current background color style, if there is one. We will construct a
53 | // dictionary to send back with a desired new background color style.
54 | let videoCount = javaScriptPreprocessingResults["videoCount"] as! Int
55 | if videoCount == 0 {
56 | self.doneWithVideoFound(videoFound: false)
57 | }
58 | else{
59 | self.doneWithVideoFound(videoFound: true)
60 | }
61 | }
62 |
63 | func doneWithVideoFound(videoFound:Bool) {
64 | let resultsDictionary = [NSExtensionJavaScriptFinalizeArgumentKey: ["videoOnPage":videoFound ? 1 : 0, "errorMessage" : NSLocalizedString("No compatible video found.\n\nPlease note that if the video is an embedded video (like Youtube player on another site) this will only work on the main page", comment: "errorMessage")]]
65 |
66 | let resultsProvider = NSItemProvider(item: resultsDictionary as NSDictionary, typeIdentifier: String(kUTTypePropertyList))
67 |
68 | let resultsItem = NSExtensionItem()
69 | resultsItem.attachments = [resultsProvider]
70 |
71 | // Signal that we're complete, returning our results.
72 | self.extensionContext!.completeRequest(returningItems: [resultsItem], completionHandler: nil)
73 |
74 | // Don't hold on to this after we finished with it.
75 | self.extensionContext = nil
76 | }
77 |
78 | }
79 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | Run PiPifier
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 | $(MARKETING_VERSION)
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | NSExtension
24 |
25 | NSExtensionAttributes
26 |
27 | NSExtensionActivationRule
28 |
29 | NSExtensionActivationSupportsFileWithMaxCount
30 | 0
31 | NSExtensionActivationSupportsImageWithMaxCount
32 | 0
33 | NSExtensionActivationSupportsMovieWithMaxCount
34 | 0
35 | NSExtensionActivationSupportsText
36 |
37 | NSExtensionActivationSupportsWebURLWithMaxCount
38 | 1
39 |
40 | NSExtensionJavaScriptPreprocessingFile
41 | PiPifierExtensionJavaScript
42 |
43 | NSExtensionPointIdentifier
44 | com.apple.services
45 | NSExtensionPrincipalClass
46 | $(PRODUCT_MODULE_NAME).ActionRequestHandler
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier/PiPifierExtensionJavaScript.js:
--------------------------------------------------------------------------------
1 | //
2 | // Action.js
3 | // PiPifier
4 | //
5 | // Created by Arno Appenzeller on 09.05.17.
6 | // Copyright © 2017 APPenzeller. All rights reserved.
7 | //
8 |
9 | var PiPifierExtensionClass = function() {};
10 |
11 | PiPifierExtensionClass.prototype = {
12 |
13 | run: function(arguments) {
14 | // Here, you can run code that modifies the document and/or prepares
15 | // things to pass to your action's native code.
16 |
17 | // We will not modify anything, but will pass the body's background
18 | // style to the native code.
19 |
20 | var videoCount = document.getElementsByTagName('video').length;
21 | //check iFrames
22 | if (videoCount == 0) {
23 | var embeddedYT = document.getElementsByClassName('youtube-player');
24 | if (embeddedYT.length > 0) {
25 | videoCount = embeddedYT[0].getElementsByTagName('video').length;
26 | }
27 | }
28 |
29 |
30 | arguments.completionFunction({ "videoCount" : document.getElementsByTagName('video').length})
31 | },
32 |
33 | finalize: function(arguments) {
34 | // This method is run after the native code completes.
35 |
36 | // We'll see if the native code has passed us a new background style,
37 | // and set it on the body.
38 |
39 | var videoOnPage = arguments["videoOnPage"];
40 | var errorMessage = arguments["errorMessage"];
41 | if (videoOnPage == 1) {
42 | var video;
43 | if (document.getElementsByTagName('video').length > 0){
44 | video = document.getElementsByTagName('video')[0];
45 | }
46 | //check iframe
47 | else{
48 | video = document.getElementsByClassName('youtube-player')[0].getElementsByTagName('video')[0];
49 | }
50 | video.webkitSetPresentationMode('picture-in-picture');
51 |
52 | } else {
53 | // If nothing's been returned to us, we'll set the background to
54 | // blue.
55 | alert("Pipifier Message: " + errorMessage);
56 | }
57 | }
58 |
59 | };
60 |
61 | var ExtensionPreprocessingJS = new PiPifierExtensionClass
62 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier/TemplateAppIcon.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "iPhone Notification 20pt@2x.png",
5 | "idiom" : "iphone",
6 | "scale" : "2x",
7 | "size" : "20x20"
8 | },
9 | {
10 | "filename" : "iPhone Notification 20pt@3x.png",
11 | "idiom" : "iphone",
12 | "scale" : "3x",
13 | "size" : "20x20"
14 | },
15 | {
16 | "filename" : "iPhone Settings 29pt@2x.png",
17 | "idiom" : "iphone",
18 | "scale" : "2x",
19 | "size" : "29x29"
20 | },
21 | {
22 | "filename" : "iPhone Settings 29pt@3x.png",
23 | "idiom" : "iphone",
24 | "scale" : "3x",
25 | "size" : "29x29"
26 | },
27 | {
28 | "filename" : "iPad Spotlight 40pt@2x-1.png",
29 | "idiom" : "iphone",
30 | "scale" : "2x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "filename" : "iPhone Spotlight 40pt@3x.png",
35 | "idiom" : "iphone",
36 | "scale" : "3x",
37 | "size" : "40x40"
38 | },
39 | {
40 | "filename" : "iPhone App 60pt@2x.png",
41 | "idiom" : "iphone",
42 | "scale" : "2x",
43 | "size" : "60x60"
44 | },
45 | {
46 | "filename" : "iPhone App 60pt@3x.png",
47 | "idiom" : "iphone",
48 | "scale" : "3x",
49 | "size" : "60x60"
50 | },
51 | {
52 | "filename" : "iPad Notification 20pt.png",
53 | "idiom" : "ipad",
54 | "scale" : "1x",
55 | "size" : "20x20"
56 | },
57 | {
58 | "filename" : "iPad Notification 20pt@2x.png",
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "20x20"
62 | },
63 | {
64 | "filename" : "iPad Settings 29pt.png",
65 | "idiom" : "ipad",
66 | "scale" : "1x",
67 | "size" : "29x29"
68 | },
69 | {
70 | "filename" : "iPad Settings 29pt@2x.png",
71 | "idiom" : "ipad",
72 | "scale" : "2x",
73 | "size" : "29x29"
74 | },
75 | {
76 | "filename" : "iPad Spotlight 40pt.png",
77 | "idiom" : "ipad",
78 | "scale" : "1x",
79 | "size" : "40x40"
80 | },
81 | {
82 | "filename" : "iPad Spotlight 40pt@2x.png",
83 | "idiom" : "ipad",
84 | "scale" : "2x",
85 | "size" : "40x40"
86 | },
87 | {
88 | "filename" : "iPad App 76pt.png",
89 | "idiom" : "ipad",
90 | "scale" : "1x",
91 | "size" : "76x76"
92 | },
93 | {
94 | "filename" : "iPad App 76pt@2x.png",
95 | "idiom" : "ipad",
96 | "scale" : "2x",
97 | "size" : "76x76"
98 | },
99 | {
100 | "filename" : "iPad Pro App 83,5pt@2x.png",
101 | "idiom" : "ipad",
102 | "scale" : "2x",
103 | "size" : "83.5x83.5"
104 | },
105 | {
106 | "filename" : "App Store iOS.png",
107 | "idiom" : "ios-marketing",
108 | "scale" : "1x",
109 | "size" : "1024x1024"
110 | }
111 | ],
112 | "info" : {
113 | "author" : "xcode",
114 | "version" : 1
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/PiPifier iOS/PiPifier/TemplateAppIcon.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/PiPifier iOS/Test/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Test
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 | NSExtensionAttributes
26 |
27 | QLSupportedContentTypes
28 |
29 |
30 | NSExtensionPointIdentifier
31 | com.apple.quicklook.thumbnail
32 | NSExtensionPrincipalClass
33 | $(PRODUCT_MODULE_NAME).ThumbnailProvider
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/PiPifier iOS/Test/ThumbnailProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ThumbnailProvider.swift
3 | // Test
4 | //
5 | // Created by Arno Appenzeller on 05.06.17.
6 | // Copyright © 2017 APPenzeller. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import QuickLook
11 |
12 | class ThumbnailProvider: QLThumbnailProvider {
13 |
14 | override func provideThumbnail(for request: QLFileThumbnailRequest, _ handler: @escaping (QLThumbnailReply?, Error?) -> Void) {
15 |
16 | // There are three ways to provide a thumbnail through a QLThumbnailReply. Only one of them should be used.
17 |
18 | // First way: Draw the thumbnail into the current context, set up with UIKit's coordinate system.
19 | handler(QLThumbnailReply(contextSize: request.maximumSize, currentContextDrawing: { () -> Bool in
20 | // Draw the thumbnail here.
21 |
22 | // Return true if the thumbnail was successfully drawn inside this block.
23 | return true
24 | }), nil)
25 |
26 | /*
27 |
28 | // Second way: Draw the thumbnail into a context passed to your block, set up with Core Graphics' coordinate system.
29 | handler(QLThumbnailReply(contextSize: request.maximumSize, drawing: { (context) -> Bool in
30 | // Draw the thumbnail here.
31 |
32 | // Return true if the thumbnail was successfully drawn inside this block.
33 | return true
34 | }), nil)
35 |
36 | // Third way: Set an image file URL.
37 | handler(QLThumbnailReply(imageFileURL: Bundle.main.url(forResource: "fileThumbnail", withExtension: "jpg")!), nil)
38 |
39 | */
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/PiPifier.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/PiPifier.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/PiPifier.xcworkspace/xcuserdata/arno.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | 
3 | # PiPifier
4 | PiPifier is a macOS 10.12 and iOS Safari (action) extension that lets you use every HTML5 video in Picture in Picture mode
5 |
6 |
7 | # macOS
8 | ## Download
9 | It's free on the Mac AppStore. Get it [here](https://itunes.apple.com/app/pipifier-pip-for-nearly-every/id1160374471?mt=12)
10 |
11 | ## How to use?
12 | If you have an HTML5 video playing on any website like Youtube just press the PiPifier icon in Safari's toolbar to enable Picture-In-Picture for this video. Make sure you did interact with the video player once before pressing (like play/pause).
13 |
14 | 
15 |
16 | ## Requirements
17 | For usage: macOS 10.12
18 | For developement: Latest Xcode
19 |
20 | ## Installation
21 | (0. Launch PiPifier)
22 | 1. Open Safari and go to Preferences
23 | 2. Go to Extensions
24 | 3. Enable PiPifier (If you don't see PiPifier and you built the app by yourself you need to sign it or choose Developer -> Allow unsigned extensions)
25 | 4. Choose View > Customize Toolbar and drag the PiPifier icon to your toolbar
26 | 5. To use Pipifier just press the icon when you're watching to an HTML5 video (Note: You need to interact with the video once. If it's autoplaying just pause and play again)
27 |
28 | # iOS
29 | ## Download
30 | It's free on the AppStore. Get it [here](https://itunes.apple.com/app/pipifier-pip-for-every-web-video/id1234771095?mt=8)
31 |
32 | ## How to use
33 | If you have an HTML5 video playing on any website like Youtube press the share button and select the 'Run PiPifier' Action Extension
34 |
35 | 
36 |
37 | ## Why?
38 | There are many sites that avoids you using iOS default video controls (YouTube for example) so you can't enable PiP mode. PiPifier lets you enable PiP regardless those limitations.
39 |
40 | ## Requirements
41 | For usage: iPad with iOS 10 or iPhone with iOS 14
42 | For developement: Latest Xcode
43 |
44 | ## Installation
45 | 1. Open Safari
46 | 2. Open the Share Menu
47 | 3. Choose More
48 | 4. Enable 'Run PiPifier'
49 | 5. Select 'Run PiPifier' on a website with a video
50 |
51 | # How can I help?
52 | If you are a developer feel free to make any addition to improve PiPifier.
53 |
54 | If you are user and want a native PiP button in any video player please make a request in the corresponding [issue](https://github.com/arnoappenzeller/PiPifier/issues/12)
55 |
56 | # Note for developers
57 | The code is a bit dirty and there are some unused parts in it (Tried to add more features before I needed to focus on other things). If you want to help me clean it up feel free to do so :)
58 |
59 | # Contact
60 | Made by [@arno_app](https://twitter.com/arno_app) with an important bug fix by [@Cacauu_de](https://twitter.com/Cacauu_de).
61 |
--------------------------------------------------------------------------------
/macOS/App Icon - Apple macOS Big Sur.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/App Icon - Apple macOS Big Sur.sketch
--------------------------------------------------------------------------------
/macOS/Icon/macOS10/icon-10241024w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS10/icon-10241024w.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS10/icon-1024128w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS10/icon-1024128w.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS10/icon-102416w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS10/icon-102416w.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS10/icon-1024256w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS10/icon-1024256w.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS10/icon-102432w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS10/icon-102432w.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS10/icon-1024512w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS10/icon-1024512w.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS10/icon-102464w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS10/icon-102464w.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Icon Template Mac 512pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Icon Template Mac 512pt.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 128pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 128pt.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 128pt@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 128pt@2x.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 16pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 16pt.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 16pt@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 16pt@2x.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 256pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 256pt.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 256pt@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 256pt@2x.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 32pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 32pt.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 32pt@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 32pt@2x.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 512pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 512pt.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/Mac App 512pt@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/Mac App 512pt@2x.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/PiP_Toolbar_Icon_new.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/PiP_Toolbar_Icon_new.pdf
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/icon-1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/icon-1024.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/icon-128.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/icon-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/icon-16.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/icon-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/icon-256.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/icon-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/icon-32.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/icon-512.png
--------------------------------------------------------------------------------
/macOS/Icon/macOS11/icon-64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Icon/macOS11/icon-64.png
--------------------------------------------------------------------------------
/macOS/Images/Banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Images/Banner.png
--------------------------------------------------------------------------------
/macOS/Images/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Images/demo.gif
--------------------------------------------------------------------------------
/macOS/Images/pipifier_ios_usage.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Images/pipifier_ios_usage.gif
--------------------------------------------------------------------------------
/macOS/PiP_Toolbar_Icon.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiP_Toolbar_Icon.pdf
--------------------------------------------------------------------------------
/macOS/PiP_Toolbar_Icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/macOS/PiP_Toolbar_Icon_new.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiP_Toolbar_Icon_new.pdf
--------------------------------------------------------------------------------
/macOS/PiP_Toolbar_Icon_new.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/macOS/PiP_Toolbar_Icon_new_big_sur.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiP_Toolbar_Icon_new_big_sur.pdf
--------------------------------------------------------------------------------
/macOS/PiP_Toolbar_Icon_white.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiP_Toolbar_Icon_white.pdf
--------------------------------------------------------------------------------
/macOS/PiP_Toolbar_Icon_white.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/macOS/PiP_Toolbar_Icon_white_new.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiP_Toolbar_Icon_white_new.pdf
--------------------------------------------------------------------------------
/macOS/PiP_Toolbar_Icon_white_new.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/macOS/PiPifier macOS 11.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier macOS 11.sketch
--------------------------------------------------------------------------------
/macOS/PiPifier macOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/macOS/PiPifier macOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/macOS/PiPifier macOS.xcodeproj/xcuserdata/arno.xcuserdatad/xcschemes/PiPifier-Safari-Extension.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
6 |
9 |
10 |
16 |
22 |
23 |
24 |
30 |
36 |
37 |
38 |
39 |
40 |
45 |
46 |
47 |
48 |
60 |
64 |
65 |
66 |
72 |
73 |
74 |
75 |
82 |
84 |
90 |
91 |
92 |
93 |
95 |
96 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/macOS/PiPifier macOS.xcodeproj/xcuserdata/arno.xcuserdatad/xcschemes/PiPifier.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
60 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/macOS/PiPifier macOS.xcodeproj/xcuserdata/arno.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | PiPifier-Safari-Extension.xcscheme
8 |
9 | orderHint
10 | 1
11 |
12 | PiPifier.xcscheme
13 |
14 | orderHint
15 | 0
16 |
17 |
18 | SuppressBuildableAutocreation
19 |
20 | 11F1B4FD1D4EC0CC0041579B
21 |
22 | primary
23 |
24 |
25 | 11F1B5131D4EC1010041579B
26 |
27 | primary
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/macOS/PiPifier-Safari-Extension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | PiPifier Button
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 | $(MARKETING_VERSION)
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSExtension
26 |
27 | NSExtensionPointIdentifier
28 | com.apple.Safari.extension
29 | NSExtensionPrincipalClass
30 | $(PRODUCT_MODULE_NAME).SafariExtensionHandler
31 | SFSafariContentScript
32 |
33 |
34 | Script
35 | script.js
36 |
37 |
38 | SFSafariToolbarItem
39 |
40 | Action
41 | Command
42 | Identifier
43 | Button
44 | Image
45 | PiP_Toolbar_Icon_new_big_sur.pdf
46 | Label
47 | PiPifier
48 |
49 | SFSafariWebsiteAccess
50 |
51 | Allowed Domains
52 |
53 | Level
54 | All
55 |
56 |
57 | NSHumanReadableCopyright
58 | Copyright © 2016 APPenzeller. All rights reserved.
59 | NSHumanReadableDescription
60 | PiPifier lets you use every HTML5 video in macOS Picture-in-Picture mode
61 |
62 |
63 |
--------------------------------------------------------------------------------
/macOS/PiPifier-Safari-Extension/PiP_Toolbar_Icon.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier-Safari-Extension/PiP_Toolbar_Icon.pdf
--------------------------------------------------------------------------------
/macOS/PiPifier-Safari-Extension/PiP_Toolbar_Icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/macOS/PiPifier-Safari-Extension/PiP_Toolbar_Icon_white.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/macOS/PiPifier-Safari-Extension/PiPifier_Safari_Extension.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.application-groups
8 |
9 | $(TeamIdentifierPrefix)group.APPenzeller.PiPifier
10 |
11 | com.apple.security.files.user-selected.read-only
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/macOS/PiPifier-Safari-Extension/SafariExtensionHandler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SafariExtensionHandler.swift
3 | // PiPifier-Safari-Extension
4 | //
5 | // Created by Arno Appenzeller on 01.08.16.
6 | // Copyright © 2016 APPenzeller. All rights reserved.
7 | //
8 |
9 | import SafariServices
10 |
11 | enum Message: String {
12 | case videoCheck, pipCheck
13 | }
14 |
15 | class SafariExtensionHandler: SFSafariExtensionHandler {
16 |
17 | let settingsManager = SettingsManager.shared
18 |
19 | override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]? = nil) {
20 | guard let message = Message(rawValue: messageName) else {
21 | NSLog("INFO: unhandled message")
22 | return
23 | }
24 | NSLog("INFO: recieved message: \(message)")
25 | switch message {
26 | case .videoCheck:
27 | NSLog("INFO: videoCheck: \(userInfo?["found"] as? Bool ?? false)")
28 | StateManager.shared.videosFound[page] = userInfo?["found"] as? Bool ?? false
29 | SFSafariApplication.setToolbarItemsNeedUpdate()
30 | case .pipCheck:
31 | pipCheck(callback: userInfo?["callback"])
32 | }
33 | }
34 |
35 | override func toolbarItemClicked(in window: SFSafariWindow) {
36 | // Credits to espenbye for pointing out that this works in fullscreen as well
37 | // See: https://github.com/arnoappenzeller/PiPifier/issues/4
38 | getActivePage {
39 | $0?.dispatchMessageToScript(withName: "enablePiP", userInfo: nil)
40 | }
41 | }
42 |
43 | override func validateToolbarItem(in window: SFSafariWindow, validationHandler: @escaping (Bool, String) -> Void) {
44 | getActivePage {
45 | guard let page = $0 else {return}
46 | NSLog("INFO: videosFound: \(StateManager.shared.videosFound)")
47 | NSLog("INFO: video found: \(String(describing: StateManager.shared.videosFound[page]))")
48 | let videoFound = StateManager.shared.videosFound[page] ?? false
49 | NSLog("INFO: validating toolbarItem: \(videoFound)")
50 | validationHandler(videoFound, "")
51 | }
52 | }
53 |
54 | func getActivePage(completionHandler: @escaping (SFSafariPage?) -> Void) {
55 | SFSafariApplication.getActiveWindow {$0?.getActiveTab {$0?.getActivePage(completionHandler: completionHandler)}}
56 | }
57 |
58 | //MARK: - customPiPButton methods
59 |
60 | func pipCheck(callback: Any?) {
61 | print("Is settings manager enabled: \(settingsManager.isCustomPiPButtonsEnabled)")
62 | if settingsManager.isCustomPiPButtonsEnabled {
63 | if let callback = callback{
64 | getActivePage {
65 | $0?.dispatchMessageToScript(withName: "addCustomPiPButtonToPlayer", userInfo: ["callback": callback])
66 | }
67 | }
68 | }
69 | }
70 |
71 | }
72 |
--------------------------------------------------------------------------------
/macOS/PiPifier-Safari-Extension/StateManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StateManager.swift
3 | // PiPifier
4 | //
5 | // Created by Arno on 05.08.16.
6 | // Copyright © 2016 APPenzeller. All rights reserved.
7 | //
8 |
9 | import SafariServices
10 |
11 | class StateManager {
12 | static let shared = StateManager()
13 | private init() {}
14 |
15 | var videosFound: [SFSafariPage: Bool] = [:]
16 | }
17 |
--------------------------------------------------------------------------------
/macOS/PiPifier-Safari-Extension/script.js:
--------------------------------------------------------------------------------
1 | //image URLs
2 | var whiteSVG_Icon = safari.extension.baseURI + 'PiP_Toolbar_Icon_white_new.svg';
3 | var blackSVG_Icon = safari.extension.baseURI + 'PiP_Toolbar_Icon_new.svg';
4 |
5 | safari.self.addEventListener("message", messageHandler); // Message recieved from Swift code
6 | window.onfocus = function() {
7 | previousResult = null;
8 | checkForVideo();
9 | }; // Tab selected
10 | new MutationObserver(checkForVideo).observe(document, {subtree: true, childList: true}); // DOM changed
11 |
12 | function dispatchMessage(messageName, parameters) {
13 | safari.extension.dispatchMessage(messageName, parameters);
14 | }
15 |
16 | function messageHandler(event) {
17 | if (event.name === "enablePiP" && getVideo() != null) {
18 | enablePiP();
19 | } else if (event.name === "addCustomPiPButtonToPlayer") {
20 | window[event.message.callback]() //Calls the function specified as callback
21 | }
22 | }
23 |
24 | var previousResult = null;
25 |
26 | function checkForVideo() {
27 | if (getVideo() != null) {
28 | addCustomPiPButtons();
29 | if (previousResult === null || previousResult === false) {
30 | dispatchMessage("videoCheck", {found: true});
31 | }
32 | previousResult = true;
33 | } else if (window == window.top) {
34 | if (previousResult === null || previousResult === true) {
35 | dispatchMessage("videoCheck", {found: false});
36 | }
37 | previousResult = false;
38 | }
39 | }
40 |
41 | function getVideo() {
42 | return document.getElementsByTagName('video')[0];
43 | }
44 |
45 | function enablePiP() {
46 | getVideo().webkitSetPresentationMode('picture-in-picture');
47 | }
48 |
49 | //----------------- Custom Button Methods -----------------
50 |
51 | var players = [
52 | {name: "YouTube", shouldAddButton: shouldAddYouTubeButton, addButton: addYouTubeButton},
53 | {name: "VideoJS", shouldAddButton: shouldAddVideoJSButton, addButton: addVideoJSButton},
54 | {name: "Netflix", shouldAddButton: shouldAddNetflixButton, addButton: addNetflixButton},
55 | {name: "Wistia", shouldAddButton: shouldAddWistiaButton, addButton: addWistiaButton},
56 | //TODO: add other players here
57 | ];
58 |
59 | function addCustomPiPButtons() {
60 | for (const player of players) {
61 | if (player.shouldAddButton()) {
62 | dispatchMessage("pipCheck", {callback: player.addButton.name}) //Sets the callback to the player's addButton
63 | }
64 | }
65 | }
66 |
67 | //----------------- Player Implementations -------------------------
68 |
69 | function shouldAddYouTubeButton() {
70 | //check if on youtube or player is embedded
71 | return (location.hostname.match(/^(www\.)?youtube\.com$/)
72 | || document.getElementsByClassName("ytp-right-controls").length > 0)
73 | && document.getElementsByClassName('PiPifierButton').length == 0;
74 | }
75 |
76 | function addYouTubeButton() {
77 | if (!shouldAddYouTubeButton()) return;
78 | var button = document.createElement("button");
79 | button.className = "ytp-button PiPifierButton";
80 | button.title = "PiP (by PiPifier)";
81 | button.onclick = enablePiP;
82 | //TODO add style
83 | //button.style.backgroundImage = 'url('+ whiteSVG_Icon + ')';
84 | var buttonImage = document.createElement("img");
85 | buttonImage.src = whiteSVG_Icon;
86 | buttonImage.width = 22;
87 | buttonImage.height = 36;
88 | button.appendChild(buttonImage);
89 |
90 | document.getElementsByClassName("ytp-right-controls")[0].appendChild(button);
91 | }
92 |
93 |
94 | function shouldAddVideoJSButton() {
95 | return document.getElementsByClassName('vjs-control-bar').length > 0
96 | && document.getElementsByClassName('PiPifierButton').length == 0;
97 | }
98 |
99 |
100 | function addVideoJSButton() {
101 | if (!shouldAddVideoJSButton()) return;
102 | var button = document.createElement("button");
103 | button.className = "PiPifierButton vjs-control vjs-button";
104 | button.title = "PiP (by PiPifier)";
105 | button.onclick = enablePiP;
106 | var buttonImage = document.createElement("img");
107 | buttonImage.src = whiteSVG_Icon;
108 | buttonImage.width = 16;
109 | buttonImage.height = 30;
110 | button.appendChild(buttonImage);
111 | var fullscreenButton = document.getElementsByClassName("vjs-fullscreen-control")[0];
112 | fullscreenButton.parentNode.insertBefore(button, fullscreenButton);
113 | }
114 |
115 | function shouldAddWistiaButton() {
116 | return document.getElementsByClassName('wistia_playbar').length > 0
117 | && document.getElementsByClassName('PiPifierButton').length == 0;
118 | }
119 |
120 | function addWistiaButton() {
121 | if (!shouldAddWistiaButton()) return;
122 | var button = document.createElement("button");
123 | button.className = "PiPifierButton w-control w-control--fullscreen w-is-visible";
124 | button.alt = "Picture in Picture";
125 | button.title = "PiP (by PiPifier)";
126 | button.onclick = enablePiP;
127 | var buttonImage = document.createElement("img");
128 | buttonImage.src = whiteSVG_Icon;
129 | buttonImage.width = 28;
130 | buttonImage.height = 18;
131 | buttonImage.style.verticalAlign = "middle";
132 | button.appendChild(buttonImage);
133 | document.getElementsByClassName("w-control-bar__region--airplay")[0].appendChild(button);
134 | }
135 |
136 |
137 | function shouldAddNetflixButton() {
138 | return location.hostname.match('netflix')
139 | && document.getElementsByClassName('PiPifierButton').length == 0;
140 | }
141 |
142 | function addNetflixButton(timeOutCounter) {
143 | if (!shouldAddNetflixButton()) return;
144 | if (timeOutCounter == null) timeOutCounter = 0;
145 | var button = document.createElement("button");
146 | button.className = "PiPifierButton";
147 | button.title = "PiP (by PiPifier)";
148 | button.onclick = enablePiP;
149 | button.style.backgroundColor = "transparent";
150 | button.style.border = "none";
151 | button.style.maxHeight = "inherit";
152 | button.style.width = "70px";
153 | button.style.marginRight = "2px";
154 | var buttonImage = document.createElement("img");
155 | buttonImage.src = whiteSVG_Icon;
156 | buttonImage.style.verticalAlign = "middle";
157 | buttonImage.style.maxHeight = "40%";
158 | button.appendChild(buttonImage);
159 | var playerStatusDiv = document.getElementsByClassName("player-status")[0];
160 | if (playerStatusDiv == null && timeOutCounter < 3) {
161 | //this is needed because the div is sometimes not reachable on the first load
162 | //also necessary to count up and stop at some time to avoid endless loop on main netflix page
163 | setTimeout(function() {addNetflixButton(timeOutCounter+1);}, 3000);
164 | return;
165 | }
166 | playerStatusDiv.insertBefore(button, playerStatusDiv.firstChild);
167 | }
168 |
--------------------------------------------------------------------------------
/macOS/PiPifier/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // PiPifier
4 | //
5 | // Created by Arno Appenzeller on 01.08.16.
6 | // Copyright © 2016 APPenzeller. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | @NSApplicationMain
12 | class AppDelegate: NSObject, NSApplicationDelegate {
13 |
14 | func applicationDidFinishLaunching(_ aNotification: Notification) {}
15 | func applicationWillTerminate(_ aNotification: Notification) {}
16 |
17 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
18 | return true
19 | }
20 | }
21 |
22 |
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icon-16.png",
5 | "idiom" : "mac",
6 | "scale" : "1x",
7 | "size" : "16x16"
8 | },
9 | {
10 | "filename" : "icon-32.png",
11 | "idiom" : "mac",
12 | "scale" : "2x",
13 | "size" : "16x16"
14 | },
15 | {
16 | "filename" : "icon-33.png",
17 | "idiom" : "mac",
18 | "scale" : "1x",
19 | "size" : "32x32"
20 | },
21 | {
22 | "filename" : "icon-64.png",
23 | "idiom" : "mac",
24 | "scale" : "2x",
25 | "size" : "32x32"
26 | },
27 | {
28 | "filename" : "icon-128.png",
29 | "idiom" : "mac",
30 | "scale" : "1x",
31 | "size" : "128x128"
32 | },
33 | {
34 | "filename" : "icon-256.png",
35 | "idiom" : "mac",
36 | "scale" : "2x",
37 | "size" : "128x128"
38 | },
39 | {
40 | "filename" : "icon-257.png",
41 | "idiom" : "mac",
42 | "scale" : "1x",
43 | "size" : "256x256"
44 | },
45 | {
46 | "filename" : "icon-512.png",
47 | "idiom" : "mac",
48 | "scale" : "2x",
49 | "size" : "256x256"
50 | },
51 | {
52 | "filename" : "icon-513.png",
53 | "idiom" : "mac",
54 | "scale" : "1x",
55 | "size" : "512x512"
56 | },
57 | {
58 | "filename" : "icon-1024.png",
59 | "idiom" : "mac",
60 | "scale" : "2x",
61 | "size" : "512x512"
62 | }
63 | ],
64 | "info" : {
65 | "author" : "xcode",
66 | "version" : 1
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-1024.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-128.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-16.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-256.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-257.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-257.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-32.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-33.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-512.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-513.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-513.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier/Assets.xcassets/AppIcon.appiconset/icon-64.png
--------------------------------------------------------------------------------
/macOS/PiPifier/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/macOS/PiPifier/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
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 | $(MARKETING_VERSION)
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | LSApplicationCategoryType
24 | public.app-category.utilities
25 | LSMinimumSystemVersion
26 | $(MACOSX_DEPLOYMENT_TARGET)
27 | NSHumanReadableCopyright
28 | Copyright © 2016 APPenzeller. All rights reserved.
29 | NSMainStoryboardFile
30 | Main
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/macOS/PiPifier/PiPifier.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.application-groups
8 |
9 | $(TeamIdentifierPrefix)group.APPenzeller.PiPifier
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/macOS/PiPifier/SettingsManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsManager.swift
3 | // PiPifier
4 | //
5 | // Created by Arno Appenzeller on 16.10.16.
6 | // Copyright © 2016 APPenzeller. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | class SettingsManager {
12 |
13 | static let shared = SettingsManager()
14 | private init() {}
15 |
16 | //NOTE: replace with your own group identifier when developping for yourself
17 | //Don't forget to change it in the entitlements as well otherwise it can cause crashes
18 | let sharedUserDefaults = UserDefaults(suiteName: "AW9CBV6SY7.group.APPenzeller.PiPifier")!
19 |
20 | let buttonEnabledKey = "customPiPButtonsEnabled"
21 |
22 | var isCustomPiPButtonsEnabled: Bool {
23 | get {
24 | return sharedUserDefaults.value(forKey: buttonEnabledKey) as? Bool ?? true //default value is on
25 | }
26 | set(value) {
27 | sharedUserDefaults.set(value, forKey: buttonEnabledKey)
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/macOS/PiPifier/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // PiPifier
4 | //
5 | // Created by Arno Appenzeller on 01.08.16.
6 | // Copyright © 2016 APPenzeller. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | class ViewController: NSViewController {
12 |
13 |
14 |
15 |
16 | @IBOutlet weak var customPiPButtonsButton: NSButton!
17 | @IBOutlet weak var activityInd: NSProgressIndicator!
18 |
19 |
20 |
21 |
22 | override func viewDidLoad() {
23 | super.viewDidLoad()
24 |
25 |
26 |
27 | customPiPButtonsButton.state = SettingsManager.shared.isCustomPiPButtonsEnabled ? .on : .off
28 |
29 | // Do any additional setup after loading the view.
30 | }
31 |
32 |
33 | @IBAction func customPiPButtonsButtonPressed(_ sender: NSButton) {
34 | SettingsManager.shared.isCustomPiPButtonsEnabled = sender.state == .on
35 | }
36 |
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/macOS/PiPifier_Artwork.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/PiPifier_Artwork.zip
--------------------------------------------------------------------------------
/macOS/Pipifier_UI_Ressources.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arnoappenzeller/PiPifier/110ac3b65d9664b4314bc671fcefd008747032a6/macOS/Pipifier_UI_Ressources.sketch
--------------------------------------------------------------------------------
/macOS/README.md:
--------------------------------------------------------------------------------
1 |
2 | 
3 | # PiPifier
4 | PiPifier is a native macOS 10.12 Safari extension that lets you use every HTML5 video in Picture in Picture mode
5 |
6 | #Download
7 | It's free on the Mac AppStore. Get it [here](https://itunes.apple.com/en/app/pipifier-pip-for-nearly-every/id1160374471?mt=12)
8 |
9 | # How to use?
10 | If you have an HTML5 video playing on any website like Youtube just press the PiPifier icon in Safari's toolbar to enable Picture-In-Picture for this video. Make sure you did interact with the video player once before pressing (like play/pause).
11 |
12 | 
13 |
14 | # Requirements
15 | For usage: macOS 10.12
16 | For developement: Xcode 8
17 |
18 | #Installation
19 | (0. Launch PiPifier)
20 | 1. Open Safari and go to Preferences
21 | 2. Go to Extensions
22 | 3. Enable PiPifier (If you don't see PiPifier and you built the app by yourself you need to sign it or choose Developer -> Allow unsigned extensions)
23 | 4. Choose View > Customize Toolbar and drag the PiPifier icon to your toolbar
24 | 5. To use Pipifier just press the icon when you're watching to an HTML5 video (Note: You need to interact with the video once. If it's autoplaying just pause and play again)
25 |
26 | #How can I help?
27 | If you are a developer feel free to make any addition to improve PiPifier.
28 |
29 | If you are user and want a native PiP button in any video player please make a request in the corresponding [issue](https://github.com/arnoappenzeller/PiPifier/issues/12)
30 |
31 | #Note for developers
32 | The code is a bit dirty and there are some unused parts in it (Tried to add more features before I needed to focus on other things). If you want to help me clean it up feel free to do so :)
33 |
34 | #Contact
35 | Made by [@arno_app](https://twitter.com/arno_app) with an important bug fix by [@Cacauu_de](https://twitter.com/Cacauu_de).
36 |
--------------------------------------------------------------------------------