From c2dc551eec6aadea5956c495d298012294ca311d Mon Sep 17 00:00:00 2001 From: Okechi Date: Thu, 28 Jan 2016 05:44:20 -0500 Subject: [PATCH] "Initial" --- GetHip.xcodeproj/project.pbxproj | 1015 +++++++++++++++++ .../contents.xcworkspacedata | 7 + GetHip/AppDelegate.swift | 136 +++ GetHip/Base.lproj/LaunchScreen.xib | 17 + GetHip/Bridging-Header.h | 35 + GetHip/FriendData.swift | 19 + GetHip/FriendDataSource.swift | 65 ++ GetHip/FriendsCell.swift | 24 + GetHip/FriendsListViewController.swift | 105 ++ GetHip/GetHip.xcdatamodeld/.xccurrentversion | 8 + .../GetHip.xcdatamodel/contents | 4 + GetHip/HomeScreenViewController.swift | 101 ++ .../Image.imageset/Contents.json | 20 + .../LaunchImage.launchimage/Contents.json | 21 + .../Images-3.xcassets/Image.imageset/1x.png | Bin 0 -> 16387 bytes .../Images-3.xcassets/Image.imageset/2x.png | Bin 0 -> 39920 bytes .../Images-3.xcassets/Image.imageset/3x.png | Bin 0 -> 74219 bytes .../Image.imageset/Contents.json | 23 + .../LaunchImage.launchimage/1x-1.png | Bin 0 -> 29971 bytes .../LaunchImage.launchimage/1x.png | Bin 0 -> 32485 bytes .../LaunchImage.launchimage/Contents.json | 25 + .../AppIcon.appiconset/Contents.json | 38 + GetHip/Info.plist | 53 + GetHip/InviteFriendCell.swift | 35 + GetHip/InviteFriendsView.swift | 116 ++ GetHip/LoginViewController.swift | 52 + GetHip/Main.storyboard | 183 +++ GetHip/ParseNetDebug.h | 25 + GetHip/ParseNetDebug.m | 29 + GetHip/PartyServiceManager.swift | 233 ++++ GetHip/PartySession.swift | 41 + GetHip/PartySessionManager.swift | 9 + GetHip/SettingsCellWrapper.swift | 66 ++ GetHip/SettingsDetailViewWrapper.swift | 213 ++++ GetHip/SettingsTableViewController.swift | 280 +++++ GetHip/SignUpViewController.swift | 29 + GetHip/SongCellWrapper.swift | 70 ++ GetHip/SongSelectionViewController.swift | 226 ++++ GetHip/TestInviteFriendsCell.swift | 36 + GetHip/TestInviteFriendsController.swift | 187 +++ GetHip/UserParseData.swift | 27 + GetHip/UserParseDataSource.swift | 64 ++ GetHip/ViewController.swift | 69 ++ GetHipTests/GetHipTests.swift | 36 + GetHipTests/Info.plist | 24 + 45 files changed, 3766 insertions(+) create mode 100644 GetHip.xcodeproj/project.pbxproj create mode 100644 GetHip.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 GetHip/AppDelegate.swift create mode 100644 GetHip/Base.lproj/LaunchScreen.xib create mode 100644 GetHip/Bridging-Header.h create mode 100644 GetHip/FriendData.swift create mode 100644 GetHip/FriendDataSource.swift create mode 100644 GetHip/FriendsCell.swift create mode 100644 GetHip/FriendsListViewController.swift create mode 100644 GetHip/GetHip.xcdatamodeld/.xccurrentversion create mode 100644 GetHip/GetHip.xcdatamodeld/GetHip.xcdatamodel/contents create mode 100644 GetHip/HomeScreenViewController.swift create mode 100644 GetHip/Images-2.xcassets/Image.imageset/Contents.json create mode 100644 GetHip/Images-2.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 GetHip/Images-3.xcassets/Image.imageset/1x.png create mode 100644 GetHip/Images-3.xcassets/Image.imageset/2x.png create mode 100644 GetHip/Images-3.xcassets/Image.imageset/3x.png create mode 100644 GetHip/Images-3.xcassets/Image.imageset/Contents.json create mode 100644 GetHip/Images-3.xcassets/LaunchImage.launchimage/1x-1.png create mode 100644 GetHip/Images-3.xcassets/LaunchImage.launchimage/1x.png create mode 100644 GetHip/Images-3.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 GetHip/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 GetHip/Info.plist create mode 100644 GetHip/InviteFriendCell.swift create mode 100644 GetHip/InviteFriendsView.swift create mode 100644 GetHip/LoginViewController.swift create mode 100644 GetHip/Main.storyboard create mode 100644 GetHip/ParseNetDebug.h create mode 100644 GetHip/ParseNetDebug.m create mode 100644 GetHip/PartyServiceManager.swift create mode 100644 GetHip/PartySession.swift create mode 100644 GetHip/PartySessionManager.swift create mode 100644 GetHip/SettingsCellWrapper.swift create mode 100644 GetHip/SettingsDetailViewWrapper.swift create mode 100644 GetHip/SettingsTableViewController.swift create mode 100644 GetHip/SignUpViewController.swift create mode 100644 GetHip/SongCellWrapper.swift create mode 100644 GetHip/SongSelectionViewController.swift create mode 100644 GetHip/TestInviteFriendsCell.swift create mode 100644 GetHip/TestInviteFriendsController.swift create mode 100644 GetHip/UserParseData.swift create mode 100644 GetHip/UserParseDataSource.swift create mode 100644 GetHip/ViewController.swift create mode 100644 GetHipTests/GetHipTests.swift create mode 100644 GetHipTests/Info.plist diff --git a/GetHip.xcodeproj/project.pbxproj b/GetHip.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f215a76 --- /dev/null +++ b/GetHip.xcodeproj/project.pbxproj @@ -0,0 +1,1015 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 3E101F061C52E5FD00C895CA /* MultipeerConnectivity.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E101F051C52E5FD00C895CA /* MultipeerConnectivity.framework */; }; + 3E101F081C52E65300C895CA /* PartyServiceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E101F071C52E65300C895CA /* PartyServiceManager.swift */; }; + 3E101F0A1C52F14A00C895CA /* InviteFriendsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E101F091C52F14A00C895CA /* InviteFriendsView.swift */; }; + 3E18D4931C51F6230012F7DF /* UserParseData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E18D4921C51F6230012F7DF /* UserParseData.swift */; }; + 3E18D4951C51FAC60012F7DF /* UserParseDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E18D4941C51FAC60012F7DF /* UserParseDataSource.swift */; }; + 3E1AAD141C3BD92600809367 /* FriendsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1AAD131C3BD92600809367 /* FriendsListViewController.swift */; }; + 3E1B5E451C5274E700D1AB62 /* SettingsDetailViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1B5E441C5274E700D1AB62 /* SettingsDetailViewWrapper.swift */; }; + 3E1BDA521C37111D00EE3B84 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1BDA511C37111D00EE3B84 /* AppDelegate.swift */; }; + 3E1BDA551C37111D00EE3B84 /* GetHip.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 3E1BDA531C37111D00EE3B84 /* GetHip.xcdatamodeld */; }; + 3E1BDA571C37111D00EE3B84 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1BDA561C37111D00EE3B84 /* ViewController.swift */; }; + 3E1BDA5F1C37111D00EE3B84 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3E1BDA5D1C37111D00EE3B84 /* LaunchScreen.xib */; }; + 3E1BDA6B1C37111D00EE3B84 /* GetHipTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1BDA6A1C37111D00EE3B84 /* GetHipTests.swift */; }; + 3E1DE9A81C3837E800CA6CD4 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E1DE9A71C3837E800CA6CD4 /* AudioToolbox.framework */; }; + 3E1DE9AE1C38395F00CA6CD4 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E1DE9AD1C38395F00CA6CD4 /* SystemConfiguration.framework */; }; + 3E326BCC1C51C20000F785CF /* SettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E326BCB1C51C20000F785CF /* SettingsTableViewController.swift */; }; + 3E326BCE1C51C77600F785CF /* SettingsCellWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E326BCD1C51C77600F785CF /* SettingsCellWrapper.swift */; }; + 3E330B1A1C38502F00276FE4 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E330B191C38502F00276FE4 /* LoginViewController.swift */; }; + 3E3412571C54C31F006226E0 /* SongSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E3412561C54C31F006226E0 /* SongSelectionViewController.swift */; }; + 3E3412591C54C6B7006226E0 /* SongCellWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E3412581C54C6B7006226E0 /* SongCellWrapper.swift */; }; + 3E34125B1C54C73A006226E0 /* PartySession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E34125A1C54C73A006226E0 /* PartySession.swift */; }; + 3E34125D1C54CF1B006226E0 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E34125C1C54CF1B006226E0 /* MediaPlayer.framework */; }; + 3E379EF61C3E646000F7BCCD /* ParseNetDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E379EF51C3E646000F7BCCD /* ParseNetDebug.m */; }; + 3E379EF71C3F794500F7BCCD /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E76CF2D1C3835C500193B58 /* CFNetwork.framework */; }; + 3E379EFE1C3F794500F7BCCD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E379EF81C3F794500F7BCCD /* CoreGraphics.framework */; }; + 3E379EFF1C3F794500F7BCCD /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E379EF91C3F794500F7BCCD /* CoreLocation.framework */; }; + 3E379F001C3F794500F7BCCD /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E379EFA1C3F794500F7BCCD /* MobileCoreServices.framework */; }; + 3E379F011C3F794500F7BCCD /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E379EFB1C3F794500F7BCCD /* QuartzCore.framework */; }; + 3E379F021C3F794500F7BCCD /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E379EFC1C3F794500F7BCCD /* Security.framework */; }; + 3E379F031C3F794500F7BCCD /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E379EFD1C3F794500F7BCCD /* StoreKit.framework */; }; + 3E379F051C3F982900F7BCCD /* FriendsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E379F041C3F982900F7BCCD /* FriendsCell.swift */; }; + 3E4169491C385F1000B193AF /* 1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E4169481C385F1000B193AF /* 1x.png */; }; + 3E4169551C398A5B00B193AF /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E4169541C398A5B00B193AF /* SignUpViewController.swift */; }; + 3E4169571C399C4D00B193AF /* Images-3.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3E4169561C399C4D00B193AF /* Images-3.xcassets */; }; + 3E438ADE1C572DFD0055C97A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3E438ADD1C572DFD0055C97A /* Main.storyboard */; }; + 3E438AE61C5738EF0055C97A /* Create@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E438AE11C5738EF0055C97A /* Create@2x.png */; }; + 3E438AE71C5738EF0055C97A /* Friends@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E438AE21C5738EF0055C97A /* Friends@2x.png */; }; + 3E438AE81C5738EF0055C97A /* Settings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E438AE31C5738EF0055C97A /* Settings@2x.png */; }; + 3E438AE91C5738EF0055C97A /* Star@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E438AE41C5738EF0055C97A /* Star@2x.png */; }; + 3E438AEA1C5738EF0055C97A /* Turntable@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E438AE51C5738EF0055C97A /* Turntable@2x.png */; }; + 3E43B8C91C37639C002F97A7 /* FBSDKCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E1BDA751C3713F900EE3B84 /* FBSDKCoreKit.framework */; }; + 3E43B8CA1C37639C002F97A7 /* FBSDKLoginKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E43B8C51C375E73002F97A7 /* FBSDKLoginKit.framework */; }; + 3E43B8CF1C376F9F002F97A7 /* Logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E43B8CE1C376F9F002F97A7 /* Logo.png */; }; + 3E5952631C39DBC900C88C71 /* Friends.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59525A1C39DBC900C88C71 /* Friends.png */; }; + 3E5952641C39DBC900C88C71 /* Friends@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59525B1C39DBC900C88C71 /* Friends@2x.png */; }; + 3E5952651C39DBC900C88C71 /* Friends@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59525C1C39DBC900C88C71 /* Friends@3x.png */; }; + 3E5952661C39DBC900C88C71 /* Settings.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59525D1C39DBC900C88C71 /* Settings.png */; }; + 3E5952671C39DBC900C88C71 /* Settings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59525E1C39DBC900C88C71 /* Settings@2x.png */; }; + 3E5952681C39DBC900C88C71 /* Settings@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59525F1C39DBC900C88C71 /* Settings@3x.png */; }; + 3E5952691C39DBC900C88C71 /* Star.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952601C39DBC900C88C71 /* Star.png */; }; + 3E59526A1C39DBC900C88C71 /* Star@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952611C39DBC900C88C71 /* Star@2x.png */; }; + 3E59526B1C39DBC900C88C71 /* Star@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952621C39DBC900C88C71 /* Star@3x.png */; }; + 3E59526F1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59526C1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2.png */; }; + 3E5952701C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59526D1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@2x.png */; }; + 3E5952711C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59526E1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@3x.png */; }; + 3E59527B1C39DDA800C88C71 /* Create.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952721C39DDA800C88C71 /* Create.png */; }; + 3E59527C1C39DDA800C88C71 /* Create@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952731C39DDA800C88C71 /* Create@2x.png */; }; + 3E59527D1C39DDA800C88C71 /* Create@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952741C39DDA800C88C71 /* Create@3x.png */; }; + 3E59527E1C39DDA800C88C71 /* Group.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952751C39DDA800C88C71 /* Group.png */; }; + 3E59527F1C39DDA800C88C71 /* Group@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952761C39DDA800C88C71 /* Group@2x.png */; }; + 3E5952801C39DDA800C88C71 /* Group@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952771C39DDA800C88C71 /* Group@3x.png */; }; + 3E5952811C39DDA800C88C71 /* Settings.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952781C39DDA800C88C71 /* Settings.png */; }; + 3E5952821C39DDA800C88C71 /* Settings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952791C39DDA800C88C71 /* Settings@2x.png */; }; + 3E5952831C39DDA800C88C71 /* Settings@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E59527A1C39DDA800C88C71 /* Settings@3x.png */; }; + 3E5952851C39E54A00C88C71 /* HomeScreenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E5952841C39E54A00C88C71 /* HomeScreenViewController.swift */; }; + 3E5952891C39EB6100C88C71 /* Turntable.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952861C39EB6100C88C71 /* Turntable.png */; }; + 3E59528A1C39EB6100C88C71 /* Turntable@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952871C39EB6100C88C71 /* Turntable@2x.png */; }; + 3E59528B1C39EB6100C88C71 /* Turntable@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E5952881C39EB6100C88C71 /* Turntable@3x.png */; }; + 3E627FC31C55978E005C0372 /* PartySessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FC21C55978E005C0372 /* PartySessionManager.swift */; }; + 3E627FE61C55AE35005C0372 /* NSInputStream+URLInitialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FC81C55AE35005C0372 /* NSInputStream+URLInitialization.m */; }; + 3E627FE71C55AE35005C0372 /* NSMutableArray+QueueMethods.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FCA1C55AE35005C0372 /* NSMutableArray+QueueMethods.m */; }; + 3E627FE81C55AE35005C0372 /* TDAudioMetaInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FCD1C55AE35005C0372 /* TDAudioMetaInfo.m */; }; + 3E627FE91C55AE35005C0372 /* TDAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FCF1C55AE35005C0372 /* TDAudioPlayer.m */; }; + 3E627FEA1C55AE35005C0372 /* TDAudioFileStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FD31C55AE35005C0372 /* TDAudioFileStream.m */; }; + 3E627FEB1C55AE35005C0372 /* TDAudioQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FD51C55AE35005C0372 /* TDAudioQueue.m */; }; + 3E627FEC1C55AE35005C0372 /* TDAudioQueueBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FD71C55AE35005C0372 /* TDAudioQueueBuffer.m */; }; + 3E627FED1C55AE35005C0372 /* TDAudioQueueBufferManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FD91C55AE35005C0372 /* TDAudioQueueBufferManager.m */; }; + 3E627FEE1C55AE35005C0372 /* TDAudioQueueController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FDB1C55AE35005C0372 /* TDAudioQueueController.m */; }; + 3E627FEF1C55AE35005C0372 /* TDAudioQueueFiller.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FDD1C55AE35005C0372 /* TDAudioQueueFiller.m */; }; + 3E627FF01C55AE35005C0372 /* TDAudioStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FDF1C55AE35005C0372 /* TDAudioStream.m */; }; + 3E627FF11C55AE35005C0372 /* TDAudioInputStreamer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FE11C55AE35005C0372 /* TDAudioInputStreamer.m */; }; + 3E627FF21C55AE35005C0372 /* TDAudioOutputStreamer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FE31C55AE35005C0372 /* TDAudioOutputStreamer.m */; }; + 3E627FF31C55AE35005C0372 /* TDAudioPlayerConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E627FE51C55AE35005C0372 /* TDAudioPlayerConstants.m */; }; + 3E76CF261C38258600193B58 /* Parse.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E76CF231C38258600193B58 /* Parse.framework */; }; + 3E76CF271C38258600193B58 /* ParseFacebookUtilsV4.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E76CF241C38258600193B58 /* ParseFacebookUtilsV4.framework */; }; + 3E76CF281C38258600193B58 /* ParseUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E76CF251C38258600193B58 /* ParseUI.framework */; }; + 3E76CF2A1C38318200193B58 /* Bolts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E76CF291C38318200193B58 /* Bolts.framework */; }; + 3E76CF2C1C38349D00193B58 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E76CF2B1C38349D00193B58 /* libsqlite3.dylib */; }; + 3EBE97661C53CEDA0079B54A /* Send Invites Button.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EBE97651C53CEDA0079B54A /* Send Invites Button.png */; }; + 3EBE976A1C53E4290079B54A /* Blue Check.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EBE97671C53E4290079B54A /* Blue Check.png */; }; + 3EBE976B1C53E4290079B54A /* cross.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EBE97681C53E4290079B54A /* cross.png */; }; + 3EBE976C1C53E4290079B54A /* Tap Circle.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EBE97691C53E4290079B54A /* Tap Circle.png */; }; + 3EBE976F1C53E6950079B54A /* InviteFriendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EBE976E1C53E6950079B54A /* InviteFriendCell.swift */; }; + 3EBE97711C540BB80079B54A /* TestInviteFriendsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EBE97701C540BB80079B54A /* TestInviteFriendsController.swift */; }; + 3EBE97731C5413240079B54A /* TestInviteFriendsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EBE97721C5413240079B54A /* TestInviteFriendsCell.swift */; }; + 3EDA82E11C473E900081ED53 /* FriendData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDA82E01C473E900081ED53 /* FriendData.swift */; }; + 3EDA82E31C4741C70081ED53 /* FriendDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDA82E21C4741C70081ED53 /* FriendDataSource.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 3E1BDA651C37111D00EE3B84 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3E1BDA441C37111D00EE3B84 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3E1BDA4B1C37111D00EE3B84; + remoteInfo = GetHip; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 3E101F051C52E5FD00C895CA /* MultipeerConnectivity.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MultipeerConnectivity.framework; path = System/Library/Frameworks/MultipeerConnectivity.framework; sourceTree = SDKROOT; }; + 3E101F071C52E65300C895CA /* PartyServiceManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PartyServiceManager.swift; sourceTree = ""; }; + 3E101F091C52F14A00C895CA /* InviteFriendsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteFriendsView.swift; sourceTree = ""; }; + 3E18D4921C51F6230012F7DF /* UserParseData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserParseData.swift; sourceTree = ""; }; + 3E18D4941C51FAC60012F7DF /* UserParseDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserParseDataSource.swift; sourceTree = ""; }; + 3E1AAD131C3BD92600809367 /* FriendsListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendsListViewController.swift; sourceTree = ""; }; + 3E1B5E441C5274E700D1AB62 /* SettingsDetailViewWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsDetailViewWrapper.swift; sourceTree = ""; }; + 3E1BDA4C1C37111D00EE3B84 /* GetHip.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GetHip.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E1BDA501C37111D00EE3B84 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3E1BDA511C37111D00EE3B84 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 3E1BDA541C37111D00EE3B84 /* GetHip.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = GetHip.xcdatamodel; sourceTree = ""; }; + 3E1BDA561C37111D00EE3B84 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 3E1BDA5E1C37111D00EE3B84 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 3E1BDA641C37111D00EE3B84 /* GetHipTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GetHipTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E1BDA691C37111D00EE3B84 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3E1BDA6A1C37111D00EE3B84 /* GetHipTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetHipTests.swift; sourceTree = ""; }; + 3E1BDA751C3713F900EE3B84 /* FBSDKCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FBSDKCoreKit.framework; path = ../../FacebookSDK/FBSDKCoreKit.framework; sourceTree = ""; }; + 3E1DE9A51C38373700CA6CD4 /* libstdc++.6.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.6.dylib"; path = "usr/lib/libstdc++.6.dylib"; sourceTree = SDKROOT; }; + 3E1DE9A71C3837E800CA6CD4 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 3E1DE9AB1C3838A800CA6CD4 /* libsystem_network.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsystem_network.dylib; path = usr/lib/system/libsystem_network.dylib; sourceTree = SDKROOT; }; + 3E1DE9AD1C38395F00CA6CD4 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 3E326BCB1C51C20000F785CF /* SettingsTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsTableViewController.swift; sourceTree = ""; }; + 3E326BCD1C51C77600F785CF /* SettingsCellWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsCellWrapper.swift; sourceTree = ""; }; + 3E330B191C38502F00276FE4 /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + 3E3412561C54C31F006226E0 /* SongSelectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SongSelectionViewController.swift; sourceTree = ""; }; + 3E3412581C54C6B7006226E0 /* SongCellWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SongCellWrapper.swift; sourceTree = ""; }; + 3E34125A1C54C73A006226E0 /* PartySession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PartySession.swift; sourceTree = ""; }; + 3E34125C1C54CF1B006226E0 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; + 3E379EF51C3E646000F7BCCD /* ParseNetDebug.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ParseNetDebug.m; sourceTree = ""; }; + 3E379EF81C3F794500F7BCCD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 3E379EF91C3F794500F7BCCD /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 3E379EFA1C3F794500F7BCCD /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + 3E379EFB1C3F794500F7BCCD /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 3E379EFC1C3F794500F7BCCD /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + 3E379EFD1C3F794500F7BCCD /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; + 3E379F041C3F982900F7BCCD /* FriendsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendsCell.swift; sourceTree = ""; }; + 3E3842E11C3E15DE005DD1FB /* ParseNetDebug.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseNetDebug.h; sourceTree = ""; }; + 3E4169481C385F1000B193AF /* 1x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = 1x.png; path = "../../../Dropbox/Gethip/Screens/Logo Screen/6 Logo Screen/1x.png"; sourceTree = ""; }; + 3E4169541C398A5B00B193AF /* SignUpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignUpViewController.swift; sourceTree = ""; }; + 3E4169561C399C4D00B193AF /* Images-3.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Images-3.xcassets"; sourceTree = ""; }; + 3E438ADD1C572DFD0055C97A /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 3E438AE11C5738EF0055C97A /* Create@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Create@2x.png"; path = "../../../Dropbox/Gethip/Screens/iPhone 5 Home/Icon Assets/Create@2x.png"; sourceTree = ""; }; + 3E438AE21C5738EF0055C97A /* Friends@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Friends@2x.png"; path = "../../../Dropbox/Gethip/Screens/iPhone 5 Home/Icon Assets/Friends@2x.png"; sourceTree = ""; }; + 3E438AE31C5738EF0055C97A /* Settings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Settings@2x.png"; path = "../../../Dropbox/Gethip/Screens/iPhone 5 Home/Icon Assets/Settings@2x.png"; sourceTree = ""; }; + 3E438AE41C5738EF0055C97A /* Star@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Star@2x.png"; path = "../../../Dropbox/Gethip/Screens/iPhone 5 Home/Icon Assets/Star@2x.png"; sourceTree = ""; }; + 3E438AE51C5738EF0055C97A /* Turntable@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Turntable@2x.png"; path = "../../../Dropbox/Gethip/Screens/iPhone 5 Home/Icon Assets/Turntable@2x.png"; sourceTree = ""; }; + 3E43B8C31C375ADE002F97A7 /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = ""; }; + 3E43B8C41C375E73002F97A7 /* Bolts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Bolts.framework; path = ../../FacebookSDK/Bolts.framework; sourceTree = ""; }; + 3E43B8C51C375E73002F97A7 /* FBSDKLoginKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FBSDKLoginKit.framework; path = ../../FacebookSDK/FBSDKLoginKit.framework; sourceTree = ""; }; + 3E43B8CE1C376F9F002F97A7 /* Logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Logo.png; path = "../../../Dropbox/gethip/Screens/6 Login/Assets/Logo.png"; sourceTree = ""; }; + 3E59525A1C39DBC900C88C71 /* Friends.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Friends.png; path = "../Get Hip/Get Hip/Assets/Friends.png"; sourceTree = ""; }; + 3E59525B1C39DBC900C88C71 /* Friends@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Friends@2x.png"; path = "../Get Hip/Get Hip/Assets/Friends@2x.png"; sourceTree = ""; }; + 3E59525C1C39DBC900C88C71 /* Friends@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Friends@3x.png"; path = "../Get Hip/Get Hip/Assets/Friends@3x.png"; sourceTree = ""; }; + 3E59525D1C39DBC900C88C71 /* Settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Settings.png; path = "../Get Hip/Get Hip/Assets/Settings.png"; sourceTree = ""; }; + 3E59525E1C39DBC900C88C71 /* Settings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Settings@2x.png"; path = "../Get Hip/Get Hip/Assets/Settings@2x.png"; sourceTree = ""; }; + 3E59525F1C39DBC900C88C71 /* Settings@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Settings@3x.png"; path = "../Get Hip/Get Hip/Assets/Settings@3x.png"; sourceTree = ""; }; + 3E5952601C39DBC900C88C71 /* Star.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Star.png; path = "../Get Hip/Get Hip/Assets/Star.png"; sourceTree = ""; }; + 3E5952611C39DBC900C88C71 /* Star@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Star@2x.png"; path = "../Get Hip/Get Hip/Assets/Star@2x.png"; sourceTree = ""; }; + 3E5952621C39DBC900C88C71 /* Star@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Star@3x.png"; path = "../Get Hip/Get Hip/Assets/Star@3x.png"; sourceTree = ""; }; + 3E59526C1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2.png"; path = "../../../Dropbox/Gethip/Screens/6 Back to Party/6 Back to Party/Asset/Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2.png"; sourceTree = ""; }; + 3E59526D1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@2x.png"; path = "../../../Dropbox/Gethip/Screens/6 Back to Party/6 Back to Party/Asset/Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@2x.png"; sourceTree = ""; }; + 3E59526E1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@3x.png"; path = "../../../Dropbox/Gethip/Screens/6 Back to Party/6 Back to Party/Asset/Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@3x.png"; sourceTree = ""; }; + 3E5952721C39DDA800C88C71 /* Create.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Create.png; path = "../../../Dropbox/Gethip/Screens/6 Home Screen/Assets/Create.png"; sourceTree = ""; }; + 3E5952731C39DDA800C88C71 /* Create@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Create@2x.png"; path = "../../../Dropbox/Gethip/Screens/6 Home Screen/Assets/Create@2x.png"; sourceTree = ""; }; + 3E5952741C39DDA800C88C71 /* Create@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Create@3x.png"; path = "../../../Dropbox/Gethip/Screens/6 Home Screen/Assets/Create@3x.png"; sourceTree = ""; }; + 3E5952751C39DDA800C88C71 /* Group.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Group.png; path = "../../../Dropbox/Gethip/Screens/6 Home Screen/Assets/Group.png"; sourceTree = ""; }; + 3E5952761C39DDA800C88C71 /* Group@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Group@2x.png"; path = "../../../Dropbox/Gethip/Screens/6 Home Screen/Assets/Group@2x.png"; sourceTree = ""; }; + 3E5952771C39DDA800C88C71 /* Group@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Group@3x.png"; path = "../../../Dropbox/Gethip/Screens/6 Home Screen/Assets/Group@3x.png"; sourceTree = ""; }; + 3E5952781C39DDA800C88C71 /* Settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Settings.png; path = "../../../Dropbox/Gethip/Screens/6 Home Screen/Assets/Settings.png"; sourceTree = ""; }; + 3E5952791C39DDA800C88C71 /* Settings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Settings@2x.png"; path = "../../../Dropbox/Gethip/Screens/6 Home Screen/Assets/Settings@2x.png"; sourceTree = ""; }; + 3E59527A1C39DDA800C88C71 /* Settings@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Settings@3x.png"; path = "../../../Dropbox/Gethip/Screens/6 Home Screen/Assets/Settings@3x.png"; sourceTree = ""; }; + 3E5952841C39E54A00C88C71 /* HomeScreenViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeScreenViewController.swift; sourceTree = ""; }; + 3E5952861C39EB6100C88C71 /* Turntable.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Turntable.png; path = "../Get Hip/Get Hip/Assets/Turntable.png"; sourceTree = ""; }; + 3E5952871C39EB6100C88C71 /* Turntable@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Turntable@2x.png"; path = "../Get Hip/Get Hip/Assets/Turntable@2x.png"; sourceTree = ""; }; + 3E5952881C39EB6100C88C71 /* Turntable@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Turntable@3x.png"; path = "../Get Hip/Get Hip/Assets/Turntable@3x.png"; sourceTree = ""; }; + 3E627FC21C55978E005C0372 /* PartySessionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PartySessionManager.swift; sourceTree = ""; }; + 3E627FC71C55AE35005C0372 /* NSInputStream+URLInitialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSInputStream+URLInitialization.h"; sourceTree = ""; }; + 3E627FC81C55AE35005C0372 /* NSInputStream+URLInitialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSInputStream+URLInitialization.m"; sourceTree = ""; }; + 3E627FC91C55AE35005C0372 /* NSMutableArray+QueueMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+QueueMethods.h"; sourceTree = ""; }; + 3E627FCA1C55AE35005C0372 /* NSMutableArray+QueueMethods.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+QueueMethods.m"; sourceTree = ""; }; + 3E627FCC1C55AE35005C0372 /* TDAudioMetaInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioMetaInfo.h; sourceTree = ""; }; + 3E627FCD1C55AE35005C0372 /* TDAudioMetaInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioMetaInfo.m; sourceTree = ""; }; + 3E627FCE1C55AE35005C0372 /* TDAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioPlayer.h; sourceTree = ""; }; + 3E627FCF1C55AE35005C0372 /* TDAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioPlayer.m; sourceTree = ""; }; + 3E627FD21C55AE35005C0372 /* TDAudioFileStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioFileStream.h; sourceTree = ""; }; + 3E627FD31C55AE35005C0372 /* TDAudioFileStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioFileStream.m; sourceTree = ""; }; + 3E627FD41C55AE35005C0372 /* TDAudioQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioQueue.h; sourceTree = ""; }; + 3E627FD51C55AE35005C0372 /* TDAudioQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioQueue.m; sourceTree = ""; }; + 3E627FD61C55AE35005C0372 /* TDAudioQueueBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioQueueBuffer.h; sourceTree = ""; }; + 3E627FD71C55AE35005C0372 /* TDAudioQueueBuffer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioQueueBuffer.m; sourceTree = ""; }; + 3E627FD81C55AE35005C0372 /* TDAudioQueueBufferManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioQueueBufferManager.h; sourceTree = ""; }; + 3E627FD91C55AE35005C0372 /* TDAudioQueueBufferManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioQueueBufferManager.m; sourceTree = ""; }; + 3E627FDA1C55AE35005C0372 /* TDAudioQueueController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioQueueController.h; sourceTree = ""; }; + 3E627FDB1C55AE35005C0372 /* TDAudioQueueController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioQueueController.m; sourceTree = ""; }; + 3E627FDC1C55AE35005C0372 /* TDAudioQueueFiller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioQueueFiller.h; sourceTree = ""; }; + 3E627FDD1C55AE35005C0372 /* TDAudioQueueFiller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioQueueFiller.m; sourceTree = ""; }; + 3E627FDE1C55AE35005C0372 /* TDAudioStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioStream.h; sourceTree = ""; }; + 3E627FDF1C55AE35005C0372 /* TDAudioStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioStream.m; sourceTree = ""; }; + 3E627FE01C55AE35005C0372 /* TDAudioInputStreamer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioInputStreamer.h; sourceTree = ""; }; + 3E627FE11C55AE35005C0372 /* TDAudioInputStreamer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioInputStreamer.m; sourceTree = ""; }; + 3E627FE21C55AE35005C0372 /* TDAudioOutputStreamer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TDAudioOutputStreamer.h; sourceTree = ""; }; + 3E627FE31C55AE35005C0372 /* TDAudioOutputStreamer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TDAudioOutputStreamer.m; sourceTree = ""; }; + 3E627FE41C55AE35005C0372 /* TDAudioPlayerConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TDAudioPlayerConstants.h; path = "../../../../Downloads/TDAudioPlayer-master/TDAudioPlayer/AudioPlayerLibrary/TDAudioPlayerConstants.h"; sourceTree = ""; }; + 3E627FE51C55AE35005C0372 /* TDAudioPlayerConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TDAudioPlayerConstants.m; path = "../../../../Downloads/TDAudioPlayer-master/TDAudioPlayer/AudioPlayerLibrary/TDAudioPlayerConstants.m"; sourceTree = ""; }; + 3E76CF231C38258600193B58 /* Parse.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Parse.framework; path = "../../Parse-iOS/Parse.framework"; sourceTree = ""; }; + 3E76CF241C38258600193B58 /* ParseFacebookUtilsV4.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ParseFacebookUtilsV4.framework; path = "../../Parse-iOS/ParseFacebookUtilsV4.framework"; sourceTree = ""; }; + 3E76CF251C38258600193B58 /* ParseUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ParseUI.framework; path = "../../Parse-iOS/ParseUI.framework"; sourceTree = ""; }; + 3E76CF291C38318200193B58 /* Bolts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Bolts.framework; path = "../../Parse-iOS/Bolts.framework"; sourceTree = ""; }; + 3E76CF2B1C38349D00193B58 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; + 3E76CF2D1C3835C500193B58 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; + 3E76CF2F1C3835E300193B58 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; + 3EBE97651C53CEDA0079B54A /* Send Invites Button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Send Invites Button.png"; path = "../../../Dropbox/Gethip/Screens/Friends + Invite Screens/i6/Invite Friends/Send Invites Button.png"; sourceTree = ""; }; + 3EBE97671C53E4290079B54A /* Blue Check.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Blue Check.png"; path = "../../../Dropbox/Gethip/Screens/Friends + Invite Screens/i6/Invite Friends/Blue Check.png"; sourceTree = ""; }; + 3EBE97681C53E4290079B54A /* cross.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = cross.png; path = "../../../Dropbox/Gethip/Screens/Friends + Invite Screens/i6/Invite Friends/cross.png"; sourceTree = ""; }; + 3EBE97691C53E4290079B54A /* Tap Circle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Tap Circle.png"; path = "../../../Dropbox/Gethip/Screens/Friends + Invite Screens/i6/Invite Friends/Tap Circle.png"; sourceTree = ""; }; + 3EBE976E1C53E6950079B54A /* InviteFriendCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteFriendCell.swift; sourceTree = ""; }; + 3EBE97701C540BB80079B54A /* TestInviteFriendsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestInviteFriendsController.swift; sourceTree = ""; }; + 3EBE97721C5413240079B54A /* TestInviteFriendsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestInviteFriendsCell.swift; sourceTree = ""; }; + 3EDA82E01C473E900081ED53 /* FriendData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendData.swift; sourceTree = ""; }; + 3EDA82E21C4741C70081ED53 /* FriendDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendDataSource.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3E1BDA491C37111D00EE3B84 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3E34125D1C54CF1B006226E0 /* MediaPlayer.framework in Frameworks */, + 3E101F061C52E5FD00C895CA /* MultipeerConnectivity.framework in Frameworks */, + 3E379EFE1C3F794500F7BCCD /* CoreGraphics.framework in Frameworks */, + 3E379EFF1C3F794500F7BCCD /* CoreLocation.framework in Frameworks */, + 3E379F001C3F794500F7BCCD /* MobileCoreServices.framework in Frameworks */, + 3E379F011C3F794500F7BCCD /* QuartzCore.framework in Frameworks */, + 3E379F021C3F794500F7BCCD /* Security.framework in Frameworks */, + 3E379F031C3F794500F7BCCD /* StoreKit.framework in Frameworks */, + 3E379EF71C3F794500F7BCCD /* CFNetwork.framework in Frameworks */, + 3E1DE9AE1C38395F00CA6CD4 /* SystemConfiguration.framework in Frameworks */, + 3E1DE9A81C3837E800CA6CD4 /* AudioToolbox.framework in Frameworks */, + 3E76CF2C1C38349D00193B58 /* libsqlite3.dylib in Frameworks */, + 3E76CF2A1C38318200193B58 /* Bolts.framework in Frameworks */, + 3E76CF261C38258600193B58 /* Parse.framework in Frameworks */, + 3E76CF271C38258600193B58 /* ParseFacebookUtilsV4.framework in Frameworks */, + 3E76CF281C38258600193B58 /* ParseUI.framework in Frameworks */, + 3E43B8C91C37639C002F97A7 /* FBSDKCoreKit.framework in Frameworks */, + 3E43B8CA1C37639C002F97A7 /* FBSDKLoginKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3E1BDA611C37111D00EE3B84 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3E101F021C52E45C00C895CA /* FriendListSource */ = { + isa = PBXGroup; + children = ( + 3EDA82E21C4741C70081ED53 /* FriendDataSource.swift */, + 3E379F041C3F982900F7BCCD /* FriendsCell.swift */, + 3EDA82E01C473E900081ED53 /* FriendData.swift */, + 3E1AAD131C3BD92600809367 /* FriendsListViewController.swift */, + ); + name = FriendListSource; + sourceTree = ""; + }; + 3E101F031C52E4AB00C895CA /* UserSettingsSoruce */ = { + isa = PBXGroup; + children = ( + 3E5952841C39E54A00C88C71 /* HomeScreenViewController.swift */, + 3E326BCD1C51C77600F785CF /* SettingsCellWrapper.swift */, + 3E18D4941C51FAC60012F7DF /* UserParseDataSource.swift */, + 3E18D4921C51F6230012F7DF /* UserParseData.swift */, + 3E326BCB1C51C20000F785CF /* SettingsTableViewController.swift */, + 3E1B5E441C5274E700D1AB62 /* SettingsDetailViewWrapper.swift */, + ); + name = UserSettingsSoruce; + sourceTree = ""; + }; + 3E101F041C52E50400C895CA /* PartySessionSource */ = { + isa = PBXGroup; + children = ( + 3E34125A1C54C73A006226E0 /* PartySession.swift */, + 3E627FC21C55978E005C0372 /* PartySessionManager.swift */, + 3E101F071C52E65300C895CA /* PartyServiceManager.swift */, + 3E3412551C54C2BC006226E0 /* SelectSong */, + 3EBE976D1C53E5CF0079B54A /* InviteFriends */, + ); + name = PartySessionSource; + sourceTree = ""; + }; + 3E1BDA431C37111D00EE3B84 = { + isa = PBXGroup; + children = ( + 3E43B8CB1C376BBE002F97A7 /* Assets */, + 3E1BDA741C37116800EE3B84 /* Frameworks */, + 3E1BDA4E1C37111D00EE3B84 /* GetHip */, + 3E1BDA671C37111D00EE3B84 /* GetHipTests */, + 3E1BDA4D1C37111D00EE3B84 /* Products */, + ); + sourceTree = ""; + }; + 3E1BDA4D1C37111D00EE3B84 /* Products */ = { + isa = PBXGroup; + children = ( + 3E1BDA4C1C37111D00EE3B84 /* GetHip.app */, + 3E1BDA641C37111D00EE3B84 /* GetHipTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 3E1BDA4E1C37111D00EE3B84 /* GetHip */ = { + isa = PBXGroup; + children = ( + 3E1BDA5D1C37111D00EE3B84 /* LaunchScreen.xib */, + 3E438ADD1C572DFD0055C97A /* Main.storyboard */, + 3E1BDA511C37111D00EE3B84 /* AppDelegate.swift */, + 3E627FC01C5543FB005C0372 /* User Authentication */, + 3E101F041C52E50400C895CA /* PartySessionSource */, + 3E101F031C52E4AB00C895CA /* UserSettingsSoruce */, + 3E101F021C52E45C00C895CA /* FriendListSource */, + 3E627FC11C554C7D005C0372 /* ObjC Source */, + 3E1BDA4F1C37111D00EE3B84 /* Supporting Files */, + 3E4169561C399C4D00B193AF /* Images-3.xcassets */, + 3E1BDA531C37111D00EE3B84 /* GetHip.xcdatamodeld */, + ); + path = GetHip; + sourceTree = ""; + }; + 3E1BDA4F1C37111D00EE3B84 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 3E1BDA501C37111D00EE3B84 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 3E1BDA671C37111D00EE3B84 /* GetHipTests */ = { + isa = PBXGroup; + children = ( + 3E1BDA6A1C37111D00EE3B84 /* GetHipTests.swift */, + 3E1BDA681C37111D00EE3B84 /* Supporting Files */, + ); + path = GetHipTests; + sourceTree = ""; + }; + 3E1BDA681C37111D00EE3B84 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 3E1BDA691C37111D00EE3B84 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 3E1BDA741C37116800EE3B84 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 3E34125C1C54CF1B006226E0 /* MediaPlayer.framework */, + 3E101F051C52E5FD00C895CA /* MultipeerConnectivity.framework */, + 3E379EF81C3F794500F7BCCD /* CoreGraphics.framework */, + 3E379EF91C3F794500F7BCCD /* CoreLocation.framework */, + 3E379EFA1C3F794500F7BCCD /* MobileCoreServices.framework */, + 3E379EFB1C3F794500F7BCCD /* QuartzCore.framework */, + 3E379EFC1C3F794500F7BCCD /* Security.framework */, + 3E379EFD1C3F794500F7BCCD /* StoreKit.framework */, + 3E1DE9AD1C38395F00CA6CD4 /* SystemConfiguration.framework */, + 3E1DE9AB1C3838A800CA6CD4 /* libsystem_network.dylib */, + 3E1DE9A71C3837E800CA6CD4 /* AudioToolbox.framework */, + 3E1DE9A51C38373700CA6CD4 /* libstdc++.6.dylib */, + 3E76CF2F1C3835E300193B58 /* NetworkExtension.framework */, + 3E76CF2D1C3835C500193B58 /* CFNetwork.framework */, + 3E76CF2B1C38349D00193B58 /* libsqlite3.dylib */, + 3E76CF291C38318200193B58 /* Bolts.framework */, + 3E76CF231C38258600193B58 /* Parse.framework */, + 3E76CF241C38258600193B58 /* ParseFacebookUtilsV4.framework */, + 3E76CF251C38258600193B58 /* ParseUI.framework */, + 3E43B8C41C375E73002F97A7 /* Bolts.framework */, + 3E43B8C51C375E73002F97A7 /* FBSDKLoginKit.framework */, + 3E1BDA751C3713F900EE3B84 /* FBSDKCoreKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 3E3412551C54C2BC006226E0 /* SelectSong */ = { + isa = PBXGroup; + children = ( + 3E3412561C54C31F006226E0 /* SongSelectionViewController.swift */, + 3E3412581C54C6B7006226E0 /* SongCellWrapper.swift */, + ); + name = SelectSong; + sourceTree = ""; + }; + 3E438AE01C57387B0055C97A /* iPhone5 */ = { + isa = PBXGroup; + children = ( + 3E438AE11C5738EF0055C97A /* Create@2x.png */, + 3E438AE21C5738EF0055C97A /* Friends@2x.png */, + 3E438AE31C5738EF0055C97A /* Settings@2x.png */, + 3E438AE41C5738EF0055C97A /* Star@2x.png */, + 3E438AE51C5738EF0055C97A /* Turntable@2x.png */, + ); + name = iPhone5; + sourceTree = ""; + }; + 3E43B8CB1C376BBE002F97A7 /* Assets */ = { + isa = PBXGroup; + children = ( + 3E438AE01C57387B0055C97A /* iPhone5 */, + 3E43B8CD1C376F70002F97A7 /* IPhone6 */, + ); + name = Assets; + sourceTree = ""; + }; + 3E43B8CC1C376C31002F97A7 /* LoginScreen */ = { + isa = PBXGroup; + children = ( + 3E4169481C385F1000B193AF /* 1x.png */, + 3E43B8CE1C376F9F002F97A7 /* Logo.png */, + ); + name = LoginScreen; + sourceTree = ""; + }; + 3E43B8CD1C376F70002F97A7 /* IPhone6 */ = { + isa = PBXGroup; + children = ( + 3EBE97641C53CE950079B54A /* InviteFriends */, + 3E5952591C39DB2800C88C71 /* CreateJoinOrReturnToPartyScreen */, + 3E43B8CC1C376C31002F97A7 /* LoginScreen */, + ); + name = IPhone6; + sourceTree = ""; + }; + 3E5952591C39DB2800C88C71 /* CreateJoinOrReturnToPartyScreen */ = { + isa = PBXGroup; + children = ( + 3E5952861C39EB6100C88C71 /* Turntable.png */, + 3E5952871C39EB6100C88C71 /* Turntable@2x.png */, + 3E5952881C39EB6100C88C71 /* Turntable@3x.png */, + 3E5952721C39DDA800C88C71 /* Create.png */, + 3E5952731C39DDA800C88C71 /* Create@2x.png */, + 3E5952741C39DDA800C88C71 /* Create@3x.png */, + 3E5952751C39DDA800C88C71 /* Group.png */, + 3E5952761C39DDA800C88C71 /* Group@2x.png */, + 3E5952771C39DDA800C88C71 /* Group@3x.png */, + 3E5952781C39DDA800C88C71 /* Settings.png */, + 3E5952791C39DDA800C88C71 /* Settings@2x.png */, + 3E59527A1C39DDA800C88C71 /* Settings@3x.png */, + 3E59526C1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2.png */, + 3E59526D1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@2x.png */, + 3E59526E1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@3x.png */, + 3E59525A1C39DBC900C88C71 /* Friends.png */, + 3E59525B1C39DBC900C88C71 /* Friends@2x.png */, + 3E59525C1C39DBC900C88C71 /* Friends@3x.png */, + 3E59525D1C39DBC900C88C71 /* Settings.png */, + 3E59525E1C39DBC900C88C71 /* Settings@2x.png */, + 3E59525F1C39DBC900C88C71 /* Settings@3x.png */, + 3E5952601C39DBC900C88C71 /* Star.png */, + 3E5952611C39DBC900C88C71 /* Star@2x.png */, + 3E5952621C39DBC900C88C71 /* Star@3x.png */, + ); + name = CreateJoinOrReturnToPartyScreen; + sourceTree = ""; + }; + 3E627FC01C5543FB005C0372 /* User Authentication */ = { + isa = PBXGroup; + children = ( + 3E330B191C38502F00276FE4 /* LoginViewController.swift */, + 3E4169541C398A5B00B193AF /* SignUpViewController.swift */, + 3E1BDA561C37111D00EE3B84 /* ViewController.swift */, + ); + name = "User Authentication"; + sourceTree = ""; + }; + 3E627FC11C554C7D005C0372 /* ObjC Source */ = { + isa = PBXGroup; + children = ( + 3E627FC41C55ADDE005C0372 /* TDAudioPlayer.framework */, + 3E379EF51C3E646000F7BCCD /* ParseNetDebug.m */, + 3E3842E11C3E15DE005DD1FB /* ParseNetDebug.h */, + 3E43B8C31C375ADE002F97A7 /* Bridging-Header.h */, + ); + name = "ObjC Source"; + sourceTree = ""; + }; + 3E627FC41C55ADDE005C0372 /* TDAudioPlayer.framework */ = { + isa = PBXGroup; + children = ( + 3E627FC51C55AE35005C0372 /* AudioPlayer */, + 3E627FD01C55AE35005C0372 /* AudioStreamer */, + 3E627FE41C55AE35005C0372 /* TDAudioPlayerConstants.h */, + 3E627FE51C55AE35005C0372 /* TDAudioPlayerConstants.m */, + ); + name = TDAudioPlayer.framework; + sourceTree = ""; + }; + 3E627FC51C55AE35005C0372 /* AudioPlayer */ = { + isa = PBXGroup; + children = ( + 3E627FC61C55AE35005C0372 /* Categories */, + 3E627FCB1C55AE35005C0372 /* Classes */, + 3E627FCE1C55AE35005C0372 /* TDAudioPlayer.h */, + 3E627FCF1C55AE35005C0372 /* TDAudioPlayer.m */, + ); + name = AudioPlayer; + path = "../../../../Downloads/TDAudioPlayer-master/TDAudioPlayer/AudioPlayerLibrary/AudioPlayer"; + sourceTree = ""; + }; + 3E627FC61C55AE35005C0372 /* Categories */ = { + isa = PBXGroup; + children = ( + 3E627FC71C55AE35005C0372 /* NSInputStream+URLInitialization.h */, + 3E627FC81C55AE35005C0372 /* NSInputStream+URLInitialization.m */, + 3E627FC91C55AE35005C0372 /* NSMutableArray+QueueMethods.h */, + 3E627FCA1C55AE35005C0372 /* NSMutableArray+QueueMethods.m */, + ); + path = Categories; + sourceTree = ""; + }; + 3E627FCB1C55AE35005C0372 /* Classes */ = { + isa = PBXGroup; + children = ( + 3E627FCC1C55AE35005C0372 /* TDAudioMetaInfo.h */, + 3E627FCD1C55AE35005C0372 /* TDAudioMetaInfo.m */, + ); + path = Classes; + sourceTree = ""; + }; + 3E627FD01C55AE35005C0372 /* AudioStreamer */ = { + isa = PBXGroup; + children = ( + 3E627FD11C55AE35005C0372 /* Classes */, + 3E627FE01C55AE35005C0372 /* TDAudioInputStreamer.h */, + 3E627FE11C55AE35005C0372 /* TDAudioInputStreamer.m */, + 3E627FE21C55AE35005C0372 /* TDAudioOutputStreamer.h */, + 3E627FE31C55AE35005C0372 /* TDAudioOutputStreamer.m */, + ); + name = AudioStreamer; + path = "../../../../Downloads/TDAudioPlayer-master/TDAudioPlayer/AudioPlayerLibrary/AudioStreamer"; + sourceTree = ""; + }; + 3E627FD11C55AE35005C0372 /* Classes */ = { + isa = PBXGroup; + children = ( + 3E627FD21C55AE35005C0372 /* TDAudioFileStream.h */, + 3E627FD31C55AE35005C0372 /* TDAudioFileStream.m */, + 3E627FD41C55AE35005C0372 /* TDAudioQueue.h */, + 3E627FD51C55AE35005C0372 /* TDAudioQueue.m */, + 3E627FD61C55AE35005C0372 /* TDAudioQueueBuffer.h */, + 3E627FD71C55AE35005C0372 /* TDAudioQueueBuffer.m */, + 3E627FD81C55AE35005C0372 /* TDAudioQueueBufferManager.h */, + 3E627FD91C55AE35005C0372 /* TDAudioQueueBufferManager.m */, + 3E627FDA1C55AE35005C0372 /* TDAudioQueueController.h */, + 3E627FDB1C55AE35005C0372 /* TDAudioQueueController.m */, + 3E627FDC1C55AE35005C0372 /* TDAudioQueueFiller.h */, + 3E627FDD1C55AE35005C0372 /* TDAudioQueueFiller.m */, + 3E627FDE1C55AE35005C0372 /* TDAudioStream.h */, + 3E627FDF1C55AE35005C0372 /* TDAudioStream.m */, + ); + path = Classes; + sourceTree = ""; + }; + 3EBE97641C53CE950079B54A /* InviteFriends */ = { + isa = PBXGroup; + children = ( + 3EBE97671C53E4290079B54A /* Blue Check.png */, + 3EBE97681C53E4290079B54A /* cross.png */, + 3EBE97691C53E4290079B54A /* Tap Circle.png */, + 3EBE97651C53CEDA0079B54A /* Send Invites Button.png */, + ); + name = InviteFriends; + sourceTree = ""; + }; + 3EBE976D1C53E5CF0079B54A /* InviteFriends */ = { + isa = PBXGroup; + children = ( + 3E101F091C52F14A00C895CA /* InviteFriendsView.swift */, + 3EBE976E1C53E6950079B54A /* InviteFriendCell.swift */, + 3EBE97701C540BB80079B54A /* TestInviteFriendsController.swift */, + 3EBE97721C5413240079B54A /* TestInviteFriendsCell.swift */, + ); + name = InviteFriends; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 3E1BDA4B1C37111D00EE3B84 /* GetHip */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3E1BDA6E1C37111D00EE3B84 /* Build configuration list for PBXNativeTarget "GetHip" */; + buildPhases = ( + 3E1BDA481C37111D00EE3B84 /* Sources */, + 3E1BDA491C37111D00EE3B84 /* Frameworks */, + 3E1BDA4A1C37111D00EE3B84 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GetHip; + productName = GetHip; + productReference = 3E1BDA4C1C37111D00EE3B84 /* GetHip.app */; + productType = "com.apple.product-type.application"; + }; + 3E1BDA631C37111D00EE3B84 /* GetHipTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3E1BDA711C37111D00EE3B84 /* Build configuration list for PBXNativeTarget "GetHipTests" */; + buildPhases = ( + 3E1BDA601C37111D00EE3B84 /* Sources */, + 3E1BDA611C37111D00EE3B84 /* Frameworks */, + 3E1BDA621C37111D00EE3B84 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 3E1BDA661C37111D00EE3B84 /* PBXTargetDependency */, + ); + name = GetHipTests; + productName = GetHipTests; + productReference = 3E1BDA641C37111D00EE3B84 /* GetHipTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 3E1BDA441C37111D00EE3B84 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0630; + ORGANIZATIONNAME = Kroleo; + TargetAttributes = { + 3E1BDA4B1C37111D00EE3B84 = { + CreatedOnToolsVersion = 6.3.2; + }; + 3E1BDA631C37111D00EE3B84 = { + CreatedOnToolsVersion = 6.3.2; + TestTargetID = 3E1BDA4B1C37111D00EE3B84; + }; + }; + }; + buildConfigurationList = 3E1BDA471C37111D00EE3B84 /* Build configuration list for PBXProject "GetHip" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 3E1BDA431C37111D00EE3B84; + productRefGroup = 3E1BDA4D1C37111D00EE3B84 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 3E1BDA4B1C37111D00EE3B84 /* GetHip */, + 3E1BDA631C37111D00EE3B84 /* GetHipTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 3E1BDA4A1C37111D00EE3B84 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3E4169491C385F1000B193AF /* 1x.png in Resources */, + 3E5952641C39DBC900C88C71 /* Friends@2x.png in Resources */, + 3E59528B1C39EB6100C88C71 /* Turntable@3x.png in Resources */, + 3E5952661C39DBC900C88C71 /* Settings.png in Resources */, + 3E5952891C39EB6100C88C71 /* Turntable.png in Resources */, + 3E59527D1C39DDA800C88C71 /* Create@3x.png in Resources */, + 3EBE976B1C53E4290079B54A /* cross.png in Resources */, + 3E43B8CF1C376F9F002F97A7 /* Logo.png in Resources */, + 3E4169571C399C4D00B193AF /* Images-3.xcassets in Resources */, + 3EBE97661C53CEDA0079B54A /* Send Invites Button.png in Resources */, + 3E438AEA1C5738EF0055C97A /* Turntable@2x.png in Resources */, + 3E5952801C39DDA800C88C71 /* Group@3x.png in Resources */, + 3E5952631C39DBC900C88C71 /* Friends.png in Resources */, + 3E5952811C39DDA800C88C71 /* Settings.png in Resources */, + 3E59527E1C39DDA800C88C71 /* Group.png in Resources */, + 3E5952711C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@3x.png in Resources */, + 3E438AE91C5738EF0055C97A /* Star@2x.png in Resources */, + 3E5952831C39DDA800C88C71 /* Settings@3x.png in Resources */, + 3E59526B1C39DBC900C88C71 /* Star@3x.png in Resources */, + 3E59527B1C39DDA800C88C71 /* Create.png in Resources */, + 3E5952701C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2@2x.png in Resources */, + 3EBE976C1C53E4290079B54A /* Tap Circle.png in Resources */, + 3E5952671C39DBC900C88C71 /* Settings@2x.png in Resources */, + 3EBE976A1C53E4290079B54A /* Blue Check.png in Resources */, + 3E438AE71C5738EF0055C97A /* Friends@2x.png in Resources */, + 3E59528A1C39EB6100C88C71 /* Turntable@2x.png in Resources */, + 3E438ADE1C572DFD0055C97A /* Main.storyboard in Resources */, + 3E438AE81C5738EF0055C97A /* Settings@2x.png in Resources */, + 3E5952681C39DBC900C88C71 /* Settings@3x.png in Resources */, + 3E59526F1C39DC1E00C88C71 /* Rectangle 10 + Change Photo + voice_presentation copy + voice_presentation copy 2 + voice_presentation + Music 2 + Music 2.png in Resources */, + 3E59527F1C39DDA800C88C71 /* Group@2x.png in Resources */, + 3E5952691C39DBC900C88C71 /* Star.png in Resources */, + 3E59527C1C39DDA800C88C71 /* Create@2x.png in Resources */, + 3E59526A1C39DBC900C88C71 /* Star@2x.png in Resources */, + 3E5952821C39DDA800C88C71 /* Settings@2x.png in Resources */, + 3E1BDA5F1C37111D00EE3B84 /* LaunchScreen.xib in Resources */, + 3E438AE61C5738EF0055C97A /* Create@2x.png in Resources */, + 3E5952651C39DBC900C88C71 /* Friends@3x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3E1BDA621C37111D00EE3B84 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3E1BDA481C37111D00EE3B84 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3E101F081C52E65300C895CA /* PartyServiceManager.swift in Sources */, + 3E330B1A1C38502F00276FE4 /* LoginViewController.swift in Sources */, + 3E627FEA1C55AE35005C0372 /* TDAudioFileStream.m in Sources */, + 3E627FC31C55978E005C0372 /* PartySessionManager.swift in Sources */, + 3E627FE61C55AE35005C0372 /* NSInputStream+URLInitialization.m in Sources */, + 3E3412571C54C31F006226E0 /* SongSelectionViewController.swift in Sources */, + 3E627FE81C55AE35005C0372 /* TDAudioMetaInfo.m in Sources */, + 3E34125B1C54C73A006226E0 /* PartySession.swift in Sources */, + 3E627FF01C55AE35005C0372 /* TDAudioStream.m in Sources */, + 3E627FE91C55AE35005C0372 /* TDAudioPlayer.m in Sources */, + 3EDA82E31C4741C70081ED53 /* FriendDataSource.swift in Sources */, + 3EDA82E11C473E900081ED53 /* FriendData.swift in Sources */, + 3E627FF21C55AE35005C0372 /* TDAudioOutputStreamer.m in Sources */, + 3E379F051C3F982900F7BCCD /* FriendsCell.swift in Sources */, + 3E1BDA571C37111D00EE3B84 /* ViewController.swift in Sources */, + 3E1AAD141C3BD92600809367 /* FriendsListViewController.swift in Sources */, + 3E326BCE1C51C77600F785CF /* SettingsCellWrapper.swift in Sources */, + 3E627FF31C55AE35005C0372 /* TDAudioPlayerConstants.m in Sources */, + 3E379EF61C3E646000F7BCCD /* ParseNetDebug.m in Sources */, + 3E627FED1C55AE35005C0372 /* TDAudioQueueBufferManager.m in Sources */, + 3EBE976F1C53E6950079B54A /* InviteFriendCell.swift in Sources */, + 3E627FEF1C55AE35005C0372 /* TDAudioQueueFiller.m in Sources */, + 3E1BDA551C37111D00EE3B84 /* GetHip.xcdatamodeld in Sources */, + 3E326BCC1C51C20000F785CF /* SettingsTableViewController.swift in Sources */, + 3EBE97731C5413240079B54A /* TestInviteFriendsCell.swift in Sources */, + 3E101F0A1C52F14A00C895CA /* InviteFriendsView.swift in Sources */, + 3E1B5E451C5274E700D1AB62 /* SettingsDetailViewWrapper.swift in Sources */, + 3EBE97711C540BB80079B54A /* TestInviteFriendsController.swift in Sources */, + 3E18D4951C51FAC60012F7DF /* UserParseDataSource.swift in Sources */, + 3E627FEC1C55AE35005C0372 /* TDAudioQueueBuffer.m in Sources */, + 3E627FEB1C55AE35005C0372 /* TDAudioQueue.m in Sources */, + 3E3412591C54C6B7006226E0 /* SongCellWrapper.swift in Sources */, + 3E1BDA521C37111D00EE3B84 /* AppDelegate.swift in Sources */, + 3E627FF11C55AE35005C0372 /* TDAudioInputStreamer.m in Sources */, + 3E4169551C398A5B00B193AF /* SignUpViewController.swift in Sources */, + 3E627FEE1C55AE35005C0372 /* TDAudioQueueController.m in Sources */, + 3E627FE71C55AE35005C0372 /* NSMutableArray+QueueMethods.m in Sources */, + 3E18D4931C51F6230012F7DF /* UserParseData.swift in Sources */, + 3E5952851C39E54A00C88C71 /* HomeScreenViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3E1BDA601C37111D00EE3B84 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3E1BDA6B1C37111D00EE3B84 /* GetHipTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 3E1BDA661C37111D00EE3B84 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3E1BDA4B1C37111D00EE3B84 /* GetHip */; + targetProxy = 3E1BDA651C37111D00EE3B84 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 3E1BDA5D1C37111D00EE3B84 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 3E1BDA5E1C37111D00EE3B84 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 3E1BDA6C1C37111D00EE3B84 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 3E1BDA6D1C37111D00EE3B84 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 3E1BDA6F1C37111D00EE3B84 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + /Users/okechi/Documents/FacebookSDK, + "/Users/okechi/Documents/Parse-iOS", + ); + GCC_PRECOMPILE_PREFIX_HEADER = NO; + INFOPLIST_FILE = GetHip/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(SDKROOT)/usr/lib/system", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "$PROJECT_NAME/Bridging-Header.h"; + }; + name = Debug; + }; + 3E1BDA701C37111D00EE3B84 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + /Users/okechi/Documents/FacebookSDK, + "/Users/okechi/Documents/Parse-iOS", + ); + GCC_PRECOMPILE_PREFIX_HEADER = NO; + INFOPLIST_FILE = GetHip/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(SDKROOT)/usr/lib/system", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "$PROJECT_NAME/Bridging-Header.h"; + }; + name = Release; + }; + 3E1BDA721C37111D00EE3B84 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = GetHipTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GetHip.app/GetHip"; + }; + name = Debug; + }; + 3E1BDA731C37111D00EE3B84 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = GetHipTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GetHip.app/GetHip"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3E1BDA471C37111D00EE3B84 /* Build configuration list for PBXProject "GetHip" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3E1BDA6C1C37111D00EE3B84 /* Debug */, + 3E1BDA6D1C37111D00EE3B84 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3E1BDA6E1C37111D00EE3B84 /* Build configuration list for PBXNativeTarget "GetHip" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3E1BDA6F1C37111D00EE3B84 /* Debug */, + 3E1BDA701C37111D00EE3B84 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3E1BDA711C37111D00EE3B84 /* Build configuration list for PBXNativeTarget "GetHipTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3E1BDA721C37111D00EE3B84 /* Debug */, + 3E1BDA731C37111D00EE3B84 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + 3E1BDA531C37111D00EE3B84 /* GetHip.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 3E1BDA541C37111D00EE3B84 /* GetHip.xcdatamodel */, + ); + currentVersion = 3E1BDA541C37111D00EE3B84 /* GetHip.xcdatamodel */; + path = GetHip.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = 3E1BDA441C37111D00EE3B84 /* Project object */; +} diff --git a/GetHip.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GetHip.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..3f8bcac --- /dev/null +++ b/GetHip.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/GetHip/AppDelegate.swift b/GetHip/AppDelegate.swift new file mode 100644 index 0000000..e4f46f8 --- /dev/null +++ b/GetHip/AppDelegate.swift @@ -0,0 +1,136 @@ +// +// AppDelegate.swift +// GetHip +// +// Created by Okechi on 1/1/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit +import CoreData + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + + Parse.logLevel() + + //NSNotificationCenter.defaultCenter().addObserver(self, selector: "receiveWillSendURLRequestNotification:", name: PFNetworkWillSendURLRequestNotification, object: nil) + //NSNotificationCenter.defaultCenter().addObserver(self, selector: "receiveDidReceiveURLResponseNotification:", name: PFNetworkDidReceiveURLResponseNotification, object: nil) + + // Override point for customization after application launch. + Parse.setApplicationId("OUFlGeqCzg03ZbstGcbskj7UNwp53Y0yad9Fi6I0", clientKey: "xaw0kbAFnBi3zLhT1uSnzrzju56m7CnQJ8hJHW1K") + PFFacebookUtils.initializeFacebookWithApplicationLaunchOptions(launchOptions); + let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) + print(paths[0]) + return true + } + + func receiveWillSendURLRequestNotification(notification: NSNotification) { + ParseNetDebug.receiveWillSendURLRequestNotification(notification) + } + + func receiveDidReceiveURLResponseNotification(notification: NSNotification) { + ParseNetDebug.receiveDidReceiveURLResponseNotification(notification) + } + func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { + return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) + } + + + + func applicationWillResignActive(application: UIApplication) { + // 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. + // 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. + } + + + func applicationDidEnterBackground(application: UIApplication) { + // 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. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // 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. + } + + func applicationDidBecomeActive(application: UIApplication) { + // 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. + FBSDKAppEvents.activateApp() + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + // Saves changes in the application's managed object context before the application terminates. + self.saveContext() + } + + // MARK: - Core Data stack + + lazy var applicationDocumentsDirectory: NSURL = { + // The directory the application uses to store the Core Data store file. This code uses a directory named "oonyeje.Kroleo.GetHip" in the application's documents Application Support directory. + let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) + return urls[urls.count-1] as! NSURL + }() + + lazy var managedObjectModel: NSManagedObjectModel = { + // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model. + let modelURL = NSBundle.mainBundle().URLForResource("GetHip", withExtension: "momd")! + return NSManagedObjectModel(contentsOfURL: modelURL)! + }() + + lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { + // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. + // Create the coordinator and store + var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) + let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("GetHip.sqlite") + var error: NSError? = nil + var failureReason = "There was an error creating or loading the application's saved data." + if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil { + coordinator = nil + // Report any error we got. + var dict = [String: AnyObject]() + dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" + dict[NSLocalizedFailureReasonErrorKey] = failureReason + dict[NSUnderlyingErrorKey] = error + error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) + // Replace this with code to handle the error appropriately. + // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + NSLog("Unresolved error \(error), \(error!.userInfo)") + abort() + } + + return coordinator + }() + + lazy var managedObjectContext: NSManagedObjectContext? = { + // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail. + let coordinator = self.persistentStoreCoordinator + if coordinator == nil { + return nil + } + var managedObjectContext = NSManagedObjectContext() + managedObjectContext.persistentStoreCoordinator = coordinator + return managedObjectContext + }() + + // MARK: - Core Data Saving support + + func saveContext () { + if let moc = self.managedObjectContext { + var error: NSError? = nil + if moc.hasChanges && !moc.save(&error) { + // Replace this implementation with code to handle the error appropriately. + // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + NSLog("Unresolved error \(error), \(error!.userInfo)") + abort() + } + } + } + +} + diff --git a/GetHip/Base.lproj/LaunchScreen.xib b/GetHip/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..3c59ccf --- /dev/null +++ b/GetHip/Base.lproj/LaunchScreen.xib @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/GetHip/Bridging-Header.h b/GetHip/Bridging-Header.h new file mode 100644 index 0000000..3e9c534 --- /dev/null +++ b/GetHip/Bridging-Header.h @@ -0,0 +1,35 @@ +// +// Bridging-Header.h +// GetHip +// +// Created by Okechi on 1/1/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +#ifndef GetHip_Bridging_Header_h +#define GetHip_Bridging_Header_h + +#import +#import +#import +#import +#import +#import "ParseNetDebug.h" + +//TDAudioPlayer +#import "NSInputStream+URLInitialization.h" +#import "NSMutableArray+QueueMethods.h" +#import "TDAudioMetaInfo.h" +#import "TDAudioInputStreamer.h" +#import "TDAudioOutputStreamer.h" +#import "TDAudioPlayerConstants.h" +#import "TDAudioPlayer.h" +#import "TDAudioFileStream.h" +#import "TDAudioQueue.h" +#import "TDAudioQueueBuffer.h" +#import "TDAudioQueueBufferManager.h" +#import "TDAudioQueueController.h" +#import "TDAudioQueueFiller.h" +#import "TDAudioStream.h" + +#endif diff --git a/GetHip/FriendData.swift b/GetHip/FriendData.swift new file mode 100644 index 0000000..e469700 --- /dev/null +++ b/GetHip/FriendData.swift @@ -0,0 +1,19 @@ +// +// FriendData.swift +// GetHip +// +// Created by Okechi on 1/13/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import Foundation + +class FriendData { + var displayName: String! + var profileImg: UIImage! + + init(display: String){ + self.displayName = display + self.profileImg = nil + } +} diff --git a/GetHip/FriendDataSource.swift b/GetHip/FriendDataSource.swift new file mode 100644 index 0000000..18949b5 --- /dev/null +++ b/GetHip/FriendDataSource.swift @@ -0,0 +1,65 @@ +// +// FriendDataSource.swift +// GetHip +// +// Created by Okechi on 1/13/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import Foundation + + +class FriendDataSource{ + var dataSource: [FriendData] + + init() { + dataSource = [] + var query = PFUser.query() + var currentUser: String! = PFUser.currentUser()?.username + + let predicate: NSPredicate = NSPredicate(format: "(((RequestStatus = %@) OR (RequestStatus = %@)) AND (username = %@))", argumentArray: ["accepted", "pending",currentUser]) + var friendsQuery: PFQuery = PFQuery(className: "FriendRequest", predicate: predicate) + + friendsQuery.includeKey("OtherUser").findObjectsInBackgroundWithBlock { + (objects, error) -> Void in + + //print(error) + + if error == nil { + for object in objects! { + //var image:UIImage = UIImage() + + let userName = object.objectForKey("OtherUser")!.objectForKey("username") as! String + + /* let pimage:PFFile = object["profilePicture"] as! PFFile + + pimage.getDataInBackgroundWithBlock({ + (imageData, error) -> Void in + + if !(error != nil) { + image = UIImage(data: imageData!)! + } + })*/ + + var newFriend: FriendData = FriendData(display: userName) + //print(userName) + self.dataSource.append(newFriend) + + + } + NSLog("%d", self.dataSource.count) + + } + + NSNotificationCenter.defaultCenter().postNotificationName("refreshTableView", object: nil) + + } + + + } + + func getFriends() -> [FriendData]{ + + return self.dataSource + } +} diff --git a/GetHip/FriendsCell.swift b/GetHip/FriendsCell.swift new file mode 100644 index 0000000..7c4cac9 --- /dev/null +++ b/GetHip/FriendsCell.swift @@ -0,0 +1,24 @@ +// +// FriendsCell.swift +// GetHip +// +// Created by Okechi on 1/8/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class FriendsCell: UITableViewCell { + @IBOutlet var friendName: UILabel! + + @IBOutlet var proImage: UIImageView! + + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } + +} diff --git a/GetHip/FriendsListViewController.swift b/GetHip/FriendsListViewController.swift new file mode 100644 index 0000000..ccdef7d --- /dev/null +++ b/GetHip/FriendsListViewController.swift @@ -0,0 +1,105 @@ +// +// FriendsListViewController.swift +// GetHip +// +// Created by Okechi on 1/5/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class FriendsListViewController: UITableViewController/*PFQueryTableViewController*/ { + //var manager = FriendDataSource() + var friends = [] + + @IBOutlet weak var table: UITableView! + + + @IBAction func dismissFriendView(sender: UIBarButtonItem) { + + self.parentViewController?.dismissViewControllerAnimated(true, completion: nil) + } + + + func setData(frnds:[FriendData]){ + self.friends = frnds + } + override func viewDidLoad() { + super.viewDidLoad() + self.table.delegate = self + self.table.dataSource = self + //self.navigationItem.rightBarButtonItem = self.editButtonItem() + //self.friends = manager.getFriends() + + //NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshTable:", name: "refreshTableView", object: nil) + //debug statements + + + } + + /*func refreshTable(notification: NSNotification){ + self.friends = manager.getFriends() + self.table.reloadData() + }*/ + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + } + + override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + return 1 + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.friends.count + } + + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let friend = self.friends[indexPath.row] as? FriendData + let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as? FriendsCell + + //sets display name of friend (print for debugging purposes) + cell!.friendName.text = friend!.displayName + println(friend!.displayName) + + //sets profile image of current cell + //checks if friend user has a profile image or not + if friend?.profileImg == nil { + cell!.proImage.backgroundColor = UIColor.grayColor() + } + else{ + + } + + //rounds uiimage and configures UIImageView + //cell!.proImage.layer.borderWidth = 3.0 + //cell!.proImage.clipsToBounds = true + cell!.proImage.layer.cornerRadius = cell!.proImage.frame.size.width/2 + + //cell!.proImage.layer.borderColor = UIColor.whiteColor().CGColor + //cell!.proImage.layer.masksToBounds = true + + + return cell! + } + + override func setEditing(editing: Bool, animated: Bool) { + super.setEditing(editing, animated: animated) + self.table.setEditing(editing, animated: true) + if editing{ + + } + } + + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + switch editingStyle { + case .Delete: + //delete friend from users friend array, parse, and tableView + println("delete") + default: + return + + } + } + +} diff --git a/GetHip/GetHip.xcdatamodeld/.xccurrentversion b/GetHip/GetHip.xcdatamodeld/.xccurrentversion new file mode 100644 index 0000000..e5be47a --- /dev/null +++ b/GetHip/GetHip.xcdatamodeld/.xccurrentversion @@ -0,0 +1,8 @@ + + + + + _XCCurrentVersionName + GetHip.xcdatamodel + + diff --git a/GetHip/GetHip.xcdatamodeld/GetHip.xcdatamodel/contents b/GetHip/GetHip.xcdatamodeld/GetHip.xcdatamodel/contents new file mode 100644 index 0000000..193f33c --- /dev/null +++ b/GetHip/GetHip.xcdatamodeld/GetHip.xcdatamodel/contents @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/GetHip/HomeScreenViewController.swift b/GetHip/HomeScreenViewController.swift new file mode 100644 index 0000000..584b213 --- /dev/null +++ b/GetHip/HomeScreenViewController.swift @@ -0,0 +1,101 @@ +// +// HomeScreenViewController.swift +// GetHip +// +// Created by Okechi on 1/3/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class HomeScreenViewController: UIViewController { + var usrDataManager = UserParseDataSource() + var frndDataManager = FriendDataSource() + var friendData: [FriendData] = [] + var userData: [UserParseData] = [] + let partyData = PartyServiceManager() + + @IBOutlet weak var CreateAPartyBtn: UIButton! + + + //async data update methods + func refreshFriendData(notification:NSNotification){ + self.friendData = self.frndDataManager.getFriends() + } + + func refreshUserData(notification:NSNotification){ + self.userData = self.usrDataManager.getUser() + + self.partyData.setPeerID((self.userData[0].displayName)) + self.partyData.setAdvertiser() + } + + func loadID(notification: NSNotification){ + self.performSegueWithIdentifier("InviteFriendsSegue", sender: nil) + } + + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.view.backgroundColor = UIColor.whiteColor() + CreateAPartyBtn.layer.cornerRadius = 5 + CreateAPartyBtn.layer.borderWidth = 1 + + NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadID:", name: "gotDisplayID", object: nil) + + NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshFriendData:", name: "refreshTableView", object: nil) + + NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshUserData:", name: "refreshSettingsView", object: nil) } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + if segue.identifier == "InviteFriendsSegue" { + let nav: UINavigationController = (segue.destinationViewController as? UINavigationController)! + + let vc: TestInviteFriendsController = (nav.viewControllers[0] as? TestInviteFriendsController)! + + //initialize host role + self.partyData.setRole(PeerType(rawValue: 0)!) + + //initialize browser to find nearby friends + self.partyData.setBrowser() + + //initialize session + self.partyData.initializeSession() + + vc.setData(self.userData, frndData: self.friendData, party: self.partyData) + } + + if segue.identifier == "SettingsSegue" { + let nav: UINavigationController = (segue.destinationViewController as? UINavigationController)! + + let vc: SettingsTableViewController = (nav.viewControllers[0] as? SettingsTableViewController)! + vc.setData(self.userData) + } + + if segue.identifier == "FriendListSegue" { + let nav: UINavigationController = (segue.destinationViewController as? UINavigationController)! + + let vc: FriendsListViewController = (nav.viewControllers[0] as? FriendsListViewController)! + vc.setData(self.friendData) + } + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/GetHip/Images-2.xcassets/Image.imageset/Contents.json b/GetHip/Images-2.xcassets/Image.imageset/Contents.json new file mode 100644 index 0000000..f8f827e --- /dev/null +++ b/GetHip/Images-2.xcassets/Image.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GetHip/Images-2.xcassets/LaunchImage.launchimage/Contents.json b/GetHip/Images-2.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000..e37b649 --- /dev/null +++ b/GetHip/Images-2.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "minimum-system-version" : "7.0", + "subtype" : "retina4", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GetHip/Images-3.xcassets/Image.imageset/1x.png b/GetHip/Images-3.xcassets/Image.imageset/1x.png new file mode 100644 index 0000000000000000000000000000000000000000..ad08030bcbd9fd7fde9f9469354f633307d322a8 GIT binary patch literal 16387 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 B*{lEn literal 0 HcmV?d00001 diff --git a/GetHip/Images-3.xcassets/Image.imageset/3x.png b/GetHip/Images-3.xcassets/Image.imageset/3x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc44c5c6d90b3106b86a65a5bd9093dfbcdbc8fa GIT binary patch literal 74219 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 Yl&mwEC{mk&SSo3w?IxQG>%4yc6Th^KMF0Q* literal 0 HcmV?d00001 diff --git a/GetHip/Images-3.xcassets/Image.imageset/Contents.json b/GetHip/Images-3.xcassets/Image.imageset/Contents.json new file mode 100644 index 0000000..22a8db2 --- /dev/null +++ b/GetHip/Images-3.xcassets/Image.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "1x.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GetHip/Images-3.xcassets/LaunchImage.launchimage/1x-1.png b/GetHip/Images-3.xcassets/LaunchImage.launchimage/1x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d59bd840dbf99748cb86978d301821cab94e5826 GIT binary patch literal 29971 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 F{|4Ak1>FDu literal 0 HcmV?d00001 diff --git a/GetHip/Images-3.xcassets/LaunchImage.launchimage/1x.png b/GetHip/Images-3.xcassets/LaunchImage.launchimage/1x.png new file mode 100644 index 0000000000000000000000000000000000000000..edc91505fe1cbd4bc3e25094cb7209c00afb09cd GIT binary patch literal 32485 zcmeFZ^;=Y5)Hggdh?Ein5`uzANlUjNjdY8Y?%8q-yQFjAYGUg6<+}Jdn+|YG|>)01LRv76`DH(+u;>c@jNJ(RpH{9qD zj{y7;@>uEtOQcinLV$k=&+=_G_ooW;#j!?@jo{zL#AgfyT|T57 zu#ELmUj&|v%K!Z<@W2O6;9iXd1$`kP1+^7_ zE8w~wF9qrl{P$|${XbO#L65D8)ZEDay&HsqDOLO5N{rT+*nvFu&V}KBNdX?Dph}`E z!a$fjw;4eZ2Eke;*OUc@0S1fmjAD1>==fsljkNBuONDy9>ix!D#(N8 zyHBQNOvn98&+LBG?Cu0@9$m}+P3+x;!Q|vSBXN)DZ?6~}RrK6(t4bYxZT_~i7AtLG z4}4*~w0<`+rjPbY1fA6bwOTi83M!u77VV8Yp67NVJ@X=T<(y^$r4kN#R#QimvrjR$_2hFLPF~S>HkUl*kDK95vIKq-K5X8 zDJVMOKqPS*fW8PZZN+_b|KBd>qCglKqK-)#aolN-Wlbga_=f6GZSVHAXFgX?GNrGf zwI5aSl3bB2rvc#A+sK6Cj*?`Z4sL}R7D)#GL~_A?UyfNJT(O6}3mTO=JJi>swSm!@ zL~#8Iyjlb1y*59?QubpD3x>S-F&GNBAs5bP%lV_{3Svl!033Z)treGZrgCVr82LK= zQ(X8A*kwlBrXDz*2kOLmBBFcuu25MHfG_4Djog<@%Q~IWA^z&;9{YOP4+GL|Ya@p6 zsQex#x~0btR&u<%0&m`551@x+xiM#C< zA7?4c+G7c>?s*!x=Lkj7C_C6fhn6^tM_OFmtpJ|^w6Fm;`?ZR>z`+Nhg;3({-09m! zNpF@Ghw@M?vwLa+KM2y6y2t;#FX-#@z24AEU_+!rQHR>m08{Ds3!aG@h>!j#do&{u zV=4vX=*0WGaFFp0QqaF`At9ItzHRU=Tqhh*l%y?4C`QW=jJ;CXXo z#1rX!K6xww<>xWgKj14s!*2kH zR-}0~R=elR-dS1s&1I<>*2!liv1kM_ed<#<)qPP6yLYd@_V{$s9!;jHZH)pVOjzVkH`>^(rtJf2-J@IZ_CN2Qd*>CwCJ$e;b#eD+*K-74L546Oh&>qI z7Ddx#^Psip3VR0$tz(r0nT>cMPzoqNd6Hz?a zZBk8S{aj_!UE(6!8TUUg`Vtn)R2TB>oo;PqMp+KS${J0|+8omyDA&@_uTY#W^(;FT zE;IALlb3aj%!Jsl_u2#C8ed&i?Lq<;f+nJ(sEKz=d#!4UD?jCP987W=ZU#9&8YWoV zobt{xo?46kA4^^#aa7_GYY{l1@JFQNxB2)qo5l5!tsPAIQ;U<3Iz?60m#cJG{#;%z zPk3TIu6IcT$l?IM{7Y#XS_?hV_R?TFyNjOVi>-K)SeO&^@z=Y-lcn+O-e&^;Lw@Oj zIos9p!Jp0)ec-Fn6?@i?%G7-6!NE9KYDd3A%)KA`kpDC*D+g{9;flnd_%V@2VtuCKNwgRVBotOFF52a zEY{mRlDTob(#78YsCN!zICCB?AsTb9rYe`_{cjlyV41r@Qd&i3Egt1(R%`MERW(kg zZ0X3Ix_8yaFs~BVh~~yODl$B3Yvpo%TW3l#G~jDIJG_)|a4?JV!1$deQM_~GM8f_% zqFaTtX?WqZBa2hP^si!`Ui&@^x&UEy=WHc@JCNAjv)VVem&6-Z{El7gmTwQapjaf! zl>FbUa=I8qFVm2l8@CHt8Mhx34L!TQ?rDHemii=01k{C0ZBujwTl&|#HgUAfR9)vOB(c+*Ydao6^g5VPp4fyy%zD zzR{y$6XAz8j}~9j|3jTW4*@smt8O~fqPe-|^z*x0>4+Up>e-#hcl<_RL&2h$t#p2q z1ogYz@WiuwC8Nees4W+l!H?Am=GIrRRn9C0deuH^Sb8Yv4ugWc;cc$^_rv=dq?(JO zjgXG7hSGL-6izp%kcG=muv!}>;g`KG#?pXP^Sv9`^hf(%_)KVWg? z5Qkac!YSnm>u&ibLY19d%i=txlHS>C#%g%!BiqOxI8UrV$ioCT94j z@JM4our>_oQ)n`vA$H?Ng;*`uA}jXR3TU&YxXH@&2DfZ&Cp2JH_a(1RTu}>PO4ahm zz2|GurJq#e5w}0Os`lGtgNuj=Y?GR8%`_4^U#fEL{mf-gNe!XCqOY|Su!2p@iW>Ar zt79$<(edxx7KB9a&)(U7A!En_7S!GEv8>4ME}ooH_um_|iR=3ja&-n{Vj?8`9wDwTxjSm~x%|0UmLUq6g3XnNQ)zOEn)xRn2>C$2tK#`DQI0 zHOWp~_vsX_rreQNek^@_5*TuOXvj~?)Z~7@L&FoqFPgM~wV*y;RLN{dp&u3vI#up! zyZDzfs1Ihh_j!d_&Z#c+lbJCS`%QqHera>LynpjadUh@gBInk!S-nqos=yYQ7q(yh zlf*ORTFu=C)EqT5fPKa%zeKG5pzYmF=;VR_Cv0R@j7vBN>gX(b}Eh{JN97f{zUQ7 zFlcbQjpFayAf#wShWiN*xl6M<4QMJJ)&-JmYu1%c*%wDUm!xpN2 zC4=+}%y<#XazE(?!2SBY(*vytqzEzUDr)KzgCuM+=m_BKhD3A6b9sv#j~sMIgqJ;J zxPMpzedgr5jFHrU(y9aullf-f>rhAoMFt*#TrH(g`|yq3^X#f@owWA44UzHRirg6t z7)c%h-;|r6jA%n}OhRK6LWj4%oMw=DWXO{uU_vr z7XaU+uJ_IjV#2-)Y>YE}L2GJ=8y+20YDcq;&(0#RZj6T#@C37WjBH6}BQ%A&^-j+l z2WkAE7qZV|Jjw_A73Hq*&J%!Fk%1YsQCVDrje0D*x0rpg>Xt4;H|l{pt>iM+6$gbz z1A_c+N(4ab7U4OV)o)>{j%|1Ll;TbyyuTh@+#V0smDOC&2>{~Y0krsZc46a9Ut9p~ znd}baB({q`qu0Bk5#FP1ZFPm6q|W+*Q>}8vuP=Q+5@MKEACg}(>ywX=gM{0ra-+ka z`0vzKZ8BF zPYa{~fSSGd+$wo}sc)j#O3Uidfzrm{`cN-*RR?WZ_M-Kyvc6Zo#>})|;nwk|d)MyA zrA}Yi(AJ6D@*!Y2U7=wsd2}Fd#(RBtuYgeBhvu{yPTD{A1bSO*%!j_)L}q*U|MTw? zF5f?8zmyQ}$Nn2IS{6ROhh-l23u*Go{Jnn0WPq9Of$OMKN0HG2ku7~0}EmeP-b`6nVsuL`(RiE>v-OaQymGg`ExSJXdxRA5< zl|Q*R?yw$~C9!Zjq>nE&_go9)4j@Po8Yw>FL3R75ImYlc65eJ+*ZhM+u1)=Vo9yP= zwVPgcd*lXHu&tf`BdjYolr*1P3Z!p#pJ{7qG4a{j62&K0f!!Sp$SPT^b=H@Eto2T& z^`hx!NT%T?Rc3KxnkP5Q)rO=PO)yF^)$}5cuY<2ap}<)@ZN^}exVk0A7(gw&Xnc94 zn*sTgGX^&Ghe&bfzd5b|vkg;N`2Y9TKfuA0fu%nF)91jPY{0(#QhH~P`FgWtfcG5X ziS^v~zd0s=c69yqh2eT%SK*tOKmW}^0`7S(d)wKSyaY=9ykzp3K=S|QDCz;EneZ$r z{1bl+Y$h&1Sa)!H{vSFLMo9$D)v*SZ z6RK>mxUAvFnw!Xr)RGsRTIdUc)G3AJv@pBoEkH%6 zK2{H1i1Jg}dO2|G82A-`4v`~XNvCKGo-7F1f?o(BZQhKVzt5p&0|FE86klZG`je=U zQX7Bv{#xru=5<67+jN-Qa`O!nsT%+o-JB~po^c{!5$jyM*;$H*?h4UQp@C(aWVS57 z@=I^A!KKQJWh}$#d;P18EPoNllDNCbrG&9|GivCyo^BotW25bkMQVn*&kc$A6Hbzg zU`eVDMaQG`?@m6uk)r$+v0y2<)~0iMW)#B9!99sKo!bQC;|Wkh`Uwc?(4(M#HjWX8 z0OU6YnKW4VBf*qs-zo&m$;3?8i?MT`G^#H#4tQ1jk>g0w@_;2aiEKtgt3+_`-dtj9 zW`9^j{%?W?Bo>x9&apL<5nflMDd}rq0`n2(J9-VHKr^*%M`-y5b3$|XCgOS zML$;YLyM-mLh-@u6YeqwFC#T-A9<<=#1i6#-Q38;NQbl${mNcknf$$C-}CI`!GKJ> zy;Qw%@HZ-5WC8I8nY&cwrYrtv!gm0T3klxV1R;Z2P!|a2*2>%c7eLHUj zkrE7GeUY)47EoD8h-DHNc;)hXwE+5sY_-F+f*>DAG+8n}mLchC*B7xuDD>~D_-U!* z*=TT4N;BR7r1hC0^57oRtcVGgr1E^=r(%(T=vv2-sV?lsr@9{iY_a5aMg*?!JzmN< zMH~6pg6cb;;4v_g+5&R@G_+v>8R&q??C0EwKiRzi9)FF++q6z)3E)zHcSVPRc5Ri|Q!0DKW4!88rsJ zJFzJ%tuLu>y5lVQIS5@WlEI#*(zjYnwWGY*6Y;9yW#gL%w_2t>!o_;g7(d`#pYbuU zKM}6<7UCgo4O6rv>c}cO?ZvltgA??~cJLql`E{80I=x{yEJ}{)eaAELAh3V* zHwlFqxtAi0N(KL&sZ?;4<4kWOr`pC5m;T6uHDkh`wRi)fi>HL*i)$-sCeLR|O)byN zx^%gESHv0i?EGYU-nB4cp~8475M=cu`8>tl#87(_C_K*=x?Ie6Z>~^^{OVKVQ(a68@FqcInc^AJ>8<4YDa9C*7qa{w0 z2rv?H=)KezLTEsf^**vFwb&_7HScVpbYbsUi-NJ%wu5_^kx=J(P93KKjt@ zJi=*@5pJPg#bxx7`e!DdbMC?OdN4y(*))?24_=4F$4@$UaFX9wX!s`}zY@yjI#1SNAXzpq;H~$S25B$)C!#>{WO8wKB!Ll^O{#5Tyl04eVh^ z(m`Yhai1vXMClpi)KTbHt1aX>GVz_&zg0Ba_TKn?7jDuX7$2INA3&A&nAm|hPYBb& zOZPnpvlhqNpV8$vJ)+F?{t(}LzZdA;Vt=#tp}zS}MU)8>+BATn1V{MfOT(_>ync0O zL3r&^@!lK5xAW}WaLxrzM1@#`;R2Z?X3M-V!>Ozffz7MO%TUYC!Rjz?yKOt7K-QaL z-pS?Pm_*K_nWs-4H7fuDPw0tP3-!;+a}Ejh)f5HcW)H|$nSxQf<)+)O%OcTlMx?V$ z{T+u@y_*ugQQsxy*Fm|U>Cz@fRPJ3&8#=4Ek`-CmPSRzndEF{O z=d>4u8{WU7@kO|lNu!Jz)2I12Zw=8_9)TXlX#rB*)B{-$>pZdQAKl+{i47Rc>KwRB zy<)p8T4OWd<0T&K5ivxU4tZpLY3LeL=@*{Da@Mzu!PcvZUjvQA18L@_OAzM`U%K2> zW)T5!t)j*s1Z%F@HqP$)$_fnt{9PJZj1MvLFk2J3dV1$eO-&eG`YJP$BT!e~0SI$~ z;K>_?*0m61FGTCkb_$&yG{?;u84bCARFwDK=%3jpbMJ-4QMw+F(J^k=k_yS(p&H>Q zRj^2*9td$1Vd_V_Zf8JyWoTtT)UZNA3Q}tG^aDxzm*hz1Ol(#uN-<1hwHlvU@_#c6 z6|(<$3FnM~fgP9|#T7gogCS4k{9H2ewsXIJ6Ob*K;VaBCUH^8S&e|b&{!Q+@-~)oT zLywP1w=Gj#a!ipvT;I%inXcWSAbfne7QDyhGm=nfcjCo&i?`qFRn;BXd25S0%KJpf zGoTWz2H^8arSz2P)$x1DrbTZoTb)MD>6!|nx7dbj_aV?`Lv(`4Cw`gEK1|qID~()hO%9 zX+_a5f|V5sigiaHXn+hST64h48rvsXe zTWOhU7n$7P*@ih;z@QtRRrKR$({jaj@7a7vQ!4s&CbD9bf9-MN%V)4a@}tqf0*H! z@7ZMXM<4l|_H`!b9VVAT-}3FZ)O)NN#FwkQx5ce1NSG3>B1f@RT7VSxha&4$L1*5s zZ)zl-MzRTEGP^GGDr038a<2m6-*JNTRXB%PfOfOgwmI5-!aHnpr23``HNO7jjWm35kv2_ds>D05iBuakWtBOz2O3(Yjh5@k@ddRA1?oq##=x=7|Tl*u;TVD!) zIB*g6`@dN%J;~W$MjJ64$EkC@33C7)xuJt)s|Y&mekwNf-eSOVPT4LuQ5$g40MXG1Y;Ncb)Tv#vxxniMG&A}J`H{WQ3A$J<;% zKNmvt?p)XBp3Q13|7BGUse2I8J7D_3B(2bsP(CZ%h)ML4mNcR;E7qmj{(fY37G~^C z5bJ7mxlqjP!G3r{EnMo{4W~J4)Gd8@#|CRH_ruy2oA-UFlW~2QoGkzZ{+ROKfes?< zJX-ybX|g%=>y#nbuJ1;eSXM#9k=UysMchEW^jGPfYv`uor3Rc+ozM{)Cpe)u@Jb1s z-`wu$ar+7QjlrY(F_*BXsM@-v@X6LcGA$EQWP#3ox3d0>vv2OVNUrzu4bgLwV5$39 ztppej(^ZrqU%mclehAtByrqu1QTb4n(~Z_wT3st8sx?cSs_P>N^8m*hyzfQlU0&>A z@$5_U9N0I|0)0yt@;#;0aLz;oGWovq{gjnFH)tdr>tu5C!H{&;F!d9f4v&2{XxBk5 zY5K0}hnTXdKVY|zBD%!Ow2o9crnhEiM{RoXkmv^O(p*_>_Ae2LcM<)*g5OC#@2UW4 zm@(*yDqh^`=&^3zukMCj_@nKL9_ZYb60}QjD30DyvP3*6l{m_k{kbPL6Pxp#enFnS z6h+%`3(H8U_WesB&PizWM$i3+6lu(NRDx#1C#f~~hr#Qo2P*Skt~_wT+gB`!^Vd4{81b=2LQg+B&dMmVi#=ud<_aZ#@WQCj(eJ#B+j%dCDK8-` zd;1CeB-}6{;3a65Y%Tr;PVDV^rFLG^Ln^{wW5FdZy<`1>fX8TIJPx}J8k?9AbS&8W zAnA8|n;v0vni<`jBInt@6~(ORS*^>og0R zLJ^8j53%K-w$^lh@A0y4JtsO)I5Yh@*_&U}SNE!aIfB3RQNXqpG)MNvYzHsG)+dj& zta>DPf8WeaqxPKfi06;YyaQlX;>Whuaxw)BRozxErApF*88==e+icymEaBQM`R!h5 zhA!=B6{_k#t?IWMa7*g2B>XnALT1>)kJ*~jNW`UDp_J$aO{DBvFY(V?5)Yws{>b^w z0bfow!?-_T`Y;p1_Ur&LHk=dvN+I-cH}@0;I)91?!JCM?C>U(~qZd^S3E&`96+=nz76!{<64Bi}{_ct%4`YF> z;wNi~g+&KqGo>);!_kYt!Mx)-uu@9HGhD@v`K?q}F>$J+eHL zo~uM#2!S=e7hmrWuF8w7elwLAa4aM?T=qg;6iH|)|VknM#UgJ2xY_Y@^4l+@(c2p#PYA>IuhUBZZ7}#93_-XNut}pcMtHxW(TdRIe-DgfEgzE^-gx+Q-@DVN{E2 z^d@mWy-15yl1H?-BrBAn=e{4$Wu!+Cr+Eg}Z~f*MnCAT{@)N&xpYvFSNNQ*&1jzk~ zPw6lDroDGM9W7cnKDM{Z5ZafX^;c)bbtU11b*uUVmIqx>0~k+FcgtWog|lqaGQE#Q zXBF*;PMukN^g>ejO}d`WX84>O0n7e2jHb-+PGVy5=Q6O$fvt5q>QSGAaKfd(^8D5S zLq+>o9)BK~4_e+?S4`8Jub22VZdlE?ZyCVSt;m({fO}A(yRN+;^Jb}@*gJVo4pw$P znl`DNP-@L*8&CJx?~|9e8DY@tr5y8TfTN|FVH})FjiI+HB*-l|*jT-9d*<2{Xp&he zg4t@pIjYJa(Ed5CRgSLgw}*nBo55;-dvED}I)}JT(R)H^a_c{=MRVK$Keg%wxl#5R z^Xs$<({iNaj;XyLJXVc=+s_9?gvD6e+2&M)zN#nC+W-Crqwv;j8&cOLL%>`W+B9Fe zrbK^Y2JEub2<2g|uY{bl(pf@O0|rz3_@I)(Htu0ntZDNu z@I1C*wOM_)46=ou6YmR(i$o1>X-z;>L|Yus!Hf%`AWSBjv)(>U&=a5VP!H92B?zOi z84`_3Koa+|rn>Gn;Q!Q3IX;h1g=#L0-S+K2@cba(-u9|j81kLLmS818`(;*g4WRwiYzU`^LBre`;i~ zb=ln#U(bY-o(+YUmOG2Ak3zn=i)?)AYWD57k9X~U5uwZZ^yET){lOo)e1I9HhB0C1 z!5w-oBNoHj$R#sY-nK-uuH3Po%WC*5?#;SpzszT>_tkDueB4kbdvnL(6bhBIzWKrt zdrPQw=M0lRi(-YXcRs%QP(f4=SALvX#2fO{`h0$~UTup}1f96qZ`X*y zo60QGbT4ua8rhSGKNILycsQOE=#<@{nJzeJ!XCFnrI5HWe<*%11vWWI z&5!G}#2ikw5!s|z=PJ)RWWwaXcevYj2Pl9q`(40;8AUiQmSI~EOjxD|qc-Pp%~#;% z%?pHfN7U-m^9>jI=+~B$cYRfmH~%=(9-pmYZT+usjFAq5sJ^)`-GO!1pWE$bMsHNU z!&*|`E2=^bs<>dGwt(3;awto@30V_MS)JD6%}s52#c>zIhp6xC}Cc zwn$}TN(~x)bEp&>E6z{s*cb%s*^$ZwMSzcQe{a;d4~)yueep@6G>*+1bMOXe^e`B4 z5L@<@YCyu}CVYELfv1>X=WnekevZ@vX6v!hhG>+;#JPyR>>0MFzS7xbDh+d>R05_% z8frMi@0jmcn?B%1oCz0TB&Q={Ox|l5h?p_h`AB*&sK5W{HAMPwZ%qQ*wm8n```5-EG|>c zxyu$&7MR3z6b80hsHBZy;tr+bj?3PN4vjh2EuO@C>F0|Eu{KlIW*sFMH)Xq9J{K&K zHh>0-#$+4=+321Zy~uro5_`stI|$ltQQ-@naH$gdI6c`flY{CCTh@X+hr4)xr23%F(5pu=^Qq@}2_SN*m<l{FAKq@+R9v<3yGvUto@;9PU*u|hmhhfW8>*vFb%|$Ral>_WdI#6MEbT!rE4%?ACZ>6&8aOc-J za7gqbg-Qhy7*=X{#&Z3ISDuyYQu97#&kfjyXw`QYSRr6EWdL-QV z#$SWWKXBY|O4BqLW;c?Ft(ADr+`P`n!Laynm#0%5vibBU?$jVeHJ zcn~g?h#KuxgD3@#l0Wx|PMU||zn(!}@IDQpHz``X*z#inze?S??f38B*>_6@z%J87Jb?J9IAA!%NI0kI`Qq0{{QUfX(g(7l>Bw#~#B-b>-$%JsL`{BNOQ zY4{+hY3l?A;!dMe+~G)(7M01@{+m(0l6D9~tHZ-o6jKpr8ZIT8sqapr$+5nOKoFsu zLMIRz9K2osRNc%lO=JZl6IZS_PnhAP=|f2MkEJ?qt%=fS-soh*c}u#F3q!v$)UX3h zv(gSfD!OTv*!v^UdpS1tBX3EeQ6Gt){8h`&YNETtpa*zBu`&`$CH0l zJFf3m!N5%GDc0S0Q`$)`sN*!{4Pzo>qjVl`@`L9+!L7XA3ZgUdaP^gMM1T(}r~cv- zabnWU(1nZS*Ke~A36ICPk(rAqE#3f06Cb&}mGhqdPFhTBzK(;c;?7+cR?vvy%z;OE z9zz@({b_N|`HLCv0>vcUx9a=RJ4aGbjd|2Ad28htt53K=Yy07JaGo!31jF@N671b< zBss$cUupv2nbt}NM{ZR4iiPf}eKjqDhL5q*$?Tt!_!@?rKJhFv?J>95eY@V|V0rfi zL=7hpGL^WDoo}PB6YGyG9j(Asb{Z&si5^mc7rjIiYvx+}vX3^8oE+!<-1Auh>~%e1}5Dp8wDbGft1`0LsHdKenn)QvYtB_>{+T z>T#ont;td3V5=q9T4`r5uPtnRy}a3EFM4;u7_?&YZo73dhChs0kgj;1cyoX|n(C(0 z&})3|NC_HJHC3CU9yo)!_@{<|FHr%*rb)cLYt-T=imc%o^46Thd>(*_%QeRma-Mf_EVB&-4W|!JF=UfXM`;8D zi3gy7PHGdUx$1!tt3B8scec|Ojq*^2UFg}dKGhgbr#z`_`jNtAHb#T-q*0hHv>5XEb-X;0gO5tfqh$Qze>JSxxcABXZ z>b!N5!e@e&QWO%lPjDnu?Go3aw|_VgjfBKut=u0(&jS0I1#F2~lEg-@C)6Nsio2%~ z^eAJSW3@%M2YkmyLiF6B4~Mu@!-tt^Kr@*h;dOqn{6_a*G^8d4-##8bg424IPPy;D zmg%mw-zwPLU%Efh5HSFjm2?buY8<8=FwG9Y^K&C-8@v#;Gkj#0fH8wy33SKp_bY~W zH)at#3^~>uFyIF0-;Lu%zegrX)OTX)t>lu)^)Rxx#EZU1GVJ zl=A2stOq_kN)xg8^3f38gtIu#7Ian3RNWr+TmAX28{<3p{A&A%jt@a_vK==z+YP(- zw#5pfwMl?+k&VgeHv44U=Y76!j)?18o27Uh^0Q9BzWR-aF`PpgUWEyc)*_39oy{l1 z%bV5OO>tmf1mZ;gtM!b2tK?d&^%oZIar=Ti0edrlpd6oWFC44+m5fJ1(Wm`aA39Sj zFO85+Y=1G)i9B2XT#OelsGiwv+1?@fu0{4n1hfybE*=QSrp%T3CRU4`d#)o_)*IHI z9klpFJpR@QzqOQR) z>wDd!mPtwa#J)nUeVO!(T$}2U_)8Z&v`}i1GImg6t3CH1%BjpaX5&scXaEc4jmbU2 z6QmhA5fq`zGnhM1%k zcy8n*0A&pVH=B~K>>}sLFru*bX~0o4q5B^Dc6cpxRWjHz_cDGY3o0yl^bnqZSOJ%9 zAm!=s?)mnPYroA}#+?_iqf*upD9G+Wm^gJYbLtWz#PK6B=wcPY*q3Qvj42#r?7iz6z zwN8F$QuWEc!B3j1%B_?kRFhhupuREUS7DLpKtYA)b5C)@U2HpP`vQL?A^w6)s+ARk z&Yj77a_@$C2C=(&_I1ZY8SJH-Sr_WIo(-RU1B7#mS`o_CLK@xMN2gBH{Ef2R#fB{N z?-N&J!J-IvA^WK%yGPsJ_kj`?#>YXEaSvxUYMXs#KKynC((U(X3v4_$$7VW>Rg?u* z&SDe3wN)F6a%|qz$xidZW#8|?A&lL_j{3}> z-mk#@Cea9Sc)ofN;t}hrhR522wVCdeTol=H4=7esT&{5`KXLihv*)LE+QC62f@`*p ze&Si8AA~hSU)DsJGOj>3saae$G-5Gkgrmw;C%bFCnmW3Ro$o zO!TRx^BuHIPQ3n?w?FHe_oOohLd0%W4wyYok$kCn(Pdn$KJle+_98uE7;OWB>BQ3< zp*4NlN{5NxKUUR3Ma&d;%dxBl+13s(k)Y-bgO#XQQfBF>d}&I4Ft4GGzn|>plAYu< zE?~#L;lFctNLA=2!eZe@jUgDPTp17QG@>=mUQ@TrN!KrA6bvihU#Fu`zL;%tn=3!0 z8Po;SWd+UsY+>?qskS+Ys6#fy$9pHE1Q588v5Oy@qO#pcXl{<1F98T75qJ45fYpQJ z$l-nZ_XtjK77cmX?8D4@NQl+M+Hqr~HD z+F|mT*@&W2{v@E}fc-ZH)*sbern|Sqj+9!2PrZFkI zw%00Nq!%D#)5(z#Y45pAN&Mi(e52f{1)fkB1Z5ra;Be+C0vF|$e%=e1*C=e)i|RFz z*gxK#EzP6B@!kG$lSE|_`7yVD75B^tbD(Xa()EOVbM z%aiIx>ExEBofsB!=jP(D*m3`6B&t{5AJs7zMGEIpa_;MZ2ZQZ4pa*t|a!I(OKCU6P znr21Md@VHe+ccOO)2*1m=Uo$Paon5x4r5Uyqelc(qKzU*0_Ef3o||9)uS z2P;#XV0!$fp$TUwghIGXu7Adj+}3Pa;bp-4j$}ugBget1=9O=-qT3i5MV!jezwwyw z%%nr0$6`{S@4pJNmM)7yUG-o95&Ek}rsC^fYf}8nGGAvGT_C0i1jPS$#Q!Vj!N`Jn zOu1%Y$pfx**J@olSjoLpb7|-R8U-uJ@l>vmBwX97y!bWQMjKl`IU5k)#KY(3in;tI z2>&@*!9QNOWC*Ss&Ns$?>E@_i|0Hz_D7n1<#P_;F2frTZ9b0)>^qlo78YsmW2Go+@ zx-0Q-Jz!B|a-ff+LZ{%;NV()O#uzz(>j;P${$oroAji=-UN~}T%KZ%~Dl!43gsK{vU@%=nHzrBZcHp( zpyDAWl3<}TOF#h0`F;ADXH_!Hkhn<_HjOu@q4y>n+9gFl!&QP?`zi|@g(gNe^#k(* z;JBeVB_emzfyDbZ(DyPxBES2Wo2BNyv?5ayI|5qv8J=s`%nHSQTzcOg{B1I0;PgVV zHUC17yn5Hs#FCr@kS)(@zM8+?G5As$7V-r>zN;*@S|((zlM)8WC%f5YzOj028a?p_BMEf0I|Ps^^&B1Pm{_6vL#A5*32kKf3Q zdr%h?re>u1{89{pNC}Or-JMo~C8M`KJF;7@7E;M_JR5uqw2|MGNpkxu;!n6Ad!eQ~ zMs|jaOh2j^u;u^j_FMp}Uw~W%bC86OVAq_9J(JeF>7o&{mhKHZpb2RpioM}))6q{w zMkQ!~X%#uW2x->X*TP7k!Ame#hUTA~+TyF2?kUl{S@s{(p*vk{A^psl2Z*WgqRryp zyV9h((>yPW)T$MJKI&Pvm!TM+`27UvpIL#i0V#5TfS-ylc9R=oi#C+~`ac>cv6aJs z>F3^`{#G$crDEIJEo6q`1g1>6$9pspM`^KZ!k+?2K`VXlA3giNHxE@jMR2Tv_SJw29%mb#4iY5#AC%KFptcl)1b z78W~e1=FINXEyy^g5_@z>pbg+PQF<|(bE%>`mD|ddz6fs{u+U-of-$IT?ht7zQ)9O z5kZ??__ue+l4W4LH=RKOHQDnPM*dM_v{`Dbj$3%QQ1Wzuu4tjrif{4H{pc*wVsuEr zmQd+=W^;4}h$`r3{Z4_%C0|LMU^NVAefC| z4KaRcyl5o;v?FSaE;4;j`V8QSdHB-Eoxf_8FzDHuDcJd2+m;%HX;kE#+a?Yob3Qn3 zTbZR3@-)1)H=Wih%#8`-MR7`c*I$aW*)=Zq!EUB}UKLvtNbC92GXcY>2|pT%d3e)f zE5ZJA6hd^B`WEOZ6o>6^CzI3*%wH5ui~G@uEX82yel1Inq5}fk2Jfm;*=NBzurd43 zpVuflRPaZDOm=b6x2x|n+$XDlwNW(GyyX1-u6bi)ZFkFu{s;b$6iL=;E9~M#zEb~5m)1jVl6!{;r@PV2!Nm=!TG;dEyge@bWy3F^C9+Y3EwfHnSc`b6PEoOYH08EOY3#X= zAWQK~lYnYXl&0nXeH}g|QTN1+YDU69Q!{#lAj8FAYZg^e;azkPk4szFsiwU)x+htMl%`|JUBN#zVEW z@tJWwbWkcPGP)o%RMLf*=t3CXgvPBCN(zZEZlj!36otWYmzu*Emx)omGssCUb98wJ z<2ubL6q9HiCb#jf*`t2v!~6aH@a~U${boPw+0R=0S^xikul0;_ao7wgzN22KshjZI zPDimrC+L`r^>cLHGSRQ14^5HVK^-<7BwZI=y8-(7 zqX(0w08KS%RK#pYvLfeCJH1wtY3@*NfVH>`!K0qPtb;|*I4e%oSN)#N;0(QpH{qg> zf@9m2b@Jm9hj!~26Ik0vj#n8x|1c9n7_VnAK&b@gn#U2hLdyD6D`$<}bM7BC=EffZ z2<>G1{xcBlY25VYQ+xU!A(J0pmW#%;^0H4Plx*E%2hfsNk=(ch8SUPX68q%zE4+|! z?d7wp%)tem)C#dv2dDODJrUiB?~Fa#@7%RgXe*uz|4iuE&oZz2pSbjD^=I>p4Gsvq z*417vtfrRQ=y_&haJG8tfmXWUeBU#jLM#-VGb-mlkM@4F4k6T3QBs+G^~TyMw}B`6 zNB)EkA*&d~kvh|ZzucJlDb%B!9J8x>JUxX(*+r#Hv%V#BkGL${$6WWha!e?Wj@OEo zUC~%50U%JvR_c{mpg)%98%f!5_&?`ZlG=uUrICH^T?`yJwwll0cIrHu)8TMmSDe87 zEJDe~?(Sxn2cou^pLD7X7ew7$a(4@Gx6QZkDCBOIyj#tDMKHT>(V$7LEh#ah=KMy* z$YmUkylcm$%&6`v$Lqw2qRxs<49zKUfVDQIMB~t1^pg{cSgY^DjeDl{8agB2Cvv z?3{j@G3|D>G0HEoBA`oKiZheRW-OvRO(h>nt?{RM*Fq=DNUxJAv9I53i+mTepgn@8x4N9F&<*tC zJQt8Was;^ALP0=AYB8w4jwiPX;$2$g2r< zG7Z$eGMm({zo^*7&|eg_#hR+uI$N?=&whH!rW=|G1Qupxg&uyaY1)I(sx*E&t8*3E(Ax1I_a^0q*sMowQs;n z)~=d@FyyVUI0aQy7I4zH=;d~algq=0ixsJ9K6kmNA07!*$Q=o}YeC_x_#8_hervg=;dwvAov`Kx8jh1OcxSEt!ym>1G>iE7r?H{gidtE{ylMO;QQ zODP{>a0jfsYPp!9M~REptFLMe+ePGS5N>G%beU5arIR$gMNeD)c-YAB>OaycKu zNP}wstbFOVdVyHuFrW7PN&CshnXiYve|6Ksmqt`<-Ioo z@;=Hg0iS!IEje*mN~yv~?YRdbZ^;QE<$CE%LPh;pFJG7^n@gJ9&7XZ5 zG-m!zP&Y4-^Knn$)(ss#^mQdq*6QoUunXck3@?s1M3(j4W0R4&R#Q0J#mV?Ujfh9% zod$XBz4LeS$SdZ3s5Y{Bpa|1TR|g%2tfg*8Ori<880fCx?=X+~EAOtrpr3 zhFs<2#HX`EcYa$ZVUgLWy`!T!$=o!5(xTI=ZpMM%c5Yu^Rn@80vF%P6j&Z_cWCy(} z+146;3CytSRu@RcK*W8Pc{VnHQ8hJ8smgx0ydtcUde^bcQuE&@TDX%ji~PTh-b^}c zB?w&sb?|L!ZiMDBI7RwqenNYMqDBsPRQ`%Nx~F(oA-AX0<%KhNONDpnjjZ~8$r=g*>?~FzF1e0^k2Vs+>HrJ=Y`h6dK4LUgE*3O; zX&vHyozQ?7gZF8zmkq?W#0~$Y4>ZE0AtmX%#V7gzHD6#I7jIdF9=QPxD(n!o*L=4a z+RpY=9L09H?5obJ!@Iw%h1r1Wm zT7OuifRQSv8&3VuRF;7TI1pew;6NNmW5Cfxm$5lUKK z1&t+Q<#!X28+EWm@Fz9W@(hLD#0u8vLCKYhJW|fs3l!B9{}2)9jFg)Qb!AGfkSJ{) zLN+NAx=jT=q0d9qVJK>1BjDF)X^jTra#itdpv6N*qk-cywPC4~c%qcL@h?mLH&BRD z-=39ueD6dh2qAR{2%nIl@Kr$w&y3E*rA|~(N?r{&e}cS0qAE~IJU)%Ee5n(w2IMkz z@P!OA#B*vuM!^pWk0d-@;dc^FJaBe}mk@ZJTtXZ$;(=iuj9p=X4zm!LYQcOGCe5(? n0c$+4kOixCuq63^uDeRbDyDfeG13J + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + oonyeje.Kroleo.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + fb1166375230058840 + + + + CFBundleVersion + 1 + FacebookAppID + 1166375230058840 + FacebookDisplayName + Get Hip! + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + + diff --git a/GetHip/InviteFriendCell.swift b/GetHip/InviteFriendCell.swift new file mode 100644 index 0000000..a28f31b --- /dev/null +++ b/GetHip/InviteFriendCell.swift @@ -0,0 +1,35 @@ +// +// InviteFriendCell.swift +// GetHip +// +// Created by Okechi on 1/23/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class InviteFriendCell: UITableViewCell { + + @IBOutlet var friendName: UILabel! + + @IBOutlet var proImage: UIImageView! + + @IBOutlet var rdioButton: UIButton! + + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } + + /* + // Only override drawRect: if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + override func drawRect(rect: CGRect) { + // Drawing code + } + */ + +} diff --git a/GetHip/InviteFriendsView.swift b/GetHip/InviteFriendsView.swift new file mode 100644 index 0000000..8623a2e --- /dev/null +++ b/GetHip/InviteFriendsView.swift @@ -0,0 +1,116 @@ +// +// InviteFriendsView.swift +// GetHip +// +// Created by Okechi on 1/22/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit +import MultipeerConnectivity +class InviteFriendsViewControler: UITableViewController{ + var usr: [UserParseData] = [] + var frnds: [FriendData] = [] + let partyService = PartyServiceManager() + + @IBAction func cancelInvites(sender: UIBarButtonItem) { + + self.parentViewController?.dismissViewControllerAnimated(true, completion: nil) + + } + + + func setData(usrDat: [UserParseData], frndData: [FriendData]){ + self.usr = usrDat + self.frnds = frndData + //self.partyService.setData(self.usr[0].displayName) + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Uncomment the following line to preserve selection between presentations + // self.clearsSelectionOnViewWillAppear = false + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - Table view data source + + override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Potentially incomplete method implementation. + // Return the number of sections. + return 0 + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete method implementation. + // Return the number of rows in the section. + return 0 + } + + + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCellWithIdentifier("InviteCell", forIndexPath: indexPath) as! InviteFriendCell + + // Configure the cell... + + return cell + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return NO if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return NO if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. + } + */ + +} + +//extensions for connecting and inviting peers + diff --git a/GetHip/LoginViewController.swift b/GetHip/LoginViewController.swift new file mode 100644 index 0000000..5c106f6 --- /dev/null +++ b/GetHip/LoginViewController.swift @@ -0,0 +1,52 @@ +// +// LoginViewController.swift +// GetHip +// +// Created by Okechi on 1/2/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class LoginViewController: PFLogInViewController{ + var backgroundImage: UIImageView!; + + override func viewDidLoad() { + super.viewDidLoad() + self.signUpController = SignUpViewController() + //set custom logo background image + backgroundImage = UIImageView(image: UIImage(named: "1x")) + backgroundImage.contentMode = UIViewContentMode.ScaleAspectFill + self.logInView!.insertSubview(backgroundImage, atIndex: 0) + //customize common buttons in login + customizeButtons(logInView?.logInButton!) + + //customize login button + logInView!.logInButton?.setTitle("Sign In", forState: .Normal) + + //var loginFrame: CGRect = logInView!.logInButton!.frame + //loginFrame.origin.x = loginFrame.origin.x + //loginFrame.origin.y = loginFrame.origin.y + //loginFrame.size.width = loginFrame.size.width - 100 + //loginFrame.size.height = loginFrame.size.height + //logInView!.logInButton!.frame = loginFrame + + //customize password forget button + logInView!.passwordForgottenButton?.setTitleColor(UIColor.whiteColor(), forState: .Normal) + + } + + func customizeButtons(button: UIButton!){ + button.setBackgroundImage(nil, forState: .Normal) + button.backgroundColor = UIColor.clearColor() + button.layer.cornerRadius = 5 + button.layer.borderWidth = 1 + button.layer.borderColor = UIColor.whiteColor().CGColor + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + //stretch background image to fill screen + backgroundImage.frame = CGRectMake(0, 0, self.logInView!.frame.width, self.logInView!.frame.height) + } +} diff --git a/GetHip/Main.storyboard b/GetHip/Main.storyboard new file mode 100644 index 0000000..8a918da --- /dev/null +++ b/GetHip/Main.storyboard @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GetHip/ParseNetDebug.h b/GetHip/ParseNetDebug.h new file mode 100644 index 0000000..229037f --- /dev/null +++ b/GetHip/ParseNetDebug.h @@ -0,0 +1,25 @@ +// +// ParseNetDebug.h +// GetHip +// +// Created by Okechi on 1/6/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +#ifndef GetHip_ParseNetDebug_h +#define GetHip_ParseNetDebug_h +#import +#import + +@interface ParseNetDebug : NSObject + ++ (void)receiveWillSendURLRequestNotification:(NSNotification *) notification; + + ++ (void)receiveDidReceiveURLResponseNotification:(NSNotification *) notification; + + + +@end + +#endif diff --git a/GetHip/ParseNetDebug.m b/GetHip/ParseNetDebug.m new file mode 100644 index 0000000..22f87bd --- /dev/null +++ b/GetHip/ParseNetDebug.m @@ -0,0 +1,29 @@ +// +// ParseNetDebug.m +// GetHip +// +// Created by Okechi on 1/7/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +#import "ParseNetDebug.h" + +@implementation ParseNetDebug: NSObject ++ (void)receiveWillSendURLRequestNotification:(NSNotification *) notification { + NSURLRequest *request = notification.userInfo[PFNetworkNotificationURLRequestUserInfoKey]; + NSLog(@"URL : %@", request.URL.absoluteString); + NSLog(@"Method : %@", request.HTTPMethod); + NSLog(@"Headers : %@", request.allHTTPHeaderFields); + NSLog(@"Request Body : %@", [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding]); +} + ++ (void)receiveDidReceiveURLResponseNotification:(NSNotification *) notification { + NSURLRequest *request = notification.userInfo[PFNetworkNotificationURLRequestUserInfoKey]; + NSHTTPURLResponse *response = notification.userInfo[PFNetworkNotificationURLResponseUserInfoKey]; + NSString *responseBody = notification.userInfo[PFNetworkNotificationURLResponseBodyUserInfoKey]; + NSLog(@"URL : %@", request.URL.absoluteString); + NSLog(@"Status Code : %ld", (long)response.statusCode); + NSLog(@"Headers : %@", response.allHeaderFields); + NSLog(@"Response Body : %@", responseBody); +} +@end diff --git a/GetHip/PartyServiceManager.swift b/GetHip/PartyServiceManager.swift new file mode 100644 index 0000000..9e2dd18 --- /dev/null +++ b/GetHip/PartyServiceManager.swift @@ -0,0 +1,233 @@ +// +// PartyServiceManager.swift +// GetHip +// +// Created by Okechi on 1/22/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import Foundation +import MultipeerConnectivity + + +protocol PartyServiceManagerDelegate { + func didConnectToPeer(serviceManager: PartyServiceManager, didConnectToPeer peerIDName: String ) + + func foundAPeer(serviceManager: PartyServiceManager, foundPeer: String) + + +} + +enum PeerType : Int { + case Host = 0 + case Guest = 1 +} + +enum HostSignalType: String { + case PauseAudio = "Pause" + case PlayAudio = "Play" +} + + + +class PartyServiceManager: NSObject { + + let PartyServiceType = "GetHip-Party" + var serviceAdvertiser: MCNearbyServiceAdvertiser! = nil + var myPeerID: MCPeerID! = nil + var serviceBrowser: MCNearbyServiceBrowser! = nil + var session: MCSession! = nil + // var delegate: PartyServiceManagerDelegate? + + //peer variables + var foundPeers: [String] = [] + var invitedFriends: [String] = [] + var role: PeerType! = nil + + var connectingPeersDictionary = NSMutableDictionary() + var disconnectedPeersDictionary = NSMutableDictionary() + + /*init(){ + + //self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: self.myPeerID, discoveryInfo: nil, serviceType: self.PartyServiceType) + //super.init() + //self.serviceAdvertiser.delegate = self + + }*/ + + /*deinit { + //stop all session services + self.serviceAdvertiser.stopAdvertisingPeer() + self.serviceBrowser.stopBrowsingForPeers() + }*/ + + /*lazy var session: MCSession = { + let session = MCSession(peer: self.myPeerID, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.Required) + + }()*/ + + //Peer Initializer + func setPeerID(dispName: String){ + self.myPeerID = MCPeerID(displayName: dispName) + println("PeerID set to %@", self.myPeerID.displayName) + } + + func setRole(peerRole: PeerType){ + self.role = peerRole + println("Role set to %@", self.role.rawValue) + } + + //Listening methods + func setAdvertiser(){ + self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: self.myPeerID, discoveryInfo: nil, serviceType: self.PartyServiceType) + self.serviceAdvertiser!.delegate = self + println("Advertiser Set") + } + + func startListening(){ + self.serviceAdvertiser.startAdvertisingPeer() + println("Started Listening for invitations") + } + + func stopListening(){ + self.serviceAdvertiser.stopAdvertisingPeer() + println("Stopped listening for invitations") + } + + //Browsing Methods + func setBrowser(){ + self.serviceBrowser = MCNearbyServiceBrowser(peer: self.myPeerID, serviceType: self.PartyServiceType) + self.serviceBrowser.delegate = self + println("Browser Set") + } + + func startBrowser(){ + self.serviceBrowser.startBrowsingForPeers() + println("Started Browsing for peers") + } + + func stopBrowsing(){ + self.serviceBrowser.stopBrowsingForPeers() + println("Stopped Browsing for peers") + } + + //Audio Streaming methods + func openOutputStream() -> NSMutableArray{ + + var outputs: NSMutableArray? + for peer in self.session.connectedPeers { + outputs?.addObject(self.session.startStreamWithName("music", toPeer: peer as! MCPeerID, error: nil)) + } + + return outputs! + } + + func outputStreamForPeer(peer: MCPeerID) -> NSOutputStream { + return session.startStreamWithName("music", toPeer: peer, error: nil) + } + + //Host Methods + func initializeSession(){ + self.session = MCSession(peer: self.myPeerID, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.Required) + println("Started Browsing for peers") + } + + //Deprecated + /* + func setData(dispName: String){ + + //initialize session variable + self.myPeerID = MCPeerID(displayName: dispName) + self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: self.myPeerID, discoveryInfo: nil, serviceType: self.PartyServiceType) + self.serviceBrowser = MCNearbyServiceBrowser(peer: self.myPeerID, serviceType: self.PartyServiceType) + self.session = MCSession(peer: self.myPeerID, securityIdentity: nil, encryptionPreference: MCEncryptionPreference.Required) + + //assign session delegates + self.serviceAdvertiser.delegate = self + self.serviceBrowser.delegate = self + self.session.delegate = self + + //start all services + self.serviceAdvertiser.startAdvertisingPeer() + self.serviceBrowser.startBrowsingForPeers() + } + */ + + func connectedPeers() -> [AnyObject]{ + return self.session.connectedPeers + } + +} + + +//delegate extensions +extension PartyServiceManager: MCNearbyServiceBrowserDelegate{ + + func browser(browser: MCNearbyServiceBrowser!, didNotStartBrowsingForPeers error: NSError!) { + NSLog("%@", "didNotStartBrowsingForPeers: \(error)") + } + + func browser(browser: MCNearbyServiceBrowser!, foundPeer peerID: MCPeerID!, withDiscoveryInfo info: [NSObject : AnyObject]!) { + + if(peerID.displayName != self.myPeerID.displayName) { + NSLog("%@", "foundPeer: \(peerID)") + self.foundPeers.append(peerID.displayName) + + } + + //implement way of picking which friends from friend list are invited + } + + func browser(browser: MCNearbyServiceBrowser!, lostPeer peerID: MCPeerID!) { + NSLog("%@", "lostPeer: \(peerID)") + } +} + +extension PartyServiceManager: MCNearbyServiceAdvertiserDelegate{ + func advertiser(advertiser: MCNearbyServiceAdvertiser!, didNotStartAdvertisingPeer error: NSError!) { + NSLog("%@", "didNotStartAdvertisingPeer: \(error)") + + } + + func advertiser(advertiser: MCNearbyServiceAdvertiser!, didReceiveInvitationFromPeer peerID: MCPeerID!, withContext context: NSData!, invitationHandler: ((Bool, MCSession!) -> Void)!) { + NSLog("%@", "invitingPeer: \(peerID)") + } +} + +extension PartyServiceManager: MCSessionDelegate{ + + func session(session: MCSession!, peer peerID: MCPeerID!, didChangeState state: MCSessionState) { + NSLog("%@", "peer \(peerID) didChangeState: \(state.stringValue())") + } + + func session(session: MCSession!, didReceiveData data: NSData!, fromPeer peerID: MCPeerID!) { + NSLog("%@", "didRecieveData: \(data)") + } + + func session(session: MCSession!, didReceiveStream stream: NSInputStream!, withName streamName: String!, fromPeer peerID: MCPeerID!) { + NSLog("%@", "didRecieveStream: \(streamName) from peer: \(peerID)") + } + + func session(session: MCSession!, didFinishReceivingResourceWithName resourceName: String!, fromPeer peerID: MCPeerID!, atURL localURL: NSURL!, withError error: NSError!) { + NSLog("%@", "didFinishReceivingResourceWithName: \(resourceName) from peer: \(peerID)") + } + + func session(session: MCSession!, didStartReceivingResourceWithName resourceName: String!, fromPeer peerID: MCPeerID!, withProgress progress: NSProgress!) { + NSLog("%@", "didStartReceivingResourceWithName: \(resourceName) from peer: \(peerID)") + } + + +} + +//state extensions + +extension MCSessionState{ + func stringValue() -> String { + switch(self){ + case .NotConnected: return "NotConnected" + case .Connecting: return "Connecting" + case .Connected: return "Connected" + default: return "Unknown" + } + } +} diff --git a/GetHip/PartySession.swift b/GetHip/PartySession.swift new file mode 100644 index 0000000..02ad588 --- /dev/null +++ b/GetHip/PartySession.swift @@ -0,0 +1,41 @@ +// +// PartySessionManager.swift +// GetHip +// +// Created by Okechi on 1/24/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import Foundation +import MediaPlayer + +class PartySession { + private var partyName: String! = "" + private var guests: [FriendData] = [] + private var host: FriendData! = nil + private var currentSong: MPMediaItem! = nil + + func setPartyName(name: String){ + + } + + func addGuests(guest: FriendData){ + self.guests.append(guest) + } + + func setHost(newHost: FriendData){ + self.host = newHost + } + + func getPartyName() -> String { + return self.partyName + } + + func getGuests() -> [FriendData] { + return self.guests + } + + func getHost() -> FriendData { + return self.host + } +} diff --git a/GetHip/PartySessionManager.swift b/GetHip/PartySessionManager.swift new file mode 100644 index 0000000..5c60c2d --- /dev/null +++ b/GetHip/PartySessionManager.swift @@ -0,0 +1,9 @@ +// +// PartySessionManager.swift +// GetHip +// +// Created by Okechi on 1/24/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import Foundation diff --git a/GetHip/SettingsCellWrapper.swift b/GetHip/SettingsCellWrapper.swift new file mode 100644 index 0000000..18cc87f --- /dev/null +++ b/GetHip/SettingsCellWrapper.swift @@ -0,0 +1,66 @@ +// +// SettingsCellWrapper.swift +// GetHip +// +// Created by Okechi on 1/21/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import Foundation + +class DisplayNameCell: UITableViewCell { + @IBOutlet var dispName: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } +} + +class UserNameCell: UITableViewCell { + @IBOutlet var usrName: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } +} + +class EmailCell: UITableViewCell { + @IBOutlet var email: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } +} + +class ResetPassCell: UITableViewCell { + + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } +} + +class ProfilePicCell: UITableViewCell{ + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } +} \ No newline at end of file diff --git a/GetHip/SettingsDetailViewWrapper.swift b/GetHip/SettingsDetailViewWrapper.swift new file mode 100644 index 0000000..66d7ca0 --- /dev/null +++ b/GetHip/SettingsDetailViewWrapper.swift @@ -0,0 +1,213 @@ +// +// SettingsDetailViewWrapper.swift +// GetHip +// +// Created by Okechi on 1/22/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class DisplayDetailViewController: UIViewController { + var possibleName: String! + + @IBOutlet weak var textfield: UITextField? + + @IBOutlet weak var ChnDspName: UIButton! + + + @IBAction func DspBtnConfrim(sender: UIButton) { + + self.possibleName = self.textfield?.text + + //sanitize and alert for input and success later + + var query = PFUser.query() + var currentUser = PFUser.currentUser() + + query!.whereKey("username", equalTo: (currentUser?.username as String!)) + + query!.getFirstObjectInBackgroundWithBlock { + (object, error) -> Void in + + if error != nil || object == nil { + println("Object request failed") + } + else if let object = object{ + object.setObject(self.possibleName, forKey: "displayName") + object.saveInBackground() + //NSNotificationCenter.defaultCenter().postNotificationName("savingName", object: nil) + } + } + + println(self.possibleName) + } + + var displayName: String! + + func setData(display: String){ + self.displayName = display + } + + func refreshView(notification: NSNotification){ + + + } + + override func viewDidLoad() { + super.viewDidLoad() + + self.textfield?.placeholder = self.displayName + + self.ChnDspName.layer.borderWidth = 1 + self.ChnDspName.layer.cornerRadius = 5 + self.ChnDspName.layer.borderColor = UIColor.blackColor().CGColor + // Do any additional setup after loading the view. + NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshView:", name: "savingName", object: nil) + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} + +class EmailDetailViewController: UIViewController { + var possibleEmail: String! + + @IBOutlet weak var textfield: UITextField? + + @IBOutlet weak var ChnEmailBtn: UIButton! + + @IBAction func ChnEmailComfirm(sender: UIButton) { + + self.possibleEmail = self.textfield?.text + //sanitize and alert for input and success later + + var query = PFUser.query() + var currentUser = PFUser.currentUser() + + query!.whereKey("username", equalTo: (currentUser?.username as String!)) + + query!.getFirstObjectInBackgroundWithBlock { + (object, error) -> Void in + + if error != nil || object == nil { + println("Object request failed") + } + else if let object = object{ + object.setObject(self.possibleEmail, forKey: "email") + object.saveInBackground() + NSNotificationCenter.defaultCenter().postNotificationName("savingEmail", object: nil) + } + } + + println(self.possibleEmail) + } + + + var email: String! + + func setData(email: String){ + self.email = email + } + + override func viewDidLoad() { + super.viewDidLoad() + + self.textfield?.placeholder = self.email + + self.ChnEmailBtn.layer.borderWidth = 1 + self.ChnEmailBtn.layer.cornerRadius = 5 + self.ChnEmailBtn.layer.borderColor = UIColor.blackColor().CGColor + // Do any additional setup after loading the view. + NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshView:", name: "savingEmail", object: nil) + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + func refreshView(notification: NSNotification){ + + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} + +class ProfileDetailViewController: UIViewController { + var profileImg: UIImageView! + + + @IBOutlet weak var img: UIImageView! + @IBOutlet weak var ChngPhtoBtn: UIButton! + + + + @IBAction func changePhoto(sender: UIButton) { + //code to change profileImg + } + + + func setData(){ + self.profileImg = nil + } + + override func viewDidLoad() { + super.viewDidLoad() + self.img!.layer.cornerRadius = self.img!.frame.size.width/2 + if self.profileImg == nil{ + self.img!.backgroundColor = UIColor.grayColor() + } + else{ + self.img = self.profileImg + } + + self.ChngPhtoBtn!.layer.borderWidth = 1 + self.ChngPhtoBtn!.layer.cornerRadius = 5 + self.ChngPhtoBtn!.layer.borderColor = UIColor.blackColor().CGColor + + // Do any additional setup after loading the view. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/GetHip/SettingsTableViewController.swift b/GetHip/SettingsTableViewController.swift new file mode 100644 index 0000000..f93415e --- /dev/null +++ b/GetHip/SettingsTableViewController.swift @@ -0,0 +1,280 @@ +// +// SettingsTableViewController.swift +// GetHip +// +// Created by Okechi on 1/21/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class SettingsTableViewController: UITableViewController { + // var manager = UserParseDataSource() + var user = [] + + + @IBOutlet weak var logOutBtn: UIButton! + @IBOutlet weak var table: UITableView! + + @IBAction func dismissSettingsView(sender: UIBarButtonItem) { + + self.parentViewController?.dismissViewControllerAnimated(true, completion: nil) + } + + + @IBAction func logOutUser(sender: UIButton) { + PFUser.logOut() + + if PFUser.currentUser() == nil { + + self.performSegueWithIdentifier("LogOutSegue", sender: sender) + + } + + } + + func setData(usr:[UserParseData]){ + self.user = usr + } + + override func viewDidLoad() { + super.viewDidLoad() + self.navigationItem.title = "Settings" + + self.logOutBtn.layer.borderWidth = 1 + self.logOutBtn.layer.cornerRadius = 5 + self.logOutBtn.layer.borderColor = UIColor.blackColor().CGColor + + //NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshTable:", name: "refreshSettingsView", object: nil) + + self.table.reloadData() + // Uncomment the following line to preserve selection between presentations + // self.clearsSelectionOnViewWillAppear = false + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - Table view data source + + override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Potentially incomplete method implementation. + // Return the number of sections. + return 1 + } + + + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete method implementation. + // Return the number of rows in the section. + return 5 + } + + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + println(indexPath.row) + switch indexPath.row { + case 0: + let cell = (self.tableView.dequeueReusableCellWithIdentifier("DispNameCell", forIndexPath: indexPath) as? DisplayNameCell)! + + if self.user.count > 0 { + cell.dispName.text = (self.user[0] as? UserParseData)!.displayName + } + + return cell + + case 1: + let cell = (self.tableView.dequeueReusableCellWithIdentifier("UserNameCell", forIndexPath: indexPath) as? UserNameCell)! + + if self.user.count > 0 { + cell.usrName.text = (self.user[0] as? UserParseData)!.username + } + + return cell + + case 2: + let cell = (self.tableView.dequeueReusableCellWithIdentifier("EmailCell", forIndexPath: indexPath) as? EmailCell)! + + if self.user.count > 0 { + cell.email.text = (self.user[0] as? UserParseData)!.email + } + + return cell + case 3: + let cell = (self.table.dequeueReusableCellWithIdentifier("PassCell", forIndexPath: indexPath) as? ResetPassCell)! + + if self.user.count > 0 { + + } + + return cell + default: + let cell = (self.table.dequeueReusableCellWithIdentifier("PictureCell", forIndexPath: indexPath) as? ProfilePicCell)! + + if self.user.count > 0 { + + } + + return cell + } + } + + override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { + + switch indexPath.row { + + //display name view + case 0: + + if self.user.count > 0 { + + self.performSegueWithIdentifier("DisplayNameSegue", sender: nil) + } + + //user name view + case 1: + + if self.user.count > 0 { + + + } + + break + + //email view + case 2: + + if self.user.count > 0 { + self.performSegueWithIdentifier("EmailSegue", sender: nil) + } + + //reset pass + case 3: + + if self.user.count > 0 { + + } + break + + //Profile Picture View + default: + + if self.user.count > 0 { + self.performSegueWithIdentifier("PhotoSegue", sender: nil) + } + + } + } + + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + if let indexPath = self.table.indexPathForSelectedRow() { + + switch indexPath.row { + + //display name view + case 0: + if self.user.count > 0 { + let vc: DisplayDetailViewController = (segue.destinationViewController as? DisplayDetailViewController)! + vc.setData((self.user[0] as? UserParseData)!.displayName) + + println(vc.displayName) + } + + //email view + case 2: + + if self.user.count > 0 { + let vc: EmailDetailViewController = (segue.destinationViewController as? EmailDetailViewController)! + vc.setData((self.user[0] as? UserParseData)!.email) + + println(vc.email) + } + + //reset pass + case 3: + + if self.user.count > 0 { + + } + + //Profile Picture View + default: + + if self.user.count > 0 { + let vc: ProfileDetailViewController = (segue.destinationViewController as? ProfileDetailViewController)! + vc.setData() + println("img") + } + + } + + } + + } + + /* func refreshTable(notification: NSNotification){ + self.user = manager.getUser() + self.table.reloadData() + }*/ + + /* + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as! UITableViewCell + + // Configure the cell... + + return cell + } + */ + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return NO if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return NO if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/GetHip/SignUpViewController.swift b/GetHip/SignUpViewController.swift new file mode 100644 index 0000000..ff5f49a --- /dev/null +++ b/GetHip/SignUpViewController.swift @@ -0,0 +1,29 @@ +// +// SignUpViewController.swift +// GetHip +// +// Created by Okechi on 1/3/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class SignUpViewController: PFSignUpViewController{ + var backgroundImage: UIImageView!; + + override func viewDidLoad() { + super.viewDidLoad() + + //set custom logo background image + backgroundImage = UIImageView(image: UIImage(named: "1x")) + backgroundImage.contentMode = UIViewContentMode.ScaleAspectFill + signUpView!.insertSubview(backgroundImage, atIndex: 0) + //self.signUpController?.signUpView!.insertSubview(backgroundImage, atIndex: 1) + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + //stretch background image to fill screen + backgroundImage.frame = CGRectMake(0, 0, signUpView!.frame.width, signUpView!.frame.height) + } +} \ No newline at end of file diff --git a/GetHip/SongCellWrapper.swift b/GetHip/SongCellWrapper.swift new file mode 100644 index 0000000..8e5d128 --- /dev/null +++ b/GetHip/SongCellWrapper.swift @@ -0,0 +1,70 @@ +// +// SongCell.swift +// GetHip +// +// Created by Okechi on 1/24/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class SongCell: UITableViewCell { + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} + +class AlbumCell: UITableViewCell { + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} + +class ArtistCell: UITableViewCell { + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} + +class FilterCell: UITableViewCell { + @IBOutlet var filterBtn: UIButton! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} \ No newline at end of file diff --git a/GetHip/SongSelectionViewController.swift b/GetHip/SongSelectionViewController.swift new file mode 100644 index 0000000..cba6355 --- /dev/null +++ b/GetHip/SongSelectionViewController.swift @@ -0,0 +1,226 @@ +// +// SongSelectionViewController.swift +// GetHip +// +// Created by Okechi on 1/24/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit +import MediaPlayer + +class SongSelectionViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { + + + + @IBOutlet weak var table: UITableView! + + + @IBAction func selectFilter(sender: AnyObject) { + let filterMenu = UIAlertController(title: nil, message:nil, preferredStyle: .ActionSheet) + let cell: FilterCell = self.table.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0)) as! FilterCell + + let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: { + (alert: UIAlertAction!) -> Void in + }) + + let songFilterAction = UIAlertAction(title: "Songs", style: .Default, handler: { + (alert: UIAlertAction!) -> Void in + self.filter = "Songs" + cell.filterBtn.titleLabel?.text = self.filter + self.table.reloadData() + }) + + let albumFilterAction = UIAlertAction(title: "Albums", style: .Default, handler: { + (alert: UIAlertAction!) -> Void in + self.filter = "Albums" + cell.filterBtn.titleLabel?.text = self.filter + self.table.reloadData() + }) + + let artistFilterAction = UIAlertAction(title: "Artists", style: .Default, handler: { + (alert: UIAlertAction!) -> Void in + self.filter = "Artists" + cell.filterBtn.titleLabel?.text = self.filter + self.table.reloadData() + }) + + switch self.filter { + + case "Artists": + filterMenu.addAction(songFilterAction) + filterMenu.addAction(albumFilterAction) + case "Albums": + filterMenu.addAction(songFilterAction) + filterMenu.addAction(artistFilterAction) + break + default: + filterMenu.addAction(artistFilterAction) + filterMenu.addAction(albumFilterAction) + break + } + filterMenu.addAction(cancelAction) + self.presentViewController(filterMenu, animated: true, completion: nil) + } + + private var filter: String! = "Songs" + + @IBAction func cancelInvites(sender: UIBarButtonItem) { + + self.parentViewController?.dismissViewControllerAnimated(true, completion: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + self.table.delegate = self + self.table.dataSource = self + + // Do any additional setup after loading the view. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Potentially incomplete method implementation. + // Return the number of sections. + return 1 + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete method implementation. + // Return the number of rows in the section. + + + switch self.filter{ + + //return number of rows for albums + case "albums": + var albumsQuery = MPMediaQuery.albumsQuery() + var albums = albumsQuery.collections + return albums.count + 1 + + //return number of rows for artists + case "artists": + var artistsQuery = MPMediaQuery.artistsQuery() + var artists = artistsQuery.items + return artists.count + 1 + + //return number of rows for song + default: + var songsQuery = MPMediaQuery.songsQuery() + var songs = songsQuery.items + return songs.count + 1 + } + + } + + func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + + if( indexPath.row == 0){ + let cell = self.table.dequeueReusableCellWithIdentifier("FilterCell", forIndexPath: indexPath) as? FilterCell + + return cell! + + } + else{ + switch self.filter{ + + //return albums cell + case "albums": + let cell = self.table.dequeueReusableCellWithIdentifier("AlbumCell", forIndexPath: indexPath) as? AlbumCell + + + var albumsQuery = MPMediaQuery.albumsQuery() + var albums = albumsQuery.items + var rowItem: MPMediaItem = albums[indexPath.row - 1] as! MPMediaItem + + cell?.textLabel?.text = rowItem.valueForProperty(MPMediaItemPropertyAlbumTitle) as? String! + cell?.detailTextLabel?.text = rowItem.valueForProperty(MPMediaItemPropertyAlbumArtist) as? String! + + var artwork: MPMediaItemArtwork = rowItem.valueForProperty(MPMediaItemPropertyArtwork) as! MPMediaItemArtwork + + var artworkImage = artwork.imageWithSize(CGSize(width: 44,height: 44)) + + if(artworkImage != nil){ + cell?.imageView?.image = artworkImage + } + else{ + cell?.imageView?.backgroundColor = UIColor.grayColor() + + } + + return cell! + + //return artists cell + case "artists": + let cell = self.table.dequeueReusableCellWithIdentifier("ArtistCell", forIndexPath: indexPath) as? ArtistCell + + + var artistsQuery = MPMediaQuery.artistsQuery() + var artists = artistsQuery.items + var rowItem: MPMediaItem = artists[indexPath.row - 1] as! MPMediaItem + + cell?.textLabel?.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String! + + var artwork: MPMediaItemArtwork = rowItem.valueForProperty(MPMediaItemPropertyArtwork) as! MPMediaItemArtwork + + var artworkImage = artwork.imageWithSize(CGSize(width: 44,height: 44)) + + if(artworkImage != nil){ + cell?.imageView?.image = artworkImage + } + else{ + cell?.imageView?.backgroundColor = UIColor.grayColor() + + } + + return cell! + + //return song cell + default: + let cell = self.table.dequeueReusableCellWithIdentifier("SongCell", forIndexPath: indexPath) as? SongCell + + + var songsQuery = MPMediaQuery.songsQuery() + var songs = songsQuery.items + var rowItem: MPMediaItem = songs[indexPath.row - 1] as! MPMediaItem + + cell?.textLabel?.text = rowItem.valueForProperty(MPMediaItemPropertyTitle) as? String! + cell?.detailTextLabel?.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String! + + var artwork: MPMediaItemArtwork = rowItem.valueForProperty(MPMediaItemPropertyArtwork) as! MPMediaItemArtwork + + var artworkImage = artwork.imageWithSize(CGSize(width: 44,height: 44)) + + if(artworkImage != nil){ + cell?.imageView?.image = artworkImage + } + else{ + cell?.imageView?.backgroundColor = UIColor.grayColor() + + } + + return cell! + } + } + + + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/GetHip/TestInviteFriendsCell.swift b/GetHip/TestInviteFriendsCell.swift new file mode 100644 index 0000000..60b833d --- /dev/null +++ b/GetHip/TestInviteFriendsCell.swift @@ -0,0 +1,36 @@ +// +// TestInviteFriendsCell.swift +// GetHip +// +// Created by Okechi on 1/23/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import Foundation +import UIKit + +class TestInviteFriendsCell: UITableViewCell { + + @IBOutlet var friendName: UILabel! + + @IBOutlet var proImage: UIImageView! + + @IBOutlet var rdioButton: UIButton! + + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } + + /* + // Only override drawRect: if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + override func drawRect(rect: CGRect) { + // Drawing code + } + */ + +} \ No newline at end of file diff --git a/GetHip/TestInviteFriendsController.swift b/GetHip/TestInviteFriendsController.swift new file mode 100644 index 0000000..1d1e9d3 --- /dev/null +++ b/GetHip/TestInviteFriendsController.swift @@ -0,0 +1,187 @@ +// +// TestInviteFriendsController.swift +// GetHip +// +// Created by Okechi on 1/23/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit +import MultipeerConnectivity + +class TestInviteFriendsController: UIViewController, UITableViewDelegate, UITableViewDataSource { + var usr: [UserParseData] = [] + var frnds: [FriendData] = [] + var isFriendSelected: [Bool] = [] + var partyData: PartyServiceManager! = nil + + @IBOutlet weak var table: UITableView! + + @IBAction func cancelInvites(sender: UIBarButtonItem) { + self.partyData.stopBrowsing() + self.partyData.serviceBrowser = nil + println("Browser service deinitialized and browser deinitialized") + self.parentViewController?.dismissViewControllerAnimated(true, completion: nil) + } + + @IBAction func sendInvites(sender: UIButton) { + var numSelected = 0 + + for booli in self.isFriendSelected { + if booli == true { + numSelected++ + } + + } + + if(numSelected > 0){ + self.performSegueWithIdentifier("selectSongSegue", sender: sender) + } + else{ + println("Select a friend") + } + } + + + func setData(usrDat: [UserParseData], frndData: [FriendData], party: PartyServiceManager){ + self.usr = usrDat + self.frnds = frndData + self.partyData = party + + for i in 0.. Int { + // #warning Potentially incomplete method implementation. + // Return the number of sections. + return 1 + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete method implementation. + // Return the number of rows in the section. + return self.frnds.count + } + + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + let friend = self.frnds[indexPath.row] + let cell = self.table.dequeueReusableCellWithIdentifier("TestInviteCell", forIndexPath: indexPath) as? TestInviteFriendsCell + + //sets display name of friend (print for debugging purposes) + cell!.friendName.text = friend.displayName + println(friend.displayName) + + //sets profile image of current cell + //checks if friend user has a profile image or not + if friend.profileImg == nil { + cell!.proImage.backgroundColor = UIColor.grayColor() + } + else{ + + } + + //rounds uiimage and configures UIImageView + //cell!.proImage.layer.borderWidth = 3.0 + //cell!.proImage.clipsToBounds = true + cell!.proImage.layer.cornerRadius = cell!.proImage.frame.size.width/2 + cell!.alpha = 0.5 + //cell!.proImage.layer.borderColor = UIColor.whiteColor().CGColor + //cell!.proImage.layer.masksToBounds = true + cell!.rdioButton.layer.cornerRadius = cell!.rdioButton.frame.size.width/2 + + return cell! + } + + func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { + let cell = table.cellForRowAtIndexPath(indexPath) as? TestInviteFriendsCell + + if self.isFriendSelected[indexPath.row] == false{ + cell!.rdioButton.setBackgroundImage(UIImage(named: "Blue Check.png"), forState: UIControlState.Normal) + self.isFriendSelected[indexPath.row] = true + } + else{ + cell!.rdioButton.setBackgroundImage(UIImage(named: "Tap Circle.png"), forState: UIControlState.Normal) + self.isFriendSelected[indexPath.row] = false + } + + + } + + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + var invited: [FriendData] = [] + for var i = 0; i < self.isFriendSelected.count; i++ { + if (self.isFriendSelected[i] == true) { + invited.append(self.frnds[i]) + } + } + + println(invited.count) + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return NO if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return NO if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. + } + */ +} diff --git a/GetHip/UserParseData.swift b/GetHip/UserParseData.swift new file mode 100644 index 0000000..68b5092 --- /dev/null +++ b/GetHip/UserParseData.swift @@ -0,0 +1,27 @@ +// +// UserParseData.swift +// GetHip +// +// Created by Okechi on 1/22/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import Foundation + +import Foundation + +class UserParseData { + var username: String! + var displayName: String! + var profileImg: UIImageView! + var email: String! + + + + init(usrName: String, dispName: String, email: String){ + self.username = usrName + self.profileImg = nil //proImage + self.displayName = dispName + self.email = email + } +} \ No newline at end of file diff --git a/GetHip/UserParseDataSource.swift b/GetHip/UserParseDataSource.swift new file mode 100644 index 0000000..9ff468c --- /dev/null +++ b/GetHip/UserParseDataSource.swift @@ -0,0 +1,64 @@ +// +// UserParseDataSource.swift +// GetHip +// +// Created by Okechi on 1/22/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import Foundation + +class UserParseDataSource{ + var user: [UserParseData] + + init() { + user = [] + var query = PFUser.query() + var currentUser = PFUser.currentUser() + + query!.whereKey("username", equalTo: (currentUser?.username as String!)) + + query!.findObjectsInBackgroundWithBlock { + (objects, error) -> Void in + //print(error) + if error == nil { + for object in objects! { + var usr: UserParseData + + var usrName: String! + var profileImage: UIImageView + var displayName: String + var email: String + + usrName = object.objectForKey("username")! as! String + displayName = object.objectForKey("displayName") as! String + + if displayName.isEmpty { + displayName = usrName + } + + email = object.objectForKey("email")! as! String + + + usr = UserParseData(usrName: usrName, dispName: displayName, email: email) + self.user.append(usr) + //print(userName) + + + } + + } + + NSNotificationCenter.defaultCenter().postNotificationName("refreshSettingsView", object: nil) + + } + + + } + + func getUser() -> [UserParseData]{ + + return self.user + } +} + diff --git a/GetHip/ViewController.swift b/GetHip/ViewController.swift new file mode 100644 index 0000000..c97d4b1 --- /dev/null +++ b/GetHip/ViewController.swift @@ -0,0 +1,69 @@ +// +// ViewController.swift +// GetHip +// +// Created by Okechi on 1/1/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController, PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate{ + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib + + } + + override func viewDidAppear(animated: Bool) { + super.viewDidAppear(animated) + + + if (PFUser.currentUser() == nil){ + let loginViewController = LoginViewController() + loginViewController.delegate = self + loginViewController.fields = .UsernameAndPassword | .LogInButton | .PasswordForgotten | .SignUpButton //add fb button later, need to figure out error + + //loginViewController.signUpController?.delegate = self + //*no longer needed since I am assigning custom signupController that inherits the signupController + + //hides parse logo + loginViewController.logInView?.logo?.hidden = true + loginViewController.signUpController?.signUpView?.logo?.hidden = true + + self.presentViewController(loginViewController, animated: false, completion: nil) + } + else{ + presentLoggedInAlert() + } + + } + + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + func logInViewController(logInController: PFLogInViewController, didLogInUser user: PFUser) { + self.dismissViewControllerAnimated(true, completion: nil) + presentLoggedInAlert() + } + + func signUpViewController(signUpController: PFSignUpViewController, didSignUpUser user: PFUser) { + self.dismissViewControllerAnimated(true, completion: nil) + presentLoggedInAlert() + } + + func presentLoggedInAlert() { + + + self.performSegueWithIdentifier("HomeScreenSegue", sender: nil) + + } + + + +} + diff --git a/GetHipTests/GetHipTests.swift b/GetHipTests/GetHipTests.swift new file mode 100644 index 0000000..3ce498e --- /dev/null +++ b/GetHipTests/GetHipTests.swift @@ -0,0 +1,36 @@ +// +// GetHipTests.swift +// GetHipTests +// +// Created by Okechi on 1/1/16. +// Copyright (c) 2016 Kroleo. All rights reserved. +// + +import UIKit +import XCTest + +class GetHipTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + XCTAssert(true, "Pass") + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/GetHipTests/Info.plist b/GetHipTests/Info.plist new file mode 100644 index 0000000..291359a --- /dev/null +++ b/GetHipTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + oonyeje.Kroleo.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + +