/* VideoChatActivity.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.activity; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.WindowManager; import org.deviceconnect.android.deviceplugin.webrtc.BuildConfig; import org.deviceconnect.android.deviceplugin.webrtc.R; import org.deviceconnect.android.deviceplugin.webrtc.WebRTCApplication; import org.deviceconnect.android.deviceplugin.webrtc.core.MySurfaceViewRenderer; import org.deviceconnect.android.deviceplugin.webrtc.core.PeerConfig; import org.deviceconnect.android.deviceplugin.webrtc.core.WebRTCController; import org.deviceconnect.android.deviceplugin.webrtc.fragment.PercentFrameLayout; import org.deviceconnect.android.deviceplugin.webrtc.profile.WebRTCVideoChatProfile; import org.webrtc.EglBase; import org.webrtc.RendererCommon; import org.webrtc.voiceengine.WebRtcAudioTrack; /** * VideoChatActivity. * @author NTT DOCOMO, INC. */ public class VideoChatActivity extends Activity { /** * Tag for debugging. */ private static final String TAG = "WEBRTC"; /** * Defined a extra config. * Constant Value: {@value} */ public static final String EXTRA_CONFIG = "config"; /** * Defined a extra address. * Constant Value: {@value} */ public static final String EXTRA_ADDRESS_ID = "address_id"; /** * Defined a extra video uri. * Constant Value: {@value} */ public static final String EXTRA_VIDEO_URI = "video_uri"; /** * Defined a extra audio uri. * Constant Value: {@value} */ public static final String EXTRA_AUDIO_URI = "audio_uri"; /** * Defined a extra offer. * Constant Value: {@value} */ public static final String EXTRA_OFFER = "offer"; /** * Defined a extra audioSampleRate. * Constant Value: {@value} */ public static final String EXTRA_AUDIOSAMPLERATE = "audioSampleRate"; /** * Defined a extra audioBitDepth. * Constant Value: {@value} */ public static final String EXTRA_AUDIOBITDEPTH = "audioBitDepth"; /** * Defined a extra audioChannel. * Constant Value: {@value} */ public static final String EXTRA_AUDIOCHANNEL = "audioChannel"; /** * Defined a extra callTimeStamp. * Constant Value: {@value} */ public static final String EXTRA_CALL_TIMESTAMP = "callTimeStamp"; private PercentFrameLayout mLocalLayout; private PercentFrameLayout mRemoteLayout; private MySurfaceViewRenderer mLocalRender; private MySurfaceViewRenderer mRemoteRender; private WebRTCController mWebRTCController; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mLocalLayout = (PercentFrameLayout) findViewById(R.id.local_view_layout); mRemoteLayout = (PercentFrameLayout) findViewById(R.id.remote_video_layout); mLocalRender = (MySurfaceViewRenderer) findViewById(R.id.local_video_view); mLocalRender.setType(MySurfaceViewRenderer.TYPE_LOCAL); mRemoteRender = (MySurfaceViewRenderer) findViewById(R.id.remote_video_view); mRemoteRender.setType(MySurfaceViewRenderer.TYPE_REMOTE); EglBase eglBase = EglBase.create(); mRemoteRender.init(eglBase.getEglBaseContext(), null); mLocalRender.init(eglBase.getEglBaseContext(), null); mLocalRender.setZOrderMediaOverlay(true); WebRtcAudioTrack.setAudioTrackModuleFactory(null); Intent intent = getIntent(); if (intent != null) { long prevTimeStamp = ((WebRTCApplication) getApplication()).getCallTimeStamp(); long callTimeStamp = intent.getLongExtra(EXTRA_CALL_TIMESTAMP, 0); if (prevTimeStamp == callTimeStamp) { createWebRTCErrorDialog(); return; } ((WebRTCApplication) getApplication()).setCallTimeStamp(callTimeStamp); PeerConfig config = intent.getParcelableExtra(EXTRA_CONFIG); String videoUri = intent.getStringExtra(EXTRA_VIDEO_URI); String audioUri = intent.getStringExtra(EXTRA_AUDIO_URI); String addressId = intent.getStringExtra(EXTRA_ADDRESS_ID); boolean offer = intent.getBooleanExtra(EXTRA_OFFER, false); String audioSampleRate = intent.getStringExtra(EXTRA_AUDIOSAMPLERATE); int audioSampleRateValue; if (audioSampleRate == null) { audioSampleRateValue = WebRTCVideoChatProfile.PARAM_RATE_48000; } else { audioSampleRateValue = Integer.valueOf(audioSampleRate); } String audioBitDepth = intent.getStringExtra(EXTRA_AUDIOBITDEPTH); String audioChannel = intent.getStringExtra(EXTRA_AUDIOCHANNEL); WebRTCController.Builder builder = new WebRTCController.Builder(); builder.setApplication((WebRTCApplication) getApplication()); builder.setWebRTCEventListener(mListener); builder.setContext(this); builder.setEglBase(eglBase); builder.setConfig(config); builder.setRemoteRender(mRemoteRender); builder.setLocalRender(mLocalRender); builder.setVideoUri(videoUri); builder.setAudioUri(audioUri); builder.setAddressId(addressId); builder.setOffer(offer); builder.setAudioSampleRate(audioSampleRateValue); builder.setAudioBitDepth(audioBitDepth); builder.setAudioChannel(audioChannel); builder.setLandscape(isLandscape()); mWebRTCController = builder.create(); updateVideoView(videoUri); } else { openWebRTCErrorDialog(); } } private boolean isLandscape() { return (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); } @Override protected void onResume() { super.onResume(); if (mWebRTCController != null) { mWebRTCController.onResume(); } } @Override protected void onPause() { super.onPause(); if (mWebRTCController != null) { mWebRTCController.onPause(); } } @Override protected void onDestroy() { hangup(); super.onDestroy(); } @Override public boolean onKeyDown(final int keyCode, final KeyEvent event) { if (keyCode != KeyEvent.KEYCODE_BACK) { return super.onKeyDown(keyCode, event); } else { hangup(); return false; } } /** * Updated layout of the views. */ private void updateVideoView(final String videoUri) { mRemoteLayout.setPosition(0, 0, 100, 90); mRemoteRender.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT); mRemoteRender.setMirror(false); mLocalLayout.setPosition(72, 72, 25, 25); mLocalRender.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT); mLocalRender.setMirror("true".equals(videoUri)); mLocalRender.requestLayout(); mRemoteRender.requestLayout(); } /** * Hang up a call. */ private void hangup() { if (BuildConfig.DEBUG) { Log.d(TAG, "@@@ VideoChatActivity::hangup"); } if (mWebRTCController != null) { mWebRTCController.hangup(); mWebRTCController = null; } } /** * Open a error dialog of WebRTC. */ private void openWebRTCErrorDialog() { openErrorDialog(R.string.error_failed_to_connect_p2p_msg); } /** * Create a error dialog of WebRTC. */ private void createWebRTCErrorDialog() { openErrorDialog(R.string.error_failed_to_connect_already_disconnect_msg); } /** * Open a error dialog. * * @param resId resource id */ private void openErrorDialog(final int resId) { runOnUiThread(new Runnable() { @Override public void run() { AlertDialog.Builder builder = new AlertDialog.Builder(VideoChatActivity.this); builder.setTitle(R.string.error_failed_to_connect_p2p_title); builder.setMessage(resId); builder.setPositiveButton(R.string.error_failed_to_connect_p2p_btn, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); AlertDialog dialog = builder.create(); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { finish(); } }); dialog.show(); } }); } private WebRTCController.WebRTCEventListener mListener = new WebRTCController.WebRTCEventListener() { @Override public void onFoundPeer(WebRTCController controller) { if (BuildConfig.DEBUG) { Log.d(TAG, "WebRTCEventListener#onFoundPeer"); } } @Override public void onNotFoundPeer(WebRTCController controller) { openWebRTCErrorDialog(); } @Override public void onCallFailed(WebRTCController controller) { openWebRTCErrorDialog(); } @Override public void onAnswerFailed(WebRTCController controller) { openWebRTCErrorDialog(); } @Override public void onConnected(WebRTCController controller) { } @Override public void onDisconnected(WebRTCController controller) { finish(); } @Override public void onError(WebRTCController controller) { openWebRTCErrorDialog(); } }; }