Browse Source

2022.10.18

거동 수상자 관련 코드 업로드

2443 거동수상자 관련 코드를 6410 타입에 맞게 변경 및 추가 수정.
DESKTOP-UNEGUH3\MadeinLab_SW_02 2 years ago
parent
commit
4d33f532dc

+ 1 - 1
WallPadCall/src/main/AndroidManifest.xml

@@ -1,7 +1,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="kr.co.icontrols.wallpadcall"
     android:versionCode="17"
-    android:versionName="2022.09.22.01">
+    android:versionName="2022.10.18.01">
 
     <!--android:sharedUserId="android.uid.system"-->
     <!--<uses-sdk-->

+ 7 - 5
WallPadCall/src/main/java/kr/co/icontrols/callengine/engine/CallController.java

@@ -737,11 +737,13 @@ public class CallController extends CallManager implements SIPEventListener {
                 else {
                     LOG("[CallScenarioManager] ===== MULTI CALL =====");
 
-                    if(strRemoteIP.contains(RemoteIDInfo.strIP))
-                    {
-                        if (mSIPInterface != null) mSIPInterface.acceptMoIPCall(false);
-                        return;
-                    }
+
+                    if(strRemoteIP != null)
+                        if(strRemoteIP.contains(RemoteIDInfo.strIP))
+                        {
+                            if (mSIPInterface != null) mSIPInterface.acceptMoIPCall(false);
+                            return;
+                        }
 
                     if (eCallType == CALLTYPE.FRONT) {
                         if (mCallInfo.getFRONT() != CALLSTATUS.IDLE) {

+ 47 - 3
WallPadCall/src/main/java/kr/co/icontrols/callengine/engine/MyTCPServer.java

@@ -1,10 +1,13 @@
 package kr.co.icontrols.callengine.engine;
 
 import android.content.Context;
+import android.content.Intent;
 import android.os.Handler;
 import android.os.Message;
 import android.util.Log;
 
+import com.artncore.commons.define;
+
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.DataInputStream;
@@ -16,6 +19,8 @@ import java.net.ServerSocket;
 import java.net.Socket;
 
 import kr.co.icontrols.wallpadcall.MainActivity;
+import kr.co.icontrols.wallpadcall.declare.Declare;
+import kr.co.icontrols.wallpadcall.declare.Global;
 
 import static kr.co.icontrols.callengine.sip.SIPStun.bWallPadCallLive;
 
@@ -152,10 +157,28 @@ public class MyTCPServer {
                             //data = str.toString();
                             Log.d(TAG, "read: " + data);
                             if (data.equals("HEY")) {
-                                Log.d(TAG,"[mySocket] HEY ACK()");
+                                Log.d(TAG,"[mySocket] HEY ACK() " + Global.getRecordingStatus());
                                 mOutputBuffer.write("ACK", 0, "ACK".length());
                                 mOutputBuffer.flush();
 
+                                //yjyoon. 녹화중 로비/세대/경비로부터의 새로운 콜이면 Front 상태를 IDLE로 변경.
+                                //if (Global.getRecordingStatus()) {
+                                    //mCallInfo.setCallStatus(CallManager.CALLTYPE.FRONT, CallManager.CALLSTATUS.IDLE);
+
+                                    // 녹화가 중지되지 않았다면 다시 한번 중지 br 전송.
+                                    //Log.d(TAG,"[CallScenarioManager] CALLEVENTTYPE.RECEIVE_CALL - bRecordingStatus[" + Global.getRecordingStatus() + "]");
+                                    if (Global.getDetect_stranger()) {
+                                        Log.d(TAG,"[mySocket] bRecordingStatus[" + Global.getRecordingStatus() + "]");
+                                        MainActivity.mCallController.mCallInfo.setCallStatus(CallManager.CALLTYPE.FRONT, CallManager.CALLSTATUS.IDLE);
+
+                                        Global.setRecordingStatus_sub(true);
+                                        Intent iIntent = new Intent();
+                                        iIntent.setAction(Declare.BR.BR_REQUEST_RECORD_STOP);
+                                        iIntent.putExtra(define.NOTIBR_KIND, 2);
+                                        mContext.sendBroadcast(iIntent);
+                                    }
+                                //}
+
                                 boolean iMultiCall = false;
 
                                 try {
@@ -177,8 +200,29 @@ public class MyTCPServer {
                                 }
 
                                 if(!iMultiCall) {
-                                    Message msg = mHandler.obtainMessage(100, clientIP);
-                                    mHandler.sendMessage(msg);
+                                    if(Global.getCallLiveStatus() == Declare.CALLAPPSTATE.CALLAPPSTATE_RECV)
+                                    {
+                                        Message msg = mHandler.obtainMessage(103, clientIP);
+                                        mHandler.sendMessage(msg);
+                                    }
+                                    else
+                                    {
+                                        //Global.setCallLiveStatus(Declare.CALLAPPSTATE.CALLAPPSTATE_RECV);
+                                        if(!Global.getbTCP_doubleConnect())
+                                        {
+                                            Global.setbTCP_doubleConnect(true);
+                                            Message msg = mHandler.obtainMessage(100, clientIP);
+                                            mHandler.sendMessage(msg);
+                                        }
+                                        else
+                                        {
+                                            Message msg = mHandler.obtainMessage(103, clientIP);
+                                            mHandler.sendMessage(msg);
+                                        }
+
+
+                                    }
+
                                 }
                                 else
                                 {

+ 4 - 1
WallPadCall/src/main/java/kr/co/icontrols/callengine/sip/SIPStun.java

@@ -51,6 +51,7 @@ import java.util.StringTokenizer;
 import java.util.TimerTask;
 import java.util.regex.Pattern;
 
+import kr.co.icontrols.wallpadcall.declare.Global;
 import milsip.stack.sip.BSSVideo;
 import milsip.stack.sip.CMCore;
 import milsip.stack.sip.SIPCONTACTHeader;
@@ -5312,7 +5313,9 @@ public class SIPStun extends Service {
         try {
 
             //LOG_WARN("[runCallMainActivity] ########## START ########## " + bWallPadCallLive);
-            if (!bWallPadCallLive) {
+
+            //if (!bWallPadCallLive) {
+            if (Global.getCallLiveStatus() == Declare.CALLAPPSTATE.CALLAPPSTATE_NONE) {
                 // 통화어플을 실행시킨다.
                 LOG_WARN("[runCallMainActivity] ########## START ##########");
                 sendLCDBacklightStatus(true);

+ 317 - 39
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/MainActivity.java

@@ -7,6 +7,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
+import android.database.DatabaseErrorHandler;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
@@ -231,6 +232,12 @@ public class MainActivity extends WpadActivity {
 
     private static final int REQUEST_EXTERNAL_STORAGE = 100;
 
+    // 20220707 yjyoon
+    // 현관카메라가 FRONTCAMERATYPE.SMART_DW 인 경우 녹화 시 처음 올라오는 깨지는 영상 노출을 피하고자 MediaRecorder.start 를 4초 뒤에 실행.(MainActivity > mFrontCamOpenCheckHandler > msg.what == 3)
+    // 이 때, MediaRecorder.start 하기 전 먼저 활성화된 종료 또는 홈을 누르면 MediaRecorder 에서 에러(E/MediaRecorder: stop called in an invalid state: 8)가 발생. WallPadCall 앱이 비정상적으로 종료.
+    // MediaRecorder.start 상태가 아니면 MediaRecorder.stop 을 진행하지 않도록 MediaRecorder.start 상태변수 추가.
+    private boolean bMediaRecorder = false;
+
     // Top
     private WpadImageView TopBackground;
     private WpadTextView TopTitle;
@@ -344,10 +351,16 @@ public class MainActivity extends WpadActivity {
     public boolean bBlockHomeBTN = false;
     public boolean bLCDReverse = false;
 
-    public static boolean bRecordingStatus = false; // 거동수상자 녹화중 판별 플래그
+    //public static boolean bRecordingStatus = false; // 거동수상자 녹화중 판별 플래그
 
     public static boolean bFrontCallUse, bLobbyCallUse, bGuardCallUse, bResiCallUse, bPSTNCallUse, bCallHistoryUse, bVisitorPicUse;
 
+
+    // 앱 실행시 전달받은 이벤트 상태 여부. false 이면 새로운 이벤트가 있음을 의미.
+    public boolean bIsFirstCallEvent = true;
+    // 앱 실행 후 첫번째 이벤트 생성 여부. false 이면 아직 첫번째 이벤트를 생성하지 않음을 의미.
+    public boolean bIsGeneratedFirstCallEvent = false;
+
     /* =================================================================================================
      * [ Activity Life Cycle ] region
      ================================================================================================ */
@@ -361,10 +374,13 @@ public class MainActivity extends WpadActivity {
 
             registerWallPadCallLiveBRReceiver();
 
+
             Global.setGlobalContext(this);
             Global.getConfigValues();   // 디바이스 설정
             nSysVolume = Global.getConfigSystemVolume();
 
+            Global.setCallLiveStatus(Declare.CALLAPPSTATE.CALLAPPSTATE_NORMAL);
+
             if (ConfigValues.DEVICE_MODELTYPE == MODEL_TYPE.IHN_1020B_I) bFFMPEGEnable = true;
             else bFFMPEGEnable = false;
             Log.i(TAG, "[onCreate] bFFMPEGEnable [" + bFFMPEGEnable + "]");
@@ -626,7 +642,7 @@ public class MainActivity extends WpadActivity {
                     else if (bVisitorPicUse) mTempCurrentScreenId = API_Menu.SubMenuCall.Visitor;
                 }
                 setChangeScreen(mTempCurrentScreenId, false); // 시작화면: 경비실
-                sendHandlerMsgDelayed(HANDLERMSG.CHECK_RECEIVINGCALL, 0, 0, 500);
+                //sendHandlerMsgDelayed(HANDLERMSG.CHECK_RECEIVINGCALL, 0, 0, 500);
             }
             else {
                 mTempCurrentScreenId = mMenu.getStartId();
@@ -649,14 +665,29 @@ public class MainActivity extends WpadActivity {
             }
 
             // 7. Draw
-            LOG_INFO("[Create] - Step7 : setContentView");
+            LOG_INFO("[Create] - Step7 : setContentView " + strCallEvent);
             setContentView(AllLayout);
 
             getCallTimeoutEnable();
             addBrActionFilter("CERES_CALL");
             addBrActionFilter("CERES_CALL_MULTI");
+            addBrActionFilter(Declare.BR.BR_REQUEST_RECORD_STOP);
+            addBrActionFilter(Declare.BR.BR_REQUEST_NEW_CALL);
+
+            if(!strCallEvent.contains("NONE")) {
 
-            sendHandlerMsgDelayed(HANDLERMSG.CHECK_RECEIVINGCALL, 0, 0, 500);
+
+                if(strCallEvent.contains("DETECT_STRANGER"))
+                {
+                    Global.setDetect_stranger(true);
+                }
+                else
+                {
+                    Global.setCallLiveStatus(Declare.CALLAPPSTATE.CALLAPPSTATE_RECV);
+                }
+
+                sendHandlerMsgDelayed(HANDLERMSG.CHECK_RECEIVINGCALL, 0, 0, 500);
+            }
 
             // 8. Window Resize
             LOG_INFO("[Create] - Step8 : Window Resize");
@@ -676,6 +707,9 @@ public class MainActivity extends WpadActivity {
         sendBlockSIPCallBR();
         mSound.StopAll();
         mSound.Release();
+        Global.setCallLiveStatus(Declare.CALLAPPSTATE.CALLAPPSTATE_NONE);
+        Global.setDetect_stranger(false);
+        Global.setbTCP_doubleConnect(false);
 
 //        try {
 //            mAVcEncoder.close();
@@ -908,7 +942,11 @@ public class MainActivity extends WpadActivity {
                 }
                 mTempCurrentScreenId = nStartScreenId;
                 setChangeScreen(mTempCurrentScreenId, false); // 시작화면: 경비실
+
+                bIsFirstCallEvent = true;
+                bIsGeneratedFirstCallEvent = false;
                 sendHandlerMsgDelayed(HANDLERMSG.CHECK_RECEIVINGCALL, 0, 0, 500);
+
             }
             else
             {
@@ -955,6 +993,40 @@ public class MainActivity extends WpadActivity {
 
 
         }
+        else if (intent.getAction().equals(Declare.BR.BR_REQUEST_RECORD_STOP)) {
+            // WallPadMain > MainActivity - StrangeRecordBroadcastReceiver - Common.BR_RECORD_STOP
+            // 거동수상자 녹화 중지.
+
+            showStrangerNoticeText(false, false);
+
+            mediaStopRecord(true);
+
+            mFrontCamOpenCheckHandler.removeMessages(2);
+            mFrontCamOpenCheckHandler.removeMessages(3);
+
+            int nKind = intent.getIntExtra(define.NOTIBR_KIND, 0);
+            if (nKind == 2) {
+                // 로비/세대/경비로부터 콜인 경우.
+                strCallOwner = null;
+                strCallEvent = intent.getStringExtra(CALLTRIGGER.CALLEVENTTYPE);
+                strCallType = intent.getStringExtra(CALLTRIGGER.CALLTYPE);
+                strRemoteInfo = intent.getStringExtra(CALLTRIGGER.REMOTEINFO);
+                //strCallPopupInfo = intent.getStringExtra("CALLPOPUP"); // 각 스크린 ctrlAlphaBlending > ctrlPopupGUI_Resi or ctrlPopupGUI 에서 사용.
+            }
+        } else if (intent.getAction().equals(Declare.BR.BR_REQUEST_NEW_CALL)) {
+            // SIPStun > receiveNewCall > runCallMainActivity
+            // 앱이 동작 중일 때 새로운 콜의 정보를 저장.
+
+            // 월패드에서 경비아이콘을 선택하여 앱을 동작시킨 상태(IDLE)에서 로비로부터 호출이 왔을 때 월패드 화면에 로비 영상이 보이지 않는 문제
+            // 로비는 ctrlPopupGUI(false) 에서 화면이 보여지는데, 경비 화면은 ctrlPopupGUI(false)를 실행하지 않아 로비 영상이 보이지 않음.
+            // 이웃의 경우 화면 초기화시 ctrlPopupGUI_Resi(false) 을 실행하여 로비 영상이 보임.
+
+            strCallOwner = null;
+            strCallEvent = intent.getStringExtra(CALLTRIGGER.CALLEVENTTYPE);
+            strCallType = intent.getStringExtra(CALLTRIGGER.CALLTYPE);
+            strRemoteInfo = intent.getStringExtra(CALLTRIGGER.REMOTEINFO);
+            //strCallPopupInfo = intent.getStringExtra("CALLPOPUP"); // 각 스크린 ctrlAlphaBlending > ctrlPopupGUI_Resi or ctrlPopupGUI 에서 사용.
+        }
   
     }
     public String makeSIPID(String strIPAddress) {
@@ -1498,6 +1570,11 @@ public class MainActivity extends WpadActivity {
         try {
             switch (nScreenId) {
                 case API_Menu.SubMenuCall.Door:
+                    if (mRecordTimer == null) {
+                        // yjyoon.
+                        Log.v("yjyoon", "setChangeScreen > API_Menu.SubMenuCall.Door");
+                        checkRecordTimer();
+                    }
                     setTitleText(API_Menu.SubMenuCall.Name_Door);
                     ScreenTalkFront = new TalkFront(this, ScreenLayout, mWallPadAPI);
                     super.setCurrentScreen(ScreenTalkFront);
@@ -3406,7 +3483,7 @@ public class MainActivity extends WpadActivity {
 
     public boolean removeFrontVideoLayout() {
         try {
-//            LOG_INFO("[removeFrontVideoLayout] FrontVideoSurface = " + FrontVideoSurface + ", FrontVideoLayout = " + FrontVideoLayout);
+            LOG_INFO("[removeFrontVideoLayout] FrontVideoSurface = " + FrontVideoSurface + ", FrontVideoLayout = " + FrontVideoLayout);
             if (FrontVideoSurface != null) {
                 FrontVideoSurface.setVisibility(View.GONE);
                 FrontVideoSurface.getHolder().removeCallback(FrontVideoCallback);
@@ -3555,6 +3632,7 @@ public class MainActivity extends WpadActivity {
             try {
                 LOG_INFO("[FrontVideoCallback] surfaceChanged!!");
                 if (mFrontCamera != null) {
+                    LOG_INFO("[FrontVideoCallback] surfaceChanged!! 1");
                     mFrontCamera.startPreview();
                 }
                 if (Common.OPTION_TAB_ANMI_ENABLE) {
@@ -3802,18 +3880,30 @@ public class MainActivity extends WpadActivity {
 //                Log.d(TAG, "[mFrontCamOpenCheckHandler] result [" + result + "], CAMERA_BRIGHTNESS [" + TalkFront.CAMERA_BRIGHTNESS + "]");
 
                 if (mFrontCamera != null) {
-                    mFrontCamera.stopPreview();
+                    //if (ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMARTIOT) mFrontCamera.stopPreview();
+
                     mFrontCamera.unlock();
 
+                    bMediaRecorder = false;
 
                     mMediaRecorder = new MediaRecorder();
                     mMediaRecorder.setCamera(mFrontCamera);
 //                    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
-                    if (ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMARTIOT) mMediaRecorder.setVideoSize(1280, 720);
-                    else mMediaRecorder.setVideoSize(640, 480);
-                    mMediaRecorder.setVideoEncodingBitRate(3000000);
+
+                    if (ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMARTIOT)
+                    {
+                        mMediaRecorder.setVideoSize(1280, 720);
+                        mMediaRecorder.setVideoEncodingBitRate(3000000);
+                    }
+                    else
+                    {
+                        mMediaRecorder.setVideoSize(640, 480);
+                        mMediaRecorder.setVideoEncodingBitRate(1024 * 1024); // jglee - 2022.09.19 화질이 떨어져서 추가함(기존 영상메모 녹화 보고 추가함)
+                        mMediaRecorder.setVideoFrameRate(24);
+                    }
+
                     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
 //                    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
                     mMediaRecorder.setOutputFile(VIDEO_TEMP_PATH);
@@ -3849,7 +3939,30 @@ public class MainActivity extends WpadActivity {
                     try {
 //                        StartPopup(ID.POPUP.POPUP_NOTICE_VIDEORECORD);
                         showStrangerNoticeText(true, true);
-                        mMediaRecorder.start();
+
+                        int iPlayTime = 0;
+                        if(ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMART_DW)
+                        {
+                            iPlayTime = 4000;
+                        }
+
+                        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (mMediaRecorder != null) {
+                                    Log.d(TAG, "[mFrontCamOpenCheckHandler] m_mediaRecorder.start");
+                                    if(mFrontCamera != null) {
+                                        mMediaRecorder.start();
+                                        bMediaRecorder = true;
+                                    } else {
+                                        Log.v(TAG, "[mFrontCamOpenCheckHandler] mFrontCamera is null.");
+                                    }
+                                } else {
+                                    Log.v(TAG, "[mFrontCamOpenCheckHandler] mMediaRecorder is null.");
+                                }
+                            }
+                        }, iPlayTime);
+
                     } catch (IllegalStateException e) {
                         Log.e(TAG, "[IllegalStateException] mFrontCamOpenCheckHandler.start");
                         //e.printStackTrace();
@@ -3857,7 +3970,7 @@ public class MainActivity extends WpadActivity {
                         resetRecorderSetting();
                     } catch (Exception e) {
                         Log.e(TAG, "[Exception] mFrontCamOpenCheckHandler.start");
-                        //e.printStackTrace();
+                        e.printStackTrace();
                         LogUtil.errorLogInfo("", TAG, e);
                         resetRecorderSetting();
                     }
@@ -3938,6 +4051,11 @@ public class MainActivity extends WpadActivity {
                 Log.d(TAG, "[mWallPadApiCheckHandler.handleMessage] Handler finish!! mTempCurrentScreenId [" + mTempCurrentScreenId + "]");
                 if (ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMARTIOT || ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMARTKEY_EXTERNAL || ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMART_HS || ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMART_DW) {
                     smartKeyRfDoorAPI = mWallPadAPI.Get_SmartKeyRfDoorController();
+                    if (smartKeyRfDoorAPI != null) {
+                        Log.d(TAG, "[mWallPadApiCheckHandler] get smartKeyRfDoorAPI.");
+                    } else {
+                        Log.w(TAG, "[mWallPadApiCheckHandler] smartKeyRfDoorAPI is null !!");
+                    }
                 }
                 boolean result = setChangeScreen(mTempCurrentScreenId, false);
                 if (!result) {
@@ -4476,13 +4594,14 @@ public class MainActivity extends WpadActivity {
     private void checkRecordTimer() {
         try {
             Log.d(TAG, "[checkRecordTimer] RECORDING_TIME [" + RECORDING_TIME + "]");
-            if (ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMARTIOT || ConfigValues.eFrontCameraType == Global.FRONTCAMERATYPE.SMART_HS) {
+            if (ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMARTIOT || ConfigValues.eFrontCameraType == Global.FRONTCAMERATYPE.SMART_HS
+                            || ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMART_DW ) {
                 mCurRecordTime = 0;
                 if (RECORDING_TIME > 0) {
                     mRecordTimer = new CountDownTimer(RECORDING_TIME * 1000, 1000) {
                         @Override
                         public void onTick(long millisUntilFinished) {
-                            if (bRecordingStatus) {
+                            if (Global.getRecordingStatus()) {
                                 mCurRecordTime++;
                                 Log.d(TAG, "[checkRecordTimer] mCurRecordTime [" + mCurRecordTime + "]");
                             }
@@ -4492,7 +4611,7 @@ public class MainActivity extends WpadActivity {
                         public void onFinish() {
                             LOG("[checkRecordTimer] onFinish!! bRemoteCall [" + ConfigValues.bRemoteCall + "]");
                             if (ConfigValues.bRemoteCall) {
-                                bRecordingStatus = false;
+                                Global.setRecordingStatus(false);
                                 mediaStopRecord(true);
                                 mRemoteCallController.sendCloseRemoteCall();
                                 sendHandlerMsgDelayed(HANDLERMSG.FINISH_WALLPADCALL, 0, 0, 500);
@@ -4546,8 +4665,15 @@ public class MainActivity extends WpadActivity {
             RECORDING_TIME = DBMGR.GetSmartDoorCamRecordTime();
             DBMGR.closeDB();
 
+            //if (RECORDING_TIME < 30) RECORDING_TIME = 30;
+
 //            if (CAMERA_BRIGHTNESS < 1) CAMERA_BRIGHTNESS = 1;
-            if (RECORDING_TIME < 30) RECORDING_TIME = 30;
+            if(ConfigValues.eFrontCameraType != FRONTCAMERATYPE.SMARTIOT)
+            {
+                RECORDING_TIME += 5;
+                //if (RECORDING_TIME < 30) RECORDING_TIME = 30;
+            }
+
             Log.d(TAG, "[getSmartIOTCamConfig] RECORDING_TIME [" + RECORDING_TIME + "]");
         } catch (RuntimeException re) {
             LogUtil.errorLogInfo("", TAG, re);
@@ -4595,19 +4721,45 @@ public class MainActivity extends WpadActivity {
     public void mediaStartRecord() {
         try {
             Log.d(TAG, "[mediaStartRecord]");
+
+            if (!Global.getRecordingStatus()) {
+                Log.d("yjyoon", "[mediaStartRecord] bRecordingStatus == false");
+                Log.d(TAG, "[mediaStartRecord] bRecordingStatus == false");
+                return;
+            }
+
             if (mMediaRecorder != null) {
-                mMediaRecorder.stop();
+                if (bMediaRecorder) {
+                    Log.d(TAG, "[mediaStartRecord] mMediaRecorder.stop");
+                    mMediaRecorder.stop();
+                    bMediaRecorder = false;
+                } else {
+                    Log.d(TAG, "[mediaStartRecord] Skip mMediaRecorder.stop");
+                }
+
                 mMediaRecorder.reset();
                 mMediaRecorder.release();
                 mMediaRecorder = null;
+
             }
 
             mFrontCamOpenCheckHandler.sendEmptyMessage(2); // camera open check 이후 녹화 시작
+
+            // yjyoon.
+            // 거동수상자 녹화 -> 콜 수신. 녹화 중지 (Common.bWallPadRecoder = false)
+            // -> 통화완료 후 앱 종료 대기 중 거동수상자 감지. 녹화 시작. (이 때 Common.bWallPadRecoder 값이 변경되지 않음) -> 현관 버튼 클릭(동작하지 않음)
+            Log.v("yjyoon", "Call MainActivity ###Common.BR_MAIN_NOTI.ACCEPT_RECORDING");
+            Intent newIntent = new Intent(); // 녹화 종료 BR 전송
+            newIntent.setAction(ACNAME_MAIN_NOTI);
+            newIntent.putExtra("KIND", /**Common.BR_MAIN_NOTI.ACCEPT_RECORDING*/1023);
+            newIntent.putExtra("FROMCALL", true);
+            getContext().sendBroadcast(newIntent);
+
         } catch (RuntimeException re) {
             LogUtil.errorLogInfo("", TAG,re);
-            bRecordingStatus = false;
+            Global.setRecordingStatus(false);
         } catch (Throwable t) {
-            bRecordingStatus = false;
+            Global.setRecordingStatus(false);
             Log.e(TAG, "[Exception] mediaStartRecord()");
             //t.printStackTrace();
             LogUtil.errorLogInfo("", TAG, t);
@@ -4617,18 +4769,34 @@ public class MainActivity extends WpadActivity {
     public void mediaStopRecord(boolean bDel) {
         try {
             Log.d(TAG, "[mediaStopRecord] bDel [" + bDel + "]");
-            bRecordingStatus = false; // 녹화 종료
+            Global.setRecordingStatus(false); // 녹화 종료
             resetRecordTimer();
             if (mMediaRecorder != null) {
-                mMediaRecorder.stop();
+                if (bMediaRecorder) {
+                    Log.d(TAG, "[mediaStopRecord] mMediaRecorder.stop");
+                    mMediaRecorder.stop();
+                    bMediaRecorder = false;
+                } else {
+                    Log.d(TAG, "[mediaStopRecord] Skip mMediaRecorder.stop");
+                }
+
                 mMediaRecorder.reset();
                 mMediaRecorder.release();
                 mMediaRecorder = null;
             }
+
 //            finishPopUp(ID.POPUP.POPUP_NOTICE_VIDEORECORD);
             showStrangerNoticeText(false, false);
             showFrontVideo(false);
             if (bDel) ScreenLayout.removeView(FrontVideoSurface);
+
+            // yjyoon. WallPadMain으로 녹화 종료 이벤트 발생. Common.bWallPadRecoder 값 변경.
+            Log.d(TAG, "Send Br - Common.BR_MAIN_NOTI.STOP_RECORDING");
+            Intent newIntent = new Intent(); // 녹화 종료 BR 전송
+            newIntent.setAction(ACNAME_MAIN_NOTI);
+            newIntent.putExtra("KIND", /**Common.BR_MAIN_NOTI.STOP_RECORDING*/1027);
+            getContext().sendBroadcast(newIntent);
+
         } catch (RuntimeException re) {
             LogUtil.errorLogInfo("", TAG, re);
         } catch (Exception e) {
@@ -4643,7 +4811,7 @@ public class MainActivity extends WpadActivity {
     public void stopNSaveRecordingFile(boolean bDel, boolean bFinish) {
         try {
             LOG("[stopNSaveRecordingFile] bDel [" + bDel + "], bFinish [" + bFinish + "], bRemoteCall [" + ConfigValues.bRemoteCall + "]");
-            bRecordingStatus = false;
+            Global.setRecordingStatus(false);
             mediaStopRecord(bDel);
             saveRecordingFile(bFinish);
         } catch (RuntimeException re) {
@@ -4872,9 +5040,11 @@ public class MainActivity extends WpadActivity {
             if (mMediaRecorder != null) {
                 mMediaRecorder.release();
                 mMediaRecorder = null;
+                if (bMediaRecorder)
+                    bMediaRecorder = false;
             }
             resetRecordTimer();
-            bRecordingStatus = false;
+            Global.setRecordingStatus(false);
             sendHandlerMsgDelayed(HANDLERMSG.FINISH_WALLPADCALL, 0, 0, 1000);
         } catch (RuntimeException re) {
             LogUtil.errorLogInfo("", TAG, re);
@@ -5021,6 +5191,7 @@ public class MainActivity extends WpadActivity {
         public final static int REFRESH_HOMEICON = 997;
         public final static int FINISH_WALLPADCALL = 998;
         public final static int FINISH_ACTIVITY = 999;
+        public final static int RECEIVE_NEW_FRONT_CALL = 1000;
     }
 
     int nBrightness = 0;
@@ -5033,7 +5204,16 @@ public class MainActivity extends WpadActivity {
                     break;
 
                 case HANDLERMSG.CHECK_RECEIVINGCALL:
-                    generateCallEvent();
+                    LOG("[MainHandler] HANDLERMSG.CHECK_RECEIVINGCALL");
+                    if (bIsFirstCallEvent) {
+                        // 앱 시작시 전달받은 첫번재 이벤트를 생성.
+                        LOG("[MainHandler] HANDLERMSG.CHECK_RECEIVINGCALL(aftter 500ms): Create the first call event.");
+                        generateCallEvent();
+                    } else {
+                        LOG("[MainHandler] HANDLERMSG.CHECK_RECEIVINGCALL(aftter 500ms): Drop the first call event.");
+                    }
+                    bIsFirstCallEvent = false;
+                    bIsGeneratedFirstCallEvent = true;
                     break;
 
                 case HANDLERMSG.REMOVE_VIDEO_COVER:
@@ -5285,6 +5465,32 @@ public class MainActivity extends WpadActivity {
                     else Log.d(TAG, "[MainHandler] mIOInterface is null!! -> IGW300API.TEL_PATH.OFF");
                     break;
 
+                // yjyoon. MainExtraEventReceiver 에서 수신된 새로운 현관콜 처리
+                case HANDLERMSG.RECEIVE_NEW_FRONT_CALL:
+                    if (bIsGeneratedFirstCallEvent) {
+                        if (mCallController == null) return;
+
+                        Log.v(TAG, "HANDLERMSG.RECEIVE_NEW_FRONT_CALL");
+                        if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
+                            if (mCallController.mCallInfo.getIDLECnt() == mCallController.mCallInfo.IDLECNT_MAX) {
+                                sendHandlerMsg(HANDLERMSG.SET_DINGDONG_VOLUME, 0, 0); // 현관띵똥 볼륨 고정(시스템 볼륨 따라가지 않도록)
+                                sendHandlerMsg(HANDLERMSG.SETTALKPATH_DOORMUSIC, 0, 0);
+                                mCallPathCheckHandler.sendEmptyMessage(0); // 통화앱이 실행되어 있으나 통화상태가 아닌 경우에도 띵똥 소리 나야함 (메인앱에서 현관 호출 BR 수신이 불가하므로 통화앱에서 처리)
+                            }
+                        }
+
+                        if (mCallController.mCallInfo.getFRONT() == CALLSTATUS.IDLE) {
+                            setBlockFrontCall();
+                            mCallController.onFrontEvent(CALLEVENTTYPE.RECEIVE_CALL, CALLTYPE.FRONT);
+                        }
+                        else {
+                            Log.w(TAG, "[onReceive] Front call ignored!!! getFRONT() [" + mCallController.mCallInfo.getFRONT() + "]");
+                        }
+                    } else {
+                        sendHandlerMsgDelayed(HANDLERMSG.RECEIVE_NEW_FRONT_CALL, 0, 0, 100);
+                    }
+                    break;
+
                 default:
                     LOG("MainHandler : " + msg.what);
                     break;
@@ -5467,6 +5673,11 @@ public class MainActivity extends WpadActivity {
                     int nKind = intent.getIntExtra(define.NOTIBR_KIND, 0);
                     if (nKind == Declare.BR.NOTIFY_ALARM_FIRED) finishWallPadCall();
                 }
+
+                // yjyoon.
+                // 현관 버튼이 눌러졌을 때 driver, 여기서는 SmartKeyRfDoor_Controller 에서 BR을 발생. (Declare.BR.EVENT_DEVICE_CONTROL, 224)
+                // Call 앱이 동작 중일 때 해당 리시버에서 수신. 동작 중인 아니면 iMapServer에서 현관 버튼 이벤트 처리.
+                // (경비 등을 눌러 앱을 띄운 상태) 현관 콜 상태가 idle 이면 현관 콜 시나리오 진행. 아니면 해당 BR 무시.
                 else if (strAction.equals(Declare.BR.EVENT_DEVICE_CONTROL)) {
                     KeyEvent mKeyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
                     Log.i(this.TAG, "[onReceive] mKeyEvent : " + mKeyEvent + ", mKeyEvent.getKeyCode() : " + mKeyEvent.getKeyCode());
@@ -5477,23 +5688,39 @@ public class MainActivity extends WpadActivity {
 //                        }
 //                        else Log.w(this.TAG, "[onReceive] Front call ignored!!! [" + mCallController.mCallInfo.getFRONT() + "], bBlockFrontCall [" + bBlockFrontCall + "]");
                     }
+                    // yjyoon. 앱 실행 중 현관콜 BR 수신
                     else if (mKeyEvent.getKeyCode() == Declare.BTN.FRONT || mKeyEvent.getKeyCode() == Declare.BTN.FRONT_V40) {
-                        Log.i(this.TAG, "[onReceive] mKeyEvent.getKeyCode() : " + mKeyEvent.getKeyCode());
+                        Log.i(this.TAG, "[onReceive] mKeyEvent.getKeyCode() : " + mKeyEvent.getKeyCode() + " " + (mKeyEvent.getKeyCode() == Declare.BTN.FRONT ? "Declare.BTN.FRONT" : "Declare.BTN.FRONT_V40"));
+                        Log.v("yjyoon", "bBlockFrontCall[" + bBlockFrontCall + "] bIsGeneratedFirstCallEvent[" + bIsGeneratedFirstCallEvent + "] strCallEvent[" + strCallEvent + "]");
                         if (!bBlockFrontCall) {
-                            if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
-                                if (mCallController.mCallInfo.getIDLECnt() == mCallController.mCallInfo.IDLECNT_MAX) {
-                                    sendHandlerMsg(HANDLERMSG.SET_DINGDONG_VOLUME, 0, 0); // 현관띵똥 볼륨 고정(시스템 볼륨 따라가지 않도록)
-                                    sendHandlerMsg(HANDLERMSG.SETTALKPATH_DOORMUSIC, 0, 0);
-                                    mCallPathCheckHandler.sendEmptyMessage(0); // 통화앱이 실행되어 있으나 통화상태가 아닌 경우에도 띵똥 소리 나야함 (메인앱에서 현관 호출 BR 수신이 불가하므로 통화앱에서 처리)
+                            // yjyoon. 앱 구동하고 500ms 뒤 첫번째 이벤트 생성 전까지 bBlockFrontCall 값은 false. 이로 인해 첫번째 이벤트 생성 전 해당 br이 수신되는 경우가 발생.
+                            //if (bIsGeneratedFirstCallEvent || (!bIsGeneratedFirstCallEvent && strCallType != "DETECT_STRANGER")) {
+
+                            if (!bIsGeneratedFirstCallEvent && strCallEvent.equals("DETECT_STRANGER")) {
+                                // yjyoon. 첫번째 이벤트가 생성되기 전이고 그 타입이 거동수상자이면 거동수상자 이벤트를 폐기하고 현관콜 이벤트를 진행한다.
+                                bIsFirstCallEvent = false;
+                                
+                                // 첫번째 이벤트 생성전까지 bBlockFrontCall = false 인 상태에서 현관버튼을 연속으로 눌렀을 때 간혹 1개 이상의 현관콜 이벤트가 수신되는 현상이 있어 이전 메지시를 삭제함.
+                                MainHandler.removeMessages(HANDLERMSG.RECEIVE_NEW_FRONT_CALL);
+                                
+                                // 이벤트 메시지 생성
+                                sendHandlerMsgDelayed(HANDLERMSG.RECEIVE_NEW_FRONT_CALL, 0, 0, 100);
+                            } else {
+                                if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
+                                    if (mCallController.mCallInfo.getIDLECnt() == mCallController.mCallInfo.IDLECNT_MAX) {
+                                        sendHandlerMsg(HANDLERMSG.SET_DINGDONG_VOLUME, 0, 0); // 현관띵똥 볼륨 고정(시스템 볼륨 따라가지 않도록)
+                                        sendHandlerMsg(HANDLERMSG.SETTALKPATH_DOORMUSIC, 0, 0);
+                                        mCallPathCheckHandler.sendEmptyMessage(0); // 통화앱이 실행되어 있으나 통화상태가 아닌 경우에도 띵똥 소리 나야함 (메인앱에서 현관 호출 BR 수신이 불가하므로 통화앱에서 처리)
+                                    }
                                 }
-                            }
 
-                            if (mCallController.mCallInfo.getFRONT() == CALLSTATUS.IDLE) {
-                                setBlockFrontCall();
-                                mCallController.onFrontEvent(CALLEVENTTYPE.RECEIVE_CALL, CALLTYPE.FRONT);
-                            }
-                            else {
-                                Log.w(this.TAG, "[onReceive] Front call ignored!!! getFRONT() [" + mCallController.mCallInfo.getFRONT() + "]");
+                                if (mCallController.mCallInfo.getFRONT() == CALLSTATUS.IDLE) {
+                                    setBlockFrontCall();
+                                    mCallController.onFrontEvent(CALLEVENTTYPE.RECEIVE_CALL, CALLTYPE.FRONT);
+                                }
+                                else {
+                                    Log.w(this.TAG, "[onReceive] Front call ignored!!! getFRONT() [" + mCallController.mCallInfo.getFRONT() + "]");
+                                }
                             }
                         }
                         else {
@@ -5525,22 +5752,73 @@ public class MainActivity extends WpadActivity {
                 }
                 else if (strAction.equals(define.NOTIFY_ACNAME)) {
                     int kind = intent.getIntExtra(define.NOTIBR_KIND,0);
+
                     if (kind == define.NOTIFY_SMART_DCAM_DETECT) {
                         // [스마트현관카메라] 통화 앱 실행중 거동수상자 발생한 경우
                         Log.i(this.TAG, "[onReceive] DETECT_STRANGER!!");
                         if (ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMARTIOT || ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMART_HS || ConfigValues.eFrontCameraType == FRONTCAMERATYPE.SMART_DW) {
                             if (getStrangerRecordingManagerSetting()) {
                                 if (getStrangerRecording()) {
-                                    mCallController.onFrontEvent(CALLEVENTTYPE.DETECT_STRANGER, CALLTYPE.FRONT);
+
+                                    // '통화 시, 모든 거동 수상자 신호를 버림' 시나리오 적용.
+                                    // 통화 기능 시작 또는 종료 시 3초 bBlockFrontCall = true.
+                                    // 통화 기능 동작 중 mCallController.mCallInfo.getIDLECnt()는 mCallController.mCallInfo.IDLECNT_MAX 보다 작음.
+                                    // 단순 앱 실행 및 종료시 bBlockFrontCall = false.
+                                    if (bIsGeneratedFirstCallEvent && !bBlockFrontCall && mCallController.mCallInfo.getIDLECnt() == mCallController.mCallInfo.IDLECNT_MAX) {
+                                        // 단순 앱 실행한 경우에만 이벤트 생성.
+                                        Log.v(this.TAG, "[onReceive] DETECT_STRANGER > mCallController.onFrontEvent(CALLEVENTTYPE.DETECT_STRANGER, CALLTYPE.FRONT)");
+                                        mCallController.onFrontEvent(CALLEVENTTYPE.DETECT_STRANGER, CALLTYPE.FRONT);
+                                    } else {
+                                        Log.i(this.TAG, "[onReceive] ignored DETECT_STRANGER BR");
+                                    }
+
+                                    /*
+                                    if (bIsGeneratedFirstCallEvent && !bBlockFrontCall) {
+                                        // yjyoon. 첫번째 이벤트가 생성되고 bBlockFrontCall = false 이면, 거동수상자 이벤트 생성
+                                        // 동작없이 앱만 실행 및 종료시 bBlockFrontCall = false, 통화 기능 동작 및 종료시 bBlockFrontCall = true 로 설정.
+                                        Log.v("yjyoon", "###### 3");
+                                        mCallController.onFrontEvent(CALLEVENTTYPE.DETECT_STRANGER, CALLTYPE.FRONT);
+                                    } else {
+                                        Log.v("yjyoon", "###### 4");
+                                        // yjyoon. 첫번째 이벤트 생성 전 또는 종료모드인 경우 수신된 거동수상자 감지 br은 무시.
+                                        Log.i(this.TAG, "[onReceive] ignored DETECT_STRANGER BR.");
+                                    }
+                                    */
+
                                 }
                             }
                         }
-                    }
-                    else if (kind == define.NOTIFY_FINISH_FRONT_DINGDONG) {
+                    } else if (kind == define.NOTIFY_FINISH_FRONT_DINGDONG) {
                         // 메인 App으로 부터 띵똥 종료 BR 수신 받을 경우 현관 호출음 재생
                         sendHandlerMsgDelayed(HANDLERMSG.PLAY_FRONT_BELL, 0, 0, 200);
                         sendHandlerMsgDelayed(HANDLERMSG.SET_TALK_BTN_ENABLE, 0, 0, 200);
                     }
+                    else if (kind == 9999) {
+                        // yjyoon. 거동수상자 녹화 중 새로운 콜 이벤트 수신.
+
+                        Log.v(this.TAG, "Received New call during Recording(9999). bRecodingStatus[" + Global.getRecordingStatus() + "]");
+
+                        if (!Global.getRecordingStatus()) {
+                            Log.v(this.TAG, "ignore new call!! bRecodingStatus[" + Global.getRecordingStatus() + "]");
+                            return;
+                        }
+
+                        // yjyoon. 앱 생성 후 500ms 뒤에 생성되는 콜이벤트 메시지와 녹화 관련 mFrontCamOpenCheckHandler 메시지 삭제.
+                        //MainHandler.removeMessages(HANDLERMSG.CHECK_RECEIVINGCALL);
+                        mFrontCamOpenCheckHandler.removeMessages(2);
+                        mFrontCamOpenCheckHandler.removeMessages(3);
+
+                        strCallOwner = intent.getStringExtra(CALLTRIGGER.CALLOWNER);
+                        strCallEvent = intent.getStringExtra(CALLTRIGGER.CALLEVENTTYPE);
+                        strCallType = intent.getStringExtra(CALLTRIGGER.CALLTYPE);
+                        strRemoteInfo = intent.getStringExtra(CALLTRIGGER.REMOTEINFO);
+                        //strCallPopupInfo = intent.getStringExtra("CALLPOPUP");
+
+                        // yjyoon. FrontStatus 변경 RECORDING -> IDLE
+                        MainActivity.mCallController.mCallInfo.setCallStatus(CALLTYPE.FRONT, CALLSTATUS.IDLE);
+
+                        generateCallEvent();
+                    }
                 }
                 else if (strAction.equals(Declare.BR.BR_SHOW_REMOTEVIEW_TRUE)) {
                     mCallController.onShowRemoteVideo(true);

+ 11 - 0
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/declare/Declare.java

@@ -31,6 +31,10 @@ public class Declare {
         public final static String BR_SHOW_REMOTEVIEW_TRUE = "BR_SHOW_REMOTEVIEW_TRUE";
         public final static String BR_SHOW_REMOTEVIEW_FALSE = "BR_SHOW_REMOTEVIEW_FALSE";
 
+        // yjyoon
+        public static final String BR_REQUEST_RECORD_STOP       = "kr.co.icontrols.wallpad.BR_RECORDSTOP";
+        public static final String BR_REQUEST_NEW_CALL          = "kr.co.icontrols.wallpad.BR_NEWCALL";
+
         /**
          * Jeff, 2019.12.25
          * WallPadMain에서 WallPadCall의 Live 상태를 파악하기 위한 BR
@@ -250,4 +254,11 @@ public class Declare {
     }
 
     public static final boolean ENABLED_DOOR_PHONE_POWER_CONTROLL_BY_CALL_APP = true; //true;
+
+
+    public static class CALLAPPSTATE {
+        public static final int CALLAPPSTATE_NONE = 0;
+        public static final int CALLAPPSTATE_RECV = 1;
+        public static final int CALLAPPSTATE_NORMAL = 2;
+    }
 }

+ 57 - 0
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/declare/Global.java

@@ -3252,4 +3252,61 @@ public final class Global {
             return -99;
         }
     }
+
+    public static boolean bRecordingStatus = false; // 거동수상자 녹화중 판별 플래그
+    public static boolean bRecordingStatus_sub = false; // 거동수상자 녹화중 판별 플래그
+    public static int iCallLiveState = Declare.CALLAPPSTATE.CALLAPPSTATE_NONE; // 거동수상자 녹화중 판별 플래그
+    public static boolean bDetect_stranger = false; // 거동수상자 녹화중 판별 플래그
+    public static boolean bTCP_doubleConnect = false; // 거동수상자 녹화중 판별 플래그
+
+
+    public static void setRecordingStatus(boolean status) {
+        //Log.v(TAG, "setRecordingStatus[" + status + "]");
+        bRecordingStatus = status;
+    }
+
+    public static boolean getRecordingStatus() {
+        //Log.v(TAG, "getRecordingStatus[" + bRecordingStatus + "]");
+        return bRecordingStatus;
+    }
+
+    public static void setRecordingStatus_sub(boolean status) {
+        //Log.v(TAG, "setRecordingStatus[" + status + "]");
+        bRecordingStatus_sub = status;
+    }
+
+    public static boolean getRecordingStatus_sub() {
+        //Log.v(TAG, "getRecordingStatus[" + bRecordingStatus_sub + "]");
+        return bRecordingStatus_sub;
+    }
+
+    public static void setCallLiveStatus(int status) {
+        Log.v(TAG, "setCallLiveStatus[" + status + "]");
+        iCallLiveState = status;
+    }
+
+    public static int getCallLiveStatus() {
+        Log.v(TAG, "setCallLiveStatus[" + iCallLiveState + "]");
+        return iCallLiveState;
+    }
+
+    public static void setDetect_stranger(boolean status) {
+        //Log.v(TAG, "setRecordingStatus[" + status + "]");
+        bDetect_stranger = status;
+    }
+
+    public static boolean getDetect_stranger() {
+        //Log.v(TAG, "getRecordingStatus[" + bDetect_stranger + "]");
+        return bDetect_stranger;
+    }
+
+    public static void setbTCP_doubleConnect(boolean status) {
+        //Log.v(TAG, "setbTCP_doubleConnect[" + status + "]");
+        bTCP_doubleConnect = status;
+    }
+
+    public static boolean getbTCP_doubleConnect() {
+        //Log.v(TAG, "getbTCP_doubleConnect[" + bTCP_doubleConnect + "]");
+        return bTCP_doubleConnect;
+    }
 }

+ 26 - 2
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/declare/ID.java

@@ -652,6 +652,7 @@ public final class ID {
         public final static int POPUP_MULTICALL_RECORD = 25000; // 멀티콜 팝업 (거동수상자 영상 녹화)
 
         public final static int POPUP_SMARTIOT_SETTING = 26000; // 스마트현관카메라(효성/대우) 설정 팝업
+        public final static int POPUP_UPDATEINFO = 27000;
         public final static int POPUP_ALL = 90000;   // 모든 팝업
 
 
@@ -778,6 +779,29 @@ public final class ID {
             }
         }
 
+        /**
+         * 멀티콜
+         */
+        public static final class UPDATEINFO {
+            final static int BASE = POPUP_UPDATEINFO;
+
+            public static final class ELEMENT {
+                public static final class IMAGE {
+                    public final static int BACKGROUND = BASE + 100;
+                    public final static int ICON = BASE + 101;
+                }
+
+                public static final class BUTTON {
+                    public final static int ACCEPT = BASE + 200;
+                }
+
+                public static final class TEXT {
+                    public final static int INSTRUCTION = BASE + 300;
+
+                }
+            }
+        }
+
         /**
          * 멀티콜 거동수상자 영상녹화
          */
@@ -815,8 +839,8 @@ public final class ID {
                     public final static int CANCEL_TOP = BASE + 200;
                     public final static int OK = BASE + 201;
                     public final static int CANCEL = BASE + 202;
-                    public final static int PREV1 = BASE + 203;
-                    public final static int NEXT1 = BASE + 204;
+                    //public final static int PREV1 = BASE + 203;
+                    //public final static int NEXT1 = BASE + 204;
                     public final static int PREV2 = BASE + 205;
                     public final static int NEXT2 = BASE + 206;
                     public final static int PREV3 = BASE + 207;

+ 36 - 32
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/popup/SmartIOTCamSetting.java

@@ -73,7 +73,7 @@ public class SmartIOTCamSetting extends WpadScreen {
     public final String TXT_SECOND = "초";
 
     public final String TXT_TAKINGPIC_SETTING = "거동수상자 사진촬영 설정";
-    public final String TXT_SENSOR_SENSITIVITY = "센서감도 설정";
+    //public final String TXT_SENSOR_SENSITIVITY = "센서감도 설정";
     public final String TXT_SENSOR_PERIOD = "사진촬영 주기 설정";
     public final String TXT_CAM_BRIGHTNESS = "화면밝기 설정";
 
@@ -120,7 +120,7 @@ public class SmartIOTCamSetting extends WpadScreen {
 
             title = new WpadTextView(context, false, 990, 90, Gravity.CENTER, Color.WHITE, Common.fontsize._46, true, ID.POPUP.SMARTIOT_SETTING.ELEMENT.TEXT.TITLE);
             ViewRegistration(layout, title, 0, 0);
-            title.setText("스마트현관카메라 설정");
+            title.setText("현관카메라 설정");
 
             DrawContents();
         } catch (RuntimeException re) {
@@ -157,10 +157,11 @@ public class SmartIOTCamSetting extends WpadScreen {
                 changeTakingPicSet(true);
             } else if (TargetId == ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.CHECK_NOTUSE) {
                 changeTakingPicSet(false);
-            } else if (TargetId == ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.PREV1) {
-                ChangeSensorSensitivity(false);
-            } else if (TargetId == ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.NEXT1) {
-                ChangeSensorSensitivity(true);
+                //jglee - 2022.08.24 민감도1로 무조건 고정
+//            } else if (TargetId == ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.PREV1) {
+//                ChangeSensorSensitivity(false);
+//            } else if (TargetId == ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.NEXT1) {
+//                ChangeSensorSensitivity(true);
             } else if (TargetId == ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.PREV2) {
                 ChangeSensorPeriod(false);
             } else if (TargetId == ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.NEXT2) {
@@ -183,11 +184,12 @@ public class SmartIOTCamSetting extends WpadScreen {
                 Log.d(TAG, "[initInfo] mWallPadAPI.Check_Connect() SUCCESS!!");
                 smartKeyRfDoorAPI = mWallPadAPI.Get_SmartKeyRfDoorController();
 
+                //jglee - 2022.08.24 민감도1로 무조건 고정
                 // 항목 추가
-                SetKind data = new SetKind(ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.PREV1, ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.NEXT1, TXT_SENSOR_SENSITIVITY);
-                SettingData.add(data);
+//                SetKind data = new SetKind(ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.PREV1, ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.NEXT1, TXT_SENSOR_SENSITIVITY);
+//                SettingData.add(data);
 
-                data = new SetKind(ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.PREV2, ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.NEXT2, TXT_SENSOR_PERIOD);
+                SetKind data = new SetKind(ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.PREV2, ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.NEXT2, TXT_SENSOR_PERIOD);
                 SettingData.add(data);
 
                 data = new SetKind(ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.PREV3, ID.POPUP.SMARTIOT_SETTING.ELEMENT.BUTTON.NEXT3, TXT_CAM_BRIGHTNESS);
@@ -258,7 +260,8 @@ public class SmartIOTCamSetting extends WpadScreen {
 
                 // API => 센서감도, 감지유지시간
                 if (smartKeyRfDoorAPI != null) {
-                    String[] retData = smartKeyRfDoorAPI.SetSensorConfig((byte) mCurrentSensitivity, (byte) mCurrentSensorPeriod).split(define.DEVCTR_CMD_SPLITER);
+                    //jglee - 센서 감도는 무조건  0x03으로 고정
+                    String[] retData = smartKeyRfDoorAPI.SetSensorConfig((byte) 0x05, (byte) 0x01).split(define.DEVCTR_CMD_SPLITER);
                     if (retData != null) {
                         if (retData[0].contains("SUCCESS")) {
                             Log.d(TAG, "[SaveDBConfigValue] SetSensorConfig SUCCESS!!!");
@@ -361,9 +364,9 @@ public class SmartIOTCamSetting extends WpadScreen {
                 SettingData.get(j).SetViewIdx(arrayIdx);
 
                 SetKind item = SettingData.get(j);
-                if (item.mTitle.equals(TXT_SENSOR_SENSITIVITY)) {
-                    DrawSensorSensitivity(mCurrentSensitivity);
-                }
+//                if (item.mTitle.equals(TXT_SENSOR_SENSITIVITY)) {
+//                    DrawSensorSensitivity(mCurrentSensitivity);
+//                }
                 if (item.mTitle.equals(TXT_SENSOR_PERIOD)) {
                     DrawSensorPeriod(mCurrentSensorPeriod);
                 }
@@ -568,26 +571,27 @@ public class SmartIOTCamSetting extends WpadScreen {
         }
     }
 
+    //jglee - 2022.08.24 민감도1로 무조건 고정
     private void DrawSensorSensitivity(int val) {
-        try {
-            int idx = getViewIdx(TXT_SENSOR_SENSITIVITY);
-            if(textValue[idx]!=null)
-                textValue[idx].setText(String.valueOf(val));
-            if (val == MAX_SENSOR_SENSITIVITY) {
-                if(btnNext[idx]!=null)btnNext[idx].setButtonRearImage();
-            } else if (val == MIN_SENSOR_SENSITIVITY) {
-                if(btnPrev[idx]!=null)btnPrev[idx].setButtonRearImage();
-            } else {
-                if(btnNext[idx]!=null)btnNext[idx].setButtonFrontImage();
-                if(btnPrev[idx]!=null) btnPrev[idx].setButtonFrontImage();
-            }
-        } catch (RuntimeException re) {
-            LogUtil.errorLogInfo("", TAG, re);
-        } catch (Exception e) {
-            Log.e(TAG, "[Exception] DrawSensorSensitivity(int val)");
-            //e.printStackTrace();
-            LogUtil.errorLogInfo("", TAG, e);
-        }
+//        try {
+//            int idx = getViewIdx(TXT_SENSOR_SENSITIVITY);
+//            if(textValue[idx]!=null)
+//                textValue[idx].setText(String.valueOf(val));
+//            if (val == MAX_SENSOR_SENSITIVITY) {
+//                if(btnNext[idx]!=null)btnNext[idx].setButtonRearImage();
+//            } else if (val == MIN_SENSOR_SENSITIVITY) {
+//                if(btnPrev[idx]!=null)btnPrev[idx].setButtonRearImage();
+//            } else {
+//                if(btnNext[idx]!=null)btnNext[idx].setButtonFrontImage();
+//                if(btnPrev[idx]!=null) btnPrev[idx].setButtonFrontImage();
+//            }
+//        } catch (RuntimeException re) {
+//            LogUtil.errorLogInfo("", TAG, re);
+//        } catch (Exception e) {
+//            Log.e(TAG, "[Exception] DrawSensorSensitivity(int val)");
+//            //e.printStackTrace();
+//            LogUtil.errorLogInfo("", TAG, e);
+//        }
     }
 
     private void ChangeSensorPeriod(boolean Up) {

+ 82 - 20
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/screen/TalkFront.java

@@ -2,6 +2,7 @@ package kr.co.icontrols.wallpadcall.screen;
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.graphics.Color;
 import android.os.Handler;
 import android.os.Looper;
@@ -67,6 +68,7 @@ import kr.co.icontrols.wallpadsupport.WpadSound.SND;
 import kr.co.icontrols.wallpadsupport.WpadTextView;
 
 import static kr.co.icontrols.callengine.remotecall.RemoteCallMSG.REMOTECALL_CMD.CMD_MULTICALL;
+import static kr.co.icontrols.wallpadcall.declare.Declare.BR.ACNAME_MAIN_NOTI;
 
 public class TalkFront extends WpadScreen implements CallEventListener, MainEventListener {
 
@@ -417,7 +419,7 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
             ((MainActivity) mContext).releaseMainEventListener();
             Global.stopMelodyRepeat();
             showFrontCam(false, false);
-            MainActivity.bRecordingStatus = false;
+            Global.setRecordingStatus(false);
             MainActivity.mCallController.stop1stCallTimer();
             MainActivity.mCallController.stop2ndCallTimer();
             MainActivity.mCallController.setTalkPath(CALLPATH.NORMAL);
@@ -436,7 +438,22 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
     protected void onBrReceive(Intent intent) {
         super.onBrReceive(intent);
         try {
-            LOG_INFO("[onBrReceive] intent : " + intent);
+            String strAction = intent.getAction();
+            if (strAction.equals(Declare.BR.BR_REQUEST_RECORD_STOP)) {
+
+                LOG_INFO("[onBrReceive] strAction[" + strAction + "] bRecordingStatus[" + Global.getRecordingStatus() + "]");
+                boolean bSave = true;
+                try {
+                    int nKind = intent.getIntExtra(define.NOTIBR_KIND, 0);
+                    stopStrangerRecord(false, nKind); // 1: 현관콜 2:로비/세대/경비콜
+                } catch (RuntimeException re) {
+                    LogUtil.errorLogInfo("", TAG, re);
+                } catch (Exception e) {
+                    Log.e(TAG, "[Exception] stopStrangerRecord()");
+                    //e.printStackTrace();
+                    LogUtil.errorLogInfo("", TAG, e);
+                }
+            }
         } catch (RuntimeException re) {
             LogUtil.errorLogInfo("", TAG, re);
         } catch (Exception e) {
@@ -571,7 +588,7 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
                 }
                 else if (eCallStatus == CALLSTATUS.CALLED) {
                     bBlockSavePicBTN = false;
-                    if (MainActivity.bRecordingStatus) {
+                    if (Global.getRecordingStatus()) {
                         // 녹화 중 현관 호출 => 녹화 종료 및 팝업 닫힘 => 현관 호출 지속
                         LOG_WARN("[onCallEvent] STRANGER RECORDING IS RUNNING!!");
                         ((MainActivity) mContext).finishPopUp(ID.POPUP.POPUP_NOTICE_VIDEORECORD);
@@ -745,8 +762,8 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
                 } else if (eCallStatus == CALLSTATUS.RECORDING) {
                     sendHandlerMsg(HANDLERMSG.SET_BTN_STATUS, 1, 0);
                     // [스마트현관카메라] 거동수상자 녹화
-                    LOG("[onCallEvent] bRecordingStatus [" + MainActivity.bRecordingStatus + "]");
-                    if (!MainActivity.bRecordingStatus) {
+                    LOG("[onCallEvent] bRecordingStatus [" + Global.getRecordingStatus() + "]");
+                    if (!Global.getRecordingStatus()) {
                         showFrontCam(true, false);
                         super.setFinishTimerDestroy();
                         if (ConfigValues.bRemoteCall) { // 방문객원격통화를 사용하는 경우 스트림서버에서 녹화 (거동수상자 영상을 전달하기 위해 인코딩)
@@ -754,9 +771,12 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
                         } else {
                             startStrangerRecord(false); // 방문객원격통화를 사용하지 않는 경우 월패드에서 녹화
                         }
+
                     } else {
                         LOG_WARN("[onCallEvent] Recording is Already Running!!");
                     }
+
+
                 } else if (eCallStatus == CALLSTATUS.TAKINGPIC) {
                     // [스마트현관카메라] 거동수상자 사진 촬영
                     ((MainActivity) mContext).showStrangerNoticeText(true, false);
@@ -1130,10 +1150,20 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
                 else if (eCallStatus == CALLSTATUS.TALKING || eCallStatus == CALLSTATUS.CALLING) {
                     if (MainActivity.mCallController.mCallInfo.getCallOwner() == CALLOWNER.MOBILE)
                         MainActivity.mRemoteCallController.sendCloseRemoteCall();
+
+                    //jglee - 2022.08.11 현관 카메라로 나가는것을 방지
+                    if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT)
+                    {
+                        ((MainActivity) mContext).sendHandlerMsg(IGW300CMD.AUDIO_OFF, 0, 0);
+                    }
+                    else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT)
+                    {
+                        MainActivity.mCallController.setTalkPath(CALLPATH.NORMAL);
+                    }
                     MainActivity.mCallController.onFrontEvent(CALLEVENTTYPE.TERMINATE_CALL, CALLTYPE.FRONT);
                 }
                 else if (eCallStatus == CALLSTATUS.RECORDING) {
-                    stopStrangerRecord(true);
+                    stopStrangerRecord(true, 0);
                     MainActivity.mCallController.onFrontEvent(CALLEVENTTYPE.TERMINATE_CALL, CALLTYPE.FRONT);
                 }
                 else {
@@ -1236,6 +1266,7 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
 
                     sendHandlerMsgDelayed(HANDLERMSG.END_CALL, 0, 0, 3000);
                     Global.change1stCallLogAction(CALLACTION.TALK_DOOR);
+                    MainActivity.mCallController.mCallInfo.setCallOwner(CALLOWNER.NONE);
                     return true;
                 }
                 else {
@@ -1264,6 +1295,7 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
                     //}
                     sendHandlerMsgDelayed(HANDLERMSG.END_CALL, 0, 0, 3000);
                     Global.change1stCallLogAction(CALLACTION.DOOR);
+                    MainActivity.mCallController.mCallInfo.setCallOwner(CALLOWNER.NONE);
                     return true;
                 } else {
                     MainActivity.mSound.PlayMent(SND.setting.RETRY_ACTION);
@@ -1309,6 +1341,7 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
 
                     sendHandlerMsgDelayed(HANDLERMSG.END_CALL, 0, 0, 3000);
                     Global.change1stCallLogAction(CALLACTION.TALK_DOOR);
+                    MainActivity.mCallController.mCallInfo.setCallOwner(CALLOWNER.NONE);
                     return true;
                 }
                 else {
@@ -1380,8 +1413,8 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
             LOG("[doMultiCallAccept] eCallStatus [" + eCallStatus + "]");
             if (eCallStatus == CALLSTATUS.RECORDING) {
                 showFrontCam(false, false);
-                if (MainActivity.bRecordingStatus) {
-                    MainActivity.bRecordingStatus = false;
+                if (Global.getRecordingStatus()) {
+                    Global.setRecordingStatus(false);
                     ((MainActivity) (this.getContext())).mediaStopRecord(true);
                     sendHandlerMsg(HANDLERMSG.SAVE_VISITOR_VIDEO_NOT_FINISH_APP, 0, 0);
                 }
@@ -1748,6 +1781,9 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
                 ((MainActivity) mContext).setMenuBTNEnable(false);
                 if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) {
                     enableTalkBTN(false); // IHN-1010에서 현관 단일콜일 경우 띵똥 소리 출력 중인 경우에는 통화버튼 disable
+                } else {
+                    // yjyoon. 녹화 중 현관콜 처리. 2443 boardtype은 V40_IGW300_NOUGAT.
+                    enableTalkBTN(true);
                 }
                 enableEndBTN(false);
                 sendHandlerMsgDelayed(HANDLERMSG.ENABLE_END_BTN, 0, 0, 3000); // 통화 시작 후 3초 후 종료 버튼 활성화 (다담 김명준선임 요청 19.09.30)
@@ -2382,9 +2418,9 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
 
     private boolean startStrangerRecord(boolean bRemoteCall) {
         try {
-            Log.d(TAG, "[startStrangerRecord] bRecordingStatus [" + MainActivity.bRecordingStatus + "], bRemoteCall [" + bRemoteCall + "]");
-            if (!MainActivity.bRecordingStatus) {
-                MainActivity.bRecordingStatus = true;
+            Log.d(TAG, "[startStrangerRecord] bRecordingStatus [" + Global.getRecordingStatus() + "], bRemoteCall [" + bRemoteCall + "] FrontStatus[" + MainActivity.mCallController.mCallInfo.getFRONT() + "]");
+            if ((MainActivity.mCallController.mCallInfo.getFRONT() == CALLSTATUS.RECORDING) && (Global.getRecordingStatus() == false)) {
+                Global.setRecordingStatus(true);
 
                 if (((MainActivity) mContext).mRecordTimer != null) {
                     ((MainActivity) mContext).mRecordTimer.cancel();
@@ -2404,12 +2440,19 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
         return false;
     }
 
-    private void stopStrangerRecord(boolean bSave) {
+    private void stopStrangerRecord(boolean bSave, int bCallFront) {
         try {
-            LOG("[stopStrangerRecord] bSave [" + bSave + "]");
-            showFrontCam(false, false);
-            if (MainActivity.bRecordingStatus) {
-                MainActivity.bRecordingStatus = false;
+            LOG("[stopStrangerRecord] bSave [" + bSave + "] bCallFront[" + bCallFront + "]");
+
+            if (bCallFront == 1) {
+                // 현관콜. FrontCam 유지
+                showFrontCam(true, false);
+            } else {
+                showFrontCam(false, false);
+            }
+
+            if (Global.getRecordingStatus()) {
+                Global.setRecordingStatus(false);
                 ((MainActivity) (this.getContext())).mediaStopRecord(true);
 
                 if (((MainActivity) mContext).mCurRecordTime <= 3 || !bSave) {
@@ -2418,11 +2461,24 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
                     if (tempFile.isFile()) {
                         tempFile.delete();
                     }
-                    finishWallpadCallApp();
+
+                    // yjyoon. 녹화 중 새로운 콜인 경우 앱을 종료하지 않는다.
+                    if (bCallFront == 0) {
+                        finishWallpadCallApp();
+                    }
                 }
                 else {
-                    sendHandlerMsg(HANDLERMSG.SAVE_VISITOR_VIDEO_FINISH_APP, 0, 0);
+                    // yjyoon
+                    // 영상 저장 후 앱 종료. 앱 종료를 막기 위해 arg1 = 1 설정
+                    sendHandlerMsg(HANDLERMSG.SAVE_VISITOR_VIDEO_FINISH_APP, bCallFront == 0 ? 0 : 1, 0);
                 }
+
+                Log.v("yjyoon", "Call TalkFront ###Common.BR_MAIN_NOTI.STOP_RECORDING");
+                // yjyoon. WallPadMain으로 녹화 종료 이벤트 발생. Common.bWallPadRecoder 값 변경.
+                Intent newIntent = new Intent(); // 녹화 종료 BR 전송
+                newIntent.setAction(ACNAME_MAIN_NOTI);
+                newIntent.putExtra("KIND", /**Common.BR_MAIN_NOTI.STOP_RECORDING*/1027);
+                getContext().sendBroadcast(newIntent);
             }
         } catch (RuntimeException re) {
             LogUtil.errorLogInfo("", TAG, re);
@@ -2857,8 +2913,14 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
                     break;
 
                 case HANDLERMSG.SAVE_VISITOR_VIDEO_FINISH_APP:
-                    Log.d(TAG, "[TalkFrontHandler] SAVE_VISITOR_VIDEO_FINISH_APP");
-                    ((MainActivity) mContext).saveRecordingFile(true);
+                    Log.d(TAG, "[TalkFrontHandler] SAVE_VISITOR_VIDEO_FINISH_APP arg1[" + msg.arg1 + "]");
+                    if (msg.arg1 == 1) {
+                        // yjyoon. 거동수상자 녹화 중 현관콜이 들어왔을 때 앱 종료하지 않음.
+                        Log.v("yjyoon", "SAVE_VISITOR_VIDEO_FINISH_APP[false]");
+                        ((MainActivity) mContext).saveRecordingFile(false);
+                    } else {
+                        ((MainActivity) mContext).saveRecordingFile(true);
+                    }
                     break;
 
                 case HANDLERMSG.SAVE_VISITOR_VIDEO_NOT_FINISH_APP:

+ 2 - 1
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/screen/TalkGuard.java

@@ -517,9 +517,10 @@ public class TalkGuard extends WpadScreen implements CallEventListener, MainEven
                     Global.make1stCallHistoryInfo(strRemoteIP, strRemoteSIPID, CALLDIRECTION.OUT, CALLACTION.MISS, CALLRESULT.OUT_MISS);
                 } else if (eCallStatus == CALLSTATUS.CALLED) {
                     bRcvEnd = false;
-                    if (MainActivity.bRecordingStatus) {
+                    if (Global.getRecordingStatus_sub()) {
                         // 거동수상자 녹화 중 호출 => 녹화 종료 및 팝업 닫힘 => 호출 지속
                         LOG_WARN("[onCallEvent] STRANGER RECORDING IS RUNNING!!");
+                        Global.setRecordingStatus_sub(false);
                         ((MainActivity) mContext).finishPopUp(ID.POPUP.POPUP_NOTICE_VIDEORECORD);
                         ((MainActivity) (this.getContext())).stopNSaveRecordingFile(true, false);
                     }

+ 2 - 1
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/screen/TalkLobby.java

@@ -493,9 +493,10 @@ public class TalkLobby extends WpadScreen implements CallEventListener, MainEven
                     ((MainActivity) mContext).UDPStart();
                     MainActivity.mCallController.mCallInfo.setCallStatus(CALLTYPE.LOBBY, CALLSTATUS.CALLED);
                     MainActivity.mCallController.selectVideoSourceToSubPhone(CALLTYPE.LOBBY, false);
-                    if (MainActivity.bRecordingStatus) {
+                    if (Global.getRecordingStatus_sub()) {
                         // 거동수상자 녹화 중 호출 => 녹화 종료 및 팝업 닫힘 => 호출 지속
                         LOG_WARN("[onCallEvent] STRANGER RECORDING IS RUNNING!!");
+                        Global.setRecordingStatus_sub(false);
                         ((MainActivity) mContext).finishPopUp(ID.POPUP.POPUP_NOTICE_VIDEORECORD);
                         ((MainActivity) (this.getContext())).stopNSaveRecordingFile(true, false);
                     }

+ 1 - 1
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/screen/TalkPSTN.java

@@ -489,7 +489,7 @@ public class TalkPSTN extends WpadScreen implements CallEventListener, DTMFEvent
                 else if (eCallStatus == CALLSTATUS.CALLED) {
                     bPSTNCalled = true;
                     resetRingCnt();
-                    if (MainActivity.bRecordingStatus) {
+                    if (Global.getRecordingStatus()) {
                         // 거동수상자 녹화 중 호출 => 녹화 종료 및 팝업 닫힘 => 호출 지속
                         LOG_WARN("[onCallEvent] STRANGER RECORDING IS RUNNING!!");
                         ((MainActivity) mContext).finishPopUp(ID.POPUP.POPUP_NOTICE_VIDEORECORD);

+ 2 - 1
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/screen/TalkResidence.java

@@ -598,9 +598,10 @@ public class TalkResidence extends WpadScreen implements CallEventListener, Main
                     Global.make1stCallHistoryInfo(strRemoteIP, strRemoteSIPID, CALLDIRECTION.OUT, CALLACTION.MISS, CALLRESULT.OUT_MISS);
                 } else if (eCallStatus == CALLSTATUS.CALLED) {
                     bRcvEnd = false;
-                    if (MainActivity.bRecordingStatus) {
+                    if (Global.getRecordingStatus_sub()) {
                         // 거동수상자 녹화 중 호출 => 녹화 종료 및 팝업 닫힘 => 호출 지속
                         LOG_WARN("[onCallEvent] STRANGER RECORDING IS RUNNING!!");
+                        Global.setRecordingStatus_sub(false);
                         ((MainActivity) mContext).finishPopUp(ID.POPUP.POPUP_NOTICE_VIDEORECORD);
                         ((MainActivity) (this.getContext())).stopNSaveRecordingFile(true, false);
                     }