/*
 *  Copyright (c) 2011 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.videoengineapp;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

import org.webrtc.videoengine.ViERenderer;


import android.app.TabActivity;
import android.content.Context;
import android.content.res.Configuration;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;

import android.util.Log;
import android.view.KeyEvent;
import android.view.Surface;
import android.view.SurfaceView;
import android.view.View;
import android.view.Display;
import android.view.Window;
import android.view.WindowManager;

import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;

import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.TabHost.TabSpec;
import android.view.OrientationEventListener;

public class ViEAndroidDemo extends TabActivity implements IViEAndroidCallback,
                                                View.OnClickListener,
                                                OnItemSelectedListener {
  private ViEAndroidJavaAPI ViEAndroidAPI = null;

  // remote renderer
  private SurfaceView remoteSurfaceView = null;

  // local renderer and camera
  private SurfaceView svLocal = null;

  // channel number
  private int channel;
  private int cameraId;
  private int voiceChannel = -1;

  // flags
  private boolean viERunning = false;
  private boolean voERunning = false;

  // debug
  private boolean enableTrace = false;

  // Constant
  private static final String LOG_TAG = "*WEBRTCJ*";
  private static final int RECEIVE_CODEC_FRAMERATE = 30;
  private static final int SEND_CODEC_FRAMERATE = 15;
  private static final int INIT_BITRATE = 400;

  private static final int EXPIRARY_YEAR = 2010;
  private static final int EXPIRARY_MONTH = 10;
  private static final int EXPIRARY_DAY = 22;

  private int volumeLevel = 204;

  private TabHost mTabHost = null;

  private TabSpec mTabSpecConfig;
  private TabSpec mTabSpecVideo;

  private LinearLayout mLlRemoteSurface = null;
  private LinearLayout mLlLocalSurface = null;

  private Button btStartStopCall;
  private Button btSwitchCamera;

  //Global Settings
  private CheckBox cbVideoSend;
  private boolean enableVideoSend = true;
  private CheckBox cbVideoReceive;
  private boolean enableVideoReceive = true;
  private boolean enableVideo = true;
  private CheckBox cbVoice;
  private boolean enableVoice = false;
  private EditText etRemoteIp;
  private String remoteIp = "10.1.100.68";
  private CheckBox cbLoopback;
  private boolean loopbackMode = true;

  //Video settings
  private Spinner spCodecType;
  private int codecType = 0;
  private Spinner spCodecSize;
  private int codecSizeWidth = 352;
  private int codecSizeHeight = 288;
  private TextView etVRxPort;
  private int receivePortVideo = 11111;
  private TextView etVTxPort;
  private int destinationPortVideo = 11111;
  private CheckBox cbEnableNack;
  private boolean enableNack = false;

  //Audio settings
  private Spinner spVoiceCodecType;
  private int voiceCodecType = 5; //PCMU = 5
  private TextView etARxPort;
  private int receivePortVoice = 11113;
  private TextView etATxPort;
  private int destinationPortVoice = 11113;
  private CheckBox cbEnableSpeaker;
  private boolean enableSpeaker = false;
  private CheckBox cbEnableAGC;
  private boolean enableAGC = false;
  private CheckBox cbEnableAECM;
  private boolean enableAECM = false;
  private CheckBox cbEnableNS;
  private boolean enableNS = false;

  //Stats
  private TextView tvFrameRateI;
  private TextView tvBitRateI;
  private TextView tvPacketLoss;
  private TextView tvFrameRateO;
  private TextView tvBitRateO;
  private int frameRateI;
  private int bitRateI;
  private int packetLoss;
  private int frameRateO;
  private int bitRateO;

  private WakeLock wakeLock;

  private boolean usingFrontCamera = false;

  private OrientationEventListener orientationListener;
  int currentOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
  int currentCameraOrientation = 0;

  //Convert current display orientation to how much the camera should be rotated.
  public int GetCameraOrientation(int cameraOrientation) {
    Display display = this.getWindowManager().getDefaultDisplay();
    int displatyRotation = display.getRotation();
    int degrees = 0;
    switch (displatyRotation) {
      case Surface.ROTATION_0: degrees = 0; break;
      case Surface.ROTATION_90: degrees = 90; break;
      case Surface.ROTATION_180: degrees = 180; break;
      case Surface.ROTATION_270: degrees = 270; break;
    }
    int result=0;
    if(cameraOrientation>180) {
      result=(cameraOrientation + degrees) % 360;
    }
    else {
      result=(cameraOrientation - degrees+360) % 360;
    }

    return result;
  }

  public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    int newRotation = GetCameraOrientation(currentCameraOrientation);
    if (viERunning){
      ViEAndroidAPI.SetRotation(cameraId,newRotation);
    }
  }

  // Called when the activity is first created.
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                         WindowManager.LayoutParams.FLAG_FULLSCREEN);

    PowerManager pm = (PowerManager)this.getSystemService(
        Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(
        PowerManager.SCREEN_DIM_WAKE_LOCK, LOG_TAG);

    setContentView(R.layout.tabhost);
    mTabHost = getTabHost();

    //Video tab
    mTabSpecVideo = mTabHost.newTabSpec("tab_video");
    mTabSpecVideo.setIndicator("Video");
    mTabSpecVideo.setContent(R.id.tab_video);
    mTabHost.addTab(mTabSpecVideo);

    //Shared config tab
    mTabHost = getTabHost();
    mTabSpecConfig = mTabHost.newTabSpec("tab_config");
    mTabSpecConfig.setIndicator("Config");
    mTabSpecConfig.setContent(R.id.tab_config);
    mTabHost.addTab(mTabSpecConfig);

    TabSpec mTabv;
    mTabv = mTabHost.newTabSpec("tab_vconfig");
    mTabv.setIndicator("V. Config");
    mTabv.setContent(R.id.tab_vconfig);
    mTabHost.addTab(mTabv);
    TabSpec mTaba;
    mTaba = mTabHost.newTabSpec("tab_aconfig");
    mTaba.setIndicator("A. Config");
    mTaba.setContent(R.id.tab_aconfig);
    mTabHost.addTab(mTaba);
    TabSpec mTabs;
    mTabs = mTabHost.newTabSpec("tab_stats");
    mTabs.setIndicator("Stats");
    mTabs.setContent(R.id.tab_stats);
    mTabHost.addTab(mTabs);

    int childCount = mTabHost.getTabWidget().getChildCount();
    for (int i=0; i<childCount; i++)
      mTabHost.getTabWidget().getChildAt(i).getLayoutParams().height = 50;

    orientationListener =
        new OrientationEventListener(this,SensorManager.SENSOR_DELAY_UI) {
        public void onOrientationChanged (int orientation) {
          if (orientation != ORIENTATION_UNKNOWN) {
            currentOrientation = orientation;
          }
        }
      };
    orientationListener.enable ();

    StartMain();
    return;
  }

  private String GetLocalIpAddress() {
    String localIPs = "";
    try {
      for (Enumeration<NetworkInterface> en = NetworkInterface
               .getNetworkInterfaces(); en.hasMoreElements();) {
        NetworkInterface intf = en.nextElement();
        for (Enumeration<InetAddress> enumIpAddr = intf
                 .getInetAddresses(); enumIpAddr.hasMoreElements();) {
          InetAddress inetAddress = enumIpAddr.nextElement();
          if (!inetAddress.isLoopbackAddress()) {
            localIPs += inetAddress.getHostAddress().toString() + " ";
            //set the remote ip address the same as
            // the local ip address of the last netif
            remoteIp = inetAddress.getHostAddress().toString();
          }
        }
      }
    } catch (SocketException ex) {
      Log.e(LOG_TAG, ex.toString());
    }
    return localIPs;
  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
      if (viERunning) {
        StopAll();
        StartMain();
      }
      finish();
      return true;
    }
    return super.onKeyDown(keyCode, event);
  }

  private void StopAll() {
    if (ViEAndroidAPI != null) {
      if (voERunning) {
        voERunning = false;
        StopVoiceEngine();
      }

      if (viERunning) {
        viERunning = false;
        ViEAndroidAPI.StopRender(channel);
        ViEAndroidAPI.StopReceive(channel);
        ViEAndroidAPI.StopSend(channel);
        ViEAndroidAPI.RemoveRemoteRenderer(channel);
        // stop the camera
        ViEAndroidAPI.StopCamera(cameraId);
        ViEAndroidAPI.Terminate();
        mLlRemoteSurface.removeView(remoteSurfaceView);
        mLlLocalSurface.removeView(svLocal);
        remoteSurfaceView = null;

        svLocal = null;
      }
    }
  }

  private void StartMain() {
    mTabHost.setCurrentTab(0);

    mLlRemoteSurface = (LinearLayout) findViewById(R.id.llRemoteView);
    mLlLocalSurface = (LinearLayout) findViewById(R.id.llLocalView);

    if (null == ViEAndroidAPI)
      ViEAndroidAPI = new ViEAndroidJavaAPI(this);

    //setContentView(R.layout.main);
    btSwitchCamera = (Button)findViewById(R.id.btSwitchCamera);
    btSwitchCamera.setOnClickListener(this);
    btStartStopCall = (Button)findViewById(R.id.btStartStopCall);
    btStartStopCall.setOnClickListener(this);
    findViewById(R.id.btExit).setOnClickListener(this);

    // cleaning
    remoteSurfaceView = null;
    svLocal = null;

    // init UI
    ArrayAdapter<?> adapter;

    int resource = android.R.layout.simple_spinner_item;
    int dropdownRes = android.R.layout.simple_spinner_dropdown_item;

    // video codec
    spCodecType = (Spinner) findViewById(R.id.spCodecType);
    adapter = ArrayAdapter.createFromResource(this,
                                              R.array.codectype,
                                              resource);
    adapter.setDropDownViewResource(dropdownRes);
    spCodecType.setAdapter(adapter);
    spCodecType.setSelection(codecType);
    spCodecType.setOnItemSelectedListener(this);

    // voice codec
    spVoiceCodecType = (Spinner) findViewById(R.id.spVoiceCodecType);
    adapter = ArrayAdapter.createFromResource(this, R.array.voiceCodecType,
                                              resource);
    adapter.setDropDownViewResource(dropdownRes);
    spVoiceCodecType.setAdapter(adapter);
    spVoiceCodecType.setSelection(voiceCodecType);
    spVoiceCodecType.setOnItemSelectedListener(this);

    spCodecSize = (Spinner) findViewById(R.id.spCodecSize);
    adapter = ArrayAdapter.createFromResource(this, R.array.codecSize,
                                              resource);
    adapter.setDropDownViewResource(dropdownRes);
    spCodecSize.setAdapter(adapter);
    spCodecSize.setOnItemSelectedListener(this);

    String ip = GetLocalIpAddress();
    TextView tvLocalIp = (TextView) findViewById(R.id.tvLocalIp);
    tvLocalIp.setText("Local IP address - " + ip);

    etRemoteIp = (EditText) findViewById(R.id.etRemoteIp);
    etRemoteIp.setText(remoteIp);

    cbLoopback = (CheckBox) findViewById(R.id.cbLoopback);
    cbLoopback.setChecked(loopbackMode);

    cbVoice = (CheckBox) findViewById(R.id.cbVoice);
    cbVoice.setChecked(enableVoice);

    cbVideoSend = (CheckBox) findViewById(R.id.cbVideoSend);
    cbVideoSend.setChecked(enableVideoSend);
    cbVideoReceive = (CheckBox) findViewById(R.id.cbVideoReceive);
    cbVideoReceive.setChecked(enableVideoReceive);

    etVTxPort = (EditText) findViewById(R.id.etVTxPort);
    etVTxPort.setText(Integer.toString(destinationPortVideo));

    etVRxPort = (EditText) findViewById(R.id.etVRxPort);
    etVRxPort.setText(Integer.toString(receivePortVideo));

    etATxPort = (EditText) findViewById(R.id.etATxPort);
    etATxPort.setText(Integer.toString(destinationPortVoice));

    etARxPort = (EditText) findViewById(R.id.etARxPort);
    etARxPort.setText(Integer.toString(receivePortVoice));

    cbEnableNack = (CheckBox) findViewById(R.id.cbNack);
    cbEnableNack.setChecked(enableNack);

    cbEnableSpeaker = (CheckBox) findViewById(R.id.cbSpeaker);
    cbEnableSpeaker.setChecked(enableSpeaker);
    cbEnableAGC = (CheckBox) findViewById(R.id.cbAutoGainControl);
    cbEnableAGC.setChecked(enableAGC);
    cbEnableAECM = (CheckBox) findViewById(R.id.cbAECM);
    cbEnableAECM.setChecked(enableAECM);
    cbEnableNS = (CheckBox) findViewById(R.id.cbNoiseSuppression);
    cbEnableNS.setChecked(enableNS);

    cbEnableNack.setOnClickListener(this);
    cbEnableSpeaker.setOnClickListener(this);
    cbEnableAECM.setOnClickListener(this);

    cbEnableAGC.setOnClickListener(this);
    cbEnableNS.setOnClickListener(this);

    tvFrameRateI = (TextView) findViewById(R.id.tvFrameRateI);
    tvBitRateI = (TextView) findViewById(R.id.tvBitRateI);
    tvPacketLoss = (TextView) findViewById(R.id.tvPacketLoss);
    tvFrameRateO = (TextView) findViewById(R.id.tvFrameRateO);
    tvBitRateO = (TextView) findViewById(R.id.tvBitRateO);

  }

  @Override
  protected void onPause() {
    super.onPause();
    // if (remoteSurfaceView != null)
    // glSurfaceView.onPause();
  }

  @Override
  protected void onResume() {
    super.onResume();
    // if (glSurfaceView != null)
    // glSurfaceView.onResume();
  }

  private void StartCall() {
    int ret = 0;

    if (enableVoice) {
      SetupVoE();
      StartVoiceEngine();
    }

    if (enableVideo) {
      if (enableVideoSend) {
        // camera and preview surface
        svLocal = ViERenderer.CreateLocalRenderer(this);
      }

      ret = ViEAndroidAPI.GetVideoEngine();
      ret = ViEAndroidAPI.Init(enableTrace);
      channel = ViEAndroidAPI.CreateChannel(voiceChannel);
      ret = ViEAndroidAPI.SetLocalReceiver(channel,
                                           receivePortVideo);
      ret = ViEAndroidAPI.SetSendDestination(channel,
                                             destinationPortVideo,
                                             remoteIp.getBytes());

      if (enableVideoReceive) {
        if(android.os.Build.MANUFACTURER.equals("samsung")) {
          // Create an Open GL renderer
          remoteSurfaceView = ViERenderer.CreateRenderer(this, true);
          ret = ViEAndroidAPI.AddRemoteRenderer(channel, remoteSurfaceView);
        }
        else {
          remoteSurfaceView = ViERenderer.CreateRenderer(this, false);
          ret = ViEAndroidAPI.AddRemoteRenderer(channel, remoteSurfaceView);
        }

        ret = ViEAndroidAPI.SetReceiveCodec(channel,
                                            codecType,
                                            INIT_BITRATE,
                                            codecSizeWidth,
                                            codecSizeHeight,
                                            RECEIVE_CODEC_FRAMERATE);
        ret = ViEAndroidAPI.StartRender(channel);
        ret = ViEAndroidAPI.StartReceive(channel);
      }

      if (enableVideoSend) {
        currentCameraOrientation =
            ViEAndroidAPI.GetCameraOrientation(usingFrontCamera?1:0);
        ret = ViEAndroidAPI.SetSendCodec(channel,
                                         codecType,
                                         INIT_BITRATE,
                                         codecSizeWidth,
                                         codecSizeHeight,
                                         SEND_CODEC_FRAMERATE);
        int cameraId = ViEAndroidAPI.StartCamera(channel, usingFrontCamera?1:0);

        if(cameraId>0) {
          cameraId = cameraId;
          int neededRotation = GetCameraOrientation(currentCameraOrientation);
          ViEAndroidAPI.SetRotation(cameraId,neededRotation);
        }
        else {
          ret=cameraId;
        }
        ret = ViEAndroidAPI.StartSend(channel);
      }

      ret = ViEAndroidAPI.SetCallback(channel, this);

      if (enableVideoSend) {
        if (mLlLocalSurface != null)
          mLlLocalSurface.addView(svLocal);
      }

      if (enableVideoReceive) {
        if (mLlRemoteSurface != null)
          mLlRemoteSurface.addView(remoteSurfaceView);
      }

      viERunning = true;
    }

  }

  private void DemoLog(String msg) {
    Log.d("*WEBRTC*", msg);
  }

  private void StopVoiceEngine() {
    // Stop send
    if (0 != ViEAndroidAPI.VoE_StopSend(voiceChannel)) {
      DemoLog("VoE stop send failed");
    }

    // Stop listen
    if (0 != ViEAndroidAPI.VoE_StopListen(voiceChannel)) {
      DemoLog("VoE stop listen failed");
    }

    // Stop playout
    if (0 != ViEAndroidAPI.VoE_StopPlayout(voiceChannel)) {
      DemoLog("VoE stop playout failed");
    }

    if (0 != ViEAndroidAPI.VoE_DeleteChannel(voiceChannel)) {
      DemoLog("VoE delete channel failed");
    }
    voiceChannel=-1;

    // Terminate
    if (0 != ViEAndroidAPI.VoE_Terminate()) {
      DemoLog("VoE terminate failed");
    }
  }

  private void SetupVoE() {
    // Create VoiceEngine
    // Error logging is done in native API wrapper
    ViEAndroidAPI.VoE_Create(this);

    // Initialize
    if (0 != ViEAndroidAPI.VoE_Init(enableTrace)) {
      DemoLog("VoE init failed");
    }

    // Create channel
    voiceChannel = ViEAndroidAPI.VoE_CreateChannel();
    if (0 != voiceChannel) {
      DemoLog("VoE create channel failed");
    }

    // Suggest to use the voice call audio stream for hardware volume controls
    setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
  }

  private int StartVoiceEngine() {
    // Set local receiver
    if (0 != ViEAndroidAPI.VoE_SetLocalReceiver(voiceChannel,
                                                receivePortVoice)) {
      DemoLog("VoE set local receiver failed");
    }

    if (0 != ViEAndroidAPI.VoE_StartListen(voiceChannel)) {
      DemoLog("VoE start listen failed");
    }

    // Route audio
    RouteAudio(enableSpeaker);

    // set volume to default value
    if (0 != ViEAndroidAPI.VoE_SetSpeakerVolume(volumeLevel)) {
      DemoLog("VoE set speaker volume failed");
    }

    // Start playout
    if (0 != ViEAndroidAPI.VoE_StartPlayout(voiceChannel)) {
      DemoLog("VoE start playout failed");
    }

    if (0 != ViEAndroidAPI.VoE_SetSendDestination(voiceChannel,
                                                  destinationPortVoice,
                                                  remoteIp)) {
      DemoLog("VoE set send  destination failed");
    }

    // 0 = iPCM-wb, 5 = PCMU
    if (0 != ViEAndroidAPI.VoE_SetSendCodec(voiceChannel, voiceCodecType)) {
      DemoLog("VoE set send codec failed");
    }

    if (0 != ViEAndroidAPI.VoE_SetECStatus(enableAECM, 5, 0, 28)){
      DemoLog("VoE set EC Status failed");
    }

    if (0 != ViEAndroidAPI.VoE_StartSend(voiceChannel)) {
      DemoLog("VoE start send failed");
    }

    voERunning = true;
    return 0;
  }

  private void RouteAudio(boolean enableSpeaker) {
    int sdkVersion = Integer.parseInt(android.os.Build.VERSION.SDK);
    if (sdkVersion >= 5) {
      AudioManager am =
          (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
      am.setSpeakerphoneOn(enableSpeaker);
    }
    else {
      if (0 != ViEAndroidAPI.VoE_SetLoudspeakerStatus(enableSpeaker)) {
        DemoLog("VoE set louspeaker status failed");
      }
    }
  }

  public void onClick(View arg0) {
    switch (arg0.getId()) {
      case R.id.btSwitchCamera:
        if (usingFrontCamera ){
          btSwitchCamera.setText(R.string.frontCamera);
        }
        else {
          btSwitchCamera.setText(R.string.backCamera);
        }
        usingFrontCamera = !usingFrontCamera;

        if (viERunning) {
          currentCameraOrientation =
              ViEAndroidAPI.GetCameraOrientation(usingFrontCamera?1:0);
          ViEAndroidAPI.StopCamera(cameraId);
          mLlLocalSurface.removeView(svLocal);

          ViEAndroidAPI.StartCamera(channel,usingFrontCamera?1:0);
          mLlLocalSurface.addView(svLocal);
          int neededRotation = GetCameraOrientation(currentCameraOrientation);
          ViEAndroidAPI.SetRotation(cameraId, neededRotation);
        }
        break;
      case R.id.btStartStopCall:
        ReadSettings();
        if (viERunning || voERunning) {
          StopAll();
          wakeLock.release();//release the wake lock
          btStartStopCall.setText(R.string.startCall);
        }
        else if (enableVoice || enableVideo){
          StartCall();
          wakeLock.acquire();//screen stay on during the call
          btStartStopCall.setText(R.string.stopCall);
        }
        break;
      case R.id.btExit:
        StopAll();
        finish();
        break;
      case R.id.cbNack:
        enableNack  = cbEnableNack.isChecked();
        if (viERunning) {
          ViEAndroidAPI.EnableNACK(channel, enableNack);
        }
        break;
      case R.id.cbSpeaker:
        enableSpeaker = cbEnableSpeaker.isChecked();
        if (voERunning){
          RouteAudio(enableSpeaker);
        }
        break;
      case R.id.cbAutoGainControl:
        enableAGC=cbEnableAGC.isChecked();
        if(voERunning) {
          //Enable AGC default mode.
          ViEAndroidAPI.VoE_SetAGCStatus(enableAGC,1);
        }
        break;
      case R.id.cbNoiseSuppression:
        enableNS=cbEnableNS.isChecked();
        if(voERunning) {
          //Enable NS default mode.
          ViEAndroidAPI.VoE_SetNSStatus(enableNS, 1);
        }
        break;
      case R.id.cbAECM:
        enableAECM = cbEnableAECM.isChecked();
        if (voERunning) {
          //EC_AECM=5
          //AECM_DEFAULT=0
          ViEAndroidAPI.VoE_SetECStatus(enableAECM, 5, 0, 28);
        }
        break;
    }
  }

  private void ReadSettings() {
    codecType = spCodecType.getSelectedItemPosition();
    voiceCodecType = spVoiceCodecType.getSelectedItemPosition();

    String sCodecSize = spCodecSize.getSelectedItem().toString();
    String[] aCodecSize = sCodecSize.split("x");
    codecSizeWidth = Integer.parseInt(aCodecSize[0]);
    codecSizeHeight = Integer.parseInt(aCodecSize[1]);

    loopbackMode  = cbLoopback.isChecked();
    enableVoice  = cbVoice.isChecked();
    enableVideoSend = cbVideoSend.isChecked();
    enableVideoReceive = cbVideoReceive.isChecked();
    enableVideo = enableVideoSend || enableVideoReceive;

    destinationPortVideo =
        Integer.parseInt(etVTxPort.getText().toString());
    receivePortVideo =
        Integer.parseInt(etVRxPort.getText().toString());
    destinationPortVoice =
        Integer.parseInt(etATxPort.getText().toString());
    receivePortVoice =
        Integer.parseInt(etARxPort.getText().toString());

    enableNack  = cbEnableNack.isChecked();
    enableSpeaker  = cbEnableSpeaker.isChecked();
    enableAGC  = cbEnableAGC.isChecked();
    enableAECM  = cbEnableAECM.isChecked();
    enableNS  = cbEnableNS.isChecked();

    if (loopbackMode)
      remoteIp = "127.0.0.1";
    else
      remoteIp = etRemoteIp.getText().toString();
  }

  public void onItemSelected(AdapterView<?> adapterView, View view,
                             int position, long id) {
    if ((adapterView==spCodecType || adapterView==spCodecSize) &&
        viERunning) {
      ReadSettings();
      //change the codectype
      if (enableVideoReceive) {
        if (0 !=ViEAndroidAPI.SetReceiveCodec(channel, codecType,
                                              INIT_BITRATE, codecSizeWidth,
                                              codecSizeHeight,
                                              RECEIVE_CODEC_FRAMERATE))
          DemoLog("ViE set receive codec failed");
      }
      if (enableVideoSend) {
        if (0!=ViEAndroidAPI.SetSendCodec(channel, codecType, INIT_BITRATE,
                                          codecSizeWidth,
                                          codecSizeHeight,
                                          SEND_CODEC_FRAMERATE))
          DemoLog("ViE set send codec failed");
      }
    }
    else if ((adapterView==spVoiceCodecType) && voERunning) {
      //change voice engine codec
      ReadSettings();
      if (0 != ViEAndroidAPI.VoE_SetSendCodec(voiceChannel, voiceCodecType)) {
        DemoLog("VoE set send codec failed");
      }
    }
  }

  public void onNothingSelected(AdapterView<?> arg0) {
    DemoLog("No setting selected");
  }

  public int UpdateStats(int in_frameRateI, int in_bitRateI, int in_packetLoss,
                         int in_frameRateO, int in_bitRateO) {
    frameRateI = in_frameRateI;
    bitRateI = in_bitRateI;
    packetLoss = in_packetLoss;
    frameRateO = in_frameRateO;
    bitRateO = in_bitRateO;
    runOnUiThread(new Runnable() {
        public void run() {
          tvFrameRateI.setText("Incoming FrameRate - " +
                               Integer.toString(frameRateI));
          tvBitRateI.setText("Incoming BitRate - " +
                             Integer.toString(bitRateI));
          tvPacketLoss.setText("Incoming Packet Loss - " +
                               Integer.toString(packetLoss));
          tvFrameRateO.setText("Send FrameRate - " +
                               Integer.toString(frameRateO));
          tvBitRateO.setText("Send BitRate - " +
                             Integer.toString(bitRateO));
        }
      });
    return 0;
  }
}
