Browse Source

Published on DaveGit

David Walter 3 years ago
parent
commit
a4db5cabdd
100 changed files with 3011 additions and 0 deletions
  1. BIN
      Images/Airplay_off@2x.png
  2. BIN
      Images/Airplay_on@2x.png
  3. BIN
      Images/Icon.png
  4. BIN
      Images/Icon.sketch
  5. BIN
      Images/MaxSlider.png
  6. BIN
      Images/MinSlider.png
  7. BIN
      Images/Pause@2x.png
  8. BIN
      Images/Play@2x.png
  9. BIN
      Images/Radio.png
  10. BIN
      Images/Sleep.png
  11. BIN
      Images/Sleep.sketch/Data
  12. BIN
      Images/Sleep.sketch/QuickLook/Preview.png
  13. BIN
      Images/Sleep.sketch/QuickLook/Thumbnail.png
  14. 2
    0
      Images/Sleep.sketch/fonts
  15. 1
    0
      Images/Sleep.sketch/version
  16. BIN
      Images/Star-Empty.png
  17. BIN
      Images/Star-Full.png
  18. BIN
      Images/Star.sketch/Data
  19. BIN
      Images/Star.sketch/QuickLook/Preview.png
  20. BIN
      Images/Star.sketch/QuickLook/Thumbnail.png
  21. 0
    0
      Images/Star.sketch/fonts
  22. 1
    0
      Images/Star.sketch/version
  23. BIN
      Images/Thumb.png
  24. BIN
      Images/Thumb.sketch/Data
  25. BIN
      Images/Thumb.sketch/QuickLook/Preview.png
  26. BIN
      Images/Thumb.sketch/QuickLook/Thumbnail.png
  27. 0
    0
      Images/Thumb.sketch/fonts
  28. 1
    0
      Images/Thumb.sketch/version
  29. BIN
      Images/Volume.sketch/Data
  30. BIN
      Images/Volume.sketch/QuickLook/Preview.png
  31. BIN
      Images/Volume.sketch/QuickLook/Thumbnail.png
  32. 0
    0
      Images/Volume.sketch/fonts
  33. 1
    0
      Images/Volume.sketch/version
  34. BIN
      Images/VolumeHigh.png
  35. BIN
      Images/VolumeLow.png
  36. BIN
      Images/airplay.sketch/Data
  37. BIN
      Images/airplay.sketch/QuickLook/Preview.png
  38. BIN
      Images/airplay.sketch/QuickLook/Thumbnail.png
  39. 0
    0
      Images/airplay.sketch/fonts
  40. 1
    0
      Images/airplay.sketch/version
  41. BIN
      Images/iTunesArtwork.png
  42. 620
    0
      Kohlradio.xcodeproj/project.pbxproj
  43. 7
    0
      Kohlradio.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  44. BIN
      Kohlradio.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate
  45. 22
    0
      Kohlradio.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/WorkspaceSettings.xcsettings
  46. 40
    0
      Kohlradio.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/xcdebugger/Expressions.xcexplist
  47. 5
    0
      Kohlradio.xcodeproj/xcuserdata/david.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  48. 98
    0
      Kohlradio.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/Radio.xcscheme
  49. 27
    0
      Kohlradio.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist
  50. 33
    0
      Radio/AddStationViewController.h
  51. 180
    0
      Radio/AddStationViewController.m
  52. 47
    0
      Radio/AppDelegate.h
  53. 326
    0
      Radio/AppDelegate.m
  54. 22
    0
      Radio/Base.lproj/Localizable.strings
  55. 664
    0
      Radio/Base.lproj/Main.storyboard
  56. 18
    0
      Radio/FavoritesViewController.h
  57. 157
    0
      Radio/FavoritesViewController.m
  58. 26
    0
      Radio/GenreViewController.h
  59. 239
    0
      Radio/GenreViewController.m
  60. 50
    0
      Radio/Images.xcassets/AppIcon.appiconset/Contents.json
  61. BIN
      Radio/Images.xcassets/AppIcon.appiconset/Icon@2x.png
  62. BIN
      Radio/Images.xcassets/AppIcon.appiconset/Icon@3x.png
  63. 35
    0
      Radio/Images.xcassets/Image.imageset/Contents.json
  64. 25
    0
      Radio/Images.xcassets/LaunchImage.launchimage/Contents.json
  65. BIN
      Radio/Images.xcassets/LaunchImage.launchimage/LI.png
  66. BIN
      Radio/Images.xcassets/LaunchImage.launchimage/LaunchImage.png
  67. 21
    0
      Radio/Images.xcassets/Radio.imageset/Contents.json
  68. BIN
      Radio/Images.xcassets/Radio.imageset/Radio.png
  69. 21
    0
      Radio/Images.xcassets/Sleeptimer.imageset/Contents.json
  70. BIN
      Radio/Images.xcassets/Sleeptimer.imageset/Sleep.png
  71. 21
    0
      Radio/Images.xcassets/Star-Empty.imageset/Contents.json
  72. BIN
      Radio/Images.xcassets/Star-Empty.imageset/Star-Empty.png
  73. 21
    0
      Radio/Images.xcassets/Star-Full.imageset/Contents.json
  74. BIN
      Radio/Images.xcassets/Star-Full.imageset/Star-Full.png
  75. BIN
      Radio/Images.xcassets/VolumeControls/Airplay_off.imageset/Airplay_off@2x.png
  76. 21
    0
      Radio/Images.xcassets/VolumeControls/Airplay_off.imageset/Contents.json
  77. BIN
      Radio/Images.xcassets/VolumeControls/Airplay_on.imageset/Airplay_on@2x.png
  78. 21
    0
      Radio/Images.xcassets/VolumeControls/Airplay_on.imageset/Contents.json
  79. 21
    0
      Radio/Images.xcassets/VolumeControls/Pause.imageset/Contents.json
  80. BIN
      Radio/Images.xcassets/VolumeControls/Pause.imageset/Pause@2x.png
  81. 21
    0
      Radio/Images.xcassets/VolumeControls/Play.imageset/Contents.json
  82. BIN
      Radio/Images.xcassets/VolumeControls/Play.imageset/Play@2x.png
  83. 21
    0
      Radio/Images.xcassets/VolumeControls/Thumb.imageset/Contents.json
  84. BIN
      Radio/Images.xcassets/VolumeControls/Thumb.imageset/Thumb.png
  85. 21
    0
      Radio/Images.xcassets/VolumeControls/VolumeHigh.imageset/Contents.json
  86. BIN
      Radio/Images.xcassets/VolumeControls/VolumeHigh.imageset/VolumeHigh.png
  87. 21
    0
      Radio/Images.xcassets/VolumeControls/VolumeLow.imageset/Contents.json
  88. BIN
      Radio/Images.xcassets/VolumeControls/VolumeLow.imageset/VolumeLow.png
  89. 22
    0
      Radio/Images.xcassets/VolumeControls/maxSlider.imageset/Contents.json
  90. BIN
      Radio/Images.xcassets/VolumeControls/maxSlider.imageset/MaxSlider-1.png
  91. BIN
      Radio/Images.xcassets/VolumeControls/maxSlider.imageset/MaxSlider.png
  92. 22
    0
      Radio/Images.xcassets/VolumeControls/minSlider.imageset/Contents.json
  93. BIN
      Radio/Images.xcassets/VolumeControls/minSlider.imageset/MinSlider-1.png
  94. BIN
      Radio/Images.xcassets/VolumeControls/minSlider.imageset/MinSlider.png
  95. 21
    0
      Radio/Images.xcassets/iTunesDE.imageset/Contents.json
  96. BIN
      Radio/Images.xcassets/iTunesDE.imageset/iTunesDE.png
  97. 21
    0
      Radio/Images.xcassets/iTunesEN.imageset/Contents.json
  98. BIN
      Radio/Images.xcassets/iTunesEN.imageset/iTunesEN.png
  99. 46
    0
      Radio/Kohlradio-Info.plist
  100. 0
    0
      Radio/Kohlradio-Prefix.pch

BIN
Images/Airplay_off@2x.png View File


BIN
Images/Airplay_on@2x.png View File


BIN
Images/Icon.png View File


BIN
Images/Icon.sketch View File


BIN
Images/MaxSlider.png View File


BIN
Images/MinSlider.png View File


BIN
Images/Pause@2x.png View File


BIN
Images/Play@2x.png View File


BIN
Images/Radio.png View File


BIN
Images/Sleep.png View File


BIN
Images/Sleep.sketch/Data View File


BIN
Images/Sleep.sketch/QuickLook/Preview.png View File


BIN
Images/Sleep.sketch/QuickLook/Thumbnail.png View File


+ 2
- 0
Images/Sleep.sketch/fonts View File

@@ -0,0 +1,2 @@
1
+HelveticaNeue-Bold
2
+HelveticaNeue-Bold

+ 1
- 0
Images/Sleep.sketch/version View File

@@ -0,0 +1 @@
1
+14

BIN
Images/Star-Empty.png View File


BIN
Images/Star-Full.png View File


BIN
Images/Star.sketch/Data View File


BIN
Images/Star.sketch/QuickLook/Preview.png View File


BIN
Images/Star.sketch/QuickLook/Thumbnail.png View File


+ 0
- 0
Images/Star.sketch/fonts View File


+ 1
- 0
Images/Star.sketch/version View File

@@ -0,0 +1 @@
1
+14

BIN
Images/Thumb.png View File


BIN
Images/Thumb.sketch/Data View File


BIN
Images/Thumb.sketch/QuickLook/Preview.png View File


BIN
Images/Thumb.sketch/QuickLook/Thumbnail.png View File


+ 0
- 0
Images/Thumb.sketch/fonts View File


+ 1
- 0
Images/Thumb.sketch/version View File

@@ -0,0 +1 @@
1
+14

BIN
Images/Volume.sketch/Data View File


BIN
Images/Volume.sketch/QuickLook/Preview.png View File


BIN
Images/Volume.sketch/QuickLook/Thumbnail.png View File


+ 0
- 0
Images/Volume.sketch/fonts View File


+ 1
- 0
Images/Volume.sketch/version View File

@@ -0,0 +1 @@
1
+14

BIN
Images/VolumeHigh.png View File


BIN
Images/VolumeLow.png View File


BIN
Images/airplay.sketch/Data View File


BIN
Images/airplay.sketch/QuickLook/Preview.png View File


BIN
Images/airplay.sketch/QuickLook/Thumbnail.png View File


+ 0
- 0
Images/airplay.sketch/fonts View File


+ 1
- 0
Images/airplay.sketch/version View File

@@ -0,0 +1 @@
1
+14

BIN
Images/iTunesArtwork.png View File


+ 620
- 0
Kohlradio.xcodeproj/project.pbxproj View File

