├── 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 | ![Banner](macOS/Images/Banner.png) 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 | ![Demo_macOS](macOS/Images/demo.gif "Demo macOS") 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 | ![Demo_iOS](macOS/Images/pipifier_ios_usage.gif "Demo iOS") 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 | 3 | 4 | PiP_Toolbar_Icon 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /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 | 3 | PiP_Toolbar_Icon_new 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /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 | 3 | 4 | PiP_Toolbar_Icon_white 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /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 | 3 | PiP_Toolbar_Icon_white_new 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /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 | 3 | 4 | PiP_Toolbar_Icon 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /macOS/PiPifier-Safari-Extension/PiP_Toolbar_Icon_white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | PiP_Toolbar_Icon_white 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /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 | ![Banner](Images/Banner.png) 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 | ![Demo](Images/demo.gif "Demo") 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 | --------------------------------------------------------------------------------