diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 90ab2ba8..04cbcf34 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -1,6 +1,12 @@ name: iOS build on: + workflow_dispatch: + inputs: + logLevel: + description: Logging level + type: string + required: true push: branches: [ "master"] pull_request: @@ -31,15 +37,14 @@ jobs: if [ "`ls -A | grep -i \\.xcworkspace\$`" ]; then filetype_parameter="workspace" && file_to_build="`ls -A | grep -i \\.xcworkspace\$`"; else filetype_parameter="project" && file_to_build="`ls -A | grep -i \\.xcodeproj\$`"; fi file_to_build=`echo $file_to_build | awk '{$1=$1;print}'` xcodebuild build-for-testing -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -destination "platform=$platform,name=$device" -# Disable testing for now -# - name: Test -# env: -# scheme: ${{ 'default' }} -# platform: ${{ 'iOS Simulator' }} -# run: | -# # xcrun xctrace returns via stderr, not the expected stdout (see https://developer.apple.com/forums/thread/663959) -# device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\(]+' | head -1 | awk '{$1=$1;print}' | sed -e "s/ Simulator$//"` -# if [ $scheme = default ]; then scheme=$(cat default); fi -# if [ "`ls -A | grep -i \\.xcworkspace\$`" ]; then filetype_parameter="workspace" && file_to_build="`ls -A | grep -i \\.xcworkspace\$`"; else filetype_parameter="project" && file_to_build="`ls -A | grep -i \\.xcodeproj\$`"; fi -# file_to_build=`echo $file_to_build | awk '{$1=$1;print}'` -# xcodebuild test-without-building -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -destination "platform=$platform,name=$device" + - name: Test + env: + scheme: ${{ 'default' }} + platform: ${{ 'iOS Simulator' }} + run: | + # xcrun xctrace returns via stderr, not the expected stdout (see https://developer.apple.com/forums/thread/663959) + device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\(]+' | head -1 | awk '{$1=$1;print}' | sed -e "s/ Simulator$//"` + if [ $scheme = default ]; then scheme=$(cat default); fi + if [ "`ls -A | grep -i \\.xcworkspace\$`" ]; then filetype_parameter="workspace" && file_to_build="`ls -A | grep -i \\.xcworkspace\$`"; else filetype_parameter="project" && file_to_build="`ls -A | grep -i \\.xcodeproj\$`"; fi + file_to_build=`echo $file_to_build | awk '{$1=$1;print}'` + xcodebuild test-without-building -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -destination "platform=$platform,name=$device" diff --git a/.gitignore b/.gitignore index 4ed09ca9..953be83b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ *.xccheckout *.xcscmblueprint xcuserdata +fastlane/report.xml +screenshots/* diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..7a118b49 --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 00000000..5181c0dc --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,213 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.6) + rexml + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) + artifactory (3.0.15) + atomos (0.1.3) + aws-eventstream (1.3.0) + aws-partitions (1.862.0) + aws-sdk-core (3.190.0) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.8) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.74.0) + aws-sdk-core (~> 3, >= 3.188.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.141.0) + aws-sdk-core (~> 3, >= 3.189.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.8) + aws-sigv4 (1.8.0) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + claide (1.1.0) + colored (1.2) + colored2 (3.1.2) + commander (4.6.0) + highline (~> 2.0.0) + declarative (0.0.20) + digest-crc (0.6.5) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.6.20231109) + dotenv (2.8.1) + emoji_regex (3.2.3) + excon (0.105.0) + faraday (1.10.3) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) + http-cookie (~> 1.0.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.4) + multipart-post (~> 2) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + faraday_middleware (1.2.0) + faraday (~> 1.0) + fastimage (2.2.7) + fastlane (2.217.0) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.8, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.3, < 2.0.0) + bundler (>= 1.12.0, < 3.0.0) + colored + commander (~> 4.6) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 4.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 1.0) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 1.0) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) + http-cookie (~> 1.0.5) + json (< 3.0.0) + jwt (>= 2.1.0, < 3) + mini_magick (>= 4.9.4, < 5.0.0) + multipart-post (>= 2.0.0, < 3.0.0) + naturally (~> 2.2) + optparse (~> 0.1.1) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (~> 3) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.53.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-core (0.11.2) + addressable (~> 2.5, >= 2.5.1) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.a) + rexml + webrick + google-apis-iamcredentials_v1 (0.17.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-playcustomapp_v1 (0.13.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-storage_v1 (0.29.0) + google-apis-core (>= 0.11.0, < 2.a) + google-cloud-core (1.6.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.6.0) + faraday (>= 0.17.3, < 3.0) + google-cloud-errors (1.3.1) + google-cloud-storage (1.45.0) + addressable (~> 2.8) + digest-crc (~> 0.4) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.29.0) + google-cloud-core (~> 1.6) + googleauth (>= 0.16.2, < 2.a) + mini_mime (~> 1.0) + googleauth (1.8.1) + faraday (>= 0.17.3, < 3.a) + jwt (>= 1.4, < 3.0) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (>= 0.16, < 2.a) + highline (2.0.3) + http-cookie (1.0.5) + domain_name (~> 0.5) + httpclient (2.8.3) + jmespath (1.6.2) + json (2.7.0) + jwt (2.7.1) + mini_magick (4.12.0) + mini_mime (1.1.5) + multi_json (1.15.0) + multipart-post (2.3.0) + nanaimo (0.3.0) + naturally (2.2.1) + optparse (0.1.1) + os (1.1.4) + plist (3.7.0) + public_suffix (5.0.4) + rake (13.1.0) + representable (3.2.0) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rexml (3.2.6) + rouge (2.0.7) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + security (0.1.3) + signet (0.18.0) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.a) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.10) + CFPropertyList + naturally + terminal-notifier (2.0.0) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + trailblazer-option (0.1.2) + tty-cursor (0.7.1) + tty-screen (0.8.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unicode-display_width (2.5.0) + webrick (1.8.1) + word_wrap (1.0.0) + xcodeproj (1.23.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.1) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + arm64-darwin-22 + +DEPENDENCIES + fastlane + +BUNDLED WITH + 2.4.22 diff --git a/README.md b/README.md index c3b64294..c0d34a46 100755 --- a/README.md +++ b/README.md @@ -1,121 +1,15 @@ -# Swift Radio +# RadioSpiral -Swift Radio is an open source radio station app with robust and professional features. This is a fully realized Radio App built entirely in Swift. **master is now the Xcode 14 branch**. +RadioSpiral is a port of the [Swift Radio Pro](https://github.com/analogcode/Swift-Radio-Pro) app specifically designed to work with the Icecast server running at https://spiral.radio; it's been simplified for our needs. -There are over 80 different apps accepted to the app store using this code! +This branch is updated to Xcode 15 and Swift 5.

- Swift Radio + RadioSpiral screen

