Bläddra i källkod

[WallPadCall]
1. MediaRecorder.start 상태가 아니면 MediaRecorder.stop을 진행하지 않도록 MediaRecorder.start 상태변수 추가 및 분기처리.
(이슈. WallPadCall 죽음)
2. 거동수상자 모드 구성 중인 경우 로비/세대/현관으로 부터의 콜을 받지 않도록 상태변수 추가 및 분기처리

[WallPadMain]
1. 거동수상자 모드 구성 중인 경우 로비/세대/현관으로 부터의 콜을 받지 않도록 상태변수 추가 및 분기처리

jigsjjang 2 år sedan
förälder
incheckning
21e2939332

+ 8 - 0
WallPadCall/src/main/java/kr/co/icontrols/callengine/sip/SIPStun.java

@@ -2217,6 +2217,14 @@ public class SIPStun extends Service {
                 return;
             }
 
+            // 20220712 yjyoon. 거동수상자 녹화모드를 구성하는 동안 콜을 받지 않는다.
+            Log.w(TAG, "[INVITEParser] MainActivity.bRecordingStatus [" + MainActivity.bRecordingStatus + "], MainActivity.bReadyToRecord [" + MainActivity.bReadyToRecord + "]");
+            if (MainActivity.bRecordingStatus & !MainActivity.bReadyToRecord) {
+                Log.w(TAG, "[INVITEParser] Preparing to record. Reject a call.");
+                rejectCall(strMessage, 486, strRemoteIP, strRemotePort);
+                return;
+            }
+
             if (nMSGType == SIPStack.SIP_MSGTYPE_REQUEST) {
                 if (SIPController.sipCall != null) {
                     Log.d(TAG, "[INVITEParser] [SIPController.sipCall.flag = " + SIPController.sipCall.flag + "]");

+ 41 - 4
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/MainActivity.java

@@ -222,6 +222,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;
@@ -337,7 +343,8 @@ public class MainActivity extends WpadActivity {
     public boolean bLCDReverse = false;
 
     public static boolean bRecordingStatus = false; // 거동수상자 녹화중 판별 플래그
-    public static boolean bRecordingStopAndNewCall = false; // yjyoon
+    public static boolean bRecordingStopAndNewCall = false; // yjyoon.
+    public static boolean bReadyToRecord = false; // yjyoon. 거동수상자 녹화모드 준비 완료 상태값 저장 변수.
 
     public static boolean bFrontCallUse, bLobbyCallUse, bGuardCallUse, bResiCallUse, bPSTNCallUse, bCallHistoryUse, bVisitorPicUse;
 
@@ -3811,6 +3818,7 @@ public class MainActivity extends WpadActivity {
 
                     mFrontCamera.unlock();
 
+                    bMediaRecorder = false;
 
                     mMediaRecorder = new MediaRecorder();
                     mMediaRecorder.setCamera(mFrontCamera);
@@ -3875,11 +3883,22 @@ public class MainActivity extends WpadActivity {
                             @Override
                             public void run() {
                                 if (mMediaRecorder != null) {
+                                    Log.d(TAG, "[mFrontCamOpenCheckHandler] m_mediaRecorder.start");
                                     mMediaRecorder.start();
+                                    bMediaRecorder = true;
                                 }
                             }
                         }, iPlayTime);
 
+                        // yjyoon. 거동수상자 녹화 준비 완료.
+                        Log.v("yjyoon", "MainActivity > mFrontCamOpenCheckHandler: bReadyToRecord = true");
+                        bReadyToRecord = true;
+
+                        Log.v("yjyoon", "Ready to Recording.");
+                        Intent newIntent = new Intent(); // 녹화 종료 BR 전송
+                        newIntent.setAction(ACNAME_MAIN_NOTI);
+                        newIntent.putExtra("KIND", /**Common.BR_MAIN_NOTI.READY_TO_RECORDING*/1028);
+                        getContext().sendBroadcast(newIntent);
 
                     } catch (IllegalStateException e) {
                         Log.e(TAG, "[IllegalStateException] mFrontCamOpenCheckHandler.start");
@@ -4634,10 +4653,17 @@ public class MainActivity extends WpadActivity {
         try {
             Log.d(TAG, "[mediaStartRecord]");
             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 이후 녹화 시작
@@ -4645,7 +4671,7 @@ public class MainActivity extends WpadActivity {
             // yjyoon.
             // 거동수상자 녹화 -> 콜 수신. 녹화 중지 (Common.bWallPadRecoder = false)
             // -> 통화완료 후 앱 종료 대기 중 거동수상자 감지. 녹화 시작. (이 때 Common.bWallPadRecoder 값이 변경되지 않음) -> 현관 버튼 클릭(동작하지 않음)
-            Log.v("yjyoon", "Call MainActivity ###Common.BR_MAIN_NOTI.STOP_RECORDING");
+            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);
@@ -4669,7 +4695,13 @@ public class MainActivity extends WpadActivity {
             bRecordingStatus = 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;
@@ -4680,6 +4712,9 @@ public class MainActivity extends WpadActivity {
             showFrontVideo(false);
             if (bDel) ScreenLayout.removeView(FrontVideoSurface);
 
+            Log.v("yjyoon", "Mainactivity > mediaStopRecord: bReadyToRecord = false");
+            bReadyToRecord = false;
+
             // yjyoon. WallPadMain으로 녹화 종료 이벤트 발생. Common.bWallPadRecoder 값 변경.
             Log.v("yjyoon", "Call MainActivity ###Common.BR_MAIN_NOTI.STOP_RECORDING");
             Intent newIntent = new Intent(); // 녹화 종료 BR 전송
@@ -4930,6 +4965,8 @@ public class MainActivity extends WpadActivity {
             if (mMediaRecorder != null) {
                 mMediaRecorder.release();
                 mMediaRecorder = null;
+                if (bMediaRecorder)
+                    bMediaRecorder = false;
             }
             resetRecordTimer();
             bRecordingStatus = false;

+ 3 - 0
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/screen/TalkFront.java

@@ -2473,6 +2473,9 @@ public class TalkFront extends WpadScreen implements CallEventListener, MainEven
                     sendHandlerMsg(HANDLERMSG.SAVE_VISITOR_VIDEO_FINISH_APP, bCallFront == 0 ? 0 : 1, 0);
                 }
 
+                Log.v("yjyoon", "TalkFront > stopStrangerRecord: bReadyToRecord = false");
+                MainActivity.bReadyToRecord = false;
+
                 Log.v("yjyoon", "Call TalkFront ###Common.BR_MAIN_NOTI.STOP_RECORDING");
                 // yjyoon. WallPadMain으로 녹화 종료 이벤트 발생. Common.bWallPadRecoder 값 변경.
                 Intent newIntent = new Intent(); // 녹화 종료 BR 전송

+ 14 - 0
WallPadMain/src/main/java/kr/co/icontrols/wallpadmain/MainActivity.java

@@ -2723,6 +2723,8 @@ public class MainActivity extends WpadActivity {
                             int nEmerState = intent.getIntExtra("EMERGENCY_STATE", -1);
                             //여기서 거동 수상자 녹화 시작 여부 확인
                             Common.bRecordStatus = true;
+                            Common.bReadyToRecord = false;
+                            Log.v("yjyoon", "MainActivity > Common.BR_MAIN_NOTI.ACCEPT_RECORDING: Common.bReadyToRecord = false");
 
                             boolean bFromCall = intent.getBooleanExtra("FROMCALL", false);
 
@@ -2737,9 +2739,21 @@ public class MainActivity extends WpadActivity {
                             Log.v("yjyoon", "Common.BR_MAIN_NOTI.STOP_RECORDING     Common.bWallPadRecoder = false");
                             //Common.bWallPadRecoder = false;
                             Common.bRecordStatus = false;
+                            Common.bReadyToRecord = false;
+                            Log.v("yjyoon", "MainActivity > Common.BR_MAIN_NOTI.STOP_RECORDING: Common.bReadyToRecord = false");
+
                             mediaStopRecord();
                             break;
 
+                        case Common.BR_MAIN_NOTI.READY_TO_RECORDING:
+                            // yjyoon. 거동수상자 녹화중지 시 상태값 변경.
+                            Log.v("yjyoon", "Common.BR_MAIN_NOTI.READY_TO_RECORDING     Common.bReadyToRecord = true");
+
+                            Common.bReadyToRecord = true;
+                            Log.v("yjyoon", "MainActivity > Common.BR_MAIN_NOTI.READY_TO_RECORDING: Common.bReadyToRecord = true");
+
+                            break;
+
                         default:
                             Log.w(TAG, "[mWallPadNotifyBR] (BR.nKind) Not support!! -> " + kind);
                             break;

+ 3 - 0
WallPadMain/src/main/java/kr/co/icontrols/wallpadmain/declare/Common.java

@@ -31,6 +31,8 @@ public final class Common {
      */
     public static boolean bRecordStatus = false;
 
+    public static boolean bReadyToRecord = false;
+
     /**
      * 거동 수상자 연속 녹화 방지 변수
      */
@@ -333,6 +335,7 @@ public final class Common {
         public static final int ACCEPT_TAKEPIC                      = 1024;
         public static final int NOTICE_PSTN_RING_END                = 1025;
         public static final int STOP_RECORDING                      = 1027; // yjyoon. 20220705 거동수상자 녹화 중지
+        public static final int READY_TO_RECORDING                  = 1028; // yjyoon. 20220712 거동수상자 녹화 모드 구성 완료
 
         public static final String CARD_NUM = "CARD_NUM";
     }

+ 6 - 0
WallPadMain/src/main/java/kr/co/icontrols/wallpadmain/util/iMapServer.java

@@ -2411,6 +2411,12 @@ public class iMapServer extends Service {
                             // 거동수상자 녹화 중 현관 띵똥 눌리는 경우 BR 전송 (녹화 여부 판별 위해)
                             Log.d(TAG, "[WallPadInterface.BTN_DOOR] Now Stranger Recording!!! bRecordStatus [" + Common.bRecordStatus + "]");
 
+                            Log.v("yjyoon", "[WallPadInterface.BTN_DOOR] Now Stranger Recording!!! bRecordStatus[" + Common.bRecordStatus + "], Common.bReadyToRecord[" + Common.bReadyToRecord + "]");
+                            if (!Common.bReadyToRecord) {
+                                Log.w(TAG, "[WallPadInterface.BTN_DOOR] Preparing Record Mode. Ignore a BTN_DOOR.");
+                                return;
+                            }
+
                             bBlockFrontCall = true;
                             handlerCallCtrl.removeMessages(CALLCTRLHANDLERMSG.RELEASE_BLOCK_FRONTCALL);
                             handlerCallCtrl.sendEmptyMessageDelayed(CALLCTRLHANDLERMSG.RELEASE_BLOCK_FRONTCALL, 3000);