package MyPJSIPNew;


//import org.pjsip.pjsua2.*;
//import net.gotev.sipservice.*;

import net.gotev.sipservice.BroadcastEventReceiver;
import net.gotev.sipservice.Logger;
import net.gotev.sipservice.SipAccountData;
import net.gotev.sipservice.SipServiceCommand;

import org.pjsip.pjsua2.pjsip_inv_state;
import org.pjsip.pjsua2.pjsip_status_code;



import anywheresoftware.b4a.AbsObjectWrapper;
import anywheresoftware.b4a.BA;
import anywheresoftware.b4a.BA.ActivityObject;
import anywheresoftware.b4a.BA.Author;
import anywheresoftware.b4a.BA.DependsOn;
import anywheresoftware.b4a.BA.Events;
import anywheresoftware.b4a.BA.ShortName;
import anywheresoftware.b4a.BA.Permissions;
import anywheresoftware.b4a.BA.Version;

import android.R;
import android.app.Application;
import android.os.RemoteException;

import android.util.SparseArray;
import android.view.SurfaceView;
import android.view.ViewGroup;
import android.content.Context;











@ShortName("MyPJSIP")
@Author("Semendey")
@Permissions(values = { "android.permission.INTERNET", "android.permission.RECORD_AUDIO","android.permission.CAMERA", "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"})



@Version(1.0f)
@DependsOn(values = { "PJSIP" })

@Events(values={"onVadStatus,onVAD, OnIncomingCall, RegisterFAILED, RegisterINPROGRESS, RegisterSUCCESS, RegisterUNREGISTERED, OnRegisterYes, OnRegister, UnRegister, FailedRegister, StateConnected, StateConnecting, StateCallFinished,StateCallFinishing  "})
//@ActivityObject

//public class MyPJSIP  extends AbsObjectWrapper<net.gotev.sipservice.SipServiceCommand> {
public class MyPJSIP extends net.gotev.sipservice.SipServiceCommand  {


	private BA ba;
	private String event;
	Context ctx = null;
    private SipAccountData mAccount;
    private String mAccountId;
	
    private BroadcastEventReceiver mReceiver;
    
	public void initialize(BA ba, String event, Context ctx) {
		this.ba = ba;
		this.event = event;
		this.ctx = ctx;	
		Logger.setLogLevel(Logger.LogLevel.DEBUG);
		mReceiver = new BroadcastEventReceiver();
		mReceiver.register(ctx);
		BA.Log(mReceiver.getResultData());
/*		
		Application app = ba.activity != null ? ba.activity.getApplication() : null;
		if (ba.sharedProcessBA != null) {
			app = ba.activity.getApplication();
		}		
		if (app == null) {
			BA.Log("Невозможно инициализировать телефон из-за отсутствия объекта Activity");
		}	
*/
		
       
        
     
	}
	
	
	
	
    //Авторизоваться
	public String login(String server,String port,String account,String pwd) {

        mAccount = new SipAccountData();
        mAccount.setHost(server);
        mAccount.setRealm(server); //realm ：sip:1004@192.168.2.243 in 192.168.2.243
        mAccount.setPort(Integer.parseInt(port));
        mAccount.setUsername(account);
        mAccount.setPassword(pwd);
        mAccountId = SipServiceCommand.setAccount(ctx, mAccount);
        BA.Log("login: " + mAccountId);
        
        SipServiceCommand.start(ctx);
        return mAccountId;
    } 
	
	
	
	public Context GetContext() {
		return ctx;
	}
	
    public void audioCall(String callNumber) {
        if(callNumber.isEmpty()) {
        	 BA.Log("Please enter the number！");
            return;
        }
        try {
        	SipServiceCommand.makeCall(ctx, mAccountId, callNumber);
        } catch (Exception e) {
        	BA.Log("audioCall - Account error");
        }
    }
	
	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   // public BroadcastEventReceiver mReceiver = new BroadcastEventReceiver() {
    
