/**
* Copyright (C) 2016 Hyphenate Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.fanxin.huangfangyi.ui;
import java.util.UUID;
import android.media.AudioManager;
import android.media.RingtoneManager;
import android.media.SoundPool;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.hyphenate.chat.EMCallStateChangeListener;
import com.hyphenate.chat.EMClient;
import com.fanxin.huangfangyi.DemoHelper;
import com.fanxin.huangfangyi.R;
import com.hyphenate.util.EMLog;
/**
* 语音通话页面
*
*/
public class VoiceCallActivity extends CallActivity implements OnClickListener {
private LinearLayout comingBtnContainer;
private Button hangupBtn;
private Button refuseBtn;
private Button answerBtn;
private ImageView muteImage;
private ImageView handsFreeImage;
private boolean isMuteState;
private boolean isHandsfreeState;
private TextView callStateTextView;
private boolean endCallTriggerByMe = false;
private TextView nickTextView;
private TextView durationTextView;
private Chronometer chronometer;
String st1;
private LinearLayout voiceContronlLayout;
private TextView netwrokStatusVeiw;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null){
finish();
return;
}
setContentView(R.layout.em_activity_voice_call);
DemoHelper.getInstance().isVoiceCalling = true;
callType = 0;
comingBtnContainer = (LinearLayout) findViewById(R.id.ll_coming_call);
refuseBtn = (Button) findViewById(R.id.btn_refuse_call);
answerBtn = (Button) findViewById(R.id.btn_answer_call);
hangupBtn = (Button) findViewById(R.id.btn_hangup_call);
muteImage = (ImageView) findViewById(R.id.iv_mute);
handsFreeImage = (ImageView) findViewById(R.id.iv_handsfree);
callStateTextView = (TextView) findViewById(R.id.tv_call_state);
nickTextView = (TextView) findViewById(R.id.tv_nick);
durationTextView = (TextView) findViewById(R.id.tv_calling_duration);
chronometer = (Chronometer) findViewById(R.id.chronometer);
voiceContronlLayout = (LinearLayout) findViewById(R.id.ll_voice_control);
netwrokStatusVeiw = (TextView) findViewById(R.id.tv_network_status);
refuseBtn.setOnClickListener(this);
answerBtn.setOnClickListener(this);
hangupBtn.setOnClickListener(this);
muteImage.setOnClickListener(this);
handsFreeImage.setOnClickListener(this);
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
addCallStateListener();
msgid = UUID.randomUUID().toString();
username = getIntent().getStringExtra("username");
isInComingCall = getIntent().getBooleanExtra("isComingCall", false);
nickTextView.setText(username);
if (!isInComingCall) {// outgoing call
soundPool = new SoundPool(1, AudioManager.STREAM_RING, 0);
outgoing = soundPool.load(this, R.raw.em_outgoing, 1);
comingBtnContainer.setVisibility(View.INVISIBLE);
hangupBtn.setVisibility(View.VISIBLE);
st1 = getResources().getString(R.string.Are_connected_to_each_other);
callStateTextView.setText(st1);
handler.sendEmptyMessage(MSG_CALL_MAKE_VOICE);
} else { // incoming call
voiceContronlLayout.setVisibility(View.INVISIBLE);
Uri ringUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
audioManager.setMode(AudioManager.MODE_RINGTONE);
audioManager.setSpeakerphoneOn(true);
ringtone = RingtoneManager.getRingtone(this, ringUri);
ringtone.play();
}
}
/**
* set call state listener
*/
void addCallStateListener() {
callStateListener = new EMCallStateChangeListener() {
@Override
public void onCallStateChanged(CallState callState, final CallError error) {
// Message msg = handler.obtainMessage();
EMLog.d("EMCallManager", "onCallStateChanged:" + callState);
switch (callState) {
case CONNECTING:
runOnUiThread(new Runnable() {
@Override
public void run() {
callStateTextView.setText(st1);
}
});
break;
case CONNECTED:
runOnUiThread(new Runnable() {
@Override
public void run() {
String st3 = getResources().getString(R.string.have_connected_with);
callStateTextView.setText(st3);
}
});
break;
case ACCEPTED:
handler.removeCallbacks(timeoutHangup);
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if (soundPool != null)
soundPool.stop(streamID);
} catch (Exception e) {
}
if(!isHandsfreeState)
closeSpeakerOn();
//show relay or direct call, for testing purpose
((TextView)findViewById(R.id.tv_is_p2p)).setText(EMClient.getInstance().callManager().isDirectCall()
? R.string.direct_call : R.string.relay_call);
chronometer.setVisibility(View.VISIBLE);
chronometer.setBase(SystemClock.elapsedRealtime());
// duration start
chronometer.start();
String str4 = getResources().getString(R.string.In_the_call);
callStateTextView.setText(str4);
callingState = CallingState.NORMAL;
}
});
break;
case NETWORK_UNSTABLE:
runOnUiThread(new Runnable() {
public void run() {
netwrokStatusVeiw.setVisibility(View.VISIBLE);
if(error == CallError.ERROR_NO_DATA){
netwrokStatusVeiw.setText(R.string.no_call_data);
}else{
netwrokStatusVeiw.setText(R.string.network_unstable);
}
}
});
break;
case NETWORK_NORMAL:
runOnUiThread(new Runnable() {
public void run() {
netwrokStatusVeiw.setVisibility(View.INVISIBLE);
}
});
break;
case VOICE_PAUSE:
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "VOICE_PAUSE", 0).show();
}
});
break;
case VOICE_RESUME:
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "VOICE_RESUME", 0).show();
}
});
break;
case DISCONNNECTED:
handler.removeCallbacks(timeoutHangup);
final CallError fError = error;
runOnUiThread(new Runnable() {
private void postDelayedCloseMsg() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("AAA", "CALL DISCONNETED");
saveCallRecord();
Animation animation = new AlphaAnimation(1.0f, 0.0f);
animation.setDuration(800);
findViewById(R.id.root_layout).startAnimation(animation);
finish();
}
});
}
}, 200);
}
@Override
public void run() {
chronometer.stop();
callDruationText = chronometer.getText().toString();
String st2 = getResources().getString(R.string.The_other_party_refused_to_accept);
String st3 = getResources().getString(R.string.Connection_failure);
String st4 = getResources().getString(R.string.The_other_party_is_not_online);
String st5 = getResources().getString(R.string.The_other_is_on_the_phone_please);
String st6 = getResources().getString(R.string.The_other_party_did_not_answer_new);
String st7 = getResources().getString(R.string.hang_up);
String st8 = getResources().getString(R.string.The_other_is_hang_up);
String st9 = getResources().getString(R.string.did_not_answer);
String st10 = getResources().getString(R.string.Has_been_cancelled);
String st11 = getResources().getString(R.string.hang_up);
if (fError == CallError.REJECTED) {
callingState = CallingState.BEREFUESD;
callStateTextView.setText(st2);
} else if (fError == CallError.ERROR_TRANSPORT) {
callStateTextView.setText(st3);
} else if (fError == CallError.ERROR_INAVAILABLE) {
callingState = CallingState.OFFLINE;
callStateTextView.setText(st4);
} else if (fError == CallError.ERROR_BUSY) {
callingState = CallingState.BUSY;
callStateTextView.setText(st5);
} else if (fError == CallError.ERROR_NORESPONSE) {
callingState = CallingState.NORESPONSE;
callStateTextView.setText(st6);
} else if (fError == CallError.ERROR_LOCAL_VERSION_SMALLER || fError == CallError.ERROR_PEER_VERSION_SMALLER){
callingState = CallingState.VERSION_NOT_SAME;
callStateTextView.setText(R.string.call_version_inconsistent);
} else {
if (isAnswered) {
callingState = CallingState.NORMAL;
if (endCallTriggerByMe) {
// callStateTextView.setText(st7);
} else {
callStateTextView.setText(st8);
}
} else {
if (isInComingCall) {
callingState = CallingState.UNANSWERED;
callStateTextView.setText(st9);
} else {
if (callingState != CallingState.NORMAL) {
callingState = CallingState.CANCED;
callStateTextView.setText(st10);
}else {
callStateTextView.setText(st11);
}
}
}
}
postDelayedCloseMsg();
}
});
break;
default:
break;
}
}
};
EMClient.getInstance().callManager().addCallStateChangeListener(callStateListener);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_refuse_call:
refuseBtn.setEnabled(false);
handler.sendEmptyMessage(MSG_CALL_REJECT);
break;
case R.id.btn_answer_call:
answerBtn.setEnabled(false);
closeSpeakerOn();
callStateTextView.setText("正在接听...");
comingBtnContainer.setVisibility(View.INVISIBLE);
hangupBtn.setVisibility(View.VISIBLE);
voiceContronlLayout.setVisibility(View.VISIBLE);
handler.sendEmptyMessage(MSG_CALL_ANSWER);
break;
case R.id.btn_hangup_call:
hangupBtn.setEnabled(false);
chronometer.stop();
endCallTriggerByMe = true;
callStateTextView.setText(getResources().getString(R.string.hanging_up));
handler.sendEmptyMessage(MSG_CALL_END);
break;
case R.id.iv_mute:
if (isMuteState) {
muteImage.setImageResource(R.drawable.em_icon_mute_normal);
EMClient.getInstance().callManager().resumeVoiceTransfer();
isMuteState = false;
} else {
muteImage.setImageResource(R.drawable.em_icon_mute_on);
EMClient.getInstance().callManager().pauseVoiceTransfer();
isMuteState = true;
}
break;
case R.id.iv_handsfree:
if (isHandsfreeState) {
handsFreeImage.setImageResource(R.drawable.em_icon_speaker_normal);
closeSpeakerOn();
isHandsfreeState = false;
} else {
handsFreeImage.setImageResource(R.drawable.em_icon_speaker_on);
openSpeakerOn();
isHandsfreeState = true;
}
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
DemoHelper.getInstance().isVoiceCalling = false;
}
@Override
public void onBackPressed() {
callDruationText = chronometer.getText().toString();
}
}