public void execute(String peerId, JSONObject payload) throws JSONException {
   Log.d("PnUserHangup", "PnUserHangupAction");
   PnPeer peer = peers.get(peerId);
   peer.hangup();
   mRtcListener.onPeerConnectionClosed(peer);
   // Todo: Consider Callback?
 }
 public void execute(String peerId, JSONObject payload) throws JSONException {
   Log.d("COAction", "CreateOfferAction");
   PnPeer peer = peers.get(peerId);
   peer.setDialed(true);
   peer.setType(PnPeer.TYPE_ANSWER);
   peer.pc.createOffer(peer, signalingParams.pcConstraints);
 }
 public void execute(String peerId, JSONObject payload) throws JSONException {
   Log.d("CAAction", "CreateAnswerAction");
   PnPeer peer = peers.get(peerId);
   peer.setType(PnPeer.TYPE_OFFER);
   peer.setStatus(PnPeer.STATUS_CONNECTED);
   SessionDescription sdp =
       new SessionDescription(
           SessionDescription.Type.fromCanonicalForm(payload.getString("type")),
           payload.getString("sdp"));
   peer.pc.setRemoteDescription(peer, sdp);
   peer.pc.createAnswer(peer, signalingParams.pcConstraints);
 }
 /**
  * Close connection (hangup) no a certain peer.
  *
  * @param id PnPeer id to close connection with
  */
 public void closeConnection(String id) {
   JSONObject packet = new JSONObject();
   try {
     if (!this.peers.containsKey(id)) return;
     PnPeer peer = this.peers.get(id);
     peer.hangup();
     packet.put(PnRTCMessage.JSON_HANGUP, true);
     transmitMessage(id, packet);
     mRtcListener.onPeerConnectionClosed(peer);
   } catch (JSONException e) {
     e.printStackTrace();
   }
 }
 @Override
 public void successCallback(String channel, Object message) {
   if (!(message instanceof JSONObject)) return; // Ignore if not valid JSON.
   JSONObject jsonMessage = (JSONObject) message;
   mRtcListener.onDebug(new PnRTCMessage(jsonMessage));
   try {
     String peerId = jsonMessage.getString(PnRTCMessage.JSON_NUMBER);
     JSONObject packet = jsonMessage.getJSONObject(PnRTCMessage.JSON_PACKET);
     PnPeer peer;
     if (!peers.containsKey(peerId)) {
       // Possibly threshold number of allowed users
       peer = addPeer(peerId);
       peer.pc.addStream(localMediaStream);
     } else {
       peer = peers.get(peerId);
     }
     if (peer.getStatus().equals(PnPeer.STATUS_DISCONNECTED))
       return; // Do nothing if disconnected.
     if (packet.has(PnRTCMessage.JSON_USERMSG)) {
       actionMap.get(PnUserMessageAction.TRIGGER).execute(peerId, packet);
       return;
     }
     if (packet.has(PnRTCMessage.JSON_HANGUP)) {
       actionMap.get(PnUserHangupAction.TRIGGER).execute(peerId, packet);
       return;
     }
     if (packet.has(PnRTCMessage.JSON_THUMBNAIL)) {
       return; // No handler for thumbnail or hangup yet, will be separate controller callback
     }
     if (packet.has(PnRTCMessage.JSON_SDP)) {
       if (!peer.received) {
         peer.setReceived(true);
         mRtcListener.onDebug(new PnRTCMessage("SDP - " + peer.toString()));
         // Todo: reveivercb(peer);
       }
       String type = packet.getString(PnRTCMessage.JSON_TYPE);
       actionMap.get(type).execute(peerId, packet);
       return;
     }
     if (packet.has(PnRTCMessage.JSON_ICE)) {
       actionMap.get(AddIceCandidateAction.TRIGGER).execute(peerId, packet);
       return;
     }
   } catch (JSONException e) {
     e.printStackTrace();
   }
 }