/*
 *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.webrtc.examples.androidnativeapi;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.Button;
import org.webrtc.Camera1Enumerator;
import org.webrtc.Camera2Enumerator;
import org.webrtc.CameraEnumerator;
import org.webrtc.ContextUtils;
import org.webrtc.EglBase;
import org.webrtc.GlRectDrawer;
import org.webrtc.SurfaceTextureHelper;
import org.webrtc.SurfaceViewRenderer;
import org.webrtc.VideoCapturer;

public class MainActivity extends Activity {
  private @Nullable CallClient callClient;
  private @Nullable EglBase eglBase;
  private @Nullable SurfaceViewRenderer localRenderer;
  private @Nullable SurfaceViewRenderer remoteRenderer;
  private @Nullable SurfaceTextureHelper videoCapturerSurfaceTextureHelper;
  private @Nullable VideoCapturer videoCapturer;

  @Override
  protected void onCreate(Bundle savedInstance) {
    ContextUtils.initialize(getApplicationContext());

    super.onCreate(savedInstance);
    setContentView(R.layout.activity_main);

    System.loadLibrary("examples_androidnativeapi_jni");
    callClient = new CallClient(getApplicationContext());

    Button callButton = (Button) findViewById(R.id.call_button);
    callButton.setOnClickListener((view) -> {
      if (videoCapturer == null) {
        videoCapturer = createVideoCapturer(getApplicationContext());
      }
      callClient.call(
          localRenderer, remoteRenderer, videoCapturer, videoCapturerSurfaceTextureHelper);
    });

    Button hangupButton = (Button) findViewById(R.id.hangup_button);
    hangupButton.setOnClickListener((view) -> { hangup(); });
  }

  @Override
  protected void onStart() {
    super.onStart();

    eglBase = EglBase.create(null /* sharedContext */, EglBase.CONFIG_PLAIN);
    localRenderer = (SurfaceViewRenderer) findViewById(R.id.local_renderer);
    remoteRenderer = (SurfaceViewRenderer) findViewById(R.id.remote_renderer);

    localRenderer.init(eglBase.getEglBaseContext(), null /* rendererEvents */, EglBase.CONFIG_PLAIN,
        new GlRectDrawer());
    remoteRenderer.init(eglBase.getEglBaseContext(), null /* rendererEvents */,
        EglBase.CONFIG_PLAIN, new GlRectDrawer());

    videoCapturerSurfaceTextureHelper =
        SurfaceTextureHelper.create("VideoCapturerThread", eglBase.getEglBaseContext());
  }

  @Override
  protected void onStop() {
    hangup();

    localRenderer.release();
    remoteRenderer.release();
    videoCapturerSurfaceTextureHelper.dispose();
    eglBase.release();

    localRenderer = null;
    remoteRenderer = null;
    videoCapturerSurfaceTextureHelper = null;
    eglBase = null;

    super.onStop();
  }

  @Override
  protected void onDestroy() {
    callClient.close();
    callClient = null;

    super.onDestroy();
  }

  private void hangup() {
    if (videoCapturer != null) {
      try {
        videoCapturer.stopCapture();
      } catch (InterruptedException e) {
        throw new RuntimeException(e);
      }
      videoCapturer.dispose();
      videoCapturer = null;
    }
    callClient.hangup();
  }

  private static VideoCapturer createVideoCapturer(Context context) {
    CameraEnumerator enumerator = Camera2Enumerator.isSupported(context)
        ? new Camera2Enumerator(context)
        : new Camera1Enumerator();
    return enumerator.createCapturer(enumerator.getDeviceNames()[0], null /* eventsHandler */);
  }
}
