package call.gui;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import call.AbstractCallConnection;
import call.AbstractId;
import call.CallClient;
import call.CallFactory;
import call.Contact;
import call.Util;
public class CallAction extends AbstractId {
private final JHoverButton callbutton;
private final Contact contact;
public CallAction(Contact contact, JHoverButton callbutton) {
this.contact = contact;
this.callbutton = callbutton;
updatebutton();
}
public Action getActionListener() {
return new Listener();
}
public void buttonclick() {
callbutton.setIcon(Resources.ICON_CONNECT_CALL);
callbutton.setEnabled(false);
new Thread(new Runnable() {
@Override
public void run() {
switch (CallFactory.getCallState(contact)) {
case CLOSED:
start();
break;
case CONNECTING:
stop();
break;
case OPEN:
stop();
break;
default:
break;
}
updatebutton();
}
}).start();
}
void updatebutton() {
switch (CallFactory.getCallState(contact)) {
case CLOSED:
if (contact.isReachable())
callbutton.setIcon(Resources.ICON_START_CALL, Resources.ICON_START_CALL_HOVER);
else
callbutton.setIcon(Resources.ICON_START_CALL_DISABLED, Resources.ICON_START_CALL_DISABLED);
callbutton.setEnabled(true);
break;
case CONNECTING:
callbutton.setIcon(Resources.ICON_CONNECT_CALL);
callbutton.setEnabled(false);
break;
case OPEN:
callbutton.setIcon(Resources.ICON_STOP_CALL, Resources.ICON_STOP_CALL_HOVER);
callbutton.setEnabled(true);
break;
default:
break;
}
}
private void start() {
Util.msg(contact).println("Outgoing call...", Color.green);
try {
CallClient client = new CallClient(contact);
@SuppressWarnings("unused")
Thread thread = client.startCall();
openCall();
// Util.msg(contact).println("Connected.", Color.green);
} catch (Exception e) {
Util.msg(contact).println("Call failed :(", Color.red);
Util.msg(contact).println("Error: " + e.getLocalizedMessage(), Color.red);
e.printStackTrace();
CallFactory.closeCall(contact);
}
}
private void stop() {
CallFactory.closeCall(contact);
}
@Override
public String getId() {
return "CallAction<" + contact + ">";
}
public void openCall() {
new CallActionConnection(contact);
updatebutton();
}
private class CallActionConnection extends AbstractCallConnection {
public CallActionConnection(Contact contact) {
super(contact);
}
@Override
public void onCallClose() {
Util.msg(contact).println("Disconnected.", Color.green);
updatebutton();
super.onCallClose();
}
@Override
public void onCallOpen() {
Util.msg(contact).println("Connected.", Color.green);
updatebutton();
super.onCallOpen();
}
@Override
public String getId() {
return "CallActionConnection<" + contact + ">";
}
}
private class Listener extends AbstractAction implements ActionListener {
private static final long serialVersionUID = -2894054980727988921L;
@Override
public synchronized void actionPerformed(ActionEvent event) {
buttonclick();
}
}
}