@@ -0,0 +1,620 @@
1
+// !$*UTF8*$!
2
+{
3
+	archiveVersion = 1;
4
+	classes = {
5
+	};
6
+	objectVersion = 46;
7
+	objects = {
8
+
9
+/* Begin PBXBuildFile section */
10
+		6303BD5917F8B69A0020A21C /* AddStationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6303BD5817F8B69A0020A21C /* AddStationViewController.m */; };
11
+		630DF0421804803900B0F077 /* RadioDB.m in Sources */ = {isa = PBXBuildFile; fileRef = 630DF0411804803900B0F077 /* RadioDB.m */; };
12
+		630DF0441804816C00B0F077 /* Radio.sqlite in Resources */ = {isa = PBXBuildFile; fileRef = 630DF0431804816C00B0F077 /* Radio.sqlite */; };
13
+		630DF047180482C700B0F077 /* GenreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 630DF046180482C700B0F077 /* GenreViewController.m */; };
14
+		630DF04918048B8800B0F077 /* libsqlite3.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 630DF04818048B8800B0F077 /* libsqlite3.0.dylib */; };
15
+		63115B3217F7471500876899 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63115B3117F7471500876899 /* Foundation.framework */; };
16
+		63115B3417F7471500876899 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63115B3317F7471500876899 /* CoreGraphics.framework */; };
17
+		63115B3617F7471500876899 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63115B3517F7471500876899 /* UIKit.framework */; };
18
+		63115B3C17F7471500876899 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63115B3A17F7471500876899 /* InfoPlist.strings */; };
19
+		63115B3E17F7471500876899 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 63115B3D17F7471500876899 /* main.m */; };
20
+		63115B4217F7471500876899 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 63115B4117F7471500876899 /* AppDelegate.m */; };
21
+		63115B4517F7471500876899 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 63115B4317F7471500876899 /* Main.storyboard */; };
22
+		63115B4A17F7471500876899 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 63115B4917F7471500876899 /* Images.xcassets */; };
23
+		63115B5217F7471500876899 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63115B3117F7471500876899 /* Foundation.framework */; };
24
+		63115B5317F7471500876899 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63115B3517F7471500876899 /* UIKit.framework */; };
25
+		63115B6717F7474800876899 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63115B6617F7474800876899 /* AVFoundation.framework */; };
26
+		63379BC51AA21ECC0009619D /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63379BC41AA21ECC0009619D /* Launch Screen.xib */; };
27
+		63454A9717F773D0001F9C0D /* RadioNormal.png in Resources */ = {isa = PBXBuildFile; fileRef = 63454A9617F773D0001F9C0D /* RadioNormal.png */; };
28
+		63454A9A17F77535001F9C0D /* FavoritesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 63454A9917F77535001F9C0D /* FavoritesViewController.m */; };
29
+		63454A9D17F77BD4001F9C0D /* StationsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 63454A9C17F77BD4001F9C0D /* StationsViewController.m */; };
30
+		63454A9F17F77E64001F9C0D /* iAd.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63454A9E17F77E64001F9C0D /* iAd.framework */; };
31
+		63454AA417F780C1001F9C0D /* RadioViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 63454AA317F780C1001F9C0D /* RadioViewController.m */; };
32
+		63454AA617F78652001F9C0D /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63454AA517F78652001F9C0D /* MediaPlayer.framework */; };
33
+		6345BFEC1807198400B2FC0C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6345BFE91807198400B2FC0C /* InfoPlist.strings */; };
34
+		6345BFF118073A8E00B2FC0C /* RadioCold.png in Resources */ = {isa = PBXBuildFile; fileRef = 6345BFEE18073A8E00B2FC0C /* RadioCold.png */; };
35
+		6345BFF218073A8E00B2FC0C /* RadioReggae.png in Resources */ = {isa = PBXBuildFile; fileRef = 6345BFEF18073A8E00B2FC0C /* RadioReggae.png */; };
36
+		6345BFF318073A8E00B2FC0C /* RadioRB.png in Resources */ = {isa = PBXBuildFile; fileRef = 6345BFF018073A8E00B2FC0C /* RadioRB.png */; };
37
+		634BE3181805BC0A00C7D43B /* SelectImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 634BE3171805BC0A00C7D43B /* SelectImageViewController.m */; };
38
+		634BE31F1805BDDA00C7D43B /* RadioOrange.png in Resources */ = {isa = PBXBuildFile; fileRef = 634BE3191805BDDA00C7D43B /* RadioOrange.png */; };
39
+		634BE3201805BDDA00C7D43B /* RadioPink.png in Resources */ = {isa = PBXBuildFile; fileRef = 634BE31A1805BDDA00C7D43B /* RadioPink.png */; };
40
+		634BE3211805BDDA00C7D43B /* RadioGreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 634BE31B1805BDDA00C7D43B /* RadioGreen.png */; };
41
+		634BE3221805BDDA00C7D43B /* RadioLila.png in Resources */ = {isa = PBXBuildFile; fileRef = 634BE31C1805BDDA00C7D43B /* RadioLila.png */; };
42
+		634BE3231805BDDA00C7D43B /* RadioT.png in Resources */ = {isa = PBXBuildFile; fileRef = 634BE31D1805BDDA00C7D43B /* RadioT.png */; };
43
+		634BE3241805BDDA00C7D43B /* RadioBlue.png in Resources */ = {isa = PBXBuildFile; fileRef = 634BE31E1805BDDA00C7D43B /* RadioBlue.png */; };
44
+		638A82251AF1541500B702B9 /* iTunesArtwork.png in Resources */ = {isa = PBXBuildFile; fileRef = 638A82241AF1541500B702B9 /* iTunesArtwork.png */; };
45
+		63F2094717F850E800EDF82A /* RadioProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F2094617F850E800EDF82A /* RadioProperties.m */; };
46
+		63F433C2181541540099A675 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 63F433C4181541540099A675 /* Localizable.strings */; };
47
+/* End PBXBuildFile section */
48
+
49
+/* Begin PBXContainerItemProxy section */
50
+		63115B5417F7471500876899 /* PBXContainerItemProxy */ = {
51
+			isa = PBXContainerItemProxy;
52
+			containerPortal = 63115B2617F7471400876899 /* Project object */;
53
+			proxyType = 1;
54
+			remoteGlobalIDString = 63115B2D17F7471400876899;
55
+			remoteInfo = Radio;
56
+		};
57
+/* End PBXContainerItemProxy section */
58
+
59
+/* Begin PBXFileReference section */
60
+		6303BD5717F8B69A0020A21C /* AddStationViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddStationViewController.h; sourceTree = "<group>"; };
61
+		6303BD5817F8B69A0020A21C /* AddStationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddStationViewController.m; sourceTree = "<group>"; };
62
+		630DF0401804803900B0F077 /* RadioDB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RadioDB.h; sourceTree = "<group>"; };
63
+		630DF0411804803900B0F077 /* RadioDB.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RadioDB.m; sourceTree = "<group>"; };
64
+		630DF0431804816C00B0F077 /* Radio.sqlite */ = {isa = PBXFileReference; lastKnownFileType = file; path = Radio.sqlite; sourceTree = "<group>"; };
65
+		630DF045180482C700B0F077 /* GenreViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenreViewController.h; sourceTree = "<group>"; };
66
+		630DF046180482C700B0F077 /* GenreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GenreViewController.m; sourceTree = "<group>"; };
67
+		630DF04818048B8800B0F077 /* libsqlite3.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.0.dylib; path = usr/lib/libsqlite3.0.dylib; sourceTree = SDKROOT; };
68
+		63115B2E17F7471400876899 /* Kohlradio.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Kohlradio.app; sourceTree = BUILT_PRODUCTS_DIR; };
69
+		63115B3117F7471500876899 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
70
+		63115B3317F7471500876899 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
71
+		63115B3517F7471500876899 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
72
+		63115B3917F7471500876899 /* Kohlradio-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Kohlradio-Info.plist"; sourceTree = "<group>"; };
73
+		63115B3B17F7471500876899 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
74
+		63115B3D17F7471500876899 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
75
+		63115B3F17F7471500876899 /* Kohlradio-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Kohlradio-Prefix.pch"; sourceTree = "<group>"; };
76
+		63115B4017F7471500876899 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
77
+		63115B4117F7471500876899 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
78
+		63115B4417F7471500876899 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
79
+		63115B4917F7471500876899 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
80
+		63115B4F17F7471500876899 /* KohlradioTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KohlradioTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
81
+		63115B6617F7474800876899 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
82
+		63379BC41AA21ECC0009619D /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = "<group>"; };
83
+		63454A9617F773D0001F9C0D /* RadioNormal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioNormal.png; sourceTree = "<group>"; };
84
+		63454A9817F77535001F9C0D /* FavoritesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FavoritesViewController.h; sourceTree = "<group>"; };
85
+		63454A9917F77535001F9C0D /* FavoritesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FavoritesViewController.m; sourceTree = "<group>"; };
86
+		63454A9B17F77BD4001F9C0D /* StationsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StationsViewController.h; sourceTree = "<group>"; };
87
+		63454A9C17F77BD4001F9C0D /* StationsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StationsViewController.m; sourceTree = "<group>"; };
88
+		63454A9E17F77E64001F9C0D /* iAd.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iAd.framework; path = System/Library/Frameworks/iAd.framework; sourceTree = SDKROOT; };
89
+		63454AA217F780C1001F9C0D /* RadioViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RadioViewController.h; sourceTree = "<group>"; };
90
+		63454AA317F780C1001F9C0D /* RadioViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RadioViewController.m; sourceTree = "<group>"; };
91
+		63454AA517F78652001F9C0D /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };
92
+		6345BFEA1807198400B2FC0C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
93
+		6345BFEB1807198400B2FC0C /* KohlradioTests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "KohlradioTests-Info.plist"; sourceTree = "<group>"; };
94
+		6345BFEE18073A8E00B2FC0C /* RadioCold.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioCold.png; sourceTree = "<group>"; };
95
+		6345BFEF18073A8E00B2FC0C /* RadioReggae.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioReggae.png; sourceTree = "<group>"; };
96
+		6345BFF018073A8E00B2FC0C /* RadioRB.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioRB.png; sourceTree = "<group>"; };
97
+		634BE3161805BC0A00C7D43B /* SelectImageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectImageViewController.h; sourceTree = "<group>"; };
98
+		634BE3171805BC0A00C7D43B /* SelectImageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SelectImageViewController.m; sourceTree = "<group>"; };
99
+		634BE3191805BDDA00C7D43B /* RadioOrange.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioOrange.png; sourceTree = "<group>"; };
100
+		634BE31A1805BDDA00C7D43B /* RadioPink.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioPink.png; sourceTree = "<group>"; };
101
+		634BE31B1805BDDA00C7D43B /* RadioGreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioGreen.png; sourceTree = "<group>"; };
102
+		634BE31C1805BDDA00C7D43B /* RadioLila.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioLila.png; sourceTree = "<group>"; };
103
+		634BE31D1805BDDA00C7D43B /* RadioT.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioT.png; sourceTree = "<group>"; };
104
+		634BE31E1805BDDA00C7D43B /* RadioBlue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RadioBlue.png; sourceTree = "<group>"; };
105
+		638A82241AF1541500B702B9 /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iTunesArtwork.png; sourceTree = "<group>"; };
106
+		63F2094517F850E800EDF82A /* RadioProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RadioProperties.h; sourceTree = "<group>"; };
107
+		63F2094617F850E800EDF82A /* RadioProperties.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RadioProperties.m; sourceTree = "<group>"; };
108
+		63F433BD18153F550099A675 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = "<group>"; };
109
+		63F433BE18153F550099A675 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
110
+		63F433BF18153F550099A675 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
111
+		63F433C3181541540099A675 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
112
+		63F433C5181541570099A675 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
113
+/* End PBXFileReference section */
114
+
115
+/* Begin PBXFrameworksBuildPhase section */
116
+		63115B2B17F7471400876899 /* Frameworks */ = {
117
+			isa = PBXFrameworksBuildPhase;
118
+			buildActionMask = 2147483647;
119
+			files = (
120
+				630DF04918048B8800B0F077 /* libsqlite3.0.dylib in Frameworks */,
121
+				63454AA617F78652001F9C0D /* MediaPlayer.framework in Frameworks */,
122
+				63454A9F17F77E64001F9C0D /* iAd.framework in Frameworks */,
123
+				63115B6717F7474800876899 /* AVFoundation.framework in Frameworks */,
124
+				63115B3417F7471500876899 /* CoreGraphics.framework in Frameworks */,
125
+				63115B3617F7471500876899 /* UIKit.framework in Frameworks */,
126
+				63115B3217F7471500876899 /* Foundation.framework in Frameworks */,
127
+			);
128
+			runOnlyForDeploymentPostprocessing = 0;
129
+		};
130
+		63115B4C17F7471500876899 /* Frameworks */ = {
131
+			isa = PBXFrameworksBuildPhase;
132
+			buildActionMask = 2147483647;
133
+			files = (
134
+				63115B5317F7471500876899 /* UIKit.framework in Frameworks */,
135
+				63115B5217F7471500876899 /* Foundation.framework in Frameworks */,
136
+			);
137
+			runOnlyForDeploymentPostprocessing = 0;
138
+		};
139
+/* End PBXFrameworksBuildPhase section */
140
+
141
+/* Begin PBXGroup section */
142
+		6303BD6117F8D5C70020A21C /* Radio */ = {
143
+			isa = PBXGroup;
144
+			children = (
145
+				630DF0431804816C00B0F077 /* Radio.sqlite */,
146
+				63F2094517F850E800EDF82A /* RadioProperties.h */,
147
+				63F2094617F850E800EDF82A /* RadioProperties.m */,
148
+				630DF0401804803900B0F077 /* RadioDB.h */,
149
+				630DF0411804803900B0F077 /* RadioDB.m */,
150
+			);
151
+			name = Radio;
152
+			sourceTree = "<group>";
153
+		};
154
+		63115B2517F7471400876899 = {
155
+			isa = PBXGroup;
156
+			children = (
157
+				63115B3717F7471500876899 /* Radio */,
158
+				63115B3017F7471400876899 /* Frameworks */,
159
+				6345BFE81807198400B2FC0C /* RadioTests */,
160
+				63115B2F17F7471400876899 /* Products */,
161
+			);
162
+			sourceTree = "<group>";
163
+		};
164
+		63115B2F17F7471400876899 /* Products */ = {
165
+			isa = PBXGroup;
166
+			children = (
167
+				63115B2E17F7471400876899 /* Kohlradio.app */,
168
+				63115B4F17F7471500876899 /* KohlradioTests.xctest */,
169
+			);
170
+			name = Products;
171
+			sourceTree = "<group>";
172
+		};
173
+		63115B3017F7471400876899 /* Frameworks */ = {
174
+			isa = PBXGroup;
175
+			children = (
176
+				630DF04818048B8800B0F077 /* libsqlite3.0.dylib */,
177
+				63454AA517F78652001F9C0D /* MediaPlayer.framework */,
178
+				63454A9E17F77E64001F9C0D /* iAd.framework */,
179
+				63115B6617F7474800876899 /* AVFoundation.framework */,
180
+				63115B3117F7471500876899 /* Foundation.framework */,
181
+				63115B3317F7471500876899 /* CoreGraphics.framework */,
182
+				63115B3517F7471500876899 /* UIKit.framework */,
183
+			);
184
+			name = Frameworks;
185
+			sourceTree = "<group>";
186
+		};
187
+		63115B3717F7471500876899 /* Radio */ = {
188
+			isa = PBXGroup;
189
+			children = (
190
+				6303BD6117F8D5C70020A21C /* Radio */,
191
+				634BE3251805BDDE00C7D43B /* Images */,
192
+				63115B4017F7471500876899 /* AppDelegate.h */,
193
+				63115B4117F7471500876899 /* AppDelegate.m */,
194
+				63115B4317F7471500876899 /* Main.storyboard */,
195
+				63379BC41AA21ECC0009619D /* Launch Screen.xib */,
196
+				63454A9817F77535001F9C0D /* FavoritesViewController.h */,
197
+				63454A9917F77535001F9C0D /* FavoritesViewController.m */,
198
+				63454A9B17F77BD4001F9C0D /* StationsViewController.h */,
199
+				63454A9C17F77BD4001F9C0D /* StationsViewController.m */,
200
+				630DF045180482C700B0F077 /* GenreViewController.h */,
201
+				630DF046180482C700B0F077 /* GenreViewController.m */,
202
+				63454AA217F780C1001F9C0D /* RadioViewController.h */,
203
+				63454AA317F780C1001F9C0D /* RadioViewController.m */,
204
+				6303BD5717F8B69A0020A21C /* AddStationViewController.h */,
205
+				6303BD5817F8B69A0020A21C /* AddStationViewController.m */,
206
+				634BE3161805BC0A00C7D43B /* SelectImageViewController.h */,
207
+				634BE3171805BC0A00C7D43B /* SelectImageViewController.m */,
208
+				63115B3817F7471500876899 /* Supporting Files */,
209
+			);
210
+			path = Radio;
211
+			sourceTree = "<group>";
212
+		};
213
+		63115B3817F7471500876899 /* Supporting Files */ = {
214
+			isa = PBXGroup;
215
+			children = (
216
+				63115B3917F7471500876899 /* Kohlradio-Info.plist */,
217
+				63F433C4181541540099A675 /* Localizable.strings */,
218
+				63115B3A17F7471500876899 /* InfoPlist.strings */,
219
+				63115B3D17F7471500876899 /* main.m */,
220
+				63115B3F17F7471500876899 /* Kohlradio-Prefix.pch */,
221
+			);
222
+			name = "Supporting Files";
223
+			sourceTree = "<group>";
224
+		};
225
+		6345BFE81807198400B2FC0C /* RadioTests */ = {
226
+			isa = PBXGroup;
227
+			children = (
228
+				6345BFE91807198400B2FC0C /* InfoPlist.strings */,
229
+				6345BFEB1807198400B2FC0C /* KohlradioTests-Info.plist */,
230
+			);
231
+			path = RadioTests;
232
+			sourceTree = "<group>";
233
+		};
234
+		634BE3251805BDDE00C7D43B /* Images */ = {
235
+			isa = PBXGroup;
236
+			children = (
237
+				63115B4917F7471500876899 /* Images.xcassets */,
238
+				638A82241AF1541500B702B9 /* iTunesArtwork.png */,
239
+				63454A9617F773D0001F9C0D /* RadioNormal.png */,
240
+				634BE3191805BDDA00C7D43B /* RadioOrange.png */,
241
+				634BE31A1805BDDA00C7D43B /* RadioPink.png */,
242
+				634BE31B1805BDDA00C7D43B /* RadioGreen.png */,
243
+				634BE31C1805BDDA00C7D43B /* RadioLila.png */,
244
+				634BE31D1805BDDA00C7D43B /* RadioT.png */,
245
+				634BE31E1805BDDA00C7D43B /* RadioBlue.png */,
246
+				6345BFEE18073A8E00B2FC0C /* RadioCold.png */,
247
+				6345BFEF18073A8E00B2FC0C /* RadioReggae.png */,
248
+				6345BFF018073A8E00B2FC0C /* RadioRB.png */,
249
+			);
250
+			name = Images;
251
+			sourceTree = "<group>";
252
+		};
253
+/* End PBXGroup section */
254
+
255
+/* Begin PBXNativeTarget section */
256
+		63115B2D17F7471400876899 /* Kohlradio */ = {
257
+			isa = PBXNativeTarget;
258
+			buildConfigurationList = 63115B6017F7471500876899 /* Build configuration list for PBXNativeTarget "Kohlradio" */;
259
+			buildPhases = (
260
+				63115B2A17F7471400876899 /* Sources */,
261
+				63115B2B17F7471400876899 /* Frameworks */,
262
+				63115B2C17F7471400876899 /* Resources */,
263
+			);
264
+			buildRules = (
265
+			);
266
+			dependencies = (
267
+			);
268
+			name = Kohlradio;
269
+			productName = Radio;
270
+			productReference = 63115B2E17F7471400876899 /* Kohlradio.app */;
271
+			productType = "com.apple.product-type.application";
272
+		};
273
+		63115B4E17F7471500876899 /* KohlradioTests */ = {
274
+			isa = PBXNativeTarget;
275
+			buildConfigurationList = 63115B6317F7471500876899 /* Build configuration list for PBXNativeTarget "KohlradioTests" */;
276
+			buildPhases = (
277
+				63115B4B17F7471500876899 /* Sources */,
278
+				63115B4C17F7471500876899 /* Frameworks */,
279
+				63115B4D17F7471500876899 /* Resources */,
280
+			);
281
+			buildRules = (
282
+			);
283
+			dependencies = (
284
+				63115B5517F7471500876899 /* PBXTargetDependency */,
285
+			);
286
+			name = KohlradioTests;
287
+			productName = RadioTests;
288
+			productReference = 63115B4F17F7471500876899 /* KohlradioTests.xctest */;
289
+			productType = "com.apple.product-type.bundle.unit-test";
290
+		};
291
+/* End PBXNativeTarget section */
292
+
293
+/* Begin PBXProject section */
294
+		63115B2617F7471400876899 /* Project object */ = {
295
+			isa = PBXProject;
296
+			attributes = {
297
+				LastUpgradeCheck = 0610;
298
+				ORGANIZATIONNAME = "David Walter";
299
+				TargetAttributes = {
300
+					63115B2D17F7471400876899 = {
301
+						DevelopmentTeam = 7MLF4U25UX;
302
+						SystemCapabilities = {
303
+							com.apple.BackgroundModes = {
304
+								enabled = 1;
305
+							};
306
+						};
307
+					};
308
+					63115B4E17F7471500876899 = {
309
+						TestTargetID = 63115B2D17F7471400876899;
310
+					};
311
+				};
312
+			};
313
+			buildConfigurationList = 63115B2917F7471400876899 /* Build configuration list for PBXProject "Kohlradio" */;
314
+			compatibilityVersion = "Xcode 3.2";
315
+			developmentRegion = English;
316
+			hasScannedForEncodings = 0;
317
+			knownRegions = (
318
+				en,
319
+				Base,
320
+				de,
321
+			);
322
+			mainGroup = 63115B2517F7471400876899;
323
+			productRefGroup = 63115B2F17F7471400876899 /* Products */;
324
+			projectDirPath = "";
325
+			projectRoot = "";
326
+			targets = (
327
+				63115B2D17F7471400876899 /* Kohlradio */,
328
+				63115B4E17F7471500876899 /* KohlradioTests */,
329
+			);
330
+		};
331
+/* End PBXProject section */
332
+
333
+/* Begin PBXResourcesBuildPhase section */
334
+		63115B2C17F7471400876899 /* Resources */ = {
335
+			isa = PBXResourcesBuildPhase;
336
+			buildActionMask = 2147483647;
337
+			files = (
338
+				634BE3241805BDDA00C7D43B /* RadioBlue.png in Resources */,
339
+				638A82251AF1541500B702B9 /* iTunesArtwork.png in Resources */,
340
+				6345BFF318073A8E00B2FC0C /* RadioRB.png in Resources */,
341
+				63115B4A17F7471500876899 /* Images.xcassets in Resources */,
342
+				634BE3211805BDDA00C7D43B /* RadioGreen.png in Resources */,
343
+				6345BFF218073A8E00B2FC0C /* RadioReggae.png in Resources */,
344
+				634BE31F1805BDDA00C7D43B /* RadioOrange.png in Resources */,
345
+				634BE3221805BDDA00C7D43B /* RadioLila.png in Resources */,
346
+				6345BFF118073A8E00B2FC0C /* RadioCold.png in Resources */,
347
+				634BE3231805BDDA00C7D43B /* RadioT.png in Resources */,
348
+				63115B3C17F7471500876899 /* InfoPlist.strings in Resources */,
349
+				63F433C2181541540099A675 /* Localizable.strings in Resources */,
350
+				63115B4517F7471500876899 /* Main.storyboard in Resources */,
351
+				630DF0441804816C00B0F077 /* Radio.sqlite in Resources */,
352
+				63379BC51AA21ECC0009619D /* Launch Screen.xib in Resources */,
353
+				63454A9717F773D0001F9C0D /* RadioNormal.png in Resources */,
354
+				634BE3201805BDDA00C7D43B /* RadioPink.png in Resources */,
355
+			);
356
+			runOnlyForDeploymentPostprocessing = 0;
357
+		};
358
+		63115B4D17F7471500876899 /* Resources */ = {
359
+			isa = PBXResourcesBuildPhase;
360
+			buildActionMask = 2147483647;
361
+			files = (
362
+				6345BFEC1807198400B2FC0C /* InfoPlist.strings in Resources */,
363
+			);
364
+			runOnlyForDeploymentPostprocessing = 0;
365
+		};
366
+/* End PBXResourcesBuildPhase section */
367
+
368
+/* Begin PBXSourcesBuildPhase section */
369
+		63115B2A17F7471400876899 /* Sources */ = {
370
+			isa = PBXSourcesBuildPhase;
371
+			buildActionMask = 2147483647;
372
+			files = (
373
+				63115B4217F7471500876899 /* AppDelegate.m in Sources */,
374
+				630DF0421804803900B0F077 /* RadioDB.m in Sources */,
375
+				634BE3181805BC0A00C7D43B /* SelectImageViewController.m in Sources */,
376
+				63454A9A17F77535001F9C0D /* FavoritesViewController.m in Sources */,
377
+				63F2094717F850E800EDF82A /* RadioProperties.m in Sources */,
378
+				630DF047180482C700B0F077 /* GenreViewController.m in Sources */,
379
+				63115B3E17F7471500876899 /* main.m in Sources */,
380
+				63454AA417F780C1001F9C0D /* RadioViewController.m in Sources */,
381
+				6303BD5917F8B69A0020A21C /* AddStationViewController.m in Sources */,
382
+				63454A9D17F77BD4001F9C0D /* StationsViewController.m in Sources */,
383
+			);
384
+			runOnlyForDeploymentPostprocessing = 0;
385
+		};
386
+		63115B4B17F7471500876899 /* Sources */ = {
387
+			isa = PBXSourcesBuildPhase;
388
+			buildActionMask = 2147483647;
389
+			files = (
390
+			);
391
+			runOnlyForDeploymentPostprocessing = 0;
392
+		};
393
+/* End PBXSourcesBuildPhase section */
394
+
395
+/* Begin PBXTargetDependency section */
396
+		63115B5517F7471500876899 /* PBXTargetDependency */ = {
397
+			isa = PBXTargetDependency;
398
+			target = 63115B2D17F7471400876899 /* Kohlradio */;
399
+			targetProxy = 63115B5417F7471500876899 /* PBXContainerItemProxy */;
400
+		};
401
+/* End PBXTargetDependency section */
402
+
403
+/* Begin PBXVariantGroup section */
404
+		63115B3A17F7471500876899 /* InfoPlist.strings */ = {
405
+			isa = PBXVariantGroup;
406
+			children = (
407
+				63115B3B17F7471500876899 /* en */,
408
+				63F433BE18153F550099A675 /* de */,
409
+			);
410
+			name = InfoPlist.strings;
411
+			sourceTree = "<group>";
412
+		};
413
+		63115B4317F7471500876899 /* Main.storyboard */ = {
414
+			isa = PBXVariantGroup;
415
+			children = (
416
+				63115B4417F7471500876899 /* Base */,
417
+				63F433BD18153F550099A675 /* de */,
418
+			);
419
+			name = Main.storyboard;
420
+			sourceTree = "<group>";
421
+		};
422
+		6345BFE91807198400B2FC0C /* InfoPlist.strings */ = {
423
+			isa = PBXVariantGroup;
424
+			children = (
425
+				6345BFEA1807198400B2FC0C /* en */,
426
+				63F433BF18153F550099A675 /* de */,
427
+			);
428
+			name = InfoPlist.strings;
429
+			sourceTree = "<group>";
430
+		};
431
+		63F433C4181541540099A675 /* Localizable.strings */ = {
432
+			isa = PBXVariantGroup;
433
+			children = (
434
+				63F433C3181541540099A675 /* Base */,
435
+				63F433C5181541570099A675 /* de */,
436
+			);
437
+			name = Localizable.strings;
438
+			sourceTree = "<group>";
439
+		};
440
+/* End PBXVariantGroup section */
441
+
442
+/* Begin XCBuildConfiguration section */
443
+		63115B5E17F7471500876899 /* Debug */ = {
444
+			isa = XCBuildConfiguration;
445
+			buildSettings = {
446
+				ALWAYS_SEARCH_USER_PATHS = NO;
447
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
448
+				CLANG_CXX_LIBRARY = "libc++";
449
+				CLANG_ENABLE_MODULES = YES;
450
+				CLANG_ENABLE_OBJC_ARC = YES;
451
+				CLANG_WARN_BOOL_CONVERSION = YES;
452
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
453
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
454
+				CLANG_WARN_EMPTY_BODY = YES;
455
+				CLANG_WARN_ENUM_CONVERSION = YES;
456
+				CLANG_WARN_INT_CONVERSION = YES;
457
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
458
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
459
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
460
+				COPY_PHASE_STRIP = NO;
461
+				GCC_C_LANGUAGE_STANDARD = gnu99;
462
+				GCC_DYNAMIC_NO_PIC = NO;
463
+				GCC_OPTIMIZATION_LEVEL = 0;
464
+				GCC_PREPROCESSOR_DEFINITIONS = (
465
+					"DEBUG=1",
466
+					"$(inherited)",
467
+				);
468
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
469
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
470
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
471
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
472
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
473
+				GCC_WARN_UNUSED_FUNCTION = YES;
474
+				GCC_WARN_UNUSED_VARIABLE = YES;
475
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
476
+				ONLY_ACTIVE_ARCH = YES;
477
+				SDKROOT = iphoneos;
478
+			};
479
+			name = Debug;
480
+		};
481
+		63115B5F17F7471500876899 /* Release */ = {
482
+			isa = XCBuildConfiguration;
483
+			buildSettings = {
484
+				ALWAYS_SEARCH_USER_PATHS = NO;
485
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
486
+				CLANG_CXX_LIBRARY = "libc++";
487
+				CLANG_ENABLE_MODULES = YES;
488
+				CLANG_ENABLE_OBJC_ARC = YES;
489
+				CLANG_WARN_BOOL_CONVERSION = YES;
490
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
491
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
492
+				CLANG_WARN_EMPTY_BODY = YES;
493
+				CLANG_WARN_ENUM_CONVERSION = YES;
494
+				CLANG_WARN_INT_CONVERSION = YES;
495
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
496
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
497
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
498
+				COPY_PHASE_STRIP = YES;
499
+				ENABLE_NS_ASSERTIONS = NO;
500
+				GCC_C_LANGUAGE_STANDARD = gnu99;
501
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
502
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
503
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
504
+				GCC_WARN_UNINITIALIZED_AUTOS = YES;
505
+				GCC_WARN_UNUSED_FUNCTION = YES;
506
+				GCC_WARN_UNUSED_VARIABLE = YES;
507
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
508
+				SDKROOT = iphoneos;
509
+				VALIDATE_PRODUCT = YES;
510
+			};
511
+			name = Release;
512
+		};
513
+		63115B6117F7471500876899 /* Debug */ = {
514
+			isa = XCBuildConfiguration;
515
+			buildSettings = {
516
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
517
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
518
+				CODE_SIGN_IDENTITY = "iPhone Developer";
519
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
520
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
521
+				GCC_PREFIX_HEADER = "Radio/Kohlradio-Prefix.pch";
522
+				INFOPLIST_FILE = "Radio/Kohlradio-Info.plist";
523
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
524
+				PRODUCT_NAME = Kohlradio;
525
+				PROVISIONING_PROFILE = "";
526
+				WRAPPER_EXTENSION = app;
527
+			};
528
+			name = Debug;
529
+		};
530
+		63115B6217F7471500876899 /* Release */ = {
531
+			isa = XCBuildConfiguration;
532
+			buildSettings = {
533
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
534
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
535
+				CODE_SIGN_IDENTITY = "iPhone Developer";
536
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
537
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
538
+				GCC_PREFIX_HEADER = "Radio/Kohlradio-Prefix.pch";
539
+				INFOPLIST_FILE = "Radio/Kohlradio-Info.plist";
540
+				IPHONEOS_DEPLOYMENT_TARGET = 7.0;
541
+				PRODUCT_NAME = Kohlradio;
542
+				PROVISIONING_PROFILE = "";
543
+				WRAPPER_EXTENSION = app;
544
+			};
545
+			name = Release;
546
+		};
547
+		63115B6417F7471500876899 /* Debug */ = {
548
+			isa = XCBuildConfiguration;
549
+			buildSettings = {
550
+				BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Radio.app/Radio";
551
+				FRAMEWORK_SEARCH_PATHS = (
552
+					"$(SDKROOT)/Developer/Library/Frameworks",
553
+					"$(inherited)",
554
+					"$(DEVELOPER_FRAMEWORKS_DIR)",
555
+				);
556
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
557
+				GCC_PREFIX_HEADER = "Radio/Radio-Prefix.pch";
558
+				GCC_PREPROCESSOR_DEFINITIONS = (
559
+					"DEBUG=1",
560
+					"$(inherited)",
561
+				);
562
+				INFOPLIST_FILE = "RadioTests/KohlradioTests-Info.plist";
563
+				PRODUCT_NAME = KohlradioTests;
564
+				TEST_HOST = "$(BUNDLE_LOADER)";
565
+				WRAPPER_EXTENSION = xctest;
566
+			};
567
+			name = Debug;
568
+		};
569
+		63115B6517F7471500876899 /* Release */ = {
570
+			isa = XCBuildConfiguration;
571
+			buildSettings = {
572
+				BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Radio.app/Radio";
573
+				FRAMEWORK_SEARCH_PATHS = (
574
+					"$(SDKROOT)/Developer/Library/Frameworks",
575
+					"$(inherited)",
576
+					"$(DEVELOPER_FRAMEWORKS_DIR)",
577
+				);
578
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
579
+				GCC_PREFIX_HEADER = "Radio/Radio-Prefix.pch";
580
+				INFOPLIST_FILE = "RadioTests/KohlradioTests-Info.plist";
581
+				PRODUCT_NAME = KohlradioTests;
582
+				TEST_HOST = "$(BUNDLE_LOADER)";
583
+				WRAPPER_EXTENSION = xctest;
584
+			};
585
+			name = Release;
586
+		};
587
+/* End XCBuildConfiguration section */
588
+
589
+/* Begin XCConfigurationList section */
590
+		63115B2917F7471400876899 /* Build configuration list for PBXProject "Kohlradio" */ = {
591
+			isa = XCConfigurationList;
592
+			buildConfigurations = (
593
+				63115B5E17F7471500876899 /* Debug */,
594
+				63115B5F17F7471500876899 /* Release */,
595
+			);
596
+			defaultConfigurationIsVisible = 0;
597
+			defaultConfigurationName = Release;
598
+		};
599
+		63115B6017F7471500876899 /* Build configuration list for PBXNativeTarget "Kohlradio" */ = {
600
+			isa = XCConfigurationList;
601
+			buildConfigurations = (
602
+				63115B6117F7471500876899 /* Debug */,
603
+				63115B6217F7471500876899 /* Release */,
604
+			);
605
+			defaultConfigurationIsVisible = 0;
606
+			defaultConfigurationName = Release;
607
+		};
608
+		63115B6317F7471500876899 /* Build configuration list for PBXNativeTarget "KohlradioTests" */ = {
609
+			isa = XCConfigurationList;
610
+			buildConfigurations = (
611
+				63115B6417F7471500876899 /* Debug */,
612
+				63115B6517F7471500876899 /* Release */,
613
+			);
614
+			defaultConfigurationIsVisible = 0;
615
+			defaultConfigurationName = Release;
616
+		};
617
+/* End XCConfigurationList section */
618
+	};
619
+	rootObject = 63115B2617F7471400876899 /* Project object */;
620
+}

