package call;
import java.net.Socket;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CallFactory {
private static final Map<Contact, Call> calls = new HashMap<>();
public static synchronized CallThread createCall(Contact contact, Socket socket, List<String> headers) {
// initialize call map
Call call = new Call(contact, socket, headers);
synchronized (calls) {
calls.put(contact, call);
}
// do call
CallThread callthread = new CallThread(contact, socket, headers);
CallUi.openChat(contact);
CallUi.openCall(contact);
return callthread;
}
public static synchronized Call getCall(Contact contact) {
synchronized (calls) {
if (calls.containsKey(contact)) {
Call call = calls.get(contact);
return call;
} else {
System.out.println("getCall: " + contact.getId() + " = null ");
return null;
}
}
}
public static synchronized boolean existsCall(Contact contact) {
Call call = getCall(contact);
if (call != null) {
return call.getState().equals(ConnectionState.OPEN)
|| call.getState().equals(ConnectionState.CONNECTING);
} else {
return false;
}
}
public static synchronized ConnectionState getCallState(Contact contact) {
Call call = getCall(contact);
if (call != null) {
return call.getState();
} else {
return ConnectionState.CLOSED;
}
}
public static synchronized void closeCall(Contact contact) {
Call call = null;
synchronized (calls) {
if (calls.containsKey(contact)) {
call = calls.get(contact);
}
}
if (call != null) {
call.close();
}
synchronized (calls) {
if (calls.containsKey(contact)) {
calls.remove(contact);
}
}
}
public static void openCall(Contact contact) {
Call call = null;
synchronized (calls) {
if (calls.containsKey(contact)) {
call = calls.get(contact);
}
}
if (call != null)
call.open();
}
}