boolean listenOn(String myId) { // Todo: return success?
   if (localMediaStream == null) { // Not true for streaming?
     mRtcListener.onDebug(new PnRTCMessage("Need to add media stream before you can connect."));
     return false;
   }
   if (this.id != null) { // Prevent listening on multiple channels.
     mRtcListener.onDebug(
         new PnRTCMessage(
             "Already listening on " + this.id + ". Cannot have multiple connections."));
     return false;
   }
   this.id = myId;
   subscribe(myId);
   return true;
 }
  /**
   * Send SDP Offers/Answers nd ICE candidates to peers.
   *
   * @param toID The id or "number" that you wish to transmit a message to.
   * @param packet The JSON data to be transmitted
   */
  void transmitMessage(String toID, JSONObject packet) {
    if (this.id == null) { // Not logged in. Put an error in the debug cb.
      mRtcListener.onDebug(new PnRTCMessage("Cannot transmit before calling Client.connect"));
    }
    try {
      JSONObject message = new JSONObject();
      message.put(PnRTCMessage.JSON_PACKET, packet);
      message.put(PnRTCMessage.JSON_ID, ""); // Todo: session id, unused in js SDK?
      message.put(PnRTCMessage.JSON_NUMBER, this.id);
      this.mPubNub.publish(
          toID,
          message,
          new Callback() { // Todo: reconsider callback.
            @Override
            public void successCallback(String channel, Object message, String timetoken) {
              mRtcListener.onDebug(new PnRTCMessage((JSONObject) message));
            }

            @Override
            public void errorCallback(String channel, PubnubError error) {
              mRtcListener.onDebug(new PnRTCMessage(error.errorObject));
            }
          });
    } catch (JSONException e) {
      e.printStackTrace();
    }
  }
 /**
  * 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();
   }
 }
 public void setLocalMediaStream(MediaStream localStream) {
   this.localMediaStream = localStream;
   mRtcListener.onLocalStream(localStream);
 }