Code
// call user class
package com.yalla.collaboration.voip;
import com.yalla.collaboration.client.chat.OneToOneChatController;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.jingle.JingleNegotiator;
import org.jivesoftware.smackx.jingle.JingleSession;
import org.jivesoftware.smackx.jingle.OutgoingJingleSession;
import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener;
import org.jivesoftware.smackx.jingle.listeners.JingleSessionStateListener;
import org.jivesoftware.smackx.jingle.media.PayloadType;
import org.jivesoftware.smackx.jingle.nat.TransportCandidate;
import java.util.TimerTask;
/**
*/
public class CallUser extends VoiceChat implements JingleSessionStateListener, JingleSessionListener {
private OutgoingJingleSession jingleSession;
private boolean mediaReceived = false;
private static final long WAIT_FOR_MEDIA_DELAY = 20000;
private static java.util.Timer timer = new java.util.Timer(" Outgoing call wait for Media");
private boolean cancelMediaTimer = false;
private TimerTask mediaTimerTask;
private String responderJID;
public CallUser(OutgoingJingleSession jingleSession) {
super(StringUtils.parseBareAddress(jingleSession.getResponder()));
this.jingleSession = jingleSession;
jingleSession.addListener(this);
jingleSession.addStateListener(this);
updateStatus(“Sending voice chat invitation to”);
callAccceptButton.setEnabled(false);
responderJID = StringUtils.parseBareAddress(jingleSession.getResponder());
}
public void hangupButtonPressed() {
hangUp();
callAccceptButton.setEnabled(true);
OneToOneChatController.getInstance().getChatSession(responderJID).insertMessage (“Voice chat ended”);
}
public void callAccceptButtonPressed() {
hangUp();
callAccceptButton.setEnabled(false);
jingleSession = VOIPManager.getInstance().createOutgoingSession(userName);
startPhoneRing();
}
public void hangUp() {
phoneRingingAudioClip.stop();
if (jingleSession != null && !jingleSession.isClosed()) {
jingleSession.close();
jingleSession = null;
}
callAccceptButton.setEnabled(true);
}
public void beforeChange(JingleNegotiator.State state, JingleNegotiator.State state1) throws JingleNegotiator.JingleException {
if (jingleSession != null) {
if (jingleSession.getState() instanceof OutgoingJingleSession.Inviting) {
updateStatus(“Calling user. Please wait…”);
callAccceptButton.setEnabled(false);
}
}
}
public void afterChanged(JingleNegotiator.State state, JingleNegotiator.State state1) {
if (jingleSession != null) {
if (jingleSession.getState() instanceof OutgoingJingleSession.Inviting) {
updateStatus(“Calling user. Please wait…”);
callAccceptButton.setEnabled(false);
}
}
}
public void sessionEstablished(PayloadType payloadType, TransportCandidate transportCandidate, TransportCandidate transportCandidate1, JingleSession jingleSession) {
sessionEstablished = true;
mediaTimerTask = new MyTimerTask();
timer.schedule(mediaTimerTask, WAIT_FOR_MEDIA_DELAY);
stopPhoneRing();
OneToOneChatController.getInstance().getChatSession(responderJID).insertMessage (“Voice chat Started”);
}
public void sessionDeclined(String string, JingleSession jingleSession) {
jingleSession.removeListener(this);
jingleSession.removedStateListener(this);
hangUp();
updateStatus(“User declined voice chat”);
stopPhoneRing();
}
public void sessionRedirected(String string, JingleSession jingleSession) {
}
public void sessionClosed(String string, JingleSession jingleSession) {
hangUp();
if (sessionEstablished && mediaReceived) {
updateStatus(“Chat Session Ended”);
OneToOneChatController.getInstance().getChatSession(responderJID).insertMessage (“Voice chat ended”);
} else {
updateStatus(“Voice chat cession ended on error”);
System.out.println(“CallUser.sessionClosed”);
OneToOneChatController.getInstance().getChatSession(responderJID).insertMessage (“Voice chat ended on error”);
}
jingleSession.removeListener(this);
jingleSession.removedStateListener(this);
}
public void sessionClosedOnError(XMPPException xmppException, JingleSession jingleSession) {
hangUp();
jingleSession.removeListener(this);
jingleSession.removedStateListener(this);
callAccceptButton.setEnabled(true);
updateStatus(“Voice chat session ended on error”);
OneToOneChatController.getInstance().getChatSession(responderJID).insertMessage (“Voice chat ended on error”);
System.out.println(“CallUser.sessionClosedOnError”);
}
public void sessionMediaReceived(JingleSession jingleSession, String string) {
mediaReceived = true;
mediaTimerTask.cancel();
OneToOneChatController.getInstance().getChatSession(responderJID).insertMessage (“Voice Chat Started”);
}
class MyTimerTask extends TimerTask {
public MyTimerTask() {
}
public void run() {
if (!mediaReceived) {
if (jingleSession != null) {
try {
System.out.println(“CallUser$MyTimerTask.run”);
jingleSession.terminate(“No Media Received. This may be caused by firewall configuration problems.”);
} catch (XMPPException e) {
e.printStackTrace();
}
}
}
}
}
}
//Answer call class
package com.yalla.collaboration.voip;
import com.yalla.collaboration.client.chat.OneToOneChatController;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.jingle.IncomingJingleSession;
import org.jivesoftware.smackx.jingle.JingleSession;
import org.jivesoftware.smackx.jingle.listeners.JingleSessionListener;
import org.jivesoftware.smackx.jingle.media.PayloadType;
import org.jivesoftware.smackx.jingle.nat.TransportCandidate;
import java.util.TimerTask;
/**
*/
public class AnswerCall extends VoiceChat implements JingleSessionListener {
private IncomingJingleSession jingleSession;
private boolean sessionEstablished = false;
private boolean mediaReceived = false;
private static final long WAIT_FOR_MEDIA_DELAY = 20000;
private static java.util.Timer timer = new java.util.Timer(" Anwser call wait for Media");
private String initiatorJID;
private TimerTask mediaTimerTask;
public AnswerCall(IncomingJingleSession incommingJingelSession) {
super(incommingJingelSession.getInitiator());
jingleSession = incommingJingelSession;
jingleSession.addListener(this);
System.out.println(“AnswerCall.AnswerCall”);
callAccceptButton.setEnabled(true);
callAccceptButton.setText(“Answer”);
initiatorJID = StringUtils.parseBareAddress(jingleSession.getInitiator());
}
public void hangupButtonPressed() {
if (jingleSession != null) {
try {
jingleSession.terminate();
} catch (XMPPException e) {
e.printStackTrace();
}
jingleSession.removeListener(this);
}
if (jingleSession != null && sessionEstablished) {
OneToOneChatController.getInstance().getChatSession(initiatorJID).insertMessage (“Call ended”);
} else {
OneToOneChatController.getInstance().getChatSession(initiatorJID).insertMessage (“Call rejected”);
}
}
public void hangUp() {
phoneRingingAudioClip.stop();
if (jingleSession != null && !jingleSession.isClosed()) {
try {
jingleSession.terminate();
} catch (XMPPException e) {
e.printStackTrace();
}
jingleSession.close();
jingleSession = null;
}
callAccceptButton.setEnabled(true);
}
public void callAccceptButtonPressed() {
stopPhoneRing();
try {
jingleSession.start();
} catch (XMPPException e) {
e.printStackTrace();
}
}
public void sessionEstablished(PayloadType payloadType, TransportCandidate transportCandidate, TransportCandidate transportCandidate1, JingleSession jingleSession) {
sessionEstablished = true;
mediaTimerTask = new MyTimerTask();
timer.schedule(mediaTimerTask, WAIT_FOR_MEDIA_DELAY);
}
public void sessionDeclined(String string, JingleSession jingleSession) {
if (phoneRingingAudioClip != null) {
stopPhoneRing();
}
jingleSession.removeListener(this);
OneToOneChatController.getInstance().getChatSession(initiatorJID).insertMessage (“User declined call”);
}
public void sessionRedirected(String string, JingleSession jingleSession) {
//To change body of implemented methods use File | Settings | File Templates.
}
public void sessionClosed(String string, JingleSession jingleSession) {
if (sessionEstablished && mediaReceived) {
OneToOneChatController.getInstance().getChatSession(initiatorJID).insertMessage (“Call ended”);
} else {
if (phoneRingingAudioClip != null) {
stopPhoneRing();
}
OneToOneChatController.getInstance().getChatSession(initiatorJID).insertMessage (“Call ended on error”);
}
jingleSession.removeListener(this);
}
public void sessionClosedOnError(XMPPException xmppException, JingleSession jingleSession) {
if (phoneRingingAudioClip != null) {
stopPhoneRing();
}
jingleSession.removeListener(this);
OneToOneChatController.getInstance().getChatSession(initiatorJID).insertMessage (“Call ended on error”);
}
public void sessionMediaReceived(JingleSession jingleSession, String string) {
mediaReceived = true;
mediaTimerTask.cancel();
}
class MyTimerTask extends TimerTask {
public MyTimerTask() {
}
public void run() {
if (!mediaReceived) {
if (jingleSession != null) {
try {
jingleSession.terminate(“No Media Received. This may be caused by firewall configuration problems.”);
} catch (XMPPException e) {
e.printStackTrace();
}
}
}
}
}
}