|
@@ -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);
|