    class BroadcastEventReceiver extends net.gotev.sipservice.BroadcastEventReceiver {	
//    public BroadcastEventReceiver mReceiver = new BroadcastEventReceiver() {	
        @Override
        public void onRegistration(String accountID, pjsip_status_code registrationStateCode) {
            //super.onRegistration(accountID, registrationStateCode);
            BA.Log("onRegistration:");
            if (registrationStateCode == pjsip_status_code.PJSIP_SC_OK) {
            	raiseEvent("onRegistrationOK");
            	BA.Log("Регистрация удалась：" + accountID);
            } else {
            	raiseEvent("onRegistrationNOT");	
            	BA.Log("Регистрация НЕ удалась：" + accountID + "code：" + registrationStateCode); 
            }  
        }

/*    
        public void onIncomingCall(String accountID, int callID, String displayName, String remoteUri, boolean isVideo) {
            //super.onIncomingCall(accountID, callID, displayName, remoteUri, isVideo);
        	raiseEvent("onIncomingCall");
        	BA.Log("onIncomingCall: accountID="+accountID+", callID="+callID+", displayName="+displayName+", remoteUri="+remoteUri+", isVideo="+isVideo);
            //CallActivity.startActivityIn(getReceiverContext(), accountID, callID, displayName, remoteUri, isVideo);
        }

       
        public void onCallState(String accountID, int callID, pjsip_inv_state callStateCode, pjsip_status_code callStatusCode, long connectTimestamp, boolean isLocalHold, boolean isLocalMute, boolean isLocalVideoMute) {
            //super.onCallState(accountID, callID, callStateCode, callStatusCode, connectTimestamp, isLocalHold, isLocalMute, isLocalVideoMute);
            if (pjsip_inv_state.PJSIP_INV_STATE_CALLING.equals(callStateCode)) {
                //Выдохнуть
            	BA.Log("Выдохнуть - звонок");
            } else if (pjsip_inv_state.PJSIP_INV_STATE_INCOMING.equals(callStateCode)) {
                //Входящие звонки
            	BA.Log("Входящие звонки");
            } else if (pjsip_inv_state.PJSIP_INV_STATE_EARLY.equals(callStateCode)) {
                //Кольцо
            	BA.Log("Кольцо");     } 
            else if (pjsip_inv_state.PJSIP_INV_STATE_CONNECTING.equals(callStateCode)) {
                //Подключение
            	BA.Log("Подключение");
            } else if (pjsip_inv_state.PJSIP_INV_STATE_CONFIRMED.equals(callStateCode)) {
                //Соединение успешно установлено
            	BA.Log("Соединение успешно установлено");
            } else if (pjsip_inv_state.PJSIP_INV_STATE_DISCONNECTED.equals(callStateCode)) {
                //Отключить
            	BA.Log("Отключить");
            } else if (pjsip_inv_state.PJSIP_INV_STATE_NULL.equals(callStateCode)) {
                //Неизвестная ошибка
                BA.Log("Неизвестная ошибка");
            }
        }
        
 
        @Override
        public void onStackStatus(boolean started) {
        	 BA.Log("onStackStatus");
             //super.onStackStatus(started);
        }

 */       
/*
        @Override
        public void onReceivedCodecPriorities(ArrayList<CodecPriority> codecPriorities) {
            //super.onReceivedCodecPriorities(codecPriorities);
            BA.Log("onReceivedCodecPriorities");
        }
*/
  
 /*       
        @Override
        public void onCodecPrioritiesSetStatus(boolean success) {
            //super.onCodecPrioritiesSetStatus(success);
            BA.Log("onCodecPrioritiesSetStatus");
        }

       
        public void onMissedCall(String displayName, String uri) {
            //super.onMissedCall(displayName, uri);
            BA.Log("onMissedCall");
        }

        
        protected void onVideoSize(int width, int height) {
            //super.onVideoSize(width, height);
            BA.Log("onVideoSize");
        }
*/
/*
        @Override
        protected void onCallStats(int duration, String audioCodec, pjsip_status_code callStatusCode, RtpStreamStats rx, RtpStreamStats tx) {
            //super.onCallStats(duration, audioCodec, callStatusCode, rx, tx);
            BA.Log("onCallStats");
        }
*/       
        
        
        
     
        public void onOutgoingCall(String accountID, int callID, String number, boolean isVideo, boolean isVideoConference) {
            //super.onOutgoingCall(accountID, callID, number, isVideo, isVideoConference);
            BA.Log("onOutgoingCall");
        }
        
       
    	private void raiseEvent(String baseEvent) {
    		String eventName = event.concat("_").concat(baseEvent).toLowerCase(ba.cul);
    		if (ba.subExists(eventName)) {
    			BA.Log(eventName);
    			ba.raiseEvent(this, eventName); 
    			//ba.raiseEvent(getObject(), eventName); 
    			
    		}
    	}
/////////////////////////    	
  };

    



}



