From fb39de92cc7598301023cf7b52efe59c79a71947 Mon Sep 17 00:00:00 2001 From: Okechi Date: Thu, 3 Mar 2016 12:12:50 -0500 Subject: [PATCH] worked on the connection, still buggy but I believe that is just the framework. Working on streaming content now --- GetHip/CurrentlyPlayingViewController.swift | 25 ++++-- GetHip/InvitedToPartyViewController.swift | 7 ++ GetHip/JoiningPartyViewController.swift | 27 ++++++- GetHip/LoadingPartyViewController.swift | 87 +++++++++++++++------ GetHip/PartyServiceManager.swift | 40 +++++++++- 5 files changed, 153 insertions(+), 33 deletions(-) diff --git a/GetHip/CurrentlyPlayingViewController.swift b/GetHip/CurrentlyPlayingViewController.swift index 11d1633..472a729 100644 --- a/GetHip/CurrentlyPlayingViewController.swift +++ b/GetHip/CurrentlyPlayingViewController.swift @@ -60,13 +60,24 @@ class CurrentlyPlayingViewController: UIViewController{ self.audioPlayer = AVPlayer(URL: self.party.currentSong.valueForProperty(MPMediaItemPropertyAssetURL) as! NSURL) // Do any additional setup after loading the view. - self.songImg.image = self.party.currentSong.valueForProperty(MPMediaItemPropertyArtwork).imageWithSize(songImg.frame.size) - self.titleLabel.text = (self.party.currentSong.valueForProperty(MPMediaItemPropertyTitle) as? String!)! - self.artistAndAlbumLabel.text = (self.party.currentSong.valueForProperty(MPMediaItemPropertyArtist) as? String!)! + " - " + (self.party.currentSong.valueForProperty(MPMediaItemPropertyAlbumTitle) as? String!)! - self.audioPlayer.volume = self.volCtrl.value - self.maxLabel.text = String(stringInterpolationSegment: self.audioPlayer.currentItem.duration.value) - self.audioPlayer.play() - self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateLabels"), userInfo: nil, repeats: true) + + if(self.party.role == PeerType.Host_Creator){ + + self.songImg.image = self.party.currentSong.valueForProperty(MPMediaItemPropertyArtwork).imageWithSize(songImg.frame.size) + self.titleLabel.text = (self.party.currentSong.valueForProperty(MPMediaItemPropertyTitle) as? String!)! + self.artistAndAlbumLabel.text = (self.party.currentSong.valueForProperty(MPMediaItemPropertyArtist) as? String!)! + " - " + (self.party.currentSong.valueForProperty(MPMediaItemPropertyAlbumTitle) as? String!)! + self.audioPlayer.volume = self.volCtrl.value + self.maxLabel.text = String(stringInterpolationSegment: self.audioPlayer.currentItem.duration.value) + self.audioPlayer.play() + self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateLabels"), userInfo: nil, repeats: true) + }else if (self.party.role == PeerType.Guest_Invited){ + + self.songImg.image = self.party.currentSongIMG + self.titleLabel.text = (self.party.currentSongTitle) + self.artistAndAlbumLabel.text = (self.party.currentSongArtistAlbum) + } + + } diff --git a/GetHip/InvitedToPartyViewController.swift b/GetHip/InvitedToPartyViewController.swift index c24d125..33c54b1 100644 --- a/GetHip/InvitedToPartyViewController.swift +++ b/GetHip/InvitedToPartyViewController.swift @@ -16,6 +16,7 @@ class InvitedToPartyViewController: UIViewController , PartyServiceManagerDelega var partyData: PartyServiceManager! var inviteHandle: ((Bool, MCSession!) -> Void)! private var fromPeer: MCPeerID! + var shouldEndInvite = false @IBOutlet var img: UIImageView! @IBOutlet var inviteTxt: UITextView! @@ -63,6 +64,12 @@ class InvitedToPartyViewController: UIViewController , PartyServiceManagerDelega } + override func viewWillAppear(animated: Bool) { + if(self.shouldEndInvite == true){ + self.dismissViewControllerAnimated(true, completion: nil) + } + } + override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. diff --git a/GetHip/JoiningPartyViewController.swift b/GetHip/JoiningPartyViewController.swift index 8f34643..26dc1bb 100644 --- a/GetHip/JoiningPartyViewController.swift +++ b/GetHip/JoiningPartyViewController.swift @@ -34,15 +34,22 @@ class JoiningPartyViewController: UIViewController ,PartyServiceManagerDelegate{ self.user = user } - /* + // 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. + + if segue.identifier == "EnteringPartySegue"{ + + let vc: CurrentlyPlayingViewController = (segue.destinationViewController as? CurrentlyPlayingViewController)! + + vc.setData(self.party, user: self.user, friends: self.friends as! [FriendData], request: self.request as! [FriendData]) + } } - */ + } @@ -67,7 +74,23 @@ extension JoiningPartyViewController: PartyServiceManagerDelegate { } func didRecieveInstruction(dictionary: Dictionary){ + let (instruction, fromPeer) = self.party.decodeInstruction(dictionary) + if (instruction == "disconnect") { + self.party.session.disconnect() + + if let vc = self.parentViewController as? InvitedToPartyViewController{ + vc.shouldEndInvite = true + } + + self.dismissViewControllerAnimated(true, completion: nil) + } + + if (instruction == "start_party"){ + self.performSegueWithIdentifier("EnteringPartySegue", sender: self) + } + + } } diff --git a/GetHip/LoadingPartyViewController.swift b/GetHip/LoadingPartyViewController.swift index 42c8ea7..76ab9aa 100644 --- a/GetHip/LoadingPartyViewController.swift +++ b/GetHip/LoadingPartyViewController.swift @@ -51,6 +51,7 @@ class LoadingPartyViewController: UIViewController, UICollectionViewDataSource, //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 } override func didReceiveMemoryWarning() { @@ -111,6 +112,35 @@ 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"){ + + //ends invitations with outstanding peers + 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{ + var dictionary: [String: String] = ["sender": self.party.myPeerID.displayName, "instruction": "start_Party"] + self.party.sendInstruction(dictionary, toPeer: joinedPeer! ) + } + + } + + + + + /*if !(self.session.sendData(dataToSend, toPeers: peersArray as [AnyObject], withMode: MCSessionSendDataMode.Reliable, error: &error)){ + 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) } @@ -134,35 +164,48 @@ extension LoadingPartyViewController: PartyServiceManagerDelegate { } func connectedWithPeer(peerID: MCPeerID) { - println(self.party.myPeerID.displayName + " connected to " + peerID.displayName) - var i = 0 - for(index, aFriend) in enumerate(self.party.invitedFriends) { - if aFriend.displayName == peerID.displayName { - i = index - break - } - } - - let cell: InvitedCollectionViewCell = self.invitedFriends.dequeueReusableCellWithReuseIdentifier("InvitedCollectionCell", forIndexPath: NSIndexPath(index: i)) as! InvitedCollectionViewCell - - cell.alpha = 1.0 } func didRecieveInstruction(dictionary: Dictionary){ - //extract data from dictionary - println("mark 3") - let data = dictionary["data"] as? NSData - let fromPeer = dictionary["fromPeer"] as! MCPeerID + let (instruction, fromPeer) = self.party.decodeInstruction(dictionary) + + if self.party.disconnectedPeersDictionary[fromPeer.displayName] != nil { + + var dictionary: [String: String] = ["sender": self.party.myPeerID.displayName, "instruction": "disconnect"] + self.party.sendInstruction(dictionary, toPeer: fromPeer) + }else{ - //convert data to dictionary object with instruction - let dataDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! Dictionary - - //check if this is an instruction being sent - if let instruction = dataDictionary["instruction"] { - println(instruction) + if (instruction == "joined_party") { + println(instruction) + + var i = 0 + for(index, aFriend) in enumerate(self.party.invitedFriends) { + if aFriend.displayName == fromPeer.displayName { + i = index + 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) + + + //prepares party for the guest peers + + //sends music info incuding, title, artist, album, and image + var dictionary: [String: AnyObject] = ["sender": self.party.myPeerID.displayName, "instruction": "set_up_song", "songTitle": (self.party.currentSong.valueForProperty(MPMediaItemPropertyTitle) as? String!)!, "songArtistAndAlbum": (self.party.currentSong.valueForProperty(MPMediaItemPropertyArtist) as? String!)! + " - " + (self.party.currentSong.valueForProperty(MPMediaItemPropertyAlbumTitle) as? String!)!, "songImage": UIImagePNGRepresentation(self.party.currentSong.valueForProperty(MPMediaItemPropertyArtwork).imageWithSize(songImg.frame.size))] + + self.party.sendInstruction(dictionary, toPeer: fromPeer) + + } + } + + } } \ No newline at end of file diff --git a/GetHip/PartyServiceManager.swift b/GetHip/PartyServiceManager.swift index 3dc809c..5535a08 100644 --- a/GetHip/PartyServiceManager.swift +++ b/GetHip/PartyServiceManager.swift @@ -57,9 +57,14 @@ class PartyServiceManager: NSObject { var connectedPeersDictionary = NSMutableDictionary() var disconnectedPeersDictionary = NSMutableDictionary() - //party variables + //party-creator variables var currentSong: MPMediaItem! = nil + //party-guest variables + var currentSongTitle: String! + var currentSongArtistAlbum: String! + var currentSongIMG: UIImage! + //Peer Initializer @@ -94,7 +99,7 @@ class PartyServiceManager: NSObject { } //Party Instruction Sender - func sendInstruction(dictionary: Dictionary, toPeer: MCPeerID) -> Bool { + func sendInstruction(dictionary: Dictionary, toPeer: MCPeerID) -> Bool { let dataToSend = NSKeyedArchiver.archivedDataWithRootObject(dictionary) let peersArray = NSArray(object: toPeer) @@ -108,6 +113,32 @@ class PartyServiceManager: NSObject { return true } + func decodeInstruction(dictionary: Dictionary) -> (String, MCPeerID) { + //extract data from dictionary + println("mark 3") + let data = dictionary["data"] as? NSData + let fromPeer = dictionary["fromPeer"] as! MCPeerID + + //convert data to dictionary object with instruction + let dataDictionary = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! Dictionary + + //check if this is an instruction being sent + var instruction: String! = dataDictionary["instruction"] as! String + + if instruction != nil { + println(instruction) + if(instruction == "set_up_song"){ + self.currentSongTitle = dataDictionary["songTitle"] as! String + self.currentSongArtistAlbum = dataDictionary["songArtistAndAlbum"] as! String + self.currentSongIMG = UIImage(data: (dataDictionary["songImage"] as! NSData)) + } + return (instruction!, fromPeer) + }else{ + return ("not_an_instruction", fromPeer) + } + + } + //Listening methods func setAdvertiser(){ self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: self.myPeerID, discoveryInfo: nil, serviceType: self.PartyServiceType) @@ -273,6 +304,10 @@ extension PartyServiceManager: MCSessionDelegate{ self.delegate?.connectedWithPeer(peerID) } + + if(state == MCSessionState.NotConnected){ + NSLog("%@", "peer \(peerID) didChangeState: \(state.stringValue())") + } } func session(session: MCSession!, didReceiveData data: NSData!, fromPeer peerID: MCPeerID!) { @@ -281,6 +316,7 @@ extension PartyServiceManager: MCSessionDelegate{ let dictionary: [String: AnyObject] = ["data": data, "fromPeer": peerID] self.delegate?.didRecieveInstruction(dictionary) + } func session(session: MCSession!, didReceiveStream stream: NSInputStream!, withName streamName: String!, fromPeer peerID: MCPeerID!) {