Ver código fonte

[WallPadCall]
1. 앱 실행 중 현관콜 / 거동수상자 BR 처리 변경
- 현관콜 br
앱 구동 후 첫 번째 이벤트가 생성되기 전 현관콜 br이 수신되었을 때, 첫번째 이벤트의 타입이 거동수상자이면 해당 이벤트 대신 현관콜로 교체하여 첫번째 이벤트를 생성하도록 변경
- 거동수상자 br
단순히 앱이 실행된 상태에서만 이벤트를 생성하도록 변경.

2. 버전업 2022.08.02.01

jigsjjang 2 anos atrás
pai
commit
ce66955315

+ 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.07.25.01">
+    android:versionName="2022.08.02.01">
 
     <!--android:sharedUserId="android.uid.system"-->
     <!--<uses-sdk-->

+ 123 - 30
WallPadCall/src/main/java/kr/co/icontrols/wallpadcall/MainActivity.java

@@ -347,6 +347,11 @@ public class MainActivity extends WpadActivity {
 
     public static boolean bFrontCallUse, bLobbyCallUse, bGuardCallUse, bResiCallUse, bPSTNCallUse, bCallHistoryUse, bVisitorPicUse;
 
+    // 앱 실행시 전달받은 이벤트 상태 여부. false 이면 새로운 이벤트가 있음을 의미.
+    public boolean bIsFirstCallEvent = true;
+    // 앱 실행 후 첫번째 이벤트 생성 여부. false 이면 아직 첫번째 이벤트를 생성하지 않음을 의미.
+    public boolean bIsGeneratedFirstCallEvent = false;
+
     /* =================================================================================================
      * [ Activity Life Cycle ] region
      ================================================================================================ */
@@ -731,6 +736,10 @@ public class MainActivity extends WpadActivity {
             mCallPathCheckHandler.removeMessages(3);
         }
 
+        if (MainHandler != null) {
+            MainHandler.removeMessages(HANDLERMSG.RECEIVE_NEW_FRONT_CALL);
+        }
+
         // yjyoon
         bRecordingStopAndNewCall = false;
 
@@ -3985,6 +3994,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) {
@@ -5119,6 +5133,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;
@@ -5131,7 +5146,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:
@@ -5383,6 +5407,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;
@@ -5450,6 +5500,7 @@ public class MainActivity extends WpadActivity {
 
     public void setBlockFrontCall() {
         try {
+            Log.v(TAG, "setBlockFrontCall()");
             bBlockFrontCall = true;
             MainHandler.removeMessages(HANDLERMSG.RELEASE_BLOCK_FRONTCALL);
             ((MainActivity) mContext).sendHandlerMsgDelayed(HANDLERMSG.RELEASE_BLOCK_FRONTCALL, 0, 0, 3000);
@@ -5580,25 +5631,41 @@ 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() + " " + (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. 첫번째 이벤트가 생성되기 전이고 그 타입이 거동수상자이면 거동수상자 이벤트를 폐기하고 현관콜 이벤트를 진행한다.
+                                Log.v("yjyoon", "###### 1");
+                                bIsFirstCallEvent = false;
+                                
+                                // 첫번째 이벤트 생성전까지 bBlockFrontCall = false 인 상태에서 현관버튼을 연속으로 눌렀을 때 간혹 1개 이상의 현관콜 이벤트가 수신되는 현상이 있어 이전 메지시를 삭제함.
+                                MainHandler.removeMessages(HANDLERMSG.RECEIVE_NEW_FRONT_CALL);
+                                
+                                // 이벤트 메시지 생성
+                                sendHandlerMsgDelayed(HANDLERMSG.RECEIVE_NEW_FRONT_CALL, 0, 0, 100);
+                            } else {
+                                Log.v("yjyoon", "###### 2");
+                                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 수신이 불가하므로 통화앱에서 처리)
+                                    }
                                 }
-                            }
 
-                            Log.v(this.TAG, "bRecordingStatus[" + bRecordingStatus + "]");
-                            if (mCallController.mCallInfo.getFRONT() == CALLSTATUS.IDLE) {
-                                Log.v(this.TAG, "[onReceive] Front call !!! getFRONT() [" + mCallController.mCallInfo.getFRONT() + "]");
-                                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 {
@@ -5630,33 +5697,59 @@ public class MainActivity extends WpadActivity {
                 }
                 else if (strAction.equals(define.NOTIFY_ACNAME)) {
                     int kind = intent.getIntExtra(define.NOTIBR_KIND,0);
-                    //jglee - 통화중에 거동 수상자는 받지 않기로 하
-//                    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);
-//                                }
-//                            }
-//                        }
-//                    }
-                    if (kind == define.NOTIFY_FINISH_FRONT_DINGDONG) {
+
+                    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()) {
+
+                                    // '통화 시, 모든 거동 수상자 신호를 버림' 시나리오 적용.
+                                    // 통화 기능 시작 또는 종료 시 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) {
                         // 메인 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[" + bRecordingStatus + "]");
 
                         if (!bRecordingStatus) {
                             Log.v(this.TAG, "ignore new call!! bRecodingStatus[" + bRecordingStatus + "]");
                             return;
                         }
-                        
+
                         // yjyoon. 앱 생성 후 500ms 뒤에 생성되는 콜이벤트 메시지와 녹화 관련 mFrontCamOpenCheckHandler 메시지 삭제.
-                        MainHandler.removeMessages(HANDLERMSG.CHECK_RECEIVINGCALL);
+                        //MainHandler.removeMessages(HANDLERMSG.CHECK_RECEIVINGCALL);
                         mFrontCamOpenCheckHandler.removeMessages(2);
                         mFrontCamOpenCheckHandler.removeMessages(3);