package im.actor.runtime.android;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
import android.support.annotation.NonNull;
import org.jetbrains.annotations.NotNull;
import org.webrtc.AudioSource;
import org.webrtc.MediaConstraints;
import org.webrtc.MediaStream;
import org.webrtc.PeerConnection;
import org.webrtc.PeerConnectionFactory;
import org.webrtc.VideoCapturer;
import org.webrtc.VideoSource;
import org.webrtc.VideoTrack;
import im.actor.runtime.WebRTCRuntime;
import im.actor.runtime.actors.ActorContext;
import im.actor.runtime.android.webrtc.AndroidAudioSource;
import im.actor.runtime.android.webrtc.AndroidVideoSource;
import im.actor.runtime.promise.Promise;
import im.actor.runtime.promise.PromiseFunc;
import im.actor.runtime.promise.PromiseResolver;
import im.actor.runtime.android.webrtc.AndroidMediaStream;
import im.actor.runtime.android.webrtc.AndroidPeerConnection;
import im.actor.runtime.webrtc.WebRTCIceServer;
import im.actor.runtime.webrtc.WebRTCMediaStream;
import im.actor.runtime.webrtc.WebRTCPeerConnection;
import im.actor.runtime.webrtc.WebRTCSettings;
public class AndroidWebRTCRuntimeProvider implements WebRTCRuntime {
public static final PeerConnectionFactory FACTORY;
private static final Handler sVcHandler;
static {
PeerConnectionFactory.initializeAndroidGlobals(AndroidContext.getContext(), true, true, true);
FACTORY = new PeerConnectionFactory();
HandlerThread vcthread = new HandlerThread("PeerConnectionConnectionThread");
vcthread.start();
sVcHandler = new Handler(vcthread.getLooper());
}
@NotNull
@Override
public Promise<WebRTCPeerConnection> createPeerConnection(final WebRTCIceServer[] webRTCIceServers, final WebRTCSettings settings) {
return new Promise<>((PromiseFunc<WebRTCPeerConnection>) resolver -> {
resolver.result(new AndroidPeerConnection(webRTCIceServers, settings));
});
}
@NotNull
@Override
public Promise<WebRTCMediaStream> getUserMedia(boolean isAudioEnabled, boolean isVideoEnabled) {
return new Promise<>((PromiseFunc<WebRTCMediaStream>) resolver -> {
sVcHandler.post(() -> {
AndroidAudioSource audioSource = null;
if (isAudioEnabled) {
audioSource = AndroidAudioSource.pickAudioSource();
}
AndroidVideoSource videoSource = null;
if (isVideoEnabled) {
videoSource = AndroidVideoSource.pickVideoSource();
}
resolver.result(new AndroidMediaStream(audioSource, videoSource));
});
});
}
@Override
public boolean supportsPreConnections() {
return false;
}
public static void postToHandler(Runnable r) {
sVcHandler.post(r);
}
}