package kr.co.icontrols.wallpadcall.screen; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.AsyncTask; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.SeekBar; import com.artncore.WallPadDataMgr.WallpadStatusData; import com.artncore.commons.APIErrorCode; import com.artncore.commons.define; import com.artncore.wallpadapi.GasAPI; import com.artncore.wallpadapi.IntLightAPI; import com.artncore.wallpadapi.LightAPI; import com.artncore.wallpadapi.MultiSwitchAPI; import com.artncore.wallpadapi.Sdb_LivingRoomLightAPI; import com.artncore.wallpadapi.WallPadAPI; import com.util.LogUtil; import java.util.Timer; import java.util.TimerTask; import kr.co.icontrols.callengine.engine.CallController.CallEventListener; import kr.co.icontrols.callengine.engine.CallController.DTMFEventListener; import kr.co.icontrols.callengine.engine.CallManager.CALLEVENTTYPE; import kr.co.icontrols.callengine.engine.CallManager.CALLOWNER; import kr.co.icontrols.callengine.engine.CallManager.CALLPATH; import kr.co.icontrols.callengine.engine.CallManager.CALLSTATUS; import kr.co.icontrols.callengine.engine.CallManager.CALLTYPE; import kr.co.icontrols.wallpadcall.MainActivity; import kr.co.icontrols.wallpadcall.MainActivity.MAINEVENT; import kr.co.icontrols.wallpadcall.MainActivity.MainEventListener; import kr.co.icontrols.wallpadcall.R; import kr.co.icontrols.wallpadcall.declare.Common; import kr.co.icontrols.wallpadcall.declare.DataClasses.CallHistoryInfoTable; import kr.co.icontrols.wallpadcall.declare.DataClasses.MultiCallInfo; import kr.co.icontrols.wallpadcall.declare.DataClasses.RemoteIDInfo; import kr.co.icontrols.wallpadcall.declare.DataClasses.SmartRFCamLEDMode; import kr.co.icontrols.wallpadcall.declare.DataClasses.SmartRFCamStatusMode; import kr.co.icontrols.wallpadcall.declare.Declare; import kr.co.icontrols.wallpadcall.declare.Global; import kr.co.icontrols.wallpadcall.declare.Global.BOARD_TYPE; import kr.co.icontrols.wallpadcall.declare.Global.CALLACTION; import kr.co.icontrols.wallpadcall.declare.Global.CALLDIRECTION; import kr.co.icontrols.wallpadcall.declare.Global.CALLRESULT; import kr.co.icontrols.wallpadcall.declare.Global.ConfigValues; import kr.co.icontrols.wallpadcall.declare.ID; import kr.co.icontrols.wallpadsupport.WpadImageView; import kr.co.icontrols.wallpadsupport.WpadImageView.TOUCH_KIND; import kr.co.icontrols.wallpadsupport.WpadScale; import kr.co.icontrols.wallpadsupport.WpadScreen; import kr.co.icontrols.wallpadsupport.WpadSound.SND; import kr.co.icontrols.wallpadsupport.WpadTextView; public class TalkPSTN extends WpadScreen implements CallEventListener, DTMFEventListener, MainEventListener { private final String TAG = "TalkPSTN"; boolean bLOG = true; private void LOG(String log) { if (bLOG) Log.v(TAG, log); } boolean bLOG_DEBUG = false; private void LOG_DEBUG(String log) { if (bLOG_DEBUG) Log.d(TAG, log); } boolean bLOG_INFO = true; private void LOG_INFO(String log) { if (bLOG_INFO) Log.i(TAG, log); } boolean bLOG_WARN = true; private void LOG_WARN(String log) { if (bLOG_WARN) Log.w(TAG, log); } WpadImageView SCREEN_BG; WpadImageView IMG_PSTN_BACKGROUND; WpadImageView IMG_VOLUME; WpadImageView BTN_TALK; public static WpadImageView BTN_END; WpadImageView BTN_REDIAL; WpadImageView BTN_DELETE; WpadImageView[] BTN_TENKEY = new WpadImageView[12]; int[][] TENKEYS = { {R.drawable.btn_num_1_normal, R.drawable.btn_num_1_pressed}, {R.drawable.btn_num_2_normal, R.drawable.btn_num_2_pressed}, {R.drawable.btn_num_3_normal, R.drawable.btn_num_3_pressed}, {R.drawable.btn_num_4_normal, R.drawable.btn_num_4_pressed}, {R.drawable.btn_num_5_normal, R.drawable.btn_num_5_pressed}, {R.drawable.btn_num_6_normal, R.drawable.btn_num_6_pressed}, {R.drawable.btn_num_7_normal, R.drawable.btn_num_7_pressed}, {R.drawable.btn_num_8_normal, R.drawable.btn_num_8_pressed}, {R.drawable.btn_num_9_normal, R.drawable.btn_num_9_pressed}, {R.drawable.btn_num_star_normal, R.drawable.btn_num_star_pressed}, {R.drawable.btn_num_0_normal, R.drawable.btn_num_0_pressed}, {R.drawable.btn_num_sharp_normal, R.drawable.btn_num_sharp_pressed} }; WpadTextView TXT_PSTNINFO; WpadTextView TXT_INSTRUCTION; // 안내문구 WallPadAPI mWallPadAPI; SeekBar SEEKBAR_VOLUME; WpadTextView TXT_VOLUME_LEVEL; int KEYBALANCE = 15203; public static int nCurrentVolume = 0; int MAXLENGTH_CALLNO = 30; boolean bPSTNDialed = false; static boolean bPSTNCalled = false; // V40 BOARD일 때 PSTN 발신시 DTMF -> PSTN 통화패스로 변경하기 위한 플래그 (수신인 경우에만 바로 PSTN 패스로 설정) String HIDE_CID = "P"; String NO_CID = "NONE"; String strMent_NoCID = "전화가\n왔습니다."; String strMent_HideCID = "발신번호제한"; String strMent_InputCall = "번호를\n 입력하세요."; String strMent_IncommingCall = "수신중"; String strMent_TalkingCall = "통화중"; String strTXT_PSTNNO = ""; String strTXT_PSTNINFO = ""; String strTXT_INSTRUCTION = strMent_InputCall; public static boolean bBLOCK_PSTNEND = false; boolean bBLOCK_DIAL = false; boolean bBLOCK_TALK = false; // 통화종료시 통화 버튼을 비활성화 하기 위하여 Context mContext; public TalkPSTN(Context context, RelativeLayout layout, WallPadAPI wallpadapi) { super(context, layout); try { mContext = context; mWallPadAPI = wallpadapi; Initialize(); SCREEN_BG = new WpadImageView(context, TOUCH_KIND.NONE, 1280, 690, R.drawable.bg_body, R.drawable.bg_body, ID.SCREEN.TALKPSTN.ELEMENT.IMAGE.BG); ViewRegistration(layout, SCREEN_BG, 0, 0); IMG_PSTN_BACKGROUND = new WpadImageView(context, TOUCH_KIND.NONE, 724, 544, R.drawable.bg_pstn, 0, ID.SCREEN.TALKPSTN.ELEMENT.IMAGE.BACKGROUND); ViewRegistration(layout, IMG_PSTN_BACKGROUND, Common.ImgPosition.GetX(142), Common.ImgPosition.GetY(110)); IMG_VOLUME = new WpadImageView(context, TOUCH_KIND.NONE, 40, 40, R.drawable.bar_icon_sound, 0, ID.SCREEN.TALKPSTN.ELEMENT.IMAGE.VOLUME); ViewRegistration(layout, IMG_VOLUME, Common.ImgPosition.GetX(454), Common.ImgPosition.GetY(707)); TXT_VOLUME_LEVEL = new WpadTextView(context, false, 40, 40, Gravity.CENTER, Color.WHITE, Common.fontsize._30, false, ID.SCREEN.TALKPSTN.ELEMENT.TEXT.VOLUME_LEVEL); ViewRegistration(layout, TXT_VOLUME_LEVEL, Common.ImgPosition.GetX(785), Common.ImgPosition.GetY(705)); if (WpadScale.getWidthPixels() == WpadScale.DEFAULT_WIDTH_PIXELS) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout volumeLayout = (LinearLayout) inflater.inflate(R.layout.volume_seekbar_1280, null); LayoutParams volumeParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); int volMarginLeft = WpadScale.getWidth(Common.ImgPosition.GetX(507)); int volMarginTop = WpadScale.getHeight(Common.ImgPosition.GetY(707)); volumeParams.setMargins(volMarginLeft, volMarginTop, 0, 0); volumeLayout.setLayoutParams(volumeParams); SEEKBAR_VOLUME = (SeekBar) volumeLayout.findViewById(R.id.volumeSeekBar); SEEKBAR_VOLUME.setMax(100); SEEKBAR_VOLUME.setOnSeekBarChangeListener(mOnVolumeChangeListener); layout.addView(volumeLayout); } else { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout volumeLayout = (LinearLayout) inflater.inflate(R.layout.volume_seekbar, null); LayoutParams volumeParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); int volMarginLeft = WpadScale.getWidth(Common.ImgPosition.GetX(502)); int volMarginTop = WpadScale.getHeight(Common.ImgPosition.GetY(703)); volumeParams.setMargins(volMarginLeft, volMarginTop, 0, 0); volumeLayout.setLayoutParams(volumeParams); SEEKBAR_VOLUME = (SeekBar) volumeLayout.findViewById(R.id.volumeSeekBar); SEEKBAR_VOLUME.setMax(100); SEEKBAR_VOLUME.setOnSeekBarChangeListener(mOnVolumeChangeListener); layout.addView(volumeLayout); } int nTenKeyGuide_X = Common.ImgPosition.GetX(460); int nTenKeyGuide_Y = Common.ImgPosition.GetY(112); int nIDCnt = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { BTN_TENKEY[nIDCnt] = new WpadImageView(context, TOUCH_KIND.BUTTON, 132, 132, TENKEYS[nIDCnt][0], TENKEYS[nIDCnt][1], ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_01 + nIDCnt); ViewRegistration(layout, BTN_TENKEY[nIDCnt], nTenKeyGuide_X, nTenKeyGuide_Y); nTenKeyGuide_X += 136; nIDCnt++; } nTenKeyGuide_X = Common.ImgPosition.GetX(460); nTenKeyGuide_Y += 136; } //오른 3개(통화/종료/재다이얼) 이미지 적용 BTN_TALK = new WpadImageView(context, TOUCH_KIND.BUTTON, 230, 181, R.drawable.btn_pstn_call_normal, R.drawable.btn_pstn_call_pressed, ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TALK); ViewRegistration(layout, BTN_TALK, Common.ImgPosition.GetX(908), Common.ImgPosition.GetY(110)); BTN_END = new WpadImageView(context, TOUCH_KIND.BUTTON, 230, 182, R.drawable.btn_pstn_end_normal, R.drawable.btn_pstn_end_pressed, ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.END); ViewRegistration(layout, BTN_END, Common.ImgPosition.GetX(908), Common.ImgPosition.GetY(291)); BTN_REDIAL = new WpadImageView(context, TOUCH_KIND.BUTTON, 230, 181, R.drawable.btn_pstn_recall_normal, R.drawable.btn_pstn_recall_pressed, ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.REDIAL); ViewRegistration(layout, BTN_REDIAL, Common.ImgPosition.GetX(908), Common.ImgPosition.GetY(473)); BTN_DELETE = new WpadImageView(context, TOUCH_KIND.BUTTON_LC, 312, 132, R.drawable.btn_num_del_normal, R.drawable.btn_num_del_pressed, ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.DELETE); ViewRegistration(layout, BTN_DELETE, Common.ImgPosition.GetX(144), Common.ImgPosition.GetY(520)); TXT_PSTNINFO = new WpadTextView(context, false, 292, 304, Gravity.LEFT, context.getResources().getColor(R.color.orange), Common.fontsize._46, false, ID.SCREEN.TALKPSTN.ELEMENT.TEXT.PSTNINFO); ViewRegistration(layout, TXT_PSTNINFO, Common.ImgPosition.GetX(155), Common.ImgPosition.GetY(111)); TXT_PSTNINFO.setText(strTXT_PSTNINFO); TXT_INSTRUCTION = new WpadTextView(context, false, 285, 364, Gravity.CENTER, context.getResources().getColor(R.color.orange), Common.fontsize._54, true, ID.SCREEN.TALKPSTN.ELEMENT.TEXT.INSTRUCTION); ViewRegistration(layout, TXT_INSTRUCTION, Common.ImgPosition.GetX(153), Common.ImgPosition.GetY(255)); TXT_INSTRUCTION.setText(strTXT_INSTRUCTION); displayScreenValues(); sendHandlerMsg(HANDLERMSG.PROC_ADDCALL, 0, 0); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] ScreenTALKPSTN(Context context, RelativeLayout layout)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } protected void Initialize() { try { LOG_INFO("[Initialize]"); if (MainActivity.mCallController.mCallInfo.getPSTN() != CALLSTATUS.IDLE) ((MainActivity) mContext).setMenuBTNEnable(false); else ((MainActivity) mContext).setMenuBTNEnable(true); MainActivity.mCallController.setCallEventListener(this); ((MainActivity) mContext).setMainEventListener(this); int mMarginLeft = ((MainActivity) mContext).TopBackBtn.getVisibility() == View.VISIBLE ? 893 : 1019; ((MainActivity) mContext).setManualBtnVisible(((MainActivity) mContext).getManualUse(), mMarginLeft); ((MainActivity) mContext).setTopHideBtnVisible(true); super.setFinishTimerCreate(Common.FINISH_TIME_START_SCREEN); getVolume(); resetRingCnt(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] Initialize()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override protected void onClose() { super.onClose(); try { LOG_INFO("[onClose]"); if (MainActivity.mIOInterface != null) MainActivity.mIOInterface.ctrlWallPadLED_Call(false); if (mPathCheckHandler != null) { mPathCheckHandler.removeMessages(0); mPathCheckHandler.removeMessages(1); } bPSTNCalled = false; MainActivity.mCallController.releaseCallEventListener(); MainActivity.mCallController.releaseDTMFEventListener(); ((MainActivity) mContext).releaseMainEventListener(); if (!MainActivity.mCallController.mCallInfo.getPSTNCallHold()) MainActivity.mPSTNController.sendHookOff(); //Global.add1stCallHistoryInfoFinal(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onClose()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override protected void onBrReceive(Intent intent) { super.onBrReceive(intent); try { LOG_INFO("[onBrReceive] intent : " + intent); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onBrReceive()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override protected void onTouchEvent(View v, MotionEvent event) { super.onTouchEvent(v, event); try { int nEvent = event.getAction(); int nID = v.getId(); // Log.d(TAG, "[onTouchEvent] nEvent [" + nEvent + "], nID [" + nID + "]"); if (nEvent == MotionEvent.ACTION_UP) { if (ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TALK <= nID && nID <= ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_SHARP) { if (nID == ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TALK) { if (MainActivity.mCallController.mCallInfo.getPSTN() != CALLSTATUS.TALKING) MainActivity.mSound.Play(SND.effect.TOUCH_LATCHED); LOG_INFO("[onTouchEvent] [TALK] BUTTON"); doTalk(CALLOWNER.WALLPAD); } else if (nID == ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.END) { if (MainActivity.mCallController.mCallInfo.getPSTN() != CALLSTATUS.TALKING) MainActivity.mSound.Play(SND.effect.TOUCH_LATCHED); LOG_INFO("[onTouchEvent] [END] BUTTON"); doEnd(); } else if (nID == ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.REDIAL) { if (MainActivity.mCallController.mCallInfo.getPSTN() != CALLSTATUS.TALKING) MainActivity.mSound.Play(SND.effect.TOUCH_LATCHED); LOG_INFO("[onTouchEvent] [REDIAL] BUTTON"); redialPSTN(); } else if (nID == ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.DELETE) { if (MainActivity.mCallController.mCallInfo.getPSTN() != CALLSTATUS.TALKING) MainActivity.mSound.Play(SND.effect.TOUCH_LATCHED); LOG_INFO("[onTouchEvent] [DELETE] BUTTON"); if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.IDLE) { deletePSTNInfo(); } } else if (ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_01 <= nID && nID <= ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_09) { int nPressedNum = nID - KEYBALANCE; if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.IDLE) { if (strTXT_PSTNNO.length() >= MAXLENGTH_CALLNO) { MainActivity.mSound.Play(SND.effect.WARNING005); return; } strTXT_PSTNNO += nPressedNum; if (strTXT_PSTNNO.length() > MAXLENGTH_CALLNO) strTXT_PSTNNO.substring(1, 40); updateScreen(); playTenkeyNo(nID); } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.TALKING) { strTXT_PSTNNO += nPressedNum; MainActivity.mPSTNController.sendDTMF(Integer.toString(nPressedNum)); updateScreen(); } } else if (nID == ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_00) { if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.IDLE) { if (strTXT_PSTNNO.length() >= MAXLENGTH_CALLNO) { MainActivity.mSound.Play(SND.effect.WARNING005); return; } strTXT_PSTNNO += "0"; updateScreen(); playTenkeyNo(nID); } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.TALKING) { strTXT_PSTNNO += "0"; MainActivity.mPSTNController.sendDTMF("0"); updateScreen(); } } else if (nID == ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_STAR) { if (MainActivity.mCallController.mCallInfo.getPSTN() != CALLSTATUS.TALKING) MainActivity.mSound.Play(SND.effect.TOUCH_LATCHED); if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.IDLE) { if (strTXT_PSTNNO.length() >= MAXLENGTH_CALLNO) { MainActivity.mSound.Play(SND.effect.WARNING005); return; } strTXT_PSTNNO += "*"; updateScreen(); } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.TALKING) { strTXT_PSTNNO += "*"; MainActivity.mPSTNController.sendDTMF("*"); updateScreen(); } } else if (nID == ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_SHARP) { if (MainActivity.mCallController.mCallInfo.getPSTN() != CALLSTATUS.TALKING) MainActivity.mSound.Play(SND.effect.TOUCH_LATCHED); if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.IDLE) { if (strTXT_PSTNNO.length() >= MAXLENGTH_CALLNO) { MainActivity.mSound.Play(SND.effect.WARNING005); return; } strTXT_PSTNNO += "#"; updateScreen(); } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.TALKING) { strTXT_PSTNNO += "#"; MainActivity.mPSTNController.sendDTMF("#"); updateScreen(); } } } } else if (nEvent == MotionEvent.ACTION_POINTER_DOWN) { if (nID == ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.DELETE) { LOG_INFO("[onTouchEvent] [DELETE] BUTTON"); if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.IDLE) { MainActivity.mSound.Play(SND.effect.TOUCH_LATCHED); strTXT_PSTNNO = ""; updateScreen(); } else { LOG_WARN("[onTouchEvent] Call Status is not IDLE!!!"); } } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onTouchEvent(View v, MotionEvent event)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override public void onMainTouchEvent(MAINEVENT eEvent) { try { LOG_INFO("[onMainTouchEvent] eEvent [" + eEvent + "]"); if (eEvent == MAINEVENT.BTN_HOME) { if (MainActivity.mCallController.mCallInfo.getPSTN() != CALLSTATUS.TALKING) Sound().Play(SND.effect.TOUCH_LATCHED); if (bBLOCK_PSTNEND || bBLOCK_DIAL) return; finishPSTN(); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onMainTouchEvent(MAINEVENT eEvent)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override protected void onKeyDown(int keyCode, KeyEvent event) { LOG_INFO("[onKeyDown] keyCode [" + keyCode + "], event.getAction() [" + event.getAction() + "]"); if (keyCode == Declare.BTN.TALK || keyCode == Declare.BTN.TALK_V40) { updateScreen(); if (bBLOCK_PSTNEND || bBLOCK_DIAL) return; if (((MainActivity) mContext).bBlockHomeBTN) return; doTalkByBTN(CALLOWNER.WALLPAD); } else if (Declare.BTN.ARS_NO_0 <= keyCode && keyCode <= Declare.BTN.ARS_NO_9) { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.PSTN_DTMF, null, Integer.toString((keyCode - 7))); } if (keyCode == Declare.BTN.ARS_STAR_V40) { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.PSTN_DTMF, null, "*"); } else if (keyCode == Declare.BTN.ARS_SHARP_V40) { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.PSTN_DTMF, null, "#"); } super.onKeyDown(keyCode, event); } @Override public void onCallEvent(CALLOWNER eCallOwner, CALLSTATUS eCallStatus, CALLTYPE eCallType, String strRemoteIP, String strRemoteSIPID, String strMessage) { try { LOG_INFO("[onCallEvent] eCallOwner [" + eCallOwner + "], eCallStatus [" + eCallStatus + "], eCallType [" + eCallType + "], strRemoteIP [" + strRemoteIP + "], strRemoteSIPID [" + strRemoteSIPID + "], strMessage [" + strMessage + "]"); if (eCallType == CALLTYPE.PSTN) { if (eCallStatus == CALLSTATUS.CALLERID) { if (strRemoteSIPID.equals(NO_CID)) strTXT_PSTNNO = strMent_NoCID; else if (strRemoteSIPID.equals(HIDE_CID)) strTXT_PSTNNO = strMent_HideCID; else strTXT_PSTNNO = strRemoteSIPID; updateScreen(); Global.change1stCallLogSIPID(CALLTYPE.PSTN.toString() + ":" + strTXT_PSTNNO); } else if (eCallStatus == CALLSTATUS.TRYING_CALL) { doAutoCall(); } else if (eCallStatus == CALLSTATUS.CALLING) { } else if (eCallStatus == CALLSTATUS.PSTN_RING) { checkARSActivate(); } else if (eCallStatus == CALLSTATUS.CALLED) { bPSTNCalled = true; resetRingCnt(); Global.playMelodyRepeat(eCallType); super.setFinishTimerDestroy(); if (strRemoteSIPID.equals(NO_CID)) strTXT_PSTNNO = strMent_NoCID; else if (strRemoteSIPID.equals(HIDE_CID)) strTXT_PSTNNO = strMent_HideCID; else strTXT_PSTNNO = strRemoteSIPID; updateScreen(); //Global.make1stCallHistoryInfo(CALLTYPE.PSTN.toString(), strRemoteSIPID, CALLDIRECTION.IN, CALLACTION.MISS, CALLRESULT.IN_MISS); } else if (eCallStatus == CALLSTATUS.TALKING) { super.setFinishTimerDestroy(); Global.stopMelodyRepeat(); if (eCallOwner != CALLOWNER.WALLPAD) { ((MainActivity) mContext).StartPopup(ID.POPUP.POPUP_NOTICE_SUBPHONETALK); // 통화패스를 바로열면 PSTN 벨소리가 잡음으로 들린다. 이를 방지하기 위해 1초뒤에 통화패스를 연다. sendHandlerMsgDelayed(HANDLERMSG.SET_CALLPATH_PSTN_SUBPHONE, 0, 0, 1000); } else { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) { ((MainActivity) mContext).sendHandlerMsg(MainActivity.HANDLERMSG.SET_TEMPSYSTEM_VOLUME, 0, 0);// 통화 중 임의 볼륨값 설정 -> IHN-1010모델 PSTN에서는 DTMF 전송 볼륨 때문에 X } if (nCurrentARSSTATE != ARS_STATE.NONE) { sendHandlerMsgDelayed(HANDLERMSG.SET_CALLPATH_PSTN_ARS, 0, 0, 1000); } else { LOG("[onCallEvent] ConfigValues.DEVICE_BOARDTYPE [" + ConfigValues.DEVICE_BOARDTYPE + "]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) { sendHandlerMsgDelayed(HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD, 0, 0, 500); // PSTN 통화패스 변경 } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) { sendHandlerMsgDelayed(HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD, 0, 0, 500); // PSTN 통화패스 변경 } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40) { ((MainActivity) mContext).sendHandlerMsg(MainActivity.HANDLERMSG.SET_DTMF_VOLUME, 0, 0);// 통화 중 DTMF 볼륨값 설정 -> 11 (2019.02.08 김명준선임 요청) if (bPSTNCalled) { sendHandlerMsgDelayed(HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD, 0, 0, 0); bPSTNDialed = false; } } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { ((MainActivity) mContext).sendHandlerMsg(MainActivity.HANDLERMSG.SET_DTMF_VOLUME, 0, 0);// 통화 중 DTMF 볼륨값 설정 -> 11 (2019.02.08 김명준선임 요청) LOG("[onCallEvent] bPSTNCalled [" + bPSTNCalled +"]"); if (bPSTNCalled) sendHandlerMsgDelayed(HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD, 0, 0, 500); } else { if (bPSTNDialed) { // A20의 경우 MIC가 예민해서 DTMF 다이얼링 중 MIC가 켜져있으면 DTMF 소리가 찌그러지는 현상이 있어서, // 다이얼링이 끝난 후, MIC를 켬 LOG_INFO("[onCallEvent] bPSTNDialed [" + bPSTNDialed + "]"); sendHandlerMsgDelayed(HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD_SPEAKER, 0, 0, 500); sendHandlerMsgDelayed(HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD_MIC, 0, 0, nPathOpenDelayTime); bPSTNDialed = false; } else { sendHandlerMsgDelayed(HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD, 0, 0, 500); } } } } Global.change1stCallLogAction(CALLACTION.TALK); mPathCheckHandler.sendEmptyMessage(0); // CallPath 변경 후 Volume Setting setOnCallLED(); } else if (eCallStatus == CALLSTATUS.END) { bPSTNCalled = false; bBLOCK_TALK = true; resetPathHandler(); resetRingCnt(); MainActivity.mSound.StopRepeat(); MainActivity.mCallController.setTalkPath(CALLPATH.NORMAL); MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); initPSTNInfo(); updateScreen(); //Global.add1stCallHistoryInfoFinal(); setOffCallLED(); MainActivity.mCallController.MultiCallScenarioManager(); } else if (eCallStatus == CALLSTATUS.CANCEL) { bPSTNCalled = false; bBLOCK_TALK = true; resetPathHandler(); MainActivity.mCallController.setTalkPath(CALLPATH.NORMAL); MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); initPSTNInfo(); updateScreen(); setOffCallLED(); MainActivity.mCallController.MultiCallScenarioManager(); } else if (eCallStatus == CALLSTATUS.REJECT) { bPSTNCalled = false; bBLOCK_TALK = true; resetPathHandler(); MainActivity.mCallController.setTalkPath(CALLPATH.NORMAL); MainActivity.mSound.PlayMent(SND.call.BUSY_TRY_LATER); MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); initPSTNInfo(); updateScreen(); setOffCallLED(); } else if (eCallStatus == CALLSTATUS.BUSY) { bPSTNCalled = false; bBLOCK_TALK = true; MainActivity.mCallController.setTalkPath(CALLPATH.NORMAL); MainActivity.mSound.PlayMent(SND.call.BUSY_TRY_LATER); MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); initPSTNInfo(); updateScreen(); } } else { onMultiCallEvent(eCallOwner, eCallStatus, eCallType, strRemoteIP, strRemoteSIPID, strMessage); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onCallEvent(CALLSTATUS eCallStatus, CALLTYPE eCallType, String strRemoteIP, String strRemoteSIPID, String strMessage)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void onMultiCallEvent(CALLOWNER eCallOwner, CALLSTATUS eCallStatus, CALLTYPE eCallType, String strRemoteIP, String strRemoteSIPID, String strMessage) { try { LOG_INFO("[onMultiCallEvent] eCallOwner [" + eCallOwner + "], eCallStatus [" + eCallStatus + "], eCallType [" + eCallType + "], strRemoteIP [" + strRemoteIP + "], strRemoteSIPID [" + strRemoteSIPID + "], strMessage [" + strMessage + "]"); MainActivity.mCallController.mCallInfo.printCallStatus(); MainActivity.mCallController.mCallInfo.printMultiCallStatus(); if (eCallStatus == CALLSTATUS.CALLED) { if (eCallType == CALLTYPE.FRONT) { playFrontCamBell(true); if (MainActivity.mCallController.mCallInfo.getMultiCallStatus() == CALLSTATUS.IDLE) { // 멀티콜 없음 MainActivity.mCallController.set2ndCallTimer(eCallType, MainActivity.mCallController.mCTT.CALLED); MultiCallInfo MCInfo = new MultiCallInfo(); MCInfo.setMulticallInfo(CALLTYPE.PSTN, eCallType, eCallStatus, CALLOWNER.NONE, strRemoteSIPID, "", "", "세대현관", strRemoteIP); MainActivity.mCallController.mCallInfo.setMultiCallInfo(MCInfo); //Global.make2ndCallHistoryInfo(eCallType.toString(), NO_CID, CALLDIRECTION.IN, CALLACTION.MISS, CALLRESULT.IN_MISS); // ((MainActivity) (getContext())).startMultiCallPopup(ID.POPUP.POPUP_MULTICALL_VIDEO); // 멀티콜영상 팝업은 임시로 안나오게 설정 TODO 추후수정 ((MainActivity) (getContext())).startMultiCallPopup(ID.POPUP.POPUP_MULTICALL); } else { // 멀티콜 있음 sendHandlerMsgDelayed(HANDLERMSG.OFF_FRONT, 0, 0, 2000); MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); return; } } else if (eCallType == CALLTYPE.LOBBY || eCallType == CALLTYPE.GUARD || eCallType == CALLTYPE.RESIDENCE) { if (MainActivity.mCallController.mCallInfo.getMultiCallStatus() == CALLSTATUS.IDLE) { // 멀티콜 없음 MainActivity.mCallController.set2ndCallTimer(eCallType, MainActivity.mCallController.mCTT.CALLED); MultiCallInfo MCInfo = new MultiCallInfo(); MCInfo.setMulticallInfo(CALLTYPE.PSTN, eCallType, eCallStatus, CALLOWNER.NONE, strRemoteSIPID, Integer.toString(MainActivity.mCallController.getRemoteDong(strRemoteSIPID)), Integer.toString(MainActivity.mCallController.getRemoteID(strRemoteSIPID)), MainActivity.mCallController.getRemoteName(strRemoteSIPID, strRemoteIP), strRemoteIP); MainActivity.mCallController.mCallInfo.setMultiCallInfo(MCInfo); //Global.make2ndCallHistoryInfo(strRemoteIP, strRemoteSIPID, CALLDIRECTION.IN, CALLACTION.MISS, CALLRESULT.IN_MISS); ((MainActivity) (getContext())).startMultiCallPopup(ID.POPUP.POPUP_MULTICALL); } else { // 멀티콜 있음 if (eCallType == CALLTYPE.FRONT) playFrontCamBell(false); else if (eCallType == CALLTYPE.LOBBY || eCallType == CALLTYPE.GUARD || eCallType == CALLTYPE.RESIDENCE) { CALLTYPE eMulticallType = MainActivity.mCallController.mCallInfo.getMultiCallType(); if (eMulticallType == CALLTYPE.LOBBY || eMulticallType == CALLTYPE.GUARD || eMulticallType == CALLTYPE.RESIDENCE) { MainActivity.mCallController.rejectMoIPMultiCall(); } else { MainActivity.mCallController.rejectBusyMoIPCall(); } } MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); } } else if (eCallType == CALLTYPE.PSTN) { if (MainActivity.mCallController.mCallInfo.getMultiCallStatus() == CALLSTATUS.IDLE) { // 멀티콜 없음 MultiCallInfo MCInfo = new MultiCallInfo(); MCInfo.setMulticallInfo(CALLTYPE.PSTN, eCallType, eCallStatus, CALLOWNER.NONE, strRemoteSIPID, "", "", MainActivity.mCallController.mCallInfo.getMultiCall_Name(), strRemoteIP); MainActivity.mCallController.mCallInfo.setMultiCallInfo(MCInfo); //Global.make2ndCallHistoryInfo(strRemoteIP, strRemoteSIPID, CALLDIRECTION.IN, CALLACTION.MISS, CALLRESULT.IN_MISS); ((MainActivity) (getContext())).startMultiCallPopup(ID.POPUP.POPUP_MULTICALL); } else { // 멀티콜 있음 // 기존 멀티콜을 거절하고, 국선을 멀티콜로 설정한다. CALLTYPE eMulticallType = MainActivity.mCallController.mCallInfo.getMultiCallType(); if (eMulticallType == CALLTYPE.FRONT) playFrontCamBell(false); else if (eMulticallType == CALLTYPE.LOBBY || eMulticallType == CALLTYPE.GUARD || eMulticallType == CALLTYPE.RESIDENCE) MainActivity.mCallController.rejectMoIPMultiCall(); else LOG_WARN("[onMultiCallEvent] Invalid eMulticallType [" + eMulticallType + "]"); MainActivity.mCallController.mCallInfo.resetMultiCallInfo(); MainActivity.mCallController.stop2ndCallTimer(); //Global.add2ndCallHistoryInfo(CALLRESULT.IN_MISS); LOG_WARN("[onMultiCallEvent] Another multicall is processing. Change multicall to PSTN multicall!!"); MultiCallInfo MCInfo = new MultiCallInfo(); MCInfo.setMulticallInfo(CALLTYPE.PSTN, eCallType, eCallStatus, CALLOWNER.NONE, strRemoteSIPID, "", "", NO_CID, strRemoteIP); MainActivity.mCallController.mCallInfo.setMultiCallInfo(MCInfo); //Global.make2ndCallHistoryInfo(eCallType.toString(), NO_CID, CALLDIRECTION.IN, CALLACTION.MISS, CALLRESULT.IN_MISS); MainActivity.mCallController.mPopupEventListener.onMulticallChange(eCallType, eCallStatus, ""); } } else { LOG_WARN("[onMultiCallEvent] Invalid CallType [" + eCallType + "]"); } } else if (eCallStatus == CALLSTATUS.CALLERID) { MainActivity.mCallController.mCallInfo.updateMultiCallName(strRemoteSIPID); Global.change2ndCallLogSIPID(CALLTYPE.PSTN.toString() + ":" + strRemoteSIPID); } else if (eCallStatus == CALLSTATUS.END) { MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); if (MainActivity.mCallController.mCallInfo.getMultiCallType() == eCallType) { if (MainActivity.mCallController.mPopupEventListener != null) MainActivity.mCallController.mPopupEventListener.onMulticallChange(eCallType, eCallStatus, ""); MainActivity.mCallController.mCallInfo.resetMultiCallInfo(); MainActivity.mCallController.stop2ndCallTimer(); //Global.add2ndCallHistoryInfo(CALLRESULT.IN_MISS); ((MainActivity) (getContext())).finishPopUp(ID.POPUP.POPUP_MULTICALL); } else LOG_WARN("[onMultiCallEvent] Invalid CallType [" + eCallType + "]"); } else if (eCallStatus == CALLSTATUS.CANCEL) { MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); if (MainActivity.mCallController.mCallInfo.getMultiCallType() == eCallType) { if (MainActivity.mCallController.mPopupEventListener != null) MainActivity.mCallController.mPopupEventListener.onMulticallChange(eCallType, eCallStatus, ""); MainActivity.mCallController.mCallInfo.resetMultiCallInfo(); MainActivity.mCallController.stop2ndCallTimer(); //Global.add2ndCallHistoryInfo(CALLRESULT.IN_REJECT); ((MainActivity) (getContext())).finishPopUp(ID.POPUP.POPUP_MULTICALL); } } else if (eCallStatus == CALLSTATUS.TIMEOUT_2NDCALL) { // 거동수상자 녹화기능 수정중 (추후 동작상태보고 수정) // if (eCallType == CALLTYPE.FRONT_RECORD) { // // [스마트현관카메라] 거동수상자 녹화 팝업 미선택시 녹화 시작 // ((MainActivity) mContext).finishPopUp(ID.POPUP.POPUP_MULTICALL_RECORD); // MainActivity.mCallController.stop2ndCallTimer(); // doMultiCallAccept(); // } else { // if (MainActivity.mCallController.mPopupEventListener != null) // MainActivity.mCallController.mPopupEventListener.onMulticallChange(eCallType, eCallStatus, ""); // doMultiCallReject(false); // Global.add2ndCallHistoryInfo(CALLRESULT.IN_MISS); // MainActivity.mCallController.mCallInfo.resetMultiCallInfo(); // MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); // ((MainActivity) (getContext())).finishPopUp(ID.POPUP.POPUP_MULTICALL); // } if (MainActivity.mCallController.mPopupEventListener != null) MainActivity.mCallController.mPopupEventListener.onMulticallChange(eCallType, eCallStatus, ""); doMultiCallReject(false); //Global.add2ndCallHistoryInfo(CALLRESULT.IN_MISS); MainActivity.mCallController.mCallInfo.resetMultiCallInfo(); MainActivity.mCallController.mCallInfo.setCallStatus(eCallType, CALLSTATUS.IDLE); ((MainActivity) (getContext())).finishPopUp(ID.POPUP.POPUP_MULTICALL); } else { LOG_WARN("[onMultiCallEvent] Invalid CallStatus [" + eCallStatus + "]"); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onMultiCallEvent(CALLOWNER eCallOwner, CALLSTATUS eCallStatus, CALLTYPE eCallType, String strRemoteIP, String strRemoteSIPID, String strMessage)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override public void onSubPhoneEvent(CALLOWNER eCallOwner, CALLSTATUS eCallStatus, CALLTYPE eCallType, String strTargetID, String strMessage) { try { LOG_INFO("[onSubPhoneEvent] eCallOwner [" + eCallOwner + "], eCallStatus [" + eCallStatus + "], eCallType [" + eCallType + "], strTargetID [" + strTargetID + "], strMessage [" + strMessage + "]"); if (eCallType == CALLTYPE.NONE) return; if (eCallType == CALLTYPE.PSTN) { if (eCallStatus == CALLSTATUS.TALKING) { if (eCallOwner != CALLOWNER.WALLPAD) { doTalk(eCallOwner); } else { MainActivity.mCallController.setTalkPath(CALLPATH.SUBPHONE_MOIP); } } else if (eCallStatus == CALLSTATUS.END) { if (eCallOwner != CALLOWNER.WALLPAD) { doEnd(); } } else { Log.w(TAG, "[onSubPhoneEvent] Incorrect eCallStatus!!! eCallStatus = " + eCallStatus); } } else { Log.w(TAG, "[onSubPhoneEvent] Incorrect eCallType!!! eCallType = " + eCallType); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onSubPhoneEvent(CALLOWNER eCallOwner, CALLSTATUS eCallStatus, CALLTYPE eCallType, String strMessage)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override public void onVideoSet(boolean bSet, String strRemoteSIPID) { try { LOG_INFO("[onVideoSet] bSet [" + bSet + "], strRemoteSIPID [" + strRemoteSIPID + "]"); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onVideoSet(boolean bSet, String strRemoteSIPID)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override public void onShowRemoteVideo(boolean bShow) { try { LOG_INFO("[onShowRemoteVideo] bShow [" + bShow + "]"); if (MainActivity.mCallController.mPopupEventListener != null) MainActivity.mCallController.mPopupEventListener.onShowPopupRemoteVideo(bShow); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onShowRemoteVideo(boolean bShow)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override protected void onPopupResult(Intent data) { try { int nScreen = data.getIntExtra("SCREEN", -1); int nID = data.getIntExtra("POPUP_BTN", -1); if (nScreen == ID.POPUP.POPUP_MULTICALL) { if (nID == ID.POPUP.MUTICALL.ELEMENT.BUTTON.ACCEPT) { LOG_INFO("[onPopupResult] ID.POPUP.MUTICALL.ELEMENT.BUTTON.ACCEPT"); MainActivity.mCallController.stop2ndCallTimer(); doMultiCallAccept(); } else if (nID == ID.POPUP.MUTICALL.ELEMENT.BUTTON.REJECT) { LOG_INFO("[onPopupResult] ID.POPUP.MUTICALL.ELEMENT.BUTTON.REJECT"); MainActivity.mCallController.stop2ndCallTimer(); doMultiCallReject(true); // if (MainActivity.mCallController.mCallInfo.getCalledCnt() > 0) { // Global.playMelodyRepeat(MainActivity.mCallController.mCallInfo.getCalledType()); // } } } else if (nScreen == ID.POPUP.POPUP_MULTICALL_VIDEO) { if (nID == ID.POPUP.MULTICALL_VIDEO.ELEMENT.BUTTON.ACCEPT) { LOG_INFO("[onPopupResult] ID.POPUP.MULTICALL_VIDEO.ELEMENT.BUTTON.ACCEPT"); MainActivity.mCallController.stop2ndCallTimer(); doMultiCallAccept(); } else if (nID == ID.POPUP.MULTICALL_VIDEO.ELEMENT.BUTTON.REJECT) { LOG_INFO("[onPopupResult] ID.POPUP.MULTICALL_VIDEO.ELEMENT.BUTTON.REJECT"); MainActivity.mCallController.stop2ndCallTimer(); doMultiCallReject(true); } else if (nID == ID.POPUP.MULTICALL_VIDEO.ELEMENT.BUTTON.DOOROPEN_FRONT) { LOG_INFO("[onPopupResult] ID.POPUP.MULTICALL_VIDEO.ELEMENT.BUTTON.DOOROPEN_FRONT"); MainActivity.mSound.PlayMent(SND.mode.OPENDOOR); MainActivity.mCallController.stop2ndCallTimer(); doMultiCallReject(false); } else if (nID == ID.POPUP.MULTICALL_VIDEO.ELEMENT.BUTTON.DOOROPEN_LOBBY) { LOG_INFO("[onPopupResult] ID.POPUP.MULTICALL_VIDEO.ELEMENT.BUTTON.DOOROPEN_LOBBY"); MainActivity.mCallController.mCallInfo.resetMultiCallInfo(); MainActivity.mCallController.mCallInfo.setCallStatus(CALLTYPE.LOBBY, CALLSTATUS.IDLE); } } else if (nScreen == ID.POPUP.POPUP_NOTICE_SUBPHONETALK) { if (nID == ID.POPUP.NOTICE_SUBPHONETALK.ELEMENT.BUTTON.END) { LOG_INFO("[onPopupResult] ID.POPUP.NOTICE_SUBPHONETALK.ELEMENT.BUTTON.END"); MainActivity.mCallController.stop2ndCallTimer(); doEnd(); } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onPopupResult(Intent data)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void doTalk(CALLOWNER eCallOwner) { try { MainActivity.mCallController.mCallInfo.printCallStatus(); MainActivity.mCallController.mCallInfo.printMultiCallStatus(); if (((MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.IDLE) || (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.TRYING_CALL)) && (strTXT_PSTNNO.length() != 0)) { doHookOnNDial(eCallOwner, strTXT_PSTNNO); String strPSTNInfo = CALLTYPE.PSTN.toString() + ":" + strTXT_PSTNNO; //Global.make1stCallHistoryInfo(strPSTNInfo, strPSTNInfo, CALLDIRECTION.OUT, CALLACTION.TALK, CALLRESULT.OUT_TALK); } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.CALLED) { MainActivity.mSound.StopRepeat(); doHookOn(eCallOwner); } updateScreen(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] doTalk(CALLOWNER eCallOwner)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void doTalkByBTN(CALLOWNER eCallOwner) { try { if ((MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.IDLE || MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.TRYING_CALL) && strTXT_PSTNNO.length() != 0) { doHookOnNDial(eCallOwner, strTXT_PSTNNO); String strPSTNInfo = CALLTYPE.PSTN.toString() + ":" + strTXT_PSTNNO; //Global.make1stCallHistoryInfo(strPSTNInfo, strPSTNInfo, CALLDIRECTION.OUT, CALLACTION.TALK, CALLRESULT.OUT_TALK); } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.CALLED) { MainActivity.mSound.StopRepeat(); doHookOn(eCallOwner); } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.TALKING) { doEnd(); } updateScreen(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] doTalkByBTN(CALLOWNER eCallOwner)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void doEnd() { try { CALLSTATUS ePSTNStatus = MainActivity.mCallController.mCallInfo.getPSTN(); LOG_INFO("[doEnd] ePSTNStatus [" + ePSTNStatus + "]"); if (ePSTNStatus == CALLSTATUS.IDLE) { MainActivity.mCallController.MultiCallScenarioManager(); } else if (ePSTNStatus == CALLSTATUS.CALLED) { rejectPSTN(); MainActivity.mSound.StopRepeat(); MainActivity.mCallController.MultiCallScenarioManager(); } else if (ePSTNStatus == CALLSTATUS.TALKING) { doHookOff(); MainActivity.mCallController.MultiCallScenarioManager(); } else if (ePSTNStatus == CALLSTATUS.END) { if (MainActivity.mCallController.mCallInfo.getCallOwner() != CALLOWNER.WALLPAD) { ((MainActivity) mContext).finishPopUp(ID.POPUP.POPUP_NOTICE_SUBPHONETALK); doHookOff(); MainActivity.mCallController.MultiCallScenarioManager(); } } updateScreen(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] doEnd()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void doHookOn(CALLOWNER eCallOwner) { try { LOG("[doHookOn]"); setMICMute(false); MainActivity.mPSTNController.sendHookOn(); MainActivity.mCallController.mCallInfo.setCallOwner(eCallOwner); MainActivity.mCallController.mCallInfo.setCallStatus(CALLTYPE.PSTN, CALLSTATUS.TALKING); MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.CONNECT_CALL, null, null); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] doHookOn()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void doHookOnNDial(CALLOWNER eCallOwner, String strTXT_PSTNNO) { try { LOG("[doHookOnNDial] eCallOwner [" + eCallOwner + "], strTXT_PSTNNO [" + strTXT_PSTNNO + "]"); bPSTNDialed = true; setPathOpenDelayTime(strTXT_PSTNNO); // Global.setWallPadVolume_V4O(nCurrentVolume); MainActivity.mCallController.mCallInfo.setCallOwner(eCallOwner); MainActivity.mPSTNController.sendHookOnNDialNo(strTXT_PSTNNO); MainActivity.mCallController.mCallInfo.setCallStatus(CALLTYPE.PSTN, CALLSTATUS.CALLING); MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.CONNECT_CALL, null, null); blockPSTNEnd(); blockDialBTN(false); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] doHookOnNDial(CALLOWNER eCallOwner, String strTXT_PSTNNO)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void blockPSTNTalk() { try { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { blockDialBTN(true); BTN_TALK.setButtonEventOffEnable(R.drawable.btn_pstn_call_disabled); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] blockPSTNTalk()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void blockPSTNEnd() { try { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { bBLOCK_PSTNEND = true; BTN_END.setButtonEventOffEnable(R.drawable.btn_pstn_end_disabled); ((MainActivity) mContext).TopHomeBtn.setButtonEventOffEnable(); // sendHandlerMsgDelayed(HANDLERMSG.RELEASE_PSTN_END_BLOCK, 0, 0, nPathOpenDelayTime); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] blockPSTNEnd()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void blockDialBTN(boolean bEnd) { try { bBLOCK_DIAL = true; for (int i = 0; i < BTN_TENKEY.length; i++) { // BTN_TENKEY[i].setButtonEventOffEnable(R.drawable.btn_num); BTN_TENKEY[i].setButtonEventOffEnable(); } if (!bEnd) sendHandlerMsgDelayed(HANDLERMSG.RELEASE_PSTN_DIAL_BLOCK, 0, 0, nPathOpenDelayTime); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] blockDialBTN(boolean bEnd)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void doHookOff() { try { LOG("[doHookOff]"); MainActivity.mPSTNController.sendHookOff(); MainActivity.mPSTNController.cancelSendDTMF(); MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.TERMINATE_CALL, null, null); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] doHookOff()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void rejectPSTN() { try { LOG("[rejectPSTN]"); MainActivity.mPSTNController.sendReject(); MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.CANCEL_CALL, null, null); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] rejectPSTN()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void redialPSTN() { try { LOG("[redialPSTN]"); // if (MainActivity.mCallController.mCallInfo.getPSTN() != CALLSTATUS.IDLE) { // MainActivity.mSound.PlayMent(SND.setting.RETRY_INPUT); // return; // } // // CallHistoryInfoTable InfoTable = new CallHistoryInfoTable(); // InfoTable.clearTable(); // InfoTable = MainActivity.mCallHistoryManager.getPSTNRedialInfo(); // if (InfoTable == null) { // MainActivity.mSound.PlayMent(SND.setting.RETRY_INPUT); // return; // } // // InfoTable.printValue(); // String strName = InfoTable.getCallHistoryInfo(0).getName(); // String[] strParsed = strName.split(":"); // strTXT_PSTNNO = strParsed[1].trim(); // // doHookOnNDial(CALLOWNER.WALLPAD, strTXT_PSTNNO); // updateScreen(); // String strPSTNInfo = CALLTYPE.PSTN.toString() + ":" + strTXT_PSTNNO; //Global.make1stCallHistoryInfo(strPSTNInfo, strPSTNInfo, CALLDIRECTION.OUT, CALLACTION.TALK, CALLRESULT.OUT_TALK); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] redialPSTN()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void doMultiCallAccept() { try { MainActivity.mCallController.mCallInfo.setMultiCallAcceptFlag(true); doEnd(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] doMultiCallAccept()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void doMultiCallReject(boolean bBusy) { try { CALLTYPE eMultiCallType = MainActivity.mCallController.mCallInfo.getMultiCallType(); if (eMultiCallType == CALLTYPE.FRONT) { playFrontCamBell(false); MainActivity.mCallController.mCallInfo.setCallStatus(eMultiCallType, CALLSTATUS.IDLE); } else if (eMultiCallType == CALLTYPE.LOBBY || eMultiCallType == CALLTYPE.GUARD || eMultiCallType == CALLTYPE.RESIDENCE) { if (bBusy) MainActivity.mCallController.rejectBusyMoIPCall(); else MainActivity.mCallController.rejectMoIPCall(); MainActivity.mCallController.mCallInfo.setCallStatus(eMultiCallType, CALLSTATUS.IDLE); } else if (eMultiCallType == CALLTYPE.PSTN) { MainActivity.mPSTNController.sendReject(); MainActivity.mCallController.onPSTNEvent(CALLEVENTTYPE.CANCEL_CALL, null, null); MainActivity.mCallController.mCallInfo.setCallStatus(eMultiCallType, CALLSTATUS.IDLE); } else { LOG_WARN("[doMultiCallReject] Invalid eMultiCallType [" + eMultiCallType + "]"); } MainActivity.mCallController.mCallInfo.resetMultiCallInfo(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] doMultiCallReject()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void doAutoCall() { try { Log.e(TAG, "[doAutoCall] RemoteIDInfo.bAutoCall [" + RemoteIDInfo.bAutoCall + "]"); if (RemoteIDInfo.bAutoCall) { LOG("[doAutoCall] RemoteIDInfo.strPSTNInfo [" + RemoteIDInfo.strPSTNInfo + "]"); strTXT_PSTNNO = RemoteIDInfo.strPSTNInfo; // RemoteIDInfo.bAutoCall = false; RemoteIDInfo.strPSTNInfo = ""; updateScreen(); doTalk(CALLOWNER.WALLPAD); } else { LOG("[doAutoCall] AutoCall is not activated!!"); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] doAutoCall() : " + e); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void procAddCall() { try { LOG("[procAddCall]"); CALLTYPE eMType = MainActivity.mCallController.mCallInfo.getMultiCallType(); CALLSTATUS eMStatus = MainActivity.mCallController.mCallInfo.getMultiCallStatus(); LOG("[procAddCall] eMType [" + eMType + "], eMStatus [" + eMStatus + "]"); if (eMType == CALLTYPE.PSTN && eMStatus == CALLSTATUS.CALLED) { //Global.replace1stBy2ndCallHistory(); if (MainActivity.mCallController.mCallInfo.getMultiCallAccept()) { // 멀티콜 수락 (통화시작) super.setFinishTimerDestroy(); doTalk(CALLOWNER.WALLPAD); strTXT_PSTNNO = MainActivity.mCallController.mCallInfo.getMultiCall_Name(); if (strTXT_PSTNNO.equals(NO_CID)) strTXT_PSTNNO = strMent_NoCID; updateScreen(); } else { // 멀티콜 수신중 (호출수신중) super.setFinishTimerDestroy(); Global.playMelodyRepeat(eMType); strTXT_PSTNNO = MainActivity.mCallController.mCallInfo.getMultiCall_Name(); if (strTXT_PSTNNO.equals(NO_CID)) strTXT_PSTNNO = strMent_NoCID; updateScreen(); } MainActivity.mCallController.mCallInfo.resetMultiCallInfo(); } else { // 멀티콜 없음 LOG("[procAddCall] No MultiCall!!"); // 멀티콜 없음 if (MainActivity.mCallController.mCallInfo.getPSTNCallHold()) { super.setFinishTimerDestroy(); MainActivity.mCallController.mCallInfo.printCallStatus(); if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.CALLED) { Global.playMelodyRepeat(CALLTYPE.PSTN); } else { doHookOn(CALLOWNER.WALLPAD); MainActivity.mCallController.setTalkPath(CALLPATH.PSTN); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) Global.setV40WallPadVolume(nCurrentVolume); else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) Global.setV40WallPadVolume_PSTN(nCurrentVolume); } strTXT_PSTNNO = MainActivity.mCallController.mCallInfo.getPSTNCallInfo(); if (strTXT_PSTNNO.equals(NO_CID)) strTXT_PSTNNO = strMent_IncommingCall; MainActivity.mCallController.mCallInfo.resetPSTNCallHold(); updateScreen(); } else { if (RemoteIDInfo.bAutoCall) { doAutoCall(); // 멀티콜 상황이 아닌경우 자동호출을 수행함 } MainActivity.mCallController.mCallInfo.resetMultiCallInfo(); // 멀티콜 통화상태 초기화 } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] procAddCall()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void playFrontCamBell(boolean bBell) { try { MainActivity.mIOInterface.ctrlFrontCamPower(bBell); MainActivity.mIOInterface.ctrlFrontCamBell(bBell); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) { if (bBell) { ((MainActivity) mContext).ctrlSmartIOTCamStatusMode(SmartRFCamStatusMode.STATUS_ON); ((MainActivity) mContext).ctrlSmartIOTCamLEDMode(SmartRFCamLEDMode.LED_ON); } else { ((MainActivity) mContext).ctrlSmartIOTCamStatusMode(SmartRFCamStatusMode.STATUS_OFF); ((MainActivity) mContext).ctrlSmartIOTCamLEDMode(SmartRFCamLEDMode.LED_OFF); } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] playFrontCamBell(boolean bBell)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void initPSTNInfo() { try { LOG("[initPSTNInfo]"); strTXT_PSTNNO = ""; strTXT_PSTNINFO = ""; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] initPSTNInfo()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void deletePSTNInfo() { try { int nPSTNNoLength = strTXT_PSTNNO.length(); if (nPSTNNoLength > 0) { strTXT_PSTNNO = strTXT_PSTNNO.substring(0, nPSTNNoLength - 1); } updateScreen(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] deletePSTNInfo()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void updateScreen() { try { CALLSTATUS ePSTNCallStatus = MainActivity.mCallController.mCallInfo.getPSTN(); LOG("[updateScreen] ePSTNCallStatus [" + ePSTNCallStatus + "]"); if (ePSTNCallStatus == CALLSTATUS.IDLE) { ((MainActivity) mContext).setMenuBTNEnable(true); strTXT_PSTNINFO = strTXT_PSTNNO; if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { LOG("[updateScreen] bBLOCK_TALK [" + bBLOCK_TALK + "]"); if (bBLOCK_TALK) blockPSTNTalk(); else BTN_TALK.setButtonEventOffDisable(); } else { BTN_TALK.setButtonEventOffDisable(); } BTN_REDIAL.setButtonEventOffDisable(); // BTN_REDIAL.setButtonEventOffEnable(R.drawable.btn_pstn_recall_disabled); // 2017.11.16 수정 SEULKI if (strTXT_PSTNINFO.equals("")) TXT_INSTRUCTION.setText(strMent_InputCall); else TXT_INSTRUCTION.setText(""); setOffCallLED(); } else if (ePSTNCallStatus == CALLSTATUS.CALLED) { ((MainActivity) mContext).setMenuBTNEnable(false); if (strTXT_PSTNNO.equals("")) strTXT_PSTNINFO = strMent_IncommingCall; else strTXT_PSTNINFO = strTXT_PSTNNO; BTN_TALK.setButtonEventOffDisable(); BTN_END.setButtonEventOffDisable(); ((MainActivity) mContext).TopHomeBtn.setButtonEventOffDisable(); BTN_REDIAL.setButtonEventOffEnable(R.drawable.btn_pstn_recall_disabled); TXT_INSTRUCTION.setText(strMent_IncommingCall); runFlickerCallLED(); } else if (ePSTNCallStatus == CALLSTATUS.TALKING) { ((MainActivity) mContext).setMenuBTNEnable(false); strTXT_PSTNINFO = strTXT_PSTNNO; Log.d(TAG, "[updateScreen] strTXT_PSTNINFO: " + strTXT_PSTNINFO); BTN_TALK.setButtonEventOffEnable(R.drawable.btn_pstn_call_disabled); BTN_REDIAL.setButtonEventOffEnable(R.drawable.btn_pstn_recall_disabled); TXT_INSTRUCTION.setText(strMent_TalkingCall); setOnCallLED(); } else { strTXT_PSTNINFO = ""; } TXT_PSTNINFO.setText(strTXT_PSTNINFO); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] updateScreen()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void displayScreenValues() { try { getVolume(); drawVolume(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] displayScreenValues()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } int nMICGain = 0; int nMICBoostGain = 0; private void setMICMute(boolean bMute) { try { LOG_INFO("[setMICMute] bMute [" + bMute + "]"); if (bMute) { nMICGain = MainActivity.mIOInterface.getMICGain(); nMICBoostGain = MainActivity.mIOInterface.getMICBoostGain(); LOG_INFO("[setMICMute] = Before Mute = nMICGain [" + nMICGain + "], nMICBoostGain [" + nMICBoostGain + "]"); MainActivity.mIOInterface.setMICGain(0); MainActivity.mIOInterface.setMICBoostGain(0); LOG_INFO("[setMICMute] = After Mute = nMICGain [" + MainActivity.mIOInterface.getMICGain() + "], nMICBoostGain [" + MainActivity.mIOInterface.getMICBoostGain() + "]"); } else { LOG_INFO("[setMICMute] = Before Release Mute = nMICGain [" + MainActivity.mIOInterface.getMICGain() + "], nMICBoostGain [" + MainActivity.mIOInterface.getMICBoostGain() + "]"); MainActivity.mIOInterface.setMICGain(nMICGain); MainActivity.mIOInterface.setMICBoostGain(nMICBoostGain); LOG_INFO("[setMICMute] = After Release Mute = nMICGain [" + MainActivity.mIOInterface.getMICGain() + "], nMICBoostGain [" + MainActivity.mIOInterface.getMICBoostGain() + "]"); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] setMICMute(boolean bMute)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } int nPathOpenDelayTime = 0; private void setPathOpenDelayTime(String strDialNo) { try { LOG_INFO("[setPathOpenDelayTime] strDialNo [" + strDialNo + "]"); nPathOpenDelayTime = (strDialNo.length() * 500) + 500; LOG_INFO("[setPathOpenDelayTime] nPathOpenDelayTime [" + nPathOpenDelayTime + "]"); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] setPathOpenDelayTime(String strDialNo)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void resetPathHandler() { try { LOG("[resetPathHandler]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { if (MainActivity.mPSTNController != null) { if (MainActivity.mPSTNController.mPSTNPathCheckHandler != null) { MainActivity.mPSTNController.mPSTNPathCheckHandler.removeMessages(0); MainActivity.mPSTNController.mPSTNPathCheckHandler.removeMessages(1); MainActivity.mPSTNController.mPSTNPathCheckHandler.removeMessages(2); MainActivity.mPSTNController.mPSTNPathCheckHandler.removeMessages(3); } } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] resetPathHandler()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void playTenkeyNo(int nBTN) { try { int nSoundIndex = SND.number.NUM0; switch (nBTN) { case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_00: nSoundIndex = SND.number.NUM0; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_01: nSoundIndex = SND.number.NUM1; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_02: nSoundIndex = SND.number.NUM2; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_03: nSoundIndex = SND.number.NUM3; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_04: nSoundIndex = SND.number.NUM4; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_05: nSoundIndex = SND.number.NUM5; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_06: nSoundIndex = SND.number.NUM6; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_07: nSoundIndex = SND.number.NUM7; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_08: nSoundIndex = SND.number.NUM8; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_09: nSoundIndex = SND.number.NUM9; break; case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_SHARP: case ID.SCREEN.TALKPSTN.ELEMENT.BUTTON.TENKEY_STAR: nSoundIndex = SND.effect.TOUCH_LATCHED; break; } MainActivity.mSound.Play(nSoundIndex); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] playTenkeyNo(int nBTN)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } /************************************* * ARS 관련코드 정의 *************************************/ int nRingCnt = 0; int nARSTrigger = 1; int nCurrentARSSTATE = ARS_STATE.NONE; String strInputPW = ""; String strCurrentPW = ""; int nPWDeniedCnt = 0; boolean bBlockDTMF = false; public class ARS_STATE { static final int RUN_ARS_MODE = 100; static final int GREETING_CONFIRMPW = 110; static final int CONFIRM_PW_RETRY = 120; static final int CHECK_PW_FINISH = 120; static final int MENU_MAIN = 200; static final int MENU_LIGHT = 210; static final int MENU_THERMOSTAT = 220; static final int MENU_GASVALVE = 230; static final int MENU_DONE = 240; static final int MENU_GASVALVE_CLOSE = 300; static final int FINISH = 900; static final int FINISH_MENT = 901; static final int FINISH_TIMEOUT = 910; static final int FINISH_PW_DENIED = 920; static final int FINISH_PW_DISABLED = 930; static final int NONE = 1000; } private void resetRingCnt() { try { nRingCnt = 0; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] resetRingCnt()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void checkARSActivate() { try { Log.d(TAG, "[checkARSActivate]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) { setARSMode(ARS_STATE.RUN_ARS_MODE); setARSTimeout(); } else { nRingCnt++; if (nRingCnt > nARSTrigger) { setARSMode(ARS_STATE.RUN_ARS_MODE); setARSTimeout(); } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] checkARSActivate()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void setARSMode(int nStep) { try { Log.d(TAG, "[setARSMode]"); nCurrentARSSTATE = nStep; manageARSMode(nCurrentARSSTATE); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] setARSMode(int nStep)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void manageARSMode(int nStep) { try { Log.d(TAG, "[manageARSMode] nStep: " + nStep); switch (nStep) { case ARS_STATE.RUN_ARS_MODE: runARS_Start(); if (checkPWPolicy(strCurrentPW)) { sendHandlerMsgDelayed(HANDLERMSG.ARS_GREETING_CONFIRMPW, 0, 0, 1000); } else { sendHandlerMsgDelayed(HANDLERMSG.ARS_PW_DISABLED, 0, 0, 1000); } break; case ARS_STATE.GREETING_CONFIRMPW: // "안녕하세요 홈네트워크 서비스 BESTIN 입니다. 비밀번호를 입력하신후 * 나 # 를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS1_1); break; case ARS_STATE.FINISH_PW_DISABLED: // 죄송합니다. 비밀번호를 해제하시기 전까지 사용이 정지됩니다." MainActivity.mSound.PlayMent(SND.ars_ment.ARS1_4); sendHandlerMsgDelayed(HANDLERMSG.ARS_FINISH, 0, 0, Sound().getPlayMentRemainingTime() + 1000); break; case ARS_STATE.CONFIRM_PW_RETRY: // "비밀번호가 틀렸습니다. 다시입력하세요." MainActivity.mSound.PlayMent(SND.ars_ment.ARS1_2); unsetBlockDTMF(); break; case ARS_STATE.MENU_MAIN: // "원하시는 서비스 번호를 눌러주세요. 조명제어는 1번 난방제어는 2번 가스밸브제어는 3번 다시듣고 싶으시면 0번을 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS2_3); unsetBlockDTMF(); break; case ARS_STATE.MENU_LIGHT: // "조명제어를 선택하셨습니다. 거실등켜기는 1번 거실등끄기는 2번을 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS3_6); unsetBlockDTMF(); break; case ARS_STATE.MENU_THERMOSTAT: // "난방제어를 선택하셨습니다. 일반모드는 1번 난방끄기는 2번을 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS4_1); unsetBlockDTMF(); break; case ARS_STATE.MENU_GASVALVE: // "가스밸브제어를 선택하셨습니다" MainActivity.mSound.PlayMent(SND.ars_ment.ARS5_1); sendHandlerMsgDelayed(HANDLERMSG.ARS_GASVALVE_CLOSE, 0, 0, Sound().getPlayMentRemainingTime()); break; case ARS_STATE.MENU_DONE: // "서비스를 종료하시려면 #를 전단계로 이동하려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS9_2); unsetBlockDTMF(); break; case ARS_STATE.MENU_GASVALVE_CLOSE: // 가스밸브 닫음 ctrlGasValve(); break; case ARS_STATE.FINISH_MENT: // "이용해주셔서 감사합니다" MainActivity.mSound.PlayMent(SND.ars_ment.ARS7_1); sendHandlerMsgDelayed(HANDLERMSG.ARS_FINISH, 0, 0, Sound().getPlayMentRemainingTime() + 1000); break; case ARS_STATE.FINISH_PW_DENIED: // "죄송합니다. 비밀번호3회 오류로 서비스를 종료합니다." MainActivity.mSound.PlayMent(SND.ars_ment.ARS1_3); sendHandlerMsgDelayed(HANDLERMSG.ARS_FINISH_MENT, 0, 0, Sound().getPlayMentRemainingTime() + 200); break; case ARS_STATE.FINISH_TIMEOUT: // "죄송합니다. 입력시간이 초과하여 서비스를 종료합니다" MainActivity.mSound.PlayMent(SND.ars_ment.ARS8_1); sendHandlerMsgDelayed(HANDLERMSG.ARS_FINISH_MENT, 0, 0, Sound().getPlayMentRemainingTime() + 200); break; default: break; } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] manageARSMode(int nStep)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void runARS_Start() { try { LOG_INFO("[runARS_Start]"); MainActivity.mIOInterface.setDTMFInOnOff(false); // ARS 시작 시 DTMF IN Disable MainActivity.mCallController.setDTMFEventListener(this); resetRingCnt(); doTalk(CALLOWNER.WALLPAD); getWallPadPW(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] runARS_Start()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void runARS_Finish() { try { LOG_INFO("[runARS_Finish]"); doEnd(); MainActivity.mIOInterface.setDTMFInOnOff(false); MainActivity.mCallController.releaseDTMFEventListener(); cancelARSTimer(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] runARS_Finish()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void setBlockDTMF() { try { bBlockDTMF = true; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] setBlockDTMF()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void unsetBlockDTMF() { try { bBlockDTMF = false; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] unsetBlockDTMF()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } @Override public void onDTMFEvent(String strMessage) { try { LOG_WARN("[onDTMFEvent] PSTN_DTMF [" + strMessage + "] bBlockDTMF [" + bBlockDTMF + "]"); if (bBlockDTMF) return; setARSTimeout(); if (nCurrentARSSTATE == ARS_STATE.GREETING_CONFIRMPW || nCurrentARSSTATE == ARS_STATE.CONFIRM_PW_RETRY) { if (strMessage.equals("*") || strMessage.equals("#")) { setBlockDTMF(); if (comparePassword(strInputPW)) { setARSMode(ARS_STATE.MENU_MAIN); } else { if (nPWDeniedCnt > 2) { setARSMode(ARS_STATE.FINISH_PW_DENIED); } else { setARSMode(ARS_STATE.CONFIRM_PW_RETRY); } strInputPW = ""; } } else { strInputPW += strMessage; } } else if (nCurrentARSSTATE == ARS_STATE.MENU_MAIN) { if (strMessage.equals("1")) { // 조명제어 setARSMode(ARS_STATE.MENU_LIGHT); } else if (strMessage.equals("2")) { // 난방제어 setARSMode(ARS_STATE.MENU_THERMOSTAT); } else if (strMessage.equals("3")) { // 가스밸브제어 setARSMode(ARS_STATE.MENU_GASVALVE); } else if (strMessage.equals("0")) { // 다시듣기 setARSMode(ARS_STATE.MENU_MAIN); } else if (strMessage.equals("*")) { // 전단계 setARSMode(ARS_STATE.GREETING_CONFIRMPW); } else if (strMessage.equals("#")) { // 종료 setBlockDTMF(); setARSMode(ARS_STATE.FINISH_MENT); } else { // "잘못누르셨습니다. 다시입력하세요. 다시들으시려면 0번 전단계로 이동하시려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS9_1); setARSMode(ARS_STATE.MENU_MAIN); } } else if (nCurrentARSSTATE == ARS_STATE.MENU_LIGHT) { if (strMessage.equals("1")) { // 거실등 켜기 setBlockDTMF(); if (ctrlLight(true)) { // "거실등을 켰습니다." MainActivity.mSound.PlayMent(SND.ars_ment.ARS3_3); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } else { // "죄송합니다. 서비스처리중 오류가 발생했습니다. 잠시후에 다시 시도해 주세요. 서비스를 종료하시려면 # 전단계로 이동하려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS6_1); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } } else if (strMessage.equals("2")) { // 거실등 끄기 setBlockDTMF(); if (ctrlLight(false)) { // "거실등을 껐습니다." MainActivity.mSound.PlayMent(SND.ars_ment.ARS3_4); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } else { // "죄송합니다. 서비스처리중 오류가 발생했습니다. 잠시후에 다시 시도해 주세요. 서비스를 종료하시려면 # 전단계로 이동하려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS6_1); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } } else if (strMessage.equals("0")) { // 다시듣기 setARSMode(ARS_STATE.MENU_LIGHT); } else if (strMessage.equals("*")) { // 전단계 setARSMode(ARS_STATE.MENU_MAIN); } else if (strMessage.equals("#")) { // 종료 setBlockDTMF(); setARSMode(ARS_STATE.FINISH_MENT); } else { // "잘못누르셨습니다. 다시입력하세요. 다시들으시려면 0번 전단계로 이동하시려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS9_1); setARSMode(ARS_STATE.MENU_MAIN); } } else if (nCurrentARSSTATE == ARS_STATE.MENU_THERMOSTAT) { if (strMessage.equals("1")) { // 일반모드 setBlockDTMF(); if (ctrlThermostat(true)) { // "일반모드로 설정했습니다." MainActivity.mSound.PlayMent(SND.ars_ment.ARS4_3); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } else { // "죄송합니다. 서비스처리중 오류가 발생했습니다. 잠시후에 다시 시도해 주세요. 서비스를 종료하시려면 # 전단계로 이동하려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS6_1); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } } else if (strMessage.equals("2")) { // 난방끄기 setBlockDTMF(); if (ctrlThermostat(false)) { // "난방을 껐습니다." MainActivity.mSound.PlayMent(SND.ars_ment.ARS4_4); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } else { // "죄송합니다. 서비스처리중 오류가 발생했습니다. 잠시후에 다시 시도해 주세요. 서비스를 종료하시려면 # 전단계로 이동하려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS6_1); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } } else if (strMessage.equals("0")) { // 다시듣기 setARSMode(ARS_STATE.MENU_THERMOSTAT); } else if (strMessage.equals("*")) { // 전단계 setARSMode(ARS_STATE.MENU_MAIN); } else if (strMessage.equals("#")) { // 종료 setBlockDTMF(); setARSMode(ARS_STATE.FINISH_MENT); } else { // "잘못누르셨습니다. 다시입력하세요. 다시들으시려면 0번 전단계로 이동하시려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS9_1); setARSMode(ARS_STATE.MENU_MAIN); } } else if (nCurrentARSSTATE == ARS_STATE.MENU_GASVALVE) { if (strMessage.equals("*")) { // 전단계 setARSMode(ARS_STATE.MENU_MAIN); } else if (strMessage.equals("#")) { // 종료 setBlockDTMF(); setARSMode(ARS_STATE.FINISH_MENT); } else { // "잘못누르셨습니다. 다시입력하세요. 다시들으시려면 0번 전단계로 이동하시려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS9_1); setARSMode(ARS_STATE.MENU_MAIN); } } else if (nCurrentARSSTATE == ARS_STATE.MENU_DONE) { if (strMessage.equals("*")) { // 전단계 setARSMode(ARS_STATE.MENU_MAIN); } else if (strMessage.equals("#")) { // 종료 setBlockDTMF(); setARSMode(ARS_STATE.FINISH_MENT); } else { // "잘못누르셨습니다. 다시입력하세요. 다시들으시려면 0번 전단계로 이동하시려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS9_1); setARSMode(ARS_STATE.MENU_MAIN); } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onDTMFEvent(String strMessage)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } String[] astrBlockedPW = {"0000", "1111", "2222", "3333", "4444", "5555", "6666", "7777", "8888", "9999", "1234"}; private boolean checkPWPolicy(String strPW) { try { int nCnt = astrBlockedPW.length; for (int i = 0; i < nCnt; i++) { if (strPW.equals(astrBlockedPW[i])) return false; } if (Global.ZeroPadding_Head(4, ConfigValues.strDong).equals(Global.ZeroPadding_Head(4, strPW))) return false; if (Global.ZeroPadding_Head(4, ConfigValues.strHo_Main).equals(Global.ZeroPadding_Head(4, strPW))) return false; return true; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return false; } catch (Exception e) { Log.e(TAG, "[Exception] checkPWPolicy(String strPW)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return false; } } private void getWallPadPW() { WallpadStatusData mWallpadStatusData = new WallpadStatusData(this.getContext()); try { if (mWallpadStatusData != null) { strCurrentPW = mWallpadStatusData.GetUserPW(); LOG_INFO("[getWallPadPW] strCurrentPW [" + strCurrentPW + "]"); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] getWallPadPW()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } mWallpadStatusData.closeDB(); } private boolean comparePassword(String strPW) { try { LOG_INFO("[comparePassword] strPW [" + strPW + "]"); if (strPW.equals(strCurrentPW)) { nPWDeniedCnt = 0; return true; } else { nPWDeniedCnt++; return false; } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return false; } catch (Exception e) { Log.e(TAG, "[Exception] comparePassword(String strPW)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return false; } } private final int RESULT_OK = 0; private final int RESULT_RETRY = 5; private final int RESULT_PROCESS = 10; private final int RESULT_BACK = 20; private final int RESULT_REPEAT_MENT = 30; private final int RESULT_FAIL = -1; private final int RESULT_CONTROLL_FAIL = -10; private final int RESULT_EXIT = -100; private boolean ctrlLight(boolean bON) { try { LOG_INFO("[ctrlLight] bON [" + bON + "]"); if (ConfigValues.nCtrlLight == 1) { // 현산향 return ctrlHDCLight(bON); } else if (ConfigValues.nCtrlLight == 2) { // 대외기본형 return ctrlLivingRoomLight(bON); } else if (ConfigValues.nCtrlLight == 3) { // 대외각실형 return ctrlRoomsLight(bON); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] ctrlLight(boolean bON)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } return false; } private boolean ctrlHDCLight(boolean bON) { try { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300) { Sdb_LivingRoomLightAPI sdb_livingRoomLightAPI = mWallPadAPI.Get_Sdb_LivingRoomLightAPI(); if (sdb_livingRoomLightAPI != null) { int nRet = 0; if (bON) nRet = sdb_livingRoomLightAPI.SetLightOnOff((byte) define.DEVICE_ALL_OR_NOTHING, true); else nRet = sdb_livingRoomLightAPI.SetLightOnOff((byte) define.DEVICE_ALL_OR_NOTHING, false); if (nRet >= 0) return true; } } else { IntLightAPI mIntLightAPI = mWallPadAPI.Get_IntLightController(); if (mIntLightAPI != null) { int nRet = 0; if (bON) nRet = mIntLightAPI.LightControl((byte) 0xFF, true); else nRet = mIntLightAPI.LightControl((byte) 0xFF, false); if (nRet >= 0) return true; } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] ctrlHDCLight(boolean bON)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } return false; } private boolean ctrlLivingRoomLight(boolean bON) { try { LightAPI mLightAPI = mWallPadAPI.Get_LightController(); if (mLightAPI == null) { Log.e(TAG, "[ctrlLivingRoomLight] lightCTR == null"); return false; } if (mLightAPI.Refresh(false) < RESULT_OK) { return false; } if (mLightAPI.SetLightOnOff(define.DEVICE_ALL_OR_NOTHING, bON) < RESULT_OK) { return false; } return true; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return false; } catch (Exception e) { Log.e(TAG, "[Exception] ctrlLivingRoomLight(boolean bON)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return false; } } private boolean ctrlRoomsLight(boolean bON) { try { int nMultiSwitchCnt = 0; MultiSwitchAPI mMultiSwitchAPI = null; mMultiSwitchAPI = mWallPadAPI.Get_MultiSwitchController(); if (mMultiSwitchAPI == null) { Log.e(TAG, "[ctrlRoomsLight] mMultiSwitchAPI == null"); return false; } if (mMultiSwitchAPI.Refresh(define.DEVICE_ALL_OR_NOTHING, false) == 0) { if ((mMultiSwitchAPI.data != null) && (mMultiSwitchAPI.data.Device != null)) { nMultiSwitchCnt = mMultiSwitchAPI.data.DeviceCnt; if (nMultiSwitchCnt < 1) return false; } else return false; } else return false; mMultiSwitchAPI.Refresh((byte) 0, false); if (mMultiSwitchAPI.data.DeviceCnt > 0) { if (mMultiSwitchAPI.SetLightOnOff((byte) 0, define.DEVICE_ALL_OR_NOTHING, bON) == APIErrorCode.C_SUCCESS) { return true; } else return false; } else return false; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return false; } catch (Exception e) { Log.e(TAG, "[Exception] ctrlRoomsLight(boolean bON)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return false; } } private boolean ctrlThermostat(boolean bON) { try { if (mWallPadAPI.DeviceBatchControl(WallPadAPI.DEV_BATCH_CTRL__TYPE.HEATING, !bON) < RESULT_OK) return false; else return true; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return false; } catch (Exception e) { Log.e(TAG, "[Exception] ctrlThermostat(boolean bON)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return false; } } private void ctrlGasValve() { new GasControllTask().execute(); } private int closeGasValve() { try { return mWallPadAPI.DeviceBatchControl(WallPadAPI.DEV_BATCH_CTRL__TYPE.GAS, false); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return -1; } catch (Exception e) { Log.e(TAG, "[Exception] closeGasValve()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return -1; } } private int getGasValveState() { try { int nResult = RESULT_FAIL; GasAPI mGasAPI = mWallPadAPI.Get_GasController(); if (mGasAPI == null) { Log.e(TAG, "getGasControllerState() (gasCTR == null)"); } if (mGasAPI != null) { int ctrlResult = mGasAPI.Refresh((byte) 0, false); if (ctrlResult < 0) { nResult = RESULT_FAIL; } else { if (mGasAPI.data.DeviceCnt == 2) { mGasAPI.Refresh((byte) 1, false); } byte GasStatus = GasAPI.GASSTATUS.Close; for (int i = 0; i < mGasAPI.data.DeviceCnt; i++) { if (mGasAPI.data.Device[i].GasStatus == GasAPI.GASSTATUS.Operation) { GasStatus = GasAPI.GASSTATUS.Operation; break; } if (mGasAPI.data.Device[i].GasStatus == GasAPI.GASSTATUS.Open) { GasStatus = GasAPI.GASSTATUS.Open; break; } } nResult = GasStatus; } } LOG_INFO("[getGasValveState] nResult [" + nResult + "]"); return nResult; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return RESULT_EXIT; } catch (Exception e) { Log.e(TAG, "[Exception] getGasValveState()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return RESULT_EXIT; } } private class GasControllTask extends AsyncTask { @Override protected Integer doInBackground(Object... params) { try { int nResult = closeGasValve(); Log.e(TAG, "[doInBackground] nResult [" + nResult + "]"); if (nResult == RESULT_RETRY) { for (int i = 0; i < 10; i++) { try { Thread.sleep(300); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] closeGasValve()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } int gasState = getGasValveState(); if (gasState == GasAPI.GASSTATUS.Close) { nResult = RESULT_OK; break; } else if (gasState == RESULT_FAIL) { nResult = RESULT_FAIL; break; } // Log.e(TAG, "[doInBackground] i [" + i + "], nResult [" + nResult+ "]"); } } return nResult; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return RESULT_EXIT; } catch (Exception e) { Log.e(TAG, "[Exception] closeGasValve()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return RESULT_EXIT; } } @Override protected void onPostExecute(Integer result) { try { Log.e(TAG, "[GasControllTask().onPostExecute] nCurrentARSSTATE [" + nCurrentARSSTATE + "], result [" + result + "]"); if (nCurrentARSSTATE == ARS_STATE.MENU_GASVALVE_CLOSE) { if (result == RESULT_OK) { Log.e(TAG, "[GasControllTask().onPostExecute] RESULT_OK!!"); // "가스밸브를 닫았습니다." MainActivity.mSound.PlayMent(SND.ars_ment.ARS5_2); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } else { Log.e(TAG, "[GasControllTask().onPostExecute] NOT RESULT_OK!!"); // "죄송합니다. 서비스처리중 오류가 발생했습니다. 잠시후에 다시 시도해 주세요. 서비스를 종료하시려면 # 전단계로 이동하려면 *를 눌러주세요" MainActivity.mSound.PlayMent(SND.ars_ment.ARS6_1); sendHandlerMsgDelayed(HANDLERMSG.ARS_MENU_DONE, 0, 0, Sound().getPlayMentRemainingTime()); } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] onPostExecute(Integer result)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } } // ARS 통화시간 제한 static Timer ARSTimer = null; private static int nARSRemainTime = 0; // Sec 단위 private static int nARSTimeout = 0; // Sec 단위 public static int nDefaultARSTimeout = 20; // Sec 단위 public boolean setARSTimeout() { try { nARSTimeout = nDefaultARSTimeout; if (nARSRemainTime > 0) { // 타이머가 이미 동작중이므로, 시간을 새로 설정한다. nARSRemainTime = nARSTimeout; } else { // 타이머가 돌아가고 있지 않으므로, 새로 구동한다. if (ARSTimer == null) { Log.i(TAG, "[setARSTimeout] ARSTimer is null!!"); ARSTimer = new Timer(); ARSTimer.schedule(new ARSTimeCnt(), 1000, 1000); } nARSRemainTime = nARSTimeout; } return true; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return false; } catch (Exception e) { Log.e(TAG, "[Exception] setARSTimeout(nTimeout)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return false; } } public boolean cancelARSTimer() { try { Log.i(TAG, "[cancelARSTimer] ARSTimer = " + ARSTimer); nARSRemainTime = 0; if (ARSTimer != null) { Log.i(TAG, "[cancelARSTimer] ARSTimer != null"); ARSTimer.cancel(); ARSTimer = null; } return true; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return false; } catch (Exception e) { Log.e(TAG, "[Exception] cancelARSTimer()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return false; } } public class ARSTimeCnt extends TimerTask { @Override public void run() { // DEBUG("[ARSTimeCnt().run()] StartManal!!"); try { nARSRemainTime--; LOG("[ARSTimeCnt.run()] nARSRemainTime = " + nARSRemainTime); if (nARSRemainTime <= 0) { LOG("[ARSTimeCnt.run()] Screen Change!!"); ARSTimer.cancel(); ARSTimer = null; // "죄송합니다. 입력시간이 초과하여 서비스를 종료합니다" MainActivity.mSound.PlayMent(SND.ars_ment.ARS8_1); sendHandlerMsgDelayed(HANDLERMSG.ARS_FINISH, 0, 0, Sound().getPlayMentRemainingTime() + 1000); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] ARSTimeCnt().run()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } } // 음량 SeekBar.OnSeekBarChangeListener mOnVolumeChangeListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int nCtrlLevel = getCtrlLevel(progress); if (nCurrentVolume != nCtrlLevel) { nCurrentVolume = nCtrlLevel; showVolume(nCurrentVolume); // ctrlVolume(false); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { // Log.d(TAG, "[onStopTrackingTouch] nCurrentVolume:" + nCurrentVolume); nCurrentVolume = getCtrlLevel(seekBar.getProgress()); ctrlVolume(true); } }; private void getVolume() { try { nCurrentVolume = Global.getPSTNVolume(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] getVolume()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void setVolume(int nValue) { try { if (!Global.setPSTNVolume(nValue)) { LOG_WARN("[setVolume] Fail to set volume!! nValue [" + nValue + "]"); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] setVolume()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void ctrlVolume(boolean bSave) { try { if (bSave) setVolume(nCurrentVolume); CALLSTATUS eCallStatus = MainActivity.mCallController.mCallInfo.getPSTN(); LOG("[ctrlVolume] eCallStatus [" + eCallStatus + "]"); if (eCallStatus == CALLSTATUS.TALKING) { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) { Global.setV40WallPadVolume(nCurrentVolume); } else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { Global.setV40WallPadVolume_PSTN(nCurrentVolume); } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] ctrlVolume()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void showVolume(int nValue) { try { // Log.d(TAG, "[showVolume] nValue [" + nValue + "]"); if (TXT_VOLUME_LEVEL != null) TXT_VOLUME_LEVEL.setText(Integer.toString(nValue)); else Log.w(TAG, "[showVolume] TXT_VOLUME_LEVEL is null!!"); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] showVolume(nValue)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void drawVolume() { try { if (SEEKBAR_VOLUME != null) { SEEKBAR_VOLUME.setProgress(ctrlSeekBarThumb(nCurrentVolume)); showVolume(nCurrentVolume); } else Log.w(TAG, "[drawVolume] SEEKBAR_VOLUME is null!!"); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] drawVolume()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private int getCtrlLevel(int nValue) { try { // Log.d(TAG, "[getCtrlLevel] nValue: " + nValue); if (nValue == 0) return 1; int result = nValue / 10; if ((nValue % 10) != 0) result++; // Log.d(TAG, "[getCtrlLevel] result: " + result); return result; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return 1; } catch (Exception e) { Log.e(TAG, "[Exception] getCtrlLevel(nValue)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return 1; } } private int ctrlSeekBarThumb(int nValue) { try { int progress; if (nValue == 1) progress = 1; else if (nValue == 10) progress = 100; else progress = (nValue - 1) * 11; return progress; } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); return 1; } catch (Exception e) { Log.e(TAG, "[Exception] ctrlSeekBarThumb()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); return 1; } } // LED private void setBTNLEDStatus() { try { if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.CALLING) { runFlickerCallLED(); } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.CALLED) { runFlickerCallLED(); } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.TALKING) { setOnCallLED(); } else { setOffCallLED(); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exceptpion] setBTNLEDStatus()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } boolean bFlickeringCallLED = false; boolean bStatusFlickeringCallLED = false; private void runFlickerCallLED() { try { LOG("[runFlickerCallLED] bFlickeringCallLED [" + bFlickeringCallLED + "]"); if (!bFlickeringCallLED) { bFlickeringCallLED = true; sendHandlerMsg(HANDLERMSG.FLICKER_LED_CALL, 0, 0); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] runFlickerCallLED()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void setOnCallLED() { try { LOG("[setOffCallLED] bStatusFlickeringCallLED [" + bStatusFlickeringCallLED + "]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { bFlickeringCallLED = false; bStatusFlickeringCallLED = true; MainActivity.mIOInterface.ctrlWallPadLED_Call(bStatusFlickeringCallLED); } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] setOnCallLED()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void setOffCallLED() { try { if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { bFlickeringCallLED = false; if (bStatusFlickeringCallLED) { bStatusFlickeringCallLED = false; MainActivity.mIOInterface.ctrlWallPadLED_Call(bStatusFlickeringCallLED); } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] setOffCallLED()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void ctrlCallLED() { try { LOG_INFO("[ctrlCallLED] #1 bFlickeringCallLED [" + bFlickeringCallLED + "], bStatusFlickeringCallLED [" + bStatusFlickeringCallLED + "]"); LOG_INFO("[ctrlCallLED] MainActivity.mCallController.mCallInfo.getPSTN() [" + MainActivity.mCallController.mCallInfo.getPSTN() + "]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { if ((MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.CALLING) || (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.CALLED)) { if (bFlickeringCallLED) { MainActivity.mIOInterface.ctrlWallPadLED_Call(bStatusFlickeringCallLED); bStatusFlickeringCallLED = !bStatusFlickeringCallLED; sendHandlerMsgDelayed(HANDLERMSG.FLICKER_LED_CALL, 0, 0, 1000); } } else if (MainActivity.mCallController.mCallInfo.getPSTN() == CALLSTATUS.TALKING) { bStatusFlickeringCallLED = true; MainActivity.mIOInterface.ctrlWallPadLED_Call(bStatusFlickeringCallLED); } else { LOG_INFO("[ctrlCallLED] #2 bFlickeringCallLED [" + bFlickeringCallLED + "], bStatusFlickeringCallLED [" + bStatusFlickeringCallLED + "]"); bStatusFlickeringCallLED = false; MainActivity.mIOInterface.ctrlWallPadLED_Call(bStatusFlickeringCallLED); } } } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] ctrlCallLED()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public final class HANDLERMSG { public final static int PROC_ADDCALL = 100; public final static int FLICKER_LED_CALL = 160; public final static int REFRESH_BTNLED_STATUS = 170; public final static int ARS_GREETING_CONFIRMPW = 200; public final static int ARS_CONFIRMPW_RETRY = 210; public final static int ARS_PW_DISABLED = 220; public final static int ARS_MENU_MAIN = 300; public final static int ARS_MENU_LIGHT = 310; public final static int ARS_MENU_THERMOSTAT = 320; public final static int ARS_MENU_GASVALVE = 340; public final static int ARS_MENU_DONE = 350; public final static int ARS_GASVALVE_CLOSE = 400; public final static int SET_CALLPATH_PSTN_WALLPAD = 500; public final static int SET_CALLPATH_PSTN_WALLPAD_MIC = 501; public final static int SET_CALLPATH_PSTN_WALLPAD_SPEAKER = 502; public final static int SET_CALLPATH_PSTN_ARS = 503; public final static int SET_CALLPATH_PSTN_SUBPHONE = 504; public final static int SET_MIC_MUTE = 505; public final static int RELEASE_MIC_MUTE = 506; public final static int SET_VOLUME_TABLE = 507; public final static int RELEASE_PSTN_END_BLOCK = 600; public final static int RELEASE_PSTN_DIAL_BLOCK = 650; public final static int OFF_FRONT = 700; public final static int ARS_FINISH = 900; public final static int ARS_FINISH_MENT = 910; public final static int FINISH_PSTN = 920; public final static int FINISH_APP = 1000; } public Handler MainHandler = new Handler(Looper.getMainLooper()) { public void handleMessage(Message msg) { LOG("[MainHandler] MainHandler : what [" + msg.what + "], arg1 [" + msg.arg1 + "], arg2 [" + msg.arg2 + "]"); switch (msg.what) { case HANDLERMSG.PROC_ADDCALL: procAddCall(); break; case HANDLERMSG.FLICKER_LED_CALL: ctrlCallLED(); break; case HANDLERMSG.REFRESH_BTNLED_STATUS: setBTNLEDStatus(); break; case HANDLERMSG.ARS_GREETING_CONFIRMPW: setARSMode(ARS_STATE.GREETING_CONFIRMPW); break; case HANDLERMSG.ARS_PW_DISABLED: setARSMode(ARS_STATE.FINISH_PW_DISABLED); break; case HANDLERMSG.ARS_MENU_MAIN: setARSMode(ARS_STATE.MENU_MAIN); break; case HANDLERMSG.ARS_MENU_DONE: setARSMode(ARS_STATE.MENU_DONE); break; case HANDLERMSG.ARS_GASVALVE_CLOSE: setARSMode(ARS_STATE.MENU_GASVALVE_CLOSE); break; case HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD: MainActivity.mCallController.setTalkPath(CALLPATH.PSTN); break; case HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD_MIC: MainActivity.mCallController.setTalkPath(CALLPATH.PSTN_MIC); break; case HANDLERMSG.SET_CALLPATH_PSTN_WALLPAD_SPEAKER: MainActivity.mCallController.setTalkPath(CALLPATH.PSTN_SPEAKER); break; case HANDLERMSG.SET_CALLPATH_PSTN_ARS: MainActivity.mCallController.setTalkPath(CALLPATH.PSTN_ARS); break; case HANDLERMSG.SET_CALLPATH_PSTN_SUBPHONE: MainActivity.mCallController.setTalkPath(CALLPATH.SUBPHONE_PSTN); break; case HANDLERMSG.SET_MIC_MUTE: setMICMute(true); break; case HANDLERMSG.RELEASE_MIC_MUTE: setMICMute(false); break; case HANDLERMSG.SET_VOLUME_TABLE: if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT) Global.setV40WallPadVolume(nCurrentVolume); else if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) Global.setV40WallPadVolume_PSTN(nCurrentVolume); break; case HANDLERMSG.RELEASE_PSTN_END_BLOCK: bBLOCK_PSTNEND = false; BTN_END.setButtonEventOffDisable(); ((MainActivity) mContext).TopHomeBtn.setButtonEventOffDisable(); break; case HANDLERMSG.RELEASE_PSTN_DIAL_BLOCK: bBLOCK_DIAL = false; for (int i = 0; i < BTN_TENKEY.length; i++) BTN_TENKEY[i].setButtonEventOffDisable(); break; case HANDLERMSG.ARS_FINISH: setARSMode(ARS_STATE.FINISH); runARS_Finish(); break; case HANDLERMSG.ARS_FINISH_MENT: setARSMode(ARS_STATE.FINISH_MENT); break; case HANDLERMSG.OFF_FRONT: playFrontCamBell(false); break; case HANDLERMSG.FINISH_PSTN: MainActivity.mPSTNController.sendReject(); MainActivity.mPSTNController.sendHookOffDelay(); break; case HANDLERMSG.FINISH_APP: finishWallpadCallApp(); break; default: break; } } }; public void sendHandlerMsg(int what, int arg1, int arg2) { try { LOG("[sendHandlerMsg] what [" + what + "], arg1 [" + arg1 + "], arg2 [" + arg2 + "]"); Message HandleMsg = MainHandler.obtainMessage(); HandleMsg.what = what; HandleMsg.arg1 = arg1; HandleMsg.arg2 = arg2; MainHandler.sendMessage(HandleMsg); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendHandlerMsg(msg)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } public void sendHandlerMsgDelayed(int what, int arg1, int arg2, long delay) { try { LOG("[sendHandlerMsgDelayed] what [" + what + "], arg1 [" + arg1 + "], arg2 [" + arg2 + "], delay [" + delay + "]"); Message HandleMsg = MainHandler.obtainMessage(); HandleMsg.what = what; HandleMsg.arg1 = arg1; HandleMsg.arg2 = arg2; MainHandler.sendMessageDelayed(HandleMsg, delay); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] sendHandlerMsgDelayed(msg)"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } int nCheckCnt = 0; protected Handler mPathCheckHandler = new Handler() { @Override public void handleMessage(Message msg) { // Log.d(TAG, "[mPathCheckHandler.handleMessage]"); if (ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40 || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_IGW300_NOUGAT || ConfigValues.DEVICE_BOARDTYPE == BOARD_TYPE.V40_NOUGAT) { if (msg.what == 0) { nCheckCnt++; if (nCheckCnt > 200) { mPathCheckHandler.removeMessages(0); mPathCheckHandler.removeMessages(1); } else { if (MainActivity.mCallController.getTalkPath() == CALLPATH.PSTN) mPathCheckHandler.sendEmptyMessageDelayed(1, 50); else mPathCheckHandler.sendEmptyMessageDelayed(0, 50); } } else if (msg.what == 1) { Log.d(TAG, "[mPathCheckHandler.handleMessage] Handler finish!! PATH [PSTN]"); mPathCheckHandler.removeMessages(0); sendHandlerMsg(HANDLERMSG.SET_VOLUME_TABLE, 0, 0); } } } }; private void finishPSTN() { try { Log.d(TAG, "[finishPSTN]"); doEnd(); Thread.sleep(500); ((MainActivity) mContext).finishWallPadCall(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] finishPSTN()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } private void finishWallpadCallApp() { try { super.finish(); } catch (RuntimeException re) { LogUtil.errorLogInfo("", TAG, re); } catch (Exception e) { Log.e(TAG, "[Exception] finishWallpadCallApp()"); //e.printStackTrace(); LogUtil.errorLogInfo("", TAG, e); } } }