From 0c4881f5cb7a4552a107a524e95462385346a446 Mon Sep 17 00:00:00 2001 From: Okechi Date: Mon, 7 Mar 2016 21:12:53 -0500 Subject: [PATCH] streaming working; will work on repeating the song selection cycle so party can continue. Will complete that as well as any residual work in rest of views and displaying who is in current party --- GetHip.xcodeproj/project.pbxproj | 8 + GetHip/FriendData.swift | 33 +++- GetHip/HomeScreenViewController.swift | 27 ++- GetHip/Icon-60.png | Bin 0 -> 2431 bytes .../AppIcon.appiconset/Contents.json | 33 +++- .../AppIcon.appiconset/Icon-24@2x.png | Bin 0 -> 1975 bytes .../AppIcon.appiconset/Icon-27.5@2x.png | Bin 0 -> 2307 bytes .../AppIcon.appiconset/Icon-29@2x.png | Bin 0 -> 2480 bytes .../AppIcon.appiconset/Icon-29@3x.png | Bin 0 -> 3836 bytes .../AppIcon.appiconset/Icon-40.png | Bin 0 -> 1632 bytes .../AppIcon.appiconset/Icon-40@2x-1.png | Bin 0 -> 3531 bytes .../AppIcon.appiconset/Icon-40@2x.png | Bin 0 -> 3531 bytes .../AppIcon.appiconset/Icon-44@2x.png | Bin 0 -> 3857 bytes .../AppIcon.appiconset/Icon-72.png | Bin 0 -> 3153 bytes .../AppIcon.appiconset/Icon-72@2x.png | Bin 0 -> 6622 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 3333 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 7032 bytes .../AppIcon.appiconset/Icon-86@2x.png | Bin 0 -> 7993 bytes .../AppIcon.appiconset/Icon-98@2x.png | Bin 0 -> 9658 bytes .../AppIcon.appiconset/Icon-Small-50.png | Bin 0 -> 2112 bytes .../AppIcon.appiconset/Icon-Small-50@2x.png | Bin 0 -> 4516 bytes .../AppIcon.appiconset/Icon-Spotlight-40.png | Bin 1537 -> 0 bytes .../Icon-Spotlight-40@2x-1.png | Bin 3435 -> 0 bytes .../Icon-Spotlight-40@3x-1.png | Bin 0 -> 5067 bytes GetHip/InPartyViewController.swift | 27 +-- GetHip/Info.plist | 7 +- GetHip/InvitedToPartyViewController.swift | 1 + GetHip/JoiningPartyViewController.swift | 24 ++- GetHip/LoadingPartyViewController.swift | 162 +++++++++++++++--- GetHip/PartyServiceManager.swift | 40 ++++- GetHip/TestInviteFriendsController.swift | 6 +- GetHip/icon-120.png | Bin 0 -> 5067 bytes 32 files changed, 313 insertions(+), 55 deletions(-) create mode 100644 GetHip/Icon-60.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-24@2x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-27.5@2x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-29@2x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-29@3x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-40.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-40@2x-1.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-40@2x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-44@2x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-72.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-72@2x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-86@2x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-98@2x.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-Small-50.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png delete mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-Spotlight-40.png delete mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x-1.png create mode 100644 GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-Spotlight-40@3x-1.png create mode 100644 GetHip/icon-120.png diff --git a/GetHip.xcodeproj/project.pbxproj b/GetHip.xcodeproj/project.pbxproj index 8f8acc1..ae023dc 100644 --- a/GetHip.xcodeproj/project.pbxproj +++ b/GetHip.xcodeproj/project.pbxproj @@ -49,6 +49,8 @@ 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 */; }; + 3E41D74C1C8D17E100FFD846 /* icon-120.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E41D74B1C8D17E100FFD846 /* icon-120.png */; }; + 3E41D74E1C8D17F300FFD846 /* Icon-60.png in Resources */ = {isa = PBXBuildFile; fileRef = 3E41D74D1C8D17F300FFD846 /* Icon-60.png */; }; 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 */; }; @@ -196,6 +198,8 @@ 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 = ""; }; + 3E41D74B1C8D17E100FFD846 /* icon-120.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-120.png"; sourceTree = ""; }; + 3E41D74D1C8D17F300FFD846 /* Icon-60.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-60.png"; 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 = ""; }; @@ -419,6 +423,8 @@ 3E1BDA4F1C37111D00EE3B84 /* Supporting Files */ = { isa = PBXGroup; children = ( + 3E41D74D1C8D17F300FFD846 /* Icon-60.png */, + 3E41D74B1C8D17E100FFD846 /* icon-120.png */, 3E1BDA501C37111D00EE3B84 /* Info.plist */, ); name = "Supporting Files"; @@ -845,6 +851,7 @@ 3E438AE91C5738EF0055C97A /* Star@2x.png in Resources */, 3E5BD3151C6C45CE00266B16 /* Home Copy@2x.png in Resources */, 3E5952831C39DDA800C88C71 /* Settings@3x.png in Resources */, + 3E41D74C1C8D17E100FFD846 /* icon-120.png in Resources */, 3E7BB8E21C5B4A350005B834 /* Change Song@2x.png in Resources */, 3E59526B1C39DBC900C88C71 /* Star@3x.png in Resources */, 3E59527B1C39DDA800C88C71 /* Create.png in Resources */, @@ -862,6 +869,7 @@ 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 */, + 3E41D74E1C8D17F300FFD846 /* Icon-60.png in Resources */, 3E59527C1C39DDA800C88C71 /* Create@2x.png in Resources */, 3E7D37D51C75D7EF002E682F /* Raise@2x.png in Resources */, 3E59526A1C39DBC900C88C71 /* Star@2x.png in Resources */, diff --git a/GetHip/FriendData.swift b/GetHip/FriendData.swift index 2fa8166..4d4a6d2 100644 --- a/GetHip/FriendData.swift +++ b/GetHip/FriendData.swift @@ -8,7 +8,7 @@ import Foundation -class FriendData { +class FriendData: NSObject, NSCoding { var displayName: String! var profileImg: UIImageView! var status: String! @@ -17,8 +17,39 @@ class FriendData { self.displayName = display self.profileImg = nil self.status = status + super.init() } + //MARK: NSCoding + required init(coder aDecoder: NSCoder){ + self.displayName = aDecoder.decodeObjectForKey("displayName") as! String + self.profileImg = aDecoder.decodeObjectForKey("profileImg") as! UIImageView! + self.status = aDecoder.decodeObjectForKey("status") as! String + + super.init() + } + + func encodeWithCoder(aCoder: NSCoder){ + aCoder.encodeObject(self.displayName, forKey: "displayName") + aCoder.encodeObject(self.profileImg, forKey: "profileImg") + aCoder.encodeObject(self.status, forKey: "status") + } + + //Mark: NSObject + + override func isEqual(object: AnyObject?) -> Bool{ + if let object = object as? FriendData { + return self.displayName == object.displayName + && self.profileImg == object.profileImg + && self.status == object.status + }else { + return false + } + } + + override var hash: Int { + return self.displayName.hashValue + } } diff --git a/GetHip/HomeScreenViewController.swift b/GetHip/HomeScreenViewController.swift index ed5ad94..f2743b9 100644 --- a/GetHip/HomeScreenViewController.swift +++ b/GetHip/HomeScreenViewController.swift @@ -17,7 +17,7 @@ class HomeScreenViewController: UIViewController, PartyServiceManagerDelegate { var userData: [UserParseData] = [] let partyData = PartyServiceManager() var firstTime: Bool = true - + private var firstTimeBrowsing: Bool = true @IBOutlet weak var CreateAPartyBtn: UIButton! @@ -33,6 +33,15 @@ class HomeScreenViewController: UIViewController, PartyServiceManagerDelegate { self.friendData.append(pendingFriend) } } + + //start browsing for peers + self.partyData.setBrowser() + self.partyData.startBrowser() + + //self.partyData.delegate = self + self.firstTime = false + + } func refreshUserData(notification:NSNotification){ @@ -47,12 +56,13 @@ class HomeScreenViewController: UIViewController, PartyServiceManagerDelegate { self.partyData.setAdvertiser() self.partyData.startListening() + self.frndDataManager = FriendDataSource() //start browsing for peers - self.partyData.setBrowser() - self.partyData.startBrowser() + //self.partyData.setBrowser() + //self.partyData.startBrowser() self.partyData.delegate = self - self.firstTime = false + //self.firstTime = false } } @@ -87,7 +97,6 @@ class HomeScreenViewController: UIViewController, PartyServiceManagerDelegate { self.friendData = [] dispatch_async(dispatch_get_main_queue(), { self.usrDataManager = UserParseDataSource() - self.frndDataManager = FriendDataSource() }) } @@ -141,6 +150,14 @@ class HomeScreenViewController: UIViewController, PartyServiceManagerDelegate { extension HomeScreenViewController: PartyServiceManagerDelegate { func foundPeer() { + if(self.firstTimeBrowsing == true){ + //used for finding nearby friends when starting a party + for i in 0..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 JPDHLkV1f;D%o+dy literal 0 HcmV?d00001 diff --git a/GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-27.5@2x.png b/GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-27.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd231e7452c63f79a5738a8ef976acc696bc0f5 GIT binary patch literal 2307 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 u0-%+T!xY-uZ9E(!PZILtP)2 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 literal 0 HcmV?d00001 diff --git a/GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-72.png b/GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-72.png new file mode 100644 index 0000000000000000000000000000000000000000..16ad0d48584483bc0cc5617f1bb7b5e3a7c175a2 GIT binary patch literal 3153 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 literal 0 HcmV?d00001 diff --git a/GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-72@2x.png b/GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..764d12066e1f2eda39465039992ca517bf53f734 GIT binary patch literal 6622 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 cVHXVlAJ;#hZQbSbN@+!qK`$N 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 WYWHOv3Wu5i0000 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 v7s0vWY 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 diff --git a/GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x-1.png b/GetHip/Images-3.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x-1.png deleted file mode 100644 index 30dc15bec8d42a05b412e729eda1fbde7d351b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3435 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 literal 0 HcmV?d00001 diff --git a/GetHip/InPartyViewController.swift b/GetHip/InPartyViewController.swift index 937cf3d..1d02dab 100644 --- a/GetHip/InPartyViewController.swift +++ b/GetHip/InPartyViewController.swift @@ -49,19 +49,26 @@ class InPartyViewController: UIViewController, UICollectionViewDataSource, UICol func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { - let friend = self.party.invitedFriends[indexPath.row] - let cell: InvitedCollectionViewCell = self.friendsInParty.dequeueReusableCellWithReuseIdentifier("InvitedCollectionCell", forIndexPath: indexPath) as! InvitedCollectionViewCell + var cell: InvitedCollectionViewCell! - if friend.profileImg == nil { - cell.friendImage.backgroundColor = UIColor.grayColor() - } - else{ - cell.friendImage.image = friend.profileImg.image! + if(self.party.role == PeerType.Host_Creator){ + let friend = self.party.invitedFriends[indexPath.row] + cell = self.friendsInParty.dequeueReusableCellWithReuseIdentifier("InvitedCollectionCell", forIndexPath: indexPath) as! InvitedCollectionViewCell + + if friend.profileImg == nil { + cell.friendImage.backgroundColor = UIColor.grayColor() + } + else{ + cell.friendImage.image = friend.profileImg.image! + } + + //rounds uiimage and configures UIImageView + cell.friendImage.layer.cornerRadius = cell.friendImage.frame.size.width/2 + cell.friendImage.clipsToBounds = true + }else{ + cell = InvitedCollectionViewCell() } - //rounds uiimage and configures UIImageView - cell.friendImage.layer.cornerRadius = cell.friendImage.frame.size.width/2 - cell.friendImage.clipsToBounds = true return cell diff --git a/GetHip/Info.plist b/GetHip/Info.plist index e93260b..39b7897 100644 --- a/GetHip/Info.plist +++ b/GetHip/Info.plist @@ -6,6 +6,11 @@ en CFBundleExecutable $(EXECUTABLE_NAME) + CFBundleIconFiles + + Icon-60.png + icon-120.png + CFBundleIdentifier com.Kroleo.$(PRODUCT_NAME:rfc1034identifier) CFBundleInfoDictionaryVersion @@ -30,7 +35,7 @@ CFBundleVersion - 1 + 2 FacebookAppID 1166375230058840 FacebookDisplayName diff --git a/GetHip/InvitedToPartyViewController.swift b/GetHip/InvitedToPartyViewController.swift index 33c54b1..87385e3 100644 --- a/GetHip/InvitedToPartyViewController.swift +++ b/GetHip/InvitedToPartyViewController.swift @@ -27,6 +27,7 @@ class InvitedToPartyViewController: UIViewController , PartyServiceManagerDelega } @IBAction func acceptInvite(sender: UIButton){ + self.partyData.currentHost = self.fromPeer.displayName self.inviteHandle(true, self.partyData.session) self.performSegueWithIdentifier("JoiningPartySegue", sender: self) } diff --git a/GetHip/JoiningPartyViewController.swift b/GetHip/JoiningPartyViewController.swift index 08d696b..89cc751 100644 --- a/GetHip/JoiningPartyViewController.swift +++ b/GetHip/JoiningPartyViewController.swift @@ -14,6 +14,7 @@ class JoiningPartyViewController: UIViewController ,PartyServiceManagerDelegate{ var request = [] var user: [UserParseData]! var party: PartyServiceManager! + private var isHostConnected = false override func viewDidLoad() { super.viewDidLoad() @@ -64,13 +65,28 @@ extension JoiningPartyViewController: PartyServiceManagerDelegate { } func invitationWasRecieved(peerID: MCPeerID, invitationHandler: ((Bool, MCSession!) -> Void)!) { - + if(self.isHostConnected == true){ + if(self.party.connectedPeersDictionary[ peerID.displayName] == nil){ + invitationHandler(true, self.party.session) + } + } } func connectedWithPeer(peerID: MCPeerID) { println("mark 2") - var dictionary: Dictionary = ["sender": self.party.myPeerID.displayName, "instruction": "joined_party"] - self.party.sendInstruction(dictionary, toPeer: peerID) + + + if(self.isHostConnected == false){ + var dictionary: Dictionary = Dictionary() + dictionary["sender"] = self.party.myPeerID.displayName + dictionary["instruction"] = "joined_party" + self.party.sendInstruction(dictionary, toPeer: peerID) + self.isHostConnected = true + } + + + + } func didRecieveInstruction(dictionary: Dictionary){ @@ -86,6 +102,8 @@ extension JoiningPartyViewController: PartyServiceManagerDelegate { self.dismissViewControllerAnimated(true, completion: nil) } + + if (instruction == "start_party"){ println("mark 4") self.performSegueWithIdentifier("EnteringPartySegue", sender: self) diff --git a/GetHip/LoadingPartyViewController.swift b/GetHip/LoadingPartyViewController.swift index 70179bb..952dac2 100644 --- a/GetHip/LoadingPartyViewController.swift +++ b/GetHip/LoadingPartyViewController.swift @@ -23,8 +23,10 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource, @IBOutlet var invitedFriends: UICollectionView! @IBOutlet var songLabel: UILabel! @IBOutlet var timerLabel: UILabel! + var arePeersReady = Dictionary() + private var firstPass: Bool = true var timer = NSTimer() - var counter = 60 + var counter = 30 @IBAction func cancelInvites(sender: UIButton){ self.dismissViewControllerAnimated(true, completion: nil) @@ -44,14 +46,18 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource, self.invitedFriends.dataSource = self self.invitedFriends.delegate = self - // Do any additional setup after loading the view. - self.songImg.image = self.party.currentSong.valueForProperty(MPMediaItemPropertyArtwork).imageWithSize(songImg.frame.size) - self.songLabel.text = (self.party.currentSong.valueForProperty(MPMediaItemPropertyTitle) as? String!)! + " by " + (self.party.currentSong.valueForProperty(MPMediaItemPropertyArtist) as? String!)! + if(self.firstPass){ + // Do any additional setup after loading the view. + self.songImg.image = self.party.currentSong.valueForProperty(MPMediaItemPropertyArtwork).imageWithSize(songImg.frame.size) + self.songLabel.text = (self.party.currentSong.valueForProperty(MPMediaItemPropertyTitle) as? String!)! + " by " + (self.party.currentSong.valueForProperty(MPMediaItemPropertyArtist) as? String!)! + + //sets up timer label and starts countdown to next screen + //NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateThumbnail:", name: "peerConnected", object: nil) + self.timerLabel.text = String(counter) + self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounter"), userInfo: nil, repeats: true) + self.firstPass = false + } - //sets up timer label and starts countdown to next screen - //NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateThumbnail:", name: "peerConnected", object: nil) - self.timerLabel.text = String(counter) - self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateCounter"), userInfo: nil, repeats: true) self.party.delegate = self } @@ -60,16 +66,105 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource, // Dispose of any resources that can be recreated. } - func updateThumbnil(notification: NSNotification){ + func updateCounter(){ + self.timerLabel.text = String(counter--) + println(self.timerLabel.text) + if(self.counter == -1){ + self.timer.invalidate() + prepareAndCheckPeers() + //self.timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("prepareAndCheckPeers"), userInfo: nil, repeats: false) + //self.performSegueWithIdentifier("CurrentlyPlayingSegue", sender: nil) + } + } + + //selector functions for prepareAndCheckPeers selector function + func checkIfReady(){ + for peer in self.party.session.connectedPeers as! [MCPeerID] { + var dictionary: [String: AnyObject] = ["sender": self.party.myPeerID, "instruction": "are_you_ready", "connectedPeers": (self.party.session.connectedPeers as! [MCPeerID])] + self.party.sendInstruction(dictionary, toPeer: peer) + } + + var delayStart = NSTimer.scheduledTimerWithTimeInterval(15, target: self, selector: Selector("attemptToStart"), userInfo: nil, repeats: false) + } + + func startParty(){ + var dictionary: [String: String] = ["sender": self.party.myPeerID.displayName, "instruction": "start_party"] + + for peer in self.party.session.connectedPeers as! [MCPeerID] { + self.party.sendInstruction(dictionary, toPeer: peer ) + } + + self.performSegueWithIdentifier("CurrentlyPlayingSegue", sender: self) } - func updateCounter(){ - self.timerLabel.text = String(counter--) - if(self.counter == -1){ - self.timer.invalidate() - self.performSegueWithIdentifier("CurrentlyPlayingSegue", sender: nil) + func attemptToStart(){ + + + + for peer in self.party.session.connectedPeers as! [MCPeerID] { + if self.arePeersReady[peer.displayName] == false{ + var dictionary: [String: String] = ["sender": self.party.myPeerID.displayName, "instruction": "disconnect"] + self.party.sendInstruction(dictionary, toPeer: peer) + } } + + var delTimer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: Selector("startParty"), userInfo: nil, repeats: false) + + + } + + + func prepareAndCheckPeers(){ + + for connPeers in self.party.session.connectedPeers as! [MCPeerID] { + self.arePeersReady[connPeers.displayName] = false + } + + + for invited in self.party.invitedFriends { + var joinedPeer: MCPeerID? = self.party.connectedPeersDictionary[invited.displayName] as? MCPeerID + + if joinedPeer == nil { + for aPeer in self.party.foundPeers { + + if aPeer.displayName == invited.displayName { + self.party.session.cancelConnectPeer(aPeer) + self.party.disconnectedPeersDictionary.setValue(aPeer, forKey: aPeer.displayName) + break + } + } + }else{ + //sends array of currently connected peers to every connected peer to set up mesh streaming network + var currentlyConnected : [FriendData]! = [] + for peer in self.party.session.connectedPeers as! [MCPeerID]{ + for friend in self.party.invitedFriends { + if peer.displayName == friend.displayName { + currentlyConnected.append(friend) + } + } + } + var userDat = FriendData(display: self.usr[0].displayName, status: "") + userDat.profileImg = UIImageView(image: self.usr[0].profileImg.image) + currentlyConnected.append(userDat) + + var dictionaryConnected: [String: AnyObject] = ["sender": self.party.myPeerID, "instruction": "connect_to_other_peers", "connectedPeers": self.party.session.connectedPeers as! [MCPeerID], "friendData": currentlyConnected] + self.party.sendInstruction(dictionaryConnected, toPeer: joinedPeer!) + var delayCheck = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: Selector("checkIfReady"), userInfo: nil, repeats: false) + + + //var dictionary: [String: String] = ["sender": self.party.myPeerID.displayName, "instruction": "start_party"] + //self.party.sendInstruction(dictionary, toPeer: joinedPeer! ) + + //start streaming to connected peers + //self.party.outputStreamers[joinedPeer!.displayName]!.start() + + + + } + + } + } func setData(prty:PartyServiceManager, user: [UserParseData], friends: [FriendData], request: [FriendData]){ @@ -94,7 +189,11 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource, //rounds uiimage and configures UIImageView cell.friendImage.layer.cornerRadius = cell.friendImage.frame.size.width/2 cell.friendImage.clipsToBounds = true - cell.alpha = 0.5 + + if(self.party.connectedPeersDictionary[friend.displayName] == nil){ + cell.alpha = 0.5 + } + return cell @@ -113,7 +212,8 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource, // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. if(segue.identifier == "CurrentlyPlayingSegue"){ - + /* + //PLACE THIS CODE IN A SEPARATE FUNCTION SO YOU CAN CONTROL TIMING BETTER AND MAKE SURE ALL PEERS ARE READY BEFORE MOVING ON //ends invitations with outstanding peers for invited in self.party.invitedFriends { var joinedPeer: MCPeerID? = self.party.connectedPeersDictionary[invited.displayName] as? MCPeerID @@ -128,7 +228,19 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource, } } }else{ - + //sends array of currently connected peers to every connected peer to set up mesh streaming network + var currentlyConnected : [FriendData]! + for peer in self.party.session.connectedPeers as! [MCPeerID]{ + for friend in self.party.invitedFriends { + if peer.displayName == friend.displayName { + currentlyConnected.append(friend) + } + } + } + var dictionaryConnected: [String: AnyObject] = ["sender": self.party.myPeerID, "instruction": "connect_to_other_peers", "connectedPeers": self.party.session.connectedPeers as! [MCPeerID], "friendData": currentlyConnected] + self.party.sendInstruction(dictionaryConnected, toPeer: joinedPeer!) + //END OF NOTE + var dictionary: [String: String] = ["sender": self.party.myPeerID.displayName, "instruction": "start_party"] self.party.sendInstruction(dictionary, toPeer: joinedPeer! ) @@ -148,7 +260,7 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource, println(error?.localizedDescription) return false }*/ - + */ let vc: CurrentlyPlayingViewController = (segue.destinationViewController as? CurrentlyPlayingViewController)! vc.setData(self.party, user: self.usr, friends: self.frnds, request: self.requestData) } @@ -195,11 +307,11 @@ extension LoadingPartyViewController: PartyServiceManagerDelegate { break } } - self.party.connectedPeersDictionary.setValue(fromPeer, forKey: fromPeer.displayName) - //let cell: InvitedCollectionViewCell = self.invitedFriends.dequeueReusableCellWithReuseIdentifier("InvitedCollectionCell", forIndexPath: NSIndexPath(index: i)) as! InvitedCollectionViewCell - //cell.alpha = 1.0 - println(instruction) + + + self.party.connectedPeersDictionary.setValue(fromPeer, forKey: fromPeer.displayName) + self.invitedFriends.reloadData() //prepares party for the guest peers @@ -261,6 +373,12 @@ extension LoadingPartyViewController: PartyServiceManagerDelegate { } + + if(instruction == "ready"){ + self.arePeersReady[fromPeer.displayName] = true + } + + println(instruction) } diff --git a/GetHip/PartyServiceManager.swift b/GetHip/PartyServiceManager.swift index eaa681f..dcb00d3 100644 --- a/GetHip/PartyServiceManager.swift +++ b/GetHip/PartyServiceManager.swift @@ -40,7 +40,7 @@ enum HostSignalType: String { -class PartyServiceManager: NSObject { +class PartyServiceManager: NSObject, AnyObject { let PartyServiceType = "GetHip-Party" var serviceAdvertiser: MCNearbyServiceAdvertiser! = nil @@ -56,6 +56,7 @@ class PartyServiceManager: NSObject { var currentHost: String! var connectedPeersDictionary = NSMutableDictionary() + var connecingPeersDictionary = NSMutableDictionary() var disconnectedPeersDictionary = NSMutableDictionary() //party-creator variables @@ -138,6 +139,37 @@ class PartyServiceManager: NSObject { println(self.currentSongTitle) self.currentSongIMG = UIImage(data: (dataDictionary["songImage"] as! NSData)) } + + if (instruction == "connect_to_other_peers"){ + for peer in dataDictionary["connectedPeers"] as! [MCPeerID] { + if((peer != self.myPeerID) && (peer != dataDictionary["sender"] as! MCPeerID) && (self.connectedPeersDictionary[peer.displayName] == nil)){ + + self.serviceBrowser.invitePeer(peer, toSession: self.session, withContext: nil, timeout: 10) + } + } + + for peer in dataDictionary["friendData"] as! [FriendData] { + println(peer) + } + } + + if (instruction == "are_you_ready"){ + var ready = true + for peer in dataDictionary["connectedPeers"] as! [MCPeerID] { + if (self.connectedPeersDictionary[peer.displayName] == nil) && (peer != self.myPeerID) { + ready = false + break + } + } + + if ready == true { + var dictionary: [String: String] = ["sender": self.myPeerID.displayName, "instruction": "ready"] + self.sendInstruction(dictionary, toPeer: fromPeer) + }else{ + self.session.disconnect() + } + } + return (instruction!, fromPeer) }else{ @@ -308,14 +340,20 @@ extension PartyServiceManager: MCSessionDelegate{ func session(session: MCSession!, peer peerID: MCPeerID!, didChangeState state: MCSessionState) { NSLog("%@", "peer \(peerID) didChangeState: \(state.stringValue())") if(state == MCSessionState.Connected){ + println(self.myPeerID.displayName + " connected to " + peerID.displayName) println("mark 1") + self.connectedPeersDictionary[peerID.displayName] = peerID self.delegate?.connectedWithPeer(peerID) } if(state == MCSessionState.NotConnected){ NSLog("%@", "peer \(peerID) didChangeState: \(state.stringValue())") + self.disconnectedPeersDictionary[peerID.displayName] = peerID + if self.connectedPeersDictionary[peerID.displayName] != nil{ + // self.connectedPeersDictionary[peerID.displayName] = nil + } } } diff --git a/GetHip/TestInviteFriendsController.swift b/GetHip/TestInviteFriendsController.swift index 9d2ec8b..87205eb 100644 --- a/GetHip/TestInviteFriendsController.swift +++ b/GetHip/TestInviteFriendsController.swift @@ -22,8 +22,8 @@ class TestInviteFriendsController: UIViewController, UITableViewDelegate, UITabl @IBAction func cancelInvites(sender: UIBarButtonItem) { //println("Browser service deinitialized and browser deinitialized") - self.partyData.stopBrowsing() - self.partyData.serviceBrowser = nil + //self.partyData.stopBrowsing() + //self.partyData.serviceBrowser = nil self.parentViewController?.dismissViewControllerAnimated(true, completion: nil) } @@ -73,7 +73,7 @@ class TestInviteFriendsController: UIViewController, UITableViewDelegate, UITabl for i in 0..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 literal 0 HcmV?d00001