+ 7
- 0
Kohlradio.xcodeproj/project.xcworkspace/contents.xcworkspacedata View File

@@ -0,0 +1,7 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "self:Kohlradio.xcodeproj">
6
+   </FileRef>
7
+</Workspace>

BIN
Kohlradio.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate View File


+ 22
- 0
Kohlradio.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/WorkspaceSettings.xcsettings View File

@@ -0,0 +1,22 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>BuildLocationStyle</key>
6
+	<string>UseAppPreferences</string>
7
+	<key>CustomBuildLocationType</key>
8
+	<string>RelativeToDerivedData</string>
9
+	<key>DerivedDataLocationStyle</key>
10
+	<string>Default</string>
11
+	<key>HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>
12
+	<true/>
13
+	<key>IssueFilterStyle</key>
14
+	<string>ShowActiveSchemeOnly</string>
15
+	<key>LiveSourceIssuesEnabled</key>
16
+	<true/>
17
+	<key>SnapshotAutomaticallyBeforeSignificantChanges</key>
18
+	<false/>
19
+	<key>SnapshotLocationStyle</key>
20
+	<string>Default</string>
21
+</dict>
22
+</plist>

+ 40
- 0
Kohlradio.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/xcdebugger/Expressions.xcexplist View File

@@ -0,0 +1,40 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<VariablesViewState
3
+   version = "1.0">
4
+   <ContextStates>
5
+      <ContextState
6
+         contextName = "-[AppDelegate setRadioDelegate:]:AppDelegate.m">
7
+      </ContextState>
8
+      <ContextState
9
+         contextName = "-[AppDelegate checkForMetadataOfPlayerItem:]:AppDelegate.m">
10
+         <PersistentStrings>
11
+            <PersistentString
12
+               value = "metadata.stringValue">
13
+            </PersistentString>
14
+         </PersistentStrings>
15
+      </ContextState>
16
+      <ContextState
17
+         contextName = "-[AppDelegate switchToStation:]:AppDelegate.m">
18
+      </ContextState>
19
+      <ContextState
20
+         contextName = "-[SelectImageViewController longPress:]:SelectImageViewController.m">
21
+      </ContextState>
22
+      <ContextState
23
+         contextName = "-[GenreViewController tableView:didSelectRowAtIndexPath:]:GenreViewController.m">
24
+      </ContextState>
25
+      <ContextState
26
+         contextName = "-[SelectImageViewController imagePickerController:didFinishPickingMediaWithInfo:]:SelectImageViewController.m">
27
+         <PersistentStrings>
28
+            <PersistentString
29
+               value = "picker.parentViewController">
30
+            </PersistentString>
31
+         </PersistentStrings>
32
+      </ContextState>
33
+      <ContextState
34
+         contextName = "-[AddStationViewController textChanged:]:AddStationViewController.m">
35
+      </ContextState>
36
+      <ContextState
37
+         contextName = "-[AppDelegate play]:AppDelegate.m">
38
+      </ContextState>
39
+   </ContextStates>
40
+</VariablesViewState>

+ 5
- 0
Kohlradio.xcodeproj/xcuserdata/david.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist View File

@@ -0,0 +1,5 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Bucket
3
+   type = "1"
4
+   version = "2.0">
5
+</Bucket>

+ 98
- 0
Kohlradio.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/Radio.xcscheme View File

@@ -0,0 +1,98 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "0610"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "YES"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "63115B2D17F7471400876899"
18
+               BuildableName = "Kohlradio.app"
19
+               BlueprintName = "Kohlradio"
20
+               ReferencedContainer = "container:Kohlradio.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+      </BuildActionEntries>
24
+   </BuildAction>
25
+   <TestAction
26
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
27
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
28
+      shouldUseLaunchSchemeArgsEnv = "YES"
29
+      buildConfiguration = "Debug">
30
+      <Testables>
31
+         <TestableReference
32
+            skipped = "NO">
33
+            <BuildableReference
34
+               BuildableIdentifier = "primary"
35
+               BlueprintIdentifier = "63115B4E17F7471500876899"
36
+               BuildableName = "KohlradioTests.xctest"
37
+               BlueprintName = "KohlradioTests"
38
+               ReferencedContainer = "container:Kohlradio.xcodeproj">
39
+            </BuildableReference>
40
+         </TestableReference>
41
+      </Testables>
42
+      <MacroExpansion>
43
+         <BuildableReference
44
+            BuildableIdentifier = "primary"
45
+            BlueprintIdentifier = "63115B2D17F7471400876899"
46
+            BuildableName = "Kohlradio.app"
47
+            BlueprintName = "Kohlradio"
48
+            ReferencedContainer = "container:Kohlradio.xcodeproj">
49
+         </BuildableReference>
50
+      </MacroExpansion>
51
+   </TestAction>
52
+   <LaunchAction
53
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
54
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
55
+      launchStyle = "0"
56
+      useCustomWorkingDirectory = "NO"
57
+      buildConfiguration = "Debug"
58
+      ignoresPersistentStateOnLaunch = "NO"
59
+      debugDocumentVersioning = "YES"
60
+      allowLocationSimulation = "YES">
61
+      <BuildableProductRunnable
62
+         runnableDebuggingMode = "0">
63
+         <BuildableReference
64
+            BuildableIdentifier = "primary"
65
+            BlueprintIdentifier = "63115B2D17F7471400876899"
66
+            BuildableName = "Kohlradio.app"
67
+            BlueprintName = "Kohlradio"
68
+            ReferencedContainer = "container:Kohlradio.xcodeproj">
69
+         </BuildableReference>
70
+      </BuildableProductRunnable>
71
+      <AdditionalOptions>
72
+      </AdditionalOptions>
73
+   </LaunchAction>
74
+   <ProfileAction
75
+      shouldUseLaunchSchemeArgsEnv = "YES"
76
+      savedToolIdentifier = ""
77
+      useCustomWorkingDirectory = "NO"
78
+      buildConfiguration = "Release"
79
+      debugDocumentVersioning = "YES">
80
+      <BuildableProductRunnable
81
+         runnableDebuggingMode = "0">
82
+         <BuildableReference
83
+            BuildableIdentifier = "primary"
84
+            BlueprintIdentifier = "63115B2D17F7471400876899"
85
+            BuildableName = "Kohlradio.app"
86
+            BlueprintName = "Kohlradio"
87
+            ReferencedContainer = "container:Kohlradio.xcodeproj">
88
+         </BuildableReference>
89
+      </BuildableProductRunnable>
90
+   </ProfileAction>
91
+   <AnalyzeAction
92
+      buildConfiguration = "Debug">
93
+   </AnalyzeAction>
94
+   <ArchiveAction
95
+      buildConfiguration = "Release"
96
+      revealArchiveInOrganizer = "YES">
97
+   </ArchiveAction>
98
+</Scheme>

+ 27
- 0
Kohlradio.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist View File

@@ -0,0 +1,27 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>SchemeUserState</key>
6
+	<dict>
7
+		<key>Radio.xcscheme</key>
8
+		<dict>
9
+			<key>orderHint</key>
10
+			<integer>0</integer>
11
+		</dict>
12
+	</dict>
13
+	<key>SuppressBuildableAutocreation</key>
14
+	<dict>
15
+		<key>63115B2D17F7471400876899</key>
16
+		<dict>
17
+			<key>primary</key>
18
+			<true/>
19
+		</dict>
20
+		<key>63115B4E17F7471500876899</key>
21
+		<dict>
22
+			<key>primary</key>
23
+			<true/>
24
+		</dict>
25
+	</dict>
26
+</dict>
27
+</plist>

+ 33
- 0
Radio/AddStationViewController.h View File

@@ -0,0 +1,33 @@
1
+//
2
+//  AddStationViewController.h
3
+//  Radio
4
+//
5
+//  Created by David Walter on 29.09.13.
6
+//  Copyright (c) 2013 David Walter. All rights reserved.
7
+//
8
+
9
+#import "SelectImageViewController.h"
10
+
11
+@interface AddStationViewController : UITableViewController <SelectImageDelegate>
12
+{
13
+    RadioDB* radio;
14
+    //IBOutlet UINavigationBar* navBar;
15
+    IBOutlet UIBarButtonItem* saveButton;
16
+    
17
+    IBOutlet UITextField* nameField;
18
+    IBOutlet UITextField* urlField;
19
+    //IBOutlet UIButton* stationImage;
20
+    IBOutlet UIImageView* stationImage;
21
+    IBOutlet UISwitch* loadCover;
22
+    IBOutlet UISwitch* addToFavorites;
23
+    
24
+    NSDictionary* editStation;
25
+    NSString* imageName;
26
+}
27
+
28
+- (IBAction)cancel:(id)sender;
29
+- (IBAction)done:(id)sender;
30
+- (IBAction)textChanged:(id)sender;
31
+- (void)didSelectImage:(NSString*)imageName;
32
+
33
+@end

+ 180
- 0
Radio/AddStationViewController.m View File

@@ -0,0 +1,180 @@
1
+//
2
+//  AddStationViewController.m
3
+//  Radio
4
+//
5
+//  Created by David Walter on 29.09.13.
6
+//  Copyright (c) 2013 David Walter. All rights reserved.
7
+//
8
+
9
+#import "AddStationViewController.h"
10
+
11
+@interface AddStationViewController ()
12
+
13
+@end
14
+
15
+@implementation AddStationViewController
16
+
17
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
18
+{
19
+    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
20
+    if (self) {
21
+        // Custom initialization
22
+    }
23
+    return self;
24
+}
25
+
26
+- (void)viewDidLoad
27
+{
28
+    [super viewDidLoad];
29
+    
30
+    radio = [[RadioDB alloc] init];
31
+    
32
+    editStation = [RadioProperties editStation];
33
+    
34
+    if (editStation != nil)
35
+    {
36
+        [self.navigationItem setTitle:NSLocalizedString(@"Edit station", nil)];
37
+    
38
+        [saveButton setEnabled:YES];
39
+        
40
+        [nameField setText:[editStation objectForKey:@"name"]];
41
+        [urlField setText:[editStation objectForKey:@"url"]];
42
+        [loadCover setOn:[[editStation objectForKey:@"loadcover"] boolValue]];
43
+        [addToFavorites setOn:[RadioProperties isFavorite:editStation]];
44
+        
45
+        imageName = [editStation objectForKey:@"image"];
46
+        [stationImage setImage:[RadioProperties getStationLogo:editStation]];
47
+        //[stationImage setImage:[RadioProperties getStationLogo:editStation] forState:UIControlStateNormal];
48
+        
49
+        if (![[editStation objectForKey:@"genre"] isEqualToString:@"Custom"])
50
+        {
51
+            [nameField setEnabled:NO];
52
+            [nameField setClearButtonMode:UITextFieldViewModeNever];
53
+            [urlField setEnabled:NO];
54
+            [urlField setClearButtonMode:UITextFieldViewModeNever];
55
+        }
56
+    }
57
+    else
58
+    {
59
+        [self.navigationItem setTitle:NSLocalizedString(@"Add station", nil)];
60
+        imageName = @"iTunesArtwork.png";
61
+    }
62
+}
63
+
64
+- (IBAction)textChanged:(id)sender
65
+{
66
+    if ([[nameField text] length] > 0 &&
67
+        [[urlField text] length] > 0) {
68
+        // Check for empty fields and valid url
69
+        if ([self isURLValidForString:[urlField text]]) {
70
+            [saveButton setEnabled:YES];
71
+        } else {
72
+            [saveButton setEnabled:NO];
73
+        }
74
+    } else {
75
+        [saveButton setEnabled:NO];
76
+    }
77
+}
78
+
79
+- (IBAction)hideKeyboard:(id)sender
80
+{
81
+    [nameField resignFirstResponder];
82
+    [urlField resignFirstResponder];
83
+}
84
+
85
+- (IBAction)cancel:(id)sender
86
+{
87
+    [self dismissViewControllerAnimated:YES completion:nil];
88
+}
89
+
90
+- (IBAction)done:(id)sender
91
+{
92
+    NSArray* keys = @[@"id",@"name",@"url",@"image",@"loadcover",@"genre"];
93
+
94
+    NSNumber* load = [NSNumber numberWithInt:[loadCover isOn]?1:0];
95
+    //NSData* image = UIImagePNGRepresentation([stationImage imageForState:UIControlStateNormal]);
96
+    
97
+    NSArray* objects = @[[NSNumber numberWithInt:0], nameField.text, urlField.text, imageName, load, @"Custom"];
98
+    NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithObjects:objects forKeys:keys];
99
+    NSMutableArray* favs = [NSMutableArray arrayWithArray:[RadioProperties favorites]];
100
+    
101
+    if (editStation == nil)
102
+    {
103
+        long index = [radio addStation:dict];
104
+        
105
+        if (index > -1) {
106
+            [dict setValue:[NSNumber numberWithLong:index] forKey:@"id"];
107
+        } else {
108
+            NSLog(@"Unable to add station");
109
+        }
110
+    }
111
+    else
112
+    {
113
+        [dict setValue:[editStation objectForKey:@"id"] forKey:@"id"];
114
+        [dict setValue:[editStation objectForKey:@"genre"] forKey:@"genre"];
115
+        
116
+        [radio updateStation:dict];
117
+    }
118
+    
119
+    if ([addToFavorites isOn])
120
+    {
121
+        if ([favs containsObject:editStation]) // Apply changes to favorites if needed
122
+        {
123
+            NSUInteger index = [favs indexOfObject:editStation];
124
+            [favs replaceObjectAtIndex:index withObject:dict];
125
+            [RadioProperties setFavorites:favs];
126
+        }
127
+        else
128
+        {
129
+            [favs addObject:dict];
130
+            [RadioProperties setFavorites:favs];
131
+        }
132
+    }
133
+    else
134
+    {
135
+        if ([favs containsObject:editStation])
136
+        {
137
+            [favs removeObject:dict];
138
+            [RadioProperties setFavorites:favs];
139
+        }
140
+    }
141
+
142
+    [self dismissViewControllerAnimated:YES completion:nil];
143
+}
144
+
145
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
146
+{
147
+    if ([[segue identifier] isEqualToString:@"SelectImageSegue"])
148
+    {
149
+        SelectImageViewController* sivc = [segue destinationViewController];
150
+        sivc.delegate = self;
151
+    }
152
+}
153
+
154
+- (void)didSelectImage:(NSString*)value
155
+{
156
+    imageName = value;
157
+    
158
+    NSString* docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
159
+    NSString* imagePath = [docPath stringByAppendingPathComponent:value];
160
+    
161
+    UIImage* image = [UIImage imageWithContentsOfFile:imagePath];
162
+    
163
+    if (image == nil) {
164
+        image = [UIImage imageNamed:imageName];
165
+    }
166
+    if (image == nil) {
167
+        image = [UIImage imageNamed:@"iTunesArtwork.png"];
168
+    }
169
+    [stationImage setImage:image];
170
+    //[stationImage setImage:image forState:UIControlStateNormal];
171
+}
172
+
173
+- (BOOL)isURLValidForString:(NSString*)stringURL
174
+{
175
+    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:stringURL]];
176
+    
177
+    return [NSURLConnection canHandleRequest:urlRequest];
178
+}
179
+
180
+@end

+ 47
- 0
Radio/AppDelegate.h View File

@@ -0,0 +1,47 @@
1
+//
2
+//  AppDelegate.h
3
+//  Radio
4
+//
5
+//  Created by David Walter on 28.09.13.
6
+//  Copyright (c) 2013 David Walter. All rights reserved.
7
+//
8
+
9
+#import <UIKit/UIKit.h>
10
+#import <AVFoundation/AVFoundation.h>
11
+#import <AudioToolbox/AudioToolbox.h>
12
+#import <MediaPlayer/MediaPlayer.h>
13
+
14
+@protocol RadioDelegate
15
+@required
16
+- (void)updateMetadataText:(NSString*)metadataText;
17
+- (void)updateMetadataImage:(UIImage*)metadataImage;
18
+- (void)updateMetadataURL:(NSString*)metadataURL;
19
+
20
+@end
21
+
22
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
23
+{
24
+    AVPlayer* player;
25
+    //AVAudioPlayer* player;
26
+    
27
+    id radioDelegate;
28
+    
29
+    BOOL shouldLoadAlbumCover;
30
+    NSString* currentText;
31
+    UIImage* currentImage;
32
+    NSString* currentURL;
33
+}
34
+
35
+- (void)switchToStation:(NSDictionary*)station;
36
+//- (AVPlayerItem*)playerItem;
37
+
38
+- (BOOL)play;
39
+- (BOOL)isPlaying;
40
+- (void)pause;
41
+
42
+- (void)setRadioDelegate:(id)radio;
43
+
44
+@property (strong, nonatomic) UIWindow *window;
45
+//@property (strong, nonatomic) AVPlayer* player;
46
+
47
+@end

+ 326
- 0
Radio/AppDelegate.m View File