-## Video -View this [**GETTING STARTED VIDEO**](https://youtu.be/m7jiajCHFvc). -It's short & sweet to give you a quick overview. -Give it a quick watch. - -## Features - -- Ability to update Stations from server or locally. (Update stations anytime without resubmitting to app store!) -- Displays Artist, Track & Album Art on Lock Screen -- Custom views optimized for SE, 6 and 6+ for backwards compatibility -- Compiles with Xcode 14 & Swift 5 -- Parses JSON using Swift Codable protocol -- Background audio performance -- Search Bar that can be turned on or off to search stations -- Supports local or hosted station images -- "About" screen with ability to send email & visit website -- Pull to Refresh stations -- Uses the AVPlayer wrapper library [FRadioPlayer](https://github.com/fethica/FRadioPlayer): - * Automatically download Album Art from iTunes API - * Parses metadata from streams (Track & Artist information) -- Uses [Spring](https://github.com/MengTo/Spring) library: - * Animate UI components - * Download and cache images using ImageLoader class - ## Credits -- **Co-organizer & current-lead developer [Fethi El Hassasna](https://fethica.com), Twitter: [@fethica](https://twitter.com/fethica)** +- **RadioSpiral developer, Joe McMahon** +- **Co-organizer & current-lead developer of Swift Radio Pro, [Fethi El Hassasna](https://fethica.com), Twitter: [@fethica](https://twitter.com/fethica)** - **Created by [Matthew Fecher](http://matthewfecher.com) from [AudioKit Pro](https://audiokitpro.com), Twitter: [@analogMatthew](http://twitter.com/analogMatthew)** - *Contributions by others listed in Github [here](https://github.com/swiftcodex/Swift-Radio-Pro/graphs/contributors).* -Thanks to everyone! We couldn't do it without you! - -## Requirements - -- Xcode 14 -- Know a little bit of how to program in Swift with the iOS SDK - -Please note: I am unable to offer any free support or modifications. Thanks! - -## Creating an App - -If you create an app with the code, or interesting project inspired by the code, shoot me an email. I love hearing about your projects! - -This is just a basic template. You may use it as a clean starting point to add other features. - -Some of the things I've built into this Radio code for clients include: Facebook login, Profiles, Saving Favorite Tracks, Playlists, Genres, Spotify integration, Enhanced Streaming, Tempo Analyzing, etc. There's almost unlimited things you can use this code as a starting place for. I keep this repo lightweight. That way you can customize it easily. - -## Setup - -The "Config.swift" file contains some project configs to get you started. -Watch this [Getting Started Video](https://youtu.be/m7jiajCHFvc) to get up & running quickly. - -## Integration - -Includes full Xcode Project to jumpstart development. - -## Stations - -Includes an example "stations.json" file. You may upload the JSON file to a server, so that you can update the stations in the app without resubmitting to the app store. The following fields are supported in the app: - -- **name**: The name of the station as you want it displayed (e.g. "Sub Pop Radio") - -- **streamURL**: The url of the actual stream - -- **imageURL**: Station image url. Station images in demo are 350x206. Image can be local or hosted. Leave out the "http" to use a local image (You can use either: "station-subpop" or "http://myurl.com/images/station-subpop.jpg") - -- **desc**: Short 2 or 3 word description of the station as you want it displayed (e.g. "Outlaw Country") - -- **longDesc**: Long description of the station to be used on the "info screen". This is optional. - -## Contributions - -Contributions are very welcome. Please check out the [dev branch](https://github.com/analogcode/Swift-Radio-Pro/tree/dev), create a separate branch (e.g. features/3dtouch). Please do not commit on master. - -## FAQ - -Q: Do I have to pay you anything if I make an app with this code? -A: Nope. This is completely open source, you can do whatever you want with it. It's usually cool to thank the project if you use the code. Go build stuff. Enjoy. - -Q: How do I make my app support ipv6 networks? -A: For an app to be accepted by Apple to the app store as of June 1, 2016, you CAN NOT use number IP addresses. i.e. You must use something like "http://mystream.com/rock" instead of "http://44.120.33.55/" for your station stream URLs. - -Q: Is there an example of using this with the Spotify API? -A: Yes, there is a branch here that uses it [here]( https://github.com/swiftcodex/Swift-Radio-Pro/tree/avplayer) (⚠️ **deprecated**). - -Q: Is there another API to get album/track information besides LastFM, Spotify, and iTunes? -A: Rovi has a pretty sweet [music API](http://prod-doc.rovicorp.com/mashery/index.php/Data/APIs/Rovi-Music). The [Echo Nest](http://developer.echonest.com/) has all kinds of APIs that are fun to play with. - -Q: I updated the album art size in the Storyboard, and now the sizing is acting funny? -A: There is an albumArt constraint modified in the code. See the "optimizeForDeviceSize()" method in the NowPlayingVC. - -Q: My radio station isn't playing? -A: Paste your stream URL into a browser to see if it will play there. The stream may be offline or have a weak connection. - -Q: Can you help me add a feature? Can you help me understand the code? Can you help with a problem I'm having? -A: While I have a full-time job and other project obligations, I'd highly recommend you find a developer or mentor in your area to help. The code is well-documented and most developers should be able to help you rather quickly. While I am sometimes available for paid freelance work, see below in the readme, **I am not able to provide any free support or modifications.** Thank you for understanding! - -Q: The song names aren't appearing for my station? -A: Check with your stream provider to make sure they are sending Metadata properly. If a station sends data in a unique way, you can modify the way the app parses the metadata, in the `RadioPlayer` class implement `FRadioPlayerDelegate` method: `radioPlayer(_ player: FRadioPlayer, metadataDidChange rawValue: String?)`. - -## Get Single Station Code -If you'd like to support this project, co-organizer Fethi has created a well-architected single station version of this code. It's a super great bargain: The developers behind this project typically charge up to $200/hr for freelance work, but this fully working code is only $50. No extra fees. - -You can PayPal: [fethica@me.com](mailto:fethica@me.com) or use this link: [Paypal Me](https://www.paypal.me/fethicaEH) -We will send you the code after 24 hours with setup instructions. All funds go to support the project. - -**Need something more advanced?** We have recent experience building iOS apps for high-profile brands. Send a friendly email to [Matthew](mailto:matthew@audiokitpro.com) or [Fethi](mailto:contact@fethica.com). - - -## RadioKit SDK Example - -- You can use this Swift code as a front-end for a more robust streaming backend. -- Brian Stormont, creator of RadioKit, has created a branch with the professional [RadioKit](http://stormyprods.com/products/radiokit.php) SDK already integrated. **Plus, his branch adds rewind & fast forward stream playback.** This is an excellent learning tool for those who are interested in seeing how a streaming library integrates with Swift Radio Pro. View the [branch here](https://github.com/MostTornBrain/Swift-Radio-Pro/tree/RadioKit). diff --git a/SwiftRadio.xcodeproj/project.pbxproj b/RadioSpiral.xcodeproj/project.pbxproj similarity index 88% rename from SwiftRadio.xcodeproj/project.pbxproj rename to RadioSpiral.xcodeproj/project.pbxproj index 7d661445..ed3b9300 100644 --- a/SwiftRadio.xcodeproj/project.pbxproj +++ b/RadioSpiral.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -12,6 +12,9 @@ 5FDEE0221F72FF980064333C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5FDEE0211F72FF980064333C /* LaunchScreen.storyboard */; }; 6258DCD822D93A3500166C65 /* LogoShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6258DCD722D93A3500166C65 /* LogoShareView.swift */; }; 6258DCDA22D93A5400166C65 /* LogoShareView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6258DCD922D93A5400166C65 /* LogoShareView.xib */; }; + 710189282B366D3300E8A04C /* RadioStationPROAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 710189272B366D3300E8A04C /* RadioStationPROAPI.swift */; }; + 715C87A62B23E141003FC57A /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 715C87A52B23E141003FC57A /* SnapshotHelper.swift */; }; + 7165121C2B35519B00473770 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CF72ACE621F714D000461EED /* Main.storyboard */; }; 9409E11C1ABF6FEA00312E2B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9409E11B1ABF6FEA00312E2B /* AppDelegate.swift */; }; 9409E1261ABF6FEA00312E2B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9409E1251ABF6FEA00312E2B /* Images.xcassets */; }; 9409E1401ABF78B000312E2B /* NowPlayingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9409E13F1ABF78B000312E2B /* NowPlayingViewController.swift */; }; @@ -79,7 +82,6 @@ CE9EE8DF293BB41300F62041 /* BaseController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9EE8DD293BB41300F62041 /* BaseController.swift */; }; CE9EE8E1293C048A00F62041 /* LoaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9EE8E0293C048A00F62041 /* LoaderController.swift */; }; CE9EE8E2293C048A00F62041 /* LoaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9EE8E0293C048A00F62041 /* LoaderController.swift */; }; - CEA82F4A2921F260009E9FA0 /* Info-CarPlay.plist in Resources */ = {isa = PBXBuildFile; fileRef = CEA82F492921F260009E9FA0 /* Info-CarPlay.plist */; }; CED6353B293081ED002B216F /* Handoffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CED6353A293081ED002B216F /* Handoffable.swift */; }; CED6353C293081ED002B216F /* Handoffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CED6353A293081ED002B216F /* Handoffable.swift */; }; CEDABBEB291217AF00C0367F /* UIImageView+Cache.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEDABBEA291217AF00C0367F /* UIImageView+Cache.swift */; }; @@ -98,14 +100,16 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 2C5545BA1C1124DE00728469 /* SwiftRadioUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftRadioUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2C5545BA1C1124DE00728469 /* RadioSpiralUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RadioSpiralUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 2C5545BC1C1124DE00728469 /* SwiftRadioUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftRadioUITests.swift; sourceTree = ""; }; 2C5545BE1C1124DE00728469 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53113F38230C720900462C0E /* ShareActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareActivity.swift; sourceTree = ""; }; 5FDEE0211F72FF980064333C /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; 6258DCD722D93A3500166C65 /* LogoShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoShareView.swift; sourceTree = ""; }; 6258DCD922D93A5400166C65 /* LogoShareView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LogoShareView.xib; sourceTree = ""; }; - 9409E1161ABF6FEA00312E2B /* SwiftRadio.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftRadio.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 710189272B366D3300E8A04C /* RadioStationPROAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioStationPROAPI.swift; sourceTree = ""; }; + 715C87A52B23E141003FC57A /* SnapshotHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SnapshotHelper.swift; path = fastlane/SnapshotHelper.swift; sourceTree = SOURCE_ROOT; }; + 9409E1161ABF6FEA00312E2B /* RadioSpiral.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RadioSpiral.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9409E11A1ABF6FEA00312E2B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9409E11B1ABF6FEA00312E2B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 9409E1251ABF6FEA00312E2B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; @@ -127,7 +131,7 @@ CE6036152A47B88600E15E15 /* StationTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StationTableViewCell.swift; sourceTree = ""; }; CE6036182A48BA2500E15E15 /* UITableViewCell+reuseIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableViewCell+reuseIdentifier.swift"; sourceTree = ""; }; CE60361C2A48C4A400E15E15 /* NowPlayingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NowPlayingView.swift; sourceTree = ""; }; - CE6A3E4F291F376D0058C82A /* SwiftRadio-CarPlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SwiftRadio-CarPlay.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + CE6A3E4F291F376D0058C82A /* RadioSpiral-CarPlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "RadioSpiral-CarPlay.app"; sourceTree = BUILT_PRODUCTS_DIR; }; CE6ECCF9292F13DF008B3C16 /* Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coordinator.swift; sourceTree = ""; }; CE6ECCFC292F1445008B3C16 /* MainCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainCoordinator.swift; sourceTree = ""; }; CE6ECCFF292F215F008B3C16 /* Storyboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storyboard.swift; sourceTree = ""; }; @@ -175,38 +179,49 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C5545BB1C1124DE00728469 /* SwiftRadioUITests */ = { + 2C5545BB1C1124DE00728469 /* RadioSpiralUITests */ = { isa = PBXGroup; children = ( + 715C87A52B23E141003FC57A /* SnapshotHelper.swift */, 2C5545BC1C1124DE00728469 /* SwiftRadioUITests.swift */, 2C5545BE1C1124DE00728469 /* Info.plist */, ); - path = SwiftRadioUITests; + path = RadioSpiralUITests; + sourceTree = ""; + }; + 7181C9DC2B5C93600071EE97 /* Storyboards */ = { + isa = PBXGroup; + children = ( + 5FDEE0211F72FF980064333C /* LaunchScreen.storyboard */, + CF72ACE621F714D000461EED /* Main.storyboard */, + 6258DCD922D93A5400166C65 /* LogoShareView.xib */, + ); + path = Storyboards; sourceTree = ""; }; 9409E10D1ABF6FE900312E2B = { isa = PBXGroup; children = ( - 9409E1181ABF6FEA00312E2B /* SwiftRadio */, - 2C5545BB1C1124DE00728469 /* SwiftRadioUITests */, + 9409E1181ABF6FEA00312E2B /* RadioSpiral */, + 2C5545BB1C1124DE00728469 /* RadioSpiralUITests */, 9409E1171ABF6FEA00312E2B /* Products */, - CE6036262A48F70A00E15E15 /* Frameworks */, ); sourceTree = ""; }; 9409E1171ABF6FEA00312E2B /* Products */ = { isa = PBXGroup; children = ( - 9409E1161ABF6FEA00312E2B /* SwiftRadio.app */, - 2C5545BA1C1124DE00728469 /* SwiftRadioUITests.xctest */, - CE6A3E4F291F376D0058C82A /* SwiftRadio-CarPlay.app */, + 9409E1161ABF6FEA00312E2B /* RadioSpiral.app */, + 2C5545BA1C1124DE00728469 /* RadioSpiralUITests.xctest */, + CE6A3E4F291F376D0058C82A /* RadioSpiral-CarPlay.app */, ); name = Products; sourceTree = ""; }; - 9409E1181ABF6FEA00312E2B /* SwiftRadio */ = { + 9409E1181ABF6FEA00312E2B /* RadioSpiral */ = { isa = PBXGroup; children = ( + 7181C9DC2B5C93600071EE97 /* Storyboards */, CE0A4994291F3A220071C0CC /* SwiftRadio.entitlements */, CE0A4993291F39660071C0CC /* CarPlay */, CE8062F7291EF5D9008BD097 /* Helpers */, @@ -219,13 +234,11 @@ CE8062F2291EF545008BD097 /* Cells */, 94D260901B45D20000DE671C /* Config.swift */, 9409E11B1ABF6FEA00312E2B /* AppDelegate.swift */, - CF72ACE621F714D000461EED /* Main.storyboard */, 9409E1251ABF6FEA00312E2B /* Images.xcassets */, 9409E11A1ABF6FEA00312E2B /* Info.plist */, CEA82F492921F260009E9FA0 /* Info-CarPlay.plist */, - 5FDEE0211F72FF980064333C /* LaunchScreen.storyboard */, ); - path = SwiftRadio; + path = RadioSpiral; sourceTree = ""; }; CE0A4993291F39660071C0CC /* CarPlay */ = { @@ -240,19 +253,11 @@ isa = PBXGroup; children = ( 6258DCD722D93A3500166C65 /* LogoShareView.swift */, - 6258DCD922D93A5400166C65 /* LogoShareView.xib */, CE60361C2A48C4A400E15E15 /* NowPlayingView.swift */, ); path = Views; sourceTree = ""; }; - CE6036262A48F70A00E15E15 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; CE6ECCF8292F139D008B3C16 /* Coordinators */ = { isa = PBXGroup; children = ( @@ -292,6 +297,7 @@ children = ( 94AC70AD1AD05C6200652982 /* RadioStation.swift */, CE963ECB29135A6F004F299E /* StationsManager.swift */, + 710189272B366D3300E8A04C /* RadioStationPROAPI.swift */, ); path = Model; sourceTree = ""; @@ -330,9 +336,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 2C5545B91C1124DE00728469 /* SwiftRadioUITests */ = { + 2C5545B91C1124DE00728469 /* RadioSpiralUITests */ = { isa = PBXNativeTarget; - buildConfigurationList = 2C5545C31C1124DE00728469 /* Build configuration list for PBXNativeTarget "SwiftRadioUITests" */; + buildConfigurationList = 2C5545C31C1124DE00728469 /* Build configuration list for PBXNativeTarget "RadioSpiralUITests" */; buildPhases = ( 2C5545B61C1124DE00728469 /* Sources */, 2C5545B71C1124DE00728469 /* Frameworks */, @@ -343,14 +349,14 @@ dependencies = ( 2C5545C01C1124DE00728469 /* PBXTargetDependency */, ); - name = SwiftRadioUITests; + name = RadioSpiralUITests; productName = SwiftRadioUITests; - productReference = 2C5545BA1C1124DE00728469 /* SwiftRadioUITests.xctest */; + productReference = 2C5545BA1C1124DE00728469 /* RadioSpiralUITests.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; - 9409E1151ABF6FEA00312E2B /* SwiftRadio */ = { + 9409E1151ABF6FEA00312E2B /* RadioSpiral */ = { isa = PBXNativeTarget; - buildConfigurationList = 9409E1381ABF6FEA00312E2B /* Build configuration list for PBXNativeTarget "SwiftRadio" */; + buildConfigurationList = 9409E1381ABF6FEA00312E2B /* Build configuration list for PBXNativeTarget "RadioSpiral" */; buildPhases = ( 9409E1121ABF6FEA00312E2B /* Sources */, 9409E1131ABF6FEA00312E2B /* Frameworks */, @@ -360,7 +366,7 @@ ); dependencies = ( ); - name = SwiftRadio; + name = RadioSpiral; packageProductDependencies = ( CE37D7B3290F47E000B0933B /* Spring */, CE37D7B6290F4A9700B0933B /* FRadioPlayer */, @@ -368,12 +374,12 @@ CE6036222A48C51A00E15E15 /* NVActivityIndicatorViewExtended */, ); productName = RadioPro; - productReference = 9409E1161ABF6FEA00312E2B /* SwiftRadio.app */; + productReference = 9409E1161ABF6FEA00312E2B /* RadioSpiral.app */; productType = "com.apple.product-type.application"; }; - CE6A3E2B291F376D0058C82A /* SwiftRadio-CarPlay */ = { + CE6A3E2B291F376D0058C82A /* RadioSpiral-CarPlay */ = { isa = PBXNativeTarget; - buildConfigurationList = CE6A3E4C291F376D0058C82A /* Build configuration list for PBXNativeTarget "SwiftRadio-CarPlay" */; + buildConfigurationList = CE6A3E4C291F376D0058C82A /* Build configuration list for PBXNativeTarget "RadioSpiral-CarPlay" */; buildPhases = ( CE6A3E30291F376D0058C82A /* Sources */, CE6A3E42291F376D0058C82A /* Frameworks */, @@ -383,7 +389,7 @@ ); dependencies = ( ); - name = "SwiftRadio-CarPlay"; + name = "RadioSpiral-CarPlay"; packageProductDependencies = ( CE6A3E2C291F376D0058C82A /* Spring */, CE6A3E2E291F376D0058C82A /* FRadioPlayer */, @@ -391,7 +397,7 @@ CE6036292A48F70A00E15E15 /* NVActivityIndicatorViewExtended */, ); productName = RadioPro; - productReference = CE6A3E4F291F376D0058C82A /* SwiftRadio-CarPlay.app */; + productReference = CE6A3E4F291F376D0058C82A /* RadioSpiral-CarPlay.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -400,9 +406,10 @@ 9409E10E1ABF6FE900312E2B /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftMigration = 0700; LastSwiftUpdateCheck = 0710; - LastUpgradeCheck = 1400; + LastUpgradeCheck = 1530; ORGANIZATIONNAME = matthewfecher.com; TargetAttributes = { 2C5545B91C1124DE00728469 = { @@ -421,7 +428,7 @@ }; }; }; - buildConfigurationList = 9409E1111ABF6FE900312E2B /* Build configuration list for PBXProject "SwiftRadio" */; + buildConfigurationList = 9409E1111ABF6FE900312E2B /* Build configuration list for PBXProject "RadioSpiral" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; @@ -439,9 +446,9 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 9409E1151ABF6FEA00312E2B /* SwiftRadio */, - CE6A3E2B291F376D0058C82A /* SwiftRadio-CarPlay */, - 2C5545B91C1124DE00728469 /* SwiftRadioUITests */, + 9409E1151ABF6FEA00312E2B /* RadioSpiral */, + CE6A3E2B291F376D0058C82A /* RadioSpiral-CarPlay */, + 2C5545B91C1124DE00728469 /* RadioSpiralUITests */, ); }; /* End PBXProject section */ @@ -451,6 +458,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 7165121C2B35519B00473770 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -458,7 +466,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - CEA82F4A2921F260009E9FA0 /* Info-CarPlay.plist in Resources */, 945DB3C21AD58E3A00495EBB /* stations.json in Resources */, 945DB3C51AD5A6E200495EBB /* NothingFoundCell.xib in Resources */, 6258DCDA22D93A5400166C65 /* LogoShareView.xib in Resources */, @@ -489,6 +496,7 @@ buildActionMask = 2147483647; files = ( 2C5545BD1C1124DE00728469 /* SwiftRadioUITests.swift in Sources */, + 715C87A62B23E141003FC57A /* SnapshotHelper.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -500,6 +508,7 @@ CE6036192A48BA2500E15E15 /* UITableViewCell+reuseIdentifier.swift in Sources */, CE6036162A47B88600E15E15 /* StationTableViewCell.swift in Sources */, CE9EE8DE293BB41300F62041 /* BaseController.swift in Sources */, + 710189282B366D3300E8A04C /* RadioStationPROAPI.swift in Sources */, 53113F39230C720900462C0E /* ShareActivity.swift in Sources */, 9409E1401ABF78B000312E2B /* NowPlayingViewController.swift in Sources */, CE963ECC29135A6F004F299E /* StationsManager.swift in Sources */, @@ -567,7 +576,7 @@ /* Begin PBXTargetDependency section */ 2C5545C01C1124DE00728469 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 9409E1151ABF6FEA00312E2B /* SwiftRadio */; + target = 9409E1151ABF6FEA00312E2B /* RadioSpiral */; targetProxy = 2C5545BF1C1124DE00728469 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -578,17 +587,18 @@ buildSettings = { DEBUG_INFORMATION_FORMAT = dwarf; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = SwiftRadioUITests/Info.plist; + INFOPLIST_FILE = RadioSpiralUITests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = jonah.SwiftRadioUITests; + PRODUCT_BUNDLE_IDENTIFIER = com.pemungkah.SwiftRadioUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = SwiftRadio; + TEST_TARGET_NAME = RadioSpiral; USES_XCTRUNNER = YES; }; name = Debug; @@ -598,17 +608,18 @@ buildSettings = { DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = SwiftRadioUITests/Info.plist; + INFOPLIST_FILE = RadioSpiralUITests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = jonah.SwiftRadioUITests; + PRODUCT_BUNDLE_IDENTIFIER = com.pemungkah.SwiftRadioUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = SwiftRadio; + TEST_TARGET_NAME = RadioSpiral; USES_XCTRUNNER = YES; }; name = Release; @@ -646,6 +657,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -661,6 +673,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + "INFOPLIST_FILE[sdk=*]" = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -702,6 +715,7 @@ COPY_PHASE_STRIP = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -723,24 +737,29 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 35; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 6G96AERJ7Q; + DEVELOPMENT_TEAM = 6PLL9M5SE2; + ENABLE_MODULE_VERIFIER = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/SwiftRadio", + "$(PROJECT_DIR)/RadioSpiral", ); - INFOPLIST_FILE = SwiftRadio/Info.plist; + INFOPLIST_FILE = RadioSpiral/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = RadioSpiral; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0.8; - PRODUCT_BUNDLE_IDENTIFIER = com.matthewfecher.SwiftRadio; - PRODUCT_NAME = SwiftRadio; + MARKETING_VERSION = 2.2; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; + PRODUCT_BUNDLE_IDENTIFIER = com.pemungkah.radiospiral; + PRODUCT_NAME = RadioSpiral; PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_INSTALL_OBJC_HEADER = NO; @@ -753,24 +772,29 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 35; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 6G96AERJ7Q; + DEVELOPMENT_TEAM = 6PLL9M5SE2; + ENABLE_MODULE_VERIFIER = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/SwiftRadio", + "$(PROJECT_DIR)/RadioSpiral", ); - INFOPLIST_FILE = SwiftRadio/Info.plist; + INFOPLIST_FILE = RadioSpiral/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = RadioSpiral; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0.8; - PRODUCT_BUNDLE_IDENTIFIER = com.matthewfecher.SwiftRadio; - PRODUCT_NAME = SwiftRadio; + MARKETING_VERSION = 2.2; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; + PRODUCT_BUNDLE_IDENTIFIER = com.pemungkah.radiospiral; + PRODUCT_NAME = RadioSpiral; PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_INSTALL_OBJC_HEADER = NO; @@ -783,31 +807,35 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = SwiftRadio/SwiftRadio.entitlements; + CODE_SIGN_ENTITLEMENTS = RadioSpiral/RadioSpiral.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 6; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 6G96AERJ7Q; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 6PLL9M5SE2; + ENABLE_MODULE_VERIFIER = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/SwiftRadio", + "$(PROJECT_DIR)/RadioSpiral", ); - INFOPLIST_FILE = "SwiftRadio/Info-CarPlay.plist"; + INFOPLIST_FILE = "RadioSpiral/Info-CarPlay.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "RadioSpiral-CarPlay"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 2.0.8; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_SWIFT_FLAGS = "-D CarPlay"; - PRODUCT_BUNDLE_IDENTIFIER = com.fethica.SwiftRadio; + PRODUCT_BUNDLE_IDENTIFIER = com.pemungkah.radiospiral; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = swiftradiocarplay; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Ad Hoc Carplay"; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -818,31 +846,35 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = SwiftRadio/SwiftRadio.entitlements; + CODE_SIGN_ENTITLEMENTS = RadioSpiral/RadioSpiral.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 6; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 6G96AERJ7Q; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 6PLL9M5SE2; + ENABLE_MODULE_VERIFIER = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/SwiftRadio", + "$(PROJECT_DIR)/RadioSpiral", ); - INFOPLIST_FILE = "SwiftRadio/Info-CarPlay.plist"; + INFOPLIST_FILE = "RadioSpiral/Info-CarPlay.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "RadioSpiral-CarPlay"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 2.0.8; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_SWIFT_FLAGS = "-D CarPlay"; - PRODUCT_BUNDLE_IDENTIFIER = com.fethica.SwiftRadio; + PRODUCT_BUNDLE_IDENTIFIER = com.pemungkah.radiospiral; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = swiftradiocarplay; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Ad Hoc Carplay"; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -852,7 +884,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2C5545C31C1124DE00728469 /* Build configuration list for PBXNativeTarget "SwiftRadioUITests" */ = { + 2C5545C31C1124DE00728469 /* Build configuration list for PBXNativeTarget "RadioSpiralUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( 2C5545C11C1124DE00728469 /* Debug */, @@ -861,7 +893,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9409E1111ABF6FE900312E2B /* Build configuration list for PBXProject "SwiftRadio" */ = { + 9409E1111ABF6FE900312E2B /* Build configuration list for PBXProject "RadioSpiral" */ = { isa = XCConfigurationList; buildConfigurations = ( 9409E1361ABF6FEA00312E2B /* Debug */, @@ -870,7 +902,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9409E1381ABF6FEA00312E2B /* Build configuration list for PBXNativeTarget "SwiftRadio" */ = { + 9409E1381ABF6FEA00312E2B /* Build configuration list for PBXNativeTarget "RadioSpiral" */ = { isa = XCConfigurationList; buildConfigurations = ( 9409E1391ABF6FEA00312E2B /* Debug */, @@ -879,7 +911,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - CE6A3E4C291F376D0058C82A /* Build configuration list for PBXNativeTarget "SwiftRadio-CarPlay" */ = { + CE6A3E4C291F376D0058C82A /* Build configuration list for PBXNativeTarget "RadioSpiral-CarPlay" */ = { isa = XCConfigurationList; buildConfigurations = ( CE6A3E4D291F376D0058C82A /* Debug */, diff --git a/SwiftRadio.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RadioSpiral.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from SwiftRadio.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to RadioSpiral.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/SwiftRadio.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RadioSpiral.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from SwiftRadio.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to RadioSpiral.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/SwiftRadio.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/RadioSpiral.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved similarity index 89% rename from SwiftRadio.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved rename to RadioSpiral.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 4645fed8..5911c266 100644 --- a/SwiftRadio.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/RadioSpiral.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "c03022914e54a7652fd2a88118474c6bd04be8d7b4eb153d776df85ac35986a7", "pins" : [ { "identity" : "fradioplayer", @@ -28,5 +29,5 @@ } } ], - "version" : 2 + "version" : 3 } diff --git a/RadioSpiral.xcodeproj/xcshareddata/xcschemes/RadioSpiral-CarPlay.xcscheme b/RadioSpiral.xcodeproj/xcshareddata/xcschemes/RadioSpiral-CarPlay.xcscheme new file mode 100644 index 00000000..56b251fc --- /dev/null +++ b/RadioSpiral.xcodeproj/xcshareddata/xcschemes/RadioSpiral-CarPlay.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SwiftRadio.xcodeproj/xcshareddata/xcschemes/SwiftRadio.xcscheme b/RadioSpiral.xcodeproj/xcshareddata/xcschemes/RadioSpiral.xcscheme similarity index 72% rename from SwiftRadio.xcodeproj/xcshareddata/xcschemes/SwiftRadio.xcscheme rename to RadioSpiral.xcodeproj/xcshareddata/xcschemes/RadioSpiral.xcscheme index b48eef7f..61af8c34 100644 --- a/SwiftRadio.xcodeproj/xcshareddata/xcschemes/SwiftRadio.xcscheme +++ b/RadioSpiral.xcodeproj/xcshareddata/xcschemes/RadioSpiral.xcscheme @@ -1,6 +1,6 @@ + BuildableName = "RadioSpiral.app" + BlueprintName = "RadioSpiral" + ReferencedContainer = "container:RadioSpiral.xcodeproj"> @@ -31,9 +31,9 @@ + BuildableName = "RadioSpiral.app" + BlueprintName = "RadioSpiral" + ReferencedContainer = "container:RadioSpiral.xcodeproj"> @@ -42,9 +42,9 @@ + BuildableName = "RadioSpiralUITests.xctest" + BlueprintName = "RadioSpiralUITests" + ReferencedContainer = "container:RadioSpiral.xcodeproj"> @@ -64,11 +64,17 @@ + BuildableName = "RadioSpiral.app" + BlueprintName = "RadioSpiral" + ReferencedContainer = "container:RadioSpiral.xcodeproj"> + + + + + BuildableName = "RadioSpiral.app" + BlueprintName = "RadioSpiral" + ReferencedContainer = "container:RadioSpiral.xcodeproj"> diff --git a/RadioSpiral.xcodeproj/xcshareddata/xcschemes/RadioSpiralUITests.xcscheme b/RadioSpiral.xcodeproj/xcshareddata/xcschemes/RadioSpiralUITests.xcscheme new file mode 100644 index 00000000..32248d10 --- /dev/null +++ b/RadioSpiral.xcodeproj/xcshareddata/xcschemes/RadioSpiralUITests.xcscheme @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SwiftRadio/AppDelegate.swift b/RadioSpiral/AppDelegate.swift similarity index 100% rename from SwiftRadio/AppDelegate.swift rename to RadioSpiral/AppDelegate.swift diff --git a/SwiftRadio/Base.lproj/LaunchScreen.xib b/RadioSpiral/Base.lproj/LaunchScreen.xib similarity index 100% rename from SwiftRadio/Base.lproj/LaunchScreen.xib rename to RadioSpiral/Base.lproj/LaunchScreen.xib diff --git a/SwiftRadio/CarPlay/AppDelegate+CarPlay.swift b/RadioSpiral/CarPlay/AppDelegate+CarPlay.swift similarity index 97% rename from SwiftRadio/CarPlay/AppDelegate+CarPlay.swift rename to RadioSpiral/CarPlay/AppDelegate+CarPlay.swift index 4bba565e..cce2ec1c 100644 --- a/SwiftRadio/CarPlay/AppDelegate+CarPlay.swift +++ b/RadioSpiral/CarPlay/AppDelegate+CarPlay.swift @@ -67,8 +67,8 @@ extension AppDelegate: MPPlayableContentDataSource { if indexPath.count == 1 { // Tab section - let item = MPContentItem(identifier: "Stations") - item.title = "Stations" + let item = MPContentItem(identifier: "Streams") + item.title = "Streams" item.isContainer = true item.isPlayable = false item.artwork = MPMediaItemArtwork(boundsSize: #imageLiteral(resourceName: "carPlayTab").size, requestHandler: { _ -> UIImage in diff --git a/SwiftRadio/Cells/NothingFoundCell.xib b/RadioSpiral/Cells/NothingFoundCell.xib similarity index 100% rename from SwiftRadio/Cells/NothingFoundCell.xib rename to RadioSpiral/Cells/NothingFoundCell.xib diff --git a/SwiftRadio/Cells/StationTableViewCell.swift b/RadioSpiral/Cells/StationTableViewCell.swift similarity index 100% rename from SwiftRadio/Cells/StationTableViewCell.swift rename to RadioSpiral/Cells/StationTableViewCell.swift diff --git a/SwiftRadio/Config.swift b/RadioSpiral/Config.swift similarity index 65% rename from SwiftRadio/Config.swift rename to RadioSpiral/Config.swift index b48eed40..8a88ea6a 100755 --- a/SwiftRadio/Config.swift +++ b/RadioSpiral/Config.swift @@ -14,8 +14,8 @@ struct Config { // If this is set to "true", it will use the JSON file in the app // Set it to "false" to use the JSON file at the stationDataURL - static let useLocalStations = true - static let stationsURL = "https://fethica.com/assets/swift-radio/stations.json" + static let useLocalStations = false + static let stationsURL = "https://raw.githubusercontent.com/joemcmahon/radiospiral-config/master/stations.json" // Set this to "true" to enable the search bar static let searchable = false @@ -24,8 +24,8 @@ struct Config { static let hideNextPreviousButtons = true // Contact infos - static let website = "https://github.com/analogcode/Swift-Radio-Pro" - static let email = "contact@fethica.com" - static let emailSubject = "From \(Bundle.main.appName) App" + static let website = "https://radiospiral.net" + static let email = "radio@pemungkah.com" + static let emailSubject = "\(Bundle.main.appName) App Q" } diff --git a/SwiftRadio/Coordinators/Coordinator.swift b/RadioSpiral/Coordinators/Coordinator.swift similarity index 100% rename from SwiftRadio/Coordinators/Coordinator.swift rename to RadioSpiral/Coordinators/Coordinator.swift diff --git a/SwiftRadio/Coordinators/MainCoordinator.swift b/RadioSpiral/Coordinators/MainCoordinator.swift similarity index 79% rename from SwiftRadio/Coordinators/MainCoordinator.swift rename to RadioSpiral/Coordinators/MainCoordinator.swift index 3b957572..125783a9 100644 --- a/SwiftRadio/Coordinators/MainCoordinator.swift +++ b/RadioSpiral/Coordinators/MainCoordinator.swift @@ -33,15 +33,38 @@ class MainCoordinator: NavigationCoordinator { func openEmail(in viewController: UIViewController & MFMailComposeViewControllerDelegate) { let receipients = [Config.email] let subject = Config.emailSubject - let messageBody = "" + + var version = "unavailable" + var build = "unavailable" + if let v = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { + version = v + } + if let b = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { + build = b + } + let messageBody = "App version \(version), build \(build)\n" let configuredMailComposeViewController = viewController.configureMailComposeViewController(recepients: receipients, subject: subject, messageBody: messageBody) if viewController.canSendMail { viewController.present(configuredMailComposeViewController, animated: true, completion: nil) } else { - viewController.showSendMailErrorAlert() + if !bruteForceSendMail(recepients: receipients, subject: subject, messageBody: messageBody) { + // force presentation of the failure dialog + viewController.showSendMailErrorAlert() + } + } + } + + func bruteForceSendMail(recepients: [String], subject: String, messageBody: String) -> Bool { + var email = "mailto:\(recepients[0])?subject=\(subject)&body=\(messageBody)" + email = email.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed) ?? "" + var worked = false + print("Brute force email: \(subject)") + UIApplication.shared.open(URL(string: email)!, options: [:]) { success in + worked = success } + return worked } func openAbout(in viewController: UIViewController) { diff --git a/SwiftRadio/Data/stations.json b/RadioSpiral/Data/stations.json similarity index 100% rename from SwiftRadio/Data/stations.json rename to RadioSpiral/Data/stations.json diff --git a/SwiftRadio/Helpers/AnimationFrames.swift b/RadioSpiral/Helpers/AnimationFrames.swift similarity index 100% rename from SwiftRadio/Helpers/AnimationFrames.swift rename to RadioSpiral/Helpers/AnimationFrames.swift diff --git a/SwiftRadio/Helpers/Bundle+appName.swift b/RadioSpiral/Helpers/Bundle+appName.swift similarity index 100% rename from SwiftRadio/Helpers/Bundle+appName.swift rename to RadioSpiral/Helpers/Bundle+appName.swift diff --git a/SwiftRadio/Helpers/Handoffable.swift b/RadioSpiral/Helpers/Handoffable.swift similarity index 100% rename from SwiftRadio/Helpers/Handoffable.swift rename to RadioSpiral/Helpers/Handoffable.swift diff --git a/SwiftRadio/Helpers/ShareActivity.swift b/RadioSpiral/Helpers/ShareActivity.swift similarity index 100% rename from SwiftRadio/Helpers/ShareActivity.swift rename to RadioSpiral/Helpers/ShareActivity.swift diff --git a/SwiftRadio/Helpers/Storyboard.swift b/RadioSpiral/Helpers/Storyboard.swift similarity index 100% rename from SwiftRadio/Helpers/Storyboard.swift rename to RadioSpiral/Helpers/Storyboard.swift diff --git a/SwiftRadio/Helpers/UIImage+Cache.swift b/RadioSpiral/Helpers/UIImage+Cache.swift similarity index 100% rename from SwiftRadio/Helpers/UIImage+Cache.swift rename to RadioSpiral/Helpers/UIImage+Cache.swift diff --git a/SwiftRadio/Helpers/UIImage+DropShadow.swift b/RadioSpiral/Helpers/UIImage+DropShadow.swift similarity index 100% rename from SwiftRadio/Helpers/UIImage+DropShadow.swift rename to RadioSpiral/Helpers/UIImage+DropShadow.swift diff --git a/SwiftRadio/Helpers/UIImageView+Cache.swift b/RadioSpiral/Helpers/UIImageView+Cache.swift similarity index 100% rename from SwiftRadio/Helpers/UIImageView+Cache.swift rename to RadioSpiral/Helpers/UIImageView+Cache.swift diff --git a/SwiftRadio/Helpers/UITableViewCell+reuseIdentifier.swift b/RadioSpiral/Helpers/UITableViewCell+reuseIdentifier.swift similarity index 100% rename from SwiftRadio/Helpers/UITableViewCell+reuseIdentifier.swift rename to RadioSpiral/Helpers/UITableViewCell+reuseIdentifier.swift diff --git a/SwiftRadio/Helpers/UIViewController+Email.swift b/RadioSpiral/Helpers/UIViewController+Email.swift similarity index 82% rename from SwiftRadio/Helpers/UIViewController+Email.swift rename to RadioSpiral/Helpers/UIViewController+Email.swift index 90d4e14c..6569c143 100644 --- a/SwiftRadio/Helpers/UIViewController+Email.swift +++ b/RadioSpiral/Helpers/UIViewController+Email.swift @@ -27,7 +27,7 @@ extension MFMailComposeViewControllerDelegate where Self: UIViewController { } func showSendMailErrorAlert() { - let sendMailErrorAlert = UIAlertController(title: "Could Not Send Email", message: "Your device could not send e-mail. Please check e-mail configuration and try again.", preferredStyle: .alert) + let sendMailErrorAlert = UIAlertController(title: "Unable to send mail", message: "We were unable to open the default mail application. Please check your mail configuration and try again.", preferredStyle: .alert) let cancelAction = UIAlertAction(title: "OK", style: .cancel, handler: nil) sendMailErrorAlert.addAction(cancelAction) diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/Contents.json b/RadioSpiral/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100755 index 00000000..7e7933b7 --- /dev/null +++ b/RadioSpiral/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images" : [ + { + "filename" : "iTunesArtworkMarketing-40x40.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "iTunesArtworkMarketing-60x60.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "iTunesArtworkMarketing-58x58.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "iTunesArtworkMarketing-87x87.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "iTunesArtworkMarketing-80x80.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "iTunesArtworkMarketing-120x120.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "iTunesArtworkMarketing-120x120 1.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "iTunesArtworkMarketing-180x180.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "iTunesArtworkMarketing-20x20.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "iTunesArtworkMarketing-40x40 1.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "iTunesArtworkMarketing-29x29.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "iTunesArtworkMarketing-58x58 1.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "iTunesArtworkMarketing-40x40 2.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "iTunesArtworkMarketing-80x80 1.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "iTunesArtworkMarketing-76x76.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "iTunesArtworkMarketing-152x152.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "iTunesArtworkMarketing-167x167.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "iTunesArtworkMarketing-1024x1024.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-1024x1024.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-1024x1024.png new file mode 100644 index 00000000..1825441e Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-1024x1024.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-120x120 1.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-120x120 1.png new file mode 100644 index 00000000..3921b88d Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-120x120 1.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-120x120.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-120x120.png new file mode 100644 index 00000000..3921b88d Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-120x120.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-152x152.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-152x152.png new file mode 100644 index 00000000..c22b9957 Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-152x152.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-167x167.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-167x167.png new file mode 100644 index 00000000..afac474f Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-167x167.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-180x180.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-180x180.png new file mode 100644 index 00000000..2870bfec Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-180x180.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-20x20.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-20x20.png new file mode 100644 index 00000000..1d1d5f01 Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-20x20.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-29x29.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-29x29.png new file mode 100644 index 00000000..f22f3eb9 Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-29x29.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-40x40 1.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-40x40 1.png new file mode 100644 index 00000000..c0ef4f6c Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-40x40 1.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-40x40 2.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-40x40 2.png new file mode 100644 index 00000000..c0ef4f6c Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-40x40 2.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-40x40.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-40x40.png new file mode 100644 index 00000000..c0ef4f6c Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-40x40.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-58x58 1.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-58x58 1.png new file mode 100644 index 00000000..c45b1492 Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-58x58 1.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-58x58.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-58x58.png new file mode 100644 index 00000000..c45b1492 Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-58x58.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-60x60.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-60x60.png new file mode 100644 index 00000000..c67caa3d Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-60x60.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-76x76.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-76x76.png new file mode 100644 index 00000000..afedb225 Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-76x76.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-80x80 1.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-80x80 1.png new file mode 100644 index 00000000..9ce09ea9 Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-80x80 1.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-80x80.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-80x80.png new file mode 100644 index 00000000..9ce09ea9 Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-80x80.png differ diff --git a/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-87x87.png b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-87x87.png new file mode 100644 index 00000000..b59cf028 Binary files /dev/null and b/RadioSpiral/Images.xcassets/AppIcon.appiconset/iTunesArtworkMarketing-87x87.png differ diff --git a/SwiftRadio/Images.xcassets/Contents.json b/RadioSpiral/Images.xcassets/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Contents.json rename to RadioSpiral/Images.xcassets/Contents.json diff --git a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/Contents.json b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/Contents.json similarity index 64% rename from SwiftRadio/Images.xcassets/LaunchImage.launchimage/Contents.json rename to RadioSpiral/Images.xcassets/LaunchImage.launchimage/Contents.json index 5327081e..a3e182a4 100755 --- a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -2,42 +2,42 @@ "images" : [ { "extent" : "full-screen", + "filename" : "splash-retinaHD5.5.png", "idiom" : "iphone", - "subtype" : "736h", - "filename" : "6plus.png", "minimum-system-version" : "8.0", "orientation" : "portrait", - "scale" : "3x" + "scale" : "3x", + "subtype" : "736h" }, { "extent" : "full-screen", + "filename" : "splash-retinaHD4.7.png", "idiom" : "iphone", - "subtype" : "667h", - "filename" : "Portrait6.png", "minimum-system-version" : "8.0", "orientation" : "portrait", - "scale" : "2x" + "scale" : "2x", + "subtype" : "667h" }, { - "orientation" : "portrait", - "idiom" : "iphone", - "filename" : "4s.png", "extent" : "full-screen", + "filename" : "splash-2x.png", + "idiom" : "iphone", "minimum-system-version" : "7.0", + "orientation" : "portrait", "scale" : "2x" }, { "extent" : "full-screen", + "filename" : "splash-retina4.png", "idiom" : "iphone", - "subtype" : "retina4", - "filename" : "5C.png", "minimum-system-version" : "7.0", "orientation" : "portrait", - "scale" : "2x" + "scale" : "2x", + "subtype" : "retina4" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-2x.png b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-2x.png new file mode 100644 index 00000000..6a0034b4 Binary files /dev/null and b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-2x.png differ diff --git a/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-retina4.png b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-retina4.png new file mode 100644 index 00000000..c4c2ef09 Binary files /dev/null and b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-retina4.png differ diff --git a/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-retinaHD4.7.png b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-retinaHD4.7.png new file mode 100644 index 00000000..b8cf6829 Binary files /dev/null and b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-retinaHD4.7.png differ diff --git a/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-retinaHD5.5.png b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-retinaHD5.5.png new file mode 100644 index 00000000..6519957a Binary files /dev/null and b/RadioSpiral/Images.xcassets/LaunchImage.launchimage/splash-retinaHD5.5.png differ diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-0.imageset/Contents.json b/RadioSpiral/Images.xcassets/NowPlayingBars-0.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-0.imageset/Contents.json rename to RadioSpiral/Images.xcassets/NowPlayingBars-0.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0.png b/RadioSpiral/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0@2x.png b/RadioSpiral/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0@2x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0@2x.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0@3x.png b/RadioSpiral/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0@3x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-0.imageset/NowPlayingBars-0@3x.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-1.imageset/Contents.json b/RadioSpiral/Images.xcassets/NowPlayingBars-1.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-1.imageset/Contents.json rename to RadioSpiral/Images.xcassets/NowPlayingBars-1.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1.png b/RadioSpiral/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1@2x.png b/RadioSpiral/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1@2x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1@2x.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1@3x.png b/RadioSpiral/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1@3x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-1.imageset/NowPlayingBars-1@3x.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-2.imageset/Contents.json b/RadioSpiral/Images.xcassets/NowPlayingBars-2.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-2.imageset/Contents.json rename to RadioSpiral/Images.xcassets/NowPlayingBars-2.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2.png b/RadioSpiral/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2@2x.png b/RadioSpiral/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2@2x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2@2x.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2@3x.png b/RadioSpiral/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2@3x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-2.imageset/NowPlayingBars-2@3x.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-3.imageset/Contents.json b/RadioSpiral/Images.xcassets/NowPlayingBars-3.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-3.imageset/Contents.json rename to RadioSpiral/Images.xcassets/NowPlayingBars-3.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3.png b/RadioSpiral/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3@2x.png b/RadioSpiral/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3@2x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3@2x.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3@3x.png b/RadioSpiral/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3@3x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars-3.imageset/NowPlayingBars-3@3x.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars.imageset/Contents.json b/RadioSpiral/Images.xcassets/NowPlayingBars.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars.imageset/Contents.json rename to RadioSpiral/Images.xcassets/NowPlayingBars.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars.png b/RadioSpiral/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars.png rename to RadioSpiral/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars@2x.png b/RadioSpiral/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars@2x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars@2x.png diff --git a/SwiftRadio/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars@3x.png b/RadioSpiral/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars@3x.png rename to RadioSpiral/Images.xcassets/NowPlayingBars.imageset/NowPlayingBars@3x.png diff --git a/SwiftRadio/Images.xcassets/Stations/Contents.json b/RadioSpiral/Images.xcassets/Stations/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/Contents.json rename to RadioSpiral/Images.xcassets/Stations/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/az-rock-radio.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/az-rock-radio.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/az-rock-radio.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/az-rock-radio.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio.png b/RadioSpiral/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio.png rename to RadioSpiral/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio.png diff --git a/SwiftRadio/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio@2x.png b/RadioSpiral/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio@2x.png rename to RadioSpiral/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio@2x.png diff --git a/SwiftRadio/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio@3x.png b/RadioSpiral/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio@3x.png rename to RadioSpiral/Images.xcassets/Stations/az-rock-radio.imageset/az-rock-radio@3x.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-80s.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/station-80s.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-80s.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/station-80s.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/station-80s.imageset/station-80s.png b/RadioSpiral/Images.xcassets/Stations/station-80s.imageset/station-80s.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-80s.imageset/station-80s.png rename to RadioSpiral/Images.xcassets/Stations/station-80s.imageset/station-80s.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-absolutecountry.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/station-absolutecountry.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-absolutecountry.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/station-absolutecountry.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/station-absolutecountry.imageset/station-absolutecountry.png b/RadioSpiral/Images.xcassets/Stations/station-absolutecountry.imageset/station-absolutecountry.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-absolutecountry.imageset/station-absolutecountry.png rename to RadioSpiral/Images.xcassets/Stations/station-absolutecountry.imageset/station-absolutecountry.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-absolutecountry.imageset/station-absolutecountry@2x.png b/RadioSpiral/Images.xcassets/Stations/station-absolutecountry.imageset/station-absolutecountry@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-absolutecountry.imageset/station-absolutecountry@2x.png rename to RadioSpiral/Images.xcassets/Stations/station-absolutecountry.imageset/station-absolutecountry@2x.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-altvault.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/station-altvault.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-altvault.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/station-altvault.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/station-altvault.imageset/station-altvault.png b/RadioSpiral/Images.xcassets/Stations/station-altvault.imageset/station-altvault.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-altvault.imageset/station-altvault.png rename to RadioSpiral/Images.xcassets/Stations/station-altvault.imageset/station-altvault.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-altvault.imageset/station-altvault@2x.png b/RadioSpiral/Images.xcassets/Stations/station-altvault.imageset/station-altvault@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-altvault.imageset/station-altvault@2x.png rename to RadioSpiral/Images.xcassets/Stations/station-altvault.imageset/station-altvault@2x.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-classicrock.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/station-classicrock.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-classicrock.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/station-classicrock.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/station-classicrock.imageset/station-classicrock.png b/RadioSpiral/Images.xcassets/Stations/station-classicrock.imageset/station-classicrock.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-classicrock.imageset/station-classicrock.png rename to RadioSpiral/Images.xcassets/Stations/station-classicrock.imageset/station-classicrock.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-killrockstars.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/station-killrockstars.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-killrockstars.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/station-killrockstars.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/station-killrockstars.imageset/station-killrockstars.png b/RadioSpiral/Images.xcassets/Stations/station-killrockstars.imageset/station-killrockstars.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-killrockstars.imageset/station-killrockstars.png rename to RadioSpiral/Images.xcassets/Stations/station-killrockstars.imageset/station-killrockstars.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-newportfolk.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/station-newportfolk.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-newportfolk.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/station-newportfolk.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/station-newportfolk.imageset/station-newportfolk.png b/RadioSpiral/Images.xcassets/Stations/station-newportfolk.imageset/station-newportfolk.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-newportfolk.imageset/station-newportfolk.png rename to RadioSpiral/Images.xcassets/Stations/station-newportfolk.imageset/station-newportfolk.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-newportfolk.imageset/station-newportfolk@2x.png b/RadioSpiral/Images.xcassets/Stations/station-newportfolk.imageset/station-newportfolk@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-newportfolk.imageset/station-newportfolk@2x.png rename to RadioSpiral/Images.xcassets/Stations/station-newportfolk.imageset/station-newportfolk@2x.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-spaceland.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/station-spaceland.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-spaceland.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/station-spaceland.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/station-spaceland.imageset/station-spaceland.png b/RadioSpiral/Images.xcassets/Stations/station-spaceland.imageset/station-spaceland.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-spaceland.imageset/station-spaceland.png rename to RadioSpiral/Images.xcassets/Stations/station-spaceland.imageset/station-spaceland.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-sub.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/station-sub.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-sub.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/station-sub.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/station-sub.imageset/sub.png b/RadioSpiral/Images.xcassets/Stations/station-sub.imageset/sub.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-sub.imageset/sub.png rename to RadioSpiral/Images.xcassets/Stations/station-sub.imageset/sub.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-therockfm.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/station-therockfm.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-therockfm.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/station-therockfm.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm.png b/RadioSpiral/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm.png rename to RadioSpiral/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm@2x.png b/RadioSpiral/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm@2x.png rename to RadioSpiral/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm@2x.png diff --git a/SwiftRadio/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm@3x.png b/RadioSpiral/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm@3x.png rename to RadioSpiral/Images.xcassets/Stations/station-therockfm.imageset/station-therockfm@3x.png diff --git a/SwiftRadio/Images.xcassets/Stations/stationImage.imageset/Contents.json b/RadioSpiral/Images.xcassets/Stations/stationImage.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/stationImage.imageset/Contents.json rename to RadioSpiral/Images.xcassets/Stations/stationImage.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/Stations/stationImage.imageset/stationImage.png b/RadioSpiral/Images.xcassets/Stations/stationImage.imageset/stationImage.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/stationImage.imageset/stationImage.png rename to RadioSpiral/Images.xcassets/Stations/stationImage.imageset/stationImage.png diff --git a/SwiftRadio/Images.xcassets/Stations/stationImage.imageset/stationImage@2x.png b/RadioSpiral/Images.xcassets/Stations/stationImage.imageset/stationImage@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/stationImage.imageset/stationImage@2x.png rename to RadioSpiral/Images.xcassets/Stations/stationImage.imageset/stationImage@2x.png diff --git a/SwiftRadio/Images.xcassets/Stations/stationImage.imageset/stationImage@3x.png b/RadioSpiral/Images.xcassets/Stations/stationImage.imageset/stationImage@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/Stations/stationImage.imageset/stationImage@3x.png rename to RadioSpiral/Images.xcassets/Stations/stationImage.imageset/stationImage@3x.png diff --git a/RadioSpiral/Images.xcassets/albumArt.imageset/Contents.json b/RadioSpiral/Images.xcassets/albumArt.imageset/Contents.json new file mode 100755 index 00000000..9b4d3b32 --- /dev/null +++ b/RadioSpiral/Images.xcassets/albumArt.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "albumArt.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "albumArt@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "albumArt@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SwiftRadio/Images.xcassets/albumArt.imageset/albumArt.png b/RadioSpiral/Images.xcassets/albumArt.imageset/albumArt.png old mode 100755 new mode 100644 similarity index 100% rename from SwiftRadio/Images.xcassets/albumArt.imageset/albumArt.png rename to RadioSpiral/Images.xcassets/albumArt.imageset/albumArt.png diff --git a/SwiftRadio/Images.xcassets/albumArt.imageset/albumArt@2x.png b/RadioSpiral/Images.xcassets/albumArt.imageset/albumArt@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/albumArt.imageset/albumArt@2x.png rename to RadioSpiral/Images.xcassets/albumArt.imageset/albumArt@2x.png diff --git a/SwiftRadio/Images.xcassets/albumArt.imageset/albumArt@3x.png b/RadioSpiral/Images.xcassets/albumArt.imageset/albumArt@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/albumArt.imageset/albumArt@3x.png rename to RadioSpiral/Images.xcassets/albumArt.imageset/albumArt@3x.png diff --git a/RadioSpiral/Images.xcassets/background.imageset/Contents.json b/RadioSpiral/Images.xcassets/background.imageset/Contents.json new file mode 100755 index 00000000..5c5b5023 --- /dev/null +++ b/RadioSpiral/Images.xcassets/background.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "background.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "background@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "background@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/RadioSpiral/Images.xcassets/background.imageset/background.png b/RadioSpiral/Images.xcassets/background.imageset/background.png new file mode 100644 index 00000000..1cd9da68 Binary files /dev/null and b/RadioSpiral/Images.xcassets/background.imageset/background.png differ diff --git a/RadioSpiral/Images.xcassets/background.imageset/background@2x.png b/RadioSpiral/Images.xcassets/background.imageset/background@2x.png new file mode 100644 index 00000000..4c1be10d Binary files /dev/null and b/RadioSpiral/Images.xcassets/background.imageset/background@2x.png differ diff --git a/RadioSpiral/Images.xcassets/background.imageset/background@3x.png b/RadioSpiral/Images.xcassets/background.imageset/background@3x.png new file mode 100644 index 00000000..59d1d79a Binary files /dev/null and b/RadioSpiral/Images.xcassets/background.imageset/background@3x.png differ diff --git a/SwiftRadio/Images.xcassets/btn-close.imageset/Contents.json b/RadioSpiral/Images.xcassets/btn-close.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/btn-close.imageset/Contents.json rename to RadioSpiral/Images.xcassets/btn-close.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/btn-close.imageset/btn-close.png b/RadioSpiral/Images.xcassets/btn-close.imageset/btn-close.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-close.imageset/btn-close.png rename to RadioSpiral/Images.xcassets/btn-close.imageset/btn-close.png diff --git a/SwiftRadio/Images.xcassets/btn-close.imageset/btn-close@2x.png b/RadioSpiral/Images.xcassets/btn-close.imageset/btn-close@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-close.imageset/btn-close@2x.png rename to RadioSpiral/Images.xcassets/btn-close.imageset/btn-close@2x.png diff --git a/SwiftRadio/Images.xcassets/btn-close.imageset/btn-close@3x.png b/RadioSpiral/Images.xcassets/btn-close.imageset/btn-close@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-close.imageset/btn-close@3x.png rename to RadioSpiral/Images.xcassets/btn-close.imageset/btn-close@3x.png diff --git a/SwiftRadio/Images.xcassets/btn-next.imageset/Contents.json b/RadioSpiral/Images.xcassets/btn-next.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/btn-next.imageset/Contents.json rename to RadioSpiral/Images.xcassets/btn-next.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/btn-next.imageset/btn-next.png b/RadioSpiral/Images.xcassets/btn-next.imageset/btn-next.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-next.imageset/btn-next.png rename to RadioSpiral/Images.xcassets/btn-next.imageset/btn-next.png diff --git a/SwiftRadio/Images.xcassets/btn-next.imageset/btn-next@2x.png b/RadioSpiral/Images.xcassets/btn-next.imageset/btn-next@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-next.imageset/btn-next@2x.png rename to RadioSpiral/Images.xcassets/btn-next.imageset/btn-next@2x.png diff --git a/SwiftRadio/Images.xcassets/btn-next.imageset/btn-next@3x.png b/RadioSpiral/Images.xcassets/btn-next.imageset/btn-next@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-next.imageset/btn-next@3x.png rename to RadioSpiral/Images.xcassets/btn-next.imageset/btn-next@3x.png diff --git a/SwiftRadio/Images.xcassets/btn-nowPlaying.imageset/Contents.json b/RadioSpiral/Images.xcassets/btn-nowPlaying.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/btn-nowPlaying.imageset/Contents.json rename to RadioSpiral/Images.xcassets/btn-nowPlaying.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/btn-nowPlaying.imageset/btn-nowPlaying.png b/RadioSpiral/Images.xcassets/btn-nowPlaying.imageset/btn-nowPlaying.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-nowPlaying.imageset/btn-nowPlaying.png rename to RadioSpiral/Images.xcassets/btn-nowPlaying.imageset/btn-nowPlaying.png diff --git a/SwiftRadio/Images.xcassets/btn-nowPlaying.imageset/btn-nowPlaying@2x.png b/RadioSpiral/Images.xcassets/btn-nowPlaying.imageset/btn-nowPlaying@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-nowPlaying.imageset/btn-nowPlaying@2x.png rename to RadioSpiral/Images.xcassets/btn-nowPlaying.imageset/btn-nowPlaying@2x.png diff --git a/SwiftRadio/Images.xcassets/btn-pause.imageset/Contents.json b/RadioSpiral/Images.xcassets/btn-pause.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/btn-pause.imageset/Contents.json rename to RadioSpiral/Images.xcassets/btn-pause.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/btn-pause.imageset/btn-pause.png b/RadioSpiral/Images.xcassets/btn-pause.imageset/btn-pause.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-pause.imageset/btn-pause.png rename to RadioSpiral/Images.xcassets/btn-pause.imageset/btn-pause.png diff --git a/SwiftRadio/Images.xcassets/btn-pause.imageset/btn-pause@2x.png b/RadioSpiral/Images.xcassets/btn-pause.imageset/btn-pause@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-pause.imageset/btn-pause@2x.png rename to RadioSpiral/Images.xcassets/btn-pause.imageset/btn-pause@2x.png diff --git a/SwiftRadio/Images.xcassets/btn-pause.imageset/btn-pause@3x.png b/RadioSpiral/Images.xcassets/btn-pause.imageset/btn-pause@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-pause.imageset/btn-pause@3x.png rename to RadioSpiral/Images.xcassets/btn-pause.imageset/btn-pause@3x.png diff --git a/SwiftRadio/Images.xcassets/btn-play.imageset/Contents.json b/RadioSpiral/Images.xcassets/btn-play.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/btn-play.imageset/Contents.json rename to RadioSpiral/Images.xcassets/btn-play.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/btn-play.imageset/btn-play.png b/RadioSpiral/Images.xcassets/btn-play.imageset/btn-play.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-play.imageset/btn-play.png rename to RadioSpiral/Images.xcassets/btn-play.imageset/btn-play.png diff --git a/SwiftRadio/Images.xcassets/btn-play.imageset/btn-play@2x.png b/RadioSpiral/Images.xcassets/btn-play.imageset/btn-play@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-play.imageset/btn-play@2x.png rename to RadioSpiral/Images.xcassets/btn-play.imageset/btn-play@2x.png diff --git a/SwiftRadio/Images.xcassets/btn-play.imageset/btn-play@3x.png b/RadioSpiral/Images.xcassets/btn-play.imageset/btn-play@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-play.imageset/btn-play@3x.png rename to RadioSpiral/Images.xcassets/btn-play.imageset/btn-play@3x.png diff --git a/SwiftRadio/Images.xcassets/btn-previous.imageset/Contents.json b/RadioSpiral/Images.xcassets/btn-previous.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/btn-previous.imageset/Contents.json rename to RadioSpiral/Images.xcassets/btn-previous.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/btn-previous.imageset/btn-previous.png b/RadioSpiral/Images.xcassets/btn-previous.imageset/btn-previous.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-previous.imageset/btn-previous.png rename to RadioSpiral/Images.xcassets/btn-previous.imageset/btn-previous.png diff --git a/SwiftRadio/Images.xcassets/btn-previous.imageset/btn-previous@2x.png b/RadioSpiral/Images.xcassets/btn-previous.imageset/btn-previous@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-previous.imageset/btn-previous@2x.png rename to RadioSpiral/Images.xcassets/btn-previous.imageset/btn-previous@2x.png diff --git a/SwiftRadio/Images.xcassets/btn-previous.imageset/btn-previous@3x.png b/RadioSpiral/Images.xcassets/btn-previous.imageset/btn-previous@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-previous.imageset/btn-previous@3x.png rename to RadioSpiral/Images.xcassets/btn-previous.imageset/btn-previous@3x.png diff --git a/SwiftRadio/Images.xcassets/btn-stop.imageset/Contents.json b/RadioSpiral/Images.xcassets/btn-stop.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/btn-stop.imageset/Contents.json rename to RadioSpiral/Images.xcassets/btn-stop.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/btn-stop.imageset/btn-stop.png b/RadioSpiral/Images.xcassets/btn-stop.imageset/btn-stop.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-stop.imageset/btn-stop.png rename to RadioSpiral/Images.xcassets/btn-stop.imageset/btn-stop.png diff --git a/SwiftRadio/Images.xcassets/btn-stop.imageset/btn-stop@2x.png b/RadioSpiral/Images.xcassets/btn-stop.imageset/btn-stop@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-stop.imageset/btn-stop@2x.png rename to RadioSpiral/Images.xcassets/btn-stop.imageset/btn-stop@2x.png diff --git a/SwiftRadio/Images.xcassets/btn-stop.imageset/btn-stop@3x.png b/RadioSpiral/Images.xcassets/btn-stop.imageset/btn-stop@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/btn-stop.imageset/btn-stop@3x.png rename to RadioSpiral/Images.xcassets/btn-stop.imageset/btn-stop@3x.png diff --git a/SwiftRadio/Images.xcassets/carPlayTab.imageset/Contents.json b/RadioSpiral/Images.xcassets/carPlayTab.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/carPlayTab.imageset/Contents.json rename to RadioSpiral/Images.xcassets/carPlayTab.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/carPlayTab.imageset/carPlayTab.png b/RadioSpiral/Images.xcassets/carPlayTab.imageset/carPlayTab.png similarity index 100% rename from SwiftRadio/Images.xcassets/carPlayTab.imageset/carPlayTab.png rename to RadioSpiral/Images.xcassets/carPlayTab.imageset/carPlayTab.png diff --git a/SwiftRadio/Images.xcassets/carPlayTab.imageset/carPlayTab@2x.png b/RadioSpiral/Images.xcassets/carPlayTab.imageset/carPlayTab@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/carPlayTab.imageset/carPlayTab@2x.png rename to RadioSpiral/Images.xcassets/carPlayTab.imageset/carPlayTab@2x.png diff --git a/SwiftRadio/Images.xcassets/carPlayTab.imageset/carPlayTab@3x.png b/RadioSpiral/Images.xcassets/carPlayTab.imageset/carPlayTab@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/carPlayTab.imageset/carPlayTab@3x.png rename to RadioSpiral/Images.xcassets/carPlayTab.imageset/carPlayTab@3x.png diff --git a/SwiftRadio/Images.xcassets/icon-hamburger.imageset/Contents.json b/RadioSpiral/Images.xcassets/icon-hamburger.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/icon-hamburger.imageset/Contents.json rename to RadioSpiral/Images.xcassets/icon-hamburger.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/icon-hamburger.imageset/icon-hamburger.png b/RadioSpiral/Images.xcassets/icon-hamburger.imageset/icon-hamburger.png similarity index 100% rename from SwiftRadio/Images.xcassets/icon-hamburger.imageset/icon-hamburger.png rename to RadioSpiral/Images.xcassets/icon-hamburger.imageset/icon-hamburger.png diff --git a/SwiftRadio/Images.xcassets/icon-hamburger.imageset/icon-hamburger@2x.png b/RadioSpiral/Images.xcassets/icon-hamburger.imageset/icon-hamburger@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/icon-hamburger.imageset/icon-hamburger@2x.png rename to RadioSpiral/Images.xcassets/icon-hamburger.imageset/icon-hamburger@2x.png diff --git a/SwiftRadio/Images.xcassets/icon-hamburger.imageset/icon-hamburger@3x.png b/RadioSpiral/Images.xcassets/icon-hamburger.imageset/icon-hamburger@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/icon-hamburger.imageset/icon-hamburger@3x.png rename to RadioSpiral/Images.xcassets/icon-hamburger.imageset/icon-hamburger@3x.png diff --git a/SwiftRadio/Images.xcassets/icon-info.imageset/Contents.json b/RadioSpiral/Images.xcassets/icon-info.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/icon-info.imageset/Contents.json rename to RadioSpiral/Images.xcassets/icon-info.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/icon-info.imageset/icon-info.png b/RadioSpiral/Images.xcassets/icon-info.imageset/icon-info.png similarity index 100% rename from SwiftRadio/Images.xcassets/icon-info.imageset/icon-info.png rename to RadioSpiral/Images.xcassets/icon-info.imageset/icon-info.png diff --git a/SwiftRadio/Images.xcassets/icon-info.imageset/icon-info@2x.png b/RadioSpiral/Images.xcassets/icon-info.imageset/icon-info@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/icon-info.imageset/icon-info@2x.png rename to RadioSpiral/Images.xcassets/icon-info.imageset/icon-info@2x.png diff --git a/SwiftRadio/Images.xcassets/icon-info.imageset/icon-info@3x.png b/RadioSpiral/Images.xcassets/icon-info.imageset/icon-info@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/icon-info.imageset/icon-info@3x.png rename to RadioSpiral/Images.xcassets/icon-info.imageset/icon-info@3x.png diff --git a/RadioSpiral/Images.xcassets/logo.imageset/Contents.json b/RadioSpiral/Images.xcassets/logo.imageset/Contents.json new file mode 100755 index 00000000..b54d4d9a --- /dev/null +++ b/RadioSpiral/Images.xcassets/logo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "logo.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "logo@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "logo@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/RadioSpiral/Images.xcassets/logo.imageset/logo.png b/RadioSpiral/Images.xcassets/logo.imageset/logo.png new file mode 100644 index 00000000..9fc8f009 Binary files /dev/null and b/RadioSpiral/Images.xcassets/logo.imageset/logo.png differ diff --git a/RadioSpiral/Images.xcassets/logo.imageset/logo@2x.png b/RadioSpiral/Images.xcassets/logo.imageset/logo@2x.png new file mode 100644 index 00000000..c4ab4e51 Binary files /dev/null and b/RadioSpiral/Images.xcassets/logo.imageset/logo@2x.png differ diff --git a/RadioSpiral/Images.xcassets/logo.imageset/logo@3x.png b/RadioSpiral/Images.xcassets/logo.imageset/logo@3x.png new file mode 100644 index 00000000..8722f2cb Binary files /dev/null and b/RadioSpiral/Images.xcassets/logo.imageset/logo@3x.png differ diff --git a/RadioSpiral/Images.xcassets/radiospiral.imageset/Contents.json b/RadioSpiral/Images.xcassets/radiospiral.imageset/Contents.json new file mode 100644 index 00000000..242f3ffb --- /dev/null +++ b/RadioSpiral/Images.xcassets/radiospiral.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "radiospiral.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/RadioSpiral/Images.xcassets/radiospiral.imageset/radiospiral.png b/RadioSpiral/Images.xcassets/radiospiral.imageset/radiospiral.png new file mode 100644 index 00000000..737f45aa Binary files /dev/null and b/RadioSpiral/Images.xcassets/radiospiral.imageset/radiospiral.png differ diff --git a/SwiftRadio/Images.xcassets/share.imageset/Contents.json b/RadioSpiral/Images.xcassets/share.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/share.imageset/Contents.json rename to RadioSpiral/Images.xcassets/share.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/share.imageset/share.png b/RadioSpiral/Images.xcassets/share.imageset/share.png similarity index 100% rename from SwiftRadio/Images.xcassets/share.imageset/share.png rename to RadioSpiral/Images.xcassets/share.imageset/share.png diff --git a/SwiftRadio/Images.xcassets/share.imageset/share@2x.png b/RadioSpiral/Images.xcassets/share.imageset/share@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/share.imageset/share@2x.png rename to RadioSpiral/Images.xcassets/share.imageset/share@2x.png diff --git a/SwiftRadio/Images.xcassets/share.imageset/share@3x.png b/RadioSpiral/Images.xcassets/share.imageset/share@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/share.imageset/share@3x.png rename to RadioSpiral/Images.xcassets/share.imageset/share@3x.png diff --git a/SwiftRadio/Images.xcassets/slider-ball.imageset/Contents.json b/RadioSpiral/Images.xcassets/slider-ball.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/slider-ball.imageset/Contents.json rename to RadioSpiral/Images.xcassets/slider-ball.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/slider-ball.imageset/slider-ball.png b/RadioSpiral/Images.xcassets/slider-ball.imageset/slider-ball.png similarity index 100% rename from SwiftRadio/Images.xcassets/slider-ball.imageset/slider-ball.png rename to RadioSpiral/Images.xcassets/slider-ball.imageset/slider-ball.png diff --git a/SwiftRadio/Images.xcassets/slider-ball.imageset/slider-ball@2x.png b/RadioSpiral/Images.xcassets/slider-ball.imageset/slider-ball@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/slider-ball.imageset/slider-ball@2x.png rename to RadioSpiral/Images.xcassets/slider-ball.imageset/slider-ball@2x.png diff --git a/SwiftRadio/Images.xcassets/slider-ball.imageset/slider-ball@3x.png b/RadioSpiral/Images.xcassets/slider-ball.imageset/slider-ball@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/slider-ball.imageset/slider-ball@3x.png rename to RadioSpiral/Images.xcassets/slider-ball.imageset/slider-ball@3x.png diff --git a/SwiftRadio/Images.xcassets/swift-radio-black.imageset/Contents.json b/RadioSpiral/Images.xcassets/swift-radio-black.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/swift-radio-black.imageset/Contents.json rename to RadioSpiral/Images.xcassets/swift-radio-black.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/swift-radio-black.imageset/swift-radio-black.png b/RadioSpiral/Images.xcassets/swift-radio-black.imageset/swift-radio-black.png similarity index 100% rename from SwiftRadio/Images.xcassets/swift-radio-black.imageset/swift-radio-black.png rename to RadioSpiral/Images.xcassets/swift-radio-black.imageset/swift-radio-black.png diff --git a/SwiftRadio/Images.xcassets/swift-radio-black.imageset/swift-radio-black@2x.png b/RadioSpiral/Images.xcassets/swift-radio-black.imageset/swift-radio-black@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/swift-radio-black.imageset/swift-radio-black@2x.png rename to RadioSpiral/Images.xcassets/swift-radio-black.imageset/swift-radio-black@2x.png diff --git a/SwiftRadio/Images.xcassets/vol-max.imageset/Contents.json b/RadioSpiral/Images.xcassets/vol-max.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/vol-max.imageset/Contents.json rename to RadioSpiral/Images.xcassets/vol-max.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/vol-max.imageset/vol-max.png b/RadioSpiral/Images.xcassets/vol-max.imageset/vol-max.png similarity index 100% rename from SwiftRadio/Images.xcassets/vol-max.imageset/vol-max.png rename to RadioSpiral/Images.xcassets/vol-max.imageset/vol-max.png diff --git a/SwiftRadio/Images.xcassets/vol-max.imageset/vol-max@2x.png b/RadioSpiral/Images.xcassets/vol-max.imageset/vol-max@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/vol-max.imageset/vol-max@2x.png rename to RadioSpiral/Images.xcassets/vol-max.imageset/vol-max@2x.png diff --git a/SwiftRadio/Images.xcassets/vol-max.imageset/vol-max@3x.png b/RadioSpiral/Images.xcassets/vol-max.imageset/vol-max@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/vol-max.imageset/vol-max@3x.png rename to RadioSpiral/Images.xcassets/vol-max.imageset/vol-max@3x.png diff --git a/SwiftRadio/Images.xcassets/vol-min.imageset/Contents.json b/RadioSpiral/Images.xcassets/vol-min.imageset/Contents.json similarity index 100% rename from SwiftRadio/Images.xcassets/vol-min.imageset/Contents.json rename to RadioSpiral/Images.xcassets/vol-min.imageset/Contents.json diff --git a/SwiftRadio/Images.xcassets/vol-min.imageset/vol-min.png b/RadioSpiral/Images.xcassets/vol-min.imageset/vol-min.png similarity index 100% rename from SwiftRadio/Images.xcassets/vol-min.imageset/vol-min.png rename to RadioSpiral/Images.xcassets/vol-min.imageset/vol-min.png diff --git a/SwiftRadio/Images.xcassets/vol-min.imageset/vol-min@2x.png b/RadioSpiral/Images.xcassets/vol-min.imageset/vol-min@2x.png similarity index 100% rename from SwiftRadio/Images.xcassets/vol-min.imageset/vol-min@2x.png rename to RadioSpiral/Images.xcassets/vol-min.imageset/vol-min@2x.png diff --git a/SwiftRadio/Images.xcassets/vol-min.imageset/vol-min@3x.png b/RadioSpiral/Images.xcassets/vol-min.imageset/vol-min@3x.png similarity index 100% rename from SwiftRadio/Images.xcassets/vol-min.imageset/vol-min@3x.png rename to RadioSpiral/Images.xcassets/vol-min.imageset/vol-min@3x.png diff --git a/SwiftRadio/Info-CarPlay.plist b/RadioSpiral/Info-CarPlay.plist similarity index 98% rename from SwiftRadio/Info-CarPlay.plist rename to RadioSpiral/Info-CarPlay.plist index 69bd7353..d3cc6d81 100755 --- a/SwiftRadio/Info-CarPlay.plist +++ b/RadioSpiral/Info-CarPlay.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - Swift Radio CP + RadioSpiral CarPlay CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -39,6 +39,8 @@ audio + UIBrowsableContentSupportsSectionedBrowsing + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -60,7 +62,5 @@ UIUserInterfaceStyle Dark - UIBrowsableContentSupportsSectionedBrowsing - diff --git a/SwiftRadio/Info.plist b/RadioSpiral/Info.plist similarity index 92% rename from SwiftRadio/Info.plist rename to RadioSpiral/Info.plist index 21a6bd2d..8ef845f9 100755 --- a/SwiftRadio/Info.plist +++ b/RadioSpiral/Info.plist @@ -2,10 +2,12 @@ + ITSAppUsesNonExemptEncryption + CFBundleDevelopmentRegion en CFBundleDisplayName - Swift Radio + RadioSpiral CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -45,18 +47,16 @@ armv7 + UIStatusBarHidden + UIStatusBarStyle UIStatusBarStyleLightContent UISupportedInterfaceOrientations - UIInterfaceOrientationPortrait - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown UIUserInterfaceStyle Dark diff --git a/SwiftRadio/Model/RadioStation.swift b/RadioSpiral/Model/RadioStation.swift similarity index 77% rename from SwiftRadio/Model/RadioStation.swift rename to RadioSpiral/Model/RadioStation.swift index a940573c..1402ebf0 100755 --- a/SwiftRadio/Model/RadioStation.swift +++ b/RadioSpiral/Model/RadioStation.swift @@ -30,7 +30,11 @@ struct RadioStation: Codable { extension RadioStation { var shoutout: String { - "I'm listening to \(name) via \(Bundle.main.appName) app" + if releaseName.isEmpty { + "I'm listening to \"\(trackName)\" by \(artistName) on \(Bundle.main.appName)" + } else { + "I'm listening to \"\(trackName)\" by \(artistName) from \"\(releaseName)\" on \(Bundle.main.appName)" + } } } @@ -66,4 +70,13 @@ extension RadioStation { var artistName: String { FRadioPlayer.shared.currentMetadata?.artistName ?? desc } + + var releaseName: String { + let raw = FRadioPlayer.shared.currentMetadata?.rawValue + let parts = raw?.components(separatedBy: " - ") + if parts?.count == 3 { + return (parts?[1])! + } + return "" + } } diff --git a/RadioSpiral/Model/RadioStationPROAPI.swift b/RadioSpiral/Model/RadioStationPROAPI.swift new file mode 100644 index 00000000..db3f2b1d --- /dev/null +++ b/RadioSpiral/Model/RadioStationPROAPI.swift @@ -0,0 +1,185 @@ +// +// RadioStationPROAPI.swift +// RadioSpiral +// +// Created by Joe McMahon on 12/22/23. +// Copyright © 2023 matthewfecher.com. All rights reserved. +// + +import Foundation + +enum NoShowError: Error { + case message(String) +} + +struct Host: Codable { + let name: String + let url: String +} + +struct Show: Codable { + let id: Int + let name: String + let slug: String + let url: String + let hosts: [Host] +} + +struct BroadcastShow: Codable { + let id: String + let day: String + let date: String + let start: String + let end: String + let show: Show +} + +struct NowPlaying: Codable { + let text: String + let title: String + let artist: String +} + +struct ActiveShow: Codable { + let current_show: BroadcastShow? + let next_show: BroadcastShow + let now_playing: NowPlaying + let instance: Int +} + +struct NoActiveShow: Codable { +// let current_show: Bool + let next_show: BroadcastShow + let now_playing: NowPlaying + let instance: Int +} + +struct Endpoints: Codable { + let station, broadcast, schedule, shows, genres, languages, episodes, hosts, producers: String +} + +struct ShowOn: Codable { + let broadcast: ActiveShow + let timezone, stream_url, stream_format, fallback_url: String + let fallback_format, station_url, schedule_url, language, timestamp: String + let date_time, updated: String + let success: Bool + let endpoints: Endpoints +} + +struct NoShowOn: Codable { + let broadcast: NoActiveShow + let timezone, stream_url, stream_format, fallback_url: String + let fallback_format, station_url, schedule_url, language, timestamp: String + let date_time, updated: String + let success: Bool + let endpoints: Endpoints +} + +struct RadioStationPROAPI { + + // Define the URL for the broadcast endpoint + private static let endpointURL = URL(string: "https://radiospiral.net/wp-json/radio/broadcast/")! + static var djName: String = "" + static var showName: String = "" + + // Define a struct to represent the JSON response + struct BroadcastResponse: Codable { + let current_show: String + } + + static var result: String = "" + + // Define a function to fetch the current show from the API + static func getCurrentDJ(completion: @escaping (Result) -> Void) { + + // Create a data task to make the HTTP request + let task = URLSession.shared.dataTask(with: endpointURL) { (data, response, error) in + // Check for errors + if let error = error { + completion(.failure(error)) + return + } + + // Check for a valid HTTP response + guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { + completion(.failure(NSError(domain: "Invalid HTTP response", code: 0, userInfo: nil))) + return + } + + // Check for valid data + guard let data = data else { + completion(.failure(NSError(domain: "No data received", code: 0, userInfo: nil))) + return + } + + result = String(decoding: data, as: UTF8.self) + print(result) + // Try active show, then no show + do { + // Decode the JSON response + let decoder = JSONDecoder() + print("decoding assuming current show") + let activeResponse = try decoder.decode(ShowOn.self, from: data) + // Extract and pass the current show value to the completion handler + print("active parse okay, trying extract") + completion(.success(activeResponse.broadcast.current_show!.show.hosts[0].name)) + } catch { + print("active show failed, trying inactive") + // Retry with different parse + do { + // Decode the JSON response + let decoder = JSONDecoder() + print("decoding assuming no current show") + let noActiveResponse = try decoder.decode(NoShowOn.self, from: data) + // Extract and pass the current show value to the completion handler + print("parse no active show okay, trying extract") + let djName = noActiveResponse.broadcast.next_show.show.hosts[0].name + print("trying to see if API is lagging") + let show_date = noActiveResponse.broadcast.next_show.date + let start_hour = noActiveResponse.broadcast.next_show.start + let tz = noActiveResponse.timezone + print("converting show date_time \(show_date) at \(start_hour) to \(tz)") + + var showDate = Date() + let showDateFormatter = DateFormatter() + showDateFormatter.dateFormat = "yyyy-MM-dd" + + // Parse the date string + if let date = showDateFormatter.date(from: show_date) { + // Get the current calendar + let showCalendar = Calendar.current + + // Extract components from the date + var showDateComponents = showCalendar.dateComponents([.year, .month, .day], from: date) + + // Set the hour component} + showDateComponents.hour = Int(start_hour) + + // Get the date with the new hour + if let showDate = showCalendar.date(from: showDateComponents) { + print("New date with hour set to \(start_hour): \(showDate)") + } else { + completion(.failure(NoShowError.message("could not use show hour \(start_hour)"))) + } + } else { + completion(.failure(NoShowError.message("could not parse show date \(show_date)"))) + } + + print("showDate: \(showDate)") + let currentDate = Date() + print("checking if 'next' show has started now: \(currentDate) vs show: \(showDate)") + print(currentDate > showDate) + print("hasn't") + completion(.failure(NoShowError.message("no active show"))) + } catch { + print("parse failed completely") + print(error) + completion(.failure(error)) + } + } + } + // Start the data task + task.resume() + } +} diff --git a/SwiftRadio/Model/StationsManager.swift b/RadioSpiral/Model/StationsManager.swift similarity index 100% rename from SwiftRadio/Model/StationsManager.swift rename to RadioSpiral/Model/StationsManager.swift diff --git a/SwiftRadio/Networking/DataManager.swift b/RadioSpiral/Networking/DataManager.swift similarity index 100% rename from SwiftRadio/Networking/DataManager.swift rename to RadioSpiral/Networking/DataManager.swift diff --git a/SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/wu.xcuserdatad/WorkspaceSettings.xcsettings b/RadioSpiral/RadioSpiral.entitlements similarity index 54% rename from SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/wu.xcuserdatad/WorkspaceSettings.xcsettings rename to RadioSpiral/RadioSpiral.entitlements index bfffcfe0..155a61a8 100644 --- a/SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/wu.xcuserdatad/WorkspaceSettings.xcsettings +++ b/RadioSpiral/RadioSpiral.entitlements @@ -1,10 +1,8 @@ - - HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges - - SnapshotAutomaticallyBeforeSignificantChanges - + + application-identifier + com.pemungkah.radiospiral diff --git a/SwiftRadio/LaunchScreen.storyboard b/RadioSpiral/Storyboards/LaunchScreen.storyboard similarity index 73% rename from SwiftRadio/LaunchScreen.storyboard rename to RadioSpiral/Storyboards/LaunchScreen.storyboard index 578e0be4..7f6827e6 100644 --- a/SwiftRadio/LaunchScreen.storyboard +++ b/RadioSpiral/Storyboards/LaunchScreen.storyboard @@ -1,11 +1,9 @@ - - - - + + - + @@ -21,14 +19,11 @@ - - - - - - + + + @@ -38,16 +33,15 @@ - - + - + diff --git a/SwiftRadio/Views/LogoShareView.xib b/RadioSpiral/Storyboards/LogoShareView.xib similarity index 100% rename from SwiftRadio/Views/LogoShareView.xib rename to RadioSpiral/Storyboards/LogoShareView.xib diff --git a/SwiftRadio/Main.storyboard b/RadioSpiral/Storyboards/Main.storyboard similarity index 71% rename from SwiftRadio/Main.storyboard rename to RadioSpiral/Storyboards/Main.storyboard index 21875fe4..f013a1aa 100755 --- a/SwiftRadio/Main.storyboard +++ b/RadioSpiral/Storyboards/Main.storyboard @@ -1,9 +1,9 @@ - - + + - + @@ -12,16 +12,16 @@ - + - + - + - + - - + + - - + + @@ -49,7 +49,7 @@ - + - - @@ -148,28 +143,21 @@ - + - + - + - - - - - - - - - + + - - + + - - + + @@ -240,10 +228,10 @@ - + @@ -255,7 +243,7 @@ - + @@ -266,65 +254,78 @@ - - + + + + + + + + + + - - - - + + - + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + - - - - + - - - + + + - + + - - + - + - - - - - + @@ -385,50 +405,52 @@ + + + - - + - + - + - + - + - + - + - - + @@ -448,15 +470,19 @@ + + + + + + + + + + Curator: + • Mike Metlay + +Second Life: + • Diana Smethurst + +Keeping the lights on: + • Paul Harriman + + + + + + + + + + + Bot herding & app: + • Joe McMahon + +Bullhorn: + • Rebekkah Hilgraves + +Downtime DJ: + • Spud + + + + + + + + + + - + - - + @@ -624,23 +702,28 @@ - + - + - + + + + - - - + + + + + diff --git a/SwiftRadio/SwiftRadio.entitlements b/RadioSpiral/SwiftRadio.entitlements similarity index 100% rename from SwiftRadio/SwiftRadio.entitlements rename to RadioSpiral/SwiftRadio.entitlements diff --git a/SwiftRadio/ViewControllers/AboutViewController.swift b/RadioSpiral/ViewControllers/AboutViewController.swift similarity index 100% rename from SwiftRadio/ViewControllers/AboutViewController.swift rename to RadioSpiral/ViewControllers/AboutViewController.swift diff --git a/SwiftRadio/ViewControllers/BaseController.swift b/RadioSpiral/ViewControllers/BaseController.swift similarity index 100% rename from SwiftRadio/ViewControllers/BaseController.swift rename to RadioSpiral/ViewControllers/BaseController.swift diff --git a/SwiftRadio/ViewControllers/InfoDetailViewController.swift b/RadioSpiral/ViewControllers/InfoDetailViewController.swift similarity index 85% rename from SwiftRadio/ViewControllers/InfoDetailViewController.swift rename to RadioSpiral/ViewControllers/InfoDetailViewController.swift index dee47e94..9acebee3 100755 --- a/SwiftRadio/ViewControllers/InfoDetailViewController.swift +++ b/RadioSpiral/ViewControllers/InfoDetailViewController.swift @@ -12,7 +12,6 @@ class InfoDetailViewController: UIViewController { @IBOutlet weak var stationImageView: UIImageView! @IBOutlet weak var stationNameLabel: UILabel! - @IBOutlet weak var stationDescLabel: UILabel! @IBOutlet weak var stationLongDescTextView: UITextView! @IBOutlet weak var okayButton: UIButton! @@ -33,7 +32,6 @@ class InfoDetailViewController: UIViewController { // Display Station Name & Short Desc stationNameLabel.text = currentStation.name - stationDescLabel.text = currentStation.desc // Display Station Long Desc if currentStation.longDesc == "" { @@ -45,7 +43,7 @@ class InfoDetailViewController: UIViewController { func loadDefaultText() { // Add your own default ext - stationLongDescTextView.text = "You are listening to Swift Radio. This is a sweet open source project. Tell your friends, swiftly!" + stationLongDescTextView.text = "RadioSpiral's 24/7 captivating electronica: some of the best in the genres of electronic and ambient music, featuring live DJs and live performances." } func setupStationLogo() { @@ -65,4 +63,7 @@ class InfoDetailViewController: UIViewController { _ = navigationController?.popViewController(animated: true) } + override func setValue(_ value: Any?, forUndefinedKey key: String + ) { + } } diff --git a/SwiftRadio/ViewControllers/LoaderController.swift b/RadioSpiral/ViewControllers/LoaderController.swift similarity index 96% rename from SwiftRadio/ViewControllers/LoaderController.swift rename to RadioSpiral/ViewControllers/LoaderController.swift index 9b241c0f..e2bc8a4f 100644 --- a/SwiftRadio/ViewControllers/LoaderController.swift +++ b/RadioSpiral/ViewControllers/LoaderController.swift @@ -19,7 +19,7 @@ class LoaderController: BaseController { private let manager = StationsManager.shared private let activityIndicatorView: UIActivityIndicatorView = { - let view = UIActivityIndicatorView(style: .white) + let view = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.medium) view.translatesAutoresizingMaskIntoConstraints = false return view }() @@ -82,7 +82,7 @@ class LoaderController: BaseController { super.setupViews() // Logo Image - let logoImage = UIImage(named: "logo") + let logoImage = UIImage(named: "radiospiral") let logoImageView = UIImageView(image: logoImage) logoImageView.translatesAutoresizingMaskIntoConstraints = false diff --git a/SwiftRadio/ViewControllers/NowPlayingViewController.swift b/RadioSpiral/ViewControllers/NowPlayingViewController.swift similarity index 83% rename from SwiftRadio/ViewControllers/NowPlayingViewController.swift rename to RadioSpiral/ViewControllers/NowPlayingViewController.swift index c750e0d0..e3a8448d 100644 --- a/SwiftRadio/ViewControllers/NowPlayingViewController.swift +++ b/RadioSpiral/ViewControllers/NowPlayingViewController.swift @@ -27,13 +27,15 @@ class NowPlayingViewController: UIViewController { @IBOutlet weak var albumHeightConstraint: NSLayoutConstraint! @IBOutlet weak var albumImageView: SpringImageView! @IBOutlet weak var artistLabel: UILabel! + @IBOutlet weak var releaseLabel: SpringLabel! @IBOutlet weak var playingButton: UIButton! @IBOutlet weak var songLabel: SpringLabel! - @IBOutlet weak var stationDescLabel: UILabel! @IBOutlet weak var volumeParentView: UIView! @IBOutlet weak var previousButton: UIButton! @IBOutlet weak var nextButton: UIButton! @IBOutlet weak var airPlayView: UIView! + @IBOutlet weak var djName: UILabel! + @IBOutlet weak var liveDJIndicator: UIButton! // MARK: - Properties @@ -51,6 +53,7 @@ class NowPlayingViewController: UIViewController { super.viewDidLoad() navigationItem.largeTitleDisplayMode = .never + navigationItem.hidesBackButton = true player.addObserver(self) manager.addObserver(self) @@ -65,9 +68,8 @@ class NowPlayingViewController: UIViewController { self.title = manager.currentStation?.name // Set UI - - stationDescLabel.text = manager.currentStation?.desc - stationDescLabel.isHidden = player.currentMetadata != nil + djName.text = "" + liveDJIndicator.isHidden = true // Check for station change if isNewStation { @@ -125,10 +127,9 @@ class NowPlayingViewController: UIViewController { manager.currentStation?.getImage { [weak self] image in self?.albumImageView.image = image } - stationDescLabel.text = manager.currentStation?.desc - stationDescLabel.isHidden = player.currentArtworkURL != nil title = manager.currentStation?.name updateLabels() + player.stop() } // MARK: - Player Controls (Play/Pause/Volume) @@ -154,7 +155,6 @@ class NowPlayingViewController: UIViewController { guard let artworkURL = player.currentArtworkURL else { manager.currentStation?.getImage { [weak self] image in self?.albumImageView.image = image - self?.stationDescLabel.isHidden = false } return } @@ -163,7 +163,6 @@ class NowPlayingViewController: UIViewController { self?.albumImageView.animation = "wobble" self?.albumImageView.duration = 2 self?.albumImageView.animate() - self?.stationDescLabel.isHidden = true // Force app to update display self?.view.setNeedsDisplay() @@ -200,42 +199,59 @@ class NowPlayingViewController: UIViewController { case .loading: message = "Loading Station ..." case .urlNotSet: - message = "Station URL not valide" + message = "Station URL not valid" case .readyToPlay, .loadingFinished: playbackStateDidChange(player.playbackState, animate: animate) return case .error: message = "Error Playing" } - updateLabels(with: message, animate: animate) } // MARK: - UI Helper Methods func optimizeForDeviceSize() { - // Adjust album size to fit iPhone 4s, 6s & 6s+ - let deviceHeight = self.view.bounds.height - - if deviceHeight == 480 { - albumHeightConstraint.constant = 106 - view.updateConstraints() - } else if deviceHeight == 667 { - albumHeightConstraint.constant = 230 - view.updateConstraints() - } else if deviceHeight > 667 { - albumHeightConstraint.constant = 260 - view.updateConstraints() - } + let deviceHeight = self.view.bounds.height * 0.30 + albumHeightConstraint.constant = deviceHeight + view.updateConstraints() } func updateLabels(with statusMessage: String? = nil, animate: Bool = true) { guard let statusMessage = statusMessage else { // Radio is (hopefully) streaming properly + self.liveDJIndicator.isHidden = false songLabel.text = manager.currentStation?.trackName artistLabel.text = manager.currentStation?.artistName + releaseLabel.text = manager.currentStation?.releaseName + RadioStationPROAPI.getCurrentDJ { result in + DispatchQueue.main.async { + let idleImage = UIImage(systemName: "music.quarternote.3") + let djImage = UIImage(systemName: "music.mic") + let liveImage = UIImage(systemName: "pianokeys.inverse") + switch result { + case .success(let currentDJ): + self.liveDJIndicator.setImage(liveImage, for: .normal) + self.djName.text = currentDJ + if (self.songLabel.text!.contains("[live]") || + self.songLabel.text!.lowercased().contains("{live}") || + self.songLabel.text!.lowercased().contains("«live»") || + self.songLabel.text!.lowercased().contains("") || + self.songLabel.text!.contains("LIVE on RadioSpiral") + ) { + self.liveDJIndicator.setImage(liveImage, for: .normal) + } else { + self.liveDJIndicator.setImage(djImage, for: .normal) + } + + case .failure(_): + self.djName.text = "Spud the Ambient Robot" + self.liveDJIndicator.setImage(idleImage, for: .normal) + } + } + } shouldAnimateSongLabel(animate) return } diff --git a/SwiftRadio/ViewControllers/PopUpMenuViewController.swift b/RadioSpiral/ViewControllers/PopUpMenuViewController.swift similarity index 100% rename from SwiftRadio/ViewControllers/PopUpMenuViewController.swift rename to RadioSpiral/ViewControllers/PopUpMenuViewController.swift diff --git a/SwiftRadio/ViewControllers/StationsViewController.swift b/RadioSpiral/ViewControllers/StationsViewController.swift similarity index 98% rename from SwiftRadio/ViewControllers/StationsViewController.swift rename to RadioSpiral/ViewControllers/StationsViewController.swift index 1fb35b24..7b2c0688 100644 --- a/SwiftRadio/ViewControllers/StationsViewController.swift +++ b/RadioSpiral/ViewControllers/StationsViewController.swift @@ -85,8 +85,10 @@ class StationsViewController: BaseController, Handoffable { } override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - title = "Swift Radio" + super.viewWillAppear(false) + title = "RadioSpiral streams" + let station = manager.stations[0] + pushNowPlayingController(with: station) } @objc func refresh(sender: AnyObject) { diff --git a/SwiftRadio/Views/LogoShareView.swift b/RadioSpiral/Views/LogoShareView.swift similarity index 100% rename from SwiftRadio/Views/LogoShareView.swift rename to RadioSpiral/Views/LogoShareView.swift diff --git a/SwiftRadio/Views/NowPlayingView.swift b/RadioSpiral/Views/NowPlayingView.swift similarity index 99% rename from SwiftRadio/Views/NowPlayingView.swift rename to RadioSpiral/Views/NowPlayingView.swift index 751403ed..99b06ea5 100644 --- a/SwiftRadio/Views/NowPlayingView.swift +++ b/RadioSpiral/Views/NowPlayingView.swift @@ -58,6 +58,7 @@ class NowPlayingView: UIView { private func setupViews() { backgroundColor = .black.withAlphaComponent(0.1) + NSLayoutConstraint.activate([ heightAnchor.constraint(greaterThanOrEqualToConstant: 50) ]) diff --git a/SwiftRadioUITests/Info.plist b/RadioSpiralUITests/Info.plist similarity index 100% rename from SwiftRadioUITests/Info.plist rename to RadioSpiralUITests/Info.plist diff --git a/RadioSpiralUITests/SwiftRadioUITests.swift b/RadioSpiralUITests/SwiftRadioUITests.swift new file mode 100644 index 00000000..9168d396 --- /dev/null +++ b/RadioSpiralUITests/SwiftRadioUITests.swift @@ -0,0 +1,85 @@ +// +// SwiftRadioUITests.swift +// SwiftRadioUITests +// +// Created by Jonah Stiennon on 12/3/15. +// Copyright © 2015 matthewfecher.com. All rights reserved. +// + +import XCTest + +class SwiftRadioUITests: XCTestCase { + + let app = XCUIApplication() + let stations = XCUIApplication().cells + let hamburgerMenu = XCUIApplication().navigationBars["Swift Radio"].buttons["icon-hamburger"] + let pauseButton = XCUIApplication().buttons["btn play"] + let playButton = XCUIApplication().buttons["btn play"] + let stopButton = XCUIApplication().buttons["btn stop"] + let shareButton = XCUIApplication().buttons["share"] + let volume = XCUIApplication().sliders.element(boundBy: 0) + + @MainActor override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + setupSnapshot(app) + app.launch() + + // wait for the main view to load + self.expectation( + for: NSPredicate(format: "self.count > 0"), + evaluatedWith: stations, + handler: nil) + self.waitForExpectations(timeout: 10.0, handler: nil) + snapshot("Streams list") + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + @MainActor func testHamburgerMenu() { + + let app = XCUIApplication() + app.navigationBars["RadioSpiral streams"].buttons["icon hamburger"].tap() + app.buttons["About"].tap() + snapshot("About") + let safari = XCUIApplication(bundleIdentifier: "com.apple.mobilesafari") + app/*@START_MENU_TOKEN@*/.staticTexts["Visit our website"]/*[[".buttons[\"Visit our website\"].staticTexts[\"Visit our website\"]",".staticTexts[\"Visit our website\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.tap() + _ = safari.wait(for: .runningForeground, timeout: 30) + app.activate() + app.buttons["OK"].tap() + print(app.buttons.keys) + app.buttons["btn close"].tap() + } + + @MainActor func testTransitionToNowPlaying() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + stations.element(boundBy: 0).tap() + snapshot("Loading") + self.expectation(for: NSPredicate(format: "exists == 1"), evaluatedWith: pauseButton, handler: nil) + self.waitForExpectations(timeout: 10.0, handler: nil) + snapshot("playing") + } + + @MainActor func testSharing() { + stations.element(boundBy: 0).tap() + print(app.buttons.keys) + self.expectation(for: NSPredicate(format: "exists == 1"), evaluatedWith: shareButton, handler: nil) + self.waitForExpectations(timeout: 10.0, handler: nil) + app.buttons["share"].tap() + self.expectation(for: NSPredicate(format: "exists == 1"), evaluatedWith: shareButton, handler: nil) + self.waitForExpectations(timeout: 10.0, handler: nil) + snapshot("share") + + } +} + diff --git a/SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/jonahss.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/jonahss.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 8c50d68c..00000000 Binary files a/SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/jonahss.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/wu.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/wu.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index baf5b2e6..00000000 Binary files a/SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/wu.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Contents.json b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index 1c859592..00000000 --- a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-60@3x.png", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-29.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-29@2x-1.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-40.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-40@2x-1.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-76.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "SWIFT-RADIO.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29.png deleted file mode 100755 index 4478e8d7..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29@2x-1.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29@2x-1.png deleted file mode 100755 index 4a318b93..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29@2x-1.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png deleted file mode 100755 index 4a318b93..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png deleted file mode 100755 index 5165781b..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40.png deleted file mode 100755 index 3c11a79e..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40@2x-1.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40@2x-1.png deleted file mode 100755 index 04310415..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40@2x-1.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png deleted file mode 100755 index 04310415..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png deleted file mode 100755 index c9c2a881..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png deleted file mode 100755 index d688d5b3..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png deleted file mode 100755 index a681f53d..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-76.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-76.png deleted file mode 100755 index eae29450..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-76.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png deleted file mode 100755 index d2a18fa4..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png deleted file mode 100644 index 387c771d..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/AppIcon.appiconset/SWIFT-RADIO.png b/SwiftRadio/Images.xcassets/AppIcon.appiconset/SWIFT-RADIO.png deleted file mode 100644 index faaf0313..00000000 Binary files a/SwiftRadio/Images.xcassets/AppIcon.appiconset/SWIFT-RADIO.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/4s.png b/SwiftRadio/Images.xcassets/LaunchImage.launchimage/4s.png deleted file mode 100755 index ff20003e..00000000 Binary files a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/4s.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/5C.png b/SwiftRadio/Images.xcassets/LaunchImage.launchimage/5C.png deleted file mode 100755 index 471be04f..00000000 Binary files a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/5C.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/6plus.png b/SwiftRadio/Images.xcassets/LaunchImage.launchimage/6plus.png deleted file mode 100755 index c61889e4..00000000 Binary files a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/6plus.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/Portrait6.png b/SwiftRadio/Images.xcassets/LaunchImage.launchimage/Portrait6.png deleted file mode 100755 index 7ee31ae1..00000000 Binary files a/SwiftRadio/Images.xcassets/LaunchImage.launchimage/Portrait6.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/albumArt.imageset/Contents.json b/SwiftRadio/Images.xcassets/albumArt.imageset/Contents.json deleted file mode 100755 index 375962ba..00000000 --- a/SwiftRadio/Images.xcassets/albumArt.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x", - "filename" : "albumArt.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "albumArt@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "albumArt@3x.png" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/SwiftRadio/Images.xcassets/background.imageset/Contents.json b/SwiftRadio/Images.xcassets/background.imageset/Contents.json deleted file mode 100755 index c6f1cfb3..00000000 --- a/SwiftRadio/Images.xcassets/background.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x", - "filename" : "background.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "background@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "background@3x.png" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/SwiftRadio/Images.xcassets/background.imageset/background.png b/SwiftRadio/Images.xcassets/background.imageset/background.png deleted file mode 100755 index 0eac883d..00000000 Binary files a/SwiftRadio/Images.xcassets/background.imageset/background.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/background.imageset/background@2x.png b/SwiftRadio/Images.xcassets/background.imageset/background@2x.png deleted file mode 100755 index c0b01f0b..00000000 Binary files a/SwiftRadio/Images.xcassets/background.imageset/background@2x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/background.imageset/background@3x.png b/SwiftRadio/Images.xcassets/background.imageset/background@3x.png deleted file mode 100755 index ef382b50..00000000 Binary files a/SwiftRadio/Images.xcassets/background.imageset/background@3x.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/logo.imageset/Contents.json b/SwiftRadio/Images.xcassets/logo.imageset/Contents.json deleted file mode 100755 index 84916e7b..00000000 --- a/SwiftRadio/Images.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x", - "filename" : "swift-radio.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "swift-radio-1.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "swift-radio-2.png" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/SwiftRadio/Images.xcassets/logo.imageset/swift-radio-1.png b/SwiftRadio/Images.xcassets/logo.imageset/swift-radio-1.png deleted file mode 100755 index 35d78fcf..00000000 Binary files a/SwiftRadio/Images.xcassets/logo.imageset/swift-radio-1.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/logo.imageset/swift-radio-2.png b/SwiftRadio/Images.xcassets/logo.imageset/swift-radio-2.png deleted file mode 100755 index 35d78fcf..00000000 Binary files a/SwiftRadio/Images.xcassets/logo.imageset/swift-radio-2.png and /dev/null differ diff --git a/SwiftRadio/Images.xcassets/logo.imageset/swift-radio.png b/SwiftRadio/Images.xcassets/logo.imageset/swift-radio.png deleted file mode 100755 index 35d78fcf..00000000 Binary files a/SwiftRadio/Images.xcassets/logo.imageset/swift-radio.png and /dev/null differ diff --git a/SwiftRadioUITests/SwiftRadioUITests.swift b/SwiftRadioUITests/SwiftRadioUITests.swift deleted file mode 100644 index 7344418a..00000000 --- a/SwiftRadioUITests/SwiftRadioUITests.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// SwiftRadioUITests.swift -// SwiftRadioUITests -// -// Created by Jonah Stiennon on 12/3/15. -// Copyright © 2015 matthewfecher.com. All rights reserved. -// - -import XCTest - -class SwiftRadioUITests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } -} diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 00000000..09375704 --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,6 @@ +app_identifier("com.pemungkah.radiospiral") # The bundle identifier of your app +# apple_id("[[APPLE_ID]]") # Your Apple Developer Portal username + + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 00000000..5184f291 --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,23 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:ios) + +platform :ios do + desc "Generate new localized screenshots" + lane :screenshots do + capture_screenshots(scheme: "RadioSpiralUITests") + end +end diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 00000000..a0e96bca --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,32 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## iOS + +### ios screenshots + +```sh +[bundle exec] fastlane ios screenshots +``` + +Generate new localized screenshots + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/fastlane/Snapfile b/fastlane/Snapfile new file mode 100644 index 00000000..570c09c2 --- /dev/null +++ b/fastlane/Snapfile @@ -0,0 +1,34 @@ +# Uncomment the lines below you want to change by removing the # in the beginning + +# A list of devices you want to take the screenshots from +devices([ + "iPhone 15 Pro Max", + "iPhone 8 Plus", + "iPad Pro (12.9-inch) (2nd generation)", + "iPad Pro (12.9-inch) (6th generation)" + ]) + + languages([ + "en-US", +# "de-DE", +# "it-IT", +# ["pt", "pt_BR"] # Portuguese with Brazilian locale + ]) + +# The name of the scheme which contains the UI Tests +scheme("RadioSpiralUITests") + +# Where should the resulting screenshots be stored? +output_directory("./screenshots") + +# remove the '#' to clear all previously generated screenshots before creating new ones +clear_previous_screenshots(true) + +# Remove the '#' to set the status bar to 9:41 AM, and show full battery and reception. See also override_status_bar_arguments for custom options. +override_status_bar(true) + +# Arguments to pass to the app on launch. See https://docs.fastlane.tools/actions/snapshot/#launch-arguments +# launch_arguments(["-favColor red"]) + +# For more information about all available options run +# fastlane action snapshot diff --git a/fastlane/SnapshotHelper.swift b/fastlane/SnapshotHelper.swift new file mode 100644 index 00000000..6dec1302 --- /dev/null +++ b/fastlane/SnapshotHelper.swift @@ -0,0 +1,313 @@ +// +// SnapshotHelper.swift +// Example +// +// Created by Felix Krause on 10/8/15. +// + +// ----------------------------------------------------- +// IMPORTANT: When modifying this file, make sure to +// increment the version number at the very +// bottom of the file to notify users about +// the new SnapshotHelper.swift +// ----------------------------------------------------- + +import Foundation +import XCTest + +@MainActor +func setupSnapshot(_ app: XCUIApplication, waitForAnimations: Bool = true) { + Snapshot.setupSnapshot(app, waitForAnimations: waitForAnimations) +} + +@MainActor +func snapshot(_ name: String, waitForLoadingIndicator: Bool) { + if waitForLoadingIndicator { + Snapshot.snapshot(name) + } else { + Snapshot.snapshot(name, timeWaitingForIdle: 0) + } +} + +/// - Parameters: +/// - name: The name of the snapshot +/// - timeout: Amount of seconds to wait until the network loading indicator disappears. Pass `0` if you don't want to wait. +@MainActor +func snapshot(_ name: String, timeWaitingForIdle timeout: TimeInterval = 20) { + Snapshot.snapshot(name, timeWaitingForIdle: timeout) +} + +enum SnapshotError: Error, CustomDebugStringConvertible { + case cannotFindSimulatorHomeDirectory + case cannotRunOnPhysicalDevice + + var debugDescription: String { + switch self { + case .cannotFindSimulatorHomeDirectory: + return "Couldn't find simulator home location. Please, check SIMULATOR_HOST_HOME env variable." + case .cannotRunOnPhysicalDevice: + return "Can't use Snapshot on a physical device." + } + } +} + +@objcMembers +@MainActor +open class Snapshot: NSObject { + static var app: XCUIApplication? + static var waitForAnimations = true + static var cacheDirectory: URL? + static var screenshotsDirectory: URL? { + return cacheDirectory?.appendingPathComponent("screenshots", isDirectory: true) + } + static var deviceLanguage = "" + static var currentLocale = "" + + open class func setupSnapshot(_ app: XCUIApplication, waitForAnimations: Bool = true) { + + Snapshot.app = app + Snapshot.waitForAnimations = waitForAnimations + + do { + let cacheDir = try getCacheDirectory() + Snapshot.cacheDirectory = cacheDir + setLanguage(app) + setLocale(app) + setLaunchArguments(app) + } catch let error { + NSLog(error.localizedDescription) + } + } + + class func setLanguage(_ app: XCUIApplication) { + guard let cacheDirectory = self.cacheDirectory else { + NSLog("CacheDirectory is not set - probably running on a physical device?") + return + } + + let path = cacheDirectory.appendingPathComponent("language.txt") + + do { + let trimCharacterSet = CharacterSet.whitespacesAndNewlines + deviceLanguage = try String(contentsOf: path, encoding: .utf8).trimmingCharacters(in: trimCharacterSet) + app.launchArguments += ["-AppleLanguages", "(\(deviceLanguage))"] + } catch { + NSLog("Couldn't detect/set language...") + } + } + + class func setLocale(_ app: XCUIApplication) { + guard let cacheDirectory = self.cacheDirectory else { + NSLog("CacheDirectory is not set - probably running on a physical device?") + return + } + + let path = cacheDirectory.appendingPathComponent("locale.txt") + + do { + let trimCharacterSet = CharacterSet.whitespacesAndNewlines + currentLocale = try String(contentsOf: path, encoding: .utf8).trimmingCharacters(in: trimCharacterSet) + } catch { + NSLog("Couldn't detect/set locale...") + } + + if currentLocale.isEmpty && !deviceLanguage.isEmpty { + currentLocale = Locale(identifier: deviceLanguage).identifier + } + + if !currentLocale.isEmpty { + app.launchArguments += ["-AppleLocale", "\"\(currentLocale)\""] + } + } + + class func setLaunchArguments(_ app: XCUIApplication) { + guard let cacheDirectory = self.cacheDirectory else { + NSLog("CacheDirectory is not set - probably running on a physical device?") + return + } + + let path = cacheDirectory.appendingPathComponent("snapshot-launch_arguments.txt") + app.launchArguments += ["-FASTLANE_SNAPSHOT", "YES", "-ui_testing"] + + do { + let launchArguments = try String(contentsOf: path, encoding: String.Encoding.utf8) + let regex = try NSRegularExpression(pattern: "(\\\".+?\\\"|\\S+)", options: []) + let matches = regex.matches(in: launchArguments, options: [], range: NSRange(location: 0, length: launchArguments.count)) + let results = matches.map { result -> String in + (launchArguments as NSString).substring(with: result.range) + } + app.launchArguments += results + } catch { + NSLog("Couldn't detect/set launch_arguments...") + } + } + + open class func snapshot(_ name: String, timeWaitingForIdle timeout: TimeInterval = 20) { + if timeout > 0 { + waitForLoadingIndicatorToDisappear(within: timeout) + } + + NSLog("snapshot: \(name)") // more information about this, check out https://docs.fastlane.tools/actions/snapshot/#how-does-it-work + + if Snapshot.waitForAnimations { + sleep(1) // Waiting for the animation to be finished (kind of) + } + + #if os(OSX) + guard let app = self.app else { + NSLog("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().") + return + } + + app.typeKey(XCUIKeyboardKeySecondaryFn, modifierFlags: []) + #else + + guard self.app != nil else { + NSLog("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().") + return + } + + let screenshot = XCUIScreen.main.screenshot() + #if os(iOS) && !targetEnvironment(macCatalyst) + let image = XCUIDevice.shared.orientation.isLandscape ? fixLandscapeOrientation(image: screenshot.image) : screenshot.image + #else + let image = screenshot.image + #endif + + guard var simulator = ProcessInfo().environment["SIMULATOR_DEVICE_NAME"], let screenshotsDir = screenshotsDirectory else { return } + + do { + // The simulator name contains "Clone X of " inside the screenshot file when running parallelized UI Tests on concurrent devices + let regex = try NSRegularExpression(pattern: "Clone [0-9]+ of ") + let range = NSRange(location: 0, length: simulator.count) + simulator = regex.stringByReplacingMatches(in: simulator, range: range, withTemplate: "") + + let path = screenshotsDir.appendingPathComponent("\(simulator)-\(name).png") + #if swift(<5.0) + try UIImagePNGRepresentation(image)?.write(to: path, options: .atomic) + #else + try image.pngData()?.write(to: path, options: .atomic) + #endif + } catch let error { + NSLog("Problem writing screenshot: \(name) to \(screenshotsDir)/\(simulator)-\(name).png") + NSLog(error.localizedDescription) + } + #endif + } + + class func fixLandscapeOrientation(image: UIImage) -> UIImage { + #if os(watchOS) + return image + #else + if #available(iOS 10.0, *) { + let format = UIGraphicsImageRendererFormat() + format.scale = image.scale + let renderer = UIGraphicsImageRenderer(size: image.size, format: format) + return renderer.image { context in + image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)) + } + } else { + return image + } + #endif + } + + class func waitForLoadingIndicatorToDisappear(within timeout: TimeInterval) { + #if os(tvOS) + return + #endif + + guard let app = self.app else { + NSLog("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().") + return + } + + let networkLoadingIndicator = app.otherElements.deviceStatusBars.networkLoadingIndicators.element + let networkLoadingIndicatorDisappeared = XCTNSPredicateExpectation(predicate: NSPredicate(format: "exists == false"), object: networkLoadingIndicator) + _ = XCTWaiter.wait(for: [networkLoadingIndicatorDisappeared], timeout: timeout) + } + + class func getCacheDirectory() throws -> URL { + let cachePath = "Library/Caches/tools.fastlane" + // on OSX config is stored in /Users//Library + // and on iOS/tvOS/WatchOS it's in simulator's home dir + #if os(OSX) + let homeDir = URL(fileURLWithPath: NSHomeDirectory()) + return homeDir.appendingPathComponent(cachePath) + #elseif arch(i386) || arch(x86_64) || arch(arm64) + guard let simulatorHostHome = ProcessInfo().environment["SIMULATOR_HOST_HOME"] else { + throw SnapshotError.cannotFindSimulatorHomeDirectory + } + let homeDir = URL(fileURLWithPath: simulatorHostHome) + return homeDir.appendingPathComponent(cachePath) + #else + throw SnapshotError.cannotRunOnPhysicalDevice + #endif + } +} + +private extension XCUIElementAttributes { + var isNetworkLoadingIndicator: Bool { + if hasAllowListedIdentifier { return false } + + let hasOldLoadingIndicatorSize = frame.size == CGSize(width: 10, height: 20) + let hasNewLoadingIndicatorSize = frame.size.width.isBetween(46, and: 47) && frame.size.height.isBetween(2, and: 3) + + return hasOldLoadingIndicatorSize || hasNewLoadingIndicatorSize + } + + var hasAllowListedIdentifier: Bool { + let allowListedIdentifiers = ["GeofenceLocationTrackingOn", "StandardLocationTrackingOn"] + + return allowListedIdentifiers.contains(identifier) + } + + func isStatusBar(_ deviceWidth: CGFloat) -> Bool { + if elementType == .statusBar { return true } + guard frame.origin == .zero else { return false } + + let oldStatusBarSize = CGSize(width: deviceWidth, height: 20) + let newStatusBarSize = CGSize(width: deviceWidth, height: 44) + + return [oldStatusBarSize, newStatusBarSize].contains(frame.size) + } +} + +private extension XCUIElementQuery { + var networkLoadingIndicators: XCUIElementQuery { + let isNetworkLoadingIndicator = NSPredicate { (evaluatedObject, _) in + guard let element = evaluatedObject as? XCUIElementAttributes else { return false } + + return element.isNetworkLoadingIndicator + } + + return self.containing(isNetworkLoadingIndicator) + } + + @MainActor + var deviceStatusBars: XCUIElementQuery { + guard let app = Snapshot.app else { + fatalError("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().") + } + + let deviceWidth = app.windows.firstMatch.frame.width + + let isStatusBar = NSPredicate { (evaluatedObject, _) in + guard let element = evaluatedObject as? XCUIElementAttributes else { return false } + + return element.isStatusBar(deviceWidth) + } + + return self.containing(isStatusBar) + } +} + +private extension CGFloat { + func isBetween(_ numberA: CGFloat, and numberB: CGFloat) -> Bool { + return numberA...numberB ~= self + } +} + +// Please don't remove the lines below +// They are used to detect outdated configuration files +// SnapshotHelperVersion [1.30]