app/src/main/java/org/mcopenplatform/muoapi/session/Session.java
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
 }