/*
WebRTCApplication.java
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.webrtc;
import android.app.Application;
import android.util.Log;
import org.deviceconnect.android.deviceplugin.webrtc.core.Peer;
import org.deviceconnect.android.deviceplugin.webrtc.core.PeerConfig;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Application for WebRTC.
*
* @author NTT DOCOMO, INC.
*/
public class WebRTCApplication extends Application {
/**
* Tag for debugging.
*/
private static final String TAG = "WEBRTC";
/**
* Map that contains the PeerConfig and Peer.
*/
private final Map<PeerConfig, Peer> mPeerMap = new HashMap<>();
/**
* VideoChatActivity call timestamp.
*/
private long mCallTimeStamp = 0;
@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.DEBUG) {
Log.i(TAG, "WebRTCApplication:onCreate");
}
}
@Override
public void onTerminate() {
if (BuildConfig.DEBUG) {
Log.i(TAG, "WebRTCApplication:onTerminate");
}
destroyPeer();
super.onTerminate();
}
/**
* Gets the peer corresponding to the config.
* @param config Instance of PeerConfig
* @param callback Callback to notify the Peer
*/
public void getPeer(final PeerConfig config, final OnGetPeerCallback callback) {
if (config == null) {
throw new NullPointerException("config is null.");
}
if (callback == null) {
throw new NullPointerException("callback is null.");
}
final Peer.OnConnectCallback peerCallback = new Peer.OnConnectCallback() {
@Override
public void onConnected(final Peer peer) {
callback.onGetPeer(peer);
}
@Override
public void onError() {
callback.onGetPeer(null);
}
};
synchronized (mPeerMap) {
Peer peer = mPeerMap.get(config);
if (peer != null) {
if (peer.isConnected()) {
callback.onGetPeer(peer);
} else {
peer.connect(peerCallback);
}
} else {
try {
peer = new Peer(getApplicationContext(), config);
peer.connect(peerCallback);
mPeerMap.put(config, peer);
} catch (Exception e) {
callback.onGetPeer(null);
}
}
}
}
/**
* Destroy the all Peer.
*/
public void destroyPeer() {
synchronized (mPeerMap) {
for (Map.Entry<PeerConfig, Peer> entry : mPeerMap.entrySet()) {
entry.getValue().destroy();
entry.getValue().removePeerEventListener();
}
mPeerMap.clear();
}
}
/**
* Checks whether device has a video chat.
* @return true if device has a video chat, false otherwise
*/
public boolean isConnected() {
synchronized (mPeerMap) {
for (Map.Entry<PeerConfig, Peer> entry : mPeerMap.entrySet()) {
if (entry.getValue().hasConnections()) {
return true;
}
}
}
return false;
}
/**
* Destroy the Peer corresponding to the config.
* @param config config
*/
public void destroyPeer(final PeerConfig config) {
synchronized (mPeerMap) {
Peer peer = mPeerMap.remove(config);
if (peer != null) {
peer.destroy();
}
}
}
/**
* Gets the list of PeerConfig.
* @return list
*/
public List<PeerConfig> getPeerConfig() {
synchronized (mPeerMap) {
List<PeerConfig> list = new ArrayList<>();
// shadow copy
Set<PeerConfig> configs = mPeerMap.keySet();
for (PeerConfig config : configs) {
list.add(config);
}
return list;
}
}
/**
* Gets the peer corresponding to the config.
* @param config PeerConfig
* @return instance of Peer
*/
public Peer getPeer(final PeerConfig config) {
synchronized (mPeerMap) {
return mPeerMap.get(config);
}
}
/**
* This interface is used to implement {@link WebRTCApplication} callbacks.
*/
public interface OnGetPeerCallback {
/**
* Gets the peer.
* @param peer instance of peer
*/
void onGetPeer(Peer peer);
}
/**
* Set callTimeStamp.
* @param timeStamp timestamp.
*/
public void setCallTimeStamp(final long timeStamp) {
mCallTimeStamp = timeStamp;
}
/**
* Get callTimeStamp;
* @return callTimeStamp.
*/
public long getCallTimeStamp() {
return mCallTimeStamp;
}
}