@@ -0,0 +1,326 @@
1
+//
2
+//  AppDelegate.m
3
+//  Radio
4
+//
5
+//  Created by David Walter on 28.09.13.
6
+//  Copyright (c) 2013 David Walter. All rights reserved.
7
+//
8
+
9
+#import "AppDelegate.h"
10
+
11
+@implementation AppDelegate
12
+
13
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
14
+{
15
+    NSError *sessionError = nil;
16
+    
17
+    //[[AVAudioSession sharedInstance] setDelegate:self];
18
+    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError];
19
+    
20
+    // Uncomment for resetting the app
21
+    // NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
22
+    // [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
23
+    
24
+    NSDictionary* dict = [RadioProperties currentStation];
25
+    
26
+    if (dict == nil) {
27
+        player = [[AVPlayer alloc] init];
28
+        //player = [[AVAudioPlayer alloc] init];
29
+    } else {
30
+        NSURL* url = [NSURL URLWithString:[dict objectForKey:@"url"]];
31
+        player = [[AVPlayer alloc] initWithURL:url];
32
+        //player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
33
+    }
34
+    
35
+    [player setVolume:1];
36
+    //[player setDelegate:self];
37
+    //[player setAppliesMediaSelectionCriteriaAutomatically:YES]; No idea what this does
38
+    [player setAllowsExternalPlayback:NO];
39
+    
40
+    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
41
+    [self becomeFirstResponder];
42
+    
43
+    //For whatever reason I cannot set it in interface builder
44
+    [[UITabBar appearance] setTintColor:[UIColor colorWithRed:0.25 green:0.64 blue:0.12 alpha:1.0]];
45
+    [[UITabBar appearance] setSelectedImageTintColor:[UIColor colorWithRed:0.25 green:0.64 blue:0.12 alpha:1.0]];
46
+    
47
+    return YES;
48
+}
49
+
50
+- (BOOL)canBecomeFirstResponder
51
+{
52
+    return YES;
53
+}
54
+
55
+- (void)remoteControlReceivedWithEvent:(UIEvent*)event
56
+{
57
+    // see [event subtype] for details
58
+    if ([event subtype] == UIEventSubtypeRemoteControlPlay) {
59
+        [self play];
60
+    } else if ([event subtype] == UIEventSubtypeRemoteControlPause) {
61
+        [self pause];
62
+    }
63
+}
64
+							
65
+- (void)applicationWillResignActive:(UIApplication *)application
66
+{
67
+    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
68
+    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
69
+}
70
+
71
+- (void)applicationDidEnterBackground:(UIApplication *)application
72
+{
73
+    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
74
+    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
75
+}
76
+
77
+- (void)applicationWillEnterForeground:(UIApplication *)application
78
+{
79
+    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
80
+}
81
+
82
+- (void)applicationDidBecomeActive:(UIApplication *)application
83
+{
84
+    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
85
+    NSString* docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
86
+    NSString* destination = [docPath stringByAppendingPathComponent:@"Radio.sqlite"];
87
+    
88
+    if (![[NSFileManager defaultManager] fileExistsAtPath:destination])
89
+    {
90
+        NSError* Error;
91
+        NSString *source = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"Radio.sqlite"];
92
+        
93
+        if ([[NSFileManager defaultManager] removeItemAtPath:destination error:&Error] == NO) {
94
+            NSLog(@"RemoveItemAtPath: %@", Error);
95
+        }
96
+        
97
+        if ([[NSFileManager defaultManager] copyItemAtPath:source toPath:destination error:&Error] == NO) {
98
+            NSLog(@"CopyItemAtPath: %@", Error);
99
+        }
100
+    }
101
+    
102
+    double version = [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] doubleValue];
103
+    
104
+    if (version > [RadioProperties currentVersion])
105
+    {
106
+        [RadioProperties setCurrentVersion:version];
107
+        
108
+        NSLog(@"Update Stations");
109
+        
110
+        RadioDB* radio = [[RadioDB alloc] init];
111
+        NSArray* customStations = [radio stationsWithGenre:@"Custom"];
112
+        
113
+        NSError* Error;
114
+        
115
+        NSString *source = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"Radio.sqlite"];
116
+        
117
+        if ([[NSFileManager defaultManager] removeItemAtPath:destination error:&Error] == NO) {
118
+            NSLog(@"RemoveItemAtPath: %@", Error);
119
+        } else if ([[NSFileManager defaultManager] copyItemAtPath:source toPath:destination error:&Error] == NO) {
120
+            NSLog(@"CopyItemAtPath: %@", Error);
121
+        } else {
122
+            //Copy custom stations to new database
123
+            radio = [[RadioDB alloc] init];
124
+            for(NSDictionary* station in customStations) {
125
+                [radio addStation:station];
126
+            }
127
+        }
128
+    }
129
+}
130
+
131
+- (void)applicationWillTerminate:(UIApplication *)application
132
+{
133
+    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
134
+}
135
+
136
+- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
137
+{
138
+    NSLog(@"audioPlayerBeginInterruption");
139
+}
140
+
141
+- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags
142
+{
143
+    NSLog(@"audioPlayerEndInterruption");
144
+}
145
+
146
+- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error
147
+{
148
+    NSLog(@"Error: %@", error);
149
+}
150
+
151
+- (void)switchToStation:(NSDictionary *)station
152
+{
153
+    NSURL* url = [NSURL URLWithString:[station objectForKey:@"url"]];
154
+    
155
+    currentText = nil;
156
+    currentImage = nil;
157
+    currentURL = nil;
158
+    
159
+    [self pause];
160
+    [player replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithURL:url]];
161
+    //player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
162
+    [self play];
163
+}
164
+
165
+- (BOOL)isPlaying
166
+{
167
+    return [player rate]>0.0;
168
+    //return [player isPlaying];
169
+}
170
+
171
+- (BOOL)play
172
+{
173
+    BOOL success = NO;
174
+    NSDictionary* station = [RadioProperties currentStation];
175
+    shouldLoadAlbumCover = [[station objectForKey:@"loadcover"] boolValue];
176
+    
177
+    [player play];
178
+    if (![self isPlaying]) {
179
+        NSURL* url = [NSURL URLWithString:[station objectForKey:@"url"]];
180
+        [player replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithURL:url]];
181
+        //player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
182
+        [player play];
183
+    } else {
184
+        success = YES;
185
+    }
186
+    
187
+    if (success) {
188
+        [self enableObserver];
189
+        [self updateMPNowPlayInfoCenterWithTitle:currentText andImage:currentImage andURL:currentURL];
190
+    }
191
+    
192
+    return success;
193
+}
194
+
195
+- (void)pause
196
+{
197
+    @try {
198
+        [[player currentItem] removeObserver:self forKeyPath:@"timedMetadata"];
199
+    } @catch (NSException *exception) {
200
+        
201
+    } @finally {
202
+        [player pause];
203
+    }
204
+}
205
+
206
+#pragma mark - MPNowPlayInfoCenter
207
+
208
+- (void)enableObserver
209
+{
210
+    [self observeValueForKeyPath:@"timedMetadata" ofObject:nil change:nil context:NULL];
211
+    [[player currentItem] addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];
212
+}
213
+
214
+- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
215
+{
216
+    if ([keyPath isEqualToString:@"timedMetadata"])
217
+    {
218
+        [self performSelectorInBackground:@selector(checkForMetadataOfPlayerItem:) withObject:[player currentItem]];
219
+    }
220
+}
221
+
222
+- (void)checkForMetadataOfPlayerItem:(AVPlayerItem*)playerItem
223
+{
224
+    if (playerItem.timedMetadata.count < 1)
225
+    {
226
+        [self updateMPNowPlayInfoCenterWithTitle:nil andImage:nil andURL:nil];
227
+    }
228
+    else
229
+    {
230
+        for (AVMetadataItem* metadata in playerItem.timedMetadata)
231
+        {
232
+            if ([metadata.key isEqual:@"title"])
233
+            {
234
+                NSString* metadataText = [metadata.stringValue stringByReplacingOccurrencesOfString:@"_" withString:@" "];
235
+                
236
+                if (metadataText == nil || [metadataText length] == 0)
237
+                {
238
+                    [self updateMPNowPlayInfoCenterWithTitle:nil andImage:nil andURL:nil];
239
+                }
240
+                else
241
+                {
242
+                    
243
+                    NSString* urlKey = [metadataText stringByReplacingOccurrencesOfString:@" " withString:@"+"];
244
+                    urlKey = [[urlKey componentsSeparatedByString:@"|"] objectAtIndex:0];
245
+                    
246
+                    NSString *urlString = [NSString stringWithFormat:@"https://itunes.apple.com/search?term=%@&entity=musicTrack&limit=1", urlKey];
247
+                    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
248
+                    NSURL *url = [NSURL URLWithString:urlString];
249
+                    NSURLRequest *request = [NSURLRequest requestWithURL:url];
250
+                    
251
+                    id queue = [[NSOperationQueue alloc] init];
252
+                    
253
+                    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse* response, NSData*data, NSError* error) {
254
+                        if (!error)
255
+                        {
256
+                            NSError* parseError;
257
+                            id parse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&parseError];
258
+                            
259
+                            NSArray* array = [parse objectForKey:@"results"];
260
+                            if ([array count] > 0) {
261
+                                NSDictionary* dict = [array objectAtIndex:0];
262
+                                
263
+                                UIImage* image = nil;
264
+                                
265
+                                if (shouldLoadAlbumCover)
266
+                                {
267
+                                    NSString* artworkUrl100 = [dict objectForKey:@"artworkUrl100"];
268
+                                    
269
+                                    NSString* artworkUrl600 = [artworkUrl100 stringByReplacingOccurrencesOfString:@"100x100" withString:@"1200x1200"];
270
+                                    
271
+                                    image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:artworkUrl600]]];
272
+                                }
273
+                                
274
+                                NSString* url = [dict objectForKey:@"artistViewUrl"];
275
+                                
276
+                                [self updateMPNowPlayInfoCenterWithTitle:metadataText andImage:image andURL:url];
277
+                            }
278
+                        } else {
279
+                            NSLog(@"NSURLConnection sendAsynchronousRequest: %@", error);
280
+                        }
281
+                    }];
282
+                }
283
+            }
284
+        }
285
+    }
286
+}
287
+
288
+- (void)updateMPNowPlayInfoCenterWithTitle:(NSString*)title andImage:(UIImage*)image andURL:(NSString*)url
289
+{
290
+    NSDictionary* currentStation = [RadioProperties currentStation];
291
+    
292
+    if (title == nil) {
293
+        title = [currentStation objectForKey:@"name"];
294
+    }
295
+    if (image == nil) {
296
+        image = [RadioProperties getStationLogo:currentStation];
297
+    }
298
+    
299
+    if (radioDelegate != nil) {
300
+        [radioDelegate updateMetadataText:title];
301
+        [radioDelegate updateMetadataImage:image];
302
+        [radioDelegate updateMetadataURL:url];
303
+    }
304
+    
305
+    currentText = title;
306
+    currentImage = image;
307
+    currentURL = url;
308
+    
309
+    MPMediaItemArtwork* albumArt = [[MPMediaItemArtwork alloc] initWithImage:image];
310
+    NSDictionary* currentlyPlayingTrackInfo = [NSDictionary dictionaryWithObjects:@[title, albumArt, [currentStation objectForKey:@"name"]] forKeys:@[MPMediaItemPropertyTitle, MPMediaItemPropertyArtwork, MPMediaItemPropertyArtist]];
311
+    
312
+    [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = currentlyPlayingTrackInfo;
313
+}
314
+
315
+- (void)setRadioDelegate:(id)delegate
316
+{
317
+    radioDelegate = delegate;
318
+    
319
+    if (delegate != nil) {
320
+        [self updateMPNowPlayInfoCenterWithTitle:currentText andImage:currentImage andURL:currentURL];
321
+        [self performSelectorInBackground:@selector(checkForMetadataOfPlayerItem:) withObject:[player currentItem]];
322
+    }
323
+}
324
+
325
+
326
+@end

+ 22
- 0
Radio/Base.lproj/Localizable.strings View File

@@ -0,0 +1,22 @@
1
+/* 
2
+  Localizable.strings
3
+  Radio
4
+
5
+  Created by David Walter on 21.10.13.
6
+  Copyright (c) 2013 David Walter. All rights reserved.
7
+*/
8
+"Edit station" = "Edit station";
9
+"Add station" = "Add station";
10
+"My stations" = "My stations";
11
+"Set sleep timer" = "set sleep timer";
12
+"Disable sleep timer" = "Disable sleep timer";
13
+"minutes" = "minutes";
14
+"Cancel" = "Cancel";
15
+"No radio stations" = "No radio stations";
16
+"No favorites" = "No favorites";
17
+"Standard images" = "Standard images";
18
+"Custom images" = "Custom images";
19
+"Add image" = "Add image";
20
+"Paste photo" = "Paste photo";
21
+"Select photo" = "Select photo";
22
+"iTunesEN" = "iTunesEN";

+ 664
- 0
Radio/Base.lproj/Main.storyboard View File

@@ -0,0 +1,664 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11762" systemVersion="16E144f" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES" initialViewController="oKw-k5-lEi">
3
+    <device id="retina4_7" orientation="portrait">
4
+        <adaptation id="fullscreen"/>
5
+    </device>
6
+    <dependencies>
7
+        <deployment identifier="iOS"/>
8
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/>
9
+        <capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
10
+        <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
11
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
12
+    </dependencies>
13
+    <scenes>
14
+        <!--Tab Bar Controller-->
15
+        <scene sceneID="mNy-DH-0cy">
16
+            <objects>
17
+                <tabBarController definesPresentationContext="YES" id="oKw-k5-lEi" sceneMemberID="viewController">
18
+                    <navigationItem key="navigationItem" id="ycb-WC-wtx"/>
19
+                    <nil key="simulatedBottomBarMetrics"/>
20
+                    <tabBar key="tabBar" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="zYz-PO-oFc">
21
+                        <rect key="frame" x="129" y="330" width="163" height="49"/>
22
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
23
+                        <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
24
+                        <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
25
+                        <color key="selectedImageTintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
26
+                    </tabBar>
27
+                    <connections>
28
+                        <segue destination="24K-lw-Ee9" kind="relationship" relationship="viewControllers" id="oZw-4G-Qbj"/>
29
+                        <segue destination="HEN-27-xiI" kind="relationship" relationship="viewControllers" id="aN1-RN-FTq"/>
30
+                    </connections>
31
+                </tabBarController>
32
+                <placeholder placeholderIdentifier="IBFirstResponder" id="FWa-Gy-hAQ" userLabel="First Responder" sceneMemberID="firstResponder"/>
33
+            </objects>
34
+            <point key="canvasLocation" x="1377" y="-316.99999999999983"/>
35
+        </scene>
36
+        <!--Genre View Controller-->
37
+        <scene sceneID="O4u-IO-NS2">
38
+            <objects>
39
+                <tableViewController id="guG-he-Ycx" customClass="GenreViewController" sceneMemberID="viewController">
40
+                    <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="gLZ-2s-nge">
41
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
42
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
43
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
44
+                        <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
45
+                        <searchBar key="tableHeaderView" contentMode="redraw" searchBarStyle="minimal" id="BQv-gE-9tK">
46
+                            <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
47
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
48
+                            <textInputTraits key="textInputTraits"/>
49
+                            <connections>
50
+                                <outlet property="delegate" destination="guG-he-Ycx" id="HUm-6J-ON0"/>
51
+                            </connections>
52
+                        </searchBar>
53
+                        <prototypes>
54
+                            <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="detailButton" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="StationCell" id="36G-aw-A5E">
55
+                                <rect key="frame" x="0.0" y="66" width="375" height="44"/>
56
+                                <autoresizingMask key="autoresizingMask"/>
57
+                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="36G-aw-A5E" id="OZE-ab-qzP">
58
+                                    <rect key="frame" x="0.0" y="0.0" width="328" height="43"/>
59
+                                    <autoresizingMask key="autoresizingMask"/>
60
+                                </tableViewCellContentView>
61
+                                <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
62
+                            </tableViewCell>
63
+                        </prototypes>
64
+                        <connections>
65
+                            <outlet property="dataSource" destination="guG-he-Ycx" id="oNd-DK-DUP"/>
66
+                            <outlet property="delegate" destination="guG-he-Ycx" id="1YG-WN-3iR"/>
67
+                        </connections>
68
+                    </tableView>
69
+                    <navigationItem key="navigationItem" id="RYc-2V-vzU">
70
+                        <barButtonItem key="backBarButtonItem" title=" " id="HoD-fX-shD"/>
71
+                        <barButtonItem key="rightBarButtonItem" systemItem="play" id="RIA-47-Dlb">
72
+                            <connections>
73
+                                <segue destination="aeS-Ak-XeA" kind="push" identifier="NowPlaying" id="cLs-so-tvb"/>
74
+                            </connections>
75
+                        </barButtonItem>
76
+                    </navigationItem>
77
+                    <connections>
78
+                        <outlet property="searchBarMain" destination="BQv-gE-9tK" id="31Y-41-5VM"/>
79
+                        <segue destination="nSf-dz-c57" kind="modal" identifier="EditStation" id="TKw-fG-hVW"/>
80
+                    </connections>
81
+                </tableViewController>
82
+                <placeholder placeholderIdentifier="IBFirstResponder" id="oiL-HI-S13" userLabel="First Responder" sceneMemberID="firstResponder"/>
83
+            </objects>
84
+            <point key="canvasLocation" x="3034" y="-1034"/>
85
+        </scene>
86
+        <!--Radio View Controller-->
87
+        <scene sceneID="Htc-4G-15f">
88
+            <objects>
89
+                <viewController hidesBottomBarWhenPushed="YES" id="aeS-Ak-XeA" customClass="RadioViewController" sceneMemberID="viewController">
90
+                    <layoutGuides>
91
+                        <viewControllerLayoutGuide type="top" id="4gc-Ny-zaz"/>
92
+                        <viewControllerLayoutGuide type="bottom" id="nGb-jH-n0c"/>
93
+                    </layoutGuides>
94
+                    <view key="view" autoresizesSubviews="NO" clipsSubviews="YES" contentMode="scaleToFill" id="ZoS-QP-3fK">
95
+                        <rect key="frame" x="0.0" y="64" width="375" height="603"/>
96
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
97
+                        <subviews>
98
+                            <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ZHt-C6-VvD">
99
+                                <rect key="frame" x="0.0" y="0.0" width="375" height="375"/>
100
+                                <constraints>
101
+                                    <constraint firstAttribute="width" secondItem="ZHt-C6-VvD" secondAttribute="height" multiplier="1:1" id="yay-0d-y8T"/>
102
+                                </constraints>
103
+                            </imageView>
104
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aSA-9x-Cf2">
105
+                                <rect key="frame" x="0.0" y="467" width="375" height="136"/>
106
+                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
107
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
108
+                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
109
+                                <nil key="highlightedColor"/>
110
+                            </label>
111
+                            <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="b8I-p0-73R">
112
+                                <rect key="frame" x="0.0" y="385" width="375" height="82"/>
113
+                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
114
+                                <color key="tintColor" red="0.9570387601852417" green="0.056072905659675598" blue="0.26595255732536316" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
115
+                                <constraints>
116
+                                    <constraint firstAttribute="height" relation="greaterThanOrEqual" priority="750" constant="30" id="uBQ-ux-5HK"/>
117
+                                </constraints>
118
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
119
+                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
120
+                                <nil key="highlightedColor"/>
121
+                            </label>
122
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zRR-9h-UAT" customClass="MPVolumeView">
123
+                                <rect key="frame" x="46" y="557" width="283" height="26"/>
124
+                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
125
+                                <color key="tintColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
126
+                                <constraints>
127
+                                    <constraint firstAttribute="height" constant="26" id="qw6-Oo-aNw"/>
128
+                                </constraints>
129
+                            </view>
130
+                            <button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hgy-mi-r83">
131
+                                <rect key="frame" x="167" y="477" width="40" height="40"/>
132
+                                <constraints>
133
+                                    <constraint firstAttribute="width" constant="40" id="8Ka-yl-dnK"/>
134
+                                    <constraint firstAttribute="height" constant="40" id="YRc-wb-gXG"/>
135
+                                </constraints>
136
+                                <color key="tintColor" red="0.9570387601852417" green="0.056072905659675598" blue="0.26595255732536316" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
137
+                                <state key="normal" image="Play">
138
+                                    <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
139
+                                </state>
140
+                                <connections>
141
+                                    <action selector="togglePlayPause:" destination="aeS-Ak-XeA" eventType="touchUpInside" id="2ED-R3-FAB"/>
142
+                                </connections>
143
+                            </button>
144
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="UEa-ey-f5c">
145
+                                <rect key="frame" x="52" y="481" width="30" height="31"/>
146
+                                <constraints>
147
+                                    <constraint firstAttribute="width" constant="30" id="7U7-BF-BcG"/>
148
+                                    <constraint firstAttribute="height" constant="31" id="e0c-mP-EkM"/>
149
+                                </constraints>
150
+                                <color key="tintColor" red="0.9570387601852417" green="0.056072905659675598" blue="0.26595255732536316" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
151
+                                <state key="normal" backgroundImage="Star-Full">
152
+                                    <color key="titleColor" red="0.9570387601852417" green="0.056072905659675598" blue="0.26595255732536316" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
153
+                                    <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
154
+                                </state>
155
+                                <connections>
156
+                                    <action selector="favorite:" destination="aeS-Ak-XeA" eventType="touchUpInside" id="Xc3-2u-AI1"/>
157
+                                </connections>
158
+                            </button>
159
+                            <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="VolumeLow" translatesAutoresizingMaskIntoConstraints="NO" id="ASG-AJ-SFh">
160
+                                <rect key="frame" x="16" y="555" width="20" height="26"/>
161
+                                <constraints>
162
+                                    <constraint firstAttribute="height" constant="26" id="Y8D-Vy-uV0"/>
163
+                                    <constraint firstAttribute="width" constant="20" id="tHS-v2-IZx"/>
164
+                                </constraints>
165
+                            </imageView>
166
+                            <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="VolumeHigh" translatesAutoresizingMaskIntoConstraints="NO" id="exM-wg-8uT">
167
+                                <rect key="frame" x="339" y="555" width="20" height="26"/>
168
+                                <constraints>
169
+                                    <constraint firstAttribute="height" constant="26" id="G2o-Yb-29v"/>
170
+                                    <constraint firstAttribute="width" constant="20" id="nZZ-Wv-P8i"/>
171
+                                </constraints>
172
+                            </imageView>
173
+                            <button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sph-wm-Cdo">
174
+                                <rect key="frame" x="260" y="481" width="85" height="31"/>
175
+                                <constraints>
176
+                                    <constraint firstAttribute="width" constant="85" id="5KF-W2-n7d"/>
177
+                                    <constraint firstAttribute="height" constant="31" id="Gnq-tM-mgS"/>
178
+                                </constraints>
179
+                                <state key="normal" backgroundImage="iTunesEN">
180
+                                    <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
181
+                                </state>
182
+                                <connections>
183
+                                    <action selector="gotoiTunes:" destination="aeS-Ak-XeA" eventType="touchUpInside" id="zSb-bP-mTU"/>
184
+                                </connections>
185
+                            </button>
186
+                        </subviews>
187
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
188
+                        <constraints>
189
+                            <constraint firstItem="hgy-mi-r83" firstAttribute="centerX" secondItem="zRR-9h-UAT" secondAttribute="centerX" id="0GS-Nj-wP8"/>
190
+                            <constraint firstItem="b8I-p0-73R" firstAttribute="leading" secondItem="ZoS-QP-3fK" secondAttribute="leadingMargin" constant="-16" id="15n-UV-2W3"/>
191
+                            <constraint firstAttribute="bottomMargin" secondItem="zRR-9h-UAT" secondAttribute="bottom" constant="20" id="9dR-4k-VGA"/>
192
+                            <constraint firstItem="ZHt-C6-VvD" firstAttribute="top" secondItem="4gc-Ny-zaz" secondAttribute="bottom" id="BJU-Zm-wG7"/>
193
+                            <constraint firstItem="zRR-9h-UAT" firstAttribute="top" secondItem="UEa-ey-f5c" secondAttribute="bottom" constant="45" id="CVV-re-dvZ"/>
194
+                            <constraint firstItem="aSA-9x-Cf2" firstAttribute="leading" secondItem="ZoS-QP-3fK" secondAttribute="leadingMargin" constant="-16" id="D5i-Xv-gHd"/>
195
+                            <constraint firstAttribute="trailingMargin" secondItem="ZHt-C6-VvD" secondAttribute="trailing" constant="-16" id="FSd-Fe-buf"/>
196
+                            <constraint firstItem="hgy-mi-r83" firstAttribute="top" secondItem="b8I-p0-73R" secondAttribute="bottom" constant="10" id="KPk-2O-TGZ"/>
197
+                            <constraint firstItem="ASG-AJ-SFh" firstAttribute="leading" secondItem="ZoS-QP-3fK" secondAttribute="leadingMargin" id="RcA-HO-BSY"/>
198
+                            <constraint firstItem="ZHt-C6-VvD" firstAttribute="leading" secondItem="ZoS-QP-3fK" secondAttribute="leadingMargin" constant="-16" id="Reb-vF-1Ze"/>
199
+                            <constraint firstAttribute="bottomMargin" secondItem="ASG-AJ-SFh" secondAttribute="bottom" constant="22" id="TdQ-68-r44"/>
200
+                            <constraint firstAttribute="trailingMargin" secondItem="b8I-p0-73R" secondAttribute="trailing" constant="-16" id="Uwc-SP-GyQ"/>
201
+                            <constraint firstItem="sph-wm-Cdo" firstAttribute="top" secondItem="b8I-p0-73R" secondAttribute="bottom" constant="14" id="Vt2-qS-X8O"/>
202
+                            <constraint firstItem="exM-wg-8uT" firstAttribute="trailing" secondItem="ZoS-QP-3fK" secondAttribute="trailingMargin" id="VyE-uh-r9d"/>
203
+                            <constraint firstItem="UEa-ey-f5c" firstAttribute="leading" secondItem="ZoS-QP-3fK" secondAttribute="leadingMargin" constant="36" id="Xr2-c1-gV4"/>
204
+                            <constraint firstItem="exM-wg-8uT" firstAttribute="leading" secondItem="zRR-9h-UAT" secondAttribute="trailing" constant="10" id="Xtz-Lb-lRx"/>
205
+                            <constraint firstItem="zRR-9h-UAT" firstAttribute="top" secondItem="sph-wm-Cdo" secondAttribute="bottom" constant="45" id="avM-JW-htG"/>
206
+                            <constraint firstItem="zRR-9h-UAT" firstAttribute="top" secondItem="hgy-mi-r83" secondAttribute="bottom" constant="40" id="eCl-6C-4sc"/>
207
+                            <constraint firstItem="b8I-p0-73R" firstAttribute="top" secondItem="ZHt-C6-VvD" secondAttribute="bottom" priority="750" constant="10" id="hdF-jr-lIq"/>
208
+                            <constraint firstItem="exM-wg-8uT" firstAttribute="top" secondItem="sph-wm-Cdo" secondAttribute="bottom" constant="43" id="i6Y-Nf-4gL"/>
209
+                            <constraint firstItem="aSA-9x-Cf2" firstAttribute="top" secondItem="b8I-p0-73R" secondAttribute="bottom" id="l7C-FX-ckE"/>
210
+                            <constraint firstItem="zRR-9h-UAT" firstAttribute="leading" secondItem="ASG-AJ-SFh" secondAttribute="trailing" constant="10" id="lhf-EJ-Gnf"/>
211
+                            <constraint firstItem="nGb-jH-n0c" firstAttribute="top" secondItem="aSA-9x-Cf2" secondAttribute="bottom" id="p7C-cr-Mqf"/>
212
+                            <constraint firstAttribute="trailingMargin" secondItem="aSA-9x-Cf2" secondAttribute="trailing" constant="-16" id="p7M-S2-rYZ"/>
213
+                            <constraint firstAttribute="trailingMargin" secondItem="sph-wm-Cdo" secondAttribute="trailing" constant="14" id="pRg-a6-3px"/>
214
+                            <constraint firstAttribute="bottomMargin" secondItem="exM-wg-8uT" secondAttribute="bottom" constant="22" id="sLE-Lf-YUw"/>
215
+                        </constraints>
216
+                    </view>
217
+                    <extendedEdge key="edgesForExtendedLayout"/>
218
+                    <navigationItem key="navigationItem" id="eU0-EC-7Gn"/>
219
+                    <nil key="simulatedBottomBarMetrics"/>
220
+                    <connections>
221
+                        <outlet property="buttonBuy" destination="sph-wm-Cdo" id="Lp9-7d-aI9"/>
222
+                        <outlet property="buttonFavorite" destination="UEa-ey-f5c" id="mXs-DD-x72"/>
223
+                        <outlet property="buttonTogglePlayPause" destination="hgy-mi-r83" id="U22-AD-ICQ"/>
224
+                        <outlet property="imageViewAlbumCover" destination="ZHt-C6-VvD" id="WuC-Nz-S9V"/>
225
+                        <outlet property="labelMetadata" destination="b8I-p0-73R" id="Wnw-I0-Ijv"/>
226
+                        <outlet property="volumeView" destination="zRR-9h-UAT" id="3zM-nw-PqB"/>
227
+                    </connections>
228
+                </viewController>
229
+                <placeholder placeholderIdentifier="IBFirstResponder" id="HPr-0Z-FBK" userLabel="First Responder" sceneMemberID="firstResponder"/>
230
+            </objects>
231
+            <point key="canvasLocation" x="3166.5" y="167.5"/>
232
+        </scene>
233
+        <!--Select Image-->
234
+        <scene sceneID="uRH-QB-wz5">
235
+            <objects>
236
+                <collectionViewController autoresizesArchivedViewToFullSize="NO" id="Wgd-n4-RVK" customClass="SelectImageViewController" sceneMemberID="viewController">
237
+                    <collectionView key="view" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" misplaced="YES" alwaysBounceVertical="YES" minimumZoomScale="0.0" maximumZoomScale="0.0" dataMode="prototypes" id="gDa-lA-qBO">
238
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
239
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
240
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
241
+                        <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="2" minimumInteritemSpacing="2" id="yfE-tT-YQD">
242
+                            <size key="itemSize" width="78.5" height="78.5"/>
243
+                            <size key="headerReferenceSize" width="320" height="25"/>
244
+                            <size key="footerReferenceSize" width="0.0" height="0.0"/>
245
+                            <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
246
+                        </collectionViewFlowLayout>
247
+                        <cells>
248
+                            <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="ImageCell" id="wsW-gU-JbP" customClass="ImageCell">
249
+                                <rect key="frame" x="0.0" y="25" width="78" height="79"/>
250
+                                <autoresizingMask key="autoresizingMask"/>
251
+                                <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
252
+                                    <rect key="frame" x="0.0" y="0.0" width="78" height="79"/>
253
+                                    <autoresizingMask key="autoresizingMask"/>
254
+                                </view>
255
+                            </collectionViewCell>
256
+                        </cells>
257
+                        <collectionReusableView key="sectionHeaderView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="ImageHeader" id="tWH-ib-lhH" customClass="ImageHeader">
258
+                            <rect key="frame" x="0.0" y="0.0" width="375" height="25"/>
259
+                            <autoresizingMask key="autoresizingMask"/>
260
+                            <subviews>
261
+                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Standard images" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9yX-kV-8Wq">
262
+                                    <rect key="frame" x="20" y="2" width="280" height="21"/>
263
+                                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
264
+                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
265
+                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
266
+                                    <nil key="highlightedColor"/>
267
+                                </label>
268
+                            </subviews>
269
+                            <color key="backgroundColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.95686274509803926" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
270
+                            <connections>
271
+                                <outlet property="labelHeader" destination="9yX-kV-8Wq" id="43D-V7-jHe"/>
272
+                            </connections>
273
+                        </collectionReusableView>
274
+                        <connections>
275
+                            <outlet property="dataSource" destination="Wgd-n4-RVK" id="2sj-sX-pa8"/>
276
+                            <outlet property="delegate" destination="Wgd-n4-RVK" id="Jlh-xh-UBi"/>
277
+                        </connections>
278
+                    </collectionView>
279
+                    <navigationItem key="navigationItem" title="Select Image" id="Vue-6b-rT3">
280
+                        <barButtonItem key="rightBarButtonItem" systemItem="add" id="k23-4B-0yg">
281
+                            <connections>
282
+                                <action selector="addImage:" destination="Wgd-n4-RVK" id="F4B-Cg-lKn"/>
283
+                            </connections>
284
+                        </barButtonItem>
285
+                    </navigationItem>
286
+                </collectionViewController>
287
+                <placeholder placeholderIdentifier="IBFirstResponder" id="KgS-Qr-Wxi" userLabel="First Responder" sceneMemberID="firstResponder"/>
288
+            </objects>
289
+            <point key="canvasLocation" x="4490" y="-588.99999999999977"/>
290
+        </scene>
291
+        <!--Stations-->
292
+        <scene sceneID="VmK-7R-vZK">
293
+            <objects>
294
+                <tableViewController id="2jh-gr-p8R" customClass="StationsViewController" sceneMemberID="viewController">
295
+                    <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="hzz-xM-e6z">
296
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
297
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
298
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
299
+                        <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
300
+                        <searchBar key="tableHeaderView" contentMode="redraw" searchBarStyle="minimal" id="Ccd-Dt-bEZ">
301
+                            <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
302
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
303
+                            <textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="alphabet"/>
304
+                            <connections>
305
+                                <outlet property="delegate" destination="2jh-gr-p8R" id="yiz-mt-mZx"/>
306
+                            </connections>
307
+                        </searchBar>
308
+                        <prototypes>
309
+                            <tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="GenreCell" id="dxu-jd-TsT">
310
+                                <rect key="frame" x="0.0" y="66" width="375" height="44"/>
311
+                                <autoresizingMask key="autoresizingMask"/>
312
+                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="dxu-jd-TsT" id="YJy-s9-AFh">
313
+                                    <rect key="frame" x="0.0" y="0.0" width="375" height="43"/>
314
+                                    <autoresizingMask key="autoresizingMask"/>
315
+                                </tableViewCellContentView>
316
+                                <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
317
+                            </tableViewCell>
318
+                        </prototypes>
319
+                        <sections/>
320
+                        <connections>
321
+                            <outlet property="dataSource" destination="2jh-gr-p8R" id="9o8-Sm-ZO6"/>
322
+                            <outlet property="delegate" destination="2jh-gr-p8R" id="D7Y-Dm-rQK"/>
323
+                        </connections>
324
+                    </tableView>
325
+                    <navigationItem key="navigationItem" title="Stations" id="YCu-mU-tE9">
326
+                        <barButtonItem key="backBarButtonItem" title=" " id="ekO-uu-Ij2"/>
327
+                        <barButtonItem key="leftBarButtonItem" systemItem="add" id="CYt-t9-kX8">
328
+                            <connections>
329
+                                <segue destination="nSf-dz-c57" kind="modal" identifier="AddStation" id="vnu-Gc-qeK"/>
330
+                            </connections>
331
+                        </barButtonItem>
332
+                        <barButtonItem key="rightBarButtonItem" systemItem="play" id="Smc-uj-XUS">
333
+                            <connections>
334
+                                <segue destination="aeS-Ak-XeA" kind="push" identifier="NowPlaying" id="v2o-qg-qet"/>
335
+                            </connections>
336
+                        </barButtonItem>
337
+                    </navigationItem>
338
+                    <connections>
339
+                        <outlet property="searchBarMain" destination="Ccd-Dt-bEZ" id="KPP-bk-I8N"/>
340
+                        <outlet property="view" destination="hzz-xM-e6z" id="AZV-K7-5H0"/>
341
+                        <segue destination="guG-he-Ycx" kind="push" identifier="GenreSelected" id="Y47-QV-cd0"/>
342
+                        <segue destination="nSf-dz-c57" kind="modal" identifier="EditStation" id="8LF-EQ-lgN"/>
343
+                    </connections>
344
+                </tableViewController>
345
+                <placeholder placeholderIdentifier="IBFirstResponder" id="T5Y-C3-k2t" userLabel="First Responder" sceneMemberID="firstResponder"/>
346
+            </objects>
347
+            <point key="canvasLocation" x="2458" y="-588"/>
348
+        </scene>
349
+        <!--Stations-->
350
+        <scene sceneID="9Km-5y-W1j">
351
+            <objects>
352
+                <navigationController definesPresentationContext="YES" id="HEN-27-xiI" sceneMemberID="viewController">
353
+                    <tabBarItem key="tabBarItem" title="Stations" image="Radio" id="urR-2E-bJt"/>
354
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="SFG-lm-BAS">
355
+                        <rect key="frame" x="0.0" y="0.0" width="1000" height="1000"/>
356
+                        <autoresizingMask key="autoresizingMask"/>
357
+                        <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
358
+                    </navigationBar>
359
+                    <connections>
360
+                        <segue destination="2jh-gr-p8R" kind="relationship" relationship="rootViewController" id="Sda-ZZ-LvQ"/>
361
+                    </connections>
362
+                </navigationController>
363
+                <placeholder placeholderIdentifier="IBFirstResponder" id="Lji-Tf-Epv" userLabel="First Responder" sceneMemberID="firstResponder"/>
364
+            </objects>
365
+            <point key="canvasLocation" x="1924" y="-588.99999999999966"/>
366
+        </scene>
367
+        <!--Favorites-->
368
+        <scene sceneID="uFY-ol-GFh">
369
+            <objects>
370
+                <tableViewController id="yjo-U8-5Yi" customClass="FavoritesViewController" sceneMemberID="viewController">
371
+                    <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="85" sectionHeaderHeight="22" sectionFooterHeight="22" id="6eU-Ht-oQl">
372
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
373
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
374
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
375
+                        <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
376
+                        <prototypes>
377
+                            <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="detailButton" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="FavCell" rowHeight="85" id="NzF-j2-LIR">
378
+                                <rect key="frame" x="0.0" y="22" width="375" height="85"/>
379
+                                <autoresizingMask key="autoresizingMask"/>
380
+                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="NzF-j2-LIR" id="0ZR-rY-Xig">
381
+                                    <rect key="frame" x="0.0" y="0.0" width="328" height="84"/>
382
+                                    <autoresizingMask key="autoresizingMask"/>
383
+                                </tableViewCellContentView>
384
+                                <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
385
+                            </tableViewCell>
386
+                        </prototypes>
387
+                    </tableView>
388
+                    <navigationItem key="navigationItem" title="Favorites" id="yGO-30-T6T">
389
+                        <barButtonItem key="backBarButtonItem" title=" " id="bVA-DJ-Aar"/>
390
+                        <barButtonItem key="leftBarButtonItem" systemItem="edit" id="bK1-lZ-5WS"/>
391
+                        <barButtonItem key="rightBarButtonItem" systemItem="play" id="T8b-QS-bQL">
392
+                            <connections>
393
+                                <segue destination="aeS-Ak-XeA" kind="push" identifier="NowPlaying" id="5lS-nC-JOZ"/>
394
+                            </connections>
395
+                        </barButtonItem>
396
+                    </navigationItem>
397
+                    <connections>
398
+                        <segue destination="nSf-dz-c57" kind="modal" identifier="EditFavorite" id="Znd-Zg-Ek1"/>
399
+                    </connections>
400
+                </tableViewController>
401
+                <placeholder placeholderIdentifier="IBFirstResponder" id="ITy-Xv-Uiz" userLabel="First Responder" sceneMemberID="firstResponder"/>
402
+            </objects>
403
+            <point key="canvasLocation" x="2458" y="96.999999999999957"/>
404
+        </scene>
405
+        <!--Add station-->
406
+        <scene sceneID="7ZK-An-b4X">
407
+            <objects>
408
+                <tableViewController hidesBottomBarWhenPushed="YES" id="e9y-J5-KjR" customClass="AddStationViewController" sceneMemberID="viewController">
409
+                    <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="w32-Jb-7Vu">
410
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
411
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
412
+                        <color key="backgroundColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.95686274509803926" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
413
+                        <sections>
414
+                            <tableViewSection headerTitle="Name" id="Go0-8f-2ro">
415
+                                <cells>
416
+                                    <tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="V04-Rq-aUd">
417
+                                        <rect key="frame" x="0.0" y="56" width="375" height="44"/>
418
+                                        <autoresizingMask key="autoresizingMask"/>
419
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="V04-Rq-aUd" id="DlI-W9-qRr">
420
+                                            <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
421
+                                            <autoresizingMask key="autoresizingMask"/>
422
+                                            <subviews>
423
+                                                <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Name of the radio station" minimumFontSize="17" clearButtonMode="always" translatesAutoresizingMaskIntoConstraints="NO" id="hRH-hQ-q8B">
424
+                                                    <rect key="frame" x="8" y="7" width="359" height="30"/>
425
+                                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
426
+                                                    <textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="alphabet" returnKeyType="done"/>
427
+                                                    <connections>
428
+                                                        <action selector="hideKeyboard:" destination="e9y-J5-KjR" eventType="editingDidEndOnExit" id="gzy-7z-LBp"/>
429
+                                                        <action selector="textChanged:" destination="e9y-J5-KjR" eventType="editingChanged" id="wTD-Iu-1h1"/>
430
+                                                    </connections>
431
+                                                </textField>
432
+                                            </subviews>
433
+                                            <constraints>
434
+                                                <constraint firstAttribute="bottomMargin" secondItem="hRH-hQ-q8B" secondAttribute="bottom" constant="-1" id="5hg-nC-adX"/>
435
+                                                <constraint firstItem="hRH-hQ-q8B" firstAttribute="leading" secondItem="DlI-W9-qRr" secondAttribute="leadingMargin" id="Hiz-iO-Lv1"/>
436
+                                                <constraint firstItem="hRH-hQ-q8B" firstAttribute="top" secondItem="DlI-W9-qRr" secondAttribute="topMargin" constant="-1" id="cL0-V8-hpe"/>
437
+                                                <constraint firstItem="hRH-hQ-q8B" firstAttribute="trailing" secondItem="DlI-W9-qRr" secondAttribute="trailingMargin" id="ouK-TU-WBc"/>
438
+                                            </constraints>
439
+                                        </tableViewCellContentView>
440
+                                    </tableViewCell>
441
+                                </cells>
442
+                            </tableViewSection>
443
+                            <tableViewSection headerTitle="URL" id="fIW-dW-pR6">
444
+                                <cells>
445
+                                    <tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="YXY-ho-GEC">
446
+                                        <rect key="frame" x="0.0" y="149" width="375" height="44"/>
447
+                                        <autoresizingMask key="autoresizingMask"/>
448
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="YXY-ho-GEC" id="bJW-U5-iJH">
449
+                                            <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
450
+                                            <autoresizingMask key="autoresizingMask"/>
451
+                                            <subviews>
452
+                                                <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="URL of the radio station" minimumFontSize="17" clearButtonMode="always" translatesAutoresizingMaskIntoConstraints="NO" id="UeM-dm-3cy">
453
+                                                    <rect key="frame" x="8" y="7" width="359" height="30"/>
454
+                                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
455
+                                                    <textInputTraits key="textInputTraits" autocorrectionType="no" keyboardType="URL" returnKeyType="done"/>
456
+                                                    <connections>
457
+                                                        <action selector="hideKeyboard:" destination="e9y-J5-KjR" eventType="editingDidEndOnExit" id="pWo-Ig-qk7"/>
458
+                                                        <action selector="textChanged:" destination="e9y-J5-KjR" eventType="editingChanged" id="0AY-Hw-Vrw"/>
459
+                                                    </connections>
460
+                                                </textField>
461
+                                            </subviews>
462
+                                            <constraints>
463
+                                                <constraint firstItem="UeM-dm-3cy" firstAttribute="top" secondItem="bJW-U5-iJH" secondAttribute="topMargin" constant="-1" id="7X8-vC-83H"/>
464
+                                                <constraint firstAttribute="trailingMargin" secondItem="UeM-dm-3cy" secondAttribute="trailing" id="BTJ-tv-qyP"/>
465
+                                                <constraint firstAttribute="bottomMargin" secondItem="UeM-dm-3cy" secondAttribute="bottom" constant="-1" id="LWx-Fv-CE6"/>
466
+                                                <constraint firstItem="UeM-dm-3cy" firstAttribute="leading" secondItem="bJW-U5-iJH" secondAttribute="leadingMargin" id="xnc-ae-Ogf"/>
467
+                                            </constraints>
468
+                                        </tableViewCellContentView>
469
+                                    </tableViewCell>
470
+                                </cells>
471
+                            </tableViewSection>
472
+                            <tableViewSection headerTitle="Options" id="Wid-iv-jNw">
473
+                                <cells>
474
+                                    <tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="100" id="HYk-y9-XL5">
475
+                                        <rect key="frame" x="0.0" y="242" width="375" height="100"/>
476
+                                        <autoresizingMask key="autoresizingMask"/>
477
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="HYk-y9-XL5" id="aW5-RQ-Yo6">
478
+                                            <rect key="frame" x="0.0" y="0.0" width="375" height="100"/>
479
+                                            <autoresizingMask key="autoresizingMask"/>
480
+                                            <subviews>
481
+                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Station Logo" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3gT-GM-P7D">
482
+                                                    <rect key="frame" x="20" y="39" width="182" height="21"/>
483
+                                                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
484
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
485
+                                                    <nil key="highlightedColor"/>
486
+                                                </label>
487
+                                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="iTunesArtwork.png" translatesAutoresizingMaskIntoConstraints="NO" id="fPK-Oe-kwr">
488
+                                                    <rect key="frame" x="265" y="5.5" width="90" height="90"/>
489
+                                                    <constraints>
490
+                                                        <constraint firstAttribute="width" constant="90" id="4yu-NR-DLc"/>
491
+                                                    </constraints>
492
+                                                </imageView>
493
+                                                <button opaque="NO" contentMode="scaleAspectFit" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="KiY-QN-f1N">
494
+                                                    <rect key="frame" x="265" y="5" width="90" height="90"/>
495
+                                                    <constraints>
496
+                                                        <constraint firstAttribute="width" constant="90" id="tz6-Bf-Xqh"/>
497
+                                                    </constraints>
498
+                                                    <state key="normal">
499
+                                                        <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
500
+                                                    </state>
501
+                                                    <connections>
502
+                                                        <segue destination="Wgd-n4-RVK" kind="push" identifier="SelectImageSegue" id="E1n-DN-8wa"/>
503
+                                                    </connections>
504
+                                                </button>
505
+                                            </subviews>
506
+                                            <constraints>
507
+                                                <constraint firstAttribute="bottomMargin" secondItem="KiY-QN-f1N" secondAttribute="bottom" constant="-3" id="0R3-p7-3sE"/>
508
+                                                <constraint firstAttribute="trailingMargin" secondItem="fPK-Oe-kwr" secondAttribute="trailing" constant="12" id="1ea-f8-Zpm"/>
509
+                                                <constraint firstItem="fPK-Oe-kwr" firstAttribute="top" secondItem="aW5-RQ-Yo6" secondAttribute="topMargin" constant="-3" id="LNS-Hz-0MW"/>
510
+                                                <constraint firstItem="KiY-QN-f1N" firstAttribute="top" secondItem="aW5-RQ-Yo6" secondAttribute="topMargin" constant="-3" id="Q9s-bv-zYQ"/>
511
+                                                <constraint firstAttribute="trailingMargin" secondItem="KiY-QN-f1N" secondAttribute="trailing" constant="12" id="TLX-Ti-hGR"/>
512
+                                                <constraint firstAttribute="bottomMargin" secondItem="fPK-Oe-kwr" secondAttribute="bottom" constant="-3" id="vaA-HP-prM"/>
513
+                                            </constraints>
514
+                                        </tableViewCellContentView>
515
+                                    </tableViewCell>
516
+                                    <tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="eGK-Ru-Zgk">
517
+                                        <rect key="frame" x="0.0" y="342" width="375" height="44"/>
518
+                                        <autoresizingMask key="autoresizingMask"/>
519
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="eGK-Ru-Zgk" id="C2D-1u-xa6">
520
+                                            <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
521
+                                            <autoresizingMask key="autoresizingMask"/>
522
+                                            <subviews>
523
+                                                <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UE7-Hs-jbU">
524
+                                                    <rect key="frame" x="306" y="6" width="51" height="31"/>
525
+                                                    <constraints>
526
+                                                        <constraint firstAttribute="width" constant="49" id="T0H-kg-fD5"/>
527
+                                                    </constraints>
528
+                                                    <color key="onTintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
529
+                                                </switch>
530
+                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Try to get album covers" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fuZ-9n-TlA">
531
+                                                    <rect key="frame" x="20" y="11" width="223" height="21"/>
532
+                                                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
533
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
534
+                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
535
+                                                    <nil key="highlightedColor"/>
536
+                                                </label>
537
+                                            </subviews>
538
+                                            <constraints>
539
+                                                <constraint firstAttribute="trailingMargin" secondItem="UE7-Hs-jbU" secondAttribute="trailing" constant="12" id="1XM-bk-zfa"/>
540
+                                                <constraint firstAttribute="bottomMargin" secondItem="UE7-Hs-jbU" secondAttribute="bottom" constant="-1" id="YaE-Q5-SGJ"/>
541
+                                                <constraint firstItem="UE7-Hs-jbU" firstAttribute="top" secondItem="C2D-1u-xa6" secondAttribute="topMargin" constant="-2" id="l47-hl-Sn3"/>
542
+                                            </constraints>
543
+                                        </tableViewCellContentView>
544
+                                    </tableViewCell>
545
+                                    <tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="vOT-nT-ufU">
546
+                                        <rect key="frame" x="0.0" y="386" width="375" height="44"/>
547
+                                        <autoresizingMask key="autoresizingMask"/>
548
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="vOT-nT-ufU" id="P8v-sl-cY5">
549
+                                            <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
550
+                                            <autoresizingMask key="autoresizingMask"/>
551
+                                            <subviews>
552
+                                                <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="0zE-WC-GnI">
553
+                                                    <rect key="frame" x="306" y="6" width="51" height="31"/>
554
+                                                    <constraints>
555
+                                                        <constraint firstAttribute="width" constant="49" id="9yG-uj-kNI"/>
556
+                                                    </constraints>
557
+                                                    <color key="onTintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
558
+                                                </switch>
559
+                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Favorite" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XHR-it-Tty">
560
+                                                    <rect key="frame" x="20" y="11" width="223" height="21"/>
561
+                                                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
562
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
563
+                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
564
+                                                    <nil key="highlightedColor"/>
565
+                                                </label>
566
+                                            </subviews>
567
+                                            <constraints>
568
+                                                <constraint firstAttribute="bottomMargin" secondItem="0zE-WC-GnI" secondAttribute="bottom" constant="-1" id="3R9-b1-gvM"/>
569
+                                                <constraint firstAttribute="trailingMargin" secondItem="0zE-WC-GnI" secondAttribute="trailing" constant="12" id="EJ5-8g-xtW"/>
570
+                                                <constraint firstItem="0zE-WC-GnI" firstAttribute="top" secondItem="P8v-sl-cY5" secondAttribute="topMargin" constant="-2" id="hUU-gf-WS8"/>
571
+                                            </constraints>
572
+                                        </tableViewCellContentView>
573
+                                    </tableViewCell>
574
+                                </cells>
575
+                            </tableViewSection>
576
+                        </sections>
577
+                        <connections>
578
+                            <outlet property="dataSource" destination="e9y-J5-KjR" id="HB7-Sl-eVd"/>
579
+                            <outlet property="delegate" destination="e9y-J5-KjR" id="JGG-BI-QPS"/>
580
+                        </connections>
581
+                    </tableView>
582
+                    <navigationItem key="navigationItem" title="Add station" id="pZG-6F-jSC">
583
+                        <barButtonItem key="backBarButtonItem" title=" " id="3fI-h6-Mav"/>
584
+                        <barButtonItem key="leftBarButtonItem" systemItem="cancel" id="bg2-86-DMD">
585
+                            <connections>
586
+                                <action selector="cancel:" destination="e9y-J5-KjR" id="C4R-yk-Roz"/>
587
+                            </connections>
588
+                        </barButtonItem>
589
+                        <barButtonItem key="rightBarButtonItem" enabled="NO" systemItem="save" id="9iL-S9-kL0">
590
+                            <connections>
591
+                                <action selector="done:" destination="e9y-J5-KjR" id="iVP-VV-rcH"/>
592
+                            </connections>
593
+                        </barButtonItem>
594
+                    </navigationItem>
595
+                    <nil key="simulatedBottomBarMetrics"/>
596
+                    <connections>
597
+                        <outlet property="addToFavorites" destination="0zE-WC-GnI" id="4ca-iD-sMO"/>
598
+                        <outlet property="loadCover" destination="UE7-Hs-jbU" id="S0i-UP-fMn"/>
599
+                        <outlet property="nameField" destination="hRH-hQ-q8B" id="xXJ-sA-aog"/>
600
+                        <outlet property="saveButton" destination="9iL-S9-kL0" id="JDg-yp-E7J"/>
601
+                        <outlet property="stationImage" destination="fPK-Oe-kwr" id="Gyq-rM-XFe"/>
602
+                        <outlet property="urlField" destination="UeM-dm-3cy" id="t7I-sA-hte"/>
603
+                    </connections>
604
+                </tableViewController>
605
+                <placeholder placeholderIdentifier="IBFirstResponder" id="JUb-bc-5CQ" userLabel="First Responder" sceneMemberID="firstResponder"/>
606
+            </objects>
607
+            <point key="canvasLocation" x="4063" y="-589"/>
608
+        </scene>
609
+        <!--Navigation Controller-->
610
+        <scene sceneID="nxl-Yw-sXQ">
611
+            <objects>
612
+                <navigationController definesPresentationContext="YES" id="nSf-dz-c57" sceneMemberID="viewController">
613
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="Kai-4w-o2c">
614
+                        <rect key="frame" x="0.0" y="0.0" width="1000" height="1000"/>
615
+                        <autoresizingMask key="autoresizingMask"/>
616
+                        <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
617
+                    </navigationBar>
618
+                    <connections>
619
+                        <segue destination="e9y-J5-KjR" kind="relationship" relationship="rootViewController" id="7xO-Dx-Jf8"/>
620
+                    </connections>
621
+                </navigationController>
622
+                <placeholder placeholderIdentifier="IBFirstResponder" id="hdy-E3-T3B" userLabel="First Responder" sceneMemberID="firstResponder"/>
623
+            </objects>
624
+            <point key="canvasLocation" x="3598" y="-588"/>
625
+        </scene>
626
+        <!--Navigation Controller-->
627
+        <scene sceneID="Ngp-Nu-r1S">
628
+            <objects>
629
+                <navigationController definesPresentationContext="YES" id="24K-lw-Ee9" sceneMemberID="viewController">
630
+                    <tabBarItem key="tabBarItem" title="" systemItem="favorites" id="3PN-dq-roH"/>
631
+                    <navigationBar key="navigationBar" contentMode="scaleToFill" id="A8c-rC-VeH">
632
+                        <rect key="frame" x="0.0" y="0.0" width="1000" height="1000"/>
633
+                        <autoresizingMask key="autoresizingMask"/>
634
+                        <color key="tintColor" red="0.22095851600170135" green="0.57880532741546631" blue="0.12804426252841949" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
635
+                    </navigationBar>
636
+                    <connections>
637
+                        <segue destination="yjo-U8-5Yi" kind="relationship" relationship="rootViewController" id="tpO-em-HnY"/>
638
+                    </connections>
639
+                </navigationController>
640
+                <placeholder placeholderIdentifier="IBFirstResponder" id="CAW-Sa-p7q" userLabel="First Responder" sceneMemberID="firstResponder"/>
641
+            </objects>
642
+            <point key="canvasLocation" x="1924" y="96.999999999999957"/>
643
+        </scene>
644
+    </scenes>
645
+    <resources>
646
+        <image name="Play" width="50" height="50"/>
647
+        <image name="Radio" width="22" height="22"/>
648
+        <image name="Star-Full" width="30" height="30"/>
649
+        <image name="VolumeHigh" width="48" height="35"/>
650
+        <image name="VolumeLow" width="48" height="35"/>
651
+        <image name="iTunesArtwork.png" width="1024" height="1024"/>
652
+        <image name="iTunesEN" width="110" height="40"/>
653
+    </resources>
654
+    <simulatedMetricsContainer key="defaultSimulatedMetrics">
655
+        <simulatedStatusBarMetrics key="statusBar"/>
656
+        <simulatedOrientationMetrics key="orientation"/>
657
+        <simulatedScreenMetrics key="destination" type="retina4_7.fullscreen"/>
658
+    </simulatedMetricsContainer>
659
+    <inferredMetricsTieBreakers>
660
+        <segue reference="TKw-fG-hVW"/>
661
+        <segue reference="cLs-so-tvb"/>
662
+    </inferredMetricsTieBreakers>
663
+    <color key="tintColor" red="0.9570387601852417" green="0.056072905659675598" blue="0.26595255732536316" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
664
+</document>

+ 18
- 0
Radio/FavoritesViewController.h View File

@@ -0,0 +1,18 @@
1
+//
2
+//  FavoriteViewController.h
3
+//  Radio
4
+//
5
+//  Created by David Walter on 28.09.13.
6
+//  Copyright (c) 2013 David Walter. All rights reserved.
7
+//
8
+
9
+#import "RadioViewController.h"
10
+#import "AddStationViewController.h"
11
+
12
+@interface FavoritesViewController : UITableViewController
13
+{
14
+    NSMutableArray* arrayFavorites;
15
+    UIView* viewEmpty;
16
+}
17
+
18
+@end

+ 157
- 0
Radio/FavoritesViewController.m View File

@@ -0,0 +1,157 @@
1
+//
2
+//  FavoriteViewController.m
3
+//  Radio
4
+//
5
+//  Created by David Walter on 28.09.13.
6
+//  Copyright (c) 2013 David Walter. All rights reserved.
7
+//
8
+
9
+#import "FavoritesViewController.h"
10
+
11
+@interface FavoritesViewController ()
12
+
13
+@end
14
+
15
+@implementation FavoritesViewController
16
+
17
+- (id)initWithStyle:(UITableViewStyle)style
18
+{
19
+    self = [super initWithStyle:style];
20
+    if (self) {
21
+        // Custom initialization
22
+    }
23
+    return self;
24
+}
25
+
26
+- (void)viewDidLoad
27
+{
28
+    [super viewDidLoad];
29
+    
30
+    CGSize size = [[UIScreen mainScreen] bounds].size;
31
+    
32
+    viewEmpty = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
33
+    [viewEmpty setBackgroundColor:[UIColor colorWithRed:0.85 green:0.85 blue:0.85 alpha:1]];
34
+    
35
+    UILabel* header = [[UILabel alloc] initWithFrame:CGRectMake(0, (size.width - 65) / 2, size.width, 65)];
36
+    [header setTextAlignment:NSTextAlignmentCenter];
37
+    [header setTextColor:[UIColor darkGrayColor]];
38
+    [header setFont:[UIFont systemFontOfSize:35]];
39
+    [header setText:NSLocalizedString(@"No favorites", nil)];
40
+    [viewEmpty addSubview:header];
41
+}
42
+
43
+- (void)viewWillAppear:(BOOL)animated
44
+{
45
+    arrayFavorites = [NSMutableArray arrayWithArray:[RadioProperties favorites]];
46
+    
47
+    // Enable Now Playing if currentStation is not empty
48
+    [self.navigationItem.rightBarButtonItem setEnabled:([RadioProperties currentStation] != nil)];
49
+    
50
+    if (arrayFavorites.count < 1) {
51
+        // While having no favorites display the empty view
52
+        [[self tableView] setScrollEnabled:NO];
53
+        [[self navigationItem] setLeftBarButtonItem:nil animated:NO];
54
+        [[self view] addSubview:viewEmpty];
55
+    } else {
56
+        // Remove empty view if necessary
57
+        [viewEmpty removeFromSuperview];
58
+        [[self tableView] setScrollEnabled:YES];
59
+        [[self navigationItem] setLeftBarButtonItem:self.editButtonItem animated:NO];
60
+    }
61
+    
62
+    [[self tableView] reloadData];
63
+}
64
+
65
+#pragma mark - Table view data source
66
+
67
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
68
+{
69
+    return 1;
70
+}
71
+
72
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
73
+{
74
+    return [arrayFavorites count];
75
+}
76
+
77
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
78
+{
79
+    static NSString *CellIdentifier = @"FavCell";
80
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
81
+    
82
+    NSDictionary* dict = [arrayFavorites objectAtIndex:[indexPath row]];
83
+    
84
+    [[cell textLabel] setText:[dict objectForKey:@"name"]];
85
+    [[cell imageView] setImage:[RadioProperties getStationLogo:dict]];
86
+    
87
+    return cell;
88
+}
89
+
90
+- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
91
+{
92
+    return YES;
93
+}
94
+
95
+#pragma mark - Table view delegate
96
+
97
+- (void)setEditing:(BOOL)editing animated:(BOOL)animated
98
+{
99
+    [super setEditing:editing animated:animated];
100
+}
101
+
102
+- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
103
+{
104
+    if (editingStyle == UITableViewCellEditingStyleDelete) {
105
+        /* Row at indexPath was deleted
106
+         * Remove deleted item from favorites
107
+         * and display empty view if favorites are empty
108
+         */
109
+        [arrayFavorites removeObjectAtIndex:[indexPath row]];
110
+        [RadioProperties setFavorites:arrayFavorites];
111
+        
112
+        if (arrayFavorites.count < 1) {
113
+            // When no favorites left display empty view
114
+            [[self tableView] setScrollEnabled:NO];
115
+            [[self navigationItem] setLeftBarButtonItem:nil animated:YES];
116
+            [[self view] addSubview:viewEmpty];
117
+        }
118
+        
119
+        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
120
+    }
121
+}
122
+
123
+- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
124
+{
125
+    [arrayFavorites exchangeObjectAtIndex:[fromIndexPath row] withObjectAtIndex:[toIndexPath row]];
126
+    [RadioProperties setFavorites:arrayFavorites];
127
+}
128
+
129
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
130
+{
131
+    NSDictionary* dict = [arrayFavorites objectAtIndex:[indexPath row]];
132
+    
133
+    [RadioProperties setCurrentStation:dict];
134
+    
135
+    [tableView deselectRowAtIndexPath:indexPath animated:YES];
136
+    
137
+    // Switch to NowPlaying view
138
+    [self performSegueWithIdentifier:@"NowPlaying" sender:self];
139
+}
140
+
141
+- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
142
+{
143
+    NSDictionary* dict = [arrayFavorites objectAtIndex:[indexPath row]];
144
+    [self performSegueWithIdentifier:@"EditFavorite" sender:dict];
145
+}
146
+
147
+#pragma mark - Navigation
148
+
149
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
150
+{
151
+    if ([[segue identifier] isEqualToString:@"EditFavorite"])
152
+    {
153
+        [RadioProperties setEditStation:sender];
154
+    }
155
+}
156
+
157
+@end

+ 26
- 0
Radio/GenreViewController.h View File

@@ -0,0 +1,26 @@
1
+//
2
+//  GenreViewController.h
3
+//  Radio
4
+//
5
+//  Created by David Walter on 08.10.13.
6
+//  Copyright (c) 2013 David Walter. All rights reserved.
7
+//
8
+
9
+#import <UIKit/UIKit.h>
10
+
11
+@interface GenreViewController : UITableViewController<UISearchBarDelegate>
12
+{
13
+    RadioDB* radio;
14
+    NSMutableArray* arrayStations;
15
+    
16
+    UIView* viewEmpty;