c732d49e |
/*
* |
74ca6d11 |
* Copyright (C) 2020, University of the Basque Country (UPV/EHU) |
c732d49e |
*
* Contact for licensing options: <licensing-mcpttclient(at)mcopenplatform(dot)com>
*
* This file is part of MCOP MCPTT Client
*
* This is free software: you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* This is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.mcopenplatform.muoapi.session;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.util.Log; |
175b478c |
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.FrameLayout; |
c732d49e |
import org.doubango.ngn.BuildConfig;
import org.doubango.ngn.events.NgnInviteEventArgs; |
175b478c |
import org.doubango.ngn.media.NgnMediaType; |
c732d49e |
import org.doubango.ngn.sip.NgnAVSession;
import org.mcopenplatform.muoapi.ConstantsMCOP;
import org.mcopenplatform.muoapi.datatype.error.Constants; |
175b478c |
import org.mcopenplatform.muoapi.utils.Utils; |
c732d49e |
import java.util.ArrayList;
import java.util.List;
|
175b478c |
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.AudioWithFloorCtrlChatGroup;
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.AudioWithFloorCtrlPrearrangedGroup;
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.AudioWithFloorCtrlPrearrangedGroupEmergency;
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.AudioWithFloorCtrlPrearrangedGroupImminentPeril;
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.AudioWithFloorCtrlPrivate;
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.AudioWithFloorCtrlPrivateEmergency;
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.AudioWithoutFloorCtrlPrivate;
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.NONE;
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.VideoAudioWithFloorCtrlPrearrangedGroup;
import static org.mcopenplatform.muoapi.datatype.error.Constants.CallEvent.CallTypeValidEnum.VideoAudioWithFloorCtrlPrivate;
|
c732d49e |
public class Session implements NgnAVSession.OnEventMCPTTListener {
private final static String TAG = Utils.getTAG(Session.class.getCanonicalName()); |
175b478c |
private boolean isPrepare=false; |
c732d49e |
private NgnAVSession session;
private OnSessionListener onSessionListener;
private Context context;
public Session(NgnAVSession session,Context context) { |
175b478c |
this.isPrepare=false; |
c732d49e |
this.context=context;
this.session = session;
if(session!=null){
session.setOnEventMCPTTListener(this);
}
}
protected boolean hangUpCall(){
//TODO
return session.hangUpCall();
}
protected boolean acceptCall(){
//TODO
return session.acceptCallMCPTT(context);
}
public boolean floorControlOperation( |
74ca6d11 |
org.mcopenplatform.muoapi.ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismOperationTypeEnum operationType, |
c732d49e |
String userID){
switch (operationType) { |
74ca6d11 |
case ControlMechanismNone: |
c732d49e |
break;
//TODO: Token Request control logic missing |
74ca6d11 |
case ControlMechanismFloorRequest: |
c732d49e |
session.requestMCPTTToken();
break; |
74ca6d11 |
case ControlMechanismFloorRelease: |
c732d49e |
session.releaseMCPTTToken();
break; |
74ca6d11 |
case ControlMechanismQueuePositionInfoRequest:
//TODO: Not implemented yet
break; |
175b478c |
|
c732d49e |
//TODO: Define the rest of floor control actions for MCVideo |
74ca6d11 |
case ControlMechanismTransmissionRequest: |
c732d49e |
break; |
74ca6d11 |
case ControlMechanismTransmissionEndRequest: |
c732d49e |
break; |
74ca6d11 |
case ControlMechanismReceptionRequest: |
c732d49e |
break; |
74ca6d11 |
case ControlMechanismReceptionEndRequest: |
c732d49e |
break; |
74ca6d11 |
|
c732d49e |
}
return false;
}
|
175b478c |
private Constants.CallEvent.CallTypeValidEnum eventSIPToMCOPType(NgnMediaType mediaType){
Constants.CallEvent.CallTypeValidEnum result=NONE;
if(mediaType!=null){
switch (mediaType) {
case SessionMCPTT:
break;
case SessionGroup:
break;
case SessionAudioMCPTT:
result=AudioWithoutFloorCtrlPrivate;
break;
case SessionAudioMCPTTWithFloorControl:
result=AudioWithFloorCtrlPrivate;
break;
case SessionAudioGroupMCPTT:
break;
case SessionAudioGroupMCPTTWithFloorControl:
result=AudioWithFloorCtrlPrearrangedGroup;
break;
case SessionEmergencyAudioMCPTT:
break;
case SessionEmergencyAudioMCPTTWithFloorControl:
result=AudioWithFloorCtrlPrivateEmergency;
break;
case SessionEmergencyAudioGroupMCPTT:
break;
case SessionEmergencyAudioGroupMCPTTWithFloorControl:
result=AudioWithFloorCtrlPrearrangedGroupEmergency;
break;
case SessionAlertAudioMCPTT:
break;
case SessionAlertAudioMCPTTWithFloorControl:
break;
case SessionAlertAudioGroupMCPTT:
break;
case SessionAlertAudioGroupMCPTTWithFloorControl:
break;
case SessionImminentperilAudioMCPTT:
break;
case SessionImminentperilAudioMCPTTWithFloorControl:
break;
case SessionImminentperilAudioGroupMCPTT:
break;
case SessionImminentperilAudioGroupMCPTTWithFloorControl:
result=AudioWithFloorCtrlPrearrangedGroupImminentPeril;
break;
case SessionAudioChatMCPTT:
break;
case SessionAudioChatGroupMCPTT:
break;
case SessionAudioChatGroupMCPTTWithFloorControl:
result=AudioWithFloorCtrlChatGroup;
break;
case All:
break;
default:
if(BuildConfig.DEBUG)Log.e(TAG,"Event Type isn´t logic :"+mediaType.name()+" "+mediaType.getValue());
break;
}
}
return result;
}
private void prepareSession(){
if(!isPrepare){
if(BuildConfig.DEBUG)Log.d(TAG,"prepareSession()");
}
isPrepare=true;
}
|
c732d49e |
//START CALL EVENT
protected void newInviteEvent(NgnInviteEventArgs args){ |
175b478c |
String userID=null;
String groupID=null;
Constants.CallEvent.CallTypeValidEnum typeCall=null; |
c732d49e |
switch (args.getEventType()) {
case INCOMING:
if(BuildConfig.DEBUG) Log.d(TAG,"Session INCOMING: "+args.getCode()); |
175b478c |
userID=session.getRemotePartyUri();
groupID=session.getPTTMcpttGroupIdentity();
typeCall =eventSIPToMCOPType(session.getMediaType()); |
74ca6d11 |
sendCallEvent(ConstantsMCOP.CallEventExtras.CallEventTypeEnum.CallEventIncoming,typeCall,userID,groupID); |
175b478c |
prepareSession(); |
c732d49e |
break;
case INPROGRESS:
if(BuildConfig.DEBUG) Log.d(TAG,"Session INPROGRESS: "+args.getCode()); |
74ca6d11 |
sendCallEvent(ConstantsMCOP.CallEventExtras.CallEventTypeEnum.CallEventCalling); |
175b478c |
//prepareSession(); |
c732d49e |
break;
case RINGING:
if(BuildConfig.DEBUG) Log.d(TAG,"Session RINGING: "+args.getCode()); |
74ca6d11 |
sendCallEvent(ConstantsMCOP.CallEventExtras.CallEventTypeEnum.CallEventRinging); |
c732d49e |
break;
case EARLY_MEDIA:
if(BuildConfig.DEBUG) Log.d(TAG,"Session EARLY_MEDIA: "+args.getCode());
break;
case CONNECTED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session CONNECTED: "+args.getCode()); |
175b478c |
userID=session.getRemotePartyUri();
groupID=session.getPTTMcpttGroupIdentity();
typeCall =eventSIPToMCOPType(session.getMediaType()); |
74ca6d11 |
sendCallEvent(ConstantsMCOP.CallEventExtras.CallEventTypeEnum.CallEventConnected,typeCall,userID,groupID); |
175b478c |
prepareSession(); |
c732d49e |
break;
case TERMWAIT:
if(BuildConfig.DEBUG) Log.d(TAG,"Session TERMWAIT: "+args.getCode());
break;
case TERMINATED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session TERMINATED: "+args.getCode()); |
74ca6d11 |
sendCallEvent(ConstantsMCOP.CallEventExtras.CallEventTypeEnum.CallEventReleased); |
c732d49e |
break;
case LOCAL_HOLD_OK:
if(BuildConfig.DEBUG) Log.d(TAG,"Session LOCAL_HOLD_OK: "+args.getCode());
break;
case LOCAL_HOLD_NOK:
if(BuildConfig.DEBUG) Log.d(TAG,"Session LOCAL_HOLD_NOK: "+args.getCode());
break;
case LOCAL_RESUME_OK:
if(BuildConfig.DEBUG) Log.d(TAG,"Session LOCAL_RESUME_OK: "+args.getCode());
break;
case LOCAL_RESUME_NOK:
if(BuildConfig.DEBUG) Log.d(TAG,"Session LOCAL_RESUME_NOK: "+args.getCode());
break;
case REMOTE_HOLD:
if(BuildConfig.DEBUG) Log.d(TAG,"Session REMOTE_HOLD: "+args.getCode());
break;
case REMOTE_RESUME:
if(BuildConfig.DEBUG) Log.d(TAG,"Session REMOTE_RESUME: "+args.getCode());
break;
case MEDIA_UPDATING:
if(BuildConfig.DEBUG) Log.d(TAG,"Session MEDIA_UPDATING: "+args.getCode());
break;
case MEDIA_UPDATED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session MEDIA_UPDATED: "+args.getCode());
break;
case SIP_RESPONSE:
if(BuildConfig.DEBUG) Log.d(TAG,"Session SIP_RESPONSE: "+args.getCode());
break;
case ERROR_INVITE:
if(BuildConfig.DEBUG) Log.d(TAG,"Session ERROR_INVITE: "+args.getCode());
switch (args.getCode()){
case 480:
sendErrorCallEvent(Constants.ConstantsErrorMCOP.CallEventError.CDVIII);
case 486:
sendErrorCallEvent(Constants.ConstantsErrorMCOP.CallEventError.CDVX);
break;
default:
sendErrorCallEvent(Constants.ConstantsErrorMCOP.CallEventError.CDIX);
break;
}
//TODO: Must control when a TERMINATED is received
case REMOTE_DEVICE_INFO_CHANGED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session REMOTE_DEVICE_INFO_CHANGED: "+args.getCode());
break;
case LOCAL_TRANSFER_TRYING:
if(BuildConfig.DEBUG) Log.d(TAG,"Session LOCAL_TRANSFER_TRYING: "+args.getCode());
break;
case LOCAL_TRANSFER_ACCEPTED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session LOCAL_TRANSFER_ACCEPTED: "+args.getCode());
break;
case LOCAL_TRANSFER_COMPLETED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session LOCAL_TRANSFER_COMPLETED: "+args.getCode());
break;
case LOCAL_TRANSFER_FAILED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session LOCAL_TRANSFER_FAILED: "+args.getCode());
break;
case LOCAL_TRANSFER_NOTIFY:
if(BuildConfig.DEBUG) Log.d(TAG,"Session LOCAL_TRANSFER_NOTIFY: "+args.getCode());
break;
case REMOTE_TRANSFER_REQUESTED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session REMOTE_TRANSFER_REQUESTED: "+args.getCode());
break;
case REMOTE_TRANSFER_NOTIFY:
if(BuildConfig.DEBUG) Log.d(TAG,"Session REMOTE_TRANSFER_NOTIFY: "+args.getCode());
break;
case REMOTE_TRANSFER_INPROGESS:
if(BuildConfig.DEBUG) Log.d(TAG,"Session REMOTE_TRANSFER_INPROGESS: "+args.getCode());
break;
case REMOTE_TRANSFER_FAILED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session REMOTE_TRANSFER_FAILED: "+args.getCode());
break;
case REMOTE_TRANSFER_COMPLETED:
if(BuildConfig.DEBUG) Log.d(TAG,"Session REMOTE_TRANSFER_COMPLETED: "+args.getCode());
break;
}
}
@Override
public void onEventMCPTT(NgnAVSession.PTTState mPTTState) {
String stringPhrase=null;
short shortCode=-1;
switch (mPTTState) {
case CALLING:
if(BuildConfig.DEBUG) Log.d(TAG,"onEventMCPTT: CALLING");
break;
case TALKING:
if(BuildConfig.DEBUG) Log.d(TAG,"onEventMCPTT: TALKING");
String accountTalking=session.getTakingUserMCPTT();
//TODO: ALLOW_REQUEST needed. Now it´s "true" |
74ca6d11 |
sendFloorControlEvent(ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum.taken,accountTalking,accountTalking,true); |
c732d49e |
break;
case RELEASING:
if(BuildConfig.DEBUG) Log.d(TAG,"onEventMCPTT: RELEASING");
break;
case DENIED:
if(BuildConfig.DEBUG) Log.d(TAG,"onEventMCPTT: DENIED");
stringPhrase=session.getPhraseDenied();
shortCode=session.getCodeDenied(); |
74ca6d11 |
sendFloorControlEvent(ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum.denied,shortCode,stringPhrase); |
c732d49e |
break;
case IDLE:
if(BuildConfig.DEBUG) Log.d(TAG,"onEventMCPTT: IDLE"); |
74ca6d11 |
sendFloorControlEvent(ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum.idle); |
c732d49e |
break;
case WAITING:
if(BuildConfig.DEBUG) Log.d(TAG,"onEventMCPTT: WAITING");
break;
case REQUESTING:
if(BuildConfig.DEBUG) Log.d(TAG,"onEventMCPTT: REQUESTING");
break;
case REVOKED:
stringPhrase=session.getPhraseRevoke();
shortCode=session.getCodeRevoke(); |
74ca6d11 |
sendFloorControlEvent(ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum.granted,shortCode,stringPhrase); |
c732d49e |
break;
case GRANTED:
if(BuildConfig.DEBUG) Log.d(TAG,"onEventMCPTT: GRANTED"); |
74ca6d11 |
sendFloorControlEvent(ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum.granted,(int)session.getGrantedTimeSecMCPTT()); |
c732d49e |
break;
}
}
//START FLOOR CONTROL EVENT |
74ca6d11 |
private void sendFloorControlEvent(@NonNull ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum eventType){ |
c732d49e |
sendFloorControlEvent(eventType,null,null,null,null,null,null);
}
|
74ca6d11 |
private void sendFloorControlEvent(@NonNull ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum eventType, |
c732d49e |
Short numCause,
String stringCause){
sendFloorControlEvent(eventType,null,null,null,null,numCause,stringCause);
}
|
74ca6d11 |
private void sendFloorControlEvent(@NonNull ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum eventType, |
c732d49e |
String displayName,
String userID,
Boolean allowRequest){
//TODO: Missing displayName of each participant from the GMS
sendFloorControlEvent(eventType,null,displayName,userID,allowRequest,null,null);
}
|
74ca6d11 |
private void sendFloorControlEvent(@NonNull ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum eventType, |
c732d49e |
Integer durationToken){
sendFloorControlEvent(eventType,durationToken,null,null,null,null,null);
}
|
74ca6d11 |
private void sendFloorControlEvent(@NonNull ConstantsMCOP.ControlMechanismEventExtras.ControlMechanismEventTypeEnum eventType, |
c732d49e |
Integer durationToken,
String displayName,
String userID,
Boolean allowRequest,
Short numCause,
String stringCause){
if(eventType==null)return; |
74ca6d11 |
Intent event=new Intent(ConstantsMCOP.ActionsCallBack.controlMechanismEvent.toString()); |
c732d49e |
//eventType |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.CONTROL_MECHANISM_EVENT, eventType.toString()); |
c732d49e |
//DURATION_TOKEN
if(durationToken!=null) |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.TOKEN_DURATION, durationToken); |
c732d49e |
//TODO: For the time being, "display name" is equal to "userID"
//Display Name
if(displayName!=null) |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.DISPLAY_NAME, displayName); |
c732d49e |
//UserID
if(userID!=null) |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.USER_ID, userID); |
c732d49e |
//Allow Request
if(allowRequest!=null) |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.REQUEST_ALLOWED, allowRequest); |
c732d49e |
//Code
if(numCause!=null && numCause>0) |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.CAUSE_CODE, (int)numCause); |
c732d49e |
//Cause
if(stringCause!=null) |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.CAUSE_STRING, stringCause); |
c732d49e |
try{
String sessionID=String.valueOf(session.getId());
event.putExtra(ConstantsMCOP.CallEventExtras.SESSION_ID,sessionID);
}catch (Exception ex){
}
sendEvent(event);
}
private void sendErrorFloorControlEvent(Constants.ConstantsErrorMCOP.FloorControlEventError floorControlEventError,String sessionID){ |
74ca6d11 |
Intent event=new Intent(ConstantsMCOP.ActionsCallBack.controlMechanismEvent.toString()); |
c732d49e |
if(org.mcopenplatform.muoapi.BuildConfig.DEBUG)Log.e(TAG, "Floor Control Error "+ floorControlEventError.getCode()+": "+ floorControlEventError.getString());
//Error Code |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.ERROR_CODE,floorControlEventError.getCode()); |
c732d49e |
//Error String |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.ERROR_STRING,floorControlEventError.getString()); |
c732d49e |
//SessionID |
74ca6d11 |
event.putExtra(ConstantsMCOP.ControlMechanismEventExtras.SESSION_ID,sessionID); |
c732d49e |
sendEvent(event);
}
//END FLOOR CONTROL EVENT
//END CALL EVENT |
74ca6d11 |
private void sendCallEvent(ConstantsMCOP.CallEventExtras.CallEventTypeEnum eventType){ |
175b478c |
sendCallEvent(eventType,(List<ConstantsMCOP.CallEventExtras.CallTypeEnum>)null,null,null); |
c732d49e |
}
|
74ca6d11 |
private void sendCallEvent(ConstantsMCOP.CallEventExtras.CallEventTypeEnum eventType,List<ConstantsMCOP.CallEventExtras.CallTypeEnum> callTypeEnums){ |
175b478c |
sendCallEvent(eventType,callTypeEnums,null,null); |
c732d49e |
} |
175b478c |
|
74ca6d11 |
private void sendCallEvent(ConstantsMCOP.CallEventExtras.CallEventTypeEnum eventType,Constants.CallEvent.CallTypeValidEnum callTypeEnum,String userID,String groupID){ |
175b478c |
sendCallEvent(eventType,
(callTypeEnum!=null && callTypeEnum!=NONE)?ConstantsMCOP.CallEventExtras.CallTypeEnum.getListCallType(callTypeEnum.getValue()):null,
userID,groupID); |
c732d49e |
}
|
74ca6d11 |
private void sendCallEvent(ConstantsMCOP.CallEventExtras.CallEventTypeEnum eventType, List<ConstantsMCOP.CallEventExtras.CallTypeEnum> callTypeEnums, String userID,String groupID){ |
c732d49e |
if(eventType==null)return;
Intent event=new Intent(ConstantsMCOP.ActionsCallBack.callEvent.toString());
//eventType
event.putExtra(ConstantsMCOP.CallEventExtras.EVENT_TYPE, eventType.getValue());
//CallTypeEnum
if(callTypeEnums!=null && !callTypeEnums.isEmpty())
event.putExtra(ConstantsMCOP.CallEventExtras.CALL_TYPE, ConstantsMCOP.CallEventExtras.CallTypeEnum.getValue(callTypeEnums));
//UserID String
if(userID!=null && !userID.trim().isEmpty()){ |
74ca6d11 |
event.putExtra(ConstantsMCOP.CallEventExtras.CALLER_ID,userID); |
c732d49e |
} |
175b478c |
//GroupID String
if(groupID!=null && !groupID.trim().isEmpty()){ |
74ca6d11 |
event.putExtra(ConstantsMCOP.CallEventExtras.GROUP_ID,groupID); |
175b478c |
} |
c732d49e |
try{
String sessionID=String.valueOf(session.getId());
event.putExtra(ConstantsMCOP.CallEventExtras.SESSION_ID,sessionID);
}catch (Exception ex){
}
sendEvent(event);
}
private void sendErrorCallEvent(Constants.ConstantsErrorMCOP.CallEventError callEventError){
Intent event=new Intent(ConstantsMCOP.ActionsCallBack.callEvent.toString());
if(org.mcopenplatform.muoapi.BuildConfig.DEBUG)Log.e(TAG, "CallEvent Error "+ callEventError.getCode()+": "+ callEventError.getString());
//eventType Error |
74ca6d11 |
event.putExtra(ConstantsMCOP.CallEventExtras.EVENT_TYPE, ConstantsMCOP.CallEventExtras.CallEventTypeEnum.CallEventError.getValue()); |
c732d49e |
//Error Code
event.putExtra(ConstantsMCOP.CallEventExtras.ERROR_CODE,callEventError.getCode());
//Error String
event.putExtra(ConstantsMCOP.CallEventExtras.ERROR_STRING,callEventError.getString());
//SessionID
try{
String sessionID=String.valueOf(session.getId());
event.putExtra(ConstantsMCOP.CallEventExtras.SESSION_ID,sessionID);
}catch (Exception ex){
}
sendEvent(event);
}
private void sendEvent(Intent event){
if(event==null )return;
List<Intent> events=new ArrayList<>();
events.add(event);
if(onSessionListener!=null)onSessionListener.onEvents(events);
}
public interface OnSessionListener{
void onEvents(List<Intent> events);
}
public void setOnSessionListener(OnSessionListener onSessionListener){
this.onSessionListener=onSessionListener;
} |
175b478c |
|
c732d49e